summaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2014-04-24 10:50:13 +0100
committerBen Murdoch <benm@google.com>2014-04-24 10:50:13 +0100
commit0529e5d033099cbfc42635f6f6183833b09dff6e (patch)
treebadea60062e611382d8a37e3b0bfda8d69760c2b /ui
parent8346740f6fb555ccbb9b4148ab63402ae8f6e4ca (diff)
downloadchromium_org-0529e5d033099cbfc42635f6f6183833b09dff6e.tar.gz
Merge from Chromium at DEPS revision 265802
This commit was generated by merge_to_master.py. Change-Id: I6fac2dbbce472b18ca943b6e6f247835b0bd6281
Diffstat (limited to 'ui')
-rw-r--r--ui/accessibility/accessibility.target.darwin-arm.mk11
-rw-r--r--ui/accessibility/accessibility.target.darwin-mips.mk11
-rw-r--r--ui/accessibility/accessibility.target.darwin-x86.mk11
-rw-r--r--ui/accessibility/accessibility.target.darwin-x86_64.mk11
-rw-r--r--ui/accessibility/accessibility.target.linux-arm.mk11
-rw-r--r--ui/accessibility/accessibility.target.linux-mips.mk11
-rw-r--r--ui/accessibility/accessibility.target.linux-x86.mk11
-rw-r--r--ui/accessibility/accessibility.target.linux-x86_64.mk11
-rw-r--r--ui/accessibility/ax_gen.target.darwin-arm.mk1
-rw-r--r--ui/accessibility/ax_gen.target.darwin-mips.mk1
-rw-r--r--ui/accessibility/ax_gen.target.darwin-x86.mk1
-rw-r--r--ui/accessibility/ax_gen.target.darwin-x86_64.mk1
-rw-r--r--ui/accessibility/ax_gen.target.linux-arm.mk1
-rw-r--r--ui/accessibility/ax_gen.target.linux-mips.mk1
-rw-r--r--ui/accessibility/ax_gen.target.linux-x86.mk1
-rw-r--r--ui/accessibility/ax_gen.target.linux-x86_64.mk1
-rw-r--r--ui/accessibility/ax_node.cc13
-rw-r--r--ui/accessibility/ax_node.h15
-rw-r--r--ui/accessibility/ax_node_data.cc1
-rw-r--r--ui/accessibility/ax_tree.cc44
-rw-r--r--ui/accessibility/ax_tree.h37
-rw-r--r--ui/accessibility/ax_tree_unittest.cc55
-rw-r--r--ui/accessibility/ax_tree_update.cc27
-rw-r--r--ui/accessibility/ax_tree_update.h3
-rw-r--r--ui/android/java/res/drawable-hdpi/dropdown_popup_background_down.9.pngbin0 -> 341 bytes
-rw-r--r--ui/android/java/res/drawable-hdpi/dropdown_popup_background_up.9.pngbin0 -> 354 bytes
-rw-r--r--ui/android/java/res/drawable-xhdpi/dropdown_popup_background_down.9.pngbin0 -> 514 bytes
-rw-r--r--ui/android/java/res/drawable-xhdpi/dropdown_popup_background_up.9.pngbin0 -> 501 bytes
-rw-r--r--ui/android/java/res/drawable/dropdown_popup_background_down.9.pngbin0 -> 289 bytes
-rw-r--r--ui/android/java/res/drawable/dropdown_popup_background_up.9.pngbin0 -> 288 bytes
-rw-r--r--ui/android/java/src/org/chromium/ui/UiUtils.java37
-rw-r--r--ui/android/java/src/org/chromium/ui/autofill/OWNERS1
-rw-r--r--ui/android/java/src/org/chromium/ui/gfx/DeviceDisplayInfo.java29
-rw-r--r--ui/android/java/src/org/chromium/ui/gfx/ViewConfigurationHelper.java24
-rw-r--r--ui/app_list/app_list.gyp2
-rw-r--r--ui/app_list/app_list_switches.cc2
-rw-r--r--ui/app_list/views/app_list_item_view.cc4
-rw-r--r--ui/app_list/views/apps_grid_view.cc7
-rw-r--r--ui/aura/aura.gyp4
-rw-r--r--ui/aura/demo/demo_main.cc8
-rw-r--r--ui/aura/env.cc8
-rw-r--r--ui/aura/env.h5
-rw-r--r--ui/aura/gestures/gesture_recognizer_unittest.cc42
-rw-r--r--ui/aura/test/aura_test_base.cc1
-rw-r--r--ui/aura/window.cc13
-rw-r--r--ui/aura/window.h9
-rw-r--r--ui/aura/window_event_dispatcher.cc31
-rw-r--r--ui/aura/window_event_dispatcher.h5
-rw-r--r--ui/aura/window_event_dispatcher_unittest.cc350
-rw-r--r--ui/aura/window_tree_host.cc2
-rw-r--r--ui/aura/window_tree_host_x11.cc2
-rw-r--r--ui/aura/window_unittest.cc55
-rw-r--r--ui/base/android/view_android.cc2
-rw-r--r--ui/base/android/view_android.h2
-rw-r--r--ui/base/android/window_android.cc2
-rw-r--r--ui/base/android/window_android.h2
-rw-r--r--ui/base/cursor/cursor_loader.h18
-rw-r--r--ui/base/cursor/cursor_loader_ozone.cc2
-rw-r--r--ui/base/cursor/cursor_loader_x11.cc11
-rw-r--r--ui/base/dragdrop/os_exchange_data_provider_aurax11.h1
-rw-r--r--ui/base/dragdrop/os_exchange_data_provider_win.cc4
-rw-r--r--ui/base/gtk/OWNERS2
-rw-r--r--ui/base/gtk/gtk_signal.h68
-rw-r--r--ui/base/gtk/gtk_signal_registrar.cc98
-rw-r--r--ui/base/gtk/gtk_signal_registrar.h75
-rw-r--r--ui/base/ime/chromeos/ime_bridge.cc14
-rw-r--r--ui/base/ime/chromeos/ime_bridge.h6
-rw-r--r--ui/base/ime/ime.gypi5
-rw-r--r--ui/base/ime/input_method_chromeos.cc5
-rw-r--r--ui/base/ime/win/tsf_input_scope.cc2
-rw-r--r--ui/base/l10n/formatter.cc44
-rw-r--r--ui/base/resource/resource_bundle.cc4
-rw-r--r--ui/base/strings/ui_strings.grd88
-rw-r--r--ui/base/strings/ui_strings_am.xtb21
-rw-r--r--ui/base/strings/ui_strings_ar.xtb21
-rw-r--r--ui/base/strings/ui_strings_bg.xtb21
-rw-r--r--ui/base/strings/ui_strings_bn.xtb21
-rw-r--r--ui/base/strings/ui_strings_ca.xtb21
-rw-r--r--ui/base/strings/ui_strings_cs.xtb21
-rw-r--r--ui/base/strings/ui_strings_da.xtb21
-rw-r--r--ui/base/strings/ui_strings_de.xtb21
-rw-r--r--ui/base/strings/ui_strings_el.xtb21
-rw-r--r--ui/base/strings/ui_strings_en-GB.xtb21
-rw-r--r--ui/base/strings/ui_strings_es-419.xtb21
-rw-r--r--ui/base/strings/ui_strings_es.xtb21
-rw-r--r--ui/base/strings/ui_strings_et.xtb21
-rw-r--r--ui/base/strings/ui_strings_fa.xtb21
-rw-r--r--ui/base/strings/ui_strings_fi.xtb21
-rw-r--r--ui/base/strings/ui_strings_fil.xtb21
-rw-r--r--ui/base/strings/ui_strings_fr.xtb21
-rw-r--r--ui/base/strings/ui_strings_gu.xtb21
-rw-r--r--ui/base/strings/ui_strings_hi.xtb21
-rw-r--r--ui/base/strings/ui_strings_hr.xtb21
-rw-r--r--ui/base/strings/ui_strings_hu.xtb21
-rw-r--r--ui/base/strings/ui_strings_id.xtb21
-rw-r--r--ui/base/strings/ui_strings_it.xtb21
-rw-r--r--ui/base/strings/ui_strings_iw.xtb21
-rw-r--r--ui/base/strings/ui_strings_ja.xtb21
-rw-r--r--ui/base/strings/ui_strings_kn.xtb21
-rw-r--r--ui/base/strings/ui_strings_ko.xtb21
-rw-r--r--ui/base/strings/ui_strings_lt.xtb21
-rw-r--r--ui/base/strings/ui_strings_lv.xtb21
-rw-r--r--ui/base/strings/ui_strings_ml.xtb21
-rw-r--r--ui/base/strings/ui_strings_mr.xtb21
-rw-r--r--ui/base/strings/ui_strings_ms.xtb21
-rw-r--r--ui/base/strings/ui_strings_nl.xtb21
-rw-r--r--ui/base/strings/ui_strings_no.xtb21
-rw-r--r--ui/base/strings/ui_strings_pl.xtb21
-rw-r--r--ui/base/strings/ui_strings_pt-BR.xtb21
-rw-r--r--ui/base/strings/ui_strings_pt-PT.xtb21
-rw-r--r--ui/base/strings/ui_strings_ro.xtb21
-rw-r--r--ui/base/strings/ui_strings_ru.xtb21
-rw-r--r--ui/base/strings/ui_strings_sk.xtb21
-rw-r--r--ui/base/strings/ui_strings_sl.xtb21
-rw-r--r--ui/base/strings/ui_strings_sr.xtb21
-rw-r--r--ui/base/strings/ui_strings_sv.xtb21
-rw-r--r--ui/base/strings/ui_strings_sw.xtb21
-rw-r--r--ui/base/strings/ui_strings_ta.xtb21
-rw-r--r--ui/base/strings/ui_strings_te.xtb21
-rw-r--r--ui/base/strings/ui_strings_th.xtb21
-rw-r--r--ui/base/strings/ui_strings_tr.xtb21
-rw-r--r--ui/base/strings/ui_strings_uk.xtb21
-rw-r--r--ui/base/strings/ui_strings_vi.xtb21
-rw-r--r--ui/base/strings/ui_strings_zh-CN.xtb21
-rw-r--r--ui/base/strings/ui_strings_zh-TW.xtb21
-rw-r--r--ui/base/ui_base.gyp41
-rw-r--r--ui/base/ui_base.target.darwin-arm.mk11
-rw-r--r--ui/base/ui_base.target.darwin-mips.mk11
-rw-r--r--ui/base/ui_base.target.darwin-x86.mk11
-rw-r--r--ui/base/ui_base.target.darwin-x86_64.mk11
-rw-r--r--ui/base/ui_base.target.linux-arm.mk11
-rw-r--r--ui/base/ui_base.target.linux-mips.mk11
-rw-r--r--ui/base/ui_base.target.linux-x86.mk11
-rw-r--r--ui/base/ui_base.target.linux-x86_64.mk11
-rw-r--r--ui/base/x/selection_requestor.cc24
-rw-r--r--ui/base/x/x11_util.cc7
-rw-r--r--ui/chromeos/OWNERS4
-rw-r--r--ui/chromeos/ui_chromeos.gyp6
-rw-r--r--ui/chromeos/user_activity_power_manager_notifier.cc (renamed from ui/chromeos/user_activity_notifier.cc)9
-rw-r--r--ui/chromeos/user_activity_power_manager_notifier.h (renamed from ui/chromeos/user_activity_notifier.h)15
-rw-r--r--ui/compositor/dip_util.cc10
-rw-r--r--ui/compositor/layer.cc10
-rw-r--r--ui/compositor/layer.h6
-rw-r--r--ui/compositor/layer_owner.cc4
-rw-r--r--ui/compositor/layer_owner.h2
-rw-r--r--ui/display/chromeos/x11/native_display_delegate_x11.cc64
-rw-r--r--ui/display/chromeos/x11/native_display_delegate_x11.h5
-rw-r--r--ui/display/display.gyp47
-rw-r--r--ui/display/display_unittests.gypi7
-rw-r--r--ui/display/util/display_util.cc (renamed from ui/display/display_util.cc)6
-rw-r--r--ui/display/util/display_util.h (renamed from ui/display/display_util.h)13
-rw-r--r--ui/display/util/display_util_export.h37
-rw-r--r--ui/display/util/display_util_unittest.cc (renamed from ui/display/display_util_unittest.cc)2
-rw-r--r--ui/display/util/edid_parser.cc (renamed from ui/display/edid_parser.cc)2
-rw-r--r--ui/display/util/edid_parser.h (renamed from ui/display/edid_parser.h)26
-rw-r--r--ui/display/util/edid_parser_unittest.cc (renamed from ui/display/edid_parser_unittest.cc)2
-rw-r--r--ui/display/util/x11/DEPS (renamed from ui/display/x11/DEPS)0
-rw-r--r--ui/display/util/x11/edid_parser_x11.cc (renamed from ui/display/x11/edid_parser_x11.cc)7
-rw-r--r--ui/display/util/x11/edid_parser_x11.h (renamed from ui/display/x11/edid_parser_x11.h)18
-rw-r--r--ui/events/BUILD.gn5
-rw-r--r--ui/events/dom4_keycode_converter.target.darwin-arm.mk1
-rw-r--r--ui/events/dom4_keycode_converter.target.darwin-mips.mk1
-rw-r--r--ui/events/dom4_keycode_converter.target.darwin-x86.mk1
-rw-r--r--ui/events/dom4_keycode_converter.target.darwin-x86_64.mk1
-rw-r--r--ui/events/dom4_keycode_converter.target.linux-arm.mk1
-rw-r--r--ui/events/dom4_keycode_converter.target.linux-mips.mk1
-rw-r--r--ui/events/dom4_keycode_converter.target.linux-x86.mk1
-rw-r--r--ui/events/dom4_keycode_converter.target.linux-x86_64.mk1
-rw-r--r--ui/events/event_constants.h5
-rw-r--r--ui/events/event_switches.cc2
-rw-r--r--ui/events/event_switches.h2
-rw-r--r--ui/events/events.gyp32
-rw-r--r--ui/events/events.target.darwin-arm.mk353
-rw-r--r--ui/events/events.target.darwin-mips.mk347
-rw-r--r--ui/events/events.target.darwin-x86.mk349
-rw-r--r--ui/events/events.target.darwin-x86_64.mk349
-rw-r--r--ui/events/events.target.linux-arm.mk353
-rw-r--r--ui/events/events.target.linux-mips.mk347
-rw-r--r--ui/events/events.target.linux-x86.mk349
-rw-r--r--ui/events/events.target.linux-x86_64.mk349
-rw-r--r--ui/events/events_base.target.darwin-arm.mk11
-rw-r--r--ui/events/events_base.target.darwin-mips.mk11
-rw-r--r--ui/events/events_base.target.darwin-x86.mk11
-rw-r--r--ui/events/events_base.target.darwin-x86_64.mk11
-rw-r--r--ui/events/events_base.target.linux-arm.mk11
-rw-r--r--ui/events/events_base.target.linux-mips.mk11
-rw-r--r--ui/events/events_base.target.linux-x86.mk11
-rw-r--r--ui/events/events_base.target.linux-x86_64.mk11
-rw-r--r--ui/events/gesture_detection.target.darwin-arm.mk11
-rw-r--r--ui/events/gesture_detection.target.darwin-mips.mk11
-rw-r--r--ui/events/gesture_detection.target.darwin-x86.mk11
-rw-r--r--ui/events/gesture_detection.target.darwin-x86_64.mk11
-rw-r--r--ui/events/gesture_detection.target.linux-arm.mk11
-rw-r--r--ui/events/gesture_detection.target.linux-mips.mk11
-rw-r--r--ui/events/gesture_detection.target.linux-x86.mk11
-rw-r--r--ui/events/gesture_detection.target.linux-x86_64.mk11
-rw-r--r--ui/events/gesture_detection/filtered_gesture_provider.cc9
-rw-r--r--ui/events/gesture_detection/filtered_gesture_provider.h3
-rw-r--r--ui/events/gesture_detection/gesture_detector.cc18
-rw-r--r--ui/events/gesture_detection/gesture_detector.h8
-rw-r--r--ui/events/gesture_detection/gesture_event_data.cc6
-rw-r--r--ui/events/gesture_detection/gesture_event_data.h4
-rw-r--r--ui/events/gesture_detection/gesture_provider.cc114
-rw-r--r--ui/events/gesture_detection/gesture_provider.h25
-rw-r--r--ui/events/gesture_detection/gesture_provider_unittest.cc163
-rw-r--r--ui/events/gesture_detection/mock_motion_event.cc5
-rw-r--r--ui/events/gesture_detection/mock_motion_event.h2
-rw-r--r--ui/events/gesture_detection/touch_disposition_gesture_filter.cc17
-rw-r--r--ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc3
-rw-r--r--ui/events/gesture_event_details.cc11
-rw-r--r--ui/events/gesture_event_details.h33
-rw-r--r--ui/events/gestures/gesture_sequence.cc6
-rw-r--r--ui/events/ozone/evdev/event_converter_evdev.cc3
-rw-r--r--ui/events/ozone/evdev/event_converter_evdev.h9
-rw-r--r--ui/events/ozone/evdev/event_device_info.cc37
-rw-r--r--ui/events/ozone/evdev/event_device_info.h10
-rw-r--r--ui/events/ozone/evdev/event_factory_evdev.cc91
-rw-r--r--ui/events/ozone/evdev/event_factory_evdev.h5
-rw-r--r--ui/events/ozone/evdev/event_modifiers_evdev.cc5
-rw-r--r--ui/events/ozone/evdev/event_modifiers_evdev.h3
-rw-r--r--ui/events/ozone/evdev/key_event_converter_evdev.cc13
-rw-r--r--ui/events/ozone/evdev/key_event_converter_evdev.h3
-rw-r--r--ui/events/ozone/evdev/key_event_converter_evdev_unittest.cc5
-rw-r--r--ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc107
-rw-r--r--ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h78
-rw-r--r--ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc266
-rw-r--r--ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h82
-rw-r--r--ui/events/ozone/evdev/libgestures_glue/gesture_logging.cc32
-rw-r--r--ui/events/ozone/evdev/libgestures_glue/gesture_logging.h15
-rw-r--r--ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc72
-rw-r--r--ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h16
-rw-r--r--ui/events/ozone/evdev/touch_event_converter_evdev.cc105
-rw-r--r--ui/events/ozone/evdev/touch_event_converter_evdev.h29
-rw-r--r--ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc20
-rw-r--r--ui/events/platform/platform_event_source.cc18
-rw-r--r--ui/events/platform/platform_event_source.h12
-rw-r--r--ui/events/platform/platform_event_source_unittest.cc178
-rw-r--r--ui/events/platform/x11/x11_event_source.cc70
-rw-r--r--ui/events/platform/x11/x11_event_source.h12
-rw-r--r--ui/events/platform/x11/x11_event_source_glib.cc101
-rw-r--r--ui/events/platform/x11/x11_event_source_libevent.cc51
-rw-r--r--ui/events/win/events_win.cc2
-rw-r--r--ui/events/x/events_x.cc8
-rw-r--r--ui/events/x/events_x_unittest.cc132
-rw-r--r--ui/file_manager/DEPS6
-rw-r--r--ui/file_manager/OWNERS3
-rw-r--r--ui/file_manager/file_manager.gyp52
-rw-r--r--ui/file_manager/file_manager_export.h32
-rw-r--r--ui/file_manager/file_manager_resource_util.cc18
-rw-r--r--ui/file_manager/file_manager_resource_util.h23
-rw-r--r--ui/file_manager/file_manager_resources.grd46
-rw-r--r--ui/file_manager/gallery/css/gallery.css1381
-rw-r--r--ui/file_manager/gallery/gallery.html0
-rw-r--r--ui/file_manager/gallery/images/100/arrow_left.pngbin0 -> 1773 bytes
-rw-r--r--ui/file_manager/gallery/images/100/arrow_right.pngbin0 -> 1772 bytes
-rw-r--r--ui/file_manager/gallery/images/100/back_to_files.pngbin0 -> 688 bytes
-rw-r--r--ui/file_manager/gallery/images/100/bubble_point.pngbin0 -> 102 bytes
-rw-r--r--ui/file_manager/gallery/images/100/butterbar_close_button.pngbin0 -> 139 bytes
-rw-r--r--ui/file_manager/gallery/images/100/cursor_crop.pngbin0 -> 410 bytes
-rw-r--r--ui/file_manager/gallery/images/100/cursor_leftright.pngbin0 -> 373 bytes
-rw-r--r--ui/file_manager/gallery/images/100/cursor_move.pngbin0 -> 484 bytes
-rw-r--r--ui/file_manager/gallery/images/100/cursor_nwse.pngbin0 -> 459 bytes
-rw-r--r--ui/file_manager/gallery/images/100/cursor_swne.pngbin0 -> 454 bytes
-rw-r--r--ui/file_manager/gallery/images/100/cursor_updown.pngbin0 -> 366 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon.pngbin0 -> 215 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_1up.pngbin0 -> 162 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_1up_selected.pngbin0 -> 162 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_autofix.pngbin0 -> 292 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_autofix_selected.pngbin0 -> 292 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_brightness.pngbin0 -> 266 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_brightness_selected.pngbin0 -> 257 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_contrast.pngbin0 -> 305 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_crop.pngbin0 -> 102 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_crop_selected.pngbin0 -> 108 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_delete.pngbin0 -> 112 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_delete_selected.pngbin0 -> 119 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_edit.pngbin0 -> 161 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_edit_selected.pngbin0 -> 164 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_mosaic.pngbin0 -> 124 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_mosaic_selected.pngbin0 -> 126 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_print.pngbin0 -> 144 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_print_selected.pngbin0 -> 148 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_redo.pngbin0 -> 243 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_redo_selected.pngbin0 -> 245 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_rotate.pngbin0 -> 367 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_rotate_left.pngbin0 -> 368 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_rotate_left_selected.pngbin0 -> 382 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_rotate_selected.pngbin0 -> 382 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_share.pngbin0 -> 165 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_share_selected.pngbin0 -> 170 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_slideshow.pngbin0 -> 173 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_slideshow_selected.pngbin0 -> 172 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_undo.pngbin0 -> 240 bytes
-rw-r--r--ui/file_manager/gallery/images/100/icon_undo_selected.pngbin0 -> 243 bytes
-rw-r--r--ui/file_manager/gallery/images/100/slider_thumb.pngbin0 -> 221 bytes
-rw-r--r--ui/file_manager/gallery/images/100/slideshow-end.pngbin0 -> 1717 bytes
-rw-r--r--ui/file_manager/gallery/images/100/slideshow-pause.pngbin0 -> 648 bytes
-rw-r--r--ui/file_manager/gallery/images/100/slideshow-play.pngbin0 -> 1080 bytes
-rw-r--r--ui/file_manager/gallery/images/200/arrow_left.pngbin0 -> 3180 bytes
-rw-r--r--ui/file_manager/gallery/images/200/arrow_right.pngbin0 -> 3166 bytes
-rw-r--r--ui/file_manager/gallery/images/200/back_to_files.pngbin0 -> 1943 bytes
-rw-r--r--ui/file_manager/gallery/images/200/bubble_point.pngbin0 -> 135 bytes
-rw-r--r--ui/file_manager/gallery/images/200/butterbar_close_button.pngbin0 -> 146 bytes
-rw-r--r--ui/file_manager/gallery/images/200/cursor_crop.pngbin0 -> 831 bytes
-rw-r--r--ui/file_manager/gallery/images/200/cursor_leftright.pngbin0 -> 801 bytes
-rw-r--r--ui/file_manager/gallery/images/200/cursor_move.pngbin0 -> 1217 bytes
-rw-r--r--ui/file_manager/gallery/images/200/cursor_nwse.pngbin0 -> 914 bytes
-rw-r--r--ui/file_manager/gallery/images/200/cursor_swne.pngbin0 -> 903 bytes
-rw-r--r--ui/file_manager/gallery/images/200/cursor_updown.pngbin0 -> 786 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon.pngbin0 -> 348 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_1up.pngbin0 -> 253 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_1up_selected.pngbin0 -> 249 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_autofix.pngbin0 -> 563 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_autofix_selected.pngbin0 -> 579 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_brightness.pngbin0 -> 412 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_brightness_selected.pngbin0 -> 398 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_contrast.pngbin0 -> 524 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_crop.pngbin0 -> 122 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_crop_selected.pngbin0 -> 125 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_delete.pngbin0 -> 142 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_delete_selected.pngbin0 -> 148 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_edit.pngbin0 -> 230 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_edit_selected.pngbin0 -> 238 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_mosaic.pngbin0 -> 166 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_mosaic_selected.pngbin0 -> 168 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_print.pngbin0 -> 175 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_print_selected.pngbin0 -> 184 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_redo.pngbin0 -> 369 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_redo_selected.pngbin0 -> 381 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_rotate.pngbin0 -> 723 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_rotate_left.pngbin0 -> 721 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_rotate_left_selected.pngbin0 -> 738 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_rotate_selected.pngbin0 -> 743 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_share.pngbin0 -> 261 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_share_selected.pngbin0 -> 267 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_slideshow.pngbin0 -> 257 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_slideshow_selected.pngbin0 -> 256 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_undo.pngbin0 -> 371 bytes
-rw-r--r--ui/file_manager/gallery/images/200/icon_undo_selected.pngbin0 -> 388 bytes
-rw-r--r--ui/file_manager/gallery/images/200/slider_thumb.pngbin0 -> 392 bytes
-rw-r--r--ui/file_manager/gallery/images/200/slideshow-end.pngbin0 -> 3098 bytes
-rw-r--r--ui/file_manager/gallery/images/200/slideshow-pause.pngbin0 -> 1099 bytes
-rw-r--r--ui/file_manager/gallery/images/200/slideshow-play.pngbin0 -> 1727 bytes
-rw-r--r--ui/file_manager/gallery/js/background.js0
-rw-r--r--ui/file_manager/gallery/js/error_util.js0
-rw-r--r--ui/file_manager/gallery/js/gallery.js0
-rw-r--r--ui/file_manager/gallery/js/gallery_scripts.js20
-rw-r--r--ui/file_manager/gallery/js/test_util.js0
-rw-r--r--ui/file_manager/gallery/manifest.json50
-rw-r--r--ui/file_manager/image_loader/background.js8
-rw-r--r--ui/file_manager/image_loader/cache.js410
-rw-r--r--ui/file_manager/image_loader/image_loader.js234
-rw-r--r--ui/file_manager/image_loader/image_loader_client.js366
-rw-r--r--ui/file_manager/image_loader/manifest.json26
-rw-r--r--ui/file_manager/image_loader/request.js438
-rw-r--r--ui/file_manager/image_loader/worker.js166
-rw-r--r--ui/file_manager/video_player/OWNERS1
-rw-r--r--ui/file_manager/video_player/css/video_player.css103
-rw-r--r--ui/file_manager/video_player/images/100/error.pngbin0 -> 1026 bytes
-rw-r--r--ui/file_manager/video_player/images/100/icon.pngbin0 -> 117 bytes
-rw-r--r--ui/file_manager/video_player/images/200/error.pngbin0 -> 2694 bytes
-rw-r--r--ui/file_manager/video_player/images/200/icon.pngbin0 -> 225 bytes
-rw-r--r--ui/file_manager/video_player/js/background.js43
-rw-r--r--ui/file_manager/video_player/js/error_util.js43
-rw-r--r--ui/file_manager/video_player/js/test_util.js121
-rw-r--r--ui/file_manager/video_player/js/video_player.js215
-rw-r--r--ui/file_manager/video_player/js/video_player_scripts.js27
-rw-r--r--ui/file_manager/video_player/manifest.json57
-rw-r--r--ui/file_manager/video_player/video_player.html28
-rw-r--r--ui/gfx/BUILD.gn20
-rw-r--r--ui/gfx/android/device_display_info.cc4
-rw-r--r--ui/gfx/android/device_display_info.h5
-rw-r--r--ui/gfx/android/shared_device_display_info.cc22
-rw-r--r--ui/gfx/android/shared_device_display_info.h8
-rw-r--r--ui/gfx/display.cc36
-rw-r--r--ui/gfx/display.h2
-rw-r--r--ui/gfx/gdk_compat.h27
-rw-r--r--ui/gfx/geometry/BUILD.gn1
-rw-r--r--ui/gfx/gfx.gyp17
-rw-r--r--ui/gfx/gfx.target.darwin-arm.mk11
-rw-r--r--ui/gfx/gfx.target.darwin-mips.mk11
-rw-r--r--ui/gfx/gfx.target.darwin-x86.mk11
-rw-r--r--ui/gfx/gfx.target.darwin-x86_64.mk11
-rw-r--r--ui/gfx/gfx.target.linux-arm.mk11
-rw-r--r--ui/gfx/gfx.target.linux-mips.mk11
-rw-r--r--ui/gfx/gfx.target.linux-x86.mk11
-rw-r--r--ui/gfx/gfx.target.linux-x86_64.mk11
-rw-r--r--ui/gfx/gfx_geometry.target.darwin-arm.mk1
-rw-r--r--ui/gfx/gfx_geometry.target.darwin-mips.mk1
-rw-r--r--ui/gfx/gfx_geometry.target.darwin-x86.mk1
-rw-r--r--ui/gfx/gfx_geometry.target.darwin-x86_64.mk1
-rw-r--r--ui/gfx/gfx_geometry.target.linux-arm.mk1
-rw-r--r--ui/gfx/gfx_geometry.target.linux-mips.mk1
-rw-r--r--ui/gfx/gfx_geometry.target.linux-x86.mk1
-rw-r--r--ui/gfx/gfx_geometry.target.linux-x86_64.mk1
-rw-r--r--ui/gfx/screen_android.cc1
-rw-r--r--ui/gfx/win/dpi.cc10
-rw-r--r--ui/gfx/x/x11_error_tracker.cc13
-rw-r--r--ui/gl/gl.target.darwin-arm.mk13
-rw-r--r--ui/gl/gl.target.darwin-mips.mk13
-rw-r--r--ui/gl/gl.target.darwin-x86.mk13
-rw-r--r--ui/gl/gl.target.darwin-x86_64.mk13
-rw-r--r--ui/gl/gl.target.linux-arm.mk13
-rw-r--r--ui/gl/gl.target.linux-mips.mk13
-rw-r--r--ui/gl/gl.target.linux-x86.mk13
-rw-r--r--ui/gl/gl.target.linux-x86_64.mk13
-rw-r--r--ui/gl/gl_bindings.h3
-rw-r--r--ui/gl/gl_fence.cc4
-rw-r--r--ui/keyboard/keyboard.gyp2
-rw-r--r--ui/keyboard/keyboard_controller.cc22
-rw-r--r--ui/keyboard/keyboard_controller.h7
-rw-r--r--ui/keyboard/keyboard_controller_proxy.cc4
-rw-r--r--ui/keyboard/keyboard_controller_proxy.h12
-rw-r--r--ui/keyboard/keyboard_controller_unittest.cc63
-rw-r--r--ui/keyboard/keyboard_layout_manager.cc42
-rw-r--r--ui/keyboard/keyboard_layout_manager.h2
-rw-r--r--ui/keyboard/keyboard_util.cc37
-rw-r--r--ui/keyboard/keyboard_util.h5
-rw-r--r--ui/keyboard/resources/constants.js12
-rw-r--r--ui/keyboard/resources/elements/kb-key.html39
-rw-r--r--ui/keyboard/resources/elements/kb-keyboard.html3
-rw-r--r--ui/keyboard/resources/elements/kb-shift-key.html10
-rw-r--r--ui/keyboard/resources/images/back.svg2
-rw-r--r--ui/keyboard/resources/images/backspace.svg2
-rw-r--r--ui/keyboard/resources/images/down.svg2
-rw-r--r--ui/keyboard/resources/images/hide-keyboard.svg4
-rw-r--r--ui/keyboard/resources/images/left.svg2
-rw-r--r--ui/keyboard/resources/images/return.svg2
-rw-r--r--ui/keyboard/resources/images/right.svg2
-rw-r--r--ui/keyboard/resources/images/search.svg2
-rw-r--r--ui/keyboard/resources/images/shift-filled.svg2
-rw-r--r--ui/keyboard/resources/images/shift.svg2
-rw-r--r--ui/keyboard/resources/images/tab.svg4
-rw-r--r--ui/keyboard/resources/images/up.svg2
-rw-r--r--ui/keyboard/resources/main.css68
-rw-r--r--ui/keyboard/resources/main.js12
-rw-r--r--ui/message_center/cocoa/opaque_views.h36
-rw-r--r--ui/message_center/cocoa/opaque_views.mm63
-rw-r--r--ui/message_center/cocoa/settings_controller.h3
-rw-r--r--ui/message_center/cocoa/settings_controller.mm20
-rw-r--r--ui/message_center/cocoa/settings_entry_view.mm24
-rw-r--r--ui/message_center/cocoa/tray_view_controller.mm20
-rw-r--r--ui/message_center/message_center.gyp2
-rw-r--r--ui/message_center/message_center_impl.cc11
-rw-r--r--ui/native_theme/common_theme.cc6
-rw-r--r--ui/native_theme/fallback_theme.cc4
-rw-r--r--ui/native_theme/native_theme.h1
-rw-r--r--ui/native_theme/native_theme.target.darwin-arm.mk11
-rw-r--r--ui/native_theme/native_theme.target.darwin-mips.mk11
-rw-r--r--ui/native_theme/native_theme.target.darwin-x86.mk11
-rw-r--r--ui/native_theme/native_theme.target.darwin-x86_64.mk11
-rw-r--r--ui/native_theme/native_theme.target.linux-arm.mk11
-rw-r--r--ui/native_theme/native_theme.target.linux-mips.mk11
-rw-r--r--ui/native_theme/native_theme.target.linux-x86.mk11
-rw-r--r--ui/native_theme/native_theme.target.linux-x86_64.mk11
-rw-r--r--ui/native_theme/native_theme_win.cc3
-rw-r--r--ui/ozone/ozone.gyp26
-rw-r--r--ui/ozone/ozone_platform.cc3
-rw-r--r--ui/ozone/ozone_platform.h9
-rw-r--r--ui/ozone/ozone_unittests.gypi23
-rw-r--r--ui/ozone/platform/caca/caca_surface_factory.cc8
-rw-r--r--ui/ozone/platform/caca/caca_surface_factory.h6
-rw-r--r--ui/ozone/platform/caca/ozone_platform_caca.cc66
-rw-r--r--ui/ozone/platform/caca/ozone_platform_caca.h37
-rw-r--r--ui/ozone/platform/dri/DEPS4
-rw-r--r--ui/ozone/platform/dri/chromeos/DEPS3
-rw-r--r--ui/ozone/platform/dri/chromeos/display_mode_dri.cc17
-rw-r--r--ui/ozone/platform/dri/chromeos/display_mode_dri.h33
-rw-r--r--ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc142
-rw-r--r--ui/ozone/platform/dri/chromeos/display_snapshot_dri.h47
-rw-r--r--ui/ozone/platform/dri/chromeos/native_display_delegate_dri.cc157
-rw-r--r--ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h60
-rw-r--r--ui/ozone/platform/dri/cursor_factory_evdev_dri.cc10
-rw-r--r--ui/ozone/platform/dri/cursor_factory_evdev_dri.h6
-rw-r--r--ui/ozone/platform/dri/dri_buffer.cc (renamed from ui/gfx/ozone/dri/dri_buffer.cc)8
-rw-r--r--ui/ozone/platform/dri/dri_buffer.h (renamed from ui/gfx/ozone/dri/dri_buffer.h)14
-rw-r--r--ui/ozone/platform/dri/dri_surface.cc (renamed from ui/gfx/ozone/dri/dri_surface.cc)14
-rw-r--r--ui/ozone/platform/dri/dri_surface.h (renamed from ui/gfx/ozone/dri/dri_surface.h)16
-rw-r--r--ui/ozone/platform/dri/dri_surface_factory.cc (renamed from ui/gfx/ozone/dri/dri_surface_factory.cc)276
-rw-r--r--ui/ozone/platform/dri/dri_surface_factory.h (renamed from ui/gfx/ozone/dri/dri_surface_factory.h)62
-rw-r--r--ui/ozone/platform/dri/dri_surface_factory_unittest.cc (renamed from ui/gfx/ozone/dri/dri_surface_factory_unittest.cc)70
-rw-r--r--ui/ozone/platform/dri/dri_surface_unittest.cc (renamed from ui/gfx/ozone/dri/dri_surface_unittest.cc)49
-rw-r--r--ui/ozone/platform/dri/dri_util.cc108
-rw-r--r--ui/ozone/platform/dri/dri_util.h41
-rw-r--r--ui/ozone/platform/dri/dri_vsync_provider.cc (renamed from ui/gfx/ozone/dri/dri_vsync_provider.cc)10
-rw-r--r--ui/ozone/platform/dri/dri_vsync_provider.h (renamed from ui/gfx/ozone/dri/dri_vsync_provider.h)14
-rw-r--r--ui/ozone/platform/dri/dri_wrapper.cc (renamed from ui/gfx/ozone/dri/dri_wrapper.cc)71
-rw-r--r--ui/ozone/platform/dri/dri_wrapper.h (renamed from ui/gfx/ozone/dri/dri_wrapper.h)48
-rw-r--r--ui/ozone/platform/dri/hardware_display_controller.cc (renamed from ui/gfx/ozone/dri/hardware_display_controller.cc)95
-rw-r--r--ui/ozone/platform/dri/hardware_display_controller.h (renamed from ui/gfx/ozone/dri/hardware_display_controller.h)68
-rw-r--r--ui/ozone/platform/dri/hardware_display_controller_unittest.cc (renamed from ui/gfx/ozone/dri/hardware_display_controller_unittest.cc)119
-rw-r--r--ui/ozone/platform/dri/ozone_platform_dri.cc72
-rw-r--r--ui/ozone/platform/dri/ozone_platform_dri.h34
-rw-r--r--ui/ozone/platform/test/ozone_platform_test.cc66
-rw-r--r--ui/ozone/platform/test/ozone_platform_test.h33
-rw-r--r--ui/resources/BUILD.gn10
-rw-r--r--ui/resources/ui_resources.grd6
-rw-r--r--ui/shell_dialogs/shell_dialogs.target.darwin-arm.mk11
-rw-r--r--ui/shell_dialogs/shell_dialogs.target.darwin-mips.mk11
-rw-r--r--ui/shell_dialogs/shell_dialogs.target.darwin-x86.mk11
-rw-r--r--ui/shell_dialogs/shell_dialogs.target.darwin-x86_64.mk11
-rw-r--r--ui/shell_dialogs/shell_dialogs.target.linux-arm.mk11
-rw-r--r--ui/shell_dialogs/shell_dialogs.target.linux-mips.mk11
-rw-r--r--ui/shell_dialogs/shell_dialogs.target.linux-x86.mk11
-rw-r--r--ui/shell_dialogs/shell_dialogs.target.linux-x86_64.mk11
-rw-r--r--ui/snapshot/snapshot.target.darwin-arm.mk11
-rw-r--r--ui/snapshot/snapshot.target.darwin-mips.mk11
-rw-r--r--ui/snapshot/snapshot.target.darwin-x86.mk11
-rw-r--r--ui/snapshot/snapshot.target.darwin-x86_64.mk11
-rw-r--r--ui/snapshot/snapshot.target.linux-arm.mk11
-rw-r--r--ui/snapshot/snapshot.target.linux-mips.mk11
-rw-r--r--ui/snapshot/snapshot.target.linux-x86.mk11
-rw-r--r--ui/snapshot/snapshot.target.linux-x86_64.mk11
-rw-r--r--ui/surface/surface.target.darwin-arm.mk13
-rw-r--r--ui/surface/surface.target.darwin-mips.mk13
-rw-r--r--ui/surface/surface.target.darwin-x86.mk13
-rw-r--r--ui/surface/surface.target.darwin-x86_64.mk13
-rw-r--r--ui/surface/surface.target.linux-arm.mk13
-rw-r--r--ui/surface/surface.target.linux-mips.mk13
-rw-r--r--ui/surface/surface.target.linux-x86.mk13
-rw-r--r--ui/surface/surface.target.linux-x86_64.mk13
-rw-r--r--ui/ui_unittests.gyp71
-rw-r--r--ui/views/accessibility/ax_tree_source_views.cc17
-rw-r--r--ui/views/accessibility/ax_tree_source_views_unittest.cc8
-rw-r--r--ui/views/bubble/bubble_delegate.h3
-rw-r--r--ui/views/controls/label.cc3
-rw-r--r--ui/views/controls/label.h5
-rw-r--r--ui/views/controls/menu/menu_controller.cc127
-rw-r--r--ui/views/controls/menu/menu_message_pump_dispatcher_linux.cc48
-rw-r--r--ui/views/controls/tree/tree_view.cc1
-rw-r--r--ui/views/controls/tree/tree_view.h3
-rw-r--r--ui/views/controls/webview/web_dialog_view.cc1
-rw-r--r--ui/views/controls/webview/web_dialog_view.h5
-rw-r--r--ui/views/event_utils.h33
-rw-r--r--ui/views/event_utils_aura.cc70
-rw-r--r--ui/views/event_utils_win.cc59
-rw-r--r--ui/views/layout/grid_layout.cc17
-rw-r--r--ui/views/metrics_aura.cc1
-rw-r--r--ui/views/test/test_views_delegate.cc49
-rw-r--r--ui/views/test/test_views_delegate.h50
-rw-r--r--ui/views/view.cc11
-rw-r--r--ui/views/view_aura.cc2
-rw-r--r--ui/views/views.gyp15
-rw-r--r--ui/views/views_delegate.cc67
-rw-r--r--ui/views/views_delegate.h61
-rw-r--r--ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc11
-rw-r--r--ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc3
-rw-r--r--ui/views/widget/desktop_aura/desktop_native_widget_aura.cc5
-rw-r--r--ui/views/widget/desktop_aura/desktop_native_widget_aura.h4
-rw-r--r--ui/views/widget/desktop_aura/desktop_screen_x11.cc8
-rw-r--r--ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc140
-rw-r--r--ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc30
-rw-r--r--ui/views/widget/desktop_aura/x11_desktop_handler.cc17
-rw-r--r--ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc21
-rw-r--r--ui/views/widget/desktop_aura/x11_window_event_filter.cc29
-rw-r--r--ui/views/widget/desktop_aura/x11_window_event_filter.h7
-rw-r--r--ui/views/widget/monitor_win.cc17
-rw-r--r--ui/views/widget/monitor_win.h10
-rw-r--r--ui/views/win/appbar.cc88
-rw-r--r--ui/views/win/appbar.h70
-rw-r--r--ui/views/win/hwnd_message_handler.cc31
-rw-r--r--ui/views/win/hwnd_message_handler.h8
-rw-r--r--ui/webui/resources/js/cr/ui/list.js1
-rw-r--r--ui/wm/core/base_focus_rules.h2
-rw-r--r--ui/wm/core/capture_controller.h6
-rw-r--r--ui/wm/core/compound_event_filter.cc3
-rw-r--r--ui/wm/core/compound_event_filter.h4
-rw-r--r--ui/wm/core/cursor_manager.h6
-rw-r--r--ui/wm/core/easy_resize_window_targeter.h4
-rw-r--r--ui/wm/core/focus_controller.h10
-rw-r--r--ui/wm/core/focus_rules.h4
-rw-r--r--ui/wm/core/image_grid.h6
-rw-r--r--ui/wm/core/input_method_event_filter.h4
-rw-r--r--ui/wm/core/input_method_event_filter_unittest.cc22
-rw-r--r--ui/wm/core/masked_window_targeter.h4
-rw-r--r--ui/wm/core/native_cursor_manager.h4
-rw-r--r--ui/wm/core/native_cursor_manager_delegate.h4
-rw-r--r--ui/wm/core/shadow.h4
-rw-r--r--ui/wm/core/shadow_controller.h6
-rw-r--r--ui/wm/core/shadow_types.h6
-rw-r--r--ui/wm/core/transient_window_controller.h4
-rw-r--r--ui/wm/core/transient_window_manager.h4
-rw-r--r--ui/wm/core/transient_window_observer.h4
-rw-r--r--ui/wm/core/transient_window_stacking_client.h4
-rw-r--r--ui/wm/core/user_activity_detector.h4
-rw-r--r--ui/wm/core/user_activity_observer.h4
-rw-r--r--ui/wm/core/visibility_controller.h8
-rw-r--r--ui/wm/core/window_animations.cc2
-rw-r--r--ui/wm/core/window_animations.h28
-rw-r--r--ui/wm/core/window_modality_controller.h12
-rw-r--r--ui/wm/core/window_util.h32
-rw-r--r--ui/wm/core/wm_core_export.h32
-rw-r--r--ui/wm/core/wm_core_switches.h4
-rw-r--r--ui/wm/core/wm_state.cc2
-rw-r--r--ui/wm/core/wm_state.h9
-rw-r--r--ui/wm/test/wm_test_helper.cc7
-rw-r--r--ui/wm/test/wm_test_helper.h9
-rw-r--r--ui/wm/wm.gyp23
-rw-r--r--ui/wm/wm_export.h32
599 files changed, 10691 insertions, 6023 deletions
diff --git a/ui/accessibility/accessibility.target.darwin-arm.mk b/ui/accessibility/accessibility.target.darwin-arm.mk
index 1c1e01fdc5..f9a1b0c155 100644
--- a/ui/accessibility/accessibility.target.darwin-arm.mk
+++ b/ui/accessibility/accessibility.target.darwin-arm.mk
@@ -99,12 +99,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -220,12 +223,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -298,7 +304,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/accessibility.target.darwin-mips.mk b/ui/accessibility/accessibility.target.darwin-mips.mk
index 9e8d30c7ed..f791285ab4 100644
--- a/ui/accessibility/accessibility.target.darwin-mips.mk
+++ b/ui/accessibility/accessibility.target.darwin-mips.mk
@@ -98,12 +98,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -218,12 +221,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -294,7 +300,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/accessibility.target.darwin-x86.mk b/ui/accessibility/accessibility.target.darwin-x86.mk
index fc3ac1ba94..a39a23acc3 100644
--- a/ui/accessibility/accessibility.target.darwin-x86.mk
+++ b/ui/accessibility/accessibility.target.darwin-x86.mk
@@ -100,12 +100,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -221,12 +224,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/accessibility.target.darwin-x86_64.mk b/ui/accessibility/accessibility.target.darwin-x86_64.mk
index 43ddd79291..4644939bf9 100644
--- a/ui/accessibility/accessibility.target.darwin-x86_64.mk
+++ b/ui/accessibility/accessibility.target.darwin-x86_64.mk
@@ -100,12 +100,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -221,12 +224,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/accessibility.target.linux-arm.mk b/ui/accessibility/accessibility.target.linux-arm.mk
index 1c1e01fdc5..f9a1b0c155 100644
--- a/ui/accessibility/accessibility.target.linux-arm.mk
+++ b/ui/accessibility/accessibility.target.linux-arm.mk
@@ -99,12 +99,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -220,12 +223,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -298,7 +304,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/accessibility.target.linux-mips.mk b/ui/accessibility/accessibility.target.linux-mips.mk
index 9e8d30c7ed..f791285ab4 100644
--- a/ui/accessibility/accessibility.target.linux-mips.mk
+++ b/ui/accessibility/accessibility.target.linux-mips.mk
@@ -98,12 +98,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -218,12 +221,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -294,7 +300,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/accessibility.target.linux-x86.mk b/ui/accessibility/accessibility.target.linux-x86.mk
index fc3ac1ba94..a39a23acc3 100644
--- a/ui/accessibility/accessibility.target.linux-x86.mk
+++ b/ui/accessibility/accessibility.target.linux-x86.mk
@@ -100,12 +100,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -221,12 +224,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/accessibility.target.linux-x86_64.mk b/ui/accessibility/accessibility.target.linux-x86_64.mk
index 43ddd79291..4644939bf9 100644
--- a/ui/accessibility/accessibility.target.linux-x86_64.mk
+++ b/ui/accessibility/accessibility.target.linux-x86_64.mk
@@ -100,12 +100,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -221,12 +224,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/ax_gen.target.darwin-arm.mk b/ui/accessibility/ax_gen.target.darwin-arm.mk
index 427222e1b2..96328b1789 100644
--- a/ui/accessibility/ax_gen.target.darwin-arm.mk
+++ b/ui/accessibility/ax_gen.target.darwin-arm.mk
@@ -266,7 +266,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/ax_gen.target.darwin-mips.mk b/ui/accessibility/ax_gen.target.darwin-mips.mk
index 77c4db8253..82a261f9ed 100644
--- a/ui/accessibility/ax_gen.target.darwin-mips.mk
+++ b/ui/accessibility/ax_gen.target.darwin-mips.mk
@@ -262,7 +262,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/ax_gen.target.darwin-x86.mk b/ui/accessibility/ax_gen.target.darwin-x86.mk
index 549c6394e6..083a186f40 100644
--- a/ui/accessibility/ax_gen.target.darwin-x86.mk
+++ b/ui/accessibility/ax_gen.target.darwin-x86.mk
@@ -264,7 +264,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/ax_gen.target.darwin-x86_64.mk b/ui/accessibility/ax_gen.target.darwin-x86_64.mk
index 6b6f0c5437..4870072e31 100644
--- a/ui/accessibility/ax_gen.target.darwin-x86_64.mk
+++ b/ui/accessibility/ax_gen.target.darwin-x86_64.mk
@@ -264,7 +264,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/ax_gen.target.linux-arm.mk b/ui/accessibility/ax_gen.target.linux-arm.mk
index 427222e1b2..96328b1789 100644
--- a/ui/accessibility/ax_gen.target.linux-arm.mk
+++ b/ui/accessibility/ax_gen.target.linux-arm.mk
@@ -266,7 +266,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/ax_gen.target.linux-mips.mk b/ui/accessibility/ax_gen.target.linux-mips.mk
index 77c4db8253..82a261f9ed 100644
--- a/ui/accessibility/ax_gen.target.linux-mips.mk
+++ b/ui/accessibility/ax_gen.target.linux-mips.mk
@@ -262,7 +262,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/ax_gen.target.linux-x86.mk b/ui/accessibility/ax_gen.target.linux-x86.mk
index 549c6394e6..083a186f40 100644
--- a/ui/accessibility/ax_gen.target.linux-x86.mk
+++ b/ui/accessibility/ax_gen.target.linux-x86.mk
@@ -264,7 +264,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/ax_gen.target.linux-x86_64.mk b/ui/accessibility/ax_gen.target.linux-x86_64.mk
index 6b6f0c5437..4870072e31 100644
--- a/ui/accessibility/ax_gen.target.linux-x86_64.mk
+++ b/ui/accessibility/ax_gen.target.linux-x86_64.mk
@@ -264,7 +264,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/accessibility/ax_node.cc b/ui/accessibility/ax_node.cc
index 8adb940905..587f7375d7 100644
--- a/ui/accessibility/ax_node.cc
+++ b/ui/accessibility/ax_node.cc
@@ -19,6 +19,10 @@ void AXNode::SetData(const AXNodeData& src) {
data_ = src;
}
+void AXNode::SetLocation(const gfx::Rect& new_location) {
+ data_.location = new_location;
+}
+
void AXNode::SetIndexInParent(int index_in_parent) {
index_in_parent_ = index_in_parent;
}
@@ -31,4 +35,13 @@ void AXNode::Destroy() {
delete this;
}
+bool AXNode::IsDescendantOf(AXNode* ancestor) {
+ if (this == ancestor)
+ return true;
+ else if (parent())
+ return parent()->IsDescendantOf(ancestor);
+
+ return false;
+}
+
} // namespace ui
diff --git a/ui/accessibility/ax_node.h b/ui/accessibility/ax_node.h
index b7e31257b9..5da73401c5 100644
--- a/ui/accessibility/ax_node.h
+++ b/ui/accessibility/ax_node.h
@@ -24,27 +24,36 @@ class AX_EXPORT AXNode {
int child_count() const { return static_cast<int>(children_.size()); }
const AXNodeData& data() const { return data_; }
const std::vector<AXNode*>& children() const { return children_; }
+ int index_in_parent() const { return index_in_parent_; }
// Get the child at the given index.
AXNode* ChildAtIndex(int index) const { return children_[index]; }
// Set the node's accessibility data. This may be done during initial
// initialization or later when the node data changes.
- virtual void SetData(const AXNodeData& src);
+ void SetData(const AXNodeData& src);
+
+ // Update this node's location. This is separate from SetData just because
+ // changing only the location is common and should be more efficient than
+ // re-copying all of the data.
+ void SetLocation(const gfx::Rect& new_location);
// Set the index in parent, for example if siblings were inserted or deleted.
void SetIndexInParent(int index_in_parent);
// Swap the internal children vector with |children|. This instance
// now owns all of the passed children.
- virtual void SwapChildren(std::vector<AXNode*>& children);
+ void SwapChildren(std::vector<AXNode*>& children);
// This is called when the AXTree no longer includes this node in the
// tree. Reference counting is used on some platforms because the
// operating system may hold onto a reference to an AXNode
// object even after we're through with it, so this may decrement the
// reference count and clear out the object's data.
- virtual void Destroy();
+ void Destroy();
+
+ // Return true if this object is equal to or a descendant of |ancestor|.
+ bool IsDescendantOf(AXNode* ancestor);
private:
int index_in_parent_;
diff --git a/ui/accessibility/ax_node_data.cc b/ui/accessibility/ax_node_data.cc
index d287ac906d..78987ef6e1 100644
--- a/ui/accessibility/ax_node_data.cc
+++ b/ui/accessibility/ax_node_data.cc
@@ -6,7 +6,6 @@
#include <set>
-#include "base/containers/hash_tables.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc
index 17112742a4..c0ec9ac8c4 100644
--- a/ui/accessibility/ax_tree.cc
+++ b/ui/accessibility/ax_tree.cc
@@ -15,9 +15,7 @@ namespace ui {
namespace {
std::string TreeToStringHelper(AXNode* node, int indent) {
- std::string result;
- for (int i = 0; i < indent; i++)
- result += " ";
+ std::string result = std::string(2 * indent, ' ');
result += node->data().ToString() + "\n";
for (int i = 0; i < node->child_count(); ++i)
result += TreeToStringHelper(node->ChildAtIndex(i), indent + 1);
@@ -47,7 +45,7 @@ AXTreeDelegate::~AXTreeDelegate() {
AXTree::AXTree()
: delegate_(NULL), root_(NULL) {
AXNodeData root;
- root.id = 0;
+ root.id = -1;
root.role = AX_ROLE_ROOT_WEB_AREA;
AXTreeUpdate initial_state;
@@ -119,10 +117,10 @@ bool AXTree::Unserialize(const AXTreeUpdate& update) {
for (size_t i = 0; i < update.nodes.size(); ++i) {
AXNode* node = GetFromId(update.nodes[i].id);
if (update_state.new_nodes.find(node) != update_state.new_nodes.end()) {
- delegate_->OnNodeCreated(node);
+ delegate_->OnNodeCreationFinished(node);
update_state.new_nodes.erase(node);
} else {
- delegate_->OnNodeChanged(node);
+ delegate_->OnNodeChangeFinished(node);
}
}
if (root_->id() != old_root_id)
@@ -136,8 +134,13 @@ std::string AXTree::ToString() const {
return TreeToStringHelper(root_, 0);
}
-AXNode* AXTree::CreateNode(AXNode* parent, int32 id, int32 index_in_parent) {
- return new AXNode(parent, id, index_in_parent);
+AXNode* AXTree::CreateNode(
+ AXNode* parent, int32 id, int32 index_in_parent) {
+ AXNode* new_node = new AXNode(parent, id, index_in_parent);
+ id_map_[new_node->id()] = new_node;
+ if (delegate_)
+ delegate_->OnNodeCreated(new_node);
+ return new_node;
}
bool AXTree::UpdateNode(
@@ -150,25 +153,31 @@ bool AXTree::UpdateNode(
// of the tree is being swapped, or we're out of sync with the source
// and this is a serious error.
AXNode* node = GetFromId(src.id);
+ AXNode* new_node = NULL;
if (node) {
update_state->pending_nodes.erase(node);
+ node->SetData(src);
+ if (delegate_)
+ delegate_->OnNodeChanged(node);
} else {
if (src.role != AX_ROLE_ROOT_WEB_AREA) {
error_ = base::StringPrintf(
"%d is not in the tree and not the new root", src.id);
return false;
}
- node = CreateAndInitializeNode(NULL, src.id, 0);
+ new_node = CreateNode(NULL, src.id, 0);
+ node = new_node;
update_state->new_nodes.insert(node);
+ node->SetData(src);
}
- // Set the node's data.
- node->SetData(src);
-
// First, delete nodes that used to be children of this node but aren't
// anymore.
- if (!DeleteOldChildren(node, src.child_ids))
+ if (!DeleteOldChildren(node, src.child_ids)) {
+ if (new_node)
+ DestroyNodeAndSubtree(new_node);
return false;
+ }
// Now build a new children vector, reusing nodes when possible,
// and swap it in.
@@ -188,13 +197,6 @@ bool AXTree::UpdateNode(
return success;
}
-AXNode* AXTree::CreateAndInitializeNode(
- AXNode* parent, int32 id, int32 index_in_parent) {
- AXNode* node = CreateNode(parent, id, index_in_parent);
- id_map_[node->id()] = node;
- return node;
-}
-
void AXTree::DestroyNodeAndSubtree(AXNode* node) {
id_map_.erase(node->id());
for (int i = 0; i < node->child_count(); ++i)
@@ -253,7 +255,7 @@ bool AXTree::CreateNewChildVector(AXNode* node,
}
child->SetIndexInParent(index_in_parent);
} else {
- child = CreateAndInitializeNode(node, child_id, index_in_parent);
+ child = CreateNode(node, child_id, index_in_parent);
update_state->pending_nodes.insert(child);
update_state->new_nodes.insert(child);
}
diff --git a/ui/accessibility/ax_tree.h b/ui/accessibility/ax_tree.h
index 6a4134cb2a..b4baac460c 100644
--- a/ui/accessibility/ax_tree.h
+++ b/ui/accessibility/ax_tree.h
@@ -17,6 +17,20 @@ class AXNode;
struct AXTreeUpdateState;
// Used when you want to be notified when changes happen to the tree.
+//
+// Some of the notifications are called in the middle of an update operation.
+// Be careful, as the tree may be in an inconsistent state at this time;
+// don't walk the parents and children at this time:
+// OnNodeWillBeDeleted
+// OnNodeCreated
+// OnNodeChanged
+//
+// Other notifications are called at the end of an atomic update operation.
+// From these, it's safe to walk the tree and do any initialization that
+// assumes the tree is in a consistent state.
+// OnNodeCreationFinished
+// OnNodeChangeFinished
+// OnRootChanged
class AX_EXPORT AXTreeDelegate {
public:
AXTreeDelegate();
@@ -27,16 +41,23 @@ class AX_EXPORT AXTreeDelegate {
// in the middle of an update, the tree may be in an invalid state!
virtual void OnNodeWillBeDeleted(AXNode* node) = 0;
- // Called after a new node is created. It's guaranteed to be called
- // after it's been fully initialized, so you can rely on its data and
- // links to parents and children being valid. This will be called on
- // parents before it's called on their children.
+ // Called immediately after a new node is created. The tree may be in
+ // the middle of an update, don't walk the parents and children now.
virtual void OnNodeCreated(AXNode* node) = 0;
- // Called when a node changes its data or children.
+ // Called when a node changes its data or children. The tree may be in
+ // the middle of an update, don't walk the parents and children now.
virtual void OnNodeChanged(AXNode* node) = 0;
- // Called when the root node changes.
+ // Called for each new node at the end of an update operation,
+ // when the tree is in a consistent state.
+ virtual void OnNodeCreationFinished(AXNode* node) = 0;
+
+ // Called for each existing node that changed at the end of an update
+ // operation, when the tree is in a consistent state.
+ virtual void OnNodeChangeFinished(AXNode* node) = 0;
+
+ // Called at the end of an update operation when the root node changes.
virtual void OnRootChanged(AXNode* new_root) = 0;
};
@@ -76,10 +97,6 @@ class AX_EXPORT AXTree {
void OnRootChanged();
- // Convenience function to create a node and call Initialize on it.
- AXNode* CreateAndInitializeNode(
- AXNode* parent, int32 id, int32 index_in_parent);
-
// Call Destroy() on |node|, and delete it from the id map, and then
// call recursively on all nodes in its subtree.
void DestroyNodeAndSubtree(AXNode* node);
diff --git a/ui/accessibility/ax_tree_unittest.cc b/ui/accessibility/ax_tree_unittest.cc
index f4c609ed36..9d734f883f 100644
--- a/ui/accessibility/ax_tree_unittest.cc
+++ b/ui/accessibility/ax_tree_unittest.cc
@@ -28,18 +28,31 @@ class FakeAXTreeDelegate : public AXTreeDelegate {
changed_ids_.push_back(node->id());
}
+ virtual void OnNodeCreationFinished(AXNode* node) OVERRIDE {
+ creation_finished_ids_.push_back(node->id());
+ }
+
+ virtual void OnNodeChangeFinished(AXNode* node) OVERRIDE {
+ change_finished_ids_.push_back(node->id());
+ }
+
virtual void OnRootChanged(AXNode* new_root) OVERRIDE {
new_root_ids_.push_back(new_root->id());
}
const std::vector<int32>& deleted_ids() { return deleted_ids_; }
const std::vector<int32>& created_ids() { return created_ids_; }
+ const std::vector<int32>& creation_finished_ids() {
+ return creation_finished_ids_;
+ }
const std::vector<int32>& new_root_ids() { return new_root_ids_; }
private:
std::vector<int32> deleted_ids_;
std::vector<int32> created_ids_;
+ std::vector<int32> creation_finished_ids_;
std::vector<int32> changed_ids_;
+ std::vector<int32> change_finished_ids_;
std::vector<int32> new_root_ids_;
};
@@ -103,6 +116,44 @@ TEST(AXTreeTest, SerializeSimpleAXTree) {
dst_tree.ToString());
}
+TEST(AXTreeTest, SerializeAXTreeUpdate) {
+ AXNodeData list;
+ list.id = 3;
+ list.role = AX_ROLE_LIST;
+ list.state = 0;
+ list.child_ids.push_back(4);
+ list.child_ids.push_back(5);
+ list.child_ids.push_back(6);
+
+ AXNodeData list_item_2;
+ list_item_2.id = 5;
+ list_item_2.role = AX_ROLE_LIST_ITEM;
+ list_item_2.state = 0;
+
+ AXNodeData list_item_3;
+ list_item_3.id = 6;
+ list_item_3.role = AX_ROLE_LIST_ITEM;
+ list_item_3.state = 0;
+
+ AXNodeData button;
+ button.id = 7;
+ button.role = AX_ROLE_BUTTON;
+ button.state = 0;
+
+ AXTreeUpdate update;
+ update.nodes.push_back(list);
+ update.nodes.push_back(list_item_2);
+ update.nodes.push_back(list_item_3);
+ update.nodes.push_back(button);
+
+ EXPECT_EQ(
+ "id=3 list (0, 0)-(0, 0) child_ids=4,5,6\n"
+ " id=5 list_item (0, 0)-(0, 0)\n"
+ " id=6 list_item (0, 0)-(0, 0)\n"
+ "id=7 button (0, 0)-(0, 0)\n",
+ update.ToString());
+}
+
TEST(AXTreeTest, DeleteUnknownSubtreeFails) {
AXNodeData root;
root.id = 1;
@@ -234,6 +285,10 @@ TEST(AXTreeTest, TreeDelegateIsCalled) {
EXPECT_EQ(2, fake_delegate.created_ids()[0]);
EXPECT_EQ(3, fake_delegate.created_ids()[1]);
+ ASSERT_EQ(2U, fake_delegate.creation_finished_ids().size());
+ EXPECT_EQ(2, fake_delegate.creation_finished_ids()[0]);
+ EXPECT_EQ(3, fake_delegate.creation_finished_ids()[1]);
+
ASSERT_EQ(1U, fake_delegate.new_root_ids().size());
EXPECT_EQ(2, fake_delegate.new_root_ids()[0]);
diff --git a/ui/accessibility/ax_tree_update.cc b/ui/accessibility/ax_tree_update.cc
index dc785d9e06..8e9d019349 100644
--- a/ui/accessibility/ax_tree_update.cc
+++ b/ui/accessibility/ax_tree_update.cc
@@ -4,6 +4,9 @@
#include "ui/accessibility/ax_tree_update.h"
+#include "base/containers/hash_tables.h"
+#include "base/strings/string_number_conversions.h"
+
namespace ui {
AXTreeUpdate::AXTreeUpdate() : node_id_to_clear(0) {
@@ -12,4 +15,28 @@ AXTreeUpdate::AXTreeUpdate() : node_id_to_clear(0) {
AXTreeUpdate::~AXTreeUpdate() {
}
+std::string AXTreeUpdate::ToString() const {
+ std::string result;
+ if (node_id_to_clear != 0) {
+ result += "AXTreeUpdate: clear node " +
+ base::IntToString(node_id_to_clear) + "\n";
+ }
+
+ // The challenge here is that we want to indent the nodes being updated
+ // so that parent/child relationships are clear, but we don't have access
+ // to the rest of the tree for context, so we have to try to show the
+ // relative indentation of child nodes in this update relative to their
+ // parents.
+ base::hash_map<int32, int> id_to_indentation;
+ for (size_t i = 0; i < nodes.size(); ++i) {
+ int indent = id_to_indentation[nodes[i].id];
+ result += std::string(2 * indent, ' ');
+ result += nodes[i].ToString() + "\n";
+ for (size_t j = 0; j < nodes[i].child_ids.size(); ++j)
+ id_to_indentation[nodes[i].child_ids[j]] = indent + 1;
+ }
+
+ return result;
+}
+
} // namespace ui
diff --git a/ui/accessibility/ax_tree_update.h b/ui/accessibility/ax_tree_update.h
index 0280efe644..314a78f823 100644
--- a/ui/accessibility/ax_tree_update.h
+++ b/ui/accessibility/ax_tree_update.h
@@ -50,6 +50,9 @@ struct AX_EXPORT AXTreeUpdate {
// A vector of nodes to update, according to the rules above.
std::vector<AXNodeData> nodes;
+ // Return a multi-line indented string representation, for logging.
+ std::string ToString() const;
+
// TODO(dmazzoni): location changes
};
diff --git a/ui/android/java/res/drawable-hdpi/dropdown_popup_background_down.9.png b/ui/android/java/res/drawable-hdpi/dropdown_popup_background_down.9.png
new file mode 100644
index 0000000000..62478fcf66
--- /dev/null
+++ b/ui/android/java/res/drawable-hdpi/dropdown_popup_background_down.9.png
Binary files differ
diff --git a/ui/android/java/res/drawable-hdpi/dropdown_popup_background_up.9.png b/ui/android/java/res/drawable-hdpi/dropdown_popup_background_up.9.png
new file mode 100644
index 0000000000..290f526067
--- /dev/null
+++ b/ui/android/java/res/drawable-hdpi/dropdown_popup_background_up.9.png
Binary files differ
diff --git a/ui/android/java/res/drawable-xhdpi/dropdown_popup_background_down.9.png b/ui/android/java/res/drawable-xhdpi/dropdown_popup_background_down.9.png
new file mode 100644
index 0000000000..ab4d02cd38
--- /dev/null
+++ b/ui/android/java/res/drawable-xhdpi/dropdown_popup_background_down.9.png
Binary files differ
diff --git a/ui/android/java/res/drawable-xhdpi/dropdown_popup_background_up.9.png b/ui/android/java/res/drawable-xhdpi/dropdown_popup_background_up.9.png
new file mode 100644
index 0000000000..cf3f9e6526
--- /dev/null
+++ b/ui/android/java/res/drawable-xhdpi/dropdown_popup_background_up.9.png
Binary files differ
diff --git a/ui/android/java/res/drawable/dropdown_popup_background_down.9.png b/ui/android/java/res/drawable/dropdown_popup_background_down.9.png
new file mode 100644
index 0000000000..0fb3b87b8f
--- /dev/null
+++ b/ui/android/java/res/drawable/dropdown_popup_background_down.9.png
Binary files differ
diff --git a/ui/android/java/res/drawable/dropdown_popup_background_up.9.png b/ui/android/java/res/drawable/dropdown_popup_background_up.9.png
new file mode 100644
index 0000000000..4ab1786471
--- /dev/null
+++ b/ui/android/java/res/drawable/dropdown_popup_background_up.9.png
Binary files differ
diff --git a/ui/android/java/src/org/chromium/ui/UiUtils.java b/ui/android/java/src/org/chromium/ui/UiUtils.java
index 6e6bf54784..e46e6fec40 100644
--- a/ui/android/java/src/org/chromium/ui/UiUtils.java
+++ b/ui/android/java/src/org/chromium/ui/UiUtils.java
@@ -30,6 +30,31 @@ public class UiUtils {
/** The minimum size of the bottom margin below the app to detect a keyboard. */
private static final float KEYBOARD_DETECT_BOTTOM_THRESHOLD_DP = 100;
+ /** A delegate that allows disabling keyboard visibility detection. */
+ private static KeyboardShowingDelegate sKeyboardShowingDelegate;
+
+ /**
+ * A delegate that can be implemented to override whether or not keyboard detection will be
+ * used.
+ */
+ public interface KeyboardShowingDelegate {
+ /**
+ * Will be called to determine whether or not to detect if the keyboard is visible.
+ * @param context A {@link Context} instance.
+ * @param view A {@link View}.
+ * @return Whether or not the keyboard check should be disabled.
+ */
+ boolean disableKeyboardCheck(Context context, View view);
+ }
+
+ /**
+ * Allows setting a delegate to override the default software keyboard visibility detection.
+ * @param delegate A {@link KeyboardShowingDelegate} instance.
+ */
+ public static void setKeyboardShowingDelegate(KeyboardShowingDelegate delegate) {
+ sKeyboardShowingDelegate = delegate;
+ }
+
/**
* Shows the software keyboard if necessary.
* @param view The currently focused {@link View}, which would receive soft keyboard input.
@@ -54,7 +79,19 @@ public class UiUtils {
return imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
+ /**
+ * Detects whether or not the keyboard is showing. This is a best guess as there is no
+ * standardized/foolproof way to do this.
+ * @param context A {@link Context} instance.
+ * @param view A {@link View}.
+ * @return Whether or not the software keyboard is visible and taking up screen space.
+ */
public static boolean isKeyboardShowing(Context context, View view) {
+ if (sKeyboardShowingDelegate != null
+ && sKeyboardShowingDelegate.disableKeyboardCheck(context, view)) {
+ return false;
+ }
+
View rootView = view.getRootView();
if (rootView == null) return false;
Rect appRect = new Rect();
diff --git a/ui/android/java/src/org/chromium/ui/autofill/OWNERS b/ui/android/java/src/org/chromium/ui/autofill/OWNERS
new file mode 100644
index 0000000000..812e8d9572
--- /dev/null
+++ b/ui/android/java/src/org/chromium/ui/autofill/OWNERS
@@ -0,0 +1 @@
+aurimas@chromium.org
diff --git a/ui/android/java/src/org/chromium/ui/gfx/DeviceDisplayInfo.java b/ui/android/java/src/org/chromium/ui/gfx/DeviceDisplayInfo.java
index 5f7e1c5882..81c49935a5 100644
--- a/ui/android/java/src/org/chromium/ui/gfx/DeviceDisplayInfo.java
+++ b/ui/android/java/src/org/chromium/ui/gfx/DeviceDisplayInfo.java
@@ -10,6 +10,7 @@ import android.graphics.Point;
import android.os.Build;
import android.util.DisplayMetrics;
import android.view.Display;
+import android.view.Surface;
import android.view.WindowManager;
import org.chromium.base.CalledByNative;
@@ -154,6 +155,30 @@ public class DeviceDisplayInfo {
}
/**
+ * @return the screen's rotation angle from its 'natural' orientation.
+ * Expected values are one of { 0, 90, 180, 270 }.
+ * See http://developer.android.com/reference/android/view/Display.html#getRotation()
+ * for more information about Display.getRotation() behavior.
+ */
+ @CalledByNative
+ private int getRotationDegrees() {
+ switch (getDisplay().getRotation()) {
+ case Surface.ROTATION_0:
+ return 0;
+ case Surface.ROTATION_90:
+ return 90;
+ case Surface.ROTATION_180:
+ return 180;
+ case Surface.ROTATION_270:
+ return 270;
+ }
+
+ // This should not happen.
+ assert false;
+ return 0;
+ }
+
+ /**
* Inform the native implementation to update its cached representation of
* the DeviceDisplayInfo values.
*/
@@ -162,7 +187,7 @@ public class DeviceDisplayInfo {
getDisplayHeight(), getDisplayWidth(),
getPhysicalDisplayHeight(), getPhysicalDisplayWidth(),
getBitsPerPixel(), getBitsPerComponent(),
- getDIPScale(), getSmallestDIPWidth());
+ getDIPScale(), getSmallestDIPWidth(), getRotationDegrees());
}
private Display getDisplay() {
@@ -184,6 +209,6 @@ public class DeviceDisplayInfo {
int displayHeight, int displayWidth,
int physicalDisplayHeight, int physicalDisplayWidth,
int bitsPerPixel, int bitsPerComponent, double dipScale,
- int smallestDIPWidth);
+ int smallestDIPWidth, int rotationDegrees);
}
diff --git a/ui/android/java/src/org/chromium/ui/gfx/ViewConfigurationHelper.java b/ui/android/java/src/org/chromium/ui/gfx/ViewConfigurationHelper.java
index ae007b4d3d..e8fc5b996d 100644
--- a/ui/android/java/src/org/chromium/ui/gfx/ViewConfigurationHelper.java
+++ b/ui/android/java/src/org/chromium/ui/gfx/ViewConfigurationHelper.java
@@ -8,6 +8,7 @@ import android.content.ComponentCallbacks;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.util.TypedValue;
import android.view.ViewConfiguration;
import org.chromium.base.CalledByNative;
@@ -21,6 +22,12 @@ import org.chromium.ui.R;
*/
@JNINamespace("gfx")
public class ViewConfigurationHelper {
+
+ // Fallback constants when resource lookup fails, see
+ // ui/android/java/res/values/dimens.xml.
+ private static final float MIN_SCALING_SPAN_MM = 27.0f;
+ private static final float MIN_SCALING_TOUCH_MAJOR_DIP = 48.0f;
+
private final Context mAppContext;
private ViewConfiguration mViewConfiguration;
@@ -104,8 +111,13 @@ public class ViewConfigurationHelper {
int id = res.getIdentifier("config_minScalingSpan", "dimen", "android");
// Fall back to a sensible default if the internal identifier does not exist.
if (id == 0) id = R.dimen.config_min_scaling_span;
- return res.getDimensionPixelSize(id);
-
+ try {
+ return res.getDimensionPixelSize(id);
+ } catch (Resources.NotFoundException e) {
+ assert false : "MinScalingSpan resource lookup failed.";
+ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, MIN_SCALING_SPAN_MM,
+ res.getDisplayMetrics());
+ }
}
@CalledByNative
@@ -114,7 +126,13 @@ public class ViewConfigurationHelper {
int id = res.getIdentifier("config_minScalingTouchMajor", "dimen", "android");
// Fall back to a sensible default if the internal identifier does not exist.
if (id == 0) id = R.dimen.config_min_scaling_touch_major;
- return res.getDimensionPixelSize(id);
+ try {
+ return res.getDimensionPixelSize(id);
+ } catch (Resources.NotFoundException e) {
+ assert false : "MinScalingTouchMajor resource lookup failed.";
+ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+ MIN_SCALING_TOUCH_MAJOR_DIP, res.getDisplayMetrics());
+ }
}
@CalledByNative
diff --git a/ui/app_list/app_list.gyp b/ui/app_list/app_list.gyp
index 182d9c656c..13ba5e730b 100644
--- a/ui/app_list/app_list.gyp
+++ b/ui/app_list/app_list.gyp
@@ -151,7 +151,7 @@
'../events/events.gyp:events',
'../views/controls/webview/webview.gyp:webview',
'../views/views.gyp:views',
- '../wm/wm.gyp:wm_core',
+ '../wm/wm.gyp:wm',
],
}, { # toolkit_views==0
'sources/': [
diff --git a/ui/app_list/app_list_switches.cc b/ui/app_list/app_list_switches.cc
index be0e02156f..406519e700 100644
--- a/ui/app_list/app_list_switches.cc
+++ b/ui/app_list/app_list_switches.cc
@@ -29,7 +29,7 @@ const char kEnableExperimentalAppListPosition[] =
const char kEnableSyncAppList[] = "enable-sync-app-list";
bool IsAppListSyncEnabled() {
-#if defined(OS_CHROMEOS)
+#if defined(TOOLKIT_VIEWS)
return !CommandLine::ForCurrentProcess()->HasSwitch(kDisableSyncAppList);
#else
return CommandLine::ForCurrentProcess()->HasSwitch(kEnableSyncAppList);
diff --git a/ui/app_list/views/app_list_item_view.cc b/ui/app_list/views/app_list_item_view.cc
index 3ce3e9c6e4..9ab2a5b7d6 100644
--- a/ui/app_list/views/app_list_item_view.cc
+++ b/ui/app_list/views/app_list_item_view.cc
@@ -147,7 +147,6 @@ void AppListItemView::SetUIState(UIState state) {
ui_state_ = state;
-#if defined(USE_AURA)
switch (ui_state_) {
case UI_STATE_NORMAL:
title_->SetVisible(!item_->is_installing());
@@ -176,10 +175,9 @@ void AppListItemView::SetUIState(UIState state) {
case UI_STATE_DROPPING_IN_FOLDER:
break;
}
+#endif // !OS_WIN
SchedulePaint();
-#endif // !OS_WIN
-#endif // USE_AURA
}
void AppListItemView::SetTouchDragging(bool touch_dragging) {
diff --git a/ui/app_list/views/apps_grid_view.cc b/ui/app_list/views/apps_grid_view.cc
index d5d7078118..470632df05 100644
--- a/ui/app_list/views/apps_grid_view.cc
+++ b/ui/app_list/views/apps_grid_view.cc
@@ -232,8 +232,7 @@ class SynchronousDrag : public ui::DragSourceWin {
SetupExchangeData(&data);
// Hide the dragged view because the OS is going to create its own.
- const gfx::Size drag_view_size = drag_view_->size();
- drag_view_->SetSize(gfx::Size(0, 0));
+ drag_view_->SetVisible(false);
// Blocks until the drag is finished. Calls into the ui::DragSourceWin
// methods.
@@ -243,8 +242,8 @@ class SynchronousDrag : public ui::DragSourceWin {
// If |drag_view_| is NULL the drag was ended by some reentrant code.
if (drag_view_) {
- // Restore the dragged view to its original size.
- drag_view_->SetSize(drag_view_size);
+ // Make the drag view visible again.
+ drag_view_->SetVisible(true);
drag_view_->OnSyncDragEnd();
grid_view_->EndDrag(canceled_ || !IsCursorWithinGridView());
diff --git a/ui/aura/aura.gyp b/ui/aura/aura.gyp
index 26be1c3768..a9dae30a79 100644
--- a/ui/aura/aura.gyp
+++ b/ui/aura/aura.gyp
@@ -143,13 +143,13 @@
'../../skia/skia.gyp:skia',
'../../testing/gtest.gyp:gtest',
'../base/ui_base.gyp:ui_base',
+ '../base/ui_base.gyp:ui_base_test_support',
'../compositor/compositor.gyp:compositor_test_support',
'../events/events.gyp:events',
'../events/events.gyp:events_base',
'../events/events.gyp:events_test_support',
'../gfx/gfx.gyp:gfx',
'../gfx/gfx.gyp:gfx_geometry',
- '../ui_unittests.gyp:ui_test_support',
'aura',
],
'include_dirs': [
@@ -257,6 +257,7 @@
'../../skia/skia.gyp:skia',
'../../testing/gtest.gyp:gtest',
'../base/ui_base.gyp:ui_base',
+ '../base/ui_base.gyp:ui_base_test_support',
'../compositor/compositor.gyp:compositor',
'../compositor/compositor.gyp:compositor_test_support',
'../events/events.gyp:events',
@@ -264,7 +265,6 @@
'../gfx/gfx.gyp:gfx',
'../gfx/gfx.gyp:gfx_geometry',
'../gl/gl.gyp:gl',
- '../ui_unittests.gyp:ui_test_support',
'aura_test_support',
'aura',
],
diff --git a/ui/aura/demo/demo_main.cc b/ui/aura/demo/demo_main.cc
index 21d1dda54f..23262fa791 100644
--- a/ui/aura/demo/demo_main.cc
+++ b/ui/aura/demo/demo_main.cc
@@ -27,6 +27,10 @@
#include "ui/gfx/x/x11_connection.h"
#endif
+#if defined(OS_WIN)
+#include "ui/gfx/win/dpi.h"
+#endif
+
namespace {
// Trivial WindowDelegate implementation that draws a colored background.
@@ -112,6 +116,10 @@ int DemoMain() {
gfx::GLSurface::InitializeOneOff();
+#if defined(OS_WIN)
+ gfx::InitDeviceScaleFactor(1.0f);
+#endif
+
// The ContextFactory must exist before any Compositors are created.
scoped_ptr<ui::InProcessContextFactory> context_factory(
new ui::InProcessContextFactory());
diff --git a/ui/aura/env.cc b/ui/aura/env.cc
index 7e25c4c5b2..f701695738 100644
--- a/ui/aura/env.cc
+++ b/ui/aura/env.cc
@@ -4,14 +4,11 @@
#include "ui/aura/env.h"
-#include "base/command_line.h"
-#include "base/message_loop/message_pump_dispatcher.h"
#include "ui/aura/env_observer.h"
#include "ui/aura/input_state_lookup.h"
-#include "ui/aura/window.h"
#include "ui/compositor/compositor.h"
-#include "ui/compositor/compositor_switches.h"
#include "ui/events/event_target_iterator.h"
+#include "ui/events/platform/platform_event_source.h"
namespace aura {
@@ -72,6 +69,9 @@ bool Env::IsMouseButtonDown() const {
void Env::Init() {
ui::Compositor::Initialize();
+
+ if (!ui::PlatformEventSource::GetInstance())
+ event_source_ = ui::PlatformEventSource::CreateDefault();
}
void Env::NotifyWindowInitialized(Window* window) {
diff --git a/ui/aura/env.h b/ui/aura/env.h
index 68576ec51a..1d6c19de3f 100644
--- a/ui/aura/env.h
+++ b/ui/aura/env.h
@@ -12,6 +12,9 @@
#include "ui/events/event_target.h"
#include "ui/gfx/point.h"
+namespace ui {
+class PlatformEventSource;
+}
namespace aura {
namespace test {
@@ -36,6 +39,7 @@ class AURA_EXPORT Env : public ui::EventTarget {
void AddObserver(EnvObserver* observer);
void RemoveObserver(EnvObserver* observer);
+ const int mouse_button_flags() const { return mouse_button_flags_; }
void set_mouse_button_flags(int mouse_button_flags) {
mouse_button_flags_ = mouse_button_flags;
}
@@ -85,6 +89,7 @@ class AURA_EXPORT Env : public ui::EventTarget {
bool is_touch_down_;
scoped_ptr<InputStateLookup> input_state_lookup_;
+ scoped_ptr<ui::PlatformEventSource> event_source_;
DISALLOW_COPY_AND_ASSIGN(Env);
};
diff --git a/ui/aura/gestures/gesture_recognizer_unittest.cc b/ui/aura/gestures/gesture_recognizer_unittest.cc
index 212db84102..e87cffafa4 100644
--- a/ui/aura/gestures/gesture_recognizer_unittest.cc
+++ b/ui/aura/gestures/gesture_recognizer_unittest.cc
@@ -242,12 +242,8 @@ class GestureEventConsumeDelegate : public TestWindowDelegate {
scroll_update_ = true;
scroll_x_ += gesture->details().scroll_x();
scroll_y_ += gesture->details().scroll_y();
- scroll_velocity_x_ = gesture->details().velocity_x();
- scroll_velocity_y_ = gesture->details().velocity_y();
scroll_x_ordinal_ += gesture->details().scroll_x_ordinal();
scroll_y_ordinal_ += gesture->details().scroll_y_ordinal();
- scroll_velocity_x_ordinal_ = gesture->details().velocity_x_ordinal();
- scroll_velocity_y_ordinal_ = gesture->details().velocity_y_ordinal();
break;
case ui::ET_GESTURE_SCROLL_END:
EXPECT_TRUE(velocity_x_ == 0 && velocity_y_ == 0);
@@ -1123,14 +1119,8 @@ TEST_F(GestureRecognizerTest, GestureEventScrollPrediction) {
tes.SendScrollEvent(event_processor(), 130, 230, kTouchId, delegate.get());
EXPECT_1_EVENT(delegate->events(),
ui::ET_GESTURE_SCROLL_UPDATE);
- EXPECT_GT(delegate->scroll_velocity_x(), 0);
- EXPECT_GT(delegate->scroll_velocity_y(), 0);
total_scroll.set_x(total_scroll.x() + delegate->scroll_x());
total_scroll.set_y(total_scroll.y() + delegate->scroll_y());
- EXPECT_EQ((int)(29 + delegate->scroll_velocity_x() * prediction_interval),
- (int)(total_scroll.x()));
- EXPECT_EQ((int)(29 + delegate->scroll_velocity_y() * prediction_interval),
- (int)(total_scroll.y()));
// Move some more to generate a few more scroll updates.
tes.LeapForward(30);
@@ -1138,20 +1128,12 @@ TEST_F(GestureRecognizerTest, GestureEventScrollPrediction) {
EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
total_scroll.set_x(total_scroll.x() + delegate->scroll_x());
total_scroll.set_y(total_scroll.y() + delegate->scroll_y());
- EXPECT_EQ((int)(9 + delegate->scroll_velocity_x() * prediction_interval),
- (int)(total_scroll.x()));
- EXPECT_EQ((int)(10 + delegate->scroll_velocity_y() * prediction_interval),
- (int)(total_scroll.y()));
tes.LeapForward(30);
tes.SendScrollEvent(event_processor(), 140, 215, kTouchId, delegate.get());
EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
total_scroll.set_x(total_scroll.x() + delegate->scroll_x());
total_scroll.set_y(total_scroll.y() + delegate->scroll_y());
- EXPECT_EQ((int)(39 + delegate->scroll_velocity_x() * prediction_interval),
- (int)(total_scroll.x()));
- EXPECT_EQ((int)(14 + delegate->scroll_velocity_y() * prediction_interval),
- (int)(total_scroll.y()));
// Release the touch. This should end the scroll.
delegate->Reset();
@@ -1252,10 +1234,6 @@ TEST_F(GestureRecognizerTest, GestureEventHorizontalRailFling) {
100, 10, kTouchId, 1,
ui::GestureConfiguration::points_buffered_for_velocity(),
delegate.get());
- // The y-velocity during the scroll should be 0 since this is in a horizontal
- // rail scroll.
- EXPECT_GT(delegate->scroll_velocity_x(), 0);
- EXPECT_EQ(0, delegate->scroll_velocity_y());
delegate->Reset();
ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
@@ -1297,7 +1275,6 @@ TEST_F(GestureRecognizerTest, GestureEventVerticalRailFling) {
EXPECT_EQ(0, delegate->scroll_x());
EXPECT_EQ(1, delegate->scroll_x_ordinal());
EXPECT_EQ(0, delegate->scroll_velocity_x());
- EXPECT_GT(delegate->scroll_velocity_x_ordinal(), 0);
// Get a high y velocity, while still staying on the rail
tes.SendScrollEvents(event_processor(), 1, 6,
@@ -1305,7 +1282,6 @@ TEST_F(GestureRecognizerTest, GestureEventVerticalRailFling) {
ui::GestureConfiguration::points_buffered_for_velocity(),
delegate.get());
EXPECT_EQ(0, delegate->scroll_velocity_x());
- EXPECT_GT(delegate->scroll_velocity_y(), 0);
delegate->Reset();
ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 206),
@@ -1587,10 +1563,6 @@ TEST_F(GestureRecognizerTest, GestureEventHorizontalRailScroll) {
6, 100, kTouchId, 1,
ui::GestureConfiguration::points_buffered_for_velocity(),
delegate.get());
- // Since the scroll is not longer railing, the velocity should be set for both
- // axis.
- EXPECT_GT(delegate->scroll_velocity_x(), 0);
- EXPECT_GT(delegate->scroll_velocity_y(), 0);
tes.SendScrollEvent(event_processor(), 5, 0, kTouchId, delegate.get());
tes.SendScrollEvent(event_processor(), 10, 5, kTouchId, delegate.get());
@@ -1641,8 +1613,6 @@ TEST_F(GestureRecognizerTest, GestureEventVerticalRailScroll) {
100, 1, kTouchId, 1,
ui::GestureConfiguration::points_buffered_for_velocity(),
delegate.get());
- EXPECT_GT(delegate->scroll_velocity_x(), 0);
- EXPECT_GT(delegate->scroll_velocity_y(), 0);
tes.SendScrollEvent(event_processor(), 0, 5, kTouchId, delegate.get());
tes.SendScrollEvent(event_processor(), 5, 10, kTouchId, delegate.get());
@@ -2857,19 +2827,23 @@ TEST_F(GestureRecognizerTest, MultiFingerSwipe) {
aura::test::EventGenerator generator(root_window(), window.get());
for (int count = 2; count <= kTouchPoints; ++count) {
- generator.GestureMultiFingerScroll(count, points, 15, kSteps, 0, -150);
+ generator.GestureMultiFingerScroll(
+ count, points, 1000, kSteps, 0, -11 * kSteps);
EXPECT_TRUE(delegate->swipe_up());
delegate->Reset();
- generator.GestureMultiFingerScroll(count, points, 15, kSteps, 0, 150);
+ generator.GestureMultiFingerScroll(
+ count, points, 1000, kSteps, 0, 11 * kSteps);
EXPECT_TRUE(delegate->swipe_down());
delegate->Reset();
- generator.GestureMultiFingerScroll(count, points, 15, kSteps, -150, 0);
+ generator.GestureMultiFingerScroll(
+ count, points, 1000, kSteps, -11 * kSteps, 0);
EXPECT_TRUE(delegate->swipe_left());
delegate->Reset();
- generator.GestureMultiFingerScroll(count, points, 15, kSteps, 150, 0);
+ generator.GestureMultiFingerScroll(
+ count, points, 1000, kSteps, 11 * kSteps, 0);
EXPECT_TRUE(delegate->swipe_right());
delegate->Reset();
}
diff --git a/ui/aura/test/aura_test_base.cc b/ui/aura/test/aura_test_base.cc
index ec7eb95404..b6aecf9da7 100644
--- a/ui/aura/test/aura_test_base.cc
+++ b/ui/aura/test/aura_test_base.cc
@@ -69,6 +69,7 @@ void AuraTestBase::SetUp() {
ui::GestureConfiguration::set_fling_acceleration_curve_coefficients(
3, 0.8f);
ui::GestureConfiguration::set_fling_velocity_cap(15000.0f);
+ ui::GestureConfiguration::set_min_swipe_speed(10);
// The ContextFactory must exist before any Compositors are created.
bool enable_pixel_output = false;
diff --git a/ui/aura/window.cc b/ui/aura/window.cc
index 2c9aab82d8..87874f80a8 100644
--- a/ui/aura/window.cc
+++ b/ui/aura/window.cc
@@ -517,13 +517,14 @@ void Window::AddChild(Window* child) {
gfx::Vector2d offset;
aura::Window* ancestor_with_layer = GetAncestorWithLayer(&offset);
+
+ child->parent_ = this;
+
if (ancestor_with_layer) {
offset += child->bounds().OffsetFromOrigin();
child->ReparentLayers(ancestor_with_layer->layer(), offset);
}
- child->parent_ = this;
-
children_.push_back(child);
if (layout_manager_)
layout_manager_->OnWindowAddedToLayout(child);
@@ -635,14 +636,6 @@ gfx::NativeCursor Window::GetCursor(const gfx::Point& point) const {
return delegate_ ? delegate_->GetCursor(point) : gfx::kNullCursor;
}
-void Window::SetEventFilter(ui::EventHandler* event_filter) {
- if (event_filter_)
- RemovePreTargetHandler(event_filter_.get());
- event_filter_.reset(event_filter);
- if (event_filter)
- AddPreTargetHandler(event_filter);
-}
-
void Window::AddObserver(WindowObserver* observer) {
observers_.AddObserver(observer);
}
diff --git a/ui/aura/window.h b/ui/aura/window.h
index 6fbea3609b..4455cd68fa 100644
--- a/ui/aura/window.h
+++ b/ui/aura/window.h
@@ -147,7 +147,7 @@ class AURA_EXPORT Window : public ui::LayerDelegate,
// |aura::client::ScreenPositionClient| interface.
gfx::Rect GetBoundsInScreen() const;
- virtual void SetTransform(const gfx::Transform& transform);
+ void SetTransform(const gfx::Transform& transform);
// Assigns a LayoutManager to size and place child windows.
// The Window takes ownership of the LayoutManager.
@@ -220,12 +220,6 @@ class AURA_EXPORT Window : public ui::LayerDelegate,
// Returns the cursor for the specified point, in window coordinates.
gfx::NativeCursor GetCursor(const gfx::Point& point) const;
- // Sets an 'event filter' for the window. An 'event filter' for a Window is
- // a pre-target event handler, where the window owns the handler. A window
- // can have only one such event filter. Setting a new filter removes and
- // destroys any previously installed filter.
- void SetEventFilter(ui::EventHandler* event_filter);
-
// Add/remove observer.
void AddObserver(WindowObserver* observer);
void RemoveObserver(WindowObserver* observer);
@@ -518,7 +512,6 @@ class AURA_EXPORT Window : public ui::LayerDelegate,
// Whether layer is initialized as non-opaque.
bool transparent_;
- scoped_ptr<ui::EventHandler> event_filter_;
scoped_ptr<LayoutManager> layout_manager_;
scoped_ptr<ui::EventTargeter> targeter_;
diff --git a/ui/aura/window_event_dispatcher.cc b/ui/aura/window_event_dispatcher.cc
index c566d1b58e..823c8e85fa 100644
--- a/ui/aura/window_event_dispatcher.cc
+++ b/ui/aura/window_event_dispatcher.cc
@@ -121,7 +121,7 @@ void WindowEventDispatcher::RepostEvent(const ui::LocatedEvent& event) {
void WindowEventDispatcher::OnMouseEventsEnableStateChanged(bool enabled) {
// Send entered / exited so that visual state can be updated to match
// mouse events state.
- PostSynthesizeMouseMove();
+ PostSynthesizeMouseMove(ui::EF_NONE);
// TODO(mazda): Add code to disable mouse events when |enabled| == false.
}
@@ -379,7 +379,7 @@ void WindowEventDispatcher::UpdateCapture(Window* old_capture,
mouse_moved_handler_ = new_capture;
} else {
// Make sure mouse_moved_handler gets updated.
- DispatchDetails details = SynthesizeMouseMoveEvent();
+ DispatchDetails details = SynthesizeMouseMoveEvent(ui::EF_NONE);
if (details.dispatcher_destroyed)
return;
}
@@ -562,7 +562,7 @@ void WindowEventDispatcher::OnWindowVisibilityChanged(Window* window,
return;
if (window->ContainsPointInRoot(GetLastMouseLocationInRoot()))
- PostSynthesizeMouseMove();
+ PostSynthesizeMouseMove(ui::EF_NONE);
// Hiding the window releases capture which can implicitly destroy the window
// so the window may no longer be valid after this call.
@@ -594,7 +594,7 @@ void WindowEventDispatcher::OnWindowBoundsChanged(Window* window,
synthesize_mouse_move_ = false;
}
- if (window->IsVisible()) {
+ if (window->IsVisible() && !window->ignore_events()) {
gfx::Rect old_bounds_in_root = old_bounds, new_bounds_in_root = new_bounds;
Window::ConvertRectToTarget(window->parent(), host_->window(),
&old_bounds_in_root);
@@ -603,7 +603,7 @@ void WindowEventDispatcher::OnWindowBoundsChanged(Window* window,
gfx::Point last_mouse_location = GetLastMouseLocationInRoot();
if (old_bounds_in_root.Contains(last_mouse_location) !=
new_bounds_in_root.Contains(last_mouse_location)) {
- PostSynthesizeMouseMove();
+ PostSynthesizeMouseMove(Env::GetInstance()->mouse_button_flags());
}
}
}
@@ -669,7 +669,7 @@ ui::EventDispatchDetails WindowEventDispatcher::DispatchHeldEvents() {
return dispatch_details;
}
-void WindowEventDispatcher::PostSynthesizeMouseMove() {
+void WindowEventDispatcher::PostSynthesizeMouseMove(int mouse_button_flags) {
if (synthesize_mouse_move_)
return;
synthesize_mouse_move_ = true;
@@ -677,18 +677,20 @@ void WindowEventDispatcher::PostSynthesizeMouseMove() {
FROM_HERE,
base::Bind(base::IgnoreResult(
&WindowEventDispatcher::SynthesizeMouseMoveEvent),
- held_event_factory_.GetWeakPtr()));
+ held_event_factory_.GetWeakPtr(),
+ mouse_button_flags));
}
void WindowEventDispatcher::SynthesizeMouseMoveAfterChangeToWindow(
Window* window) {
if (window->IsVisible() &&
window->ContainsPointInRoot(GetLastMouseLocationInRoot())) {
- PostSynthesizeMouseMove();
+ PostSynthesizeMouseMove(ui::EF_NONE);
}
}
-ui::EventDispatchDetails WindowEventDispatcher::SynthesizeMouseMoveEvent() {
+ui::EventDispatchDetails WindowEventDispatcher::SynthesizeMouseMoveEvent(
+ int mouse_button_flags) {
DispatchDetails details;
if (!synthesize_mouse_move_)
return details;
@@ -698,11 +700,12 @@ ui::EventDispatchDetails WindowEventDispatcher::SynthesizeMouseMoveEvent() {
return details;
gfx::Point host_mouse_location = root_mouse_location;
host_->ConvertPointToHost(&host_mouse_location);
- ui::MouseEvent event(ui::ET_MOUSE_MOVED,
- host_mouse_location,
- host_mouse_location,
- ui::EF_IS_SYNTHESIZED,
- 0);
+ ui::MouseEvent event(
+ mouse_button_flags ? ui::ET_MOUSE_DRAGGED : ui::ET_MOUSE_MOVED,
+ host_mouse_location,
+ host_mouse_location,
+ ui::EF_IS_SYNTHESIZED | mouse_button_flags,
+ 0);
return OnEventFromSource(&event);
}
diff --git a/ui/aura/window_event_dispatcher.h b/ui/aura/window_event_dispatcher.h
index 6b476b7651..aeae27c606 100644
--- a/ui/aura/window_event_dispatcher.h
+++ b/ui/aura/window_event_dispatcher.h
@@ -216,11 +216,12 @@ class AURA_EXPORT WindowEventDispatcher : public ui::EventProcessor,
// Posts a task to send synthesized mouse move event if there is no a pending
// task.
- void PostSynthesizeMouseMove();
+ void PostSynthesizeMouseMove(int mouse_button_flags);
// Creates and dispatches synthesized mouse move event using the
// current mouse location.
- ui::EventDispatchDetails SynthesizeMouseMoveEvent() WARN_UNUSED_RESULT;
+ ui::EventDispatchDetails SynthesizeMouseMoveEvent(int mouse_button_flags)
+ WARN_UNUSED_RESULT;
// Calls SynthesizeMouseMove() if |window| is currently visible and contains
// the mouse cursor.
diff --git a/ui/aura/window_event_dispatcher_unittest.cc b/ui/aura/window_event_dispatcher_unittest.cc
index d0985b4398..a7b6d03101 100644
--- a/ui/aura/window_event_dispatcher_unittest.cc
+++ b/ui/aura/window_event_dispatcher_unittest.cc
@@ -289,10 +289,10 @@ TEST_F(WindowEventDispatcherTest, CanProcessEventsWithinSubtree) {
TestEventClient client(root_window());
test::TestWindowDelegate d;
- ui::test::TestEventHandler* nonlock_ef = new ui::test::TestEventHandler;
- ui::test::TestEventHandler* lock_ef = new ui::test::TestEventHandler;
- client.GetNonLockWindow()->SetEventFilter(nonlock_ef);
- client.GetLockWindow()->SetEventFilter(lock_ef);
+ ui::test::TestEventHandler nonlock_ef;
+ ui::test::TestEventHandler lock_ef;
+ client.GetNonLockWindow()->AddPreTargetHandler(&nonlock_ef);
+ client.GetLockWindow()->AddPreTargetHandler(&lock_ef);
Window* w1 = test::CreateTestWindowWithBounds(gfx::Rect(10, 10, 20, 20),
client.GetNonLockWindow());
@@ -328,12 +328,12 @@ TEST_F(WindowEventDispatcherTest, CanProcessEventsWithinSubtree) {
// i.e. never sent to the non-lock container's event filter.
test::EventGenerator generator(root_window(), w1);
generator.ClickLeftButton();
- EXPECT_EQ(0, nonlock_ef->num_mouse_events());
+ EXPECT_EQ(0, nonlock_ef.num_mouse_events());
// Events sent to a window in the lock container will be processed.
test::EventGenerator generator3(root_window(), w3.get());
generator3.PressLeftButton();
- EXPECT_EQ(1, lock_ef->num_mouse_events());
+ EXPECT_EQ(1, lock_ef.num_mouse_events());
}
// Prevent w3 from being deleted by the hierarchy since its delegate is owned
@@ -342,18 +342,18 @@ TEST_F(WindowEventDispatcherTest, CanProcessEventsWithinSubtree) {
}
TEST_F(WindowEventDispatcherTest, IgnoreUnknownKeys) {
- ui::test::TestEventHandler* filter = new ConsumeKeyHandler;
- root_window()->SetEventFilter(filter); // passes ownership
+ ConsumeKeyHandler handler;
+ root_window()->AddPreTargetHandler(&handler);
ui::KeyEvent unknown_event(ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN, 0, false);
DispatchEventUsingWindowDispatcher(&unknown_event);
EXPECT_FALSE(unknown_event.handled());
- EXPECT_EQ(0, filter->num_key_events());
+ EXPECT_EQ(0, handler.num_key_events());
ui::KeyEvent known_event(ui::ET_KEY_PRESSED, ui::VKEY_A, 0, false);
DispatchEventUsingWindowDispatcher(&known_event);
EXPECT_TRUE(known_event.handled());
- EXPECT_EQ(1, filter->num_key_events());
+ EXPECT_EQ(1, handler.num_key_events());
}
TEST_F(WindowEventDispatcherTest, NoDelegateWindowReceivesKeyEvents) {
@@ -374,28 +374,28 @@ TEST_F(WindowEventDispatcherTest, NoDelegateWindowReceivesKeyEvents) {
// Tests that touch-events that are beyond the bounds of the root-window do get
// propagated to the event filters correctly with the root as the target.
TEST_F(WindowEventDispatcherTest, TouchEventsOutsideBounds) {
- ui::test::TestEventHandler* filter = new ui::test::TestEventHandler;
- root_window()->SetEventFilter(filter); // passes ownership
+ ui::test::TestEventHandler handler;
+ root_window()->AddPreTargetHandler(&handler);
gfx::Point position = root_window()->bounds().origin();
position.Offset(-10, -10);
ui::TouchEvent press(ui::ET_TOUCH_PRESSED, position, 0, base::TimeDelta());
DispatchEventUsingWindowDispatcher(&press);
- EXPECT_EQ(1, filter->num_touch_events());
+ EXPECT_EQ(1, handler.num_touch_events());
position = root_window()->bounds().origin();
position.Offset(root_window()->bounds().width() + 10,
root_window()->bounds().height() + 10);
ui::TouchEvent release(ui::ET_TOUCH_RELEASED, position, 0, base::TimeDelta());
DispatchEventUsingWindowDispatcher(&release);
- EXPECT_EQ(2, filter->num_touch_events());
+ EXPECT_EQ(2, handler.num_touch_events());
}
// Tests that scroll events are dispatched correctly.
TEST_F(WindowEventDispatcherTest, ScrollEventDispatch) {
base::TimeDelta now = ui::EventTimeForNow();
- ui::test::TestEventHandler* filter = new ui::test::TestEventHandler;
- root_window()->SetEventFilter(filter);
+ ui::test::TestEventHandler handler;
+ root_window()->AddPreTargetHandler(&handler);
test::TestWindowDelegate delegate;
scoped_ptr<Window> w1(CreateNormalWindow(1, root_window(), &delegate));
@@ -410,7 +410,7 @@ TEST_F(WindowEventDispatcherTest, ScrollEventDispatch) {
0, -10,
2);
DispatchEventUsingWindowDispatcher(&scroll1);
- EXPECT_EQ(1, filter->num_scroll_events());
+ EXPECT_EQ(1, handler.num_scroll_events());
// Scroll event on a window should be dispatched properly.
ui::ScrollEvent scroll2(ui::ET_SCROLL,
@@ -421,7 +421,8 @@ TEST_F(WindowEventDispatcherTest, ScrollEventDispatch) {
-10, 0,
2);
DispatchEventUsingWindowDispatcher(&scroll2);
- EXPECT_EQ(2, filter->num_scroll_events());
+ EXPECT_EQ(2, handler.num_scroll_events());
+ root_window()->RemovePreTargetHandler(&handler);
}
namespace {
@@ -431,6 +432,7 @@ class EventFilterRecorder : public ui::EventHandler {
public:
typedef std::vector<ui::EventType> Events;
typedef std::vector<gfx::Point> EventLocations;
+ typedef std::vector<int> EventFlags;
EventFilterRecorder()
: wait_until_event_(ui::ET_UNKNOWN) {
@@ -441,6 +443,7 @@ class EventFilterRecorder : public ui::EventHandler {
const EventLocations& mouse_locations() const { return mouse_locations_; }
gfx::Point mouse_location(int i) const { return mouse_locations_[i]; }
const EventLocations& touch_locations() const { return touch_locations_; }
+ const EventFlags& mouse_event_flags() const { return mouse_event_flags_; }
void WaitUntilReceivedEvent(ui::EventType type) {
wait_until_event_ = type;
@@ -458,6 +461,7 @@ class EventFilterRecorder : public ui::EventHandler {
events_.clear();
mouse_locations_.clear();
touch_locations_.clear();
+ mouse_event_flags_.clear();
}
// ui::EventHandler overrides:
@@ -472,6 +476,7 @@ class EventFilterRecorder : public ui::EventHandler {
virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
mouse_locations_.push_back(event->location());
+ mouse_event_flags_.push_back(event->flags());
}
virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
@@ -485,6 +490,7 @@ class EventFilterRecorder : public ui::EventHandler {
Events events_;
EventLocations mouse_locations_;
EventLocations touch_locations_;
+ EventFlags mouse_event_flags_;
DISALLOW_COPY_AND_ASSIGN(EventFilterRecorder);
};
@@ -585,10 +591,10 @@ TEST_F(WindowEventDispatcherTest, RepostTargetsCaptureWindow) {
// over |window| and verify |window| gets it (|window| gets it because it has
// capture).
EXPECT_FALSE(Env::GetInstance()->IsMouseButtonDown());
+ EventFilterRecorder recorder;
scoped_ptr<Window> window(CreateNormalWindow(1, root_window(), NULL));
window->SetBounds(gfx::Rect(20, 20, 40, 30));
- EventFilterRecorder* recorder = new EventFilterRecorder;
- window->SetEventFilter(recorder); // Takes ownership.
+ window->AddPreTargetHandler(&recorder);
window->SetCapture();
const ui::MouseEvent press_event(
ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
@@ -596,13 +602,13 @@ TEST_F(WindowEventDispatcherTest, RepostTargetsCaptureWindow) {
host()->dispatcher()->RepostEvent(press_event);
RunAllPendingInMessageLoop(); // Necessitated by RepostEvent().
// Mouse moves/enters may be generated. We only care about a pressed.
- EXPECT_TRUE(EventTypesToString(recorder->events()).find("MOUSE_PRESSED") !=
- std::string::npos) << EventTypesToString(recorder->events());
+ EXPECT_TRUE(EventTypesToString(recorder.events()).find("MOUSE_PRESSED") !=
+ std::string::npos) << EventTypesToString(recorder.events());
}
TEST_F(WindowEventDispatcherTest, MouseMovesHeld) {
- EventFilterRecorder* filter = new EventFilterRecorder;
- root_window()->SetEventFilter(filter); // passes ownership
+ EventFilterRecorder recorder;
+ root_window()->AddPreTargetHandler(&recorder);
test::TestWindowDelegate delegate;
scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
@@ -612,7 +618,7 @@ TEST_F(WindowEventDispatcherTest, MouseMovesHeld) {
gfx::Point(0, 0), 0, 0);
DispatchEventUsingWindowDispatcher(&mouse_move_event);
// Discard MOUSE_ENTER.
- filter->Reset();
+ recorder.Reset();
host()->dispatcher()->HoldPointerMoves();
@@ -620,7 +626,7 @@ TEST_F(WindowEventDispatcherTest, MouseMovesHeld) {
ui::MouseEvent mouse_dragged_event(ui::ET_MOUSE_DRAGGED, gfx::Point(0, 0),
gfx::Point(0, 0), 0, 0);
DispatchEventUsingWindowDispatcher(&mouse_dragged_event);
- EXPECT_TRUE(filter->events().empty());
+ EXPECT_TRUE(recorder.events().empty());
// Check that we do dispatch the held MOUSE_DRAGGED event before another type
// of event.
@@ -628,28 +634,28 @@ TEST_F(WindowEventDispatcherTest, MouseMovesHeld) {
gfx::Point(0, 0), 0, 0);
DispatchEventUsingWindowDispatcher(&mouse_pressed_event);
EXPECT_EQ("MOUSE_DRAGGED MOUSE_PRESSED",
- EventTypesToString(filter->events()));
- filter->Reset();
+ EventTypesToString(recorder.events()));
+ recorder.Reset();
// Check that we coalesce held MOUSE_DRAGGED events.
ui::MouseEvent mouse_dragged_event2(ui::ET_MOUSE_DRAGGED, gfx::Point(10, 10),
gfx::Point(10, 10), 0, 0);
DispatchEventUsingWindowDispatcher(&mouse_dragged_event);
DispatchEventUsingWindowDispatcher(&mouse_dragged_event2);
- EXPECT_TRUE(filter->events().empty());
+ EXPECT_TRUE(recorder.events().empty());
DispatchEventUsingWindowDispatcher(&mouse_pressed_event);
EXPECT_EQ("MOUSE_DRAGGED MOUSE_PRESSED",
- EventTypesToString(filter->events()));
- filter->Reset();
+ EventTypesToString(recorder.events()));
+ recorder.Reset();
// Check that on ReleasePointerMoves, held events are not dispatched
// immediately, but posted instead.
DispatchEventUsingWindowDispatcher(&mouse_dragged_event);
host()->dispatcher()->ReleasePointerMoves();
- EXPECT_TRUE(filter->events().empty());
+ EXPECT_TRUE(recorder.events().empty());
RunAllPendingInMessageLoop();
- EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(filter->events()));
- filter->Reset();
+ EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(recorder.events()));
+ recorder.Reset();
// However if another message comes in before the dispatch of the posted
// event, check that the posted event is dispatched before this new event.
@@ -658,10 +664,10 @@ TEST_F(WindowEventDispatcherTest, MouseMovesHeld) {
host()->dispatcher()->ReleasePointerMoves();
DispatchEventUsingWindowDispatcher(&mouse_pressed_event);
EXPECT_EQ("MOUSE_DRAGGED MOUSE_PRESSED",
- EventTypesToString(filter->events()));
- filter->Reset();
+ EventTypesToString(recorder.events()));
+ recorder.Reset();
RunAllPendingInMessageLoop();
- EXPECT_TRUE(filter->events().empty());
+ EXPECT_TRUE(recorder.events().empty());
// Check that if the other message is another MOUSE_DRAGGED, we still coalesce
// them.
@@ -669,10 +675,10 @@ TEST_F(WindowEventDispatcherTest, MouseMovesHeld) {
DispatchEventUsingWindowDispatcher(&mouse_dragged_event);
host()->dispatcher()->ReleasePointerMoves();
DispatchEventUsingWindowDispatcher(&mouse_dragged_event2);
- EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(filter->events()));
- filter->Reset();
+ EXPECT_EQ("MOUSE_DRAGGED", EventTypesToString(recorder.events()));
+ recorder.Reset();
RunAllPendingInMessageLoop();
- EXPECT_TRUE(filter->events().empty());
+ EXPECT_TRUE(recorder.events().empty());
// Check that synthetic mouse move event has a right location when issued
// while holding pointer moves.
@@ -684,17 +690,18 @@ TEST_F(WindowEventDispatcherTest, MouseMovesHeld) {
window->SetBounds(gfx::Rect(15, 15, 80, 80));
DispatchEventUsingWindowDispatcher(&mouse_dragged_event3);
RunAllPendingInMessageLoop();
- EXPECT_TRUE(filter->events().empty());
+ EXPECT_TRUE(recorder.events().empty());
host()->dispatcher()->ReleasePointerMoves();
RunAllPendingInMessageLoop();
- EXPECT_EQ("MOUSE_MOVED", EventTypesToString(filter->events()));
- EXPECT_EQ(gfx::Point(13, 13), filter->mouse_location(0));
- filter->Reset();
+ EXPECT_EQ("MOUSE_MOVED", EventTypesToString(recorder.events()));
+ EXPECT_EQ(gfx::Point(13, 13), recorder.mouse_location(0));
+ recorder.Reset();
+ root_window()->RemovePreTargetHandler(&recorder);
}
TEST_F(WindowEventDispatcherTest, TouchMovesHeld) {
- EventFilterRecorder* filter = new EventFilterRecorder;
- root_window()->SetEventFilter(filter); // passes ownership
+ EventFilterRecorder recorder;
+ root_window()->AddPreTargetHandler(&recorder);
test::TestWindowDelegate delegate;
scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
@@ -707,8 +714,8 @@ TEST_F(WindowEventDispatcherTest, TouchMovesHeld) {
ui::TouchEvent touch_pressed_event(ui::ET_TOUCH_PRESSED, touch_location,
0, base::TimeDelta());
DispatchEventUsingWindowDispatcher(&touch_pressed_event);
- filter->WaitUntilReceivedEvent(ui::ET_GESTURE_SHOW_PRESS);
- filter->Reset();
+ recorder.WaitUntilReceivedEvent(ui::ET_GESTURE_SHOW_PRESS);
+ recorder.Reset();
host()->dispatcher()->HoldPointerMoves();
@@ -716,32 +723,32 @@ TEST_F(WindowEventDispatcherTest, TouchMovesHeld) {
ui::TouchEvent touch_moved_event(ui::ET_TOUCH_MOVED, touch_location,
0, base::TimeDelta());
DispatchEventUsingWindowDispatcher(&touch_moved_event);
- EXPECT_TRUE(filter->events().empty());
+ EXPECT_TRUE(recorder.events().empty());
// Check that on ReleasePointerMoves, held events are not dispatched
// immediately, but posted instead.
DispatchEventUsingWindowDispatcher(&touch_moved_event);
host()->dispatcher()->ReleasePointerMoves();
- EXPECT_TRUE(filter->events().empty());
+ EXPECT_TRUE(recorder.events().empty());
RunAllPendingInMessageLoop();
- EXPECT_EQ("TOUCH_MOVED", EventTypesToString(filter->events()));
- filter->Reset();
+ EXPECT_EQ("TOUCH_MOVED", EventTypesToString(recorder.events()));
+ recorder.Reset();
// If another touch event occurs then the held touch should be dispatched
// immediately before it.
ui::TouchEvent touch_released_event(ui::ET_TOUCH_RELEASED, touch_location,
0, base::TimeDelta());
- filter->Reset();
+ recorder.Reset();
host()->dispatcher()->HoldPointerMoves();
DispatchEventUsingWindowDispatcher(&touch_moved_event);
DispatchEventUsingWindowDispatcher(&touch_released_event);
EXPECT_EQ("TOUCH_MOVED TOUCH_RELEASED GESTURE_TAP_CANCEL GESTURE_END",
- EventTypesToString(filter->events()));
- filter->Reset();
+ EventTypesToString(recorder.events()));
+ recorder.Reset();
host()->dispatcher()->ReleasePointerMoves();
RunAllPendingInMessageLoop();
- EXPECT_TRUE(filter->events().empty());
+ EXPECT_TRUE(recorder.events().empty());
}
class HoldPointerOnScrollHandler : public ui::test::TestEventHandler {
@@ -777,10 +784,10 @@ class HoldPointerOnScrollHandler : public ui::test::TestEventHandler {
// Tests that touch-move events don't contribute to an in-progress scroll
// gesture if touch-move events are being held by the dispatcher.
TEST_F(WindowEventDispatcherTest, TouchMovesHeldOnScroll) {
- EventFilterRecorder* filter = new EventFilterRecorder;
- root_window()->SetEventFilter(filter);
+ EventFilterRecorder recorder;
+ root_window()->AddPreTargetHandler(&recorder);
test::TestWindowDelegate delegate;
- HoldPointerOnScrollHandler handler(host()->dispatcher(), filter);
+ HoldPointerOnScrollHandler handler(host()->dispatcher(), &recorder);
scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
&delegate, 1, gfx::Rect(50, 50, 100, 100), root_window()));
window->AddPreTargetHandler(&handler);
@@ -795,21 +802,21 @@ TEST_F(WindowEventDispatcherTest, TouchMovesHeldOnScroll) {
// touch-release), the held touch-move event will have been dispatched first,
// along with the subsequent events (i.e. touch-release, scroll-end, and
// gesture-end).
- const EventFilterRecorder::Events& events = filter->events();
+ const EventFilterRecorder::Events& events = recorder.events();
EXPECT_EQ("TOUCH_MOVED TOUCH_RELEASED GESTURE_SCROLL_END GESTURE_END",
EventTypesToString(events));
- ASSERT_EQ(2u, filter->touch_locations().size());
+ ASSERT_EQ(2u, recorder.touch_locations().size());
EXPECT_EQ(gfx::Point(-40, 10).ToString(),
- filter->touch_locations()[0].ToString());
+ recorder.touch_locations()[0].ToString());
EXPECT_EQ(gfx::Point(-40, 10).ToString(),
- filter->touch_locations()[1].ToString());
+ recorder.touch_locations()[1].ToString());
}
// Tests that synthetic mouse events are ignored when mouse
// events are disabled.
TEST_F(WindowEventDispatcherTest, DispatchSyntheticMouseEvents) {
- EventFilterRecorder* filter = new EventFilterRecorder;
- root_window()->SetEventFilter(filter); // passes ownership
+ EventFilterRecorder recorder;
+ root_window()->AddPreTargetHandler(&recorder);
test::TestWindowDelegate delegate;
scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
@@ -823,27 +830,113 @@ TEST_F(WindowEventDispatcherTest, DispatchSyntheticMouseEvents) {
ui::MouseEvent mouse1(ui::ET_MOUSE_MOVED, gfx::Point(10, 10),
gfx::Point(10, 10), 0, 0);
DispatchEventUsingWindowDispatcher(&mouse1);
- EXPECT_FALSE(filter->events().empty());
- filter->Reset();
+ EXPECT_FALSE(recorder.events().empty());
+ recorder.Reset();
// Dispatch a synthetic mouse event when mouse events are enabled.
ui::MouseEvent mouse2(ui::ET_MOUSE_MOVED, gfx::Point(10, 10),
gfx::Point(10, 10), ui::EF_IS_SYNTHESIZED, 0);
DispatchEventUsingWindowDispatcher(&mouse2);
- EXPECT_FALSE(filter->events().empty());
- filter->Reset();
+ EXPECT_FALSE(recorder.events().empty());
+ recorder.Reset();
// Dispatch a synthetic mouse event when mouse events are disabled.
cursor_client.DisableMouseEvents();
DispatchEventUsingWindowDispatcher(&mouse2);
- EXPECT_TRUE(filter->events().empty());
+ EXPECT_TRUE(recorder.events().empty());
+ root_window()->RemovePreTargetHandler(&recorder);
+}
+
+// Tests synthetic mouse events generated when window bounds changes such that
+// the cursor previously outside the window becomes inside, or vice versa.
+// - Synthesize MOVED events when the mouse button is up;
+// - Synthesize DRAGGED events with correct flags when mouse button is down;
+// - Do not synthesize events if the window ignores events or is invisible.
+TEST_F(WindowEventDispatcherTest, SynthesizeMouseEventsOnWindowBoundsChanged) {
+ test::TestWindowDelegate delegate;
+ scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
+ &delegate, 1234, gfx::Rect(5, 5, 100, 100), root_window()));
+ window->Show();
+ window->SetCapture();
+
+ EventFilterRecorder recorder;
+ window->AddPreTargetHandler(&recorder);
+
+ // Dispatch a non-synthetic mouse event to place cursor inside window bounds.
+ ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(10, 10),
+ gfx::Point(10, 10), 0, 0);
+ DispatchEventUsingWindowDispatcher(&mouse);
+ EXPECT_FALSE(recorder.events().empty());
+ recorder.Reset();
+
+ // Update the window bounds so that cursor is now outside the window.
+ // This should trigger a synthetic MOVED event.
+ gfx::Rect bounds1(20, 20, 100, 100);
+ window->SetBounds(bounds1);
+ RunAllPendingInMessageLoop();
+ ASSERT_FALSE(recorder.events().empty());
+ ASSERT_FALSE(recorder.mouse_event_flags().empty());
+ EXPECT_EQ(ui::ET_MOUSE_MOVED, recorder.events().back());
+ EXPECT_EQ(ui::EF_IS_SYNTHESIZED, recorder.mouse_event_flags().back());
+ recorder.Reset();
+
+ // Hold down the LEFT mouse button.
+ Env::GetInstance()->set_mouse_button_flags(ui::EF_LEFT_MOUSE_BUTTON);
+
+ // Update the window bounds so that cursor is back inside the window.
+ // This should trigger a synthetic DRAGGED event with the left button flag.
+ gfx::Rect bounds2(5, 5, 100, 100);
+ window->SetBounds(bounds2);
+ RunAllPendingInMessageLoop();
+ ASSERT_FALSE(recorder.events().empty());
+ ASSERT_FALSE(recorder.mouse_event_flags().empty());
+ EXPECT_EQ(ui::ET_MOUSE_DRAGGED, recorder.events().back());
+ EXPECT_EQ(ui::EF_IS_SYNTHESIZED | ui::EF_LEFT_MOUSE_BUTTON,
+ recorder.mouse_event_flags().back());
+ recorder.Reset();
+
+ // Hold down the RIGHT mouse button.
+ Env::GetInstance()->set_mouse_button_flags(ui::EF_RIGHT_MOUSE_BUTTON);
+
+ // Update the window bounds so that cursor is outside the window.
+ // This should trigger a synthetic DRAGGED event with the right button flag.
+ window->SetBounds(bounds1);
+ RunAllPendingInMessageLoop();
+ ASSERT_FALSE(recorder.events().empty());
+ ASSERT_FALSE(recorder.mouse_event_flags().empty());
+ EXPECT_EQ(ui::ET_MOUSE_DRAGGED, recorder.events().back());
+ EXPECT_EQ(ui::EF_IS_SYNTHESIZED | ui::EF_RIGHT_MOUSE_BUTTON,
+ recorder.mouse_event_flags().back());
+ recorder.Reset();
+
+ // Release mouse button and set window to ignore events.
+ Env::GetInstance()->set_mouse_button_flags(0);
+ window->set_ignore_events(true);
+
+ // Update the window bounds so that cursor is back inside the window.
+ // This should not trigger a synthetic event.
+ window->SetBounds(bounds2);
+ RunAllPendingInMessageLoop();
+ EXPECT_TRUE(recorder.events().empty());
+ recorder.Reset();
+
+ // Set window to accept events but invisible.
+ window->set_ignore_events(false);
+ window->Hide();
+ recorder.Reset();
+
+ // Update the window bounds so that cursor is outside the window.
+ // This should not trigger a synthetic event.
+ window->SetBounds(bounds1);
+ RunAllPendingInMessageLoop();
+ EXPECT_TRUE(recorder.events().empty());
}
// Tests that a mouse exit is dispatched to the last known cursor location
// when the cursor becomes invisible.
TEST_F(WindowEventDispatcherTest, DispatchMouseExitWhenCursorHidden) {
- EventFilterRecorder* filter = new EventFilterRecorder;
- root_window()->SetEventFilter(filter); // passes ownership
+ EventFilterRecorder recorder;
+ root_window()->AddPreTargetHandler(&recorder);
test::TestWindowDelegate delegate;
gfx::Point window_origin(7, 18);
@@ -856,30 +949,31 @@ TEST_F(WindowEventDispatcherTest, DispatchMouseExitWhenCursorHidden) {
gfx::Point mouse_location(gfx::Point(15, 25));
ui::MouseEvent mouse1(ui::ET_MOUSE_MOVED, mouse_location,
mouse_location, 0, 0);
- EXPECT_TRUE(filter->events().empty());
+ EXPECT_TRUE(recorder.events().empty());
DispatchEventUsingWindowDispatcher(&mouse1);
- EXPECT_FALSE(filter->events().empty());
- filter->Reset();
+ EXPECT_FALSE(recorder.events().empty());
+ recorder.Reset();
// Hide the cursor and verify a mouse exit was dispatched.
host()->OnCursorVisibilityChanged(false);
- EXPECT_FALSE(filter->events().empty());
- EXPECT_EQ("MOUSE_EXITED", EventTypesToString(filter->events()));
+ EXPECT_FALSE(recorder.events().empty());
+ EXPECT_EQ("MOUSE_EXITED", EventTypesToString(recorder.events()));
// Verify the mouse exit was dispatched at the correct location
// (in the correct coordinate space).
int translated_x = mouse_location.x() - window_origin.x();
int translated_y = mouse_location.y() - window_origin.y();
gfx::Point translated_point(translated_x, translated_y);
- EXPECT_EQ(filter->mouse_location(0).ToString(), translated_point.ToString());
+ EXPECT_EQ(recorder.mouse_location(0).ToString(), translated_point.ToString());
+ root_window()->RemovePreTargetHandler(&recorder);
}
// Tests that a synthetic mouse exit is dispatched to the last known cursor
// location after mouse events are disabled on the cursor client.
TEST_F(WindowEventDispatcherTest,
DispatchSyntheticMouseExitAfterMouseEventsDisabled) {
- EventFilterRecorder* filter = new EventFilterRecorder;
- root_window()->SetEventFilter(filter); // passes ownership
+ EventFilterRecorder recorder;
+ root_window()->AddPreTargetHandler(&recorder);
test::TestWindowDelegate delegate;
gfx::Point window_origin(7, 18);
@@ -892,10 +986,10 @@ TEST_F(WindowEventDispatcherTest,
gfx::Point mouse_location(gfx::Point(15, 25));
ui::MouseEvent mouse1(ui::ET_MOUSE_MOVED, mouse_location,
mouse_location, 0, 0);
- EXPECT_TRUE(filter->events().empty());
+ EXPECT_TRUE(recorder.events().empty());
DispatchEventUsingWindowDispatcher(&mouse1);
- EXPECT_FALSE(filter->events().empty());
- filter->Reset();
+ EXPECT_FALSE(recorder.events().empty());
+ recorder.Reset();
test::TestCursorClient cursor_client(root_window());
cursor_client.DisableMouseEvents();
@@ -905,17 +999,18 @@ TEST_F(WindowEventDispatcherTest,
gfx::Point(150, 150), ui::EF_IS_SYNTHESIZED, 0);
DispatchEventUsingWindowDispatcher(&mouse2);
- EXPECT_FALSE(filter->events().empty());
+ EXPECT_FALSE(recorder.events().empty());
// We get the mouse exited event twice in our filter. Once during the
// predispatch phase and during the actual dispatch.
- EXPECT_EQ("MOUSE_EXITED MOUSE_EXITED", EventTypesToString(filter->events()));
+ EXPECT_EQ("MOUSE_EXITED MOUSE_EXITED", EventTypesToString(recorder.events()));
// Verify the mouse exit was dispatched at the correct location
// (in the correct coordinate space).
int translated_x = mouse_exit_location.x() - window_origin.x();
int translated_y = mouse_exit_location.y() - window_origin.y();
gfx::Point translated_point(translated_x, translated_y);
- EXPECT_EQ(filter->mouse_location(0).ToString(), translated_point.ToString());
+ EXPECT_EQ(recorder.mouse_location(0).ToString(), translated_point.ToString());
+ root_window()->RemovePreTargetHandler(&recorder);
}
class DeletingEventFilter : public ui::EventHandler {
@@ -989,8 +1084,8 @@ TEST_F(WindowEventDispatcherTest, DeleteWindowDuringDispatch) {
DeletingWindowDelegate d11;
Window* w11 = CreateNormalWindow(11, w1.get(), &d11);
WindowTracker tracker;
- DeletingEventFilter* w1_filter = new DeletingEventFilter;
- w1->SetEventFilter(w1_filter);
+ DeletingEventFilter w1_filter;
+ w1->AddPreTargetHandler(&w1_filter);
client::GetFocusClient(w1.get())->FocusWindow(w11);
test::EventGenerator generator(root_window(), w11);
@@ -1005,7 +1100,7 @@ TEST_F(WindowEventDispatcherTest, DeleteWindowDuringDispatch) {
generator.ReleaseLeftButton();
// Delegate deletes w11. This will prevent the post-handle step from applying.
- w1_filter->Reset(false);
+ w1_filter.Reset(false);
d11.Reset(w11, true);
generator.PressKey(ui::VKEY_A, 0);
EXPECT_FALSE(tracker.Contains(w11));
@@ -1014,7 +1109,7 @@ TEST_F(WindowEventDispatcherTest, DeleteWindowDuringDispatch) {
// Pre-handle step deletes w11. This will prevent the delegate and the post-
// handle steps from applying.
w11 = CreateNormalWindow(11, w1.get(), &d11);
- w1_filter->Reset(true);
+ w1_filter.Reset(true);
d11.Reset(w11, false);
generator.PressLeftButton();
EXPECT_FALSE(tracker.Contains(w11));
@@ -1124,8 +1219,8 @@ TEST_F(WindowEventDispatcherTest, GestureEndDeliveredAfterNestedGestures) {
// Tests whether we can repost the Tap down gesture event.
TEST_F(WindowEventDispatcherTest, RepostTapdownGestureTest) {
- EventFilterRecorder* filter = new EventFilterRecorder;
- root_window()->SetEventFilter(filter); // passes ownership
+ EventFilterRecorder recorder;
+ root_window()->AddPreTargetHandler(&recorder);
test::TestWindowDelegate delegate;
scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
@@ -1144,9 +1239,10 @@ TEST_F(WindowEventDispatcherTest, RepostTapdownGestureTest) {
host()->dispatcher()->RepostEvent(event);
RunAllPendingInMessageLoop();
// TODO(rbyers): Currently disabled - crbug.com/170987
- EXPECT_FALSE(EventTypesToString(filter->events()).find("GESTURE_TAP_DOWN") !=
+ EXPECT_FALSE(EventTypesToString(recorder.events()).find("GESTURE_TAP_DOWN") !=
std::string::npos);
- filter->Reset();
+ recorder.Reset();
+ root_window()->RemovePreTargetHandler(&recorder);
}
// This class inherits from the EventFilterRecorder class which provides a
@@ -1227,9 +1323,9 @@ TEST_F(WindowEventDispatcherTest, GestureRepostEventOrder) {
scoped_ptr<aura::Window> repost_source(CreateTestWindowWithDelegate(
&delegate, 1, gfx::Rect(0, 0, 50, 50), root_window()));
- RepostGestureEventRecorder* repost_event_recorder =
- new RepostGestureEventRecorder(repost_source.get(), repost_target.get());
- root_window()->SetEventFilter(repost_event_recorder); // passes ownership
+ RepostGestureEventRecorder repost_event_recorder(repost_source.get(),
+ repost_target.get());
+ root_window()->AddPreTargetHandler(&repost_event_recorder);
// Generate a tap down gesture for the repost_source. This will be reposted
// to repost_target.
@@ -1246,8 +1342,8 @@ TEST_F(WindowEventDispatcherTest, GestureRepostEventOrder) {
RunAllPendingInMessageLoop();
int tap_down_count = 0;
- for (size_t i = 0; i < repost_event_recorder->events().size(); ++i) {
- if (repost_event_recorder->events()[i] == ui::ET_GESTURE_TAP_DOWN)
+ for (size_t i = 0; i < repost_event_recorder.events().size(); ++i) {
+ if (repost_event_recorder.events()[i] == ui::ET_GESTURE_TAP_DOWN)
++tap_down_count;
}
@@ -1257,7 +1353,8 @@ TEST_F(WindowEventDispatcherTest, GestureRepostEventOrder) {
EXPECT_EQ(1, tap_down_count);
EXPECT_EQ(kExpectedTargetEvents,
- EventTypesToString(repost_event_recorder->events()));
+ EventTypesToString(repost_event_recorder.events()));
+ root_window()->RemovePreTargetHandler(&repost_event_recorder);
}
class OnMouseExitDeletingEventFilter : public EventFilterRecorder {
@@ -1291,9 +1388,8 @@ TEST_F(WindowEventDispatcherTest, DeleteWindowDuringMouseMovedDispatch) {
// Create window 1 and set its event filter. Window 1 will take ownership of
// the event filter.
scoped_ptr<Window> w1(CreateNormalWindow(1, root_window(), NULL));
- OnMouseExitDeletingEventFilter* w1_filter =
- new OnMouseExitDeletingEventFilter();
- w1->SetEventFilter(w1_filter);
+ OnMouseExitDeletingEventFilter w1_filter;
+ w1->AddPreTargetHandler(&w1_filter);
w1->SetBounds(gfx::Rect(20, 20, 60, 60));
EXPECT_EQ(NULL, host()->dispatcher()->mouse_moved_handler());
@@ -1311,7 +1407,7 @@ TEST_F(WindowEventDispatcherTest, DeleteWindowDuringMouseMovedDispatch) {
// Set window 2 as the window that is to be deleted when a mouse-exited event
// happens on window 1.
- w1_filter->set_window_to_delete(w2);
+ w1_filter.set_window_to_delete(w2);
// Move mosue over window 2. This should generate a mouse-exited event for
// window 1 resulting in deletion of window 2. The original mouse-moved event
@@ -1322,7 +1418,7 @@ TEST_F(WindowEventDispatcherTest, DeleteWindowDuringMouseMovedDispatch) {
// Check events received by window 1.
EXPECT_EQ("MOUSE_ENTERED MOUSE_MOVED MOUSE_EXITED",
- EventTypesToString(w1_filter->events()));
+ EventTypesToString(w1_filter.events()));
}
namespace {
@@ -1485,8 +1581,8 @@ TEST_F(WindowEventDispatcherTest, DeleteHostFromHeldMouseEvent) {
}
TEST_F(WindowEventDispatcherTest, WindowHideCancelsActiveTouches) {
- EventFilterRecorder* filter = new EventFilterRecorder;
- root_window()->SetEventFilter(filter); // passes ownership
+ EventFilterRecorder recorder;
+ root_window()->AddPreTargetHandler(&recorder);
test::TestWindowDelegate delegate;
scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
@@ -1497,17 +1593,18 @@ TEST_F(WindowEventDispatcherTest, WindowHideCancelsActiveTouches) {
DispatchEventUsingWindowDispatcher(&press);
EXPECT_EQ("TOUCH_PRESSED GESTURE_BEGIN GESTURE_TAP_DOWN",
- EventTypesToString(filter->GetAndResetEvents()));
+ EventTypesToString(recorder.GetAndResetEvents()));
window->Hide();
EXPECT_EQ("TOUCH_CANCELLED GESTURE_TAP_CANCEL GESTURE_END",
- EventTypesToString(filter->events()));
+ EventTypesToString(recorder.events()));
+ root_window()->RemovePreTargetHandler(&recorder);
}
TEST_F(WindowEventDispatcherTest, WindowHideCancelsActiveGestures) {
- EventFilterRecorder* filter = new EventFilterRecorder;
- root_window()->SetEventFilter(filter); // passes ownership
+ EventFilterRecorder recorder;
+ root_window()->AddPreTargetHandler(&recorder);
test::TestWindowDelegate delegate;
scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
@@ -1527,29 +1624,30 @@ TEST_F(WindowEventDispatcherTest, WindowHideCancelsActiveGestures) {
EXPECT_EQ("TOUCH_PRESSED GESTURE_BEGIN GESTURE_TAP_DOWN TOUCH_MOVED "
"GESTURE_TAP_CANCEL GESTURE_SCROLL_BEGIN GESTURE_SCROLL_UPDATE "
"TOUCH_PRESSED GESTURE_BEGIN GESTURE_PINCH_BEGIN",
- EventTypesToString(filter->GetAndResetEvents()));
+ EventTypesToString(recorder.GetAndResetEvents()));
window->Hide();
EXPECT_EQ("TOUCH_CANCELLED GESTURE_PINCH_END GESTURE_END TOUCH_CANCELLED "
"GESTURE_SCROLL_END GESTURE_END",
- EventTypesToString(filter->events()));
+ EventTypesToString(recorder.events()));
+ root_window()->RemovePreTargetHandler(&recorder);
}
// Places two windows side by side. Presses down on one window, and starts a
// scroll. Sets capture on the other window and ensures that the "ending" events
// aren't sent to the window which gained capture.
TEST_F(WindowEventDispatcherTest, EndingEventDoesntRetarget) {
+ EventFilterRecorder recorder1;
+ EventFilterRecorder recorder2;
scoped_ptr<Window> window1(CreateNormalWindow(1, root_window(), NULL));
window1->SetBounds(gfx::Rect(0, 0, 40, 40));
scoped_ptr<Window> window2(CreateNormalWindow(2, root_window(), NULL));
window2->SetBounds(gfx::Rect(40, 0, 40, 40));
- EventFilterRecorder* filter1 = new EventFilterRecorder();
- window1->SetEventFilter(filter1); // passes ownership
- EventFilterRecorder* filter2 = new EventFilterRecorder();
- window2->SetEventFilter(filter2); // passes ownership
+ window1->AddPreTargetHandler(&recorder1);
+ window2->AddPreTargetHandler(&recorder2);
gfx::Point position = window1->bounds().origin();
ui::TouchEvent press(ui::ET_TOUCH_PRESSED, position, 0, base::TimeDelta());
@@ -1564,9 +1662,9 @@ TEST_F(WindowEventDispatcherTest, EndingEventDoesntRetarget) {
EXPECT_EQ("TOUCH_PRESSED GESTURE_BEGIN GESTURE_TAP_DOWN TOUCH_MOVED "
"GESTURE_TAP_CANCEL GESTURE_SCROLL_BEGIN GESTURE_SCROLL_UPDATE "
"TOUCH_CANCELLED GESTURE_SCROLL_END GESTURE_END",
- EventTypesToString(filter1->events()));
+ EventTypesToString(recorder1.events()));
- EXPECT_TRUE(filter2->events().empty());
+ EXPECT_TRUE(recorder2.events().empty());
}
namespace {
@@ -1763,10 +1861,10 @@ TEST_F(WindowEventDispatcherTestInHighDPI, EventLocationTransform) {
}
TEST_F(WindowEventDispatcherTestInHighDPI, TouchMovesHeldOnScroll) {
- EventFilterRecorder* filter = new EventFilterRecorder;
- root_window()->SetEventFilter(filter);
+ EventFilterRecorder recorder;
+ root_window()->AddPreTargetHandler(&recorder);
test::TestWindowDelegate delegate;
- HoldPointerOnScrollHandler handler(host()->dispatcher(), filter);
+ HoldPointerOnScrollHandler handler(host()->dispatcher(), &recorder);
scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
&delegate, 1, gfx::Rect(50, 50, 100, 100), root_window()));
window->AddPreTargetHandler(&handler);
@@ -1781,14 +1879,14 @@ TEST_F(WindowEventDispatcherTestInHighDPI, TouchMovesHeldOnScroll) {
// touch-release), the held touch-move event will have been dispatched first,
// along with the subsequent events (i.e. touch-release, scroll-end, and
// gesture-end).
- const EventFilterRecorder::Events& events = filter->events();
+ const EventFilterRecorder::Events& events = recorder.events();
EXPECT_EQ("TOUCH_MOVED TOUCH_RELEASED GESTURE_SCROLL_END GESTURE_END",
EventTypesToString(events));
- ASSERT_EQ(2u, filter->touch_locations().size());
+ ASSERT_EQ(2u, recorder.touch_locations().size());
EXPECT_EQ(gfx::Point(-40, 10).ToString(),
- filter->touch_locations()[0].ToString());
+ recorder.touch_locations()[0].ToString());
EXPECT_EQ(gfx::Point(-40, 10).ToString(),
- filter->touch_locations()[1].ToString());
+ recorder.touch_locations()[1].ToString());
}
class SelfDestructDelegate : public test::TestWindowDelegate {
diff --git a/ui/aura/window_tree_host.cc b/ui/aura/window_tree_host.cc
index a88d9a0102..8b1ad4e1a0 100644
--- a/ui/aura/window_tree_host.cc
+++ b/ui/aura/window_tree_host.cc
@@ -109,7 +109,7 @@ gfx::Transform WindowTreeHost::GetInverseRootTransform() const {
void WindowTreeHost::UpdateRootWindowSize(const gfx::Size& host_size) {
gfx::Rect bounds(host_size);
gfx::RectF new_bounds(ui::ConvertRectToDIP(window()->layer(), bounds));
- GetRootTransform().TransformRect(&new_bounds);
+ window()->layer()->transform().TransformRect(&new_bounds);
window()->SetBounds(gfx::Rect(gfx::ToFlooredSize(new_bounds.size())));
}
diff --git a/ui/aura/window_tree_host_x11.cc b/ui/aura/window_tree_host_x11.cc
index 22b0bfeed2..6fa75e7a52 100644
--- a/ui/aura/window_tree_host_x11.cc
+++ b/ui/aura/window_tree_host_x11.cc
@@ -298,6 +298,7 @@ uint32_t WindowTreeHostX11::DispatchEvent(const ui::PlatformEvent& event) {
False,
SubstructureRedirectMask | SubstructureNotifyMask,
&reply_event);
+ XFlush(xdisplay_);
}
break;
}
@@ -488,6 +489,7 @@ void WindowTreeHostX11::PostNativeEvent(
break;
}
XSendEvent(xdisplay_, xwindow_, False, 0, &xevent);
+ XFlush(xdisplay_);
}
void WindowTreeHostX11::OnDeviceScaleFactorChanged(
diff --git a/ui/aura/window_unittest.cc b/ui/aura/window_unittest.cc
index be2257c253..bdd4f73dd6 100644
--- a/ui/aura/window_unittest.cc
+++ b/ui/aura/window_unittest.cc
@@ -1947,8 +1947,8 @@ TEST_F(WindowTest, AcquireThenRecreateLayer) {
scoped_ptr<Window> w(
CreateTestWindow(SK_ColorWHITE, 1, gfx::Rect(0, 0, 100, 100),
root_window()));
- scoped_ptr<ui::Layer>acquired_layer(w->AcquireLayer());
- scoped_ptr<ui::Layer>doubly_acquired_layer(w->RecreateLayer());
+ scoped_ptr<ui::Layer> acquired_layer(w->AcquireLayer());
+ scoped_ptr<ui::Layer> doubly_acquired_layer(w->RecreateLayer());
EXPECT_EQ(NULL, doubly_acquired_layer.get());
// Destroy window before layer gets destroyed.
@@ -2206,6 +2206,57 @@ TEST_F(WindowTest, RootWindowAttachment) {
EXPECT_EQ(2, observer.removed_count());
}
+class BoundsChangedWindowObserver : public WindowObserver {
+ public:
+ BoundsChangedWindowObserver() : root_set_(false) {}
+
+ virtual void OnWindowBoundsChanged(Window* window,
+ const gfx::Rect& old_bounds,
+ const gfx::Rect& new_bounds) OVERRIDE {
+ root_set_ = window->GetRootWindow() != NULL;
+ }
+
+ bool root_set() const { return root_set_; }
+
+ private:
+ bool root_set_;
+
+ DISALLOW_COPY_AND_ASSIGN(BoundsChangedWindowObserver);
+};
+
+TEST_F(WindowTest, RootWindowSetWhenReparenting) {
+ Window parent1(NULL);
+ parent1.Init(aura::WINDOW_LAYER_NOT_DRAWN);
+ Window parent2(NULL);
+ parent2.Init(aura::WINDOW_LAYER_NOT_DRAWN);
+ ParentWindow(&parent1);
+ ParentWindow(&parent2);
+ parent1.SetBounds(gfx::Rect(10, 10, 300, 300));
+ parent2.SetBounds(gfx::Rect(20, 20, 300, 300));
+
+ Window child(NULL);
+ child.Init(aura::WINDOW_LAYER_NOT_DRAWN);
+ child.SetBounds(gfx::Rect(5, 5, 100, 100));
+ parent1.AddChild(&child);
+
+ // We need animations to start in order to observe the bounds changes.
+ ui::ScopedAnimationDurationScaleMode animation_duration_mode(
+ ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
+ ui::ScopedLayerAnimationSettings settings1(child.layer()->GetAnimator());
+ settings1.SetTransitionDuration(base::TimeDelta::FromMilliseconds(100));
+ child.SetBounds(gfx::Rect(35, 35, 100, 100));
+
+ BoundsChangedWindowObserver observer;
+ child.AddObserver(&observer);
+
+ // Reparenting the |child| will cause it to get moved. During this move
+ // the window should still have root window set.
+ parent2.AddChild(&child);
+ EXPECT_TRUE(observer.root_set());
+
+ // TODO(varkha): Check that the target bounds didn't change after reparenting.
+}
+
TEST_F(WindowTest, OwnedByParentFalse) {
// By default, a window is owned by its parent. If this is set to false, the
// window will not be destroyed when its parent is.
diff --git a/ui/base/android/view_android.cc b/ui/base/android/view_android.cc
index ffb510f672..30e4316440 100644
--- a/ui/base/android/view_android.cc
+++ b/ui/base/android/view_android.cc
@@ -5,7 +5,7 @@
#include "ui/base/android/view_android.h"
#include "base/android/jni_android.h"
-#include "base/android/jni_helper.h"
+#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "jni/ViewAndroid_jni.h"
#include "ui/base/android/window_android.h"
diff --git a/ui/base/android/view_android.h b/ui/base/android/view_android.h
index fbaabc72d4..0205fdf141 100644
--- a/ui/base/android/view_android.h
+++ b/ui/base/android/view_android.h
@@ -6,7 +6,7 @@
#define UI_BASE_ANDROID_VIEW_ANDROID_H_
#include <jni.h>
-#include "base/android/jni_helper.h"
+#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "ui/base/ui_base_export.h"
diff --git a/ui/base/android/window_android.cc b/ui/base/android/window_android.cc
index 75389c9d55..b7a7e133c0 100644
--- a/ui/base/android/window_android.cc
+++ b/ui/base/android/window_android.cc
@@ -6,7 +6,7 @@
#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
-#include "base/android/jni_helper.h"
+#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "jni/WindowAndroid_jni.h"
#include "ui/base/android/window_android_compositor.h"
diff --git a/ui/base/android/window_android.h b/ui/base/android/window_android.h
index 2563679397..842bc4c886 100644
--- a/ui/base/android/window_android.h
+++ b/ui/base/android/window_android.h
@@ -7,7 +7,7 @@
#include <jni.h>
#include <vector>
-#include "base/android/jni_helper.h"
+#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "base/observer_list.h"
#include "ui/base/ui_base_export.h"
diff --git a/ui/base/cursor/cursor_loader.h b/ui/base/cursor/cursor_loader.h
index 8526e29d3e..d4a0c3d2da 100644
--- a/ui/base/cursor/cursor_loader.h
+++ b/ui/base/cursor/cursor_loader.h
@@ -16,17 +16,15 @@ namespace ui {
class UI_BASE_EXPORT CursorLoader {
public:
- CursorLoader() : scale_(1.f) {}
+ CursorLoader() : scale_(1.f), rotation_(gfx::Display::ROTATE_0) {}
virtual ~CursorLoader() {}
- // Returns the display the loader loads images for.
- const gfx::Display& display() const {
- return display_;
+ gfx::Display::Rotation rotation() const {
+ return rotation_;
}
- // Sets the display the loader loads images for.
- void set_display(const gfx::Display& display) {
- display_ = display;
+ void set_rotation(gfx::Display::Rotation rotation) {
+ rotation_ = rotation;
}
// Returns the current scale of the mouse cursor icon.
@@ -64,12 +62,12 @@ class UI_BASE_EXPORT CursorLoader {
static CursorLoader* Create();
private:
- // The display the loader loads images for.
- gfx::Display display_;
-
// The current scale of the mouse cursor icon.
float scale_;
+ // The current rotation of the mouse cursor icon.
+ gfx::Display::Rotation rotation_;
+
DISALLOW_COPY_AND_ASSIGN(CursorLoader);
};
diff --git a/ui/base/cursor/cursor_loader_ozone.cc b/ui/base/cursor/cursor_loader_ozone.cc
index 19dddf51d9..b56648fd43 100644
--- a/ui/base/cursor/cursor_loader_ozone.cc
+++ b/ui/base/cursor/cursor_loader_ozone.cc
@@ -21,7 +21,7 @@ void CursorLoaderOzone::LoadImageCursor(int id,
const gfx::ImageSkia* image =
ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id);
const gfx::ImageSkiaRep& image_rep =
- image->GetRepresentation(display().device_scale_factor());
+ image->GetRepresentation(scale());
SkBitmap bitmap = image_rep.sk_bitmap();
cursors_[id] =
CursorFactoryOzone::GetInstance()->CreateImageCursor(bitmap, hot);
diff --git a/ui/base/cursor/cursor_loader_x11.cc b/ui/base/cursor/cursor_loader_x11.cc
index 0161da29b2..9c2f609bf8 100644
--- a/ui/base/cursor/cursor_loader_x11.cc
+++ b/ui/base/cursor/cursor_loader_x11.cc
@@ -159,12 +159,11 @@ void CursorLoaderX11::LoadImageCursor(int id,
const gfx::Point& hot) {
const gfx::ImageSkia* image =
ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id);
- const gfx::ImageSkiaRep& image_rep = image->GetRepresentation(
- display().device_scale_factor());
+ const gfx::ImageSkiaRep& image_rep = image->GetRepresentation(scale());
SkBitmap bitmap = image_rep.sk_bitmap();
gfx::Point hotpoint = hot;
ScaleAndRotateCursorBitmapAndHotpoint(
- scale(), display().rotation(), &bitmap, &hotpoint);
+ scale(), rotation(), &bitmap, &hotpoint);
XcursorImage* x_image = SkBitmapToXcursorImage(&bitmap, hotpoint);
cursors_[id] = CreateReffedCustomXCursor(x_image);
@@ -177,8 +176,7 @@ void CursorLoaderX11::LoadAnimatedCursor(int id,
int frame_delay_ms) {
const gfx::ImageSkia* image =
ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id);
- const gfx::ImageSkiaRep& image_rep = image->GetRepresentation(
- display().device_scale_factor());
+ const gfx::ImageSkiaRep& image_rep = image->GetRepresentation(scale());
SkBitmap bitmap = image_rep.sk_bitmap();
int frame_width = bitmap.height();
int frame_height = frame_width;
@@ -233,8 +231,7 @@ void CursorLoaderX11::SetPlatformCursor(gfx::NativeCursor* cursor) {
xcursor = invisible_cursor_.get();
else if (*cursor == kCursorCustom)
xcursor = cursor->platform();
- else if (display().device_scale_factor() == 1.0f &&
- display().rotation() == gfx::Display::ROTATE_0) {
+ else if (scale() == 1.0f && rotation() == gfx::Display::ROTATE_0) {
xcursor = GetXCursor(CursorShapeFromNative(*cursor));
} else {
xcursor = ImageCursorFromNative(kCursorPointer);
diff --git a/ui/base/dragdrop/os_exchange_data_provider_aurax11.h b/ui/base/dragdrop/os_exchange_data_provider_aurax11.h
index 54ca445ffc..702cc7e11e 100644
--- a/ui/base/dragdrop/os_exchange_data_provider_aurax11.h
+++ b/ui/base/dragdrop/os_exchange_data_provider_aurax11.h
@@ -13,7 +13,6 @@
#include <map>
#include "base/files/file_path.h"
-#include "base/message_loop/message_pump_dispatcher.h"
#include "base/pickle.h"
#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/base/x/selection_owner.h"
diff --git a/ui/base/dragdrop/os_exchange_data_provider_win.cc b/ui/base/dragdrop/os_exchange_data_provider_win.cc
index afc7ddbe3b..ab06c32f0f 100644
--- a/ui/base/dragdrop/os_exchange_data_provider_win.cc
+++ b/ui/base/dragdrop/os_exchange_data_provider_win.cc
@@ -64,7 +64,7 @@ static STGMEDIUM* GetStorageForFileDescriptor(const base::FilePath& path);
// some sort of sequential data (why not just use an array?). See comments
// throughout.
//
-class FormatEtcEnumerator : public IEnumFORMATETC {
+class FormatEtcEnumerator FINAL : public IEnumFORMATETC {
public:
FormatEtcEnumerator(DataObjectImpl::StoredData::const_iterator begin,
DataObjectImpl::StoredData::const_iterator end);
@@ -897,7 +897,7 @@ template <typename T>
static STGMEDIUM* GetStorageForString(const std::basic_string<T>& data) {
return GetStorageForBytes(
data.c_str(),
- (data.size() + 1) * sizeof(std::basic_string<T>::value_type));
+ (data.size() + 1) * sizeof(typename std::basic_string<T>::value_type));
}
static void GetInternetShortcutFileContents(const GURL& url,
diff --git a/ui/base/gtk/OWNERS b/ui/base/gtk/OWNERS
deleted file mode 100644
index 0573e6b64c..0000000000
--- a/ui/base/gtk/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-erg@chromium.org
-estade@chromium.org
diff --git a/ui/base/gtk/gtk_signal.h b/ui/base/gtk/gtk_signal.h
deleted file mode 100644
index ca6fa2308d..0000000000
--- a/ui/base/gtk/gtk_signal.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// 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.
-
-#ifndef UI_BASE_GTK_GTK_SIGNAL_H_
-#define UI_BASE_GTK_GTK_SIGNAL_H_
-
-#include "ui/base/glib/glib_signal.h"
-
-typedef struct _GtkWidget GtkWidget;
-
-// These macros handle the common case where the sender object will be a
-// GtkWidget*.
-#define CHROMEGTK_CALLBACK_0(CLASS, RETURN, METHOD) \
- CHROMEG_CALLBACK_0(CLASS, RETURN, METHOD, GtkWidget*);
-
-#define CHROMEGTK_CALLBACK_1(CLASS, RETURN, METHOD, ARG1) \
- CHROMEG_CALLBACK_1(CLASS, RETURN, METHOD, GtkWidget*, ARG1);
-
-#define CHROMEGTK_CALLBACK_2(CLASS, RETURN, METHOD, ARG1, ARG2) \
- CHROMEG_CALLBACK_2(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2);
-
-#define CHROMEGTK_CALLBACK_3(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3) \
- CHROMEG_CALLBACK_3(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3);
-
-#define CHROMEGTK_CALLBACK_4(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, ARG4) \
- CHROMEG_CALLBACK_4(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3, \
- ARG4);
-
-#define CHROMEGTK_CALLBACK_5(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, ARG4, \
- ARG5) \
- CHROMEG_CALLBACK_5(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3, \
- ARG4, ARG5);
-
-#define CHROMEGTK_CALLBACK_6(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, ARG4, \
- ARG5, ARG6) \
- CHROMEG_CALLBACK_6(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, ARG3, \
- ARG4, ARG5, ARG6);
-
-#define CHROMEGTK_VIRTUAL_CALLBACK_0(CLASS, RETURN, METHOD) \
- CHROMEG_VIRTUAL_CALLBACK_0(CLASS, RETURN, METHOD, GtkWidget*);
-
-#define CHROMEGTK_VIRTUAL_CALLBACK_1(CLASS, RETURN, METHOD, ARG1) \
- CHROMEG_VIRTUAL_CALLBACK_1(CLASS, RETURN, METHOD, GtkWidget*, ARG1);
-
-#define CHROMEGTK_VIRTUAL_CALLBACK_2(CLASS, RETURN, METHOD, ARG1, ARG2) \
- CHROMEG_VIRTUAL_CALLBACK_2(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2);
-
-#define CHROMEGTK_VIRTUAL_CALLBACK_3(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3) \
- CHROMEG_VIRTUAL_CALLBACK_3(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, \
- ARG3);
-
-#define CHROMEGTK_VIRTUAL_CALLBACK_4(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, \
- ARG4) \
- CHROMEG_VIRTUAL_CALLBACK_4(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, \
- ARG3, ARG4);
-
-#define CHROMEGTK_VIRTUAL_CALLBACK_5(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, \
- ARG4, ARG5) \
- CHROMEG_VIRTUAL_CALLBACK_5(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, \
- ARG3, ARG4, ARG5);
-
-#define CHROMEGTK_VIRTUAL_CALLBACK_6(CLASS, RETURN, METHOD, ARG1, ARG2, ARG3, \
- ARG4, ARG5, ARG6) \
- CHROMEG_VIRTUAL_CALLBACK_6(CLASS, RETURN, METHOD, GtkWidget*, ARG1, ARG2, \
- ARG3, ARG4, ARG5, ARG6);
-
-#endif // UI_BASE_GTK_GTK_SIGNAL_H_
diff --git a/ui/base/gtk/gtk_signal_registrar.cc b/ui/base/gtk/gtk_signal_registrar.cc
deleted file mode 100644
index 82527e8258..0000000000
--- a/ui/base/gtk/gtk_signal_registrar.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-// 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.
-
-#include "ui/base/gtk/gtk_signal_registrar.h"
-
-#include <glib-object.h>
-
-#include "base/logging.h"
-#include "ui/base/gtk/g_object_destructor_filo.h"
-
-namespace ui {
-
-GtkSignalRegistrar::GtkSignalRegistrar() {
-}
-
-GtkSignalRegistrar::~GtkSignalRegistrar() {
- for (HandlerMap::iterator list_iter = handler_lists_.begin();
- list_iter != handler_lists_.end(); ++list_iter) {
- GObject* object = list_iter->first;
- GObjectDestructorFILO::GetInstance()->Disconnect(
- object, WeakNotifyThunk, this);
-
- HandlerList& handlers = list_iter->second;
- for (HandlerList::iterator ids_iter = handlers.begin();
- ids_iter != handlers.end(); ++ids_iter) {
- g_signal_handler_disconnect(object, *ids_iter);
- }
- }
-}
-
-glong GtkSignalRegistrar::Connect(gpointer instance,
- const gchar* detailed_signal,
- GCallback signal_handler,
- gpointer data) {
- return ConnectInternal(instance, detailed_signal, signal_handler, data,
- false);
-}
-
-glong GtkSignalRegistrar::ConnectAfter(gpointer instance,
- const gchar* detailed_signal,
- GCallback signal_handler,
- gpointer data) {
- return ConnectInternal(instance, detailed_signal, signal_handler, data, true);
-}
-
-glong GtkSignalRegistrar::ConnectInternal(gpointer instance,
- const gchar* detailed_signal,
- GCallback signal_handler,
- gpointer data,
- bool after) {
- GObject* object = G_OBJECT(instance);
-
- HandlerMap::iterator iter = handler_lists_.find(object);
- if (iter == handler_lists_.end()) {
- GObjectDestructorFILO::GetInstance()->Connect(
- object, WeakNotifyThunk, this);
- handler_lists_[object] = HandlerList();
- iter = handler_lists_.find(object);
- }
-
- glong handler_id = after ?
- g_signal_connect_after(instance, detailed_signal, signal_handler, data) :
- g_signal_connect(instance, detailed_signal, signal_handler, data);
- iter->second.push_back(handler_id);
-
- return handler_id;
-}
-
-void GtkSignalRegistrar::WeakNotify(GObject* where_the_object_was) {
- HandlerMap::iterator iter = handler_lists_.find(where_the_object_was);
- if (iter == handler_lists_.end()) {
- NOTREACHED();
- return;
- }
- // The signal handlers will be disconnected automatically. Just erase the
- // handler id list.
- handler_lists_.erase(iter);
-}
-
-void GtkSignalRegistrar::DisconnectAll(gpointer instance) {
- GObject* object = G_OBJECT(instance);
- HandlerMap::iterator iter = handler_lists_.find(object);
- if (iter == handler_lists_.end())
- return;
-
- GObjectDestructorFILO::GetInstance()->Disconnect(
- object, WeakNotifyThunk, this);
- HandlerList& handlers = iter->second;
- for (HandlerList::iterator ids_iter = handlers.begin();
- ids_iter != handlers.end(); ++ids_iter) {
- g_signal_handler_disconnect(object, *ids_iter);
- }
-
- handler_lists_.erase(iter);
-}
-
-} // namespace ui
diff --git a/ui/base/gtk/gtk_signal_registrar.h b/ui/base/gtk/gtk_signal_registrar.h
deleted file mode 100644
index 37b8710db9..0000000000
--- a/ui/base/gtk/gtk_signal_registrar.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// 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.
-
-#ifndef UI_BASE_GTK_GTK_SIGNAL_REGISTRAR_H_
-#define UI_BASE_GTK_GTK_SIGNAL_REGISTRAR_H_
-
-#include <glib.h>
-#include <map>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "ui/base/ui_base_export.h"
-
-typedef void (*GCallback) (void);
-typedef struct _GObject GObject;
-typedef struct _GtkWidget GtkWidget;
-
-namespace ui {
-
-// A class that ensures that callbacks don't run on stale owner objects. Similar
-// in spirit to NotificationRegistrar. Use as follows:
-//
-// class ChromeObject {
-// public:
-// ChromeObject() {
-// ...
-//
-// signals_.Connect(widget, "event", CallbackThunk, this);
-// }
-//
-// ...
-//
-// private:
-// GtkSignalRegistrar signals_;
-// };
-//
-// When |signals_| goes down, it will disconnect the handlers connected via
-// Connect.
-class UI_BASE_EXPORT GtkSignalRegistrar {
- public:
- GtkSignalRegistrar();
- ~GtkSignalRegistrar();
-
- // Connect before the default handler. Returns the handler id.
- glong Connect(gpointer instance, const gchar* detailed_signal,
- GCallback signal_handler, gpointer data);
- // Connect after the default handler. Returns the handler id.
- glong ConnectAfter(gpointer instance, const gchar* detailed_signal,
- GCallback signal_handler, gpointer data);
-
- // Disconnects all signal handlers connected to |instance|.
- void DisconnectAll(gpointer instance);
-
- private:
- typedef std::vector<glong> HandlerList;
- typedef std::map<GObject*, HandlerList> HandlerMap;
-
- static void WeakNotifyThunk(gpointer data, GObject* where_the_object_was) {
- reinterpret_cast<GtkSignalRegistrar*>(data)->WeakNotify(
- where_the_object_was);
- }
- void WeakNotify(GObject* where_the_object_was);
-
- glong ConnectInternal(gpointer instance, const gchar* detailed_signal,
- GCallback signal_handler, gpointer data, bool after);
-
- HandlerMap handler_lists_;
-
- DISALLOW_COPY_AND_ASSIGN(GtkSignalRegistrar);
-};
-
-} // namespace ui
-
-#endif // UI_BASE_GTK_GTK_SIGNAL_REGISTRAR_H_
diff --git a/ui/base/ime/chromeos/ime_bridge.cc b/ui/base/ime/chromeos/ime_bridge.cc
index 6d07e6eb3d..49d0f73df3 100644
--- a/ui/base/ime/chromeos/ime_bridge.cc
+++ b/ui/base/ime/chromeos/ime_bridge.cc
@@ -18,7 +18,8 @@ class IMEBridgeImpl : public IMEBridge {
IMEBridgeImpl()
: input_context_handler_(NULL),
engine_handler_(NULL),
- candidate_window_handler_(NULL) {
+ candidate_window_handler_(NULL),
+ current_text_input_(ui::TEXT_INPUT_TYPE_NONE) {
}
virtual ~IMEBridgeImpl() {
@@ -59,10 +60,21 @@ class IMEBridgeImpl : public IMEBridge {
candidate_window_handler_ = handler;
}
+ // IMEBridge override.
+ virtual void SetCurrentTextInputType(ui::TextInputType input_type) OVERRIDE {
+ current_text_input_ = input_type;
+ }
+
+ // IMEBridge override.
+ virtual ui::TextInputType GetCurrentTextInputType() const OVERRIDE {
+ return current_text_input_;
+ }
+
private:
IMEInputContextHandlerInterface* input_context_handler_;
IMEEngineHandlerInterface* engine_handler_;
IMECandidateWindowHandlerInterface* candidate_window_handler_;
+ ui::TextInputType current_text_input_;
DISALLOW_COPY_AND_ASSIGN(IMEBridgeImpl);
};
diff --git a/ui/base/ime/chromeos/ime_bridge.h b/ui/base/ime/chromeos/ime_bridge.h
index 3c6ed0aa40..2464f3ff89 100644
--- a/ui/base/ime/chromeos/ime_bridge.h
+++ b/ui/base/ime/chromeos/ime_bridge.h
@@ -173,6 +173,12 @@ class UI_BASE_EXPORT IMEBridge {
virtual void SetCandidateWindowHandler(
IMECandidateWindowHandlerInterface* handler) = 0;
+ // Updates current text input type.
+ virtual void SetCurrentTextInputType(ui::TextInputType input_type) = 0;
+
+ // Returns the current text input type.
+ virtual ui::TextInputType GetCurrentTextInputType() const = 0;
+
protected:
IMEBridge();
diff --git a/ui/base/ime/ime.gypi b/ui/base/ime/ime.gypi
index 77329468cc..f3b08bbf96 100644
--- a/ui/base/ime/ime.gypi
+++ b/ui/base/ime/ime.gypi
@@ -114,5 +114,10 @@
'chromeos/character_composer.h',
],
}],
+ ['OS=="android"', {
+ 'dependencies!' : [
+ '<(DEPTH)/ui/events/events.gyp:events',
+ ],
+ }]
],
}
diff --git a/ui/base/ime/input_method_chromeos.cc b/ui/base/ime/input_method_chromeos.cc
index bd5666e994..5e1f2ece98 100644
--- a/ui/base/ime/input_method_chromeos.cc
+++ b/ui/base/ime/input_method_chromeos.cc
@@ -292,11 +292,12 @@ void InputMethodChromeOS::UpdateContextFocusState() {
if (candidate_window)
candidate_window->FocusStateChanged(IsInputFieldFocused());
+ const TextInputType current_text_input_type = GetTextInputType();
+ chromeos::IMEBridge::Get()->SetCurrentTextInputType(current_text_input_type);
+
if (!GetEngine())
return;
- const TextInputType current_text_input_type = GetTextInputType();
-
// When focus is not changed, a text input type change causes a focus
// blink. The focus in to or out from password field should also notify
// engine.
diff --git a/ui/base/ime/win/tsf_input_scope.cc b/ui/base/ime/win/tsf_input_scope.cc
index ccfda53a85..f40f928a5f 100644
--- a/ui/base/ime/win/tsf_input_scope.cc
+++ b/ui/base/ime/win/tsf_input_scope.cc
@@ -29,7 +29,7 @@ void AppendNonTrivialInputScope(std::vector<InputScope>* input_scopes,
input_scopes->push_back(input_scope);
}
-class TSFInputScope : public ITfInputScope {
+class TSFInputScope FINAL : public ITfInputScope {
public:
explicit TSFInputScope(const std::vector<InputScope>& input_scopes)
: input_scopes_(input_scopes),
diff --git a/ui/base/l10n/formatter.cc b/ui/base/l10n/formatter.cc
index 2131ff2913..14f49ae3c9 100644
--- a/ui/base/l10n/formatter.cc
+++ b/ui/base/l10n/formatter.cc
@@ -23,28 +23,28 @@ struct Pluralities {
};
static const Pluralities IDS_ELAPSED_SHORT_SEC = {
- { IDS_TIME_ELAPSED_SECS_DEFAULT, IDS_TIME_ELAPSED_SEC_SINGULAR,
+ { IDS_TIME_ELAPSED_SECS_DEFAULT, IDS_TIME_ELAPSED_SECS_SINGULAR,
IDS_TIME_ELAPSED_SECS_ZERO, IDS_TIME_ELAPSED_SECS_TWO,
IDS_TIME_ELAPSED_SECS_FEW, IDS_TIME_ELAPSED_SECS_MANY },
"one{# sec ago}",
" other{# secs ago}"
};
static const Pluralities IDS_ELAPSED_SHORT_MIN = {
- { IDS_TIME_ELAPSED_MINS_DEFAULT, IDS_TIME_ELAPSED_MIN_SINGULAR,
+ { IDS_TIME_ELAPSED_MINS_DEFAULT, IDS_TIME_ELAPSED_MINS_SINGULAR,
IDS_TIME_ELAPSED_MINS_ZERO, IDS_TIME_ELAPSED_MINS_TWO,
IDS_TIME_ELAPSED_MINS_FEW, IDS_TIME_ELAPSED_MINS_MANY },
"one{# min ago}",
" other{# mins ago}"
};
static const Pluralities IDS_ELAPSED_HOUR = {
- { IDS_TIME_ELAPSED_HOURS_DEFAULT, IDS_TIME_ELAPSED_HOUR_SINGULAR,
+ { IDS_TIME_ELAPSED_HOURS_DEFAULT, IDS_TIME_ELAPSED_HOURS_SINGULAR,
IDS_TIME_ELAPSED_HOURS_ZERO, IDS_TIME_ELAPSED_HOURS_TWO,
IDS_TIME_ELAPSED_HOURS_FEW, IDS_TIME_ELAPSED_HOURS_MANY },
"one{# hour ago}",
" other{# hours ago}"
};
static const Pluralities IDS_ELAPSED_DAY = {
- { IDS_TIME_ELAPSED_DAYS_DEFAULT, IDS_TIME_ELAPSED_DAY_SINGULAR,
+ { IDS_TIME_ELAPSED_DAYS_DEFAULT, IDS_TIME_ELAPSED_DAYS_SINGULAR,
IDS_TIME_ELAPSED_DAYS_ZERO, IDS_TIME_ELAPSED_DAYS_TWO,
IDS_TIME_ELAPSED_DAYS_FEW, IDS_TIME_ELAPSED_DAYS_MANY },
"one{# day ago}",
@@ -52,14 +52,14 @@ static const Pluralities IDS_ELAPSED_DAY = {
};
static const Pluralities IDS_REMAINING_SHORT_SEC = {
- { IDS_TIME_REMAINING_SECS_DEFAULT, IDS_TIME_REMAINING_SEC_SINGULAR,
+ { IDS_TIME_REMAINING_SECS_DEFAULT, IDS_TIME_REMAINING_SECS_SINGULAR,
IDS_TIME_REMAINING_SECS_ZERO, IDS_TIME_REMAINING_SECS_TWO,
IDS_TIME_REMAINING_SECS_FEW, IDS_TIME_REMAINING_SECS_MANY },
"one{# sec left}",
" other{# secs left}"
};
static const Pluralities IDS_REMAINING_SHORT_MIN = {
- { IDS_TIME_REMAINING_MINS_DEFAULT, IDS_TIME_REMAINING_MIN_SINGULAR,
+ { IDS_TIME_REMAINING_MINS_DEFAULT, IDS_TIME_REMAINING_MINS_SINGULAR,
IDS_TIME_REMAINING_MINS_ZERO, IDS_TIME_REMAINING_MINS_TWO,
IDS_TIME_REMAINING_MINS_FEW, IDS_TIME_REMAINING_MINS_MANY },
"one{# min left}",
@@ -67,28 +67,28 @@ static const Pluralities IDS_REMAINING_SHORT_MIN = {
};
static const Pluralities IDS_REMAINING_LONG_SEC = {
- { IDS_TIME_REMAINING_LONG_SECS_DEFAULT, IDS_TIME_REMAINING_LONG_SEC_SINGULAR,
+ { IDS_TIME_REMAINING_LONG_SECS_DEFAULT, IDS_TIME_REMAINING_LONG_SECS_SINGULAR,
IDS_TIME_REMAINING_LONG_SECS_ZERO, IDS_TIME_REMAINING_LONG_SECS_TWO,
IDS_TIME_REMAINING_LONG_SECS_FEW, IDS_TIME_REMAINING_LONG_SECS_MANY },
"one{# second left}",
" other{# seconds left}"
};
static const Pluralities IDS_REMAINING_LONG_MIN = {
- { IDS_TIME_REMAINING_LONG_MINS_DEFAULT, IDS_TIME_REMAINING_LONG_MIN_SINGULAR,
+ { IDS_TIME_REMAINING_LONG_MINS_DEFAULT, IDS_TIME_REMAINING_LONG_MINS_SINGULAR,
IDS_TIME_REMAINING_LONG_MINS_ZERO, IDS_TIME_REMAINING_LONG_MINS_TWO,
IDS_TIME_REMAINING_LONG_MINS_FEW, IDS_TIME_REMAINING_LONG_MINS_MANY },
"one{# minute left}",
" other{# minutes left}"
};
static const Pluralities IDS_REMAINING_HOUR = {
- { IDS_TIME_REMAINING_HOURS_DEFAULT, IDS_TIME_REMAINING_HOUR_SINGULAR,
+ { IDS_TIME_REMAINING_HOURS_DEFAULT, IDS_TIME_REMAINING_HOURS_SINGULAR,
IDS_TIME_REMAINING_HOURS_ZERO, IDS_TIME_REMAINING_HOURS_TWO,
IDS_TIME_REMAINING_HOURS_FEW, IDS_TIME_REMAINING_HOURS_MANY },
"one{# hour left}",
" other{# hours left}"
};
static const Pluralities IDS_REMAINING_DAY = {
- { IDS_TIME_REMAINING_DAYS_DEFAULT, IDS_TIME_REMAINING_DAY_SINGULAR,
+ { IDS_TIME_REMAINING_DAYS_DEFAULT, IDS_TIME_REMAINING_DAYS_SINGULAR,
IDS_TIME_REMAINING_DAYS_ZERO, IDS_TIME_REMAINING_DAYS_TWO,
IDS_TIME_REMAINING_DAYS_FEW, IDS_TIME_REMAINING_DAYS_MANY },
"one{# day left}",
@@ -96,82 +96,82 @@ static const Pluralities IDS_REMAINING_DAY = {
};
static const Pluralities IDS_DURATION_SHORT_SEC = {
- { IDS_TIME_SECS_DEFAULT, IDS_TIME_SEC_SINGULAR, IDS_TIME_SECS_ZERO,
+ { IDS_TIME_SECS_DEFAULT, IDS_TIME_SECS_SINGULAR, IDS_TIME_SECS_ZERO,
IDS_TIME_SECS_TWO, IDS_TIME_SECS_FEW, IDS_TIME_SECS_MANY },
"one{# sec}",
" other{# secs}"
};
static const Pluralities IDS_DURATION_SHORT_MIN = {
- { IDS_TIME_MINS_DEFAULT, IDS_TIME_MIN_SINGULAR, IDS_TIME_MINS_ZERO,
+ { IDS_TIME_MINS_DEFAULT, IDS_TIME_MINS_SINGULAR, IDS_TIME_MINS_ZERO,
IDS_TIME_MINS_TWO, IDS_TIME_MINS_FEW, IDS_TIME_MINS_MANY },
"one{# min}",
" other{# mins}"
};
static const Pluralities IDS_LONG_SEC = {
- { IDS_TIME_LONG_SECS_DEFAULT, IDS_TIME_LONG_SEC_SINGULAR,
+ { IDS_TIME_LONG_SECS_DEFAULT, IDS_TIME_LONG_SECS_SINGULAR,
IDS_TIME_LONG_SECS_ZERO, IDS_TIME_LONG_SECS_TWO,
IDS_TIME_LONG_SECS_FEW, IDS_TIME_LONG_SECS_MANY },
"one{# second}",
" other{# seconds}"
};
static const Pluralities IDS_LONG_MIN = {
- { IDS_TIME_LONG_MINS_DEFAULT, IDS_TIME_LONG_MIN_SINGULAR,
+ { IDS_TIME_LONG_MINS_DEFAULT, IDS_TIME_LONG_MINS_SINGULAR,
IDS_TIME_LONG_MINS_ZERO, IDS_TIME_LONG_MINS_TWO,
IDS_TIME_LONG_MINS_FEW, IDS_TIME_LONG_MINS_MANY },
"one{# minute}",
" other{# minutes}"
};
static const Pluralities IDS_DURATION_HOUR = {
- { IDS_TIME_HOURS_DEFAULT, IDS_TIME_HOUR_SINGULAR, IDS_TIME_HOURS_ZERO,
+ { IDS_TIME_HOURS_DEFAULT, IDS_TIME_HOURS_SINGULAR, IDS_TIME_HOURS_ZERO,
IDS_TIME_HOURS_TWO, IDS_TIME_HOURS_FEW, IDS_TIME_HOURS_MANY },
"one{# hour}",
" other{# hours}"
};
static const Pluralities IDS_DURATION_DAY = {
- { IDS_TIME_DAYS_DEFAULT, IDS_TIME_DAY_SINGULAR, IDS_TIME_DAYS_ZERO,
+ { IDS_TIME_DAYS_DEFAULT, IDS_TIME_DAYS_SINGULAR, IDS_TIME_DAYS_ZERO,
IDS_TIME_DAYS_TWO, IDS_TIME_DAYS_FEW, IDS_TIME_DAYS_MANY },
"one{# day}",
" other{# days}"
};
static const Pluralities IDS_LONG_MIN_1ST = {
- { IDS_TIME_LONG_MINS_1ST_DEFAULT, IDS_TIME_LONG_MIN_1ST_SINGULAR,
+ { IDS_TIME_LONG_MINS_1ST_DEFAULT, IDS_TIME_LONG_MINS_1ST_SINGULAR,
IDS_TIME_LONG_MINS_1ST_ZERO, IDS_TIME_LONG_MINS_1ST_TWO,
IDS_TIME_LONG_MINS_1ST_FEW, IDS_TIME_LONG_MINS_1ST_MANY },
"one{# minute }",
" other{# minutes }"
};
static const Pluralities IDS_LONG_SEC_2ND = {
- { IDS_TIME_LONG_SECS_2ND_DEFAULT, IDS_TIME_LONG_SEC_2ND_SINGULAR,
+ { IDS_TIME_LONG_SECS_2ND_DEFAULT, IDS_TIME_LONG_SECS_2ND_SINGULAR,
IDS_TIME_LONG_SECS_2ND_ZERO, IDS_TIME_LONG_SECS_2ND_TWO,
IDS_TIME_LONG_SECS_2ND_FEW, IDS_TIME_LONG_SECS_2ND_MANY },
"one{# second}",
" other{# seconds}"
};
static const Pluralities IDS_DURATION_HOUR_1ST = {
- { IDS_TIME_HOURS_1ST_DEFAULT, IDS_TIME_HOUR_1ST_SINGULAR,
+ { IDS_TIME_HOURS_1ST_DEFAULT, IDS_TIME_HOURS_1ST_SINGULAR,
IDS_TIME_HOURS_1ST_ZERO, IDS_TIME_HOURS_1ST_TWO,
IDS_TIME_HOURS_1ST_FEW, IDS_TIME_HOURS_1ST_MANY },
"one{# hour }",
" other{# hours }"
};
static const Pluralities IDS_LONG_MIN_2ND = {
- { IDS_TIME_LONG_MINS_2ND_DEFAULT, IDS_TIME_LONG_MIN_2ND_SINGULAR,
+ { IDS_TIME_LONG_MINS_2ND_DEFAULT, IDS_TIME_LONG_MINS_2ND_SINGULAR,
IDS_TIME_LONG_MINS_2ND_ZERO, IDS_TIME_LONG_MINS_2ND_TWO,
IDS_TIME_LONG_MINS_2ND_FEW, IDS_TIME_LONG_MINS_2ND_MANY },
"one{# minute}",
" other{# minutes}"
};
static const Pluralities IDS_DURATION_DAY_1ST = {
- { IDS_TIME_DAYS_1ST_DEFAULT, IDS_TIME_DAY_1ST_SINGULAR,
+ { IDS_TIME_DAYS_1ST_DEFAULT, IDS_TIME_DAYS_1ST_SINGULAR,
IDS_TIME_DAYS_1ST_ZERO, IDS_TIME_DAYS_1ST_TWO,
IDS_TIME_DAYS_1ST_FEW, IDS_TIME_DAYS_1ST_MANY },
"one{# day }",
" other{# days }"
};
static const Pluralities IDS_DURATION_HOUR_2ND = {
- { IDS_TIME_HOURS_2ND_DEFAULT, IDS_TIME_HOUR_2ND_SINGULAR,
+ { IDS_TIME_HOURS_2ND_DEFAULT, IDS_TIME_HOURS_2ND_SINGULAR,
IDS_TIME_HOURS_2ND_ZERO, IDS_TIME_HOURS_2ND_TWO,
IDS_TIME_HOURS_2ND_FEW, IDS_TIME_HOURS_2ND_MANY },
"one{# hour}",
diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc
index daea33fe88..e2a91444a6 100644
--- a/ui/base/resource/resource_bundle.cc
+++ b/ui/base/resource/resource_bundle.cc
@@ -632,8 +632,8 @@ void ResourceBundle::AddDataPackFromPathInternal(const base::FilePath& path,
void ResourceBundle::AddDataPack(DataPack* data_pack) {
data_packs_.push_back(data_pack);
- if (GetImageScale(data_pack->GetScaleFactor()) >
- GetImageScale(max_scale_factor_))
+ if (GetScaleForScaleFactor(data_pack->GetScaleFactor()) >
+ GetScaleForScaleFactor(max_scale_factor_))
max_scale_factor_ = data_pack->GetScaleFactor();
}
diff --git a/ui/base/strings/ui_strings.grd b/ui/base/strings/ui_strings.grd
index 5012ba797e..499ee1958e 100644
--- a/ui/base/strings/ui_strings.grd
+++ b/ui/base/strings/ui_strings.grd
@@ -219,13 +219,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_SEC_SINGULAR"
+ <message name="IDS_TIME_SECS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> sec
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_SEC_SINGULAR"
+ <message translateable="false" name="IDS_TIME_SECS_SINGULAR"
desc="">
NA
</message>
@@ -290,13 +290,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_LONG_SEC_SINGULAR"
+ <message name="IDS_TIME_LONG_SECS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> second
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_LONG_SEC_SINGULAR"
+ <message translateable="false" name="IDS_TIME_LONG_SECS_SINGULAR"
desc="">
NA
</message>
@@ -361,13 +361,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_LONG_SEC_2ND_SINGULAR"
+ <message name="IDS_TIME_LONG_SECS_2ND_SINGULAR"
desc="Second part of 'xx minutes yy seconds' time format where yy (NUMBER_ONE) is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> second
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_LONG_SEC_2ND_SINGULAR"
+ <message translateable="false" name="IDS_TIME_LONG_SECS_2NDS_SINGULAR"
desc="">
NA
</message>
@@ -432,13 +432,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_MIN_SINGULAR"
+ <message name="IDS_TIME_MINS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> min
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_MIN_SINGULAR"
+ <message translateable="false" name="IDS_TIME_MINS_SINGULAR"
desc="">
NA
</message>
@@ -503,13 +503,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_LONG_MIN_SINGULAR"
+ <message name="IDS_TIME_LONG_MINS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> minute
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_LONG_MIN_SINGULAR"
+ <message translateable="false" name="IDS_TIME_LONG_MINS_SINGULAR"
desc="">
NA
</message>
@@ -574,13 +574,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_LONG_MIN_1ST_SINGULAR"
+ <message name="IDS_TIME_LONG_MINS_1ST_SINGULAR"
desc="First part of 'xx minutes yy seconds' time format (including the space between first and second part, if the language requires a space there) where xx (NUMBER_ONE) is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> minute '''
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_LONG_MIN_1ST_SINGULAR"
+ <message translateable="false" name="IDS_TIME_LONG_MINS_1ST_SINGULAR"
desc="">
NA
</message>
@@ -645,13 +645,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_LONG_MIN_2ND_SINGULAR"
+ <message name="IDS_TIME_LONG_MINS_2ND_SINGULAR"
desc="Second part of 'xx hours yy minutes' time format where yy (NUMBER_ONE) is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> minute
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_LONG_MIN_2ND_SINGULAR"
+ <message translateable="false" name="IDS_TIME_LONG_MINS_2ND_SINGULAR"
desc="">
NA
</message>
@@ -716,13 +716,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_HOUR_SINGULAR"
+ <message name="IDS_TIME_HOURS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_HOUR_SINGULAR"
+ <message translateable="false" name="IDS_TIME_HOURS_SINGULAR"
desc="">
NA
</message>
@@ -787,13 +787,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_HOUR_1ST_SINGULAR"
+ <message name="IDS_TIME_HOURS_1ST_SINGULAR"
desc="First part of 'xx hours yy minutes' time format (including the space between first and second part, if the language requires a space there) where xx (NUMBER_ONE) is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour '''
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_HOUR_1ST_SINGULAR"
+ <message translateable="false" name="IDS_TIME_HOURS_1ST_SINGULAR"
desc="">
NA
</message>
@@ -858,13 +858,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_HOUR_2ND_SINGULAR"
+ <message name="IDS_TIME_HOURS_2ND_SINGULAR"
desc="Second part of 'xx days yy hours' time format where yy (NUMBER_ONE) is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_HOUR_2ND_SINGULAR"
+ <message translateable="false" name="IDS_TIME_HOURS_2ND_SINGULAR"
desc="">
NA
</message>
@@ -929,13 +929,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_DAY_SINGULAR"
+ <message name="IDS_TIME_DAYS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> day
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_DAY_SINGULAR"
+ <message translateable="false" name="IDS_TIME_DAYS_SINGULAR"
desc="">
NA
</message>
@@ -1000,13 +1000,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_DAY_1ST_SINGULAR"
+ <message name="IDS_TIME_DAYS_1ST_SINGULAR"
desc="First part of 'xx days yy hours' time format (including the space between first and second part, if the language requires a space there) where xx (NUMBER_ONE) is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> day '''
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_DAY_1ST_SINGULAR"
+ <message translateable="false" name="IDS_TIME_DAYS_1ST_SINGULAR"
desc="">
NA
</message>
@@ -1071,13 +1071,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_REMAINING_SEC_SINGULAR"
+ <message name="IDS_TIME_REMAINING_SECS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> sec left
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_REMAINING_SEC_SINGULAR"
+ <message translateable="false" name="IDS_TIME_REMAINING_SECS_SINGULAR"
desc="">
NA
</message>
@@ -1142,13 +1142,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_REMAINING_LONG_SEC_SINGULAR"
+ <message name="IDS_TIME_REMAINING_LONG_SECS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> second left
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_REMAINING_SEC_SINGULAR"
+ <message translateable="false" name="IDS_TIME_REMAINING_SECS_SINGULAR"
desc="">
NA
</message>
@@ -1213,13 +1213,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_REMAINING_MIN_SINGULAR"
+ <message name="IDS_TIME_REMAINING_MINS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> min left
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_REMAINING_MIN_SINGULAR"
+ <message translateable="false" name="IDS_TIME_REMAINING_MINS_SINGULAR"
desc="">
NA
</message>
@@ -1283,13 +1283,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_REMAINING_LONG_MIN_SINGULAR"
+ <message name="IDS_TIME_REMAINING_LONG_MINS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> minute left
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_REMAINING_LONG_MIN_SINGULAR"
+ <message translateable="false" name="IDS_TIME_REMAINING_LONG_MINS_SINGULAR"
desc="">
NA
</message>
@@ -1353,13 +1353,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_REMAINING_HOUR_SINGULAR"
+ <message name="IDS_TIME_REMAINING_HOURS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour left
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_REMAINING_HOUR_SINGULAR"
+ <message translateable="false" name="IDS_TIME_REMAINING_HOURS_SINGULAR"
desc="">
NA
</message>
@@ -1424,13 +1424,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_REMAINING_DAY_SINGULAR"
+ <message name="IDS_TIME_REMAINING_DAYS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> day left
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_REMAINING_DAY_SINGULAR"
+ <message translateable="false" name="IDS_TIME_REMAINING_DAYS_SINGULAR"
desc="">
NA
</message>
@@ -1494,13 +1494,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_ELAPSED_SEC_SINGULAR"
+ <message name="IDS_TIME_ELAPSED_SECS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> sec ago
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_ELAPSED_SEC_SINGULAR"
+ <message translateable="false" name="IDS_TIME_ELAPSED_SECS_SINGULAR"
desc="">
NA
</message>
@@ -1565,13 +1565,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_ELAPSED_MIN_SINGULAR"
+ <message name="IDS_TIME_ELAPSED_MINS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> min ago
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_ELAPSED_MIN_SINGULAR"
+ <message translateable="false" name="IDS_TIME_ELAPSED_MINS_SINGULAR"
desc="">
NA
</message>
@@ -1636,13 +1636,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_ELAPSED_HOUR_SINGULAR"
+ <message name="IDS_TIME_ELAPSED_HOURS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> hour ago
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_ELAPSED_HOUR_SINGULAR"
+ <message translateable="false" name="IDS_TIME_ELAPSED_HOURS_SINGULAR"
desc="">
NA
</message>
@@ -1707,13 +1707,13 @@ need to be translated for each locale.-->
</message>
<if expr="lang not in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message name="IDS_TIME_ELAPSED_DAY_SINGULAR"
+ <message name="IDS_TIME_ELAPSED_DAYS_SINGULAR"
desc="NUMBER_ONE is a one or one-like number: 1 (many European and most Indian languages), 1 and 0 (French, Brazilian Portuguese and Hindi), 1, 21, 31, ... (Russian, Ukrainian, Croatian, Serbian, Latvian, Lithuanian), or 1, 101, 201, ... (Slovenian). Do NOT translate this for CJK, Vietnamese, Turkish and Kannada.">
<ph name="NUMBER_ONE"><ex>1</ex>#</ph> day ago
</message>
</if>
<if expr="lang in ['zh-CN', 'zh-TW', 'ko', 'ja', 'vi', 'tr', 'kn']">
- <message translateable="false" name="IDS_TIME_ELAPSED_DAY_SINGULAR"
+ <message translateable="false" name="IDS_TIME_ELAPSED_DAYS_SINGULAR"
desc="">
NA
</message>
diff --git a/ui/base/strings/ui_strings_am.xtb b/ui/base/strings/ui_strings_am.xtb
index 349f686bd1..b2bc258ddb 100644
--- a/ui/base/strings/ui_strings_am.xtb
+++ b/ui/base/strings/ui_strings_am.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> ባ</translation>
<translation id="3660179305079774227">የላይ ቀስት</translation>
+<translation id="3969863827134279083">ወደላይ አውጣ</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> ሁለተኛ ግራ</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> ሜባ/ሰ</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ሰዓት</translation>
<translation id="3990502903496589789">የቀኝ ጠርዝ</translation>
<translation id="9038489124413477075">ያልተሰየመ አቃፊ</translation>
+<translation id="1940483897317142625">ወደ የመስመር መጨረሻ ሰርዝ</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> ደቂቃ</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> ቀናት ይቀራሉ</translation>
<translation id="932327136139879170">መነሻ</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">ከ<ph name="NUMBER_FEW"/> ቀናት በፊት</translation>
<translation id="5076340679995252485">&amp;ለጥፍ</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> ቴባ</translation>
+<translation id="7139614227326422685">ቃል ወደ ቀኝ ውሰድ</translation>
<translation id="364720409959344976">የሚሰቀል ዓቃፊ ይምረጡ</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">ከ<ph name="NUMBER_TWO"/> ደቂቃ በፊት</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">ማሳወቂያ ዝጋ</translation>
<translation id="6364916375976753737">ወደ ግራ ሸብልል</translation>
<translation id="2629089419211541119">ከ<ph name="NUMBER_ONE"/> ሰዓት በፊት</translation>
+<translation id="4218160142017529598">ወደኋላ ሰርዝ</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> ደቂቃዎች</translation>
<translation id="6982279413068714821">ከ<ph name="NUMBER_DEFAULT"/> ደቂቃ በፊት</translation>
<translation id="6945221475159498467">ይምረጡ</translation>
<translation id="6620110761915583480">ፋይል አስቀምጥ</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> ሰከንዶች</translation>
+<translation id="8924469368910458384">ወደ የመስመር መጀመሪያ ሰርዝ</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> ሰዓት</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> ደቂቃ ቀርቷል</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> ደቂቃ</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ቀናት</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ሰዓቶች ይቀራሉ</translation>
<translation id="5329858601952122676">&amp;ሠርዝ</translation>
+<translation id="6556866813142980365">ድገም</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> ሴኮንድ</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> ኪባ</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> ደቂቃዎች</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> ደቂቃዎች</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> ደቂቃ ይቀራል</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> ሰከንዶች ቀርተዋል</translation>
+<translation id="6903282483217634857">ወደ ቀኝ ውሰድ</translation>
<translation id="6659594942844771486">ትር</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> ሜባ</translation>
<translation id="4988273303304146523">ከ<ph name="NUMBER_DEFAULT"/> ቀን በፊት</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> ደቂቃ</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> ሰዓት ይቀራል</translation>
<translation id="7135556860107312402">ማሳወቂያዎች ከሚከተሉት እንዲመጡ ፍቀድ፦</translation>
+<translation id="2479520428668657293">ወደ ቀኝ ውሰድ እና ምርጫ ቀይር</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ሰዓቶች</translation>
<translation id="1398853756734560583">አስፋ</translation>
<translation id="4250229828105606438">ቅጽበታዊ ገጽ እይታ</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ሰዓቶች</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> ደቂቃ ይቀራል</translation>
+<translation id="2557207087669398617">ወደ የመስመር መጀመሪያ ውሰድ</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> ጊባ</translation>
<translation id="1901303067676059328">&amp;ሁሉንም ምረጥ</translation>
<translation id="2168039046890040389">ወደላይ አንቀሳቅስ</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> ደቂቃ</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> ቀን</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> ደቂቃ</translation>
+<translation id="6122334925474904337">ቃል ወደ ቀኝ ውሰድ እና ምርጫ ቀይር</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> ደቂቃ</translation>
<translation id="8448317557906454022">ከ<ph name="NUMBER_ZERO"/> ሴኮንድ በፊት</translation>
<translation id="4927753642311223124">እዚህ ምንም የሚታይ ነገር የለም፣ ይቀጥሉ።</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> ቀን</translation>
<translation id="3183922693828471536">ወደ እዚህ ሸብልል</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">ወደታች አውርድ</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ሰዓቶች</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> ኪባ/ሰ</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ሰዓት ይቀራል</translation>
<translation id="1413622004203049571">ከ<ph name="NOTIFIER_NAME"/> የሚመጡ ማሳወቂያዎችን አሰናክል</translation>
<translation id="2666092431469916601">ላይ</translation>
+<translation id="2538759511191347839">ወደ የመስመር መጨረሻ ውሰድ እና ምርጫ ቀይር</translation>
+<translation id="928465423150706909">ወደ የመስመር መጨረሻ ውሰድ</translation>
<translation id="8331626408530291785">ወደ ላይ ሸብልል</translation>
<translation id="7907591526440419938">ፋይል ክፈት</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> ቀን ይቀራል</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">ሚዲያ አቁም</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> ደቂቃ ይቀራል</translation>
<translation id="3157931365184549694">እነበረበት መልስ</translation>
+<translation id="5349525451964472598">ወደ ግራ ውሰድ እና ምርጫ ቀይር</translation>
+<translation id="1781701194097416995">ቃል ወደ ግራ ውሰድ</translation>
<translation id="1243314992276662751">ስቀል</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> ቀን ይቀራል</translation>
<translation id="8179976553408161302">አስገባ</translation>
+<translation id="8471049483003785219">ቃል ወደ ግራ ውሰድ እና ምርጫ ቀይር</translation>
<translation id="945522503751344254">ግብረ መልስ ላክ</translation>
<translation id="9170848237812810038">&amp;ቀልብስ</translation>
<translation id="1285266685456062655">ከ<ph name="NUMBER_FEW"/> ሰዓቶች በፊት</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350">ከ<ph name="NUMBER_ZERO"/> ሰዓት በፊት</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> ጊባ/ሰ</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> ቀን</translation>
+<translation id="2704295676501803339">ወደ ግራ ውሰድ</translation>
<translation id="9098468523912235228">ከ<ph name="NUMBER_DEFAULT"/> ሴኮንድ በፊት</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> ሴኮንድ ይቀራል</translation>
<translation id="4570886800634958009">ማሳወቂያ ዘርጋ</translation>
+<translation id="566737009157135450">ወደኋላ ሰርዝ</translation>
<translation id="436869212180315161">ተጫን</translation>
<translation id="4860787810836767172">ከ<ph name="NUMBER_FEW"/> ሴኮንድ በፊት</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> ቴባ/ሰ</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">ከ<ph name="NUMBER_MANY"/> ደቂቃ በፊት</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> ባ/ሰ</translation>
<translation id="7649070708921625228">እገዛ</translation>
+<translation id="2405367043325750948">ወደፊት ሰርዝ</translation>
<translation id="6699343763173986273">የሚዲያ ቀጣይ ትራክ</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> ሰከንዶች ቀርተዋል</translation>
<translation id="8226233771743600312">ለአንድ ቀን አትረብሽ</translation>
+<translation id="4252565523989510616">ቃል ወደፊት ሰርዝ</translation>
<translation id="7457942297256758195">ሁሉንም አጽዳ</translation>
<translation id="822618367988303761">ከ<ph name="NUMBER_TWO"/> ቀናት በፊት</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> ደቂቃ</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> ፔባ/ሰ</translation>
<translation id="2743387203779672305">ወደ ቅንጥብ ሰሌዳ ገልብጥ</translation>
<translation id="8371695176452482769">አሁን ይናገሩ</translation>
+<translation id="1167268268675672572">ወደ የመስመር መጀመሪያ ውሰድ እና ምርጫ ቀይር</translation>
<translation id="6965382102122355670">ይሁን</translation>
<translation id="7850320739366109486">አትረብሽ</translation>
<translation id="6978839998405419496">ከ<ph name="NUMBER_ZERO"/> ቀን በፊት</translation>
diff --git a/ui/base/strings/ui_strings_ar.xtb b/ui/base/strings/ui_strings_ar.xtb
index 4f384be59d..db81eaf4d0 100644
--- a/ui/base/strings/ui_strings_ar.xtb
+++ b/ui/base/strings/ui_strings_ar.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> بايت</translation>
<translation id="3660179305079774227">مفتاح سهم إلى أعلى</translation>
+<translation id="3969863827134279083">تحريك لأعلى</translation>
<translation id="7062130397825382308">يتبقى <ph name="NUMBER_ONE"/> ثانية</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> ميغابايات/ثانية</translation>
<translation id="5608669887400696928">عدد الساعات: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="3990502903496589789">الحافة اليسرى</translation>
<translation id="9038489124413477075">مجلد بدون اسم</translation>
+<translation id="1940483897317142625">حذف إلى نهاية السطر</translation>
<translation id="8507996248087185956">عدد الدقائق: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="3520476450377425184">عدد الأيام المتبقيّة <ph name="NUMBER_MANY"/></translation>
<translation id="932327136139879170">الصفحة الرئيسية</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">قبل <ph name="NUMBER_FEW"/> يوم</translation>
<translation id="5076340679995252485">ل&amp;صق</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> تيرابايت</translation>
+<translation id="7139614227326422685">الانتقال كلمة يمينًا</translation>
<translation id="364720409959344976">حدد مجلدًا للتحميل</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">قبل <ph name="NUMBER_TWO"/> دقيقة</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">إغلاق الإشعار</translation>
<translation id="6364916375976753737">التمرير إلى اليمين</translation>
<translation id="2629089419211541119">قبل <ph name="NUMBER_ONE"/> ساعة</translation>
+<translation id="4218160142017529598">حذف للخلف</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> دقيقة</translation>
<translation id="6982279413068714821">قبل <ph name="NUMBER_DEFAULT"/> دقيقة</translation>
<translation id="6945221475159498467">تحديد</translation>
<translation id="6620110761915583480">حفظ الملف</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> بلا ثوانٍ</translation>
+<translation id="8924469368910458384">حذف إلى بداية السطر</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> ساعة</translation>
<translation id="7836361698254323868">عدد الدقائق المتبقية: <ph name="NUMBER_ONE"/></translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> دقيقة</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> يومًا</translation>
<translation id="7163503212501929773">عدد الساعات المتبقية: <ph name="NUMBER_MANY"/></translation>
<translation id="5329858601952122676">&amp;حذف</translation>
+<translation id="6556866813142980365">إعادة</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> ثانية</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> كيلوبايت</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> دقيقة</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412">دقيقتان (<ph name="NUMBER_TWO"/>)</translation>
<translation id="50960180632766478">عدد الدقائق المتبقية: <ph name="NUMBER_FEW"/></translation>
<translation id="5517291721709019259">يتبقى <ph name="NUMBER_FEW"/> ثواني</translation>
+<translation id="6903282483217634857">الانتقال يمينًا</translation>
<translation id="6659594942844771486">علامة تبويب</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> ميغابايت</translation>
<translation id="4988273303304146523">قبل <ph name="NUMBER_DEFAULT"/> يوم</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773">عدد الدقائق: <ph name="NUMBER_TWO"/></translation>
<translation id="5149131957118398098">متبقٍ <ph name="NUMBER_ZERO"/> ساعة</translation>
<translation id="7135556860107312402">السماح بالإشعارات من الجهات التالية:</translation>
+<translation id="2479520428668657293">الانتقال يمينًا وتعديل التحديد</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ساعات</translation>
<translation id="1398853756734560583">تكبير</translation>
<translation id="4250229828105606438">لقطة شاشة</translation>
<translation id="6690744523875189208">عدد الساعات: <ph name="NUMBER_TWO"/></translation>
<translation id="5260878308685146029">عدد الدقائق المتبقية: <ph name="NUMBER_TWO"/></translation>
+<translation id="2557207087669398617">الانتقال إلى بداية السطر</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> غيغابايت</translation>
<translation id="1901303067676059328">تح&amp;ديد الكلّ</translation>
<translation id="2168039046890040389">صفحة إلى أعلى</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> دقيقة</translation>
<translation id="9107059250669762581">عدد الأيام <ph name="NUMBER_DEFAULT"/></translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> دقيقة</translation>
+<translation id="6122334925474904337">الانتقال كلمة يمينًا وتعديل التحديد</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> دقيقة واحدة</translation>
<translation id="8448317557906454022">قبل <ph name="NUMBER_ZERO"/> ثانية</translation>
<translation id="4927753642311223124">ليس هناك شيء تراه هنا، انتقل إلى مكان آخر.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> يوم</translation>
<translation id="3183922693828471536">التمرير إلى هنا</translation>
<translation id="4552416320897244156">‏مفتاح PgDwn (صفحة إلى أسفل)</translation>
+<translation id="3066573403916685335">الانتقال لأسفل</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ساعة</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> كيلوبايت/ثانية</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">عدد الساعات المتبقية: <ph name="NUMBER_ONE"/></translation>
<translation id="1413622004203049571">تعطيل الإشعارات من <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">أعلى</translation>
+<translation id="2538759511191347839">الانتقال إلى نهاية السطر وتعديل التحديد</translation>
+<translation id="928465423150706909">الانتقال إلى نهاية السطر</translation>
<translation id="8331626408530291785">التمرير إلى أعلى</translation>
<translation id="7907591526440419938">فتح ملف</translation>
<translation id="2864069933652346933">متبقٍ <ph name="NUMBER_ZERO"/> يوم</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">إيقاف الوسائط</translation>
<translation id="1308727876662951186">متبقٍ <ph name="NUMBER_ZERO"/> دقيقة</translation>
<translation id="3157931365184549694">استعادة</translation>
+<translation id="5349525451964472598">الانتقال ي</translation>
+<translation id="1781701194097416995">الانتقال كلمة يسارًا</translation>
<translation id="1243314992276662751">تحميل</translation>
<translation id="50030952220075532">عدد الأيام المتبقية <ph name="NUMBER_ONE"/></translation>
<translation id="8179976553408161302">تفضل</translation>
+<translation id="8471049483003785219">الانتقال كلمة يسارًا وتعديل التحديد</translation>
<translation id="945522503751344254">إرسال تعليقات</translation>
<translation id="9170848237812810038">&amp;إلغاء</translation>
<translation id="1285266685456062655">قبل <ph name="NUMBER_FEW"/> ساعة</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350">قبل <ph name="NUMBER_ZERO"/> ساعة</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> غيغابايت/ثانية</translation>
<translation id="6644971472240498405">عدد الأيام <ph name="NUMBER_ONE"/></translation>
+<translation id="2704295676501803339">الانتقال يسارًا</translation>
<translation id="9098468523912235228">قبل <ph name="NUMBER_DEFAULT"/> ثانية</translation>
<translation id="494645311413743213">عدد الثواني المتبقية: <ph name="NUMBER_TWO"/></translation>
<translation id="4570886800634958009">توسيع الإشعار</translation>
+<translation id="566737009157135450">حذف كلمة للخلف</translation>
<translation id="436869212180315161">اضغط</translation>
<translation id="4860787810836767172">قبل <ph name="NUMBER_FEW"/> ثانية</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> تيرابايت/ثانية</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">قبل <ph name="NUMBER_MANY"/> دقيقة</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> بايت/ثانية</translation>
<translation id="7649070708921625228">مساعدة</translation>
+<translation id="2405367043325750948">حذف للأمام</translation>
<translation id="6699343763173986273">المقطع الصوتي التالي للوسائط</translation>
<translation id="5445120697129764393">يتبقى <ph name="NUMBER_DEFAULT"/> ثانية</translation>
<translation id="8226233771743600312">الرجاء عدم الإزعاج لمدة يوم واحد</translation>
+<translation id="4252565523989510616">حذف كلمة للأمام</translation>
<translation id="7457942297256758195">محو الكل</translation>
<translation id="822618367988303761">قبل <ph name="NUMBER_TWO"/> يوم</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> دقيقة</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> بيتابايت/ثانية</translation>
<translation id="2743387203779672305">نسخ إلى الحافظة</translation>
<translation id="8371695176452482769">تحدث الآن</translation>
+<translation id="1167268268675672572">الانتقال إلى بداية السطر وتعديل التحديد</translation>
<translation id="6965382102122355670">موافق</translation>
<translation id="7850320739366109486">الرجاء عدم الإزعاج</translation>
<translation id="6978839998405419496">قبل <ph name="NUMBER_ZERO"/> يوم</translation>
diff --git a/ui/base/strings/ui_strings_bg.xtb b/ui/base/strings/ui_strings_bg.xtb
index 1f4e8d9163..caaf7a5c69 100644
--- a/ui/base/strings/ui_strings_bg.xtb
+++ b/ui/base/strings/ui_strings_bg.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> Б</translation>
<translation id="3660179305079774227">Стрелка нагоре</translation>
+<translation id="3969863827134279083">Преместване нагоре</translation>
<translation id="7062130397825382308">Остава <ph name="NUMBER_ONE"/> секунда</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> МБ/сек</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> часа</translation>
<translation id="3990502903496589789">Десн край</translation>
<translation id="9038489124413477075">Папка без име</translation>
+<translation id="1940483897317142625">Изтриване до края на реда</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> мин</translation>
<translation id="3520476450377425184">Остават <ph name="NUMBER_MANY"/> дни</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">преди <ph name="NUMBER_FEW"/> дни</translation>
<translation id="5076340679995252485">&amp;Поставяне</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> ТБ</translation>
+<translation id="7139614227326422685">Преместване надясно с една дума</translation>
<translation id="364720409959344976">Избиране на папка за качване</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">преди <ph name="NUMBER_TWO"/> мин</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Затваряне на известието</translation>
<translation id="6364916375976753737">Превъртане наляво</translation>
<translation id="2629089419211541119">преди <ph name="NUMBER_ONE"/> час/а</translation>
+<translation id="4218160142017529598">Изтриване назад</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> минути</translation>
<translation id="6982279413068714821">преди <ph name="NUMBER_DEFAULT"/> мин</translation>
<translation id="6945221475159498467">Изберете</translation>
<translation id="6620110761915583480">Запазване на файл</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> секунди</translation>
+<translation id="8924469368910458384">Изтриване до началото на реда</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Остава <ph name="NUMBER_ONE"/> минута</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> мин</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> дни</translation>
<translation id="7163503212501929773">Остават <ph name="NUMBER_MANY"/> часа</translation>
<translation id="5329858601952122676">&amp;Изтриване</translation>
+<translation id="6556866813142980365">Възстановяване</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> сек</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KБ</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> минути</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> минути</translation>
<translation id="50960180632766478">Остават <ph name="NUMBER_FEW"/> мин</translation>
<translation id="5517291721709019259">Остават <ph name="NUMBER_FEW"/> секунди</translation>
+<translation id="6903282483217634857">Преместване надясно</translation>
<translation id="6659594942844771486">Раздел</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> МБ</translation>
<translation id="4988273303304146523">преди <ph name="NUMBER_DEFAULT"/> дни</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> мин</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Разрешаване на известията от следните неща:</translation>
+<translation id="2479520428668657293">Преместване надясно и промяна на избраното</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> часа</translation>
<translation id="1398853756734560583">Увеличаване</translation>
<translation id="4250229828105606438">Eкранна снимка</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> часа</translation>
<translation id="5260878308685146029">Остават <ph name="NUMBER_TWO"/> мин</translation>
+<translation id="2557207087669398617">Преместване до началото на реда</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> ГБ</translation>
<translation id="1901303067676059328">&amp;Избиране на всички</translation>
<translation id="2168039046890040389">Страница нагоре</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> дни</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> мин</translation>
+<translation id="6122334925474904337">Преместване надясно с една дума и промяна на избраното</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> минута</translation>
<translation id="8448317557906454022">преди <ph name="NUMBER_ZERO"/> сек</translation>
<translation id="4927753642311223124">Тук няма нищо, продължете нататък.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Превъртане до тук</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Преместване надолу</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> часа</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> КБ/сек</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">Остава <ph name="NUMBER_ONE"/> час</translation>
<translation id="1413622004203049571">Деактивиране на известията от <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Най-горе</translation>
+<translation id="2538759511191347839">Преместване до края на реда и промяна на избраното</translation>
+<translation id="928465423150706909">Преместване до края на реда</translation>
<translation id="8331626408530291785">Превъртане нагоре</translation>
<translation id="7907591526440419938">Отваряне на файл</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Мултимедия, стоп</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Възстановяване</translation>
+<translation id="5349525451964472598">Преместване наляво и промяна на избраното</translation>
+<translation id="1781701194097416995">Преместване наляво с една дума</translation>
<translation id="1243314992276662751">Качване</translation>
<translation id="50030952220075532">Остава <ph name="NUMBER_ONE"/> ден</translation>
<translation id="8179976553408161302">Влизане</translation>
+<translation id="8471049483003785219">Преместване наляво с една дума и промяна на избраното</translation>
<translation id="945522503751344254">Изпращане на отзиви</translation>
<translation id="9170848237812810038">&amp;Отмяна</translation>
<translation id="1285266685456062655">преди <ph name="NUMBER_FEW"/> часа</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> ГБ/сек</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> ден</translation>
+<translation id="2704295676501803339">Преместване наляво</translation>
<translation id="9098468523912235228">преди <ph name="NUMBER_DEFAULT"/> сек</translation>
<translation id="494645311413743213">Остават <ph name="NUMBER_TWO"/> сек</translation>
<translation id="4570886800634958009">Разгъване на известието</translation>
+<translation id="566737009157135450">Изтриване назад дума по дума</translation>
<translation id="436869212180315161">Натиснете</translation>
<translation id="4860787810836767172">преди <ph name="NUMBER_FEW"/> сек</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> ТБ/сек</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">преди <ph name="NUMBER_MANY"/> мин</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> Б/сек</translation>
<translation id="7649070708921625228">Помощ</translation>
+<translation id="2405367043325750948">Изтриване напред</translation>
<translation id="6699343763173986273">Мултимедия, следващият запис</translation>
<translation id="5445120697129764393">Остават <ph name="NUMBER_DEFAULT"/> секунди</translation>
<translation id="8226233771743600312">Не безпокойте за един ден</translation>
+<translation id="4252565523989510616">Изтриване напред дума по дума</translation>
<translation id="7457942297256758195">Изчистване на всички</translation>
<translation id="822618367988303761">преди <ph name="NUMBER_TWO"/> дни</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> мин</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> ПБ/сек</translation>
<translation id="2743387203779672305">Копиране в буферната памет</translation>
<translation id="8371695176452482769">Говорете сега</translation>
+<translation id="1167268268675672572">Преместване до началото на реда и промяна на избраното</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Не безпокойте</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_bn.xtb b/ui/base/strings/ui_strings_bn.xtb
index 7a70c1a297..329030547b 100644
--- a/ui/base/strings/ui_strings_bn.xtb
+++ b/ui/base/strings/ui_strings_bn.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Up Arrow</translation>
+<translation id="3969863827134279083">উপরে যান</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> সেকেন্ড বাকি</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ঘন্টা</translation>
<translation id="3990502903496589789">ডান প্রান্ত</translation>
<translation id="9038489124413477075">নামবিহীন ফোল্ডার</translation>
+<translation id="1940483897317142625">লাইনের শেষ পর্যন্ত মুছে ফেলুন</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> মিনিট</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> দিন বাকি</translation>
<translation id="932327136139879170">হোম</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;প্রতিলেপন</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">ডানদিকে শব্দ সরান</translation>
<translation id="364720409959344976">আপলোড করার জন্য ফোল্ডার নির্বাচন করুন</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">বিজ্ঞপ্তি বন্ধ করা হয়েছে</translation>
<translation id="6364916375976753737">বাম দিকে স্ক্রোল করুন</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation>
+<translation id="4218160142017529598">পিছনের দিকে মুছুন</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> মিনিট</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> মিনিট আগে</translation>
<translation id="6945221475159498467">নির্বাচন</translation>
<translation id="6620110761915583480">ফাইল সংরক্ষণ করুন</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> সেকেন্ড</translation>
+<translation id="8924469368910458384">লাইনের শুরু পর্যন্ত মুছে ফেলুন</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> মিনিট বাকি</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> মিনিট</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> দিন</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ঘন্টা বাকি</translation>
<translation id="5329858601952122676">&amp;মুছুন</translation>
+<translation id="6556866813142980365">পুনরায় করুন</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> সেকেন্ড</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> মিনিট</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> মিনিট</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> মিনিট বাকি</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> সেকেন্ড বাকি</translation>
+<translation id="6903282483217634857">ডানদিকে সরান</translation>
<translation id="6659594942844771486">ট্যাব</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> দিন আগে</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> মিনিট</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">নিম্নলিখিত থেকে বিজ্ঞপ্তিগুলি মঞ্জুরি করুন:</translation>
+<translation id="2479520428668657293">ডানদিকে সরান এবং নির্বাচন পরিবর্তন করুন</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ঘন্টা</translation>
<translation id="1398853756734560583">বড় করুন</translation>
<translation id="4250229828105606438">স্ক্রীনশট</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ঘন্টা</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> মিনিট বাকি</translation>
+<translation id="2557207087669398617">লাইনের শুরু পর্যন্ত সরান</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">&amp;সকল নির্বাচন করুন</translation>
<translation id="2168039046890040389">পৃষ্ঠা নীচে</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> দিন</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> মিনিট</translation>
+<translation id="6122334925474904337">শব্দকে ডানদিকে সরান এবং নির্বাচন পরিবর্তন করুন</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> মিনিট</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">এখানে দেখার কিছু নেই , এগিয়ে যান৷</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">এখান পর্যন্ত স্ক্রোল করুন</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">নীচে যান</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ঘন্টা</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ঘন্টা বাকি</translation>
<translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> এর থেকে বিজ্ঞপ্তিগুলি অক্ষম করুন</translation>
<translation id="2666092431469916601">শীর্ষ</translation>
+<translation id="2538759511191347839">লাইনের শেষ অবধি সরান এবং নির্বাচন পরিবর্তন করুন</translation>
+<translation id="928465423150706909">লাইনের শেষ পর্যন্ত সরান</translation>
<translation id="8331626408530291785">উপরে স্ক্রোল করুন</translation>
<translation id="7907591526440419938">খোলা ফাইল</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">মিডিয়া থামান</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">পুনরুদ্ধার করুন</translation>
+<translation id="5349525451964472598">বামদিকে সরান এবং নির্বাচন পরিবর্তন করুন</translation>
+<translation id="1781701194097416995">শব্দকে বামদিকে সরান</translation>
<translation id="1243314992276662751">আপলোড</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> দিন বাকি</translation>
<translation id="8179976553408161302">প্রবেশ করুন</translation>
+<translation id="8471049483003785219">শব্দকে বামদিকে সরান এবং নির্বাচন পরিবর্তন করুন</translation>
<translation id="945522503751344254">প্রতিক্রিয়া প্রেরণ করুন</translation>
<translation id="9170848237812810038">&amp;পূর্বাবস্থায় ফিরুন</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> দিন</translation>
+<translation id="2704295676501803339">বামদিকে সরান</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> সেকেন্ড আগে</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> সেকেন্ড বাকি</translation>
<translation id="4570886800634958009">বিজ্ঞপ্তি প্রসারিত করুন</translation>
+<translation id="566737009157135450">পিছনের দিকে শব্দকে মুছুন</translation>
<translation id="436869212180315161">টিপুন</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">সহায়তা</translation>
+<translation id="2405367043325750948">সামনের দিকে মুছুন</translation>
<translation id="6699343763173986273">মিডিয়া পরবর্তী ট্র্যাক</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> সেকেন্ড বাকি</translation>
<translation id="8226233771743600312">এক দিনের জন্য বিরক্ত করবেন না</translation>
+<translation id="4252565523989510616">শব্দকে সামনের দিকে মুছুন</translation>
<translation id="7457942297256758195">সমস্ত সাফ করুন</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> মিনিট</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">ক্লিপবোর্ডে অনুলিপি করুন</translation>
<translation id="8371695176452482769">এখনই বলুন</translation>
+<translation id="1167268268675672572">লাইনের শুরু পর্যন্ত সরান এবং নির্বাচন পরিবর্তন করুন</translation>
<translation id="6965382102122355670">ওকে</translation>
<translation id="7850320739366109486">বিরক্ত করবেন না</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_ca.xtb b/ui/base/strings/ui_strings_ca.xtb
index a373c758fe..5a7f04968d 100644
--- a/ui/base/strings/ui_strings_ca.xtb
+++ b/ui/base/strings/ui_strings_ca.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Fletxa amunt</translation>
+<translation id="3969863827134279083">Mou cap amunt</translation>
<translation id="7062130397825382308">Queda <ph name="NUMBER_ONE"/> segon.</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> hores</translation>
<translation id="3990502903496589789">Extrem dret</translation>
<translation id="9038489124413477075">Carpeta sense nom</translation>
+<translation id="1940483897317142625">Suprimeix fins al final de la línia</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minuts</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dies restants</translation>
<translation id="932327136139879170">Inici</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">Fa <ph name="NUMBER_FEW"/> dies</translation>
<translation id="5076340679995252485">Engan&amp;xa</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Mou la paraula a la dreta</translation>
<translation id="364720409959344976">Selecció d'una carpeta per penjar</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">Fa <ph name="NUMBER_TWO"/> minuts</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Tanca la notificació</translation>
<translation id="6364916375976753737">Desplaçament a l'esquerra</translation>
<translation id="2629089419211541119">Fa <ph name="NUMBER_ONE"/> hora</translation>
+<translation id="4218160142017529598">Suprimeix cap enrere</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuts</translation>
<translation id="6982279413068714821">Fa <ph name="NUMBER_DEFAULT"/> minuts</translation>
<translation id="6945221475159498467">Selecciona</translation>
<translation id="6620110761915583480">Desa el fitxer</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> segons</translation>
+<translation id="8924469368910458384">Suprimeix fins al començament de la línia</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Queda <ph name="NUMBER_ONE"/> minut</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minut</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dies</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> hores restants</translation>
<translation id="5329858601952122676">&amp;Suprimeix</translation>
+<translation id="6556866813142980365">Refés</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> segons</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minuts</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuts</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minuts restants</translation>
<translation id="5517291721709019259">Queden <ph name="NUMBER_FEW"/> segons</translation>
+<translation id="6903282483217634857">Mou a la dreta</translation>
<translation id="6659594942844771486">Pestanya</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">Fa <ph name="NUMBER_DEFAULT"/> dies</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minuts</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Permet notificacions de les fonts següents:</translation>
+<translation id="2479520428668657293">Mou a la dreta i modifica la selecció</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> hores</translation>
<translation id="1398853756734560583">Maximitza</translation>
<translation id="4250229828105606438">Captura de pantalla</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> hores</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minuts restants</translation>
+<translation id="2557207087669398617">Mou al començament de la línia</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Selecciona-ho &amp;tot</translation>
<translation id="2168039046890040389">Re Pàg</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dies</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minuts</translation>
+<translation id="6122334925474904337">Mou la paraula a la dreta i modifica la selecció</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minut</translation>
<translation id="8448317557906454022">Fa <ph name="NUMBER_ZERO"/> segons</translation>
<translation id="4927753642311223124">No hi ha cap notificació, podeu continuar.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Desplaçament fins aquí</translation>
<translation id="4552416320897244156">Av Pàg</translation>
+<translation id="3066573403916685335">Mou cap avall</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hores</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hores restants</translation>
<translation id="1413622004203049571">Desactiva les notificacions de <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Superior</translation>
+<translation id="2538759511191347839">Mou al final de la línia i modifica la selecció</translation>
+<translation id="928465423150706909">Mou al final de la línia</translation>
<translation id="8331626408530291785">Desplaçament amunt</translation>
<translation id="7907591526440419938">Obre un fitxer</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Fitxer multimèdia: atura</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restaura</translation>
+<translation id="5349525451964472598">Mou a l'esquerra i modifica la selecció</translation>
+<translation id="1781701194097416995">Mou la paraula a l'esquerra</translation>
<translation id="1243314992276662751">Penja</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dia restant</translation>
<translation id="8179976553408161302">Intro</translation>
+<translation id="8471049483003785219">Mou la paraula a l'esquerra i modifica la selecció</translation>
<translation id="945522503751344254">Envia comentaris</translation>
<translation id="9170848237812810038">&amp;Desfés</translation>
<translation id="1285266685456062655">Fa <ph name="NUMBER_FEW"/> hores</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dia</translation>
+<translation id="2704295676501803339">Mou a l'esquerra</translation>
<translation id="9098468523912235228">Fa <ph name="NUMBER_DEFAULT"/> segons</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> segons restants</translation>
<translation id="4570886800634958009">Amplia la notificació</translation>
+<translation id="566737009157135450">Suprimeix la paraula cap enrere</translation>
<translation id="436869212180315161">Prem</translation>
<translation id="4860787810836767172">Fa <ph name="NUMBER_FEW"/> segons</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">Fa <ph name="NUMBER_MANY"/> minuts</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Ajuda</translation>
+<translation id="2405367043325750948">Suprimeix cap endavant</translation>
<translation id="6699343763173986273">Fitxer multimèdia: pista següent</translation>
<translation id="5445120697129764393">Queden <ph name="NUMBER_DEFAULT"/> segons.</translation>
<translation id="8226233771743600312">No molesteu durant un dia</translation>
+<translation id="4252565523989510616">Suprimeix la paraula cap endavant</translation>
<translation id="7457942297256758195">Esborra-ho tot</translation>
<translation id="822618367988303761">Fa <ph name="NUMBER_TWO"/> dies</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minuts</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Copia al porta-retalls</translation>
<translation id="8371695176452482769">Parleu ara</translation>
+<translation id="1167268268675672572">Mou al començament de la línia i modifica la selecció</translation>
<translation id="6965382102122355670">D'acord</translation>
<translation id="7850320739366109486">No molesteu</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_cs.xtb b/ui/base/strings/ui_strings_cs.xtb
index e26b1f2667..ece04e7fcf 100644
--- a/ui/base/strings/ui_strings_cs.xtb
+++ b/ui/base/strings/ui_strings_cs.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Klávesa šipka nahoru</translation>
+<translation id="3969863827134279083">Přesunout nahoru</translation>
<translation id="7062130397825382308">Zbývá <ph name="NUMBER_ONE"/> sekunda</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> hod</translation>
<translation id="3990502903496589789">Pravý okraj</translation>
<translation id="9038489124413477075">Nepojmenovaná složka</translation>
+<translation id="1940483897317142625">Smazat do konce řádku</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minut</translation>
<translation id="3520476450377425184">Zbývá: <ph name="NUMBER_MANY"/> dnů</translation>
<translation id="932327136139879170">Domů</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">Před <ph name="NUMBER_FEW"/> dny</translation>
<translation id="5076340679995252485">Vložit</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Přesunout slovo doprava</translation>
<translation id="364720409959344976">Vyberte složku pro nahrávání</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Zavřít oznámení</translation>
<translation id="6364916375976753737">Posuv doleva</translation>
<translation id="2629089419211541119">Před <ph name="NUMBER_ONE"/> hodinou</translation>
+<translation id="4218160142017529598">Smazat zpět</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> min</translation>
<translation id="6982279413068714821">před <ph name="NUMBER_DEFAULT"/> minutami</translation>
<translation id="6945221475159498467">Vybrat</translation>
<translation id="6620110761915583480">Uložit soubor</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> s</translation>
+<translation id="8924469368910458384">Smazat k začátku řádku</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Zbývá <ph name="NUMBER_ONE"/> minuta</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dnů</translation>
<translation id="7163503212501929773">Zbývá: <ph name="NUMBER_MANY"/> hod</translation>
<translation id="5329858601952122676">&amp;Smazat</translation>
+<translation id="6556866813142980365">Opakovat</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> s</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> min</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> min</translation>
<translation id="50960180632766478">Zbývá: <ph name="NUMBER_FEW"/> min</translation>
<translation id="5517291721709019259">Zbývají <ph name="NUMBER_FEW"/> sekundy</translation>
+<translation id="6903282483217634857">Přesunout doprava</translation>
<translation id="6659594942844771486">Karta</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">Před <ph name="NUMBER_DEFAULT"/> dny</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> min</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Povolit oznámení z následujících zdrojů:</translation>
+<translation id="2479520428668657293">Přesunout doprava a změnit výběr</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> hod</translation>
<translation id="1398853756734560583">Maximalizovat</translation>
<translation id="4250229828105606438">Snímek obrazovky</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> hod</translation>
<translation id="5260878308685146029">Zbývá: <ph name="NUMBER_TWO"/> min</translation>
+<translation id="2557207087669398617">Přesunout na začátek řádku</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">&amp;Vybrat vše</translation>
<translation id="2168039046890040389">Klávesa PageUp</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dnů</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> min</translation>
+<translation id="6122334925474904337">Přesunout slovo doprava a změnit výběr</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> min</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Tady není nic k vidění, rozejděte se.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Posunout sem</translation>
<translation id="4552416320897244156">Klávesa PgDwn</translation>
+<translation id="3066573403916685335">Posunout dolů</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hod</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">Zbývá: <ph name="NUMBER_ONE"/> hod</translation>
<translation id="1413622004203049571">Deaktivovat oznámení ze služby <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Nahoru</translation>
+<translation id="2538759511191347839">Přesunout na konec řádku a změnit výběr</translation>
+<translation id="928465423150706909">Přesunout na konec řádku</translation>
<translation id="8331626408530291785">Posuv nahoru</translation>
<translation id="7907591526440419938">Otevřít soubor</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Média – zastavit</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Obnovit</translation>
+<translation id="5349525451964472598">Přesunout doleva a upravit výběr</translation>
+<translation id="1781701194097416995">Přesunout slovo doleva</translation>
<translation id="1243314992276662751">Nahrát</translation>
<translation id="50030952220075532">Zbývá: <ph name="NUMBER_ONE"/> den</translation>
<translation id="8179976553408161302">Začít</translation>
+<translation id="8471049483003785219">Přesunout slovo doleva a upravit výběr</translation>
<translation id="945522503751344254">Odeslat zpětnou vazbu</translation>
<translation id="9170848237812810038">Z&amp;pět</translation>
<translation id="1285266685456062655">Před <ph name="NUMBER_FEW"/> hodinami</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> den</translation>
+<translation id="2704295676501803339">Přesunout doleva</translation>
<translation id="9098468523912235228">Před <ph name="NUMBER_DEFAULT"/> sekundami</translation>
<translation id="494645311413743213">Zbývá: <ph name="NUMBER_TWO"/> s</translation>
<translation id="4570886800634958009">Rozbalit oznámení</translation>
+<translation id="566737009157135450">Smazat slovo zpět</translation>
<translation id="436869212180315161">Tisk</translation>
<translation id="4860787810836767172">Před <ph name="NUMBER_FEW"/> sekundami</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Nápověda</translation>
+<translation id="2405367043325750948">Smazat vpřed</translation>
<translation id="6699343763173986273">Média – další skladba</translation>
<translation id="5445120697129764393">Zbývá <ph name="NUMBER_DEFAULT"/> sekund</translation>
<translation id="8226233771743600312">Nerušit jeden den</translation>
+<translation id="4252565523989510616">Smazat slovo vpřed</translation>
<translation id="7457942297256758195">Vymazat vše</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Zkopírovat do schránky</translation>
<translation id="8371695176452482769">Mluvte</translation>
+<translation id="1167268268675672572">Přesunout na začátek řádku a upravit výběr</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Nerušit</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_da.xtb b/ui/base/strings/ui_strings_da.xtb
index bd4043344a..e5afe75e03 100644
--- a/ui/base/strings/ui_strings_da.xtb
+++ b/ui/base/strings/ui_strings_da.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Pil opad</translation>
+<translation id="3969863827134279083">Flyt op</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> sekund tilbage</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/sek.</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> timer</translation>
<translation id="3990502903496589789">Højre kant</translation>
<translation id="9038489124413477075">Unavngiven mappe</translation>
+<translation id="1940483897317142625">Slet til slutningen af linjen</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutter</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dage tilbage</translation>
<translation id="932327136139879170">Start</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> dage siden</translation>
<translation id="5076340679995252485">&amp;Indsæt</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Flyt til højre efter ordet</translation>
<translation id="364720409959344976">Vælg den mappe, der skal uploades</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> minutter siden</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Luk underretning</translation>
<translation id="6364916375976753737">Scroll Left</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> time siden</translation>
+<translation id="4218160142017529598">Slet bagud</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutter</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minutter siden</translation>
<translation id="6945221475159498467">Vælg</translation>
<translation id="6620110761915583480">Gem fil</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sekunder</translation>
+<translation id="8924469368910458384">Slet til begyndelsen af linjen</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minut tilbage</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min.</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dage</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> timer tilbage</translation>
<translation id="5329858601952122676">&amp;Slet</translation>
+<translation id="6556866813142980365">Gør det igen</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sek.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutter</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutter</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutter tilbage</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> sekunder tilbage</translation>
+<translation id="6903282483217634857">Flyt til højre</translation>
<translation id="6659594942844771486">Fane</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> dage siden</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutter</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Tillad underretninger fra følgende:</translation>
+<translation id="2479520428668657293">Flyt til højre, og rediger markering</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> timer</translation>
<translation id="1398853756734560583">Maksimer</translation>
<translation id="4250229828105606438">Skærmbillede</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> timer</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minutter tilbage</translation>
+<translation id="2557207087669398617">Flyt til begyndelsen af linjen</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Vælg &amp;alle</translation>
<translation id="2168039046890040389">Side op</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dage</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutter</translation>
+<translation id="6122334925474904337">Flyt ordet til højre, og rediger markering</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minut</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> sekunder siden</translation>
<translation id="4927753642311223124">Der er intet at se her, så du kan bare gå videre.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Scroll hertil</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Flyt ned</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> timer</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/sek.</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> timer tilbage</translation>
<translation id="1413622004203049571">Deaktiver underretninger fra <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Top</translation>
+<translation id="2538759511191347839">Flyt til slutningen af ​​linjen, og rediger markering</translation>
+<translation id="928465423150706909">Flyt til slutningen af ​​linjen</translation>
<translation id="8331626408530291785">Scroll Up</translation>
<translation id="7907591526440419938">Åbn fil</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Medie: Stop</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Gendan</translation>
+<translation id="5349525451964472598">Flyt til venstre, og rediger markering</translation>
+<translation id="1781701194097416995">Flyt til venstre efter ordet</translation>
<translation id="1243314992276662751">Upload</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dage tilbage</translation>
<translation id="8179976553408161302">Start</translation>
+<translation id="8471049483003785219">Flyt ord til venstre, og rediger markering</translation>
<translation id="945522503751344254">Send feedback</translation>
<translation id="9170848237812810038">&amp;Fortryd</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> timer siden</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/sek.</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/>dag</translation>
+<translation id="2704295676501803339">Flyt til vestre</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> sekunder siden</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> sek. tilbage</translation>
<translation id="4570886800634958009">Udvid underretning</translation>
+<translation id="566737009157135450">Slet baglæns med et ord</translation>
<translation id="436869212180315161">Tryk</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> sekunder siden</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/sek.</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> minutter siden</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/sek.</translation>
<translation id="7649070708921625228">Hjælp</translation>
+<translation id="2405367043325750948">Slet fremad</translation>
<translation id="6699343763173986273">Medie: Næste nummer</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> sekunder tilbage</translation>
<translation id="8226233771743600312">Vil ikke forstyrres i et døgn</translation>
+<translation id="4252565523989510616">Slet fremad med et ord</translation>
<translation id="7457942297256758195">Ryd alle</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> dage siden</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutter</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/sek.</translation>
<translation id="2743387203779672305">Kopiér til udklipsholderen</translation>
<translation id="8371695176452482769">Indtal nu</translation>
+<translation id="1167268268675672572">Flyt til begyndelsen af linjen, og rediger markering</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Vil ikke forstyrres</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_de.xtb b/ui/base/strings/ui_strings_de.xtb
index 39c0099484..4062ce5716 100644
--- a/ui/base/strings/ui_strings_de.xtb
+++ b/ui/base/strings/ui_strings_de.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Aufwärtspfeil</translation>
+<translation id="3969863827134279083">Nach oben</translation>
<translation id="7062130397825382308">Noch <ph name="NUMBER_ONE"/> Sekunde</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> Stunden</translation>
<translation id="3990502903496589789">Rechter Rand</translation>
<translation id="9038489124413477075">Unbenannter Ordner</translation>
+<translation id="1940483897317142625">Bis zum Zeilenende löschen</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> Minuten</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> Tage übrig</translation>
<translation id="932327136139879170">Startseite</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;Einfügen</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Ein Wort nach rechts</translation>
<translation id="364720409959344976">Ordner zum Hochladen auswählen</translation>
<translation id="4999762576397546063">Strg+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Benachrichtigung schließen</translation>
<translation id="6364916375976753737">Nach links blättern</translation>
<translation id="2629089419211541119">Vor <ph name="NUMBER_ONE"/> Stunde</translation>
+<translation id="4218160142017529598">Letztes Zeichen löschen</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> Minuten</translation>
<translation id="6982279413068714821">Vor <ph name="NUMBER_DEFAULT"/> Minuten</translation>
<translation id="6945221475159498467">Auswählen</translation>
<translation id="6620110761915583480">Datei speichern</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> Sekunden</translation>
+<translation id="8924469368910458384">Bis zum Zeilenanfang löschen</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Noch <ph name="NUMBER_ONE"/> Minute</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> Minute</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> Tage</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> Stunden übrig</translation>
<translation id="5329858601952122676">&amp;Löschen</translation>
+<translation id="6556866813142980365">Wiederholen</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> Sekunden</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> Minuten</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> Minuten</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> Minuten übrig</translation>
<translation id="5517291721709019259">Noch <ph name="NUMBER_FEW"/> Sekunden</translation>
+<translation id="6903282483217634857">Nach rechts</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">Vor <ph name="NUMBER_DEFAULT"/> Tagen</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> Minuten</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Alle Benachrichtigungen zulassen von:</translation>
+<translation id="2479520428668657293">Nach rechts und Auswahl ändern</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> Stunden</translation>
<translation id="1398853756734560583">Vergrößern</translation>
<translation id="4250229828105606438">Screenshot</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> Stunden</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> Minuten übrig</translation>
+<translation id="2557207087669398617">Zum Zeilenanfang</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">&amp;Alles auswählen</translation>
<translation id="2168039046890040389">Nach oben</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> Tage</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> Minuten</translation>
+<translation id="6122334925474904337">Ein Wort nach rechts und Auswahl ändern</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> Minute</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Sie haben keine Benachrichtigungen.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Hierher blättern</translation>
<translation id="4552416320897244156">BildAb</translation>
+<translation id="3066573403916685335">Nach unten</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> Stunden</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> Stunde übrig</translation>
<translation id="1413622004203049571">Benachrichtigungen von <ph name="NOTIFIER_NAME"/> deaktivieren</translation>
<translation id="2666092431469916601">Oben</translation>
+<translation id="2538759511191347839">Zum Zeilenende und Auswahl ändern</translation>
+<translation id="928465423150706909">Zum Zeilenende</translation>
<translation id="8331626408530291785">Nach oben blättern</translation>
<translation id="7907591526440419938">Datei öffnen</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Medien – Stopp</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Wiederherstellen</translation>
+<translation id="5349525451964472598">Nach links und Auswahl ändern</translation>
+<translation id="1781701194097416995">Ein Wort nach links</translation>
<translation id="1243314992276662751">Hochladen</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> Tag übrig</translation>
<translation id="8179976553408161302">Enter</translation>
+<translation id="8471049483003785219">Ein Wort nach links und Auswahl ändern</translation>
<translation id="945522503751344254">Feedback geben</translation>
<translation id="9170848237812810038">&amp;Rückgängig</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> Tag</translation>
+<translation id="2704295676501803339">Nach links</translation>
<translation id="9098468523912235228">Vor <ph name="NUMBER_DEFAULT"/> Sekunden</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> Sekunden übrig</translation>
<translation id="4570886800634958009">Benachrichtigung anzeigen</translation>
+<translation id="566737009157135450">Letztes Wort löschen</translation>
<translation id="436869212180315161">Klicken</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> Byte/s</translation>
<translation id="7649070708921625228">Hilfe</translation>
+<translation id="2405367043325750948">Nächstes Zeichen löschen</translation>
<translation id="6699343763173986273">Medien – nächster Titel</translation>
<translation id="5445120697129764393">Noch <ph name="NUMBER_DEFAULT"/> Sekunden</translation>
<translation id="8226233771743600312">1 Tag nicht stören</translation>
+<translation id="4252565523989510616">Nächstes Wort löschen</translation>
<translation id="7457942297256758195">Alle löschen</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> Minuten</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">In Zwischenablage kopieren</translation>
<translation id="8371695176452482769">Jetzt sprechen</translation>
+<translation id="1167268268675672572">Zum Zeilenanfang und Auswahl ändern</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Nicht stören</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_el.xtb b/ui/base/strings/ui_strings_el.xtb
index c331a60471..ff3650e841 100644
--- a/ui/base/strings/ui_strings_el.xtb
+++ b/ui/base/strings/ui_strings_el.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> Β</translation>
<translation id="3660179305079774227">Πάνω βέλος</translation>
+<translation id="3969863827134279083">Μετακίνηση επάνω</translation>
<translation id="7062130397825382308">Απομένει <ph name="NUMBER_ONE"/> δευτερόλεπτο</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ώρες</translation>
<translation id="3990502903496589789">Δεξιά άκρη</translation>
<translation id="9038489124413477075">Φάκελος χωρίς όνομα</translation>
+<translation id="1940483897317142625">Διαγραφή έως το τέλος της γραμμής</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> λεπτά</translation>
<translation id="3520476450377425184">Υπολείπονται <ph name="NUMBER_MANY"/> ημέρες</translation>
<translation id="932327136139879170">Αρχική σελίδα</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">Πριν από <ph name="NUMBER_FEW"/> ημέρες</translation>
<translation id="5076340679995252485">&amp;Επικόλληση</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Μετακίνηση στην επόμενη λέξη δεξιά</translation>
<translation id="364720409959344976">Επιλέξτε φάκελο για μεταφόρτωση</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">Πριν από <ph name="NUMBER_TWO"/> λεπτά</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Κλείσιμο ειδοποίησης</translation>
<translation id="6364916375976753737">Κύλιση αριστερά</translation>
<translation id="2629089419211541119">Πριν από <ph name="NUMBER_ONE"/> ώρα</translation>
+<translation id="4218160142017529598">Διαγραφή προς τα πίσω</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> λεπτά</translation>
<translation id="6982279413068714821">Πριν από <ph name="NUMBER_DEFAULT"/> λεπτά</translation>
<translation id="6945221475159498467">Επιλογή</translation>
<translation id="6620110761915583480">Αποθήκευση Αρχείου</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> δευτερόλεπτα</translation>
+<translation id="8924469368910458384">Διαγραφή έως την αρχή της γραμμής</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Υπολείπεται <ph name="NUMBER_ONE"/> λεπτό</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> λεπτό</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ημέρες</translation>
<translation id="7163503212501929773">Υπολείπονται <ph name="NUMBER_MANY"/> ώρες</translation>
<translation id="5329858601952122676">&amp;Διαγραφή</translation>
+<translation id="6556866813142980365">Επανάληψη ενέργειας</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> δευτερόλεπτα</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> λεπτά</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> λεπτά</translation>
<translation id="50960180632766478">Υπολείπονται <ph name="NUMBER_FEW"/> λεπτά</translation>
<translation id="5517291721709019259">Απομένουν <ph name="NUMBER_FEW"/> δευτερόλεπτα</translation>
+<translation id="6903282483217634857">Μετακίνηση δεξιά</translation>
<translation id="6659594942844771486">Καρτέλα</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">Πριν από <ph name="NUMBER_DEFAULT"/> ημέρες</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> λεπτά</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Να επιτρέπονται ειδοποιήσεις από:</translation>
+<translation id="2479520428668657293">Μετακίνηση δεξιά και τροποποίηση επιλογής</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ώρες</translation>
<translation id="1398853756734560583">Μεγιστοποίηση</translation>
<translation id="4250229828105606438">Στιγμιότυπο οθόνης</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ώρες</translation>
<translation id="5260878308685146029">Υπολείπονται <ph name="NUMBER_TWO"/> λεπτά</translation>
+<translation id="2557207087669398617">Μετακίνηση στην αρχή της γραμμής</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Επιλογή όλ&amp;ων</translation>
<translation id="2168039046890040389">Προηγούμενη σελίδα</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> ημέρες</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> λεπτά</translation>
+<translation id="6122334925474904337">Μετακίνηση στην επόμενη λέξη δεξιά και τροποποίηση επιλογής</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> λεπτό</translation>
<translation id="8448317557906454022">Πριν από <ph name="NUMBER_ZERO"/> δευτερόλεπτα</translation>
<translation id="4927753642311223124">Δεν υπάρχει τίποτα να δείτε εδώ, συνεχίστε με αυτό που κάνατε.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Κύλιση εδώ</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Μετακίνηση κάτω</translation>
<translation id="7052633198403197513">Πλήκτρο F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ώρες</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">Υπολείπεται <ph name="NUMBER_ONE"/> ώρα</translation>
<translation id="1413622004203049571">Απενεργοποίηση ειδοποιήσεων από <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Κορυφή</translation>
+<translation id="2538759511191347839">Μετακίνηση στο τέλος της γραμμής και τροποποίηση επιλογής</translation>
+<translation id="928465423150706909">Μετακίνηση στο τέλος της γραμμής</translation>
<translation id="8331626408530291785">Κύλιση επάνω</translation>
<translation id="7907591526440419938">Άνοιγμα Αρχείου</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Διακοπή πολυμέσων</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Επαναφορά</translation>
+<translation id="5349525451964472598">Μετακίνηση αριστερά και τροποποίηση επιλογής</translation>
+<translation id="1781701194097416995">Μετακίνηση στην προηγούμενη λέξη προς τα αριστερά</translation>
<translation id="1243314992276662751">Μεταφόρτωση</translation>
<translation id="50030952220075532">Υπολείπεται <ph name="NUMBER_ONE"/> ημέρα</translation>
<translation id="8179976553408161302">Είσοδος</translation>
+<translation id="8471049483003785219">Μετακίνηση στην προηγούμενη λέξη προς τα αριστερά και τροποποίηση επιλογής</translation>
<translation id="945522503751344254">Αποστολή σχολίων</translation>
<translation id="9170848237812810038">Αναί&amp;ρεση</translation>
<translation id="1285266685456062655">Πριν από <ph name="NUMBER_FEW"/> ώρες</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> ημέρα</translation>
+<translation id="2704295676501803339">Μετακίνηση αριστερά</translation>
<translation id="9098468523912235228">Πριν από <ph name="NUMBER_DEFAULT"/> δευτερόλεπτα</translation>
<translation id="494645311413743213">Υπολείπονται <ph name="NUMBER_TWO"/> δευτερόλεπτα</translation>
<translation id="4570886800634958009">Επέκταση ειδοποίησης</translation>
+<translation id="566737009157135450">Διαγραφή λέξης προς τα πίσω</translation>
<translation id="436869212180315161">Πιέστε</translation>
<translation id="4860787810836767172">Πριν από <ph name="NUMBER_FEW"/> δευτερόλεπτα</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">Πριν από <ph name="NUMBER_MANY"/> λεπτά</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Βοήθεια</translation>
+<translation id="2405367043325750948">Διαγραφή προς τα εμπρός</translation>
<translation id="6699343763173986273">Επόμενο κομμάτι πολυμέσων</translation>
<translation id="5445120697129764393">Απομένουν <ph name="NUMBER_DEFAULT"/> δευτερόλεπτα</translation>
<translation id="8226233771743600312">Μην ενοχλείτε για μία ημέρα</translation>
+<translation id="4252565523989510616">Διαγραφή επόμενης λέξης προς τα εμπρός</translation>
<translation id="7457942297256758195">Εκκαθάριση όλων</translation>
<translation id="822618367988303761">Πριν από <ph name="NUMBER_TWO"/> ημέρες</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> λεπτά</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Αντιγραφή στο πρόχειρο</translation>
<translation id="8371695176452482769">Μιλήστε τώρα</translation>
+<translation id="1167268268675672572">Μετακίνηση στην αρχή της γραμμής και τροποποίηση επιλογής</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Μην ενοχλείτε</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_en-GB.xtb b/ui/base/strings/ui_strings_en-GB.xtb
index cb6de0b90a..5c5aa58e87 100644
--- a/ui/base/strings/ui_strings_en-GB.xtb
+++ b/ui/base/strings/ui_strings_en-GB.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Up Arrow</translation>
+<translation id="3969863827134279083">Move Up</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> second left</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> hours</translation>
<translation id="3990502903496589789">Right Edge</translation>
<translation id="9038489124413477075">Unnamed Folder</translation>
+<translation id="1940483897317142625">Delete To End Of Line</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> mins</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;Paste</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Move Word Right</translation>
<translation id="364720409959344976">Select Folder to Upload</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Notification close</translation>
<translation id="6364916375976753737">Scroll Left</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation>
+<translation id="4218160142017529598">Delete Backward</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutes</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation>
<translation id="6945221475159498467">Select</translation>
<translation id="6620110761915583480">Save File</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation>
+<translation id="8924469368910458384">Delete To Beginning Of Line</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minute left</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> days</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> hours left</translation>
<translation id="5329858601952122676">&amp;Delete</translation>
+<translation id="6556866813142980365">Redo</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> mins left</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">Move Right</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> mins</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Allow notifications from the following:</translation>
+<translation id="2479520428668657293">Move Right And Modify Selection</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> hours</translation>
<translation id="1398853756734560583">Maximise</translation>
<translation id="4250229828105606438">Screenshot</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> hours</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> mins left</translation>
+<translation id="2557207087669398617">Move To Beginning Of Line</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Select &amp;all</translation>
<translation id="2168039046890040389">Page Up</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> days</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mins</translation>
+<translation id="6122334925474904337">Move Word Right And Modify Selection</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minute</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Nothing to see here, move along.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Scroll to Here</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Move Down</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hours</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hour left</translation>
<translation id="1413622004203049571">Disable notifications from <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Top</translation>
+<translation id="2538759511191347839">Move To End Of Line And Modify Selection</translation>
+<translation id="928465423150706909">Move To End Of Line</translation>
<translation id="8331626408530291785">Scroll Up</translation>
<translation id="7907591526440419938">Open File</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Media Stop</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restore</translation>
+<translation id="5349525451964472598">Move Left And Modify Selection</translation>
+<translation id="1781701194097416995">Move Word Left</translation>
<translation id="1243314992276662751">Upload</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> day left</translation>
<translation id="8179976553408161302">Enter</translation>
+<translation id="8471049483003785219">Move Word Left And Modify Selection</translation>
<translation id="945522503751344254">Send feedback</translation>
<translation id="9170848237812810038">&amp;Undo</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> day</translation>
+<translation id="2704295676501803339">Move Left</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation>
<translation id="4570886800634958009">Notification expand</translation>
+<translation id="566737009157135450">Delete Word Backward</translation>
<translation id="436869212180315161">Press</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Help</translation>
+<translation id="2405367043325750948">Delete Forward</translation>
<translation id="6699343763173986273">Media Next Track</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> seconds left</translation>
<translation id="8226233771743600312">Do not disturb for one day</translation>
+<translation id="4252565523989510616">Delete Word Forward</translation>
<translation id="7457942297256758195">Clear All</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mins</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Copy to clipboard</translation>
<translation id="8371695176452482769">Speak now</translation>
+<translation id="1167268268675672572">Move To Beginning Of Line And Modify Selection</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Do Not Disturb</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_es-419.xtb b/ui/base/strings/ui_strings_es-419.xtb
index 79b04ffe29..903cb8ccb1 100644
--- a/ui/base/strings/ui_strings_es-419.xtb
+++ b/ui/base/strings/ui_strings_es-419.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Flecha arriba</translation>
+<translation id="3969863827134279083">Subir</translation>
<translation id="7062130397825382308">Falta <ph name="NUMBER_ONE"/> segundo.</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> de MB</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> horas</translation>
<translation id="3990502903496589789">Borde derecho</translation>
<translation id="9038489124413477075">Carpeta sin nombre</translation>
+<translation id="1940483897317142625">Eliminar hasta el final de la línea</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutos</translation>
<translation id="3520476450377425184">Faltan <ph name="NUMBER_MANY"/> días</translation>
<translation id="932327136139879170">Inicio</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">Hace <ph name="NUMBER_FEW"/> días</translation>
<translation id="5076340679995252485">&amp;Pegar</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Mover una palabra a la derecha</translation>
<translation id="364720409959344976">Seleccionar carpeta para cargar</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">Hace <ph name="NUMBER_TWO"/> minutos</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Cerrar notificación</translation>
<translation id="6364916375976753737">Desplazar hacia la izquierda</translation>
<translation id="2629089419211541119">Hace <ph name="NUMBER_ONE"/> hora</translation>
+<translation id="4218160142017529598">Eliminar anterior</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutos</translation>
<translation id="6982279413068714821">Hace <ph name="NUMBER_DEFAULT"/> minutos</translation>
<translation id="6945221475159498467">Seleccionar</translation>
<translation id="6620110761915583480">Guardar archivo</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation>
+<translation id="8924469368910458384">Eliminar hasta el principio de la línea</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Falta <ph name="NUMBER_ONE"/> minuto.</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> días</translation>
<translation id="7163503212501929773">Faltan <ph name="NUMBER_MANY"/> horas</translation>
<translation id="5329858601952122676">&amp;Suprimir</translation>
+<translation id="6556866813142980365">Rehacer</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> seg.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="50960180632766478">Faltan <ph name="NUMBER_FEW"/> minutos</translation>
<translation id="5517291721709019259">Faltan <ph name="NUMBER_FEW"/> segundos.</translation>
+<translation id="6903282483217634857">Mover hacia la derecha</translation>
<translation id="6659594942844771486">Pestaña</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">Hace <ph name="NUMBER_DEFAULT"/> días</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutos</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Permitir notificaciones de:</translation>
+<translation id="2479520428668657293">Mover hacia la derecha y modificar selección</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> horas</translation>
<translation id="1398853756734560583">Maximizar</translation>
<translation id="4250229828105606438">Captura de pantalla</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> horas</translation>
<translation id="5260878308685146029">Faltan <ph name="NUMBER_TWO"/> minutos</translation>
+<translation id="2557207087669398617">Mover hasta el principio de la línea</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Seleccionar &amp;todo</translation>
<translation id="2168039046890040389">Retroceder página</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> días</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutos</translation>
+<translation id="6122334925474904337">Mover una palabra hacia la derecha y modificar selección</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation>
<translation id="8448317557906454022">Hace <ph name="NUMBER_ZERO"/> segundos</translation>
<translation id="4927753642311223124">No hay ningún elemento que mostrar.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Desplazarse hasta aquí</translation>
<translation id="4552416320897244156">AvPág</translation>
+<translation id="3066573403916685335">Bajar</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> horas</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">Falta <ph name="NUMBER_ONE"/> hora</translation>
<translation id="1413622004203049571">Inhabilitar notificaciones de <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Superior</translation>
+<translation id="2538759511191347839">Mover hasta el final de la línea y modificar selección</translation>
+<translation id="928465423150706909">Mover hasta el final de la línea</translation>
<translation id="8331626408530291785">Desplazar hacia arriba</translation>
<translation id="7907591526440419938">Abrir archivo</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Detener contenido multimedia</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restaurar</translation>
+<translation id="5349525451964472598">Mover hacia la izquierda y modificar selección</translation>
+<translation id="1781701194097416995">Mover una palabra a la izquierda</translation>
<translation id="1243314992276662751">Cargar</translation>
<translation id="50030952220075532">Falta <ph name="NUMBER_ONE"/> día</translation>
<translation id="8179976553408161302">Entrar</translation>
+<translation id="8471049483003785219">Mover una palabra a la izquierda y modificar selección</translation>
<translation id="945522503751344254">Enviar comentarios</translation>
<translation id="9170848237812810038">&amp;Deshacer</translation>
<translation id="1285266685456062655">Hace <ph name="NUMBER_FEW"/> horas</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> día</translation>
+<translation id="2704295676501803339">Mover hacia la izquierda</translation>
<translation id="9098468523912235228">Hace <ph name="NUMBER_DEFAULT"/> segundos</translation>
<translation id="494645311413743213">Faltan <ph name="NUMBER_TWO"/> segundos</translation>
<translation id="4570886800634958009">Ampliar notificación</translation>
+<translation id="566737009157135450">Eliminar palabra anterior</translation>
<translation id="436869212180315161">Hacer clic</translation>
<translation id="4860787810836767172">Hace <ph name="NUMBER_FEW"/> segundos</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">Hace <ph name="NUMBER_MANY"/> minutos</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Ayuda</translation>
+<translation id="2405367043325750948">Eliminar siguiente</translation>
<translation id="6699343763173986273">Pista multimedia siguiente</translation>
<translation id="5445120697129764393">Faltan <ph name="NUMBER_DEFAULT"/> segundos.</translation>
<translation id="8226233771743600312">No molestar durante un día</translation>
+<translation id="4252565523989510616">Eliminar palabra siguiente</translation>
<translation id="7457942297256758195">Borrar todo</translation>
<translation id="822618367988303761">Hace <ph name="NUMBER_TWO"/> días</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutos</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Copiar al portapapeles</translation>
<translation id="8371695176452482769">Hablar ahora</translation>
+<translation id="1167268268675672572">Mover hasta el principio de la línea y modificar selección</translation>
<translation id="6965382102122355670">Aceptar</translation>
<translation id="7850320739366109486">No molestar</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_es.xtb b/ui/base/strings/ui_strings_es.xtb
index 93a6ca6c71..295f3a3f51 100644
--- a/ui/base/strings/ui_strings_es.xtb
+++ b/ui/base/strings/ui_strings_es.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Flecha arriba</translation>
+<translation id="3969863827134279083">Mover hacia arriba</translation>
<translation id="7062130397825382308">Queda <ph name="NUMBER_ONE"/> segundo</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> horas</translation>
<translation id="3990502903496589789">Borde derecho</translation>
<translation id="9038489124413477075">Carpeta sin nombre</translation>
+<translation id="1940483897317142625">Eliminar hasta el final de la línea</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutos</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> días restantes</translation>
<translation id="932327136139879170">Inicio</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">hace <ph name="NUMBER_FEW"/> días</translation>
<translation id="5076340679995252485">&amp;Pegar</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Mover una palabra a la derecha</translation>
<translation id="364720409959344976">Seleccionar una carpeta para subirla</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">hace <ph name="NUMBER_TWO"/> minutos</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Cerrar notificación</translation>
<translation id="6364916375976753737">Desplazar hacia la izquierda</translation>
<translation id="2629089419211541119">hace <ph name="NUMBER_ONE"/> hora</translation>
+<translation id="4218160142017529598">Eliminar anterior</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutos</translation>
<translation id="6982279413068714821">hace <ph name="NUMBER_DEFAULT"/> minutos</translation>
<translation id="6945221475159498467">Seleccionar</translation>
<translation id="6620110761915583480">Guardar archivo</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> segundos</translation>
+<translation id="8924469368910458384">Eliminar hasta el inicio de la línea</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Queda <ph name="NUMBER_ONE"/> minuto</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> días</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> horas restantes</translation>
<translation id="5329858601952122676">&amp;Suprimir</translation>
+<translation id="6556866813142980365">Rehacer</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> seg.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutos</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutos</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutos restantes</translation>
<translation id="5517291721709019259">Quedan <ph name="NUMBER_FEW"/> segundos</translation>
+<translation id="6903282483217634857">Mover hacia la derecha</translation>
<translation id="6659594942844771486">Pestaña</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">hace <ph name="NUMBER_DEFAULT"/> días</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutos</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Permitir notificaciones de:</translation>
+<translation id="2479520428668657293">Mover hacia la derecha y modificar selección</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> horas</translation>
<translation id="1398853756734560583">Maximizar</translation>
<translation id="4250229828105606438">Captura de pantalla</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> horas</translation>
<translation id="5260878308685146029">Faltan <ph name="NUMBER_TWO"/> minutos</translation>
+<translation id="2557207087669398617">Mover hasta el inicio de la línea</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Seleccionar &amp;todo</translation>
<translation id="2168039046890040389">Retroceder página</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> días</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutos</translation>
+<translation id="6122334925474904337">Mover una palabra a la derecha y modificar selección</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation>
<translation id="8448317557906454022">hace <ph name="NUMBER_ZERO"/> segundos</translation>
<translation id="4927753642311223124">Aquí no hay nada que ver, circulen...</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Desplazarse hasta aquí</translation>
<translation id="4552416320897244156">AvPág</translation>
+<translation id="3066573403916685335">Mover hacia abajo</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> horas</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">Falta <ph name="NUMBER_ONE"/> hora</translation>
<translation id="1413622004203049571">Inhabilitar notificaciones de <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Superior</translation>
+<translation id="2538759511191347839">Mover hasta el final de la línea y modificar selección</translation>
+<translation id="928465423150706909">Mover hasta el final de la línea</translation>
<translation id="8331626408530291785">Desplazar hacia arriba</translation>
<translation id="7907591526440419938">Abrir archivo</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Detener contenido multimedia</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restaurar</translation>
+<translation id="5349525451964472598">Mover hacia la izquierda y modificar selección</translation>
+<translation id="1781701194097416995">Mover una palabra a la izquierda</translation>
<translation id="1243314992276662751">Subir</translation>
<translation id="50030952220075532">Falta <ph name="NUMBER_ONE"/> día</translation>
<translation id="8179976553408161302">Entrar</translation>
+<translation id="8471049483003785219">Mover una palabra a la izquierda y modificar selección</translation>
<translation id="945522503751344254">Danos tu opinión</translation>
<translation id="9170848237812810038">&amp;Deshacer</translation>
<translation id="1285266685456062655">hace <ph name="NUMBER_FEW"/> horas</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> día</translation>
+<translation id="2704295676501803339">Mover hacia la izquierda</translation>
<translation id="9098468523912235228">hace <ph name="NUMBER_DEFAULT"/> segundos</translation>
<translation id="494645311413743213">Faltan <ph name="NUMBER_TWO"/> segundos</translation>
<translation id="4570886800634958009">Ampliar notificación</translation>
+<translation id="566737009157135450">Eliminar palabra anterior</translation>
<translation id="436869212180315161">Pulsar</translation>
<translation id="4860787810836767172">hace <ph name="NUMBER_FEW"/> segundos</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">hace <ph name="NUMBER_MANY"/> minutos</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Ayuda</translation>
+<translation id="2405367043325750948">Eliminar siguiente</translation>
<translation id="6699343763173986273">Siguiente pista multimedia</translation>
<translation id="5445120697129764393">Quedan <ph name="NUMBER_DEFAULT"/> segundos</translation>
<translation id="8226233771743600312">No molestar durante un día</translation>
+<translation id="4252565523989510616">Eliminar palabra siguiente</translation>
<translation id="7457942297256758195">Borrar todo</translation>
<translation id="822618367988303761">hace <ph name="NUMBER_TWO"/> días</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutos</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Copiar al portapapeles</translation>
<translation id="8371695176452482769">Habla ahora</translation>
+<translation id="1167268268675672572">Mover hasta el inicio de la línea y modificar selección</translation>
<translation id="6965382102122355670">Aceptar</translation>
<translation id="7850320739366109486">No molestar</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_et.xtb b/ui/base/strings/ui_strings_et.xtb
index 80706e285a..1126797c7b 100644
--- a/ui/base/strings/ui_strings_et.xtb
+++ b/ui/base/strings/ui_strings_et.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Ülesnool</translation>
+<translation id="3969863827134279083">Liiguta üles</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> sekund jäänud</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> tundi</translation>
<translation id="3990502903496589789">Parem serv</translation>
<translation id="9038489124413477075">Nimeta kaust</translation>
+<translation id="1940483897317142625">Kustuta rea lõpuni</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutit</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/>päeva jäänud</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> päeva tagasi</translation>
<translation id="5076340679995252485">&amp;Kleebi</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Liiguta sõna võrra paremale</translation>
<translation id="364720409959344976">Kausta valimine üleslaadimiseks</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> minutit tagasi</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Märguande sulgemine</translation>
<translation id="6364916375976753737">Keri vasakule</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> tund tagasi</translation>
+<translation id="4218160142017529598">Kustuta tagasisuunas</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutit</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minutit tagasi</translation>
<translation id="6945221475159498467">Vali</translation>
<translation id="6620110761915583480">Faili salvestamine</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation>
+<translation id="8924469368910458384">Kustuta rea alguseni</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minut on jäänud</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minut</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> päeva</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> tundi jäänud</translation>
<translation id="5329858601952122676">&amp;Kustuta</translation>
+<translation id="6556866813142980365">Tee uuesti</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sekundit</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutit jäänud</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> sekundit jäänud</translation>
+<translation id="6903282483217634857">Liiguta paremale</translation>
<translation id="6659594942844771486">Vaheleht</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> päeva tagasi</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutit</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Luba märguanded järgmistest kohtadest:</translation>
+<translation id="2479520428668657293">Liiguta paremale ja muuda valikut</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> tundi</translation>
<translation id="1398853756734560583">Maksimeeri</translation>
<translation id="4250229828105606438">Ekraanipilt</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> tundi</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minutit jäänud</translation>
+<translation id="2557207087669398617">Liiguta rea algusesse</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Vali &amp;kõik</translation>
<translation id="2168039046890040389">Lehekülje üles</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> päeva</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutit</translation>
+<translation id="6122334925474904337">Liiguta sõna võrra paremale ja muuda valikut</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minut</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> sekundit tagasi</translation>
<translation id="4927753642311223124">Siin pole ühtegi märguannet, liikuge edasi.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Keri siia</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Liiguta allapoole</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> tundi</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> tundi jäänud</translation>
<translation id="1413622004203049571">Keela märguanded: <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Üles</translation>
+<translation id="2538759511191347839">Liiguta rea lõppu ja muuda valikut</translation>
+<translation id="928465423150706909">Liiguta rea lõppu</translation>
<translation id="8331626408530291785">Keri üles</translation>
<translation id="7907591526440419938">Faili avamine</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Meediumi peatamine</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Taasta</translation>
+<translation id="5349525451964472598">Liiguta vasakule ja muuda valikut</translation>
+<translation id="1781701194097416995">Liiguta sõna võrra vasakule</translation>
<translation id="1243314992276662751">Laadi üles</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> päev jäänud</translation>
<translation id="8179976553408161302">Sisestusklahv</translation>
+<translation id="8471049483003785219">Liiguta sõna võrra vasakule ja muuda valikut</translation>
<translation id="945522503751344254">Saada tagasisidet</translation>
<translation id="9170848237812810038">&amp;Võta tagasi</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> tundi tagasi</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> päev</translation>
+<translation id="2704295676501803339">Liiguta vasakule</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> sekundit tagasi</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> sekundit jäänud</translation>
<translation id="4570886800634958009">Märguande laiendamine</translation>
+<translation id="566737009157135450">Kustuta sõna tagasisuunas</translation>
<translation id="436869212180315161">Vajuta</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> sekundit tagasi</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> minutit tagasi</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Abi</translation>
+<translation id="2405367043325750948">Kustuta edasisuunas</translation>
<translation id="6699343763173986273">Meediumi järgmine lugu</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> sekundit jäänud</translation>
<translation id="8226233771743600312">Mitte segada üks päev</translation>
+<translation id="4252565523989510616">Kustuta sõna edasisuunas</translation>
<translation id="7457942297256758195">Kustuta kõik</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> päeva tagasi</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutit</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Kopeeri lõikelauale</translation>
<translation id="8371695176452482769">Alustage rääkimist</translation>
+<translation id="1167268268675672572">Liiguta rea algusesse ja muuda valikut</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Mitte segada</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_fa.xtb b/ui/base/strings/ui_strings_fa.xtb
index f29be1644e..a436c03abd 100644
--- a/ui/base/strings/ui_strings_fa.xtb
+++ b/ui/base/strings/ui_strings_fa.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> بایت</translation>
<translation id="3660179305079774227">پیکان بالا</translation>
+<translation id="3969863827134279083">حرکت به بالا</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> ثانیه باقی مانده است</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> مگابایت/ثانیه</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ساعت</translation>
<translation id="3990502903496589789">حاشیه راست</translation>
<translation id="9038489124413477075">پوشه بدون نام</translation>
+<translation id="1940483897317142625">حذف تا پایان خط</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> دقیقه</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation>
<translation id="932327136139879170">صفحهٔ اصلی</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;جاگذاری</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> ترابایت</translation>
+<translation id="7139614227326422685">حرکت به کلمه راست</translation>
<translation id="364720409959344976">انتخاب پوشه برای آپلود</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">بستن اعلان</translation>
<translation id="6364916375976753737">پیمایش به چپ</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> ساعت قبل</translation>
+<translation id="4218160142017529598">حذف به سمت عقب</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> دقیقه</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> دقیقه قبل</translation>
<translation id="6945221475159498467">انتخاب</translation>
<translation id="6620110761915583480">ذخیره کردن فایل</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> ثانیه</translation>
+<translation id="8924469368910458384">حذف تا ابتدای خط</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> دقیقه باقیمانده</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> دقیقه</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> days</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> hours left</translation>
<translation id="5329858601952122676">&amp;حذف</translation>
+<translation id="6556866813142980365">انجام مجدد</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> کیلوبایت</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> دقیقه</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> دقیقه</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> mins left</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">حرکت به راست</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> مگابایت</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> روز قبل</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> mins</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">اعلان موارد زیر مجاز باشد:</translation>
+<translation id="2479520428668657293">حرکت به راست و اصلاح انتخاب</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> hours</translation>
<translation id="1398853756734560583">بزرگ کردن</translation>
<translation id="4250229828105606438">عکس از صفحه نمایش</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> hours</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> mins left</translation>
+<translation id="2557207087669398617">حرکت به ابتدای خط</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> گیگابایت</translation>
<translation id="1901303067676059328">انتخاب &amp;همه</translation>
<translation id="2168039046890040389">صفحه بالا</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> روز</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mins</translation>
+<translation id="6122334925474904337">خرکت به کلمه راست و اصلاح انتخاب</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> دقیقه</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">اینجا خبری نیست، برگردید.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">پیمایش به اینجا</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">حرکت به پایین</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hours</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> کیلوبایت/ثانیه</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ساعت مانده</translation>
<translation id="1413622004203049571">غیرفعال کردن اعلان‌ها از <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">بالا</translation>
+<translation id="2538759511191347839">حرکت به انتهای خط و اصلاح انتخاب</translation>
+<translation id="928465423150706909">حرکت به انتهای خط</translation>
<translation id="8331626408530291785">پیمایش به بالا</translation>
<translation id="7907591526440419938">باز کردن فایل</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">توقف رسانه</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">بازیابی</translation>
+<translation id="5349525451964472598">حرکت به چپ و اصلاح انتخاب</translation>
+<translation id="1781701194097416995">حرکت به کلمه چپ</translation>
<translation id="1243314992276662751">آپلود</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> روز مانده</translation>
<translation id="8179976553408161302">ورود</translation>
+<translation id="8471049483003785219">حرکت به کلمه چپ و اصلاح انتخاب</translation>
<translation id="945522503751344254">ارسال بازخورد</translation>
<translation id="9170848237812810038">&amp;واگرد</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> گیگابایت/ثانیه</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> روز</translation>
+<translation id="2704295676501803339">حرکت به چپ</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> ثانیه قبل</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation>
<translation id="4570886800634958009">باز کردن اعلان</translation>
+<translation id="566737009157135450">حذف کلمه قبلی</translation>
<translation id="436869212180315161">فشار دادن</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> ترابایت/ثانیه</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> بایت/ثانیه</translation>
<translation id="7649070708921625228">راهنما</translation>
+<translation id="2405367043325750948">حذف به سمت جلو</translation>
<translation id="6699343763173986273">آهنگ بعدی رسانه</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> ثانیه باقی مانده است</translation>
<translation id="8226233771743600312">یک روز مزاحم نشوید</translation>
+<translation id="4252565523989510616">حذف کلمه بعدی</translation>
<translation id="7457942297256758195">پاک کردن همه</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mins</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> پتابایت/ثانیه</translation>
<translation id="2743387203779672305">کپی در کلیپ‌بورد</translation>
<translation id="8371695176452482769">اکنون صحبت کنید</translation>
+<translation id="1167268268675672572">حرکت به ابتدای خط و اصلاح انتخاب</translation>
<translation id="6965382102122355670">تأیید</translation>
<translation id="7850320739366109486">مزاحم نشوید</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_fi.xtb b/ui/base/strings/ui_strings_fi.xtb
index 80b5e81fc8..e24b6156cc 100644
--- a/ui/base/strings/ui_strings_fi.xtb
+++ b/ui/base/strings/ui_strings_fi.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> t</translation>
<translation id="3660179305079774227">Nuoli yl.</translation>
+<translation id="3969863827134279083">Siirrä ylös</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> sekunti jäljellä</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> Mt/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> tuntia</translation>
<translation id="3990502903496589789">Oikea reuna</translation>
<translation id="9038489124413477075">Nimetön kansio</translation>
+<translation id="1940483897317142625">Poista rivin loppuun asti</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minuuttia</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> päivää jäljellä</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;Liitä</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> Tt</translation>
+<translation id="7139614227326422685">Siirrä sanan oikealle puolelle</translation>
<translation id="364720409959344976">Valitse lähetettävä kansio</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Ilmoitus sulje</translation>
<translation id="6364916375976753737">Vieritä vasemmalle</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> tunti sitten</translation>
+<translation id="4218160142017529598">Poista taaksepäin</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuuttia</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minuuttia sitten</translation>
<translation id="6945221475159498467">Valitse</translation>
<translation id="6620110761915583480">Tallenna tiedosto</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sekuntia</translation>
+<translation id="8924469368910458384">Poista rivin alkuun asti</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minuutti jäljellä</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minuuttia</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> päivää</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> tuntia jäljellä</translation>
<translation id="5329858601952122676">&amp;Poista</translation>
+<translation id="6556866813142980365">Tee uudelleen</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sekuntia</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kt</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minuuttia jäljellä</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">Siirrä oikealle</translation>
<translation id="6659594942844771486">Välilehti</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> Mt</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> päivää sitten</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minuuttia</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Salli ilmoitukset seuraavista:</translation>
+<translation id="2479520428668657293">Siirrä oikealle ja muokkaa valintaa</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> tuntia</translation>
<translation id="1398853756734560583">Suurenna</translation>
<translation id="4250229828105606438">Kuvakaappaus</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> tuntia</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minuuttia jäljellä</translation>
+<translation id="2557207087669398617">Siirrä rivin alkuun</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> Gt</translation>
<translation id="1901303067676059328">Valitse &amp;kaikki</translation>
<translation id="2168039046890040389">Sivu ylös</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> päivää</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minuuttia</translation>
+<translation id="6122334925474904337">Siirrä sanan oikealle puolelle ja muokkaa valintaa</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuutti</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Täällä ei ole mitään nähtävää.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Vieritä tähän</translation>
<translation id="4552416320897244156">Sivu alas</translation>
+<translation id="3066573403916685335">Siirrä alas</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> tuntia</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kt/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> tuntia jäljellä</translation>
<translation id="1413622004203049571">Poista ilmoitukset käytöstä sovellukselta <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Yleisin</translation>
+<translation id="2538759511191347839">Siirrä rivin loppuun ja muokkaa valintaa</translation>
+<translation id="928465423150706909">Siirrä rivin loppuun</translation>
<translation id="8331626408530291785">Vieritä ylös</translation>
<translation id="7907591526440419938">Avaa tiedosto</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Media: pysäytä</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Palauta</translation>
+<translation id="5349525451964472598">Siirrä vasemmalle ja muokkaa valintaa</translation>
+<translation id="1781701194097416995">Siirrä sanan vasemmalle puolelle</translation>
<translation id="1243314992276662751">Lähetä</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> päivää jäljellä</translation>
<translation id="8179976553408161302">Sisään</translation>
+<translation id="8471049483003785219">Siirrä sanan vasemmalle puolelle ja muokkaa valintaa</translation>
<translation id="945522503751344254">Lähetä palautetta</translation>
<translation id="9170848237812810038">K&amp;umoa</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> Gt/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> päivää</translation>
+<translation id="2704295676501803339">Siirrä vasemmalle</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> sekuntia sitten</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> sekuntia jäljellä</translation>
<translation id="4570886800634958009">Ilmoitus laajenna</translation>
+<translation id="566737009157135450">Poista edellinen sana</translation>
<translation id="436869212180315161">Paina</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> Tt/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> t/s</translation>
<translation id="7649070708921625228">Ohje</translation>
+<translation id="2405367043325750948">Poista eteenpäin</translation>
<translation id="6699343763173986273">Media: seuraava kappale</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> sekuntia jäljellä</translation>
<translation id="8226233771743600312">Älä häiritse päivään</translation>
+<translation id="4252565523989510616">Poista seuraava sana</translation>
<translation id="7457942297256758195">Tyhjennä kaikki</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minuuttia</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> Pt/s</translation>
<translation id="2743387203779672305">Kopioi leikepöydälle</translation>
<translation id="8371695176452482769">Puhu nyt</translation>
+<translation id="1167268268675672572">Siirrä rivin alkuun ja muokkaa valintaa</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Älä häiritse</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_fil.xtb b/ui/base/strings/ui_strings_fil.xtb
index 65e280602d..5788c9e19c 100644
--- a/ui/base/strings/ui_strings_fil.xtb
+++ b/ui/base/strings/ui_strings_fil.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> (na) B</translation>
<translation id="3660179305079774227">Up Arrow</translation>
+<translation id="3969863827134279083">Lumipat Pataas</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> segundo ang natitira</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> (na) MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> mga oras</translation>
<translation id="3990502903496589789">Tamang Lamang</translation>
<translation id="9038489124413477075">Walang Pangalan na Folder</translation>
+<translation id="1940483897317142625">Tanggalin Papunta Sa Dulo Ng Linya</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> mga minuto</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> mga nalalabing araw</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> araw ang nakalipas</translation>
<translation id="5076340679995252485">&amp;Ilagay</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> (na) TB</translation>
+<translation id="7139614227326422685">Lumipat Sa Kanan Ng Salita</translation>
<translation id="364720409959344976">Pumili ng Folder na I-a-upload</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> minuto ang nakalipas</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Isara ang notification</translation>
<translation id="6364916375976753737">Mag-scroll Pakaliwa</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> oras ang nakalipas</translation>
+<translation id="4218160142017529598">Tanggalin Ang Nakaraan (Na Salita)</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> (na) minuto</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minuto ang nakalipas</translation>
<translation id="6945221475159498467">Pumili</translation>
<translation id="6620110761915583480">I-save ang File</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> na segundo</translation>
+<translation id="8924469368910458384">Tanggalin Papunta Sa Umpisa Ng Linya</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minuto ang natitira</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minuto</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> mga araw</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> mga oras na nalalabi</translation>
<translation id="5329858601952122676">&amp;Tanggalin</translation>
+<translation id="6556866813142980365">Redo</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> seg</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> (na) minuto</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuto</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> natitirang minuto</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">Lumipat Pakanan</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> (na) MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> araw ang nakalipas</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minuto</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Payagan ang mga notification mula sa sumusunod:</translation>
+<translation id="2479520428668657293">Lumipat Pakanan At Baguhin ang Pinili</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/>mga oras</translation>
<translation id="1398853756734560583">Maximize</translation>
<translation id="4250229828105606438">Screenshot</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> mga oras</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> natitirang minuto</translation>
+<translation id="2557207087669398617">Lumipat Sa Umpisa Ng Linya</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> (na) GB</translation>
<translation id="1901303067676059328">Piliin ang &amp;lahat</translation>
<translation id="2168039046890040389">Pataas</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> mga araw</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mga minuto</translation>
+<translation id="6122334925474904337">Lumipat Sa Kanan ng Salita At Baguhin ang Pinili</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> segundo ang nakalipas</translation>
<translation id="4927753642311223124">Walang makikita rito, magpatuloy.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Mag-scroll dito</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Lumipat Pababa</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> mga oras</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> natitirang oras</translation>
<translation id="1413622004203049571">I-disable ang mga notification mula sa <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Tuktok</translation>
+<translation id="2538759511191347839">Lumipat Papunta Sa Dulo ng Linya At Baguhin ang Pinili</translation>
+<translation id="928465423150706909">Lumipat Sa Dulo Ng Linya</translation>
<translation id="8331626408530291785">Mag-scroll Pataas</translation>
<translation id="7907591526440419938">Buksan ang File</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Media Ihinto</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Ipanumbalik</translation>
+<translation id="5349525451964472598">Lumipat Pakaliwa At Baguhin ang Pinili</translation>
+<translation id="1781701194097416995">Lumipat Sa Kaliwa Ng Salita</translation>
<translation id="1243314992276662751">I-upload</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> natitirang araw</translation>
<translation id="8179976553408161302">Pumasok</translation>
+<translation id="8471049483003785219">Lumipat Sa Kaliwa Ng Salita At Baguhin ang Pinili</translation>
<translation id="945522503751344254">Magpadala ng feedback...</translation>
<translation id="9170848237812810038">&amp;I-undo</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> (na) oras ang nakalipas</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> (na) GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> araw</translation>
+<translation id="2704295676501803339">Lumipat Pakaliwa</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> segundo ang nakalipas</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> mga natitirang segundo</translation>
<translation id="4570886800634958009">Palawakin ang notification</translation>
+<translation id="566737009157135450">Tanggalin Ang Nakaraang Salita</translation>
<translation id="436869212180315161">Pindutin</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> segundo ang nakalipas</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> (na) TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> minuto ang nakalipas</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> (na) B/s</translation>
<translation id="7649070708921625228">Tulong</translation>
+<translation id="2405367043325750948">Tanggalin Ang Susunod (Na Salita)</translation>
<translation id="6699343763173986273">Susunod na Track ng Media</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> (na) segundo ang natitira</translation>
<translation id="8226233771743600312">Huwag istorbohin sa loob ng isang araw</translation>
+<translation id="4252565523989510616">Tanggalin Ang Susunod Na Salita</translation>
<translation id="7457942297256758195">I-clear Lahat</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> araw ang nakalipas</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mga minuto</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> (na) PB/s</translation>
<translation id="2743387203779672305">Kopyahin sa clipboard</translation>
<translation id="8371695176452482769">Magsalita ngayon</translation>
+<translation id="1167268268675672572">Lumipat Sa Umpisa Ng Linya At Baguhin ang Pinili</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Huwag Istorbohin</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_fr.xtb b/ui/base/strings/ui_strings_fr.xtb
index a6b3d4bb87..f34d2d395b 100644
--- a/ui/base/strings/ui_strings_fr.xtb
+++ b/ui/base/strings/ui_strings_fr.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> o</translation>
<translation id="3660179305079774227">Haut</translation>
+<translation id="3969863827134279083">Déplacer vers le haut</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> seconde restante</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> Mo/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> heures</translation>
<translation id="3990502903496589789">Côté droit</translation>
<translation id="9038489124413477075">Dossier sans nom</translation>
+<translation id="1940483897317142625">Supprimer jusqu'à la fin de la ligne</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutes</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> jours restants</translation>
<translation id="932327136139879170">Début</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">C&amp;oller</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> To</translation>
+<translation id="7139614227326422685">Déplacer jusqu'au prochain mot sur la droite</translation>
<translation id="364720409959344976">Sélectionner le dossier d'importation</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">il y a <ph name="NUMBER_TWO"/> minutes</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Fermer la notification</translation>
<translation id="6364916375976753737">Défilement vers la gauche</translation>
<translation id="2629089419211541119">il y a <ph name="NUMBER_ONE"/> heure</translation>
+<translation id="4218160142017529598">Supprimer en arrière</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutes</translation>
<translation id="6982279413068714821">il y a <ph name="NUMBER_DEFAULT"/> minutes</translation>
<translation id="6945221475159498467">Sélectionner</translation>
<translation id="6620110761915583480">Enregistrer le fichier</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation>
+<translation id="8924469368910458384">Supprimer jusqu'au début de la ligne</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minute restante</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minute</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> jours</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> heures restantes</translation>
<translation id="5329858601952122676">&amp;Supprimer</translation>
+<translation id="6556866813142980365">Rétablir</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secondes</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> Ko</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutes restantes</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">Déplacer vers la droite</translation>
<translation id="6659594942844771486">Onglet</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> Mo</translation>
<translation id="4988273303304146523">il y a <ph name="NUMBER_DEFAULT"/> jours</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Autoriser les notifications des éléments suivants :</translation>
+<translation id="2479520428668657293">Déplacer vers la droite et modifier la sélection</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> heures</translation>
<translation id="1398853756734560583">Agrandir</translation>
<translation id="4250229828105606438">Capture d'écran</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> heures</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minutes restantes</translation>
+<translation id="2557207087669398617">Déplacer vers le début de la ligne</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> Go</translation>
<translation id="1901303067676059328">&amp;Tout sélectionner</translation>
<translation id="2168039046890040389">Page précédente</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> jours</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="6122334925474904337">Déplacer jusqu'au prochain mot sur la droite et modifier la sélection</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minute</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Aucune notification</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Défilement jusqu'ici</translation>
<translation id="4552416320897244156">PgSuiv</translation>
+<translation id="3066573403916685335">Déplacer vers le bas</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> heures</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> Ko/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> heure restante</translation>
<translation id="1413622004203049571">Désactiver les notifications <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">En haut</translation>
+<translation id="2538759511191347839">Déplacer à la fin de la ligne et modifier la sélection</translation>
+<translation id="928465423150706909">Déplacer à la fin de la ligne</translation>
<translation id="8331626408530291785">Défilement vers le haut</translation>
<translation id="7907591526440419938">Ouvrir le fichier</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Contenu multimédia : arrêt</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restaurer</translation>
+<translation id="5349525451964472598">Déplacer vers la gauche et modifier la sélection</translation>
+<translation id="1781701194097416995">Déplacer jusqu'au mot précédent sur la gauche</translation>
<translation id="1243314992276662751">Importer</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> jour restant</translation>
<translation id="8179976553408161302">Entrer</translation>
+<translation id="8471049483003785219">Déplacer jusqu'au mot précédent sur la gauche et modifier la sélection</translation>
<translation id="945522503751344254">Envoyer le commentaire</translation>
<translation id="9170848237812810038">Ann&amp;uler</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> Go/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> jour</translation>
+<translation id="2704295676501803339">Déplacer vers la gauche</translation>
<translation id="9098468523912235228">il y a <ph name="NUMBER_DEFAULT"/> secondes</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> secondes restantes</translation>
<translation id="4570886800634958009">Développer la notification</translation>
+<translation id="566737009157135450">Supprimer un mot en arrière</translation>
<translation id="436869212180315161">Cliquer</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> To/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> o/s</translation>
<translation id="7649070708921625228">Aide</translation>
+<translation id="2405367043325750948">Supprimer vers l'avant</translation>
<translation id="6699343763173986273">Contenu multimédia : titre suivant</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> secondes restantes</translation>
<translation id="8226233771743600312">Ne pas déranger pendant un jour</translation>
+<translation id="4252565523989510616">Supprimer un mot vers l'avant</translation>
<translation id="7457942297256758195">Tout effacer</translation>
<translation id="822618367988303761">il y a <ph name="NUMBER_TWO"/> jours</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutes</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> Po/s</translation>
<translation id="2743387203779672305">Copier dans le Presse-papier</translation>
<translation id="8371695176452482769">Parlez maintenant</translation>
+<translation id="1167268268675672572">Déplacer au début de la ligne et modifier la sélection</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Ne pas déranger</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_gu.xtb b/ui/base/strings/ui_strings_gu.xtb
index c3c2007958..12bd88f772 100644
--- a/ui/base/strings/ui_strings_gu.xtb
+++ b/ui/base/strings/ui_strings_gu.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> અબજ</translation>
<translation id="3660179305079774227">ઉપર એરો</translation>
+<translation id="3969863827134279083">ઉપર ખસેડો</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> સેકંડ બાકી</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> કલાક</translation>
<translation id="3990502903496589789">જમણી કિનારી</translation>
<translation id="9038489124413477075">અનામાંકિત ફોલ્ડર</translation>
+<translation id="1940483897317142625">લીટીના અંત સુધીનું કાઢી નાખો</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> મિનિટ</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> દિવસ બાકી</translation>
<translation id="932327136139879170">હોમ</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">પેસ્ટ કરો</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">શબ્દની જમણી બાજુએ ખસેડો</translation>
<translation id="364720409959344976">અપલોડ કરવા માટે ફોલ્ડર પસંદ કરો</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">સૂચના બંધ છે</translation>
<translation id="6364916375976753737">ડાબે સ્ક્રોલ કરો</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation>
+<translation id="4218160142017529598">પાછળનું કાઢી નાખો</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> મિનિટ</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation>
<translation id="6945221475159498467">પસંદ કરો</translation>
<translation id="6620110761915583480">ફાઇલ સાચવો</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> સેકંડ</translation>
+<translation id="8924469368910458384">લીટીની શરૂઆત સુધીનું કાઢી નાખો</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> કલાક</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> મિનિટ બાકી</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> મિનિટ</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> દિવસ</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> કલાક બાકી</translation>
<translation id="5329858601952122676">&amp;કાઢી નાખો</translation>
+<translation id="6556866813142980365">ફરી કરો</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> સેકંડ</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> મિનિટ</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> મિનિટ</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> મિનિટ બાકી</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> સેકંડ બાકી</translation>
+<translation id="6903282483217634857">જમણી બાજુએ ખસેડો</translation>
<translation id="6659594942844771486">ટૅબ</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/>MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> મિનિટ</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> કલાક બાકી</translation>
<translation id="7135556860107312402">નીચેના પરથી સૂચનાઓને મંજૂરી આપો:</translation>
+<translation id="2479520428668657293">જમણી બાજુએ ખસેડો અને પસંદગી સંશોધિત કરો</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> કલાક</translation>
<translation id="1398853756734560583">મોટું કરો</translation>
<translation id="4250229828105606438">સ્ક્રીનશૉટ</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> કલાક</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> મિનિટ બાકી</translation>
+<translation id="2557207087669398617">લીટીની શરૂઆતમાં ખસેડો</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">&amp;બધા પસંદ કરો</translation>
<translation id="2168039046890040389">પૃષ્ઠ ઉપર</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> મિનિટ</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> દિવસ</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> મિનિટ્સ</translation>
+<translation id="6122334925474904337">શબ્દની જમણી બાજુએ ખસેડો અને પસંદગી સંશોધિત કરો</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> મિનિટ</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">અહીં જોવા માટે કંઈ નથી, આગળ વધો.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> દિવસ</translation>
<translation id="3183922693828471536">અહીં સુધી સ્ક્રોલ કરો</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">નીચે ખસેડો</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> કલાક</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> કલાક બાકી</translation>
<translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> તરફથી સૂચનાઓ અક્ષમ કરો</translation>
<translation id="2666092431469916601">ઉપર</translation>
+<translation id="2538759511191347839">લીટીની અંતમાં ખસેડો અને પસંદગી સંશોધિત કરો</translation>
+<translation id="928465423150706909">લીટીના અંતમાં ખસેડો</translation>
<translation id="8331626408530291785">ઉપર સ્ક્રોલ કરો</translation>
<translation id="7907591526440419938">ફાઇલ ખોલો</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> દિવસ બાકી</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">મીડિયા સ્ટોપ</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> મિનિટ બાકી</translation>
<translation id="3157931365184549694">પુનઃસ્થાપિત કરો</translation>
+<translation id="5349525451964472598">ડાબે ખસેડો અને પસંદગી સંશોધિત કરો</translation>
+<translation id="1781701194097416995">શબ્દની ડાબી બાજુએ ખસેડો</translation>
<translation id="1243314992276662751">અપલોડ કરો</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> દિવસ બાકી</translation>
<translation id="8179976553408161302">દાખલ કરો</translation>
+<translation id="8471049483003785219">શબ્દની ડાબી બાજુએ ખસેડો અને પસંદગી સંશોધિત કરો</translation>
<translation id="945522503751344254">પ્રતિસાદ મોકલો</translation>
<translation id="9170848237812810038">&amp;પૂર્વવત્ કરો</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> કલાક પહેલા</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> દિવસ</translation>
+<translation id="2704295676501803339">ડાબે ખસેડો</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> સેકન્ડ બાકી</translation>
<translation id="4570886800634958009">સૂચના વિસ્તૃત છે</translation>
+<translation id="566737009157135450">શબ્દની પાછળનું કાઢી નાખો</translation>
<translation id="436869212180315161">દબાવો</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">સહાય</translation>
+<translation id="2405367043325750948">આગળનું કાઢી નાખો</translation>
<translation id="6699343763173986273">મીડિયા આગલો ટ્રૅક</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> સેકંડ બાકી</translation>
<translation id="8226233771743600312">એક દિવસ માટે ખલેલ પાડશો નહીં</translation>
+<translation id="4252565523989510616">શબ્દની આગળનું કાઢી નાખો</translation>
<translation id="7457942297256758195">બધું સાફ કરો</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> મિનિટ</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">ક્લિપબોર્ડ પર કૉપિ કરો</translation>
<translation id="8371695176452482769">હવે બોલો</translation>
+<translation id="1167268268675672572">લીટીની શરૂઆતમાં ખસેડો અને પસંદગી સંશોધિત કરો</translation>
<translation id="6965382102122355670">ઓકે</translation>
<translation id="7850320739366109486">ખલેલ પાડશો નહીં</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> દિવસ પહેલા</translation>
diff --git a/ui/base/strings/ui_strings_hi.xtb b/ui/base/strings/ui_strings_hi.xtb
index 5009c7597f..c1a889fc44 100644
--- a/ui/base/strings/ui_strings_hi.xtb
+++ b/ui/base/strings/ui_strings_hi.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> बाइट</translation>
<translation id="3660179305079774227">ऊपर तीर</translation>
+<translation id="3969863827134279083">ऊपर ले जाएं</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> सेकंड शेष</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> घंटे</translation>
<translation id="3990502903496589789">दायां सिरा</translation>
<translation id="9038489124413477075">अनाम फ़ोल्डर</translation>
+<translation id="1940483897317142625">पंक्ति के अंत तक हटाएं</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> मिनट</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation>
<translation id="932327136139879170">मुख्यपृष्ठ</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> दिन पहले</translation>
<translation id="5076340679995252485">&amp;चिपकाएं</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">शब्द के दाईं ओर ले जाएं</translation>
<translation id="364720409959344976">अपलोड करने के लिए फ़ोल्‍डर चुनें</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">सूचना बंद करें</translation>
<translation id="6364916375976753737">बाएं स्क्रॉल करें</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> घंटे पहले</translation>
+<translation id="4218160142017529598">पीछे की ओर का शब्द हटाएं</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> मिनट</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation>
<translation id="6945221475159498467">चुनें</translation>
<translation id="6620110761915583480">फ़ाइल सहेजें</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> सेकंड</translation>
+<translation id="8924469368910458384">पंक्ति की शुरुआत तक हटाएं</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> घंटे</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> मिनट शेष</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> मिनट</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> दिन</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> hours left</translation>
<translation id="5329858601952122676">&amp;हटाएं</translation>
+<translation id="6556866813142980365">पुन: करें</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> सेकंड</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> मिनट</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> मिनट</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> mins left</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">दाईं ओर ले जाएं</translation>
<translation id="6659594942844771486">टैब</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> दिन पहले</translation>
@@ -90,17 +97,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> मिनट</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">निम्न से आने वाली सूचनाओं की अनुमति दें:</translation>
+<translation id="2479520428668657293">दाईं ओर ले जाएं और चयन बदलें</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> घंटे</translation>
<translation id="1398853756734560583">बड़ा करें</translation>
<translation id="4250229828105606438">स्क्रीनशॉट</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> घंटे</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> mins left</translation>
+<translation id="2557207087669398617">पंक्ति के प्रारंभ में ले जाएं</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">&amp;सभी को चुनें</translation>
<translation id="2168039046890040389">पृष्ठ ऊपर</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> मिनट</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> दिन</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> मिनट</translation>
+<translation id="6122334925474904337">शब्द के दाईं ओर ले जाएं और चयन बदलें</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> मिनट</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">यहां देखने के लिए कुछ भी नहीं है, आगे चलें.</translation>
@@ -108,6 +118,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> दिन</translation>
<translation id="3183922693828471536">यहां तक स्क्रॉल करें</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">नीचे ले जाएं</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> घंटे</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -124,6 +135,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> घंटे शेष</translation>
<translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> से सूचनाएं अक्षम करें</translation>
<translation id="2666092431469916601">शीर्ष</translation>
+<translation id="2538759511191347839">पंक्ति के अंत में ले जाएं और चयन बदलें</translation>
+<translation id="928465423150706909">पंक्ति के अंत में ले जाएं</translation>
<translation id="8331626408530291785">ऊपर स्क्रॉल करें</translation>
<translation id="7907591526440419938">फ़ाइल खोलें</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -133,9 +146,12 @@
<translation id="6808150112686056157">मीडिया रोकें</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">पुनर्स्थापित करें</translation>
+<translation id="5349525451964472598">बाईं ओर ले जाएं और चयन बदलें</translation>
+<translation id="1781701194097416995">शब्द के बाईं ओर ले जाएं</translation>
<translation id="1243314992276662751">अपलोड करें</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> दिन शेष</translation>
<translation id="8179976553408161302">प्रविष्ट करें</translation>
+<translation id="8471049483003785219">शब्द के बाईं ओर ले जाएं और चयन बदलें</translation>
<translation id="945522503751344254">सुझाव भेजें</translation>
<translation id="9170848237812810038">&amp;पूर्ववत् करें</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> घंटे पहले</translation>
@@ -159,9 +175,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> घंटे पहले</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> दिन</translation>
+<translation id="2704295676501803339">बाईं ओर ले जाएं</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> सेकंड पहले</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation>
<translation id="4570886800634958009">सूचना विस्‍तार</translation>
+<translation id="566737009157135450">पीछे की ओर एक शब्द हटाएं</translation>
<translation id="436869212180315161">दबाएं</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -171,9 +189,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">सहायता</translation>
+<translation id="2405367043325750948">आगे की ओर हटाएं</translation>
<translation id="6699343763173986273">मीडिया अगला ट्रैक</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> seconds left</translation>
<translation id="8226233771743600312">एक दिन तक परेशान न करें</translation>
+<translation id="4252565523989510616">आगे की ओर एक शब्द हटाएं</translation>
<translation id="7457942297256758195">सभी साफ़ करें</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> दिन पहले</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> मिनट</translation>
@@ -189,6 +209,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">क्लिपबोर्ड पर प्रतिलिपि बनाएं</translation>
<translation id="8371695176452482769">अब बोलें</translation>
+<translation id="1167268268675672572">पंक्ति के प्रारंभ में ले जाएं और चयन बदलें</translation>
<translation id="6965382102122355670">ठीक</translation>
<translation id="7850320739366109486">परेशान न करें</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> दिन पहले</translation>
diff --git a/ui/base/strings/ui_strings_hr.xtb b/ui/base/strings/ui_strings_hr.xtb
index 4382680d39..82fa96fe47 100644
--- a/ui/base/strings/ui_strings_hr.xtb
+++ b/ui/base/strings/ui_strings_hr.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Strelica prema gore</translation>
+<translation id="3969863827134279083">Premjesti prema gore</translation>
<translation id="7062130397825382308">Preostalo <ph name="NUMBER_ONE"/> s</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928">Broj sati: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="3990502903496589789">Desni rub</translation>
<translation id="9038489124413477075">Neimenovana mapa</translation>
+<translation id="1940483897317142625">Izbriši do kraja retka</translation>
<translation id="8507996248087185956">Broj minuta: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="3520476450377425184">Preostalo dana: <ph name="NUMBER_MANY"/></translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">Prije <ph name="NUMBER_FEW"/> dana</translation>
<translation id="5076340679995252485">&amp;Zalijepi</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Premjesti riječ udesno</translation>
<translation id="364720409959344976">Odabir mape za prijenos</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">Prije <ph name="NUMBER_TWO"/> minute</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Zatvaranje obavijesti</translation>
<translation id="6364916375976753737">Pomakni se lijevo</translation>
<translation id="2629089419211541119">Prije <ph name="NUMBER_ONE"/> sat</translation>
+<translation id="4218160142017529598">Izbriši unatrag</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuta</translation>
<translation id="6982279413068714821">Prije <ph name="NUMBER_DEFAULT"/> minuta</translation>
<translation id="6945221475159498467">Odaberi</translation>
<translation id="6620110761915583480">Spremi datoteku</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation>
+<translation id="8924469368910458384">Izbriši do početka retka</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Preostalo minuta: <ph name="NUMBER_ONE"/></translation>
<translation id="2953767478223974804">Broj minuta: <ph name="NUMBER_ONE"/></translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863">Broj dana: <ph name="NUMBER_MANY"/></translation>
<translation id="7163503212501929773">Preostalo sati: <ph name="NUMBER_MANY"/></translation>
<translation id="5329858601952122676">&amp;Obriši</translation>
+<translation id="6556866813142980365">Ponovi</translation>
<translation id="8088823334188264070">Sekundi: <ph name="NUMBER_MANY"/></translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="50960180632766478">Preostalo minuta: <ph name="NUMBER_FEW"/></translation>
<translation id="5517291721709019259">Preostalo <ph name="NUMBER_FEW"/> s</translation>
+<translation id="6903282483217634857">Premjesti udesno</translation>
<translation id="6659594942844771486">Kartica</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">Prije <ph name="NUMBER_DEFAULT"/> dana</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773">Broj minuta: <ph name="NUMBER_TWO"/></translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Omogućite obavijesti iz sljedećih izvora:</translation>
+<translation id="2479520428668657293">Premjesti udesno i izmijeni odabir</translation>
<translation id="8112886015144590373">Broj sati: <ph name="NUMBER_FEW"/></translation>
<translation id="1398853756734560583">Maksimiziraj</translation>
<translation id="4250229828105606438">Snimka zaslona</translation>
<translation id="6690744523875189208">Broj sati: <ph name="NUMBER_TWO"/></translation>
<translation id="5260878308685146029">Preostalo minuta: <ph name="NUMBER_TWO"/></translation>
+<translation id="2557207087669398617">Premjesti na početak retka</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Odaberi &amp;sve</translation>
<translation id="2168039046890040389">Stranica prema gore</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581">Broj dana: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="6463061331681402734">Broj minuta: <ph name="NUMBER_MANY"/></translation>
+<translation id="6122334925474904337">Premjesti riječ udesno i izmijeni odabir</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuta</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Nema nikakvih obavijesti.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Pomakni ovdje</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Premjesti dolje</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401">Sati: <ph name="NUMBER_MANY"/></translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">Preostalo sati: <ph name="NUMBER_ONE"/></translation>
<translation id="1413622004203049571">Onemogući obavijesti pošiljatelja <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Gornji</translation>
+<translation id="2538759511191347839">Premjesti na kraj retka i izmijeni odabir</translation>
+<translation id="928465423150706909">Premjesti na kraj retka</translation>
<translation id="8331626408530291785">Pomakni se gore</translation>
<translation id="7907591526440419938">Otvori datoteku</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Zaustavi Medije</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Vrati</translation>
+<translation id="5349525451964472598">Premjesti ulijevo i izmijeni odabir</translation>
+<translation id="1781701194097416995">Premjesti riječ ulijevo</translation>
<translation id="1243314992276662751">Prenesi</translation>
<translation id="50030952220075532">Preostalo dana: <ph name="NUMBER_ONE"/></translation>
<translation id="8179976553408161302">Pridružite se</translation>
+<translation id="8471049483003785219">Premjesti riječ ulijevo i izmijeni odabir</translation>
<translation id="945522503751344254">Slanje povratnih informacija</translation>
<translation id="9170848237812810038">&amp;Poništi</translation>
<translation id="1285266685456062655">Prije <ph name="NUMBER_FEW"/> sata</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/>dan</translation>
+<translation id="2704295676501803339">Premjesti ulijevo</translation>
<translation id="9098468523912235228">Prije <ph name="NUMBER_DEFAULT"/> sekundi</translation>
<translation id="494645311413743213">Preostalo sekundi <ph name="NUMBER_TWO"/></translation>
<translation id="4570886800634958009">Proširivanje obavijesti</translation>
+<translation id="566737009157135450">Izbriši prethodnu riječ</translation>
<translation id="436869212180315161">Pritisnite</translation>
<translation id="4860787810836767172">Prije <ph name="NUMBER_FEW"/> sek</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Pomoć</translation>
+<translation id="2405367043325750948">Izbriši prema naprijed</translation>
<translation id="6699343763173986273">Sljedeći zapis Medija</translation>
<translation id="5445120697129764393">Preostalo <ph name="NUMBER_DEFAULT"/> s</translation>
<translation id="8226233771743600312">Ne ometaj jedan dan</translation>
+<translation id="4252565523989510616">Izbriši sljedeću riječ</translation>
<translation id="7457942297256758195">Očisti sve</translation>
<translation id="822618367988303761">Prije <ph name="NUMBER_TWO"/> dana</translation>
<translation id="4745438305783437565">Broj minuta: <ph name="NUMBER_FEW"/></translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Kopiraj u međuspremnik</translation>
<translation id="8371695176452482769">Govorite sad</translation>
+<translation id="1167268268675672572">Pomakni na početak retka i izmijeni odabir</translation>
<translation id="6965382102122355670">U redu</translation>
<translation id="7850320739366109486">Ne ometaj</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_hu.xtb b/ui/base/strings/ui_strings_hu.xtb
index 7240269d70..984a0c5e86 100644
--- a/ui/base/strings/ui_strings_hu.xtb
+++ b/ui/base/strings/ui_strings_hu.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> bájt</translation>
<translation id="3660179305079774227">Felfelé nyíl</translation>
+<translation id="3969863827134279083">Fel</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> másodperc van hátra</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> óra</translation>
<translation id="3990502903496589789">Jobb sarok</translation>
<translation id="9038489124413477075">Név nélküli mappa</translation>
+<translation id="1940483897317142625">Törlés a sor végéig</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> perc</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> nap van hátra</translation>
<translation id="932327136139879170">Főoldal</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;Beillesztés</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Egy szóval jobbra</translation>
<translation id="364720409959344976">Mappa kiválasztása a feltöltéshez</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Értesítés bezárása</translation>
<translation id="6364916375976753737">Görgetés balra</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> órája</translation>
+<translation id="4218160142017529598">Törlés visszafelé</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> perc</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> perce</translation>
<translation id="6945221475159498467">Kiválasztás</translation>
<translation id="6620110761915583480">Fájl mentése</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> másodperc</translation>
+<translation id="8924469368910458384">Törlés a sor elejéig</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> perc van hátra</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> perc</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> nap</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> óra van hátra</translation>
<translation id="5329858601952122676">&amp;Törlés</translation>
+<translation id="6556866813142980365">Újra</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> másodperc</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> perc</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> perc</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> perc van hátra</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">Jobbra</translation>
<translation id="6659594942844771486">Lap</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> napja</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> perc</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Értesítések engedélyezése a következőtől:</translation>
+<translation id="2479520428668657293">Jobbra és kijelölés módosítása</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> óra</translation>
<translation id="1398853756734560583">Teljes méret</translation>
<translation id="4250229828105606438">Képernyőkép</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> óra</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> perc van hátra</translation>
+<translation id="2557207087669398617">Sor elejére</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Össz&amp;es kiválasztása</translation>
<translation id="2168039046890040389">Oldal fel</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> nap</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> perc</translation>
+<translation id="6122334925474904337">Egy szóval jobbra és kijelölés módosítása</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> perc</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Itt nincs semmi, továbbmehet.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Görgessen ide</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Le</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> óra</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> óra van hátra</translation>
<translation id="1413622004203049571">A(z) <ph name="NOTIFIER_NAME"/> értesítéseinek kikapcsolása</translation>
<translation id="2666092431469916601">Felülre</translation>
+<translation id="2538759511191347839">Sor végére és kijelölés módosítása</translation>
+<translation id="928465423150706909">Sor végére</translation>
<translation id="8331626408530291785">Görgetés felfelé</translation>
<translation id="7907591526440419938">Fájl megnyitása</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Leállítás</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Visszaállítás</translation>
+<translation id="5349525451964472598">Lefelé és kijelölés módosítása</translation>
+<translation id="1781701194097416995">Egy szóval lefelé</translation>
<translation id="1243314992276662751">Feltöltés</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> nap van hátra</translation>
<translation id="8179976553408161302">Belépés</translation>
+<translation id="8471049483003785219">Egy szóval balra és kijelölés módosítása</translation>
<translation id="945522503751344254">Visszajelzés küldése</translation>
<translation id="9170848237812810038">&amp;Visszavonás</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> nap</translation>
+<translation id="2704295676501803339">Balra</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> másodperce</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> másodperc van hátra.</translation>
<translation id="4570886800634958009">Értesítés kibontása</translation>
+<translation id="566737009157135450">Szó törlése visszafelé</translation>
<translation id="436869212180315161">Sajtó</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Súgó</translation>
+<translation id="2405367043325750948">Törlés előrefelé</translation>
<translation id="6699343763173986273">Következő szám</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> másodperc van hátra</translation>
<translation id="8226233771743600312">Ne zavarj egy napig</translation>
+<translation id="4252565523989510616">Szó törlése előrefelé</translation>
<translation id="7457942297256758195">Összes törlése</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> perc</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Másolás a vágólapra</translation>
<translation id="8371695176452482769">Most beszéljen</translation>
+<translation id="1167268268675672572">Sor elejére és kijelölés módosítása</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Ne zavarj</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_id.xtb b/ui/base/strings/ui_strings_id.xtb
index 5927d2d0b7..82c362375e 100644
--- a/ui/base/strings/ui_strings_id.xtb
+++ b/ui/base/strings/ui_strings_id.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Panah Atas</translation>
+<translation id="3969863827134279083">Pindah ke Atas</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> detik lagi</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/dtk</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> jam</translation>
<translation id="3990502903496589789">Tepi Kanan</translation>
<translation id="9038489124413477075">Folder Tanpa Nama</translation>
+<translation id="1940483897317142625">Hapus Sampai Akhir Baris</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> menit</translation>
<translation id="3520476450377425184">Tersisa <ph name="NUMBER_MANY"/> hari</translation>
<translation id="932327136139879170">Beranda</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> hari yang lalu</translation>
<translation id="5076340679995252485">Tem&amp;pel</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Pindahkan ke Kanan Kata</translation>
<translation id="364720409959344976">Pilih Folder untuk Diunggah</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mnt. yang lalu</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Tutup pemberitahuan</translation>
<translation id="6364916375976753737">Gulir ke Kiri</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> jam yang lalu</translation>
+<translation id="4218160142017529598">Hapus dari Belakang</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> menit</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mnt. yang lalu</translation>
<translation id="6945221475159498467">Pilih</translation>
<translation id="6620110761915583480">Simpan File</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> detik</translation>
+<translation id="8924469368910458384">Hapus Sampai Awal Baris</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Tersisa <ph name="NUMBER_ONE"/> menit</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> menit</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> hari</translation>
<translation id="7163503212501929773">Tersisa <ph name="NUMBER_MANY"/> jam</translation>
<translation id="5329858601952122676">&amp;Hapus</translation>
+<translation id="6556866813142980365">Urungkan</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> detik</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> menit</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> menit</translation>
<translation id="50960180632766478">Tersisa <ph name="NUMBER_FEW"/> menit</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">Pindah ke Kanan</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> hari yang lalu</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> menit</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Izinkan pemberitahuan dari yang berikut:</translation>
+<translation id="2479520428668657293">Pindah ke Kanan dan Ubah Pilihan</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> jam</translation>
<translation id="1398853756734560583">Perbesar</translation>
<translation id="4250229828105606438">Tangkapan layar</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> jam</translation>
<translation id="5260878308685146029">Tersisa <ph name="NUMBER_TWO"/> menit</translation>
+<translation id="2557207087669398617">Pindah ke Awal Baris</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Pilih semu&amp;a</translation>
<translation id="2168039046890040389">Page Up</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> hari</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> menit</translation>
+<translation id="6122334925474904337">Pindah ke Kanan Kata dan Ubah Pilihan</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> menit</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> dtk. yang lalu</translation>
<translation id="4927753642311223124">Tidak ada apa-apa di sini, lihat yang lain saja.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Gulir ke Sini</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Turunkan</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> jam</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/dtk</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">Tersisa <ph name="NUMBER_ONE"/> jam</translation>
<translation id="1413622004203049571">Nonaktifkan pemberitahuan dari <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Atas</translation>
+<translation id="2538759511191347839">Pindah ke Akhir Baris dan Ubah Pilihan</translation>
+<translation id="928465423150706909">Pindah ke Akhir Baris</translation>
<translation id="8331626408530291785">Gulir ke Atas</translation>
<translation id="7907591526440419938">Buka File</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Hentikan Media</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Pulihkan</translation>
+<translation id="5349525451964472598">Pindah ke Kiri dan Ubah Pilihan</translation>
+<translation id="1781701194097416995">Pindah ke Kiri Kata</translation>
<translation id="1243314992276662751">Unggah</translation>
<translation id="50030952220075532">Tersisa <ph name="NUMBER_ONE"/> hari</translation>
<translation id="8179976553408161302">Masuk</translation>
+<translation id="8471049483003785219">Pindah ke Kiri Kata dan Ubah Pilihan</translation>
<translation id="945522503751344254">Kirim masukan</translation>
<translation id="9170848237812810038">&amp;Urung</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> jam yang lalu</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/dtk</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> hari</translation>
+<translation id="2704295676501803339">Pindah ke Kiri</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> dtk. yang lalu</translation>
<translation id="494645311413743213">Tersisa <ph name="NUMBER_TWO"/> detik</translation>
<translation id="4570886800634958009">Luaskan pemberitahuan</translation>
+<translation id="566737009157135450">Hapus dari Belakang Per Kata</translation>
<translation id="436869212180315161">Tekan</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> dtk. yang lalu</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/dtk</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mnt. yang lalu</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/dtk</translation>
<translation id="7649070708921625228">Bantuan</translation>
+<translation id="2405367043325750948">Hapus dari Depan</translation>
<translation id="6699343763173986273">Lacak Media Berikutnya</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> detik lagi</translation>
<translation id="8226233771743600312">Jangan ganggu selama satu hari</translation>
+<translation id="4252565523989510616">Hapus dari Depan Per Kata</translation>
<translation id="7457942297256758195">Hapus Semua</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> hari yang lalu</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> menit</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/dtk</translation>
<translation id="2743387203779672305">Salin ke papan klip</translation>
<translation id="8371695176452482769">Bicaralah sekarang</translation>
+<translation id="1167268268675672572">Pindah ke Awal Baris dan Ubah Pilihan</translation>
<translation id="6965382102122355670">Oke</translation>
<translation id="7850320739366109486">Jangan Ganggu</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_it.xtb b/ui/base/strings/ui_strings_it.xtb
index 7d2abdb890..88e31b4108 100644
--- a/ui/base/strings/ui_strings_it.xtb
+++ b/ui/base/strings/ui_strings_it.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Freccia SU</translation>
+<translation id="3969863827134279083">Sposta su</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> secondo rimasto</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ore</translation>
<translation id="3990502903496589789">Margine destro</translation>
<translation id="9038489124413477075">Cartella senza nome</translation>
+<translation id="1940483897317142625">Elimina fino a fine riga</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min.</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> giorni rimanenti</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> giorni fa</translation>
<translation id="5076340679995252485">&amp;Incolla</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Sposta di una parola a destra</translation>
<translation id="364720409959344976">Seleziona la cartella da caricare</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> minuti fa</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Chiusura notifica</translation>
<translation id="6364916375976753737">Scorri a sinistra</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> ora fa</translation>
+<translation id="4218160142017529598">Elimina indietro</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuti</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minuti fa</translation>
<translation id="6945221475159498467">Seleziona</translation>
<translation id="6620110761915583480">Salva file</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> secondi</translation>
+<translation id="8924469368910458384">Elimina fino a inizio riga</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minuto rimanente</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min.</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> giorni</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ore rimanenti</translation>
<translation id="5329858601952122676">&amp;Elimina</translation>
+<translation id="6556866813142980365">Ripeti</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sec.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> min. rimanenti</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> secondi rimasti</translation>
+<translation id="6903282483217634857">Sposta a destra</translation>
<translation id="6659594942844771486">TAB</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> giorni fa</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> min.</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Consenti notifiche da:</translation>
+<translation id="2479520428668657293">Sposta a destra e modifica selezione</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ore</translation>
<translation id="1398853756734560583">Ingrandisci</translation>
<translation id="4250229828105606438">Screenshot</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ore</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> min. rimanenti</translation>
+<translation id="2557207087669398617">Sposta fino a inizio riga</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Seleziona &amp;tutto</translation>
<translation id="2168039046890040389">Pagina su</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> giorni</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> min.</translation>
+<translation id="6122334925474904337">Sposta di una parola a destra e modifica selezione</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secondi fa</translation>
<translation id="4927753642311223124">Nessuna notifica.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Scorri fino a qui</translation>
<translation id="4552416320897244156">PGGIÙ</translation>
+<translation id="3066573403916685335">Sposta giù</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ore</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ora rimanente</translation>
<translation id="1413622004203049571">Disabilita notifiche da <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">In alto</translation>
+<translation id="2538759511191347839">Sposta fino a fine riga e modifica selezione</translation>
+<translation id="928465423150706909">Sposta fino a fine riga</translation>
<translation id="8331626408530291785">Scorri verso l'alto</translation>
<translation id="7907591526440419938">Apri file</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Interrompi contenuti multimediali</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Ripristina</translation>
+<translation id="5349525451964472598">Sposta a sinistra e modifica selezione</translation>
+<translation id="1781701194097416995">Sposta di una parola a sinistra</translation>
<translation id="1243314992276662751">Carica</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> giorno rimanente</translation>
<translation id="8179976553408161302">Invia</translation>
+<translation id="8471049483003785219">Sposta di una parola a sinistra e modifica selezione</translation>
<translation id="945522503751344254">Invia feedback</translation>
<translation id="9170848237812810038">&amp;Annulla</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> ore fa</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> giorno</translation>
+<translation id="2704295676501803339">Sposta a sinistra</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secondi fa</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> sec. rimanenti</translation>
<translation id="4570886800634958009">Espansione notifica</translation>
+<translation id="566737009157135450">Elimina una parola indietro</translation>
<translation id="436869212180315161">Premi</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secondi fa</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> minuti fa</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Guida</translation>
+<translation id="2405367043325750948">Elimina avanti</translation>
<translation id="6699343763173986273">Traccia successiva contenuti multimediali</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> secondi rimasti</translation>
<translation id="8226233771743600312">Non disturbare per un giorno</translation>
+<translation id="4252565523989510616">Elimina una parola avanti</translation>
<translation id="7457942297256758195">Cancella tutto</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> giorni fa</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min.</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Copia negli appunti</translation>
<translation id="8371695176452482769">Parla adesso</translation>
+<translation id="1167268268675672572">Sposta fino a inizio riga e modifica selezione</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Non disturbare</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_iw.xtb b/ui/base/strings/ui_strings_iw.xtb
index 693594b05d..f39dfc85f7 100644
--- a/ui/base/strings/ui_strings_iw.xtb
+++ b/ui/base/strings/ui_strings_iw.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">חץ למעלה</translation>
+<translation id="3969863827134279083">עלה למעלה</translation>
<translation id="7062130397825382308">נותרה שנייה <ph name="NUMBER_ONE"/></translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> שעות</translation>
<translation id="3990502903496589789">קצה ימני</translation>
<translation id="9038489124413477075">תיקייה ללא שם</translation>
+<translation id="1940483897317142625">מחק עד סוף השורה</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> דקות</translation>
<translation id="3520476450377425184">נותרו <ph name="NUMBER_MANY"/> ימים</translation>
<translation id="932327136139879170">בית</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">לפני <ph name="NUMBER_FEW"/> ימים</translation>
<translation id="5076340679995252485">&amp;הדבק</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">העבר את המילה ימינה</translation>
<translation id="364720409959344976">בחירת תיקיה להעלאה</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">לפני <ph name="NUMBER_TWO"/> דקות</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">סגירת הודעה</translation>
<translation id="6364916375976753737">גלול שמאלה</translation>
<translation id="2629089419211541119">לפני <ph name="NUMBER_ONE"/> שעה</translation>
+<translation id="4218160142017529598">מחק לאחור</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> דקות</translation>
<translation id="6982279413068714821">לפני <ph name="NUMBER_DEFAULT"/> דקות</translation>
<translation id="6945221475159498467">בחר</translation>
<translation id="6620110761915583480">שמור קובץ</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> שניות</translation>
+<translation id="8924469368910458384">מחק עד תחילת השורה</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">נותרה דקה <ph name="NUMBER_ONE"/></translation>
<translation id="2953767478223974804">דקה <ph name="NUMBER_ONE"/></translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ימים</translation>
<translation id="7163503212501929773">נותרו <ph name="NUMBER_MANY"/> שעות</translation>
<translation id="5329858601952122676">&amp;מחק</translation>
+<translation id="6556866813142980365">בצע מחדש</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> שניות</translation>
<translation id="8901569739625249689">‏<ph name="QUANTITY"/> KB‏</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> דקות</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> דקות</translation>
<translation id="50960180632766478">נותרו <ph name="NUMBER_FEW"/> דקות</translation>
<translation id="5517291721709019259">נותרו <ph name="NUMBER_FEW"/> שניות</translation>
+<translation id="6903282483217634857">העבר ימינה</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">לפני <ph name="NUMBER_DEFAULT"/> ימים</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> דקות</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">אפשר התראות ממקורות אלה:</translation>
+<translation id="2479520428668657293">העבר ימינה ושנה את הבחירה</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> שעות</translation>
<translation id="1398853756734560583">הגדל</translation>
<translation id="4250229828105606438">צילום מסך</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> שעות</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> דקות נותרו</translation>
+<translation id="2557207087669398617">העבר לתחילת השורה</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">בחר &amp;הכל</translation>
<translation id="2168039046890040389">דף למעלה</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> ימים</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> דקות</translation>
+<translation id="6122334925474904337">העבר את המילה ימינה ושנה את הבחירה</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> דקה</translation>
<translation id="8448317557906454022">לפני <ph name="NUMBER_ZERO"/> שניות</translation>
<translation id="4927753642311223124">אין התראות להצגה, המשך הלאה.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">גלול ל'כאן'</translation>
<translation id="4552416320897244156">דף למטה</translation>
+<translation id="3066573403916685335">העבר למטה</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> שעות</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s‎</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">נותרו <ph name="NUMBER_ONE"/> שעות</translation>
<translation id="1413622004203049571">השבת הודעות מאת <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">למעלה</translation>
+<translation id="2538759511191347839">העבר לסוף השורה ושנה את הבחירה</translation>
+<translation id="928465423150706909">העבר לסוף השורה</translation>
<translation id="8331626408530291785">גלול למעלה</translation>
<translation id="7907591526440419938">פתח קובץ</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">עצור מדיה</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">שחזר</translation>
+<translation id="5349525451964472598">העבר שמאלה ושנה את הבחירה</translation>
+<translation id="1781701194097416995">העבר את המילה שמאלה</translation>
<translation id="1243314992276662751">העלה</translation>
<translation id="50030952220075532">נותר יום <ph name="NUMBER_ONE"/></translation>
<translation id="8179976553408161302">היכנס</translation>
+<translation id="8471049483003785219">העבר את המילה שמאלה ושנה את הבחירה</translation>
<translation id="945522503751344254">שלח משוב</translation>
<translation id="9170848237812810038">&amp;ביטול</translation>
<translation id="1285266685456062655">לפני <ph name="NUMBER_FEW"/> שעות</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405">יום <ph name="NUMBER_ONE"/></translation>
+<translation id="2704295676501803339">העבר שמאלה</translation>
<translation id="9098468523912235228">לפני <ph name="NUMBER_DEFAULT"/> שניות</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> שניות נותרו</translation>
<translation id="4570886800634958009">הרחבת הודעה</translation>
+<translation id="566737009157135450">מחק את המילה לאחור</translation>
<translation id="436869212180315161">לחץ</translation>
<translation id="4860787810836767172">לפני <ph name="NUMBER_FEW"/> שניות</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">לפני <ph name="NUMBER_MANY"/> דקות</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">עזרה</translation>
+<translation id="2405367043325750948">מחק קדימה</translation>
<translation id="6699343763173986273">הרצועה הבאה במדיה</translation>
<translation id="5445120697129764393">נותרו <ph name="NUMBER_DEFAULT"/> שניות</translation>
<translation id="8226233771743600312">נא לא להפריע ליום אחד</translation>
+<translation id="4252565523989510616">מחק את המילה קדימה</translation>
<translation id="7457942297256758195">נקה הכל</translation>
<translation id="822618367988303761">לפני <ph name="NUMBER_TWO"/> ימים</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> דקות</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">העתק ללוח</translation>
<translation id="8371695176452482769">דבר עכשיו</translation>
+<translation id="1167268268675672572">העבר לתחילת השורה ושנה את הבחירה</translation>
<translation id="6965382102122355670">אישור</translation>
<translation id="7850320739366109486">נא לא להפריע</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_ja.xtb b/ui/base/strings/ui_strings_ja.xtb
index 0990fbaef4..7b0f3466b2 100644
--- a/ui/base/strings/ui_strings_ja.xtb
+++ b/ui/base/strings/ui_strings_ja.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">上矢印キー</translation>
+<translation id="3969863827134279083">上に移動</translation>
<translation id="7062130397825382308">残り <ph name="NUMBER_ONE"/> 秒</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/秒</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> 時間</translation>
<translation id="3990502903496589789">右端</translation>
<translation id="9038489124413477075">名前のないフォルダ</translation>
+<translation id="1940483897317142625">行末まで削除</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> 分</translation>
<translation id="3520476450377425184">残り <ph name="NUMBER_MANY"/> 日</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> 日前</translation>
<translation id="5076340679995252485">貼り付け(&amp;P)</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">右の単語に移動</translation>
<translation id="364720409959344976">アップロードするフォルダを選択</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> 分前</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">通知を閉じる</translation>
<translation id="6364916375976753737">左にスクロール</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> 時間前</translation>
+<translation id="4218160142017529598">後方削除</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> 分</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> 分前</translation>
<translation id="6945221475159498467">選択</translation>
<translation id="6620110761915583480">ファイルを保存</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> 秒</translation>
+<translation id="8924469368910458384">行頭まで削除</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">残り <ph name="NUMBER_ONE"/> 分</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> 分</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> 日</translation>
<translation id="7163503212501929773">残り <ph name="NUMBER_MANY"/> 時間</translation>
<translation id="5329858601952122676">削除(&amp;D)</translation>
+<translation id="6556866813142980365">やり直す</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> 秒</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> 分</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> 分</translation>
<translation id="50960180632766478">残り <ph name="NUMBER_FEW"/> 分</translation>
<translation id="5517291721709019259">残り <ph name="NUMBER_FEW"/> 秒</translation>
+<translation id="6903282483217634857">右に移動</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> 日前</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> 分</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">次の通知を許可:</translation>
+<translation id="2479520428668657293">右に移動して選択範囲を変更</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> 時間</translation>
<translation id="1398853756734560583">最大化</translation>
<translation id="4250229828105606438">スクリーンショット</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> 時間</translation>
<translation id="5260878308685146029">残り <ph name="NUMBER_TWO"/> 分</translation>
+<translation id="2557207087669398617">行頭に移動</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">すべて選択(&amp;A)</translation>
<translation id="2168039046890040389">前のページへ</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> 日</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> 分</translation>
+<translation id="6122334925474904337">右の単語に移動して選択範囲を変更</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> 分</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> 秒前</translation>
<translation id="4927753642311223124">表示する通知はありません。続行してください。</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">ここまでスクロール</translation>
<translation id="4552416320897244156">PageDown</translation>
+<translation id="3066573403916685335">下に移動</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> 時間</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/秒</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">残り <ph name="NUMBER_ONE"/> 時間</translation>
<translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> からの通知を無効にする</translation>
<translation id="2666092431469916601">一番上</translation>
+<translation id="2538759511191347839">行末に移動して選択範囲を変更</translation>
+<translation id="928465423150706909">行末に移動</translation>
<translation id="8331626408530291785">上にスクロール</translation>
<translation id="7907591526440419938">ファイルを開く</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">メディアの停止</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">復元</translation>
+<translation id="5349525451964472598">左に移動して選択範囲を変更</translation>
+<translation id="1781701194097416995">左の単語に移動</translation>
<translation id="1243314992276662751">アップロード</translation>
<translation id="50030952220075532">残り <ph name="NUMBER_ONE"/> 日</translation>
<translation id="8179976553408161302">Enter</translation>
+<translation id="8471049483003785219">左の単語に移動して選択範囲を変更</translation>
<translation id="945522503751344254">フィードバックを送信</translation>
<translation id="9170848237812810038">取消(&amp;U)</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> 時間前</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/秒</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> 日</translation>
+<translation id="2704295676501803339">左に移動</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> 秒前</translation>
<translation id="494645311413743213">残り <ph name="NUMBER_TWO"/> 秒</translation>
<translation id="4570886800634958009">通知を展開</translation>
+<translation id="566737009157135450">後方の単語を削除</translation>
<translation id="436869212180315161">押す</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> 秒前</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/秒</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> 分前</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/秒</translation>
<translation id="7649070708921625228">ヘルプ</translation>
+<translation id="2405367043325750948">前方削除</translation>
<translation id="6699343763173986273">メディアの次のトラック</translation>
<translation id="5445120697129764393">残り <ph name="NUMBER_DEFAULT"/> 秒</translation>
<translation id="8226233771743600312">通知を 1 日間ミュート</translation>
+<translation id="4252565523989510616">前方の単語を削除</translation>
<translation id="7457942297256758195">すべて消去</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> 日前</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> 分</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/秒</translation>
<translation id="2743387203779672305">クリップボードにコピー</translation>
<translation id="8371695176452482769">お話しください</translation>
+<translation id="1167268268675672572">行頭に移動して選択範囲を変更</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">通知を一時的にミュート</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_kn.xtb b/ui/base/strings/ui_strings_kn.xtb
index 732e856d96..05490ddf32 100644
--- a/ui/base/strings/ui_strings_kn.xtb
+++ b/ui/base/strings/ui_strings_kn.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">ಮೇಲಿನ ಬಾಣದ ಗುರುತು</translation>
+<translation id="3969863827134279083">ಮೇಲಕ್ಕೆ ಸರಿಸಿ</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> ಸೆಕೆಂಡ್ ಉಳಿದಿದೆ</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ಗಂಟೆಗಳು</translation>
<translation id="3990502903496589789">ಬಲ ತುದಿ</translation>
<translation id="9038489124413477075">ಹೆಸರಿಸದ ಫೋಲ್ಡರ್</translation>
+<translation id="1940483897317142625">ಸಾಲಿನ ಕೊನೆಯವರೆಗೆ ಅಳಿಸಿ</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> ನಿಮಿಷಗಳು</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> ದಿನಗಳು ಉಳಿದಿವೆ</translation>
<translation id="932327136139879170">ಮುಖಪುಟ</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;ಅಂಟಿಸಿ</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">ಪದವನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ</translation>
<translation id="364720409959344976">ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ಫೋಲ್ಡರ್ ಆಯ್ಕೆಮಾಡಿ</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">ಅಧಿಸೂಚನೆ ಮುಚ್ಚು</translation>
<translation id="6364916375976753737">ಎಡಕ್ಕೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation>
+<translation id="4218160142017529598">ಹಿಮ್ಮುಖವಾಗಿ ಅಳಿಸಿ</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> ನಿಮಿಷಗಳು</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation>
<translation id="6945221475159498467">ಆಯ್ಕೆಮಾಡಿ</translation>
<translation id="6620110761915583480">ಫೈಲ್ ಉಳಿಸು</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> ಸೆಕೆಂಡುಗಳು</translation>
+<translation id="8924469368910458384">ಸಾಲಿನ ಪ್ರಾರಂಭದವರೆಗೆ ಅಳಿಸಿ</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> ನಿಮಿಷ ಉಳಿದಿದೆ</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> ನಿಮಿಷ</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ದಿನಗಳು</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ಗಂಟೆಗಳು ಉಳಿದಿದೆ</translation>
<translation id="5329858601952122676">&amp;ಅಳಿಸು</translation>
+<translation id="6556866813142980365">ಮತ್ತೆಮಾಡು</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> ಸೆಕೆಂಡುಗಳು</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> ನಿಮಿಷಗಳು</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> ನಿಮಿಷಗಳು</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> ನಿಮಿಷಗಳು ಉಳಿದಿದೆ</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> ಸೆಕೆಂಡ್‍ಗಳು ಉಳಿದಿವೆ</translation>
+<translation id="6903282483217634857">ಬಲಕ್ಕೆ ಸರಿಸಿ</translation>
<translation id="6659594942844771486">ಟ್ಯಾಬ್</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> ನಿಮಿಷಗಳು</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">ಕೆಳಗಿನವುಗಳಿಂದ ಅಧಿಸೂಚನೆಗಳನ್ನು ಅನುಮತಿಸಿ:</translation>
+<translation id="2479520428668657293">ಬಲಕ್ಕೆ ಸರಿಸಿ ಮತ್ತು ಆಯ್ಕೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ಗಂಟೆಗಳು</translation>
<translation id="1398853756734560583">ಗರಿಷ್ಠಗೊಳಿಸು</translation>
<translation id="4250229828105606438">ಸ್ಕ್ರೀನ್‌ಶಾಟ್</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ಗಂಟೆಗಳು</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> ನಿಮಿಷಗಳು ಉಳಿದಿವೆ</translation>
+<translation id="2557207087669398617">ಸಾಲಿನ ಪ್ರಾರಂಭಕ್ಕೆ ಸರಿಸಿ</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">&amp;ಎಲ್ಲ ಆಯ್ಕೆ ಮಾಡಿ</translation>
<translation id="2168039046890040389">ಪುಟ ಮೇಲೆ</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> ದಿನಗಳು</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> ನಿಮಿಷಗಳು</translation>
+<translation id="6122334925474904337">ಪದವನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ ಮತ್ತು ಆಯ್ಕೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> ನಿಮಿಷ</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">ಇಲ್ಲಿ ನೋಡಲು ಏನೂ ಇಲ್ಲ, ಮುಂದೆ ಸಾಗಿ.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">ಇಲ್ಲಿಗೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">ಕೆಳಕ್ಕೆ ಸರಿಸಿ</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ಗಂಟೆಗಳು</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s </translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ಗಂಟೆಗಳು ಉಳಿದಿದೆ</translation>
<translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> ಅವರ ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
<translation id="2666092431469916601">ಮೇಲೆ</translation>
+<translation id="2538759511191347839">ಸಾಲಿನ ಅಂತ್ಯಕ್ಕೆ ಸರಿಸಿ ಮತ್ತು ಆಯ್ಕೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ</translation>
+<translation id="928465423150706909">ಸಾಲಿನ ಅಂತ್ಯಕ್ಕೆ ಸರಿಸಿ</translation>
<translation id="8331626408530291785">ಮೇಲೆ ಸ್ಕ್ರೋಲ್ ಮಾಡು</translation>
<translation id="7907591526440419938">ಫೈಲ್ ತೆರೆಯಿರಿ</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">ಮೀಡಿಯಾ ನಿಲುಗಡೆ</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">ಪುನಃಸ್ಥಾಪನೆ</translation>
+<translation id="5349525451964472598">ಎಡಕ್ಕೆ ಸರಿಸಿ ಮತ್ತು ಆಯ್ಕೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ</translation>
+<translation id="1781701194097416995">ಪದವನ್ನು ಎಡಕ್ಕೆ ಸರಿಸಿ</translation>
<translation id="1243314992276662751">ಅಪ್‌ಲೋಡ್</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> ದಿನಗಳು ಉಳಿದಿವೆ</translation>
<translation id="8179976553408161302">ನಮೂದಿಸಿ</translation>
+<translation id="8471049483003785219">ಪದವನ್ನು ಎಡಕ್ಕೆ ಸರಿಸಿ ಮತ್ತು ಆಯ್ಕೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ</translation>
<translation id="945522503751344254">ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಕಳುಹಿಸಿ</translation>
<translation id="9170848237812810038">&amp;ರದ್ದುಮಾಡು</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> ದಿನ</translation>
+<translation id="2704295676501803339">ಎಡಕ್ಕೆ ಸರಿಸಿ</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> ಸೆಕೆಂಡುಗಳು ಉಳಿದಿದೆ</translation>
<translation id="4570886800634958009">ಅಧಿಸೂಚನೆ ವಿಸ್ತರಿಸು</translation>
+<translation id="566737009157135450">ಪದವನ್ನು ಹಿಂದಕ್ಕೆ ಅಳಿಸಿ</translation>
<translation id="436869212180315161">ಒತ್ತಿರಿ</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">ಸಹಾಯ</translation>
+<translation id="2405367043325750948">ಮುಂದಕ್ಕೆ ಅಳಿಸಿ</translation>
<translation id="6699343763173986273">ಮೀಡಿಯಾದ ಮುಂದಿನ ಟ್ರ್ಯಾಕ್</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> ಸೆಕೆಂಡ್‍ಗಳು ಉಳಿದಿವೆ</translation>
<translation id="8226233771743600312">ಒಂದು ದಿನದವರೆಗೆ ಅಡಚಣೆ ಮಾಡಬೇಡಿ</translation>
+<translation id="4252565523989510616">ಪದದ ಮುಂದಕ್ಕೆ ಅಳಿಸಿ</translation>
<translation id="7457942297256758195">ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> ನಿಮಿಷಗಳು</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಿ</translation>
<translation id="8371695176452482769">ಈಗ ಮಾತನಾಡಿ</translation>
+<translation id="1167268268675672572">ಸಾಲಿನ ಪ್ರಾರಂಭಕ್ಕೆ ಸರಿಸಿ ಮತ್ತು ಆಯ್ಕೆಯನ್ನು ಮಾರ್ಪಡಿಸಿ</translation>
<translation id="6965382102122355670">ಸರಿ</translation>
<translation id="7850320739366109486">ಅಡಚಣೆ ಮಾಡಬೇಡಿ</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_ko.xtb b/ui/base/strings/ui_strings_ko.xtb
index 026a6dcf6c..3d0c4702b1 100644
--- a/ui/base/strings/ui_strings_ko.xtb
+++ b/ui/base/strings/ui_strings_ko.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/>B</translation>
<translation id="3660179305079774227">위쪽 화살표</translation>
+<translation id="3969863827134279083">위로 이동</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/>초 남음</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/>MB/초</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/>시간</translation>
<translation id="3990502903496589789">오른쪽 모서리</translation>
<translation id="9038489124413477075">이름이 없는 폴더</translation>
+<translation id="1940483897317142625">마지막 줄까지 삭제</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/>분</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/>일 남음</translation>
<translation id="932327136139879170">홈</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/>일 전</translation>
<translation id="5076340679995252485">붙여넣기(&amp;P)</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/>TB</translation>
+<translation id="7139614227326422685">단어 오른쪽으로 이동</translation>
<translation id="364720409959344976">업로드할 폴더 선택</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/>분 전</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">알림 닫기</translation>
<translation id="6364916375976753737">왼쪽으로 스크롤</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/>시간 전</translation>
+<translation id="4218160142017529598">이전 삭제</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/>분</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/>분 전</translation>
<translation id="6945221475159498467">선택</translation>
<translation id="6620110761915583480">파일 저장</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/>초</translation>
+<translation id="8924469368910458384">첫 줄까지 삭제</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minute left</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/>분</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/>일</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/>시간 남음</translation>
<translation id="5329858601952122676">삭제(&amp;D)</translation>
+<translation id="6556866813142980365">다시실행</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/>초</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/>KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/>분</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/>분</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/>분 남음</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/>초 남음</translation>
+<translation id="6903282483217634857">오른쪽으로 이동</translation>
<translation id="6659594942844771486">탭</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/>MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/>일 전</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/>분</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">다음 항목에 알림 허용:</translation>
+<translation id="2479520428668657293">오른쪽으로 이동 및 선택사항 수정</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/>시간</translation>
<translation id="1398853756734560583">최대화</translation>
<translation id="4250229828105606438">캡처화면</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/>시간</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/>분 남음</translation>
+<translation id="2557207087669398617">첫 줄로 이동</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/>GB</translation>
<translation id="1901303067676059328">전체 선택(&amp;A)</translation>
<translation id="2168039046890040389">페이지 위로</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/>일</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/>분</translation>
+<translation id="6122334925474904337">오른쪽으로 이동 및 선택사항 수정</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/>분</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/>초 전</translation>
<translation id="4927753642311223124">표시할 내용이 없습니다.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">여기로 스크롤</translation>
<translation id="4552416320897244156">PageDown</translation>
+<translation id="3066573403916685335">아래로 이동</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/>시간</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/>KB/초</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/>시간 남음</translation>
<translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/>의 알림 사용 중지</translation>
<translation id="2666092431469916601">맨 위</translation>
+<translation id="2538759511191347839">마지막 줄로 이동 및 선택사항 수정</translation>
+<translation id="928465423150706909">마지막 줄로 이동</translation>
<translation id="8331626408530291785">위로 스크롤</translation>
<translation id="7907591526440419938">파일 열기</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">미디어 중지</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">복구</translation>
+<translation id="5349525451964472598">왼쪽으로 이동 및 선택사항 수정</translation>
+<translation id="1781701194097416995">단어 왼쪽으로 이동</translation>
<translation id="1243314992276662751">업로드</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/>일 남음</translation>
<translation id="8179976553408161302">Enter</translation>
+<translation id="8471049483003785219">단어 왼쪽으로 이동 및 선택사항 수정</translation>
<translation id="945522503751344254">의견 보내기</translation>
<translation id="9170848237812810038">실행 취소(&amp;U)</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/>시간 전</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/>GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/>일</translation>
+<translation id="2704295676501803339">왼쪽으로 이동</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/>초 전</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/>초 남음</translation>
<translation id="4570886800634958009">알림 펼치기</translation>
+<translation id="566737009157135450">이전 단어 삭제</translation>
<translation id="436869212180315161">누르기</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/>초 전</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/>TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/>분 전</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/>B/s</translation>
<translation id="7649070708921625228">도움말</translation>
+<translation id="2405367043325750948">다음 삭제</translation>
<translation id="6699343763173986273">미디어 다음 트랙</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/>초 남음</translation>
<translation id="8226233771743600312">하루 동안 알림 일시중지</translation>
+<translation id="4252565523989510616">다음 단어 삭제</translation>
<translation id="7457942297256758195">모두 지우기</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/>일 전</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/>분</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/>PB/s</translation>
<translation id="2743387203779672305">클립보드로 복사</translation>
<translation id="8371695176452482769">지금 말하기</translation>
+<translation id="1167268268675672572">첫 줄로 이동 및 선택사항 수정</translation>
<translation id="6965382102122355670">확인</translation>
<translation id="7850320739366109486">알림 일시중지</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_lt.xtb b/ui/base/strings/ui_strings_lt.xtb
index 8aa5b44469..a7733646aa 100644
--- a/ui/base/strings/ui_strings_lt.xtb
+++ b/ui/base/strings/ui_strings_lt.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Rodyklė „Aukštyn“</translation>
+<translation id="3969863827134279083">Perkelti į viršų</translation>
<translation id="7062130397825382308">Liko <ph name="NUMBER_ONE"/> sekundė</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> val.</translation>
<translation id="3990502903496589789">Dešinysis kraštas</translation>
<translation id="9038489124413477075">Aplankas be pavadinimo</translation>
+<translation id="1940483897317142625">Trinti iki eilutės pabaigos</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min.</translation>
<translation id="3520476450377425184">liko <ph name="NUMBER_MANY"/> dienos (-ų)</translation>
<translation id="932327136139879170">Pradžia</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">Prieš <ph name="NUMBER_FEW"/> dienas (-ų)</translation>
<translation id="5076340679995252485">&amp;Įklijuoti</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Perkelti per vieną žodį į dešinę</translation>
<translation id="364720409959344976">Pasirinkite norimą įkelti aplanką</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">Prieš <ph name="NUMBER_TWO"/> min.</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Uždaryti pranešimus</translation>
<translation id="6364916375976753737">Slinkti į kairę</translation>
<translation id="2629089419211541119">Prieš <ph name="NUMBER_ONE"/> val.</translation>
+<translation id="4218160142017529598">Trinti atgal</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> min.</translation>
<translation id="6982279413068714821">Prieš <ph name="NUMBER_DEFAULT"/> min.</translation>
<translation id="6945221475159498467">Pasirinkti</translation>
<translation id="6620110761915583480">Išsaugoti failą</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sek.</translation>
+<translation id="8924469368910458384">Trinti iki eilutės pradžios</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Liko <ph name="NUMBER_ONE"/> min.</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min.</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dienos</translation>
<translation id="7163503212501929773">liko <ph name="NUMBER_MANY"/> valandos (-ų)</translation>
<translation id="5329858601952122676">&amp;Pašalinti</translation>
+<translation id="6556866813142980365">Grąžinti</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sek.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> min.</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> min.</translation>
<translation id="50960180632766478">liko <ph name="NUMBER_FEW"/> min.</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">Perkelti į dešinę</translation>
<translation id="6659594942844771486">Skirtukas</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">Prieš <ph name="NUMBER_DEFAULT"/> dienas (-ų)</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> min.</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Leisti pranešimus iš šių plėtinių:</translation>
+<translation id="2479520428668657293">Perkelti į dešinę ir pakeisti pažymėtą tekstą</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> valandos (-ų)</translation>
<translation id="1398853756734560583">Išskleisti</translation>
<translation id="4250229828105606438">Ekrano kopija</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> valandos (-ų)</translation>
<translation id="5260878308685146029">liko <ph name="NUMBER_TWO"/> min.</translation>
+<translation id="2557207087669398617">Perkelti į eilutės pradžią</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Pasirinkti &amp;viską</translation>
<translation id="2168039046890040389">Puslapį į viršų</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dienos</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> min.</translation>
+<translation id="6122334925474904337">Perkelti per vieną žodį į dešinę ir pakeisti pažymėtą tekstą</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> min.</translation>
<translation id="8448317557906454022">Prieš <ph name="NUMBER_ZERO"/> sek.</translation>
<translation id="4927753642311223124">Čia nieko nėra, slinkite toliau.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Slinkti iki čia</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Perkelti žemyn</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> valandos (-ų)</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB per sek.</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">liko <ph name="NUMBER_ONE"/> val.</translation>
<translation id="1413622004203049571">Išjungti pranešimus nuo <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Į viršų</translation>
+<translation id="2538759511191347839">Perkelti į eilutės pabaigą ir pakeisti pažymėtą tekstą</translation>
+<translation id="928465423150706909">Perkelti į eilutės pabaigą</translation>
<translation id="8331626408530291785">Slinkti į viršų</translation>
<translation id="7907591526440419938">Atidaryti failą</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Sustabdyti mediją</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Atkurti</translation>
+<translation id="5349525451964472598">Perkelti į kairę ir pakeisti pažymėtą tekstą</translation>
+<translation id="1781701194097416995">Perkelti per vieną žodį į kairę</translation>
<translation id="1243314992276662751">Įkelti</translation>
<translation id="50030952220075532">liko <ph name="NUMBER_ONE"/> diena</translation>
<translation id="8179976553408161302">Įvesti</translation>
+<translation id="8471049483003785219">Perkelti per vieną žodį į kairę ir pakeisti pažymėtą tekstą</translation>
<translation id="945522503751344254">Siųsti atsiliepimą</translation>
<translation id="9170848237812810038">&amp;Atšaukti</translation>
<translation id="1285266685456062655">Prieš <ph name="NUMBER_FEW"/> val.</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> diena</translation>
+<translation id="2704295676501803339">Perkelti į kairę</translation>
<translation id="9098468523912235228">Prieš <ph name="NUMBER_DEFAULT"/> sek.</translation>
<translation id="494645311413743213">liko <ph name="NUMBER_TWO"/> sek.</translation>
<translation id="4570886800634958009">Išplėsti pranešimą</translation>
+<translation id="566737009157135450">Trinti žodį atgal</translation>
<translation id="436869212180315161">Spustelėti</translation>
<translation id="4860787810836767172">Prieš <ph name="NUMBER_FEW"/> sek.</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">Prieš <ph name="NUMBER_MANY"/> min.</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Žinynas</translation>
+<translation id="2405367043325750948">Trinti pirmyn</translation>
<translation id="6699343763173986273">Kitas medijos takelis</translation>
<translation id="5445120697129764393">Liko <ph name="NUMBER_DEFAULT"/> sekundžių</translation>
<translation id="8226233771743600312">Netrukdyti vieną dieną</translation>
+<translation id="4252565523989510616">Trinti žodį pirmyn</translation>
<translation id="7457942297256758195">Išvalyti viską</translation>
<translation id="822618367988303761">Prieš <ph name="NUMBER_TWO"/> dienas</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min.</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Kopijuoti į iškarpinę</translation>
<translation id="8371695176452482769">Kalbėti dabar</translation>
+<translation id="1167268268675672572">Perkelti į eilutės pradžią ir pakeisti pažymėtą tekstą</translation>
<translation id="6965382102122355670">Gerai</translation>
<translation id="7850320739366109486">Netrukdyti</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_lv.xtb b/ui/base/strings/ui_strings_lv.xtb
index 144d2d3f4a..9e340f44cb 100644
--- a/ui/base/strings/ui_strings_lv.xtb
+++ b/ui/base/strings/ui_strings_lv.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Bulta augšup</translation>
+<translation id="3969863827134279083">Pārvietot augšup</translation>
<translation id="7062130397825382308">Atlikusi <ph name="NUMBER_ONE"/> sekunde</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> stundas</translation>
<translation id="3990502903496589789">Labā puse</translation>
<translation id="9038489124413477075">Mape bez nosaukuma</translation>
+<translation id="1940483897317142625">Dzēst līdz rindiņas beigām</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minūtes</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dienas atlikušas</translation>
<translation id="932327136139879170">Sākumvieta</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">Pirms <ph name="NUMBER_FEW"/> dienām</translation>
<translation id="5076340679995252485">&amp;Ielīmēt</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Pārvietot pa labi par vienu vārdu</translation>
<translation id="364720409959344976">Augšupielādējamās mapes atlase</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Paziņojuma aizvēršana</translation>
<translation id="6364916375976753737">Ritināt pa kreisi</translation>
<translation id="2629089419211541119">Pirms <ph name="NUMBER_ONE"/> stundas</translation>
+<translation id="4218160142017529598">Dzēst iepriekšējo</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minūtes</translation>
<translation id="6982279413068714821">Pirms <ph name="NUMBER_DEFAULT"/> minūtēm</translation>
<translation id="6945221475159498467">Atlasīt</translation>
<translation id="6620110761915583480">Saglabāt failu</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sekunžu</translation>
+<translation id="8924469368910458384">Dzēst līdz rindiņas sākumam</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Atlikusi <ph name="NUMBER_ONE"/> minūte</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minūtes</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dienas</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/>stundas atlikušas</translation>
<translation id="5329858601952122676">Dzēst</translation>
+<translation id="6556866813142980365">Atcelt atsaukšanu</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sekundes</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minūtes atlikušas</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">Pārvietot pa labi</translation>
<translation id="6659594942844771486">Cilne</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">Pirms <ph name="NUMBER_DEFAULT"/> dienām</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minūtes</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Atļaut paziņojumu saņemšanu no:</translation>
+<translation id="2479520428668657293">Pārvietot pa labi un mainīt atlasi</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> stundas</translation>
<translation id="1398853756734560583">Maksimizēt</translation>
<translation id="4250229828105606438">Ekrānuzņēmums</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> stundas</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minūtes atlikušas</translation>
+<translation id="2557207087669398617">Pārvietot uz rindiņas sākumu</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Izvēlēties visus</translation>
<translation id="2168039046890040389">Augšup</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/>dienas</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minūtes</translation>
+<translation id="6122334925474904337">Pārvietot pa labi par vienu vārdu un mainīt atlasi</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minūte</translation>
<translation id="8448317557906454022">Pirms <ph name="NUMBER_ZERO"/> sekundēm</translation>
<translation id="4927753642311223124">Te nekā nav, varat doties tālāk!</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Ritināt šeit</translation>
<translation id="4552416320897244156">Lejup</translation>
+<translation id="3066573403916685335">Pārvietot lejup</translation>
<translation id="7052633198403197513">taustiņš F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> stundas</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> stundas atlikušas</translation>
<translation id="1413622004203049571">Atspējot paziņojumu saņemšanu no: <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Augša</translation>
+<translation id="2538759511191347839">Pārvietot uz rindiņas beigām un mainīt atlasi</translation>
+<translation id="928465423150706909">Pārvietot uz rindiņas beigām</translation>
<translation id="8331626408530291785">Ritināt augšup</translation>
<translation id="7907591526440419938">Atvērt failu</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Multivide — pārtraukt</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Atjaunot</translation>
+<translation id="5349525451964472598">Pārvietot pa kreisi un mainīt atlasi</translation>
+<translation id="1781701194097416995">Pārvietot pa kreisi par vienu vārdu</translation>
<translation id="1243314992276662751">Augšupielādēt</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dienas atlikušas</translation>
<translation id="8179976553408161302">Ievadīt</translation>
+<translation id="8471049483003785219">Pārvietot pa kreisi par vienu vārdu un mainīt atlasi</translation>
<translation id="945522503751344254">Sūtīt atsauksmes</translation>
<translation id="9170848237812810038">&amp;Atsaukt</translation>
<translation id="1285266685456062655">Pirms <ph name="NUMBER_FEW"/> stundām</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> diena</translation>
+<translation id="2704295676501803339">Pārvietot pa kreisi</translation>
<translation id="9098468523912235228">Pirms <ph name="NUMBER_DEFAULT"/> sekundēm</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> sekundes atlikušas</translation>
<translation id="4570886800634958009">Paziņojuma izvēršana</translation>
+<translation id="566737009157135450">Dzēst iepriekšējo vārdu</translation>
<translation id="436869212180315161">Nospiediet</translation>
<translation id="4860787810836767172">Pirms <ph name="NUMBER_FEW"/> sekundēm</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Palīdzība</translation>
+<translation id="2405367043325750948">Dzēst nākamo</translation>
<translation id="6699343763173986273">Multivide — nākamā dziesma</translation>
<translation id="5445120697129764393">Atlikušas <ph name="NUMBER_DEFAULT"/> sekundes</translation>
<translation id="8226233771743600312">Netraucēt dienu</translation>
+<translation id="4252565523989510616">Dzēst nākamo vārdu</translation>
<translation id="7457942297256758195">Notīrīt visu</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minūtes</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Kopēt starpliktuvē</translation>
<translation id="8371695176452482769">Runājiet tūlīt</translation>
+<translation id="1167268268675672572">Pārvietot uz rindiņas sākumu un mainīt atlasi</translation>
<translation id="6965382102122355670">Labi</translation>
<translation id="7850320739366109486">Netraucēt</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_ml.xtb b/ui/base/strings/ui_strings_ml.xtb
index d74c461d3c..e1e5fc9bb4 100644
--- a/ui/base/strings/ui_strings_ml.xtb
+++ b/ui/base/strings/ui_strings_ml.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">മുകളിലേക്കുള്ള അമ്പടയാളം</translation>
+<translation id="3969863827134279083">മുകളിലേക്ക് നീക്കുക</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> നിമിഷം ശേഷിക്കുന്നു</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> മണിക്കൂര്‍</translation>
<translation id="3990502903496589789">വലത് അഗ്രം</translation>
<translation id="9038489124413477075">പേരിടാത്ത ഫോൾഡർ</translation>
+<translation id="1940483897317142625">വരിയുടെ അവസാനം വരെ ഇല്ലാതാക്കുക</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> മിനിറ്റ്</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> ദിവസം‍ ശേഷിക്കുന്നു</translation>
<translation id="932327136139879170">ഹോം</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;ഒട്ടിക്കുക</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">വലതുവശത്തുള്ള പദത്തിലേക്ക് നീക്കുക</translation>
<translation id="364720409959344976">അപ്‌ലോഡുചെയ്യുന്നതിന് ഫോൾഡർ തിരഞ്ഞെടുക്കുക</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">അറിയിപ്പ് അടയ്‌ക്കൽ</translation>
<translation id="6364916375976753737">ഇടത്തേക്ക് സ്ക്രോള്‍ ചെയ്യുക</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation>
+<translation id="4218160142017529598">പുറകിലേക്ക് ഇല്ലാതാക്കുക</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> മിനിറ്റ്</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation>
<translation id="6945221475159498467">തിരഞ്ഞെടുക്കുക</translation>
<translation id="6620110761915583480">ഫയല്‍‌ സംരക്ഷിക്കുക</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> സെക്കൻഡ്</translation>
+<translation id="8924469368910458384">വരിയുടെ തുടക്കം വരെ ഇല്ലാതാക്കുക</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> മിനിറ്റ് ശേഷിക്കുന്നു</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> മിനിറ്റ്</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ദിവസം</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> മണിക്കൂര്‍ ശേഷിക്കുന്നു</translation>
<translation id="5329858601952122676">&amp;ഇല്ലാതാക്കൂ</translation>
+<translation id="6556866813142980365">വീണ്ടുംചെയ്യുക</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> സെക്കന്റ്</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> മിനിറ്റ്</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> മിനിറ്റ്</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> മിനിറ്റ്‍ അവശേഷിക്കുന്നു</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> നിമിഷം ശേഷിക്കുന്നു</translation>
+<translation id="6903282483217634857">വലതുവശത്തേക്ക് നീക്കുക</translation>
<translation id="6659594942844771486">ടാബ്</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> മിനിറ്റ്</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">ഇനിപ്പറയുന്നതിൽ നിന്നുള്ള അറിയിപ്പുകൾ അനുവദിക്കുക:</translation>
+<translation id="2479520428668657293">വലതുവശത്തേക്ക് നീക്കി തിരഞ്ഞെടുത്തത് പരിഷ്‌ക്കരിക്കുക</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> മണിക്കൂര്‍</translation>
<translation id="1398853756734560583">വലുതാക്കുക</translation>
<translation id="4250229828105606438">സ്‌ക്രീൻഷോട്ട്</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> മണിക്കൂര്‍</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> മിനിറ്റ് അവശേഷിക്കുന്നു</translation>
+<translation id="2557207087669398617">വരിയുടെ തുടക്കത്തിലേക്ക് നീക്കുക</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">എല്ലാം &amp;തിരഞ്ഞെടുക്കൂ</translation>
<translation id="2168039046890040389">പേജ് മുകളിലേയ്ക്ക്</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> ദിവസം</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> മിനിറ്റ്</translation>
+<translation id="6122334925474904337">വലതുവശത്തുള്ള പദത്തിലേക്ക് നീക്കി തിരഞ്ഞെടുത്തത് പരിഷ്‌ക്കരിക്കുക</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> മിനിറ്റ്</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">ഇവിടെ കാണുന്നതിനായി ഒന്നുമില്ല, തുടരുക.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">ഇവിടെ സ്ക്രോള്‍ ചെയ്യുക</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">താഴേക്ക് നീക്കുക</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> മണിക്കൂര്‍</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> മണിക്കൂര്‍ ശേഷിക്കുന്നു</translation>
<translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> എന്നതിൽ നിന്നുള്ള അറിയിപ്പുകൾ പ്രവർത്തനരഹിതമാക്കുക</translation>
<translation id="2666092431469916601">മുകളിലേക്ക്</translation>
+<translation id="2538759511191347839">വരിയുടെ അവസാനത്തിലേക്ക് നീക്കി തിരഞ്ഞെടുത്തത് പരിഷ്‌ക്കരിക്കുക</translation>
+<translation id="928465423150706909">വരിയുടെ അവസാനത്തിലേക്ക് നീക്കുക</translation>
<translation id="8331626408530291785">മുകളിലേക്ക് സ്ക്രോള്‍ ചെയ്യൂ</translation>
<translation id="7907591526440419938">ഫയല്‍ തുറക്കുക</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">മീഡിയ ‌നിർത്തുക</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">പുനഃസ്ഥാപിക്കുക</translation>
+<translation id="5349525451964472598">ഇടത് വശത്തേക്ക് നീക്കി തിരഞ്ഞെടുത്തത് പരിഷ്‌ക്കരിക്കുക</translation>
+<translation id="1781701194097416995">ഇടതുവശത്തുള്ള പദത്തിലേക്ക് നീക്കുക</translation>
<translation id="1243314992276662751">അപ്‌ലോഡുചെയ്യുക</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> ദിവസം അവശേഷിക്കുന്നു</translation>
<translation id="8179976553408161302">നൽകുക</translation>
+<translation id="8471049483003785219">ഇടതുവശത്തുള്ള പദത്തിലേക്ക് നീക്കി തിരഞ്ഞെടുത്ത് പരിഷ്‌ക്കരിക്കുക</translation>
<translation id="945522503751344254">ഫീഡ്ബാക്ക് അയയ്ക്കുക</translation>
<translation id="9170848237812810038">‍&amp;പൂര്‍വാവസ്ഥയിലാക്കുക</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> ദിവസം</translation>
+<translation id="2704295676501803339">ഇടതുവശത്തേക്ക് നീക്കുക</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> സെക്കന്റ് മുമ്പ്</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> സെക്കന്റ് അവശേഷിക്കുന്നു</translation>
<translation id="4570886800634958009">അറിയിപ്പ് വിപുലീകരണം</translation>
+<translation id="566737009157135450">പദം പുറകിലേക്ക് ഇല്ലാതാക്കുക</translation>
<translation id="436869212180315161">അമര്‍ത്തുക</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">സഹായം</translation>
+<translation id="2405367043325750948">മുമ്പിലേക്ക് ഇല്ലാതാക്കുക</translation>
<translation id="6699343763173986273">അടുത്ത മീഡിയ ട്രാക്ക്</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> നിമിഷം ശേഷിക്കുന്നു</translation>
<translation id="8226233771743600312">ഒരു ദിവസത്തേക്ക് ശല്യപ്പെടുത്തരുത്</translation>
+<translation id="4252565523989510616">പദം മുമ്പിലേക്ക് ഇല്ലാതാക്കുക</translation>
<translation id="7457942297256758195">എല്ലാം മായ്‌ക്കുക</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> മിനിറ്റ്</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തുക</translation>
<translation id="8371695176452482769">ഇപ്പോള്‍ സംസാരിക്കുക</translation>
+<translation id="1167268268675672572">വരിയുടെ തുടക്കത്തിലേക്ക് നീക്കി തിരഞ്ഞെടുത്തത് പരിഷ്‌ക്കരിക്കുക</translation>
<translation id="6965382102122355670">ശരി</translation>
<translation id="7850320739366109486">ശല്യം ചെയ്യരുത്</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_mr.xtb b/ui/base/strings/ui_strings_mr.xtb
index e951afc500..6a7b562700 100644
--- a/ui/base/strings/ui_strings_mr.xtb
+++ b/ui/base/strings/ui_strings_mr.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Up Arrow</translation>
+<translation id="3969863827134279083">वर हलवा</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> सेकंद शिल्लक</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> तास</translation>
<translation id="3990502903496589789">उजवा काठ</translation>
<translation id="9038489124413477075">अनामित फोल्डर</translation>
+<translation id="1940483897317142625">ओळीच्या समाप्तीपर्यंत हटवा</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> मि</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> दिवस बाकी</translation>
<translation id="932327136139879170">मुख्यपृष्ठ</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;पेस्ट करा</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">शब्द उजवीकडे हलवा</translation>
<translation id="364720409959344976">अपलोड करण्यासाठी फोल्डर निवडा</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">सूचना बंद</translation>
<translation id="6364916375976753737">डावीकडे स्क्रोल करा</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation>
+<translation id="4218160142017529598">मागील हटवा</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> मिनिटे</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation>
<translation id="6945221475159498467">निवडा</translation>
<translation id="6620110761915583480">फाइल जतन करा</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> सेकंद</translation>
+<translation id="8924469368910458384">ओळीच्या सुरुवातीपर्यंत हटवा</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> मिनिट शिल्लक</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> मि</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> दिवस</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> तास बाकी</translation>
<translation id="5329858601952122676">&amp;हटवा</translation>
+<translation id="6556866813142980365">पुन्हा करा</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> से</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> मिनिटे</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> मिनिटे</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> मि बाकी</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> सेकंद शिल्लक</translation>
+<translation id="6903282483217634857">उजवीकडे हलवा</translation>
<translation id="6659594942844771486">टॅब</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> मि</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">खालील लोकांकडील सूचनांना अनुमत करा:</translation>
+<translation id="2479520428668657293">उजवीकडे हलवा आणि निवड सुधारित करा</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> तास</translation>
<translation id="1398853756734560583">वाढवा</translation>
<translation id="4250229828105606438">स्क्रीनशॉट</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> तास</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> मि बाकी</translation>
+<translation id="2557207087669398617">ओळीच्या सुरुवातीस हलवा</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">&amp;सर्व निवडा</translation>
<translation id="2168039046890040389">पृष्ठ वर</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> दिवस</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> मि</translation>
+<translation id="6122334925474904337">शब्द उजवीकडे हलवा आणि निवड सुधारित करा</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> मिनिट</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">येथे पाहण्यासाठी काही नाही, पुढे चला.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">येथे स्क्रोल करा</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">खाली हलवा</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> तास</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> तास बाकी</translation>
<translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> वरील सूचना अक्षम करा</translation>
<translation id="2666092431469916601">शीर्ष</translation>
+<translation id="2538759511191347839">ओळीच्या समाप्तीवर हलवा आणि निवड सुधारित करा</translation>
+<translation id="928465423150706909">ओळीच्या समाप्तीवर हलवा</translation>
<translation id="8331626408530291785">वर स्क्रोल करा</translation>
<translation id="7907591526440419938">फाइल उघडा</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">मीडिया थांबवा</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">पुनर्संचयित करा</translation>
+<translation id="5349525451964472598">डावीकडे हलवा आणि निवड सुधारित करा</translation>
+<translation id="1781701194097416995">शब्द डावीकडे हलवा</translation>
<translation id="1243314992276662751">अपलोड करा</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> दिवस बाकी</translation>
<translation id="8179976553408161302">प्रवेश करा</translation>
+<translation id="8471049483003785219">शब्द डावीकडे हलवा आणि निवड सुधारित करा</translation>
<translation id="945522503751344254">अभिप्राय पाठवा</translation>
<translation id="9170848237812810038">&amp;पूर्ववत करा</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> दिवस</translation>
+<translation id="2704295676501803339">डावीकडे हलवा</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> से बाकी</translation>
<translation id="4570886800634958009">सूचना विस्तार</translation>
+<translation id="566737009157135450">मागचा शब्द हटवा</translation>
<translation id="436869212180315161">दाबा</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">मदत</translation>
+<translation id="2405367043325750948">पुढचा हटवा</translation>
<translation id="6699343763173986273">मीडिया पुढील ट्रॅक</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> सेकंद शिल्लक</translation>
<translation id="8226233771743600312">एक दिवस व्यत्यय आणू नका</translation>
+<translation id="4252565523989510616">पुढचा शब्द हटवा</translation>
<translation id="7457942297256758195">सर्व साफ करा</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> मि</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">क्लिपबोर्डवर कॉपी करा</translation>
<translation id="8371695176452482769">आता बोला</translation>
+<translation id="1167268268675672572">ओळीच्या सुरुवातीवर हलवा आणि निवड सुधारित करा</translation>
<translation id="6965382102122355670">ठिक आहे</translation>
<translation id="7850320739366109486">व्यत्यय आणू नका</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_ms.xtb b/ui/base/strings/ui_strings_ms.xtb
index 04b3cc4ba9..c94b4f1220 100644
--- a/ui/base/strings/ui_strings_ms.xtb
+++ b/ui/base/strings/ui_strings_ms.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Anak Panah Atas</translation>
+<translation id="3969863827134279083">Alihkan ke Atas</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> saat lagi</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> jam</translation>
<translation id="3990502903496589789">Tepi Kanan</translation>
<translation id="9038489124413477075">Folder Tanpa Nama</translation>
+<translation id="1940483897317142625">Padamkan Hingga Akhir Baris</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> mins</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> hari lagi</translation>
<translation id="932327136139879170">Halaman Utama</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> hari yang lalu</translation>
<translation id="5076340679995252485">&amp;Tampal</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Alihkan Perkataan ke Kanan</translation>
<translation id="364720409959344976">Pilih Folder untuk Dimuat Naik</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> minit lalu</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Tutup Pemberitahuan</translation>
<translation id="6364916375976753737">Tatal Ke Kiri</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> jam yang lalu</translation>
+<translation id="4218160142017529598">Padamkan ke Belakang</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minit</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minit yang lalu</translation>
<translation id="6945221475159498467">Pilih</translation>
<translation id="6620110761915583480">Simpan Fail</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> saat</translation>
+<translation id="8924469368910458384">Padamkan Hingga Permulaan Baris</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> jam</translation>
<translation id="7836361698254323868">Tinggal <ph name="NUMBER_ONE"/> minit</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minit</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> hari</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> jam lagi</translation>
<translation id="5329858601952122676">&amp;Padam</translation>
+<translation id="6556866813142980365">Buat semula</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> saat</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minit</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minit</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minit lagi</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> saat lagi</translation>
+<translation id="6903282483217634857">Alihkan Ke Kanan</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> hari yang lalu</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> mins</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> jam lagi</translation>
<translation id="7135556860107312402">Benarkan pemberitahuan daripada yang berikut:</translation>
+<translation id="2479520428668657293">Alihkan Ke Kanan Dan Ubah Suai Pilihan</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> jam</translation>
<translation id="1398853756734560583">Maksimumkan</translation>
<translation id="4250229828105606438">Tangkapan skrin</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> jam</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minit lagi</translation>
+<translation id="2557207087669398617">Alihkan Ke Permulaan Baris</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Pilih &amp;semua</translation>
<translation id="2168039046890040389">Halaman Ke Atas</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> hari</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mins</translation>
+<translation id="6122334925474904337">Alihkan Perkataan ke Kanan Dan Ubah Suai Pilihan</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minit</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> saat yang lalu</translation>
<translation id="4927753642311223124">Tiada apa-apa untuk dilihat di sini, teruskan.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> hari</translation>
<translation id="3183922693828471536">Tatal ke Sini</translation>
<translation id="4552416320897244156">BwhHlmn</translation>
+<translation id="3066573403916685335">Alihkan Ke Bawah</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> jam</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> jam lagi</translation>
<translation id="1413622004203049571">Lumpuhkan pemberitahuan daripada <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Atas</translation>
+<translation id="2538759511191347839">Alihkan Ke Hujung Baris Dan Ubah Suai Pilihan</translation>
+<translation id="928465423150706909">Alihkan Ke Hujung Baris</translation>
<translation id="8331626408530291785">Tatal Ke Atas</translation>
<translation id="7907591526440419938">Buka Fail</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> hari lagi</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Media Berhenti</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> minit lagi</translation>
<translation id="3157931365184549694">Pulihkan</translation>
+<translation id="5349525451964472598">Alihkan Ke Kiri Dan Ubah Suai Pilihan</translation>
+<translation id="1781701194097416995">Alihkan Perkataan Ke Kiri</translation>
<translation id="1243314992276662751">Muat naik</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> hari lagi</translation>
<translation id="8179976553408161302">Masuk</translation>
+<translation id="8471049483003785219">Alihkan Perkataan Ke Kiri dan Ubah Suai Pilihan</translation>
<translation id="945522503751344254">Hantar maklum balas</translation>
<translation id="9170848237812810038">&amp;Buat asal</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> jam yang lalu</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> jam yang lalu</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> hari</translation>
+<translation id="2704295676501803339">Alihkan Ke Kiri</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> saat yang lalu</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> saat lagi</translation>
<translation id="4570886800634958009">Kembangkan pemberitahuan</translation>
+<translation id="566737009157135450">Padamkan Perkataan Ke Belakang</translation>
<translation id="436869212180315161">Tekan</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> saat yang lalu</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> minit yang lalu</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Bantuan</translation>
+<translation id="2405367043325750948">Padamkan Ke Hadapan</translation>
<translation id="6699343763173986273">Lagu Media Seterusnya</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> saat lagi</translation>
<translation id="8226233771743600312">Jangan ganggu selama sehari</translation>
+<translation id="4252565523989510616">Padamkan Perkataan Ke Hadapan</translation>
<translation id="7457942297256758195">Kosongkan Semua</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> hari yang lalu</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mins</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Salin ke papan keratan</translation>
<translation id="8371695176452482769">Cakap sekarang</translation>
+<translation id="1167268268675672572">Alihkan Ke Permulaan Baris Dan Ubah Suai Pilihan</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Jangan Ganggu</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> hari yang lalu</translation>
diff --git a/ui/base/strings/ui_strings_nl.xtb b/ui/base/strings/ui_strings_nl.xtb
index 9d174b7c9c..5cbf083a97 100644
--- a/ui/base/strings/ui_strings_nl.xtb
+++ b/ui/base/strings/ui_strings_nl.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Pijl-omhoog</translation>
+<translation id="3969863827134279083">Naar boven</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> seconde resterend</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> uur</translation>
<translation id="3990502903496589789">Rechterzijde</translation>
<translation id="9038489124413477075">Naamloze map</translation>
+<translation id="1940483897317142625">Verwijderen tot einde van regel</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minuten</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dagen resterend</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> dagen geleden</translation>
<translation id="5076340679995252485">&amp;Plakken</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Eén woord naar rechts</translation>
<translation id="364720409959344976">Map voor uploaden selecteren</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> minuten geleden</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Melding sluiten</translation>
<translation id="6364916375976753737">Naar links bladeren</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> uur geleden</translation>
+<translation id="4218160142017529598">Achterwaarts verwijderen</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuten</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minuten geleden</translation>
<translation id="6945221475159498467">Selecteren</translation>
<translation id="6620110761915583480">Bestand opslaan</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconden</translation>
+<translation id="8924469368910458384">Verwijderen tot begin van regel</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minuut resterend</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minuut</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dagen</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> uur resterend</translation>
<translation id="5329858601952122676">Verwij&amp;deren</translation>
+<translation id="6556866813142980365">Opnieuw</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> seconden</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuten</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minuten resterend</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconden resterend</translation>
+<translation id="6903282483217634857">Naar rechts verplaatsen</translation>
<translation id="6659594942844771486">Tabblad</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> dagen geleden</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minuten</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Meldingen toestaan van het volgende:</translation>
+<translation id="2479520428668657293">Naar rechts verplaatsen en selectie aanpassen</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> uur</translation>
<translation id="1398853756734560583">Maximaliseren</translation>
<translation id="4250229828105606438">Screenshot</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> uur</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minuten resterend</translation>
+<translation id="2557207087669398617">Naar begin van regel verplaatsen</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">&amp;Alles selecteren</translation>
<translation id="2168039046890040389">Pagina omhoog</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dagen</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minuten</translation>
+<translation id="6122334925474904337">Eén woord naar rechts verplaatsen en selectie aanpassen</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuut</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> seconden geleden</translation>
<translation id="4927753642311223124">Er zijn geen meldingen.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Hiernaartoe bladeren</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Naar beneden</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> uur</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> uur resterend</translation>
<translation id="1413622004203049571">Meldingen van <ph name="NOTIFIER_NAME"/> uitschakelen</translation>
<translation id="2666092431469916601">Boven</translation>
+<translation id="2538759511191347839">Naar einde van regel verplaatsen en selectie aanpassen</translation>
+<translation id="928465423150706909">Naar einde van regel verplaatsen</translation>
<translation id="8331626408530291785">Omhoog bladeren</translation>
<translation id="7907591526440419938">Bestand openen</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Media stoppen</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Herstellen</translation>
+<translation id="5349525451964472598">Naar links verplaatsen en selectie aanpassen</translation>
+<translation id="1781701194097416995">Eén woord naar links verplaatsen</translation>
<translation id="1243314992276662751">Uploaden</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dag resterend</translation>
<translation id="8179976553408161302">Beginnen</translation>
+<translation id="8471049483003785219">Eén woord naar links verplaatsen en selectie aanpassen</translation>
<translation id="945522503751344254">Feedback verzenden</translation>
<translation id="9170848237812810038">&amp;Ongedaan maken</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> uur geleden</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dag</translation>
+<translation id="2704295676501803339">Naar links verplaatsen</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> seconden geleden</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> seconden resterend</translation>
<translation id="4570886800634958009">Melding uitbreiden</translation>
+<translation id="566737009157135450">Het voorgaande woord verwijderen</translation>
<translation id="436869212180315161">Drukken</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> seconden geleden</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> minuten geleden</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Help</translation>
+<translation id="2405367043325750948">Voorwaarts verwijderen</translation>
<translation id="6699343763173986273">Volgende track voor media</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> seconden resterend</translation>
<translation id="8226233771743600312">Een dag niet storen</translation>
+<translation id="4252565523989510616">Het volgende woord verwijderen</translation>
<translation id="7457942297256758195">Alles wissen</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> dagen geleden</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minuten</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Kopiëren naar klembord</translation>
<translation id="8371695176452482769">Begin nu te spreken</translation>
+<translation id="1167268268675672572">Naar begin van regel verplaatsen en selectie aanpassen</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Niet storen</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_no.xtb b/ui/base/strings/ui_strings_no.xtb
index 1a45a2480c..01243cd961 100644
--- a/ui/base/strings/ui_strings_no.xtb
+++ b/ui/base/strings/ui_strings_no.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Pil opp</translation>
+<translation id="3969863827134279083">Flytt opp</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> sekund igjen</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB per sek.</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> timer</translation>
<translation id="3990502903496589789">Høyre kant</translation>
<translation id="9038489124413477075">Mappe uten navn</translation>
+<translation id="1940483897317142625">Slett til slutten av linjen</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutter</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dager igjen</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;Lim inn</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Flytt ett ord til høyre</translation>
<translation id="364720409959344976">Velg mappen du vil laste opp</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Lukk varsel</translation>
<translation id="6364916375976753737">Rull mot venstre</translation>
<translation id="2629089419211541119">For <ph name="NUMBER_ONE"/> time siden</translation>
+<translation id="4218160142017529598">Slett bakover</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutter</translation>
<translation id="6982279413068714821">For <ph name="NUMBER_DEFAULT"/> minutter siden</translation>
<translation id="6945221475159498467">Velg</translation>
<translation id="6620110761915583480">Lagre fil</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sekunder</translation>
+<translation id="8924469368910458384">Slett til begynnelsen av linjen</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minutt igjen</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minutt</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dager</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> timer igjen</translation>
<translation id="5329858601952122676">&amp;Slett</translation>
+<translation id="6556866813142980365">Gjør om</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sekunder</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutter</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutter</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutter igjen</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> sekunder igjen</translation>
+<translation id="6903282483217634857">Flytt til høyre</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">For <ph name="NUMBER_DEFAULT"/> dager siden</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutter</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Tillat varsler fra følgende:</translation>
+<translation id="2479520428668657293">Flytt til høyre og endre merkingen</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> timer</translation>
<translation id="1398853756734560583">Maksimer</translation>
<translation id="4250229828105606438">Skjermdump</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> timer</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minutter igjen</translation>
+<translation id="2557207087669398617">Flytt til begynnelsen av linjen</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Marker &amp;alt</translation>
<translation id="2168039046890040389">Opp 1 s.</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dager</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutter</translation>
+<translation id="6122334925474904337">Flytt ett ord til høyre og endre merkingen</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minutt</translation>
<translation id="8448317557906454022">For <ph name="NUMBER_ZERO"/> sekunder siden</translation>
<translation id="4927753642311223124">Det er ikke noe å se her. Gå videre.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Rull hit</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Flytt ned</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> timer</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB per sek</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> time igjen</translation>
<translation id="1413622004203049571">Deaktiver varsler fra <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Topp</translation>
+<translation id="2538759511191347839">Flytt til slutten av linjen og endre merkingen</translation>
+<translation id="928465423150706909">Flytt til slutten av linjen</translation>
<translation id="8331626408530291785">Rull opp</translation>
<translation id="7907591526440419938">Åpne filen</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Media – stopp</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Gjenopprett</translation>
+<translation id="5349525451964472598">Flytt til venstre og endre merkingen</translation>
+<translation id="1781701194097416995">Flytt ett ord til venstre</translation>
<translation id="1243314992276662751">Last opp</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dag igjen</translation>
<translation id="8179976553408161302">Start</translation>
+<translation id="8471049483003785219">Flytt ett ord til venstre og endre merkingen</translation>
<translation id="945522503751344254">Gi tilbakemelding</translation>
<translation id="9170848237812810038">&amp;Angre</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB per sek</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dag</translation>
+<translation id="2704295676501803339">Flytt til venstre</translation>
<translation id="9098468523912235228">For <ph name="NUMBER_DEFAULT"/> sekunder siden</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> sekunder igjen</translation>
<translation id="4570886800634958009">Utvid varsel</translation>
+<translation id="566737009157135450">Slett ett ord bakover</translation>
<translation id="436869212180315161">Trykk</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB per sek</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B per sek</translation>
<translation id="7649070708921625228">Hjelp</translation>
+<translation id="2405367043325750948">Slett fremover</translation>
<translation id="6699343763173986273">Media – neste spor</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> sekunder igjen</translation>
<translation id="8226233771743600312">Ikke forstyrr i en dag</translation>
+<translation id="4252565523989510616">Slett ett ord fremover</translation>
<translation id="7457942297256758195">Fjern alle</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutter</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB per sek</translation>
<translation id="2743387203779672305">Kopiér til utklippstavlen</translation>
<translation id="8371695176452482769">Snakk nå</translation>
+<translation id="1167268268675672572">Flytt til begynnelsen av linjen og endre merkingen</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Ikke forstyrr</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_pl.xtb b/ui/base/strings/ui_strings_pl.xtb
index 407920a0cc..4e91ca29d6 100644
--- a/ui/base/strings/ui_strings_pl.xtb
+++ b/ui/base/strings/ui_strings_pl.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Strzałka w górę</translation>
+<translation id="3969863827134279083">Przejdź do góry</translation>
<translation id="7062130397825382308">Pozostała <ph name="NUMBER_ONE"/> sekunda</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> godz.</translation>
<translation id="3990502903496589789">Krawędź po prawej</translation>
<translation id="9038489124413477075">Folder bez nazwy</translation>
+<translation id="1940483897317142625">Usuń do końca wiersza</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dni</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> dni temu</translation>
<translation id="5076340679995252485">&amp;Wklej</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Przejdź o słowo w prawo</translation>
<translation id="364720409959344976">Wybierz folder do przesłania</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> min temu</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Zamknięcie powiadomienia</translation>
<translation id="6364916375976753737">Przewiń w lewo</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> godz. temu</translation>
+<translation id="4218160142017529598">Usuń przed kursorem</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuty</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> min temu</translation>
<translation id="6945221475159498467">Wybierz</translation>
<translation id="6620110761915583480">Zapisz plik</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation>
+<translation id="8924469368910458384">Usuń do początku wiersza</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Pozostała <ph name="NUMBER_ONE"/> minuta</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863">Liczba dni: <ph name="NUMBER_MANY"/></translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> godz</translation>
<translation id="5329858601952122676">&amp;Usuń</translation>
+<translation id="6556866813142980365">Ponów</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> s</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> min</translation>
<translation id="5517291721709019259">Pozostały <ph name="NUMBER_FEW"/> sekundy</translation>
+<translation id="6903282483217634857">Przejdź w prawo</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> dni temu</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> min</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Zezwalaj na powiadomienia z:</translation>
+<translation id="2479520428668657293">Przejdź w prawo i zmodyfikuj zaznaczenie</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> godz.</translation>
<translation id="1398853756734560583">Maksymalizuj</translation>
<translation id="4250229828105606438">Zrzut ekranu</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> godz.</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> min</translation>
+<translation id="2557207087669398617">Przejdź na początek wiersza</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Zaznacz &amp;wszystko</translation>
<translation id="2168039046890040389">Strona do góry</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581">Liczba dni: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> min</translation>
+<translation id="6122334925474904337">Przejdź o słowo w prawo i zmodyfikuj zaznaczenie</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuta</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Nic tu nie ma.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Przewiń tutaj</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Przejdź w dół</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> godz.</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">Pozostała <ph name="NUMBER_ONE"/> godzina</translation>
<translation id="1413622004203049571">Wyłącz powiadomienia z <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Do góry</translation>
+<translation id="2538759511191347839">Przejdź na koniec wiersza i zmodyfikuj zaznaczenie</translation>
+<translation id="928465423150706909">Przejdź na koniec wiersza</translation>
<translation id="8331626408530291785">Przewiń w górę</translation>
<translation id="7907591526440419938">Otwórz plik</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Zatrzymaj multimedia</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Przywróć</translation>
+<translation id="5349525451964472598">Przejdź w lewo i zmodyfikuj zaznaczenie</translation>
+<translation id="1781701194097416995">Przejdź o słowo w lewo</translation>
<translation id="1243314992276662751">Prześlij</translation>
<translation id="50030952220075532">Pozostał <ph name="NUMBER_ONE"/> dzień</translation>
<translation id="8179976553408161302">Start</translation>
+<translation id="8471049483003785219">Przejdź o słowo w lewo i zmodyfikuj zaznaczenie</translation>
<translation id="945522503751344254">Wyślij zgłoszenie</translation>
<translation id="9170848237812810038">&amp;Cofnij</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> godz. temu</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dzień</translation>
+<translation id="2704295676501803339">Przejdź w lewo</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> s temu</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> sek</translation>
<translation id="4570886800634958009">Rozwinięcie powiadomienia</translation>
+<translation id="566737009157135450">Usuń słowo przed kursorem</translation>
<translation id="436869212180315161">Kliknij</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> s temu</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Pomoc</translation>
+<translation id="2405367043325750948">Usuń za kursorem</translation>
<translation id="6699343763173986273">Następny utwór multimedialny</translation>
<translation id="5445120697129764393">Pozostało <ph name="NUMBER_DEFAULT"/> sekund</translation>
<translation id="8226233771743600312">Nie przeszkadzać przez jeden dzień</translation>
+<translation id="4252565523989510616">Usuń słowo za kursorem</translation>
<translation id="7457942297256758195">Wyczyść wszystkie</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> dni temu</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Skopiuj do schowka</translation>
<translation id="8371695176452482769">Mów teraz</translation>
+<translation id="1167268268675672572">Przejdź na początek wiersza i zmodyfikuj zaznaczenie</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Nie przeszkadzać</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_pt-BR.xtb b/ui/base/strings/ui_strings_pt-BR.xtb
index 089dda7582..f0855dc13f 100644
--- a/ui/base/strings/ui_strings_pt-BR.xtb
+++ b/ui/base/strings/ui_strings_pt-BR.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> bytes</translation>
<translation id="3660179305079774227">Seta para cima</translation>
+<translation id="3969863827134279083">Mover para cima</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> segundo restante</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> horas</translation>
<translation id="3990502903496589789">Borda direita</translation>
<translation id="9038489124413477075">Pasta sem nome</translation>
+<translation id="1940483897317142625">Excluir até o fim da linha</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutos</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dias restantes</translation>
<translation id="932327136139879170">Página inicial</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;Colar</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Mover para palavra à direita</translation>
<translation id="364720409959344976">Selecionar pasta para upload</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Fechar notificação</translation>
<translation id="6364916375976753737">Percorrer à esquerda</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hora atrás</translation>
+<translation id="4218160142017529598">Excluir para trás</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutos</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> minutos atrás</translation>
<translation id="6945221475159498467">Selecionar</translation>
<translation id="6620110761915583480">Salvar arquivo</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> segundos</translation>
+<translation id="8924469368910458384">Excluir até o começo da linha</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minuto restante</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minuto</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dias</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> horas restantes</translation>
<translation id="5329858601952122676">&amp;Excluir</translation>
+<translation id="6556866813142980365">Refazer</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> s</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutos</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutos</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutos restantes</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">Mover para a direita</translation>
<translation id="6659594942844771486">Guia</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> dias atrás</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minutos</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Permitir as seguintes notificações:</translation>
+<translation id="2479520428668657293">Mover para a direita e modificar seleção</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> horas</translation>
<translation id="1398853756734560583">Maximizar</translation>
<translation id="4250229828105606438">Captura de tela</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> horas</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minutos restantes</translation>
+<translation id="2557207087669398617">Mover para o início da linha</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Selecionar &amp;tudo</translation>
<translation id="2168039046890040389">Página para cima</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dias</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minutos</translation>
+<translation id="6122334925474904337">Mover para palavra à direita e modificar seleção</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Nada para ver aqui, siga em frente.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Percorrer até aqui</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Mover para baixo</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> horas</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hora restante</translation>
<translation id="1413622004203049571">Desativar notificações de <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Parte superior</translation>
+<translation id="2538759511191347839">Mover para o fim da linha e modificar seleção</translation>
+<translation id="928465423150706909">Mover para o fim da linha</translation>
<translation id="8331626408530291785">Percorrer para cima</translation>
<translation id="7907591526440419938">Abrir arquivo</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Parar mídia</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restaurar</translation>
+<translation id="5349525451964472598">Mover para a esquerda e modificar seleção</translation>
+<translation id="1781701194097416995">Mover para palavra à esquerda</translation>
<translation id="1243314992276662751">Fazer upload</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dia restante</translation>
<translation id="8179976553408161302">Entrar</translation>
+<translation id="8471049483003785219">Mover para palavra à esquerda e modificar seleção</translation>
<translation id="945522503751344254">Enviar comentários</translation>
<translation id="9170848237812810038">&amp;Desfazer</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dia</translation>
+<translation id="2704295676501803339">Mover para a esquerda</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> segundos atrás</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> segundos restantes</translation>
<translation id="4570886800634958009">Expandir notificação</translation>
+<translation id="566737009157135450">Excluir palavra anterior</translation>
<translation id="436869212180315161">Apertar</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Ajuda</translation>
+<translation id="2405367043325750948">Excluir para frente</translation>
<translation id="6699343763173986273">Próxima faixa da mídia</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> segundos restantes</translation>
<translation id="8226233771743600312">Não perturbe por um dia</translation>
+<translation id="4252565523989510616">Excluir palavra da frente</translation>
<translation id="7457942297256758195">Limpar tudo</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutos</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Copiar para a área de trabalho</translation>
<translation id="8371695176452482769">Fale agora</translation>
+<translation id="1167268268675672572">Mover para o começo da linha e modificar seleção</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Não Perturbe</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_pt-PT.xtb b/ui/base/strings/ui_strings_pt-PT.xtb
index 573c190db5..3310e4df55 100644
--- a/ui/base/strings/ui_strings_pt-PT.xtb
+++ b/ui/base/strings/ui_strings_pt-PT.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Seta para cima</translation>
+<translation id="3969863827134279083">Mover para cima</translation>
<translation id="7062130397825382308">Falta <ph name="NUMBER_ONE"/> segundo</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> horas</translation>
<translation id="3990502903496589789">Margem direita</translation>
<translation id="9038489124413477075">Pasta sem nome</translation>
+<translation id="1940483897317142625">Eliminar para o fim da linha</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min.</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dias restantes</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">Há <ph name="NUMBER_FEW"/> dias</translation>
<translation id="5076340679995252485">C&amp;olar</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Mover palavra para a direita</translation>
<translation id="364720409959344976">Selecionar Pasta a Carregar</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">Há <ph name="NUMBER_TWO"/> min.</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Fechar notificação</translation>
<translation id="6364916375976753737">Deslocar-se para a esquerda</translation>
<translation id="2629089419211541119">Há <ph name="NUMBER_ONE"/> hora</translation>
+<translation id="4218160142017529598">Eliminar para trás</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minutos</translation>
<translation id="6982279413068714821">Há <ph name="NUMBER_DEFAULT"/> min.</translation>
<translation id="6945221475159498467">Seleccionar</translation>
<translation id="6620110761915583480">Guardar ficheiro</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> segundos</translation>
+<translation id="8924469368910458384">Eliminar para o início da linha</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Falta <ph name="NUMBER_ONE"/> minuto</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min.</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dias</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> horas restantes</translation>
<translation id="5329858601952122676">E&amp;liminar</translation>
+<translation id="6556866813142980365">Refazer</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> seg.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutos</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutos</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> min. restantes</translation>
<translation id="5517291721709019259">Faltam <ph name="NUMBER_FEW"/> segundos</translation>
+<translation id="6903282483217634857">Mover para a direita</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">Há <ph name="NUMBER_DEFAULT"/> dias</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> min.</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Permitir notificações de:</translation>
+<translation id="2479520428668657293">Mover para a direita e modificar seleção</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> horas</translation>
<translation id="1398853756734560583">Maximizar</translation>
<translation id="4250229828105606438">Captura de ecrã</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> horas</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> min. restantes</translation>
+<translation id="2557207087669398617">Mover para o início da linha</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Seleccion&amp;ar tudo</translation>
<translation id="2168039046890040389">Página para cima</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dias</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> min.</translation>
+<translation id="6122334925474904337">Mover palavra para a direita e modificar seleção</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation>
<translation id="8448317557906454022">Há <ph name="NUMBER_ZERO"/> seg.</translation>
<translation id="4927753642311223124">Nada de novo a apresentar por aqui.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Deslocar-se para aqui</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Mover para baixo</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> horas</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hora restante</translation>
<translation id="1413622004203049571">Desativar notificações de <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Parte superior</translation>
+<translation id="2538759511191347839">Mover para o fim da linha e modificar seleção</translation>
+<translation id="928465423150706909">Mover para o fim da linha</translation>
<translation id="8331626408530291785">Deslocar-se para cima</translation>
<translation id="7907591526440419938">Abrir ficheiro</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Parar multimédia</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restaurar</translation>
+<translation id="5349525451964472598">Mover para a esquerda e modificar seleção</translation>
+<translation id="1781701194097416995">Mover palavra para a esquerda</translation>
<translation id="1243314992276662751">Carregar</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dia restante</translation>
<translation id="8179976553408161302">Entrar</translation>
+<translation id="8471049483003785219">Mover palavra para a esquerda e modificar seleção</translation>
<translation id="945522503751344254">Enviar comentários</translation>
<translation id="9170848237812810038">An&amp;ular</translation>
<translation id="1285266685456062655">Há <ph name="NUMBER_FEW"/> horas</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dia</translation>
+<translation id="2704295676501803339">Mover para a esquerda</translation>
<translation id="9098468523912235228">Há <ph name="NUMBER_DEFAULT"/> seg.</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> seg. restantes</translation>
<translation id="4570886800634958009">Expandir notificação</translation>
+<translation id="566737009157135450">Eliminar uma palavra para trás</translation>
<translation id="436869212180315161">Premir</translation>
<translation id="4860787810836767172">Há <ph name="NUMBER_FEW"/> seg.</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">Há <ph name="NUMBER_MANY"/> min.</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Ajuda</translation>
+<translation id="2405367043325750948">Eliminar para a frente</translation>
<translation id="6699343763173986273">Faixa seguinte de multimédia</translation>
<translation id="5445120697129764393">Faltam <ph name="NUMBER_DEFAULT"/> segundos</translation>
<translation id="8226233771743600312">Não incomodar durante um dia</translation>
+<translation id="4252565523989510616">Eliminar uma palavra para a frente</translation>
<translation id="7457942297256758195">Limpar Tudo</translation>
<translation id="822618367988303761">Há <ph name="NUMBER_TWO"/> dias</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min.</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Copiar para a área de transferência</translation>
<translation id="8371695176452482769">Falar agora</translation>
+<translation id="1167268268675672572">Mover para o início da linha e modificar seleção</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Não incomodar</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_ro.xtb b/ui/base/strings/ui_strings_ro.xtb
index c797175602..91cc92c0bf 100644
--- a/ui/base/strings/ui_strings_ro.xtb
+++ b/ui/base/strings/ui_strings_ro.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> O</translation>
<translation id="3660179305079774227">Săgeata în sus</translation>
+<translation id="3969863827134279083">Mutați în sus</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> secundă rămasă</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MO/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ore</translation>
<translation id="3990502903496589789">Marginea dreaptă</translation>
<translation id="9038489124413477075">Dosar fără nume</translation>
+<translation id="1940483897317142625">Ștergeți până la sfârșitul rândului</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minute</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> zile rămase</translation>
<translation id="932327136139879170">Pagina de pornire</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">Cu <ph name="NUMBER_FEW"/> zile în urmă</translation>
<translation id="5076340679995252485">&amp;Inserați</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TO</translation>
+<translation id="7139614227326422685">Mutați la cuvântul următor</translation>
<translation id="364720409959344976">Selectați un dosar de încărcat</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">Cu <ph name="NUMBER_TWO"/> minute în urmă</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Buton de închidere a notificării</translation>
<translation id="6364916375976753737">Derulați spre stânga</translation>
<translation id="2629089419211541119">Cu <ph name="NUMBER_ONE"/> oră în urmă</translation>
+<translation id="4218160142017529598">Ștergeți înapoi</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minute</translation>
<translation id="6982279413068714821">Cu <ph name="NUMBER_DEFAULT"/> (de) minute în urmă</translation>
<translation id="6945221475159498467">Selectați</translation>
<translation id="6620110761915583480">Salvați fișierul</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> secunde</translation>
+<translation id="8924469368910458384">Ștergeți până la începutul rândului</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> ore</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minut rămas</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minut</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> zile</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ore rămase</translation>
<translation id="5329858601952122676">Ș&amp;tergeți</translation>
+<translation id="6556866813142980365">Refaceți</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secunde</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KO</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minute</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minute rămase</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> secunde rămase</translation>
+<translation id="6903282483217634857">Mutați spre dreapta</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MO</translation>
<translation id="4988273303304146523">Cu <ph name="NUMBER_DEFAULT"/> zile în urmă</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minute</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> ore rămase</translation>
<translation id="7135556860107312402">Permiteți notificările de la următoarele:</translation>
+<translation id="2479520428668657293">Mutați spre dreapta și modificați selecția</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ore</translation>
<translation id="1398853756734560583">Maximizați</translation>
<translation id="4250229828105606438">Captură de ecran</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ore</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minute rămase</translation>
+<translation id="2557207087669398617">Mutați la începutul rândului</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GO</translation>
<translation id="1901303067676059328">Select&amp;ați tot</translation>
<translation id="2168039046890040389">O pagină mai sus</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> minute</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> zile</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minute</translation>
+<translation id="6122334925474904337">Mutați la cuvântul următor și modificați selecția</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minut</translation>
<translation id="8448317557906454022">Cu <ph name="NUMBER_ZERO"/> secunde în urmă</translation>
<translation id="4927753642311223124">Nimic de văzut aici, treceți mai departe.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> zile</translation>
<translation id="3183922693828471536">Derulați până aici</translation>
<translation id="4552416320897244156">PgDwn (o pagină mai jos)</translation>
+<translation id="3066573403916685335">Mutați în jos</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ore</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KO/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> oră rămasă</translation>
<translation id="1413622004203049571">Dezactivați notificările de la <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Sus</translation>
+<translation id="2538759511191347839">Mutați la sfârșitul rândului și modificați selecția</translation>
+<translation id="928465423150706909">Mutați la sfârșitul rândului</translation>
<translation id="8331626408530291785">Derulați în sus</translation>
<translation id="7907591526440419938">Deschideți fișierul</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> zile rămase</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Opriți conținutul media</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> minute rămase</translation>
<translation id="3157931365184549694">Restabiliți</translation>
+<translation id="5349525451964472598">Mutați spre stânga și modificați selecția</translation>
+<translation id="1781701194097416995">Mutați la cuvântul anterior</translation>
<translation id="1243314992276662751">Încărcați</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> zi rămasă</translation>
<translation id="8179976553408161302">Intrați</translation>
+<translation id="8471049483003785219">Mutați la cuvântul anterior și modificați selecția</translation>
<translation id="945522503751344254">Trimiteți feedback</translation>
<translation id="9170848237812810038">&amp;Anulați</translation>
<translation id="1285266685456062655">Cu <ph name="NUMBER_FEW"/> ore în urmă</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350">Cu <ph name="NUMBER_ZERO"/> ore în urmă</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GO/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> zi</translation>
+<translation id="2704295676501803339">Mutați spre stânga</translation>
<translation id="9098468523912235228">Cu <ph name="NUMBER_DEFAULT"/> (de) secunde în urmă</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> secunde rămase</translation>
<translation id="4570886800634958009">Buton de extindere a notificării</translation>
+<translation id="566737009157135450">Ștergeți înapoi un cuvânt</translation>
<translation id="436869212180315161">Apăsați</translation>
<translation id="4860787810836767172">Cu <ph name="NUMBER_FEW"/> secunde în urmă</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TO/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">Cu <ph name="NUMBER_MANY"/> (de) minute în urmă</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> O/s</translation>
<translation id="7649070708921625228">Ajutor</translation>
+<translation id="2405367043325750948">Ștergeți înainte</translation>
<translation id="6699343763173986273">Melodia următoare din conținutul media</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> de secunde rămase</translation>
<translation id="8226233771743600312">Nu deranja o zi</translation>
+<translation id="4252565523989510616">Ștergeți înainte un cuvânt</translation>
<translation id="7457942297256758195">Ștergeți-le pe toate</translation>
<translation id="822618367988303761">Cu <ph name="NUMBER_TWO"/> zile în urmă</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minute</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PO/s</translation>
<translation id="2743387203779672305">Copiați în clipboard</translation>
<translation id="8371695176452482769">Vorbiți acum</translation>
+<translation id="1167268268675672572">Mutați la începutul rândului și modificați selecția</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Nu deranja</translation>
<translation id="6978839998405419496">Cu <ph name="NUMBER_ZERO"/> zile în urmă</translation>
diff --git a/ui/base/strings/ui_strings_ru.xtb b/ui/base/strings/ui_strings_ru.xtb
index 55e8c54a19..9eb0224a77 100644
--- a/ui/base/strings/ui_strings_ru.xtb
+++ b/ui/base/strings/ui_strings_ru.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> Б</translation>
<translation id="3660179305079774227">Стрелка вверх</translation>
+<translation id="3969863827134279083">Перейти вверх</translation>
<translation id="7062130397825382308">Осталась <ph name="NUMBER_ONE"/> секунда</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> МБ/с</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ч.</translation>
<translation id="3990502903496589789">Правый край</translation>
<translation id="9038489124413477075">Без названия</translation>
+<translation id="1940483897317142625">Удалить текст до конца строки</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> мин.</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> дн.</translation>
<translation id="932327136139879170">На главную</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> дн. назад</translation>
<translation id="5076340679995252485">&amp;Вставить</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> ТБ</translation>
+<translation id="7139614227326422685">Перейти вправо к следующему слову</translation>
<translation id="364720409959344976">Выберите папку для загрузки</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Закрыть оповещение</translation>
<translation id="6364916375976753737">Прокрутка влево</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> ч. назад</translation>
+<translation id="4218160142017529598">Удалить предыдущий символ</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> мин.</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> мин. назад</translation>
<translation id="6945221475159498467">Выбрать</translation>
<translation id="6620110761915583480">Сохранить файл</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> сек.</translation>
+<translation id="8924469368910458384">Удалить текст до начала строки</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Осталась <ph name="NUMBER_ONE"/> минута</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> мин.</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> дн.</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ч.</translation>
<translation id="5329858601952122676">&amp;Удалить</translation>
+<translation id="6556866813142980365">Повторить</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> сек.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> КБ</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> мин.</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> мин.</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> мин.</translation>
<translation id="5517291721709019259">Осталось <ph name="NUMBER_FEW"/> секунды</translation>
+<translation id="6903282483217634857">Перейти вправо</translation>
<translation id="6659594942844771486">Вкладка</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> МБ</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> дн. назад</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> мин.</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Разрешить оповещения от:</translation>
+<translation id="2479520428668657293">Перейти вправо и изменить выделение</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ч.</translation>
<translation id="1398853756734560583">Развернуть</translation>
<translation id="4250229828105606438">Скриншот</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ч.</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> мин.</translation>
+<translation id="2557207087669398617">Перейти к началу строки</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> ГБ</translation>
<translation id="1901303067676059328">Выделить &amp;все</translation>
<translation id="2168039046890040389">Вверх</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> дн.</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> мин.</translation>
+<translation id="6122334925474904337">Перейти вправо к следующему слову и изменить выделение</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> мин.</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Оповещений нет.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Прокрутить до этого места</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Перейти вниз</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ч.</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> КБ/с</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ч.</translation>
<translation id="1413622004203049571">Отключить оповещения от <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Наверх</translation>
+<translation id="2538759511191347839">Перейти к концу строки и изменить выделение</translation>
+<translation id="928465423150706909">Перейти к концу строки</translation>
<translation id="8331626408530291785">Прокрутка вверх</translation>
<translation id="7907591526440419938">Открытие файла</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Остановить</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Восстановить</translation>
+<translation id="5349525451964472598">Перейти влево и изменить выделение</translation>
+<translation id="1781701194097416995">Перейти влево к следующему слову</translation>
<translation id="1243314992276662751">Загрузить</translation>
<translation id="50030952220075532">Остался <ph name="NUMBER_ONE"/> день</translation>
<translation id="8179976553408161302">Войти</translation>
+<translation id="8471049483003785219">Перейти влево к следующему слову и изменить выделение</translation>
<translation id="945522503751344254">Отправить отзыв</translation>
<translation id="9170848237812810038">&amp;Отменить</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> ч. назад</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> ГБ/с</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> день</translation>
+<translation id="2704295676501803339">Перейти влево</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> с. назад</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> сек.</translation>
<translation id="4570886800634958009">Раскрыть оповещение</translation>
+<translation id="566737009157135450">Удалить предыдущее слово</translation>
<translation id="436869212180315161">Нажать</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> с. назад</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> ТБ/с</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> Б/с</translation>
<translation id="7649070708921625228">Справка</translation>
+<translation id="2405367043325750948">Удалить следующий символ</translation>
<translation id="6699343763173986273">Следующий трек</translation>
<translation id="5445120697129764393">Осталось <ph name="NUMBER_DEFAULT"/> секунд</translation>
<translation id="8226233771743600312">Не беспокоить (1 день)</translation>
+<translation id="4252565523989510616">Удалить следующее слово</translation>
<translation id="7457942297256758195">Очистить все</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> мин.</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> ПБ/с</translation>
<translation id="2743387203779672305">Скопировать в буфер</translation>
<translation id="8371695176452482769">Говорите</translation>
+<translation id="1167268268675672572">Перейти к началу строки и изменить выделение</translation>
<translation id="6965382102122355670">ОК</translation>
<translation id="7850320739366109486">Не беспокоить</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_sk.xtb b/ui/base/strings/ui_strings_sk.xtb
index 876626cfc4..050bd59430 100644
--- a/ui/base/strings/ui_strings_sk.xtb
+++ b/ui/base/strings/ui_strings_sk.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Šípka nahor</translation>
+<translation id="3969863827134279083">Presunúť nahor</translation>
<translation id="7062130397825382308">Zostáva <ph name="NUMBER_ONE"/> sekunda</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928">Počet hodín: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="3990502903496589789">Pravý okraj</translation>
<translation id="9038489124413477075">Priečinok bez názvu</translation>
+<translation id="1940483897317142625">Odstrániť po koniec riadka</translation>
<translation id="8507996248087185956">Počet minút: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="3520476450377425184">Počet zvyšných dní: <ph name="NUMBER_MANY"/></translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">Pred <ph name="NUMBER_FEW"/> dňami</translation>
<translation id="5076340679995252485">&amp;Vložiť</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Presunúť slovo doprava</translation>
<translation id="364720409959344976">Výber priečinka na nahranie</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Zavrieť upozornenie</translation>
<translation id="6364916375976753737">Rolovať doľava</translation>
<translation id="2629089419211541119">Pred <ph name="NUMBER_ONE"/> hod</translation>
+<translation id="4218160142017529598">Odstrániť predchádzajúci znak</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> min</translation>
<translation id="6982279413068714821">Pred <ph name="NUMBER_DEFAULT"/> minútami</translation>
<translation id="6945221475159498467">Vybrať</translation>
<translation id="6620110761915583480">Uložiť súbor</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sekúnd</translation>
+<translation id="8924469368910458384">Odstrániť po začiatok riadka</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Zostáva <ph name="NUMBER_ONE"/> minúta</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minúta</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863">Počet dní: <ph name="NUMBER_MANY"/></translation>
<translation id="7163503212501929773">Počet zvyšných hodín: <ph name="NUMBER_MANY"/></translation>
<translation id="5329858601952122676">&amp;Odstrániť</translation>
+<translation id="6556866813142980365">Znova</translation>
<translation id="8088823334188264070">Počet sekúnd: <ph name="NUMBER_MANY"/></translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minúty</translation>
<translation id="50960180632766478">Počet zvyšných minút: <ph name="NUMBER_FEW"/></translation>
<translation id="5517291721709019259">Zostávajú <ph name="NUMBER_FEW"/> sekundy</translation>
+<translation id="6903282483217634857">Presunúť doprava</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">Pred <ph name="NUMBER_DEFAULT"/> dňami</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773">Počet minút: <ph name="NUMBER_TWO"/></translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Povoliť prijímanie upozornení od:</translation>
+<translation id="2479520428668657293">Presunúť doprava a upraviť výber</translation>
<translation id="8112886015144590373">Počet hodín: <ph name="NUMBER_FEW"/></translation>
<translation id="1398853756734560583">Maximalizovať</translation>
<translation id="4250229828105606438">Snímka obrazovky</translation>
<translation id="6690744523875189208">Počet hodín: <ph name="NUMBER_TWO"/></translation>
<translation id="5260878308685146029">Počet zvyšných minút: <ph name="NUMBER_TWO"/></translation>
+<translation id="2557207087669398617">Presunúť na začiatok riadka</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Vybrať &amp;všetko</translation>
<translation id="2168039046890040389">Page Up</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581">Počet dní: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="6463061331681402734">Počet minút: <ph name="NUMBER_MANY"/></translation>
+<translation id="6122334925474904337">Presunúť slovo doprava a upraviť výber</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minúta</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Tu sa nič nenachádza, pokračujte ďalej.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Rolovať na toto miesto</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Presunúť nadol</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401">Počet hodín: <ph name="NUMBER_MANY"/></translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">Zostáva <ph name="NUMBER_ONE"/> hodina</translation>
<translation id="1413622004203049571">Zakázať upozornenia od <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Vrch</translation>
+<translation id="2538759511191347839">Presunúť na koniec riadka a upraviť výber</translation>
+<translation id="928465423150706909">Presunúť na koniec riadka</translation>
<translation id="8331626408530291785">Rolovať nahor</translation>
<translation id="7907591526440419938">Otvoriť súbor</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Médiá – zastaviť</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Obnoviť</translation>
+<translation id="5349525451964472598">Presunúť doľava a upraviť výber</translation>
+<translation id="1781701194097416995">Presunúť slovo doľava</translation>
<translation id="1243314992276662751">Nahrať</translation>
<translation id="50030952220075532">Zostáva <ph name="NUMBER_ONE"/> deň</translation>
<translation id="8179976553408161302">Začať</translation>
+<translation id="8471049483003785219">Presunúť slovo doľava a upraviť výber</translation>
<translation id="945522503751344254">Poslať pripomienky</translation>
<translation id="9170848237812810038">&amp;Naspäť</translation>
<translation id="1285266685456062655">Pred <ph name="NUMBER_FEW"/> hodinami</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> deň</translation>
+<translation id="2704295676501803339">Presunúť doľava</translation>
<translation id="9098468523912235228">Pred <ph name="NUMBER_DEFAULT"/> s</translation>
<translation id="494645311413743213">Počet zvyšných sekúnd: <ph name="NUMBER_TWO"/></translation>
<translation id="4570886800634958009">Rozbaliť upozornenie</translation>
+<translation id="566737009157135450">Odstrániť predchádzajúce slovo</translation>
<translation id="436869212180315161">Stlačiť</translation>
<translation id="4860787810836767172">Pred <ph name="NUMBER_FEW"/> s</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Pomocník</translation>
+<translation id="2405367043325750948">Odstrániť nasledujúci znak</translation>
<translation id="6699343763173986273">Média – ďalšia stopa</translation>
<translation id="5445120697129764393">Zostáva <ph name="NUMBER_DEFAULT"/> sekúnd</translation>
<translation id="8226233771743600312">Nerušiť jeden deň</translation>
+<translation id="4252565523989510616">Odstrániť nasledujúce slovo</translation>
<translation id="7457942297256758195">Vymazať všetky</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565">Počet minút: <ph name="NUMBER_FEW"/></translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Kopírovať do schránky</translation>
<translation id="8371695176452482769">Začnite hovoriť</translation>
+<translation id="1167268268675672572">Presunúť na začiatok riadka a upraviť výber</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Nerušiť</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_sl.xtb b/ui/base/strings/ui_strings_sl.xtb
index d2e184cf8a..1e3db6ea15 100644
--- a/ui/base/strings/ui_strings_sl.xtb
+++ b/ui/base/strings/ui_strings_sl.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Puščica gor</translation>
+<translation id="3969863827134279083">Premik gor</translation>
<translation id="7062130397825382308">Še <ph name="NUMBER_ONE"/> sekundo</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> h</translation>
<translation id="3990502903496589789">Desni rob</translation>
<translation id="9038489124413477075">Neimenovana mapa</translation>
+<translation id="1940483897317142625">Brisanje do konca vrstice</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min</translation>
<translation id="3520476450377425184">še <ph name="NUMBER_MANY"/> dni</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">Pred <ph name="NUMBER_FEW"/> dnevi</translation>
<translation id="5076340679995252485">&amp;Prilepi</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Premik besede desno</translation>
<translation id="364720409959344976">Izberite mapo, ki jo želite prenesti</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">Pred <ph name="NUMBER_TWO"/> min</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Zapri obvestilo</translation>
<translation id="6364916375976753737">Pomik levo</translation>
<translation id="2629089419211541119">Pred <ph name="NUMBER_ONE"/> h</translation>
+<translation id="4218160142017529598">Brisanje nazaj</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> min</translation>
<translation id="6982279413068714821">Pred <ph name="NUMBER_DEFAULT"/> min</translation>
<translation id="6945221475159498467">Izberi</translation>
<translation id="6620110761915583480">Shrani datoteko</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation>
+<translation id="8924469368910458384">Brisanje do začetka vrstice</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">še <ph name="NUMBER_ONE"/> min</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> days</translation>
<translation id="7163503212501929773">še <ph name="NUMBER_MANY"/> ur</translation>
<translation id="5329858601952122676">&amp;Izbriši</translation>
+<translation id="6556866813142980365">Uveljavi</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuti</translation>
<translation id="50960180632766478">še <ph name="NUMBER_FEW"/> min</translation>
<translation id="5517291721709019259">Še <ph name="NUMBER_FEW"/> sekunde</translation>
+<translation id="6903282483217634857">Premik desno</translation>
<translation id="6659594942844771486">Tabulator</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">Pred <ph name="NUMBER_DEFAULT"/> dnevi</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> min</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Omogočanje obvestil teh aplikacij:</translation>
+<translation id="2479520428668657293">Premik desno in sprememba izbire</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ur</translation>
<translation id="1398853756734560583">Povečaj</translation>
<translation id="4250229828105606438">Posnetek zaslona</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> uri</translation>
<translation id="5260878308685146029">še <ph name="NUMBER_TWO"/> min</translation>
+<translation id="2557207087669398617">Premik na začetek vrstice</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Izberi &amp;vse</translation>
<translation id="2168039046890040389">Stran gor</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dni</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mins</translation>
+<translation id="6122334925474904337">Premik besede desno in sprememba izbire</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minuta</translation>
<translation id="8448317557906454022">Pred <ph name="NUMBER_ZERO"/> s</translation>
<translation id="4927753642311223124">Tu ni ničesar, pomaknite se naprej.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Pomik do sem</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Premik dol</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ur</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">še <ph name="NUMBER_ONE"/> ura</translation>
<translation id="1413622004203049571">Izklop obvestil za <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Na vrh</translation>
+<translation id="2538759511191347839">Premik na konec vrstice in sprememba izbire</translation>
+<translation id="928465423150706909">Premik na konec vrstice</translation>
<translation id="8331626408530291785">Pomik gor</translation>
<translation id="7907591526440419938">Odpri datoteko</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Ustavitev</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Obnovi</translation>
+<translation id="5349525451964472598">Premik levo in sprememba izbire</translation>
+<translation id="1781701194097416995">Premik besede levo</translation>
<translation id="1243314992276662751">Prenesi</translation>
<translation id="50030952220075532">še <ph name="NUMBER_ONE"/> dan</translation>
<translation id="8179976553408161302">Potrdi</translation>
+<translation id="8471049483003785219">Premik besede levo in sprememba izbire</translation>
<translation id="945522503751344254">Pošlji povratne informacije</translation>
<translation id="9170848237812810038">&amp;Razveljavi</translation>
<translation id="1285266685456062655">Pred <ph name="NUMBER_FEW"/> h</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dan</translation>
+<translation id="2704295676501803339">Premik levo</translation>
<translation id="9098468523912235228">Pred <ph name="NUMBER_DEFAULT"/> s</translation>
<translation id="494645311413743213">še <ph name="NUMBER_TWO"/> sek</translation>
<translation id="4570886800634958009">Razširi obvestilo</translation>
+<translation id="566737009157135450">Brisanje besede nazaj</translation>
<translation id="436869212180315161">Pritisnite</translation>
<translation id="4860787810836767172">Pred <ph name="NUMBER_FEW"/> s</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">Pred <ph name="NUMBER_MANY"/> min</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Pomoč</translation>
+<translation id="2405367043325750948">Brisanje naprej</translation>
<translation id="6699343763173986273">Naslednja skladba</translation>
<translation id="5445120697129764393">Še <ph name="NUMBER_DEFAULT"/> sekund</translation>
<translation id="8226233771743600312">Ne moti en dan</translation>
+<translation id="4252565523989510616">Brisanje besede naprej</translation>
<translation id="7457942297256758195">Izbriši vse</translation>
<translation id="822618367988303761">Pred <ph name="NUMBER_TWO"/> dnevoma</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Kopiraj v odložišče</translation>
<translation id="8371695176452482769">Začnite govoriti</translation>
+<translation id="1167268268675672572">Premik na začetek vrstice in sprememba izbire</translation>
<translation id="6965382102122355670">V redu</translation>
<translation id="7850320739366109486">Ne moti</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_sr.xtb b/ui/base/strings/ui_strings_sr.xtb
index 97b177a69e..5e833cb722 100644
--- a/ui/base/strings/ui_strings_sr.xtb
+++ b/ui/base/strings/ui_strings_sr.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Стрелица нагоре</translation>
+<translation id="3969863827134279083">Помери нагоре</translation>
<translation id="7062130397825382308">Још <ph name="NUMBER_ONE"/> секунда</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928">Сати: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="3990502903496589789">Десна ивица</translation>
<translation id="9038489124413477075">Неименовани директоријум</translation>
+<translation id="1940483897317142625">Избриши до краја реда</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> мин.</translation>
<translation id="3520476450377425184">Преостало <ph name="NUMBER_MANY"/> дана</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">Пре <ph name="NUMBER_FEW"/> дана</translation>
<translation id="5076340679995252485">&amp;Налепи</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Помери удесно за реч</translation>
<translation id="364720409959344976">Избор директоријума за отпремање</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">Пре <ph name="NUMBER_TWO"/> минута</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Затвори обавештење</translation>
<translation id="6364916375976753737">Помери налево</translation>
<translation id="2629089419211541119">Пре <ph name="NUMBER_ONE"/> сат</translation>
+<translation id="4218160142017529598">Избриши уназад</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> мин</translation>
<translation id="6982279413068714821">Пре <ph name="NUMBER_DEFAULT"/> минута</translation>
<translation id="6945221475159498467">Изабери</translation>
<translation id="6620110761915583480">Чување датотеке</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> секунди</translation>
+<translation id="8924469368910458384">Избриши до почетка реда</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Преостао је <ph name="NUMBER_ONE"/> минут</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> мин.</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863">Дана: <ph name="NUMBER_MANY"/></translation>
<translation id="7163503212501929773">Преостало сати: <ph name="NUMBER_MANY"/></translation>
<translation id="5329858601952122676">&amp;Избриши</translation>
+<translation id="6556866813142980365">Понови</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> сек.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> минута</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> минута</translation>
<translation id="50960180632766478">Преостало <ph name="NUMBER_FEW"/> мин.</translation>
<translation id="5517291721709019259">Још <ph name="NUMBER_FEW"/> секунде</translation>
+<translation id="6903282483217634857">Помери удесно</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">Пре <ph name="NUMBER_DEFAULT"/> дана</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> мин.</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Дозволи обавештења из следећих извора:</translation>
+<translation id="2479520428668657293">Помери удесно и измени избор</translation>
<translation id="8112886015144590373">Сати: <ph name="NUMBER_FEW"/></translation>
<translation id="1398853756734560583">Увећај</translation>
<translation id="4250229828105606438">Снимак екрана</translation>
<translation id="6690744523875189208">Сати: <ph name="NUMBER_TWO"/></translation>
<translation id="5260878308685146029">Преостало <ph name="NUMBER_TWO"/> мин.</translation>
+<translation id="2557207087669398617">Помери на почетак реда</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Изабери &amp;све</translation>
<translation id="2168039046890040389">Страница нагоре</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581">Дана: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> мин.</translation>
+<translation id="6122334925474904337">Помери удесно за реч и измени избор</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> минут</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Нема шта да се види овде. Наставите даље.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Помери се овде</translation>
<translation id="4552416320897244156">Page Down</translation>
+<translation id="3066573403916685335">Помери надоле</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401">Сати: <ph name="NUMBER_MANY"/></translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">Преостао <ph name="NUMBER_ONE"/> сат</translation>
<translation id="1413622004203049571">Онемогући обавештења од <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Врх</translation>
+<translation id="2538759511191347839">Помери до краја реда и измени избор</translation>
+<translation id="928465423150706909">Помери до краја реда</translation>
<translation id="8331626408530291785">Помери нагоре</translation>
<translation id="7907591526440419938">Отварање датотеке</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Заустављање медија</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Поново отвори</translation>
+<translation id="5349525451964472598">Помери улево и измени избор</translation>
+<translation id="1781701194097416995">Помери улево за реч</translation>
<translation id="1243314992276662751">Отпреми</translation>
<translation id="50030952220075532">Преостао <ph name="NUMBER_ONE"/> дан</translation>
<translation id="8179976553408161302">Унеси</translation>
+<translation id="8471049483003785219">Помери улево за реч и измени избор</translation>
<translation id="945522503751344254">Пошаљи повратне информације</translation>
<translation id="9170848237812810038">&amp;Опозови</translation>
<translation id="1285266685456062655">Пре <ph name="NUMBER_FEW"/> сата</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> дан</translation>
+<translation id="2704295676501803339">Помери улево</translation>
<translation id="9098468523912235228">Пре <ph name="NUMBER_DEFAULT"/> секунди</translation>
<translation id="494645311413743213">Преостало <ph name="NUMBER_TWO"/> сек.</translation>
<translation id="4570886800634958009">Прошири обавештење</translation>
+<translation id="566737009157135450">Избриши реч уназад</translation>
<translation id="436869212180315161">Притисните</translation>
<translation id="4860787810836767172">Пре <ph name="NUMBER_FEW"/> секунде</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Помоћ</translation>
+<translation id="2405367043325750948">Избриши унапред</translation>
<translation id="6699343763173986273">Следећа песма медија</translation>
<translation id="5445120697129764393">Још <ph name="NUMBER_DEFAULT"/> секунди</translation>
<translation id="8226233771743600312">Не узнемиравај у периоду од једног дана</translation>
+<translation id="4252565523989510616">Избриши реч унапред</translation>
<translation id="7457942297256758195">Обриши све</translation>
<translation id="822618367988303761">Пре <ph name="NUMBER_TWO"/> дана</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> мин.</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Копирај у меморију</translation>
<translation id="8371695176452482769">Почните да говорите</translation>
+<translation id="1167268268675672572">Помери на почетак реда и измени избор</translation>
<translation id="6965382102122355670">Потврди</translation>
<translation id="7850320739366109486">Не узнемиравај</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_sv.xtb b/ui/base/strings/ui_strings_sv.xtb
index d967817674..bd33ee966a 100644
--- a/ui/base/strings/ui_strings_sv.xtb
+++ b/ui/base/strings/ui_strings_sv.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Uppil</translation>
+<translation id="3969863827134279083">Flytta upp</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> sekund kvar</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/sek</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> timmar</translation>
<translation id="3990502903496589789">Högerkant</translation>
<translation id="9038489124413477075">Namnlös mapp</translation>
+<translation id="1940483897317142625">Radera till slutet av raden</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minuter</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dagar kvar</translation>
<translation id="932327136139879170">Startsida</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">K&amp;listra in</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Flytta ett ord åt höger</translation>
<translation id="364720409959344976">Välj en mapp för överföring</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Meddelande om stängning</translation>
<translation id="6364916375976753737">Rulla åt vänster</translation>
<translation id="2629089419211541119">För <ph name="NUMBER_ONE"/> timme sedan</translation>
+<translation id="4218160142017529598">Radera bakåt</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> minuter</translation>
<translation id="6982279413068714821">För <ph name="NUMBER_DEFAULT"/> minuter sedan</translation>
<translation id="6945221475159498467">Välj</translation>
<translation id="6620110761915583480">Spara fil</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> sekunder</translation>
+<translation id="8924469368910458384">Radera till radens början</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> minut kvar</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> minut</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> dagar</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> timmar kvar</translation>
<translation id="5329858601952122676">&amp;Ta bort</translation>
+<translation id="6556866813142980365">Upprepa</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> sekunder</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minuter</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuter</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minuter kvar</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> sekunder kvar</translation>
+<translation id="6903282483217634857">Flytta åt höger</translation>
<translation id="6659594942844771486">Flik</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523">För <ph name="NUMBER_DEFAULT"/> dagar sedan</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> minuter</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Tillåt meddelanden från följande:</translation>
+<translation id="2479520428668657293">Flytta åt höger och ändra markeringen</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> timmar</translation>
<translation id="1398853756734560583">Maximera</translation>
<translation id="4250229828105606438">Skärmdump</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> timmar</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> minuter kvar</translation>
+<translation id="2557207087669398617">Flytta till radens början</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Välj &amp;alla</translation>
<translation id="2168039046890040389">Page Up</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> dagar</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> minuter</translation>
+<translation id="6122334925474904337">Flytta ett ord åt höger och ändra markeringen</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minut</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Här finns inget att se, fortsätt.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Rulla hit</translation>
<translation id="4552416320897244156">Page Down</translation>
+<translation id="3066573403916685335">Flytta ner</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> timmar</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/sek</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> timmar kvar</translation>
<translation id="1413622004203049571">Inaktivera aviseringar från <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Överst</translation>
+<translation id="2538759511191347839">Flytta till slutet av raden och ändra markeringen</translation>
+<translation id="928465423150706909">Flytta till slutet av raden</translation>
<translation id="8331626408530291785">Rulla uppåt</translation>
<translation id="7907591526440419938">Öppna fil</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Stoppa</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Återställ</translation>
+<translation id="5349525451964472598">Flytta åt vänster och ändra markeringen</translation>
+<translation id="1781701194097416995">Flytta ett ord åt vänster</translation>
<translation id="1243314992276662751">Överför</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dag kvar</translation>
<translation id="8179976553408161302">Start</translation>
+<translation id="8471049483003785219">Flytta ett ord åt vänster och ändra markeringen</translation>
<translation id="945522503751344254">Skicka synpunkter</translation>
<translation id="9170848237812810038">&amp;Ångra</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/sek</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> dag</translation>
+<translation id="2704295676501803339">Flytta åt vänster</translation>
<translation id="9098468523912235228">För <ph name="NUMBER_DEFAULT"/> sekunder sedan</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> sekunder kvar</translation>
<translation id="4570886800634958009">Meddelande om utökning</translation>
+<translation id="566737009157135450">Radera ett ord bakåt</translation>
<translation id="436869212180315161">Pressen</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/sek</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/sek</translation>
<translation id="7649070708921625228">Hjälp</translation>
+<translation id="2405367043325750948">Radera framåt</translation>
<translation id="6699343763173986273">Nästa spår</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> sekunder kvar</translation>
<translation id="8226233771743600312">Stör inte i en dag</translation>
+<translation id="4252565523989510616">Radera ett ord framåt</translation>
<translation id="7457942297256758195">Ta bort alla</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minuter</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/sek</translation>
<translation id="2743387203779672305">Kopiera till Urklipp</translation>
<translation id="8371695176452482769">Prata nu</translation>
+<translation id="1167268268675672572">Flytta till radens början och ändra markeringen</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Stör inte</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_sw.xtb b/ui/base/strings/ui_strings_sw.xtb
index c3e1852461..53b939ab18 100644
--- a/ui/base/strings/ui_strings_sw.xtb
+++ b/ui/base/strings/ui_strings_sw.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658">B <ph name="QUANTITY"/></translation>
<translation id="3660179305079774227">Mshale Juu</translation>
+<translation id="3969863827134279083">Sogeza Juu</translation>
<translation id="7062130397825382308">Imesalia sekunde <ph name="NUMBER_ONE"/></translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928">saa <ph name="NUMBER_DEFAULT"/></translation>
<translation id="3990502903496589789">Ncha ya Kulia</translation>
<translation id="9038489124413477075">Folda isiyo na jina</translation>
+<translation id="1940483897317142625">Futa Hadi Mwisho Wa Mstari</translation>
<translation id="8507996248087185956">dakika <ph name="NUMBER_DEFAULT"/></translation>
<translation id="3520476450377425184">zimesalia siku <ph name="NUMBER_MANY"/></translation>
<translation id="932327136139879170">Nyumbani</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011">siku <ph name="NUMBER_FEW"/> zilizopita</translation>
<translation id="5076340679995252485">&amp;Bandika</translation>
<translation id="7460907917090416791">TB <ph name="QUANTITY"/></translation>
+<translation id="7139614227326422685">Sogeza Upande Wa Kulia Wa Neno</translation>
<translation id="364720409959344976">Chagua Folda ya Kupakia</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016">dakika <ph name="NUMBER_TWO"/> zilizopita</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Funga arifa</translation>
<translation id="6364916375976753737">Sogeza Kushoto</translation>
<translation id="2629089419211541119">saa <ph name="NUMBER_ONE"/> lililopita</translation>
+<translation id="4218160142017529598">Futa Kuelekea Nyuma</translation>
<translation id="2994641463185352298">Dakika <ph name="NUMBER_DEFAULT"/></translation>
<translation id="6982279413068714821">dakika <ph name="NUMBER_DEFAULT"/> zilizopita</translation>
<translation id="6945221475159498467">Chagua</translation>
<translation id="6620110761915583480">Hifadhi Faili</translation>
<translation id="4349181486102621992">Sekunde <ph name="NUMBER_ZERO"/></translation>
+<translation id="8924469368910458384">Futa Hadi Mwanzo Wa Mstari</translation>
<translation id="6719684875142564568">saa <ph name="NUMBER_ZERO"/></translation>
<translation id="7836361698254323868">Imesalia dakika <ph name="NUMBER_ONE"/></translation>
<translation id="2953767478223974804">dakika <ph name="NUMBER_ONE"/></translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863">siku <ph name="NUMBER_MANY"/></translation>
<translation id="7163503212501929773">zimesalia saa <ph name="NUMBER_MANY"/></translation>
<translation id="5329858601952122676">&amp;Futa</translation>
+<translation id="6556866813142980365">Rudia</translation>
<translation id="8088823334188264070">sekunde <ph name="NUMBER_MANY"/></translation>
<translation id="8901569739625249689">KB <ph name="QUANTITY"/></translation>
<translation id="7712011264267466734">Dakika <ph name="NUMBER_MANY"/></translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412">Dakika <ph name="NUMBER_TWO"/></translation>
<translation id="50960180632766478">zimesalia dakika <ph name="NUMBER_FEW"/></translation>
<translation id="5517291721709019259">Zimesalia sekunde <ph name="NUMBER_FEW"/></translation>
+<translation id="6903282483217634857">Sogeza Kulia</translation>
<translation id="6659594942844771486">Kichupo</translation>
<translation id="3049748772180311791">MB <ph name="QUANTITY"/></translation>
<translation id="4988273303304146523">siku <ph name="NUMBER_DEFAULT"/> zilizopita</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773">dakika <ph name="NUMBER_TWO"/></translation>
<translation id="5149131957118398098">Zimesalia saa <ph name="NUMBER_ZERO"/></translation>
<translation id="7135556860107312402">Ruhusu arifa kutoka kwa:</translation>
+<translation id="2479520428668657293">Sogeza Kulia Na Ubadilisha Uteuzi</translation>
<translation id="8112886015144590373">saa <ph name="NUMBER_FEW"/></translation>
<translation id="1398853756734560583">Tanua</translation>
<translation id="4250229828105606438">Picha ya skrini</translation>
<translation id="6690744523875189208">saa <ph name="NUMBER_TWO"/></translation>
<translation id="5260878308685146029">zimesalia dakika <ph name="NUMBER_TWO"/></translation>
+<translation id="2557207087669398617">Sogeza Hadi Mwanzo Wa Mstari</translation>
<translation id="3757388668994797779">GB <ph name="QUANTITY"/></translation>
<translation id="1901303067676059328">Chagua &amp;yote</translation>
<translation id="2168039046890040389">Ukurasa mmoja juu</translation>
<translation id="7363290921156020669">dakika <ph name="NUMBER_ZERO"/></translation>
<translation id="9107059250669762581">siku <ph name="NUMBER_DEFAULT"/></translation>
<translation id="6463061331681402734">dakika <ph name="NUMBER_MANY"/></translation>
+<translation id="6122334925474904337">Sogeza Upande Wa Kulia Wa Neno Na Ubadilishe Uteuzi</translation>
<translation id="7634624804467787019">Dakika <ph name="NUMBER_ONE"/></translation>
<translation id="8448317557906454022">sekunde <ph name="NUMBER_ZERO"/> zilizopita</translation>
<translation id="4927753642311223124">Hakuna cha kuangalia hapa, endelea.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075">siku <ph name="NUMBER_ZERO"/></translation>
<translation id="3183922693828471536">Sogeza Hadi Hapa</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Sogeza Chini</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401">saa <ph name="NUMBER_MANY"/></translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">limesalia saa <ph name="NUMBER_ONE"/></translation>
<translation id="1413622004203049571">Zima arifa kutoka <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Ya Juu</translation>
+<translation id="2538759511191347839">Sogeza Hadi Mwisho Wa Mstari Na Ubadilishe Uteuzi</translation>
+<translation id="928465423150706909">Sogeza Mwisho Wa Mstari</translation>
<translation id="8331626408530291785">Sogeza Juu</translation>
<translation id="7907591526440419938">Fungua Faili</translation>
<translation id="2864069933652346933">zimesalia siku <ph name="NUMBER_ZERO"/></translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Simamisha Media</translation>
<translation id="1308727876662951186">zimesalia dakika <ph name="NUMBER_ZERO"/></translation>
<translation id="3157931365184549694">Rejesha</translation>
+<translation id="5349525451964472598">Sogeza Kushoto Na Ubadilishe Uteuzi</translation>
+<translation id="1781701194097416995">Sogeza Upande Wa Kulia Wa Neno</translation>
<translation id="1243314992276662751">Pakia</translation>
<translation id="50030952220075532">imesalia siku <ph name="NUMBER_ONE"/></translation>
<translation id="8179976553408161302">Enter</translation>
+<translation id="8471049483003785219">Sogeza Upande Wa Kulia Wa Neno Na Ubadilishe Uteuzi</translation>
<translation id="945522503751344254">Tuma maoni</translation>
<translation id="9170848237812810038">&amp;Tendua</translation>
<translation id="1285266685456062655">Saa <ph name="NUMBER_FEW"/> zilizopita</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350">Saa <ph name="NUMBER_ZERO"/> zilizopita</translation>
<translation id="3740362395218339114">GB/s <ph name="QUANTITY"/></translation>
<translation id="6644971472240498405">siku <ph name="NUMBER_ONE"/></translation>
+<translation id="2704295676501803339">Sogeza Kushoto</translation>
<translation id="9098468523912235228">sekunde <ph name="NUMBER_DEFAULT"/> zilizopita</translation>
<translation id="494645311413743213">zimesalia sekunde <ph name="NUMBER_TWO"/></translation>
<translation id="4570886800634958009">Panua arifa</translation>
+<translation id="566737009157135450">Futa Neno Kwa Kuelekea Nyuma</translation>
<translation id="436869212180315161">Bofya</translation>
<translation id="4860787810836767172">sekunde <ph name="NUMBER_FEW"/> zilizopita</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497">dakika <ph name="NUMBER_MANY"/> zilizopita</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Usaidizi</translation>
+<translation id="2405367043325750948">Futa Ukielekea Upande Wa Mbele</translation>
<translation id="6699343763173986273">Wimbo Unaofuata kwenye Media</translation>
<translation id="5445120697129764393">Zimesalia sekunde <ph name="NUMBER_DEFAULT"/></translation>
<translation id="8226233771743600312">Usinisumbue kwa siku moja</translation>
+<translation id="4252565523989510616">Futa Neno Ukielekea Upande Wa Mbele</translation>
<translation id="7457942297256758195">Futa Zote</translation>
<translation id="822618367988303761">siku <ph name="NUMBER_TWO"/> zilizopita</translation>
<translation id="4745438305783437565">dakika <ph name="NUMBER_FEW"/></translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">Nakili kwenye ubao wa kunakili</translation>
<translation id="8371695176452482769">Ongea sasa</translation>
+<translation id="1167268268675672572">Sogeza Hadi Mwanzo Wa Mstari Na Ubadilishe Uteuzi</translation>
<translation id="6965382102122355670">Sawa</translation>
<translation id="7850320739366109486">Usinisumbue</translation>
<translation id="6978839998405419496">siku <ph name="NUMBER_ZERO"/> zilizopita</translation>
diff --git a/ui/base/strings/ui_strings_ta.xtb b/ui/base/strings/ui_strings_ta.xtb
index e21652002b..62b0f030cd 100644
--- a/ui/base/strings/ui_strings_ta.xtb
+++ b/ui/base/strings/ui_strings_ta.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> பை</translation>
<translation id="3660179305079774227">மேல்நோக்கிய அம்பு</translation>
+<translation id="3969863827134279083">மேலே நகர்த்து</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> வினாடி உள்ளது</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> மெ.பை/வி</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> மணி நேரம்</translation>
<translation id="3990502903496589789">வலது விளிம்பு</translation>
<translation id="9038489124413477075">பெயரிடப்படாதக் கோப்புறை</translation>
+<translation id="1940483897317142625">வரியின் இறுதிவரை நீக்கு</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> நிமிடங்கள்</translation>
<translation id="3520476450377425184">இன்னும் <ph name="NUMBER_MANY"/> நாட்கள் உள்ளன</translation>
<translation id="932327136139879170">முகப்பு</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;ஒட்டு</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> டெ.பை</translation>
+<translation id="7139614227326422685">வார்த்தையின் வலதுபுறம் நகர்த்து</translation>
<translation id="364720409959344976">பதிவேற்றுவதற்குக் கோப்புறையைத் தேர்ந்தெடு</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">அறிவிப்பை மூடு</translation>
<translation id="6364916375976753737">இடப்புறம் உருட்டு</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation>
+<translation id="4218160142017529598">பின்னோக்கி நீக்கு</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> நிமிடங்கள்</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation>
<translation id="6945221475159498467">தேர்ந்தெடு</translation>
<translation id="6620110761915583480">கோப்பைச் சேமி</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> வினாடிகள்</translation>
+<translation id="8924469368910458384">வரியின் துவக்கம்வரை நீக்கு</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> நிமிடம் உள்ளது</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> நிமிடம்</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> நாட்கள்</translation>
<translation id="7163503212501929773">இன்னும் <ph name="NUMBER_MANY"/> மணிநேரம் உள்ளது</translation>
<translation id="5329858601952122676">&amp;நீக்கு</translation>
+<translation id="6556866813142980365">மீண்டும் செய்</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> நொடிகள்</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> கி.பை.</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> நிமிடங்கள்</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> நிமிடங்கள்</translation>
<translation id="50960180632766478">இன்னும் <ph name="NUMBER_FEW"/> நிமிடங்கள் உள்ளன</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> வினாடிகள் உள்ளன</translation>
+<translation id="6903282483217634857">வலதுபுறமாக நகர்த்து</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> மெ.பை</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> நிமிடங்கள்</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">பின்வருபவற்றிலிருந்து வரும் அறிவிப்புகளை அனுமதி:</translation>
+<translation id="2479520428668657293">வலதுபுறமாக நகர்ந்து தேர்வை மாற்று</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> மணி நேரம்</translation>
<translation id="1398853756734560583">பெரிதாக்கு</translation>
<translation id="4250229828105606438">ஸ்கிரீன் ஷாட்</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> மணி நேரம்</translation>
<translation id="5260878308685146029">இன்னும் <ph name="NUMBER_TWO"/> நிமிடங்கள் உள்ளன</translation>
+<translation id="2557207087669398617">வரியின் துவக்கத்திற்கு நகர்த்து</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">அ&amp;னைத்தையும் தேர்ந்தெடு</translation>
<translation id="2168039046890040389">பக்கத்தின் மேலே</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> நாட்கள்</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> நிமிடங்கள்</translation>
+<translation id="6122334925474904337">வார்த்தையின் வலதுபுறம் நகர்ந்து தேர்வை மாற்று</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> நிமிடம்</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">பார்க்க இங்கு எதுவுமில்லை, தொடரவும்.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">இங்கே உருட்டு</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">கீழே நகர்த்து</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> மணிநேரம்</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> கி.பை./வி</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">இன்னும் <ph name="NUMBER_ONE"/> மணிநேரம் உள்ளது</translation>
<translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> இடமிருந்து வரும் அறிவிப்புகளை முடக்கு</translation>
<translation id="2666092431469916601">மேலே</translation>
+<translation id="2538759511191347839">வரியின் இறுதிக்கு நகர்ந்து தேர்வை மாற்று</translation>
+<translation id="928465423150706909">வரியின் இறுதிக்கு நகர்த்து</translation>
<translation id="8331626408530291785">மேலே உருட்டு</translation>
<translation id="7907591526440419938">கோப்பைத் திற</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">ஊடகத்தை நிறுத்து</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">மீட்டமை</translation>
+<translation id="5349525451964472598">இடதுபுறமாக நகர்ந்து தேர்வை மாற்று</translation>
+<translation id="1781701194097416995">வார்த்தையின் இடதுபுறம் நகர்த்து</translation>
<translation id="1243314992276662751">பதிவேற்று</translation>
<translation id="50030952220075532">இன்னும் <ph name="NUMBER_ONE"/> நாட்கள் உள்ளன</translation>
<translation id="8179976553408161302">உள்ளிடு</translation>
+<translation id="8471049483003785219">வார்த்தையின் இடதுபுறம் நகர்ந்து தேர்வை மாற்று</translation>
<translation id="945522503751344254">பின்னூட்டம் அனுப்புக</translation>
<translation id="9170848237812810038">&amp;செயல்தவிர்</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> ஜி.பை/வி</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> நாள்</translation>
+<translation id="2704295676501803339">இடதுபுறமாக நகர்த்து</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> வினாடிகள் உள்ளன</translation>
<translation id="4570886800634958009">அறிவிப்பை விரிவாக்கு</translation>
+<translation id="566737009157135450">வார்த்தையைப் பின்னோக்கி நீக்கு</translation>
<translation id="436869212180315161">அழுத்து</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> டெ.பை/வி</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> பை/வி</translation>
<translation id="7649070708921625228">உதவி</translation>
+<translation id="2405367043325750948">முன்புறமாக நீக்கு</translation>
<translation id="6699343763173986273">ஊடகத்தின் அடுத்த டிராக்</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> வினாடிகள் உள்ளன</translation>
<translation id="8226233771743600312">ஒரு நாள் தொந்தரவு செய்ய வேண்டாம்</translation>
+<translation id="4252565523989510616">வார்த்தையை முன்புறமாக நீக்கு</translation>
<translation id="7457942297256758195">அனைத்தையும் அழி</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> நிமிடங்கள்</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> பெ.பை/வி</translation>
<translation id="2743387203779672305">கிளிப்போர்டுக்கு நகலெடு</translation>
<translation id="8371695176452482769">இப்போது பேசுக</translation>
+<translation id="1167268268675672572">வரியின் துவக்கத்திற்கு நகர்ந்து தேர்வை மாற்று</translation>
<translation id="6965382102122355670">சரி</translation>
<translation id="7850320739366109486">தொந்தரவு செய்ய வேண்டாம்</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_te.xtb b/ui/base/strings/ui_strings_te.xtb
index 30e4587f6b..1717834eb4 100644
--- a/ui/base/strings/ui_strings_te.xtb
+++ b/ui/base/strings/ui_strings_te.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">ఎగువ బాణం</translation>
+<translation id="3969863827134279083">పైకి తరలించండి</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> సెకను మిగిలి ఉంది</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> గంటలు</translation>
<translation id="3990502903496589789">కుడి సరిహద్దు</translation>
<translation id="9038489124413477075">పేరులేని ఫోల్డర్</translation>
+<translation id="1940483897317142625">పంక్తి చివరికి తొలగించండి</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> నిమిషాలు</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> రోజులు మిగిలి ఉన్నాయి</translation>
<translation id="932327136139879170">హోమ్</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;అతికించు</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">పదం కుడివైపుకి తరలించండి</translation>
<translation id="364720409959344976">అప్‌లోడ్ చేయడానికి ఫోల్డర్‌ని ఎంచుకోండి</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">నోటిఫికేషన్‌ను మూసివేయి</translation>
<translation id="6364916375976753737">ఎడమకి స్క్రోల్ చేయి</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation>
+<translation id="4218160142017529598">వెనుకకు తొలగించండి</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> నిమిషాలు</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> mins ago</translation>
<translation id="6945221475159498467">ఎంచుకోండి</translation>
<translation id="6620110761915583480">ఫైల్‌ను సేవ్ చేయి</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> సెకన్లు</translation>
+<translation id="8924469368910458384">పంక్తి మొదటికి తొలగించండి</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> నిమిషం మిగిలి ఉంది</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> నిమిషం</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> రోజులు</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> గంటలు మిగిలి ఉన్నాయి</translation>
<translation id="5329858601952122676">&amp;తొలగించు</translation>
+<translation id="6556866813142980365">చర్య పునరావృతం</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> సెకన్లు</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> నిమిషాలు</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> నిమిషాలు</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> నిమిషాలు మిగిలిలాయి</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> సెకన్ల సమయం మిగిలి ఉంది</translation>
+<translation id="6903282483217634857">కుడివైపు తరలించండి</translation>
<translation id="6659594942844771486">టాబ్</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> నిమిషాలు</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">వీటి నుండి నోటిఫికేషన్‌లను అనుమతించు:</translation>
+<translation id="2479520428668657293">కుడివైపు తరలించి, ఎంపికను సవరించండి</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> గంటలు</translation>
<translation id="1398853756734560583">గరిష్ఠీకరించు</translation>
<translation id="4250229828105606438">స్క్రీన్‌షాట్</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> గంటలు</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> నిమిషాలు మిగిలాయి</translation>
+<translation id="2557207087669398617">పంక్తి మొదటికి తరలించండి</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">&amp;అన్నీ ఎంచుకోండి</translation>
<translation id="2168039046890040389">పేజీ పైకి</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> రోజులు</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> నిమిషాలు</translation>
+<translation id="6122334925474904337">పదం కుడివైపుకి తరలించి, ఎంపికను సవరించండి</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> నిమిషం</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">ఇక్కడ చూడటానికి ఏమీ లేదు, కొనసాగండి.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">ఇక్కడ స్క్రోల్ చెయ్యండి</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">క్రిందికి తరలించండి</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> గంటలు</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/సె</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> గంటలు మిగిలా యి</translation>
<translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> నుండి వచ్చే నోటిఫికేషన్‌లను నిలిపివేయి</translation>
<translation id="2666092431469916601">పైన</translation>
+<translation id="2538759511191347839">పంక్తి చివరికి తరలించి, ఎంపికను సవరించండి</translation>
+<translation id="928465423150706909">పంక్తి చివరికి తరలించండి</translation>
<translation id="8331626408530291785">పైకి స్క్రోల్ చెయ్యి</translation>
<translation id="7907591526440419938">ఫైల్‌ను తెరువు</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">మీడియా ఆపివేయి</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">పునరుద్ధరించు</translation>
+<translation id="5349525451964472598">ఎడమవైపు తరలించి, ఎంపికను సవరించండి</translation>
+<translation id="1781701194097416995">పదం ఎడమవైపుకి తరలించండి</translation>
<translation id="1243314992276662751">అప్‌లోడ్ చేయి</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> రోజులు మిగిలి ఉన్నాయి</translation>
<translation id="8179976553408161302">నమోదు చేయండి</translation>
+<translation id="8471049483003785219">పదం ఎడమవైపుకు తరలించి, ఎంపికను సవరించండి</translation>
<translation id="945522503751344254">అభిప్రాయాన్ని పంపండి</translation>
<translation id="9170848237812810038">&amp;అన్డు</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> రోజు</translation>
+<translation id="2704295676501803339">ఎడమవైపుకు తరలించండి</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> సెకన్లు మిగిలి ఉన్నాయి</translation>
<translation id="4570886800634958009">నోటిఫికేషన్‌ను విస్తరించు</translation>
+<translation id="566737009157135450">పదం నుండి వెనుకవైపుకు తొలగించండి</translation>
<translation id="436869212180315161">నొక్కు</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">సహాయం</translation>
+<translation id="2405367043325750948">ముందుకు తొలగించండి</translation>
<translation id="6699343763173986273">మీడియా తదుపరి ట్రాక్</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> సెకన్ల సమయం మిగిలి ఉంది</translation>
<translation id="8226233771743600312">ఒక రోజుపాటు అంతరాయం కలిగించవద్దు</translation>
+<translation id="4252565523989510616">పదం నుండి ముందువైపుకు తొలగించండి</translation>
<translation id="7457942297256758195">అన్నీ క్లియర్ చేయి</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> నిమిషాలు</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">క్లిప్‌బోర్డ్‌కు కాపీ చేయి</translation>
<translation id="8371695176452482769">ఇప్పుడు మాట్లాడండి</translation>
+<translation id="1167268268675672572">పంక్తి మొదటికి తరలించి, ఎంపికను సవరించండి</translation>
<translation id="6965382102122355670">సరే</translation>
<translation id="7850320739366109486">అంతరాయం కలిగించవద్దు</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_th.xtb b/ui/base/strings/ui_strings_th.xtb
index a3fb41976b..65bad62d88 100644
--- a/ui/base/strings/ui_strings_th.xtb
+++ b/ui/base/strings/ui_strings_th.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">ลูกศรขึ้น</translation>
+<translation id="3969863827134279083">เลื่อนขึ้น</translation>
<translation id="7062130397825382308">เหลือ <ph name="NUMBER_ONE"/> วินาที</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/วินาที</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ชั่วโมง</translation>
<translation id="3990502903496589789">ขอบขวา</translation>
<translation id="9038489124413477075">โฟลเดอร์ที่ไม่มีชื่อ</translation>
+<translation id="1940483897317142625">ลบจนถึงท้ายบรรทัด</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> นาที</translation>
<translation id="3520476450377425184">เหลือ <ph name="NUMBER_MANY"/> วัน</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> วันที่ผ่านมา</translation>
<translation id="5076340679995252485">&amp;วาง</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">ย้ายคำมาทางขวา</translation>
<translation id="364720409959344976">เลือกโฟลเดอร์เพื่ออัปโหลด</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> นาทีที่ผ่านมา</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">ปิดการแจ้งเตือน</translation>
<translation id="6364916375976753737">เลื่อนทางซ้าย</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> ชั่วโมงที่ผ่านมา</translation>
+<translation id="4218160142017529598">ลบย้อนหลัง</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> นาที</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> นาทีที่ผ่านมา</translation>
<translation id="6945221475159498467">เลือก</translation>
<translation id="6620110761915583480">บันทึกไฟล์</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation>
+<translation id="8924469368910458384">ลบจนถึงจุดเริ่มต้นบรรทัด</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">เหลือ <ph name="NUMBER_ONE"/> นาที</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> นาที</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> วัน</translation>
<translation id="7163503212501929773">เหลือ <ph name="NUMBER_MANY"/> ชั่วโมง</translation>
<translation id="5329858601952122676">&amp;ลบ</translation>
+<translation id="6556866813142980365">ทำซ้ำ</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> วินาที</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="50960180632766478">เหลือ <ph name="NUMBER_FEW"/> นาที</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">ย้ายไปทางขวา</translation>
<translation id="6659594942844771486">แท็บ</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> วันที่ผ่านมา</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> นาที</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">อนุญาตให้มีการแจ้งเตือนจากรายการต่อไปนี้</translation>
+<translation id="2479520428668657293">ย้ายไปทางขวาและปรับการเลือก</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> ชั่วโมง</translation>
<translation id="1398853756734560583">ย่อ</translation>
<translation id="4250229828105606438">ภาพหน้าจอ</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> ชั่วโมง</translation>
<translation id="5260878308685146029">เหลือ <ph name="NUMBER_TWO"/> นาที</translation>
+<translation id="2557207087669398617">ย้ายไปจุดเริ่มต้นบรรทัด</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">เลือก&amp;ทั้งหมด</translation>
<translation id="2168039046890040389">เลื่อนหน้าขึ้น</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> วัน</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> นาที</translation>
+<translation id="6122334925474904337">ย้ายคำไปทางขวาและปรับการเลือก</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> นาที</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> วินาทีที่ผ่านมา</translation>
<translation id="4927753642311223124">ที่นี่ไม่มีอะไรต้องดู ไปต่อได้</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">เลื่อนมาที่นี่</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">เลื่อนลง</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ชั่วโมง</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/วินาที</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">เหลือ <ph name="NUMBER_ONE"/> ชั่วโมง</translation>
<translation id="1413622004203049571">ปิดการแจ้งเตือนจาก <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">ด้านบน</translation>
+<translation id="2538759511191347839">ย้ายไปท้ายบรรทัดและปรับการเลือก</translation>
+<translation id="928465423150706909">ย้ายไปท้ายบรรทัด</translation>
<translation id="8331626408530291785">เลื่อนขึ้น</translation>
<translation id="7907591526440419938">เปิดไฟล์</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">หยุดสื่อ</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">คืนค่า</translation>
+<translation id="5349525451964472598">ย้ายไปทางซ้ายและปรับการเลือก</translation>
+<translation id="1781701194097416995">ย้ายคำไปทางซ้าย</translation>
<translation id="1243314992276662751">อัปโหลด</translation>
<translation id="50030952220075532">เหลือ <ph name="NUMBER_ONE"/> วัน</translation>
<translation id="8179976553408161302">เข้าใช้</translation>
+<translation id="8471049483003785219">ย้ายคำไปทางซ้ายและปรับการเลือก</translation>
<translation id="945522503751344254">ส่งความคิดเห็น</translation>
<translation id="9170848237812810038">เ&amp;ลิกทำ</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> ชั่วโมงที่ผ่านมา</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/วินาที</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> วัน</translation>
+<translation id="2704295676501803339">ย้ายไปทางซ้าย</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> วินาทีที่ผ่านมา</translation>
<translation id="494645311413743213">เหลือ <ph name="NUMBER_TWO"/> วินาที</translation>
<translation id="4570886800634958009">ขยายการแจ้งเตือน</translation>
+<translation id="566737009157135450">ลบคำย้อนหลัง</translation>
<translation id="436869212180315161">กด</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> วินาทีที่ผ่านมา</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/วินาที</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> นาทีที่ผ่านมา</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/วินาที</translation>
<translation id="7649070708921625228">ช่วยเหลือ</translation>
+<translation id="2405367043325750948">ลบไปข้างหน้า</translation>
<translation id="6699343763173986273">แทร็กถัดไปของสื่อ</translation>
<translation id="5445120697129764393">เหลือ <ph name="NUMBER_DEFAULT"/> วินาที</translation>
<translation id="8226233771743600312">ห้ามรบกวนเป็นเวลาหนึ่งวัน</translation>
+<translation id="4252565523989510616">ลบคำไปข้างหน้า</translation>
<translation id="7457942297256758195">ล้างทั้งหมด</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> วันที่ผ่านมา</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> นาที</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/วินาที</translation>
<translation id="2743387203779672305">คัดลอกไว้ที่คลิปบอร์ด</translation>
<translation id="8371695176452482769">เชิญพูดเลย</translation>
+<translation id="1167268268675672572">ย้ายไปจุดเริ่มต้นของบรรทัดและปรับการเลือก</translation>
<translation id="6965382102122355670">ตกลง</translation>
<translation id="7850320739366109486">ห้ามรบกวน</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_tr.xtb b/ui/base/strings/ui_strings_tr.xtb
index 7b668557b0..eb884a88e9 100644
--- a/ui/base/strings/ui_strings_tr.xtb
+++ b/ui/base/strings/ui_strings_tr.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Yukarı Ok</translation>
+<translation id="3969863827134279083">Yukarı Git</translation>
<translation id="7062130397825382308"><ph name="NUMBER_ONE"/> second left</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/sn</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> saat</translation>
<translation id="3990502903496589789">Sağ Kenar</translation>
<translation id="9038489124413477075">Adsız Klasör</translation>
+<translation id="1940483897317142625">Satırın Sonuna Kadar Sil</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> dakika</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> gün kaldı</translation>
<translation id="932327136139879170">Ana Sayfa</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> gün önce</translation>
<translation id="5076340679995252485">&amp;Yapıştır</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Bir Kelime Sağa Git</translation>
<translation id="364720409959344976">Yüklenecek Klasörü Seçin</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> dakika önce</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Bildirimi kapat</translation>
<translation id="6364916375976753737">Sola Kaydır</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> saat önce</translation>
+<translation id="4218160142017529598">Geriye Doğru Sil</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> dakika</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> dakika önce</translation>
<translation id="6945221475159498467">Seç</translation>
<translation id="6620110761915583480">Dosyayı Kaydet</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation>
+<translation id="8924469368910458384">Satırın Başına Kadar Sil</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> dakika kaldı</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> dakika</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> gün</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> saat kaldı</translation>
<translation id="5329858601952122676">&amp;Sil</translation>
+<translation id="6556866813142980365">Yeniden Yap</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> saniye</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> dakika kaldı</translation>
<translation id="5517291721709019259"><ph name="NUMBER_FEW"/> seconds left</translation>
+<translation id="6903282483217634857">Sağa Git</translation>
<translation id="6659594942844771486">Sekme</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> gün önce</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> dakika</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Şunlardan gelen bildirimlere izin ver:</translation>
+<translation id="2479520428668657293">Sağa Git ve Seçimi Değiştir</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> saat</translation>
<translation id="1398853756734560583">Büyüt</translation>
<translation id="4250229828105606438">Ekran görüntüsü</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> saat</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> dakika kaldı</translation>
+<translation id="2557207087669398617">Satırın Başına Git</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Tümünü &amp;seç</translation>
<translation id="2168039046890040389">Page Up</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> gün</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> dakika</translation>
+<translation id="6122334925474904337">Bir Kelime Sağa Git ve Seçimi Değiştir</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> minute</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> saniye önce</translation>
<translation id="4927753642311223124">Burada görülecek bir şey yok, devam edin.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Buraya Kaydır</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Aşağı Git</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> saat</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/sn</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> saat kaldı</translation>
<translation id="1413622004203049571"><ph name="NOTIFIER_NAME"/> bildirimlerini devre dışı bırak</translation>
<translation id="2666092431469916601">Üst</translation>
+<translation id="2538759511191347839">Satırın Sonuna Git ve Seçimi Değiştir</translation>
+<translation id="928465423150706909">Satırın Sonuna Git</translation>
<translation id="8331626408530291785">Yukarı Kaydır</translation>
<translation id="7907591526440419938">Dosya Aç</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Medyayı Durdur</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Geri yükle</translation>
+<translation id="5349525451964472598">Sola Git ve Seçimi Değiştir</translation>
+<translation id="1781701194097416995">Bir Kelime Sola Git</translation>
<translation id="1243314992276662751">Yükle</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> gün kaldı</translation>
<translation id="8179976553408161302">Giriş</translation>
+<translation id="8471049483003785219">Bir Kelime Sola Git ve Seçimi Değiştir</translation>
<translation id="945522503751344254">Geri bildirim gönder</translation>
<translation id="9170848237812810038">&amp;Geri al</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> saat önce</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/sn</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> gün</translation>
+<translation id="2704295676501803339">Sola Git</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> saniye önce</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> saniye kaldı</translation>
<translation id="4570886800634958009">Bildirimi genişlet</translation>
+<translation id="566737009157135450">Geriye Doğru Bir Kelime Sil</translation>
<translation id="436869212180315161">Basın</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> saniye önce</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/sn</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> dakika önce</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/sn</translation>
<translation id="7649070708921625228">Yardım</translation>
+<translation id="2405367043325750948">İleriye Doğru Sil</translation>
<translation id="6699343763173986273">Medya Sonraki Parça</translation>
<translation id="5445120697129764393"><ph name="NUMBER_DEFAULT"/> saniye kaldı</translation>
<translation id="8226233771743600312">Bir gün süreyle rahatsız etmeyin</translation>
+<translation id="4252565523989510616">İleriye Doğru Bir Kelime Sil</translation>
<translation id="7457942297256758195">Tümünü Temizle</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> gün önce</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> dakika</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/sn</translation>
<translation id="2743387203779672305">Panoya kopyala</translation>
<translation id="8371695176452482769">Şimdi konuşun</translation>
+<translation id="1167268268675672572">Satırın Başına Git ve Seçimi Değiştir</translation>
<translation id="6965382102122355670">Tamam</translation>
<translation id="7850320739366109486">Rahatsız Etmeyin</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_uk.xtb b/ui/base/strings/ui_strings_uk.xtb
index fbe079fc02..beede81381 100644
--- a/ui/base/strings/ui_strings_uk.xtb
+++ b/ui/base/strings/ui_strings_uk.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> б</translation>
<translation id="3660179305079774227">Курсор угору</translation>
+<translation id="3969863827134279083">Перемістити курсор угору</translation>
<translation id="7062130397825382308">Залишилася <ph name="NUMBER_ONE"/> секунда</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> Мб/сек.</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> годин</translation>
<translation id="3990502903496589789">Правий край</translation>
<translation id="9038489124413477075">Папка без назви</translation>
+<translation id="1940483897317142625">Видалити символи до кінця рядка</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> хв.</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation>
<translation id="932327136139879170">Home</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> дн. тому</translation>
<translation id="5076340679995252485">&amp;Вставити</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> Тб</translation>
+<translation id="7139614227326422685">Перемістити курсор на одне слово праворуч</translation>
<translation id="364720409959344976">Виберіть папку для завантаження</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Закрити сповіщення</translation>
<translation id="6364916375976753737">Прокрутка вліво</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> год. тому</translation>
+<translation id="4218160142017529598">Видалити символи перед курсором</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> хв</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> хв. тому</translation>
<translation id="6945221475159498467">Вибрати</translation>
<translation id="6620110761915583480">Зберегти файл</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> seconds</translation>
+<translation id="8924469368910458384">Видалити символи до початку рядка</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Залишилася <ph name="NUMBER_ONE"/> хвилина</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> хв.</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> days</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> hours left</translation>
<translation id="5329858601952122676">&amp;Видалити</translation>
+<translation id="6556866813142980365">Повторити</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> Кб</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> хв. залишилось</translation>
<translation id="5517291721709019259">Залишилося <ph name="NUMBER_FEW"/> секунди</translation>
+<translation id="6903282483217634857">Перемістити курсор праворуч</translation>
<translation id="6659594942844771486">Вкладка</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> Мб</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> дн. тому</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> mins</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Дозволити сповіщення з перелічених нижче джерел.</translation>
+<translation id="2479520428668657293">Перемістити курсор праворуч і змінити виділений фрагмент</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> годин</translation>
<translation id="1398853756734560583">Збільшити</translation>
<translation id="4250229828105606438">Знімок екрана</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> hours</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> mins left</translation>
+<translation id="2557207087669398617">Перемістити курсор на початок рядка</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> Гб</translation>
<translation id="1901303067676059328">Вибрати &amp;всі</translation>
<translation id="2168039046890040389">Сторінка вгору</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> днів</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mins</translation>
+<translation id="6122334925474904337">Перемістити курсор на одне слово праворуч і змінити виділений фрагмент</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> хвилина</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Сповіщень немає.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Прокрутка до цього місця</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">Перемістити курсор униз</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> годин</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> Кб/сек.</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> година залишилась</translation>
<translation id="1413622004203049571">Вимкнути сповіщення від <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Верх</translation>
+<translation id="2538759511191347839">Перемістити курсор у кінець рядка та змінити виділений фрагмент</translation>
+<translation id="928465423150706909">Перемістити курсор у кінець рядка</translation>
<translation id="8331626408530291785">Прокрутка вгору</translation>
<translation id="7907591526440419938">Відкрити файл</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Зупинити</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Відновити</translation>
+<translation id="5349525451964472598">Перемістити курсор ліворуч і змінити виділений фрагмент</translation>
+<translation id="1781701194097416995">Перемістити курсор на одне слово ліворуч</translation>
<translation id="1243314992276662751">Завантажити</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> день залишився</translation>
<translation id="8179976553408161302">Увійти</translation>
+<translation id="8471049483003785219">Перемістити курсор на одне слово ліворуч і змінити виділений фрагмент</translation>
<translation id="945522503751344254">Надіслати відгук</translation>
<translation id="9170848237812810038">&amp;Скасувати</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> год. тому</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> Гб/сек.</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> день</translation>
+<translation id="2704295676501803339">Перемістити курсор ліворуч</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> сек. тому</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation>
<translation id="4570886800634958009">Розгорнути сповіщення</translation>
+<translation id="566737009157135450">Видалити слово перед курсором</translation>
<translation id="436869212180315161">Натиснути</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> сек. тому</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> Тб/сек.</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> б/сек.</translation>
<translation id="7649070708921625228">Довідка</translation>
+<translation id="2405367043325750948">Видалити символи після курсора</translation>
<translation id="6699343763173986273">Наступна композиція</translation>
<translation id="5445120697129764393">Залишилося <ph name="NUMBER_DEFAULT"/> секунд</translation>
<translation id="8226233771743600312">Не турбувати впродовж одного дня</translation>
+<translation id="4252565523989510616">Видалити слово після курсора</translation>
<translation id="7457942297256758195">Очистити все</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> хв.</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> Пб/сек.</translation>
<translation id="2743387203779672305">Копіювати в буфер</translation>
<translation id="8371695176452482769">Диктуйте</translation>
+<translation id="1167268268675672572">Перемістити курсор на початок рядка та змінити виділений фрагмент</translation>
<translation id="6965382102122355670">ОК</translation>
<translation id="7850320739366109486">Не турбувати</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_vi.xtb b/ui/base/strings/ui_strings_vi.xtb
index 37c4af42c8..18071afaab 100644
--- a/ui/base/strings/ui_strings_vi.xtb
+++ b/ui/base/strings/ui_strings_vi.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Phím mũi tên Lên</translation>
+<translation id="3969863827134279083">Di chuyển lên</translation>
<translation id="7062130397825382308">Còn <ph name="NUMBER_ONE"/> giây</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/giây</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> giờ</translation>
<translation id="3990502903496589789">Cạnh bên Phải</translation>
<translation id="9038489124413477075">Thư mục không có tên</translation>
+<translation id="1940483897317142625">Xóa đến cuối dòng</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> phút</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> ngày còn lại</translation>
<translation id="932327136139879170">Trang chủ</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;Dán</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">Di chuyển sang bên phải từ</translation>
<translation id="364720409959344976">Chọn thư mục để tải lên</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">Đóng thông báo</translation>
<translation id="6364916375976753737">Cuộn qua Trái</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</translation>
+<translation id="4218160142017529598">Xóa lùi</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> phút</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> phút trước</translation>
<translation id="6945221475159498467">Chọn</translation>
<translation id="6620110761915583480">Lưu Tệp</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> giây</translation>
+<translation id="8924469368910458384">Xóa đến đầu dòng</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">Còn lại <ph name="NUMBER_ONE"/> phút</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> phút</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ngày</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> giờ còn lại</translation>
<translation id="5329858601952122676">&amp;Xoá</translation>
+<translation id="6556866813142980365">Làm lại</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> giây</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> phút</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> phút</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> phút còn lại</translation>
<translation id="5517291721709019259">Còn <ph name="NUMBER_FEW"/> giây</translation>
+<translation id="6903282483217634857">Di chuyển sang phải</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> ngày trước</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> phút</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Cho phép thông báo từ:</translation>
+<translation id="2479520428668657293">Di chuyển sang phải và sửa đổi lựa chọn</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> giờ</translation>
<translation id="1398853756734560583">Phóng to</translation>
<translation id="4250229828105606438">Ảnh chụp màn hình</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> giờ</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> phút còn lại</translation>
+<translation id="2557207087669398617">Di chuyển tới đầu dòng</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">Chọn &amp;tất cả</translation>
<translation id="2168039046890040389">Page Up</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> ngày</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> phút</translation>
+<translation id="6122334925474904337">Di chuyển sang bên phải từ và sửa đổi lựa chọn</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> phút</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Không có nội dung nào để xem ở đây, hãy tiếp tục.</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Cuộn tới Đây</translation>
<translation id="4552416320897244156">Trang Dưới</translation>
+<translation id="3066573403916685335">Di chuyển xuống</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> giờ</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> giờ còn lại</translation>
<translation id="1413622004203049571">Tắt thông báo từ <ph name="NOTIFIER_NAME"/></translation>
<translation id="2666092431469916601">Hàng đầu</translation>
+<translation id="2538759511191347839">Di chuyển đến cuối dòng và sửa đổi lựa chọn</translation>
+<translation id="928465423150706909">Di chuyển đến cuối dòng</translation>
<translation id="8331626408530291785">Cuộn Lên</translation>
<translation id="7907591526440419938">Mở Tệp</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">Dừng trình phát phương tiện</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Khôi phục</translation>
+<translation id="5349525451964472598">Di chuyển sang trái và sửa đổi lựa chọn</translation>
+<translation id="1781701194097416995">Di chuyển sang bên trái từ</translation>
<translation id="1243314992276662751">Tải lên</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> ngày còn lại</translation>
<translation id="8179976553408161302">Vào</translation>
+<translation id="8471049483003785219">Di chuyển sang bên trái từ và sửa đổi lựa chọn</translation>
<translation id="945522503751344254">Gửi phản hồi</translation>
<translation id="9170848237812810038">H&amp;oàn tác</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/giây</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> ngày</translation>
+<translation id="2704295676501803339">Di chuyển sang trái</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> giây trước</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> giây còn lại</translation>
<translation id="4570886800634958009">Mở rộng thông báo</translation>
+<translation id="566737009157135450">Xóa lùi từ</translation>
<translation id="436869212180315161">Nhấp vào</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/giây</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/giây</translation>
<translation id="7649070708921625228">Trợ giúp</translation>
+<translation id="2405367043325750948">Xóa tiến</translation>
<translation id="6699343763173986273">Bản nhạc tiếp theo của trình phát phương tiện</translation>
<translation id="5445120697129764393">Còn <ph name="NUMBER_DEFAULT"/> giây</translation>
<translation id="8226233771743600312">Không làm phiền trong một ngày</translation>
+<translation id="4252565523989510616">Xóa tiến từ</translation>
<translation id="7457942297256758195">Xóa tất cả</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> phút</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/giây</translation>
<translation id="2743387203779672305">Sao chép vào khay nhớ tạm</translation>
<translation id="8371695176452482769">Nói ngay bây giờ</translation>
+<translation id="1167268268675672572">Di chuyển tới đầu dòng và sửa đổi lựa chọn</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Không làm phiền</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_zh-CN.xtb b/ui/base/strings/ui_strings_zh-CN.xtb
index 88ba74d4e8..0020688e5c 100644
--- a/ui/base/strings/ui_strings_zh-CN.xtb
+++ b/ui/base/strings/ui_strings_zh-CN.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">向上箭头</translation>
+<translation id="3969863827134279083">上移</translation>
<translation id="7062130397825382308">还剩<ph name="NUMBER_ONE"/>秒</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> 小时</translation>
<translation id="3990502903496589789">右边缘</translation>
<translation id="9038489124413477075">未命名的文件夹</translation>
+<translation id="1940483897317142625">删除至行末</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> 分钟</translation>
<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation>
<translation id="932327136139879170">主页</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> 天前</translation>
<translation id="5076340679995252485">粘贴(&amp;P)</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">向右移一个字</translation>
<translation id="364720409959344976">选择要上传的文件夹</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> 分钟前</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">关闭通知</translation>
<translation id="6364916375976753737">向左滚动</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> 小时前</translation>
+<translation id="4218160142017529598">向前删除</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> 分钟</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> 分钟前</translation>
<translation id="6945221475159498467">选择</translation>
<translation id="6620110761915583480">保存文件</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> 秒</translation>
+<translation id="8924469368910458384">删除至行首</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">还剩 <ph name="NUMBER_ONE"/> 分钟</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> days</translation>
<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> hours left</translation>
<translation id="5329858601952122676">删除(&amp;D)</translation>
+<translation id="6556866813142980365">重做</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> 分钟</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> 分钟</translation>
<translation id="50960180632766478"><ph name="NUMBER_FEW"/> mins left</translation>
<translation id="5517291721709019259">还剩<ph name="NUMBER_FEW"/>秒</translation>
+<translation id="6903282483217634857">右移</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> 天前</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> mins</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">允许以下来源的通知:</translation>
+<translation id="2479520428668657293">右移并更改选择范围</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> hours</translation>
<translation id="1398853756734560583">最大化</translation>
<translation id="4250229828105606438">屏幕截图</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> hours</translation>
<translation id="5260878308685146029"><ph name="NUMBER_TWO"/> mins left</translation>
+<translation id="2557207087669398617">移至行首</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">全选(&amp;A)</translation>
<translation id="2168039046890040389">向上翻页</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> 天</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> mins</translation>
+<translation id="6122334925474904337">向右移一个字并更改选择范围</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> 分钟</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> 秒前</translation>
<translation id="4927753642311223124">这里没有任何通知,往前走吧。</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">滚动到此处</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">下移</translation>
<translation id="7052633198403197513">F1</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hours</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hour left</translation>
<translation id="1413622004203049571">停用来自“<ph name="NOTIFIER_NAME"/>”的通知</translation>
<translation id="2666092431469916601">顶部</translation>
+<translation id="2538759511191347839">移至行末并更改选择范围</translation>
+<translation id="928465423150706909">移至行末</translation>
<translation id="8331626408530291785">向上滚动</translation>
<translation id="7907591526440419938">打开文件</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">媒体停止</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">恢复</translation>
+<translation id="5349525451964472598">左移并更改选择范围</translation>
+<translation id="1781701194097416995">向左移一个字</translation>
<translation id="1243314992276662751">上传</translation>
<translation id="50030952220075532"><ph name="NUMBER_ONE"/> day left</translation>
<translation id="8179976553408161302">进入</translation>
+<translation id="8471049483003785219">向左移一个字并更改选择范围</translation>
<translation id="945522503751344254">发送反馈</translation>
<translation id="9170848237812810038">撤消(&amp;U)</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> 小时前</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/s</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> day</translation>
+<translation id="2704295676501803339">左移</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> 秒前</translation>
<translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation>
<translation id="4570886800634958009">展开通知</translation>
+<translation id="566737009157135450">向前删除一个字</translation>
<translation id="436869212180315161">按</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> 秒前</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> 分钟前</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">帮助</translation>
+<translation id="2405367043325750948">向后删除</translation>
<translation id="6699343763173986273">媒体下一曲</translation>
<translation id="5445120697129764393">还剩<ph name="NUMBER_DEFAULT"/>秒</translation>
<translation id="8226233771743600312">1 天内请勿打扰</translation>
+<translation id="4252565523989510616">向后删除一个字</translation>
<translation id="7457942297256758195">全部清除</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> 天前</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mins</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
<translation id="2743387203779672305">复制到剪贴板</translation>
<translation id="8371695176452482769">请开始说话</translation>
+<translation id="1167268268675672572">移至行首并更改选择范围</translation>
<translation id="6965382102122355670">确定</translation>
<translation id="7850320739366109486">请勿打扰</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/strings/ui_strings_zh-TW.xtb b/ui/base/strings/ui_strings_zh-TW.xtb
index 30ca641e2f..2686aa8344 100644
--- a/ui/base/strings/ui_strings_zh-TW.xtb
+++ b/ui/base/strings/ui_strings_zh-TW.xtb
@@ -24,11 +24,13 @@
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">向上鍵</translation>
+<translation id="3969863827134279083">上移</translation>
<translation id="7062130397825382308">剩下 <ph name="NUMBER_ONE"/> 秒</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/秒</translation>
<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> 小時</translation>
<translation id="3990502903496589789">右邊緣</translation>
<translation id="9038489124413477075">未命名的資料夾</translation>
+<translation id="1940483897317142625">刪除到行尾</translation>
<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> 分鐘</translation>
<translation id="3520476450377425184">剩下 <ph name="NUMBER_MANY"/> 天</translation>
<translation id="932327136139879170">首頁</translation>
@@ -41,6 +43,7 @@
<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> 天前</translation>
<translation id="5076340679995252485">貼上(&amp;P)</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="7139614227326422685">右移到文字分行</translation>
<translation id="364720409959344976">選取要上傳的資料夾</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> 分鐘前</translation>
@@ -51,11 +54,13 @@
<translation id="1860796786778352021">通知關閉</translation>
<translation id="6364916375976753737">向左捲動</translation>
<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> 小時前</translation>
+<translation id="4218160142017529598">向後刪除</translation>
<translation id="2994641463185352298"><ph name="NUMBER_DEFAULT"/> 分鐘</translation>
<translation id="6982279413068714821"><ph name="NUMBER_DEFAULT"/> 分鐘前</translation>
<translation id="6945221475159498467">選取</translation>
<translation id="6620110761915583480">儲存檔案</translation>
<translation id="4349181486102621992"><ph name="NUMBER_ZERO"/> 秒</translation>
+<translation id="8924469368910458384">刪除到行首</translation>
<translation id="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
<translation id="7836361698254323868">剩下 <ph name="NUMBER_ONE"/> 分鐘</translation>
<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> 分鐘</translation>
@@ -63,6 +68,7 @@
<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> 天</translation>
<translation id="7163503212501929773">剩下 <ph name="NUMBER_MANY"/> 小時</translation>
<translation id="5329858601952122676">刪除(&amp;D)</translation>
+<translation id="6556866813142980365">重做</translation>
<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> 秒</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> 分鐘</translation>
@@ -71,6 +77,7 @@
<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> 分鐘</translation>
<translation id="50960180632766478">剩下 <ph name="NUMBER_FEW"/> 分鐘</translation>
<translation id="5517291721709019259">剩下 <ph name="NUMBER_FEW"/> 秒</translation>
+<translation id="6903282483217634857">右移</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> 天前</translation>
@@ -89,17 +96,20 @@
<translation id="290555789621781773"><ph name="NUMBER_TWO"/> 分鐘</translation>
<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">允許接收下列來源發出的通知:</translation>
+<translation id="2479520428668657293">右移並修改選取範圍</translation>
<translation id="8112886015144590373"><ph name="NUMBER_FEW"/> 小時</translation>
<translation id="1398853756734560583">放到最大</translation>
<translation id="4250229828105606438">螢幕擷取畫面</translation>
<translation id="6690744523875189208"><ph name="NUMBER_TWO"/> 小時</translation>
<translation id="5260878308685146029">剩下 <ph name="NUMBER_TWO"/> 分鐘</translation>
+<translation id="2557207087669398617">移到行首</translation>
<translation id="3757388668994797779"><ph name="QUANTITY"/> GB</translation>
<translation id="1901303067676059328">選取全部(&amp;A)</translation>
<translation id="2168039046890040389">向上翻頁</translation>
<translation id="7363290921156020669"><ph name="NUMBER_ZERO"/> mins</translation>
<translation id="9107059250669762581"><ph name="NUMBER_DEFAULT"/> 天</translation>
<translation id="6463061331681402734"><ph name="NUMBER_MANY"/> 分鐘</translation>
+<translation id="6122334925474904337">右移到文字分行並修改選取範圍</translation>
<translation id="7634624804467787019"><ph name="NUMBER_ONE"/> 分鐘</translation>
<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> 秒前</translation>
<translation id="4927753642311223124">這裡沒有任何通知訊息,以後再來看看吧!</translation>
@@ -107,6 +117,7 @@
<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">捲動至此</translation>
<translation id="4552416320897244156">PgDwn</translation>
+<translation id="3066573403916685335">下移</translation>
<translation id="7052633198403197513">F1 鍵</translation>
<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> 小時</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/秒</translation>
@@ -123,6 +134,8 @@
<translation id="7414887922320653780">剩下 <ph name="NUMBER_ONE"/> 小時</translation>
<translation id="1413622004203049571">停用「<ph name="NOTIFIER_NAME"/>」的通知</translation>
<translation id="2666092431469916601">置頂</translation>
+<translation id="2538759511191347839">移到行尾並修改選取範圍</translation>
+<translation id="928465423150706909">移到行尾</translation>
<translation id="8331626408530291785">向上捲動</translation>
<translation id="7907591526440419938">開啟檔案</translation>
<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
@@ -132,9 +145,12 @@
<translation id="6808150112686056157">停止媒體播放</translation>
<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">還原</translation>
+<translation id="5349525451964472598">左移並修改選取範圍</translation>
+<translation id="1781701194097416995">左移到文字分行</translation>
<translation id="1243314992276662751">上傳</translation>
<translation id="50030952220075532">剩下 <ph name="NUMBER_ONE"/> 天</translation>
<translation id="8179976553408161302">進入</translation>
+<translation id="8471049483003785219">左移到文字分行並修改選取範圍</translation>
<translation id="945522503751344254">提供意見</translation>
<translation id="9170848237812810038">取消(&amp;U)</translation>
<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> 小時前</translation>
@@ -157,9 +173,11 @@
<translation id="8788572795284305350"><ph name="NUMBER_ZERO"/> hours ago</translation>
<translation id="3740362395218339114"><ph name="QUANTITY"/> GB/秒</translation>
<translation id="6644971472240498405"><ph name="NUMBER_ONE"/> 天</translation>
+<translation id="2704295676501803339">左移</translation>
<translation id="9098468523912235228"><ph name="NUMBER_DEFAULT"/> 秒前</translation>
<translation id="494645311413743213">剩下 <ph name="NUMBER_TWO"/> 秒</translation>
<translation id="4570886800634958009">通知展開</translation>
+<translation id="566737009157135450">向後刪除文字</translation>
<translation id="436869212180315161">按下</translation>
<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> 秒前</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/秒</translation>
@@ -169,9 +187,11 @@
<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> 分鐘前</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/秒</translation>
<translation id="7649070708921625228">說明</translation>
+<translation id="2405367043325750948">向前刪除</translation>
<translation id="6699343763173986273">下一首媒體曲目</translation>
<translation id="5445120697129764393">剩下 <ph name="NUMBER_DEFAULT"/> 秒</translation>
<translation id="8226233771743600312">1 天內請勿打擾</translation>
+<translation id="4252565523989510616">向前刪除文字</translation>
<translation id="7457942297256758195">全部清除</translation>
<translation id="822618367988303761"><ph name="NUMBER_TWO"/> 天前</translation>
<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> 分鐘</translation>
@@ -187,6 +207,7 @@
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/秒</translation>
<translation id="2743387203779672305">複製到剪貼簿</translation>
<translation id="8371695176452482769">請說話</translation>
+<translation id="1167268268675672572">移到行首並修改選取範圍</translation>
<translation id="6965382102122355670">確定</translation>
<translation id="7850320739366109486">請勿打擾</translation>
<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
diff --git a/ui/base/ui_base.gyp b/ui/base/ui_base.gyp
index 2ee7723143..3d9214f9c7 100644
--- a/ui/base/ui_base.gyp
+++ b/ui/base/ui_base.gyp
@@ -376,7 +376,6 @@
}],
['use_glib == 1', {
'dependencies': [
- # font_gtk.cc uses fontconfig.
'../../build/linux/system.gyp:fontconfig',
'../../build/linux/system.gyp:glib',
],
@@ -566,6 +565,46 @@
}],
],
},
+ {
+ 'target_name': 'ui_base_test_support',
+ 'dependencies': [
+ '../../base/base.gyp:base',
+ '../../skia/skia.gyp:skia',
+ '../../testing/gtest.gyp:gtest',
+ '../gfx/gfx.gyp:gfx',
+ '../gfx/gfx.gyp:gfx_geometry',
+ ],
+ 'sources': [
+ 'test/ui_controls.h',
+ 'test/ui_controls_aura.cc',
+ 'test/ui_controls_internal_win.cc',
+ 'test/ui_controls_internal_win.h',
+ 'test/ui_controls_mac.mm',
+ 'test/ui_controls_win.cc',
+ ],
+ 'include_dirs': [
+ '../..',
+ ],
+ 'conditions': [
+ ['OS!="ios"', {
+ 'type': 'static_library',
+ 'includes': [ 'ime/ime_test_support.gypi' ],
+ }, { # OS=="ios"
+ # None of the sources in this target are built on iOS, resulting in
+ # link errors when building targets that depend on this target
+ # because the static library isn't found. If this target is changed
+ # to have sources that are built on iOS, the target should be changed
+ # to be of type static_library on all platforms.
+ 'type': 'none',
+ }],
+ ['use_aura==1', {
+ 'sources!': [
+ 'test/ui_controls_mac.mm',
+ 'test/ui_controls_win.cc',
+ ],
+ }],
+ ],
+ },
],
'conditions': [
['OS=="android"' , {
diff --git a/ui/base/ui_base.target.darwin-arm.mk b/ui/base/ui_base.target.darwin-arm.mk
index 4b43a10a9e..b814021877 100644
--- a/ui/base/ui_base.target.darwin-arm.mk
+++ b/ui/base/ui_base.target.darwin-arm.mk
@@ -145,12 +145,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -270,12 +273,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -351,7 +357,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/base/ui_base.target.darwin-mips.mk b/ui/base/ui_base.target.darwin-mips.mk
index f31f2d7fed..3af7d1b185 100644
--- a/ui/base/ui_base.target.darwin-mips.mk
+++ b/ui/base/ui_base.target.darwin-mips.mk
@@ -144,12 +144,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -268,12 +271,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -347,7 +353,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/base/ui_base.target.darwin-x86.mk b/ui/base/ui_base.target.darwin-x86.mk
index 992f78f5d5..07cd479fcf 100644
--- a/ui/base/ui_base.target.darwin-x86.mk
+++ b/ui/base/ui_base.target.darwin-x86.mk
@@ -145,12 +145,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -269,12 +272,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -347,7 +353,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/base/ui_base.target.darwin-x86_64.mk b/ui/base/ui_base.target.darwin-x86_64.mk
index 268a87d307..af066fc413 100644
--- a/ui/base/ui_base.target.darwin-x86_64.mk
+++ b/ui/base/ui_base.target.darwin-x86_64.mk
@@ -146,12 +146,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -271,12 +274,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -349,7 +355,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/base/ui_base.target.linux-arm.mk b/ui/base/ui_base.target.linux-arm.mk
index 4b43a10a9e..b814021877 100644
--- a/ui/base/ui_base.target.linux-arm.mk
+++ b/ui/base/ui_base.target.linux-arm.mk
@@ -145,12 +145,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -270,12 +273,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -351,7 +357,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/base/ui_base.target.linux-mips.mk b/ui/base/ui_base.target.linux-mips.mk
index f31f2d7fed..3af7d1b185 100644
--- a/ui/base/ui_base.target.linux-mips.mk
+++ b/ui/base/ui_base.target.linux-mips.mk
@@ -144,12 +144,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -268,12 +271,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -347,7 +353,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/base/ui_base.target.linux-x86.mk b/ui/base/ui_base.target.linux-x86.mk
index 992f78f5d5..07cd479fcf 100644
--- a/ui/base/ui_base.target.linux-x86.mk
+++ b/ui/base/ui_base.target.linux-x86.mk
@@ -145,12 +145,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -269,12 +272,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -347,7 +353,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/base/ui_base.target.linux-x86_64.mk b/ui/base/ui_base.target.linux-x86_64.mk
index 268a87d307..af066fc413 100644
--- a/ui/base/ui_base.target.linux-x86_64.mk
+++ b/ui/base/ui_base.target.linux-x86_64.mk
@@ -146,12 +146,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -271,12 +274,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -349,7 +355,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/base/x/selection_requestor.cc b/ui/base/x/selection_requestor.cc
index 080007aac7..8757c72656 100644
--- a/ui/base/x/selection_requestor.cc
+++ b/ui/base/x/selection_requestor.cc
@@ -69,12 +69,16 @@ bool SelectionRequestor::PerformBlockingConvertSelection(
DCHECK_EQ(&pending_request, pending_requests_.back());
pending_requests_.pop_back();
- if (pending_request.returned_property != property_to_set)
- return false;
-
- return ui::GetRawBytesOfProperty(x_window_, pending_request.returned_property,
- out_data, out_data_bytes, out_data_items,
- out_type);
+ bool success = false;
+ if (pending_request.returned_property == property_to_set) {
+ success = ui::GetRawBytesOfProperty(x_window_,
+ pending_request.returned_property,
+ out_data, out_data_bytes,
+ out_data_items, out_type);
+ }
+ if (pending_request.returned_property != None)
+ XDeleteProperty(x_display_, x_window_, pending_request.returned_property);
+ return success;
}
SelectionData SelectionRequestor::RequestAndWaitForTypes(
@@ -118,8 +122,14 @@ void SelectionRequestor::OnSelectionNotify(const XSelectionEvent& event) {
// This event doesn't correspond to any XConvertSelection calls that we
// issued in PerformBlockingConvertSelection. This shouldn't happen, but any
// client can send any message, so it can happen.
- if (!request_notified)
+ if (!request_notified) {
+ // ICCCM requires us to delete the property passed into SelectionNotify. If
+ // |request_notified| is true, the property will be deleted when the run
+ // loop has quit.
+ if (event.property != None)
+ XDeleteProperty(x_display_, x_window_, event.property);
return;
+ }
request_notified->returned_property = event.property;
request_notified->returned = true;
diff --git a/ui/base/x/x11_util.cc b/ui/base/x/x11_util.cc
index 3d733ddf1d..dd5444e37a 100644
--- a/ui/base/x/x11_util.cc
+++ b/ui/base/x/x11_util.cc
@@ -601,8 +601,11 @@ bool WindowContainsPoint(XID window, gfx::Point screen_loc) {
rectangle_kind[kind_index],
&shape_rects_size,
&dummy);
- if (!shape_rects)
- continue;
+ if (!shape_rects) {
+ // The shape is empty. This can occur when |window| is minimized.
+ DCHECK_EQ(0, shape_rects_size);
+ return false;
+ }
bool is_in_shape_rects = false;
for (int i = 0; i < shape_rects_size; ++i) {
// The ShapeInput and ShapeBounding rects are to be in window space, so we
diff --git a/ui/chromeos/OWNERS b/ui/chromeos/OWNERS
new file mode 100644
index 0000000000..50cce3ef71
--- /dev/null
+++ b/ui/chromeos/OWNERS
@@ -0,0 +1,4 @@
+derat@chromium.org
+jamescook@chromium.org
+oshima@chromium.org
+stevenjb@chromium.org
diff --git a/ui/chromeos/ui_chromeos.gyp b/ui/chromeos/ui_chromeos.gyp
index c00d57630d..7f7362e05b 100644
--- a/ui/chromeos/ui_chromeos.gyp
+++ b/ui/chromeos/ui_chromeos.gyp
@@ -13,14 +13,14 @@
'dependencies': [
'../../base/base.gyp:base',
'../events/events.gyp:events',
- '../wm/wm.gyp:wm_core',
+ '../wm/wm.gyp:wm',
],
'defines': [
'UI_CHROMEOS_IMPLEMENTATION',
],
'sources': [
- 'user_activity_notifier.cc',
- 'user_activity_notifier.h',
+ 'user_activity_power_manager_notifier.cc',
+ 'user_activity_power_manager_notifier.h',
],
},
],
diff --git a/ui/chromeos/user_activity_notifier.cc b/ui/chromeos/user_activity_power_manager_notifier.cc
index 53f312910d..7952b5986a 100644
--- a/ui/chromeos/user_activity_notifier.cc
+++ b/ui/chromeos/user_activity_power_manager_notifier.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/chromeos/user_activity_notifier.h"
+#include "ui/chromeos/user_activity_power_manager_notifier.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/power_manager_client.h"
@@ -41,16 +41,17 @@ power_manager::UserActivityType GetUserActivityTypeForEvent(
} // namespace
-UserActivityNotifier::UserActivityNotifier(::wm::UserActivityDetector* detector)
+UserActivityPowerManagerNotifier::UserActivityPowerManagerNotifier(
+ ::wm::UserActivityDetector* detector)
: detector_(detector) {
detector_->AddObserver(this);
}
-UserActivityNotifier::~UserActivityNotifier() {
+UserActivityPowerManagerNotifier::~UserActivityPowerManagerNotifier() {
detector_->RemoveObserver(this);
}
-void UserActivityNotifier::OnUserActivity(const Event* event) {
+void UserActivityPowerManagerNotifier::OnUserActivity(const Event* event) {
base::TimeTicks now = base::TimeTicks::Now();
// InSeconds() truncates rather than rounding, so it's fine for this
// comparison.
diff --git a/ui/chromeos/user_activity_notifier.h b/ui/chromeos/user_activity_power_manager_notifier.h
index dab5955bf4..483f1b51e2 100644
--- a/ui/chromeos/user_activity_notifier.h
+++ b/ui/chromeos/user_activity_power_manager_notifier.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_CHROMEOS_USER_ACTIVITY_NOTIFIER_H_
-#define UI_CHROMEOS_USER_ACTIVITY_NOTIFIER_H_
+#ifndef UI_CHROMEOS_USER_ACTIVITY_POWER_MANAGER_NOTIFIER_H_
+#define UI_CHROMEOS_USER_ACTIVITY_POWER_MANAGER_NOTIFIER_H_
#include "base/basictypes.h"
#include "base/compiler_specific.h"
@@ -18,11 +18,12 @@ class UserActivityDetector;
namespace ui {
// Notifies the power manager when the user is active.
-class UI_CHROMEOS_EXPORT UserActivityNotifier
+class UI_CHROMEOS_EXPORT UserActivityPowerManagerNotifier
: public ::wm::UserActivityObserver {
public:
- explicit UserActivityNotifier(::wm::UserActivityDetector* detector);
- virtual ~UserActivityNotifier();
+ explicit UserActivityPowerManagerNotifier(
+ ::wm::UserActivityDetector* detector);
+ virtual ~UserActivityPowerManagerNotifier();
// UserActivityObserver implementation.
virtual void OnUserActivity(const Event* event) OVERRIDE;
@@ -33,9 +34,9 @@ class UI_CHROMEOS_EXPORT UserActivityNotifier
// Last time that the power manager was notified.
base::TimeTicks last_notify_time_;
- DISALLOW_COPY_AND_ASSIGN(UserActivityNotifier);
+ DISALLOW_COPY_AND_ASSIGN(UserActivityPowerManagerNotifier);
};
} // namespace ui
-#endif // UI_CHROMEOS_USER_ACTIVITY_NOTIFIER_H_
+#endif // UI_CHROMEOS_USER_ACTIVITY_POWER_MANAGER_NOTIFIER_H_
diff --git a/ui/compositor/dip_util.cc b/ui/compositor/dip_util.cc
index 2d95af6383..fcecf24955 100644
--- a/ui/compositor/dip_util.cc
+++ b/ui/compositor/dip_util.cc
@@ -60,6 +60,14 @@ gfx::Size ConvertSizeToPixel(const Layer* layer,
gfx::Rect ConvertRectToPixel(const Layer* layer,
const gfx::Rect& rect_in_dip) {
float scale = GetDeviceScaleFactor(layer);
- return gfx::ToFlooredRectDeprecated(gfx::ScaleRect(rect_in_dip, scale));
+ // Use ToEnclosingRect() to ensure we paint all the possible pixels
+ // touched. ToEnclosingRect() floors the origin, and ceils the max
+ // coordinate. To do otherwise (such as flooring the size) potentially
+ // results in rounding down and not drawing all the pixels that are
+ // touched.
+ return gfx::ToEnclosingRect(
+ gfx::RectF(gfx::ScalePoint(rect_in_dip.origin(), scale),
+ gfx::ScaleSize(rect_in_dip.size(), scale)));
}
+
} // namespace ui
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc
index c93ca680ac..df67e9075c 100644
--- a/ui/compositor/layer.cc
+++ b/ui/compositor/layer.cc
@@ -329,6 +329,12 @@ void Layer::SetBackgroundZoom(float zoom, int inset) {
SetLayerBackgroundFilters();
}
+void Layer::SetAlphaShape(scoped_ptr<SkRegion> region) {
+ alpha_shape_ = region.Pass();
+
+ SetLayerFilters();
+}
+
void Layer::SetLayerFilters() {
cc::FilterOperations filters;
if (layer_saturation_) {
@@ -348,6 +354,10 @@ void Layer::SetLayerFilters() {
filters.Append(cc::FilterOperation::CreateSaturatingBrightnessFilter(
layer_brightness_));
}
+ if (alpha_shape_) {
+ filters.Append(cc::FilterOperation::CreateAlphaThresholdFilter(
+ *alpha_shape_, 1.f, 0.f));
+ }
cc_layer_->SetFilters(filters);
}
diff --git a/ui/compositor/layer.h b/ui/compositor/layer.h
index fea3c513bb..c42cbfe5f1 100644
--- a/ui/compositor/layer.h
+++ b/ui/compositor/layer.h
@@ -192,6 +192,9 @@ class COMPOSITOR_EXPORT Layer
// edge across |inset| pixels.
void SetBackgroundZoom(float zoom, int inset);
+ // Set the shape of this layer.
+ void SetAlphaShape(scoped_ptr<SkRegion> region);
+
// Invert the layer.
bool layer_inverted() const { return layer_inverted_; }
void SetLayerInverted(bool inverted);
@@ -447,6 +450,9 @@ class COMPOSITOR_EXPORT Layer
// Width of the border in pixels, where the scaling is blended.
int zoom_inset_;
+ // Shape of the window.
+ scoped_ptr<SkRegion> alpha_shape_;
+
std::string name_;
LayerDelegate* delegate_;
diff --git a/ui/compositor/layer_owner.cc b/ui/compositor/layer_owner.cc
index f72666bb19..8e6c29fac7 100644
--- a/ui/compositor/layer_owner.cc
+++ b/ui/compositor/layer_owner.cc
@@ -21,10 +21,10 @@ void LayerOwner::SetLayer(Layer* layer) {
layer_->owner_ = this;
}
-Layer* LayerOwner::AcquireLayer() {
+scoped_ptr<Layer> LayerOwner::AcquireLayer() {
if (layer_owner_)
layer_owner_->owner_ = NULL;
- return layer_owner_.release();
+ return layer_owner_.Pass();
}
scoped_ptr<Layer> LayerOwner::RecreateLayer() {
diff --git a/ui/compositor/layer_owner.h b/ui/compositor/layer_owner.h
index 4828e7406f..27002e5db0 100644
--- a/ui/compositor/layer_owner.h
+++ b/ui/compositor/layer_owner.h
@@ -26,7 +26,7 @@ class COMPOSITOR_EXPORT LayerOwner {
// function, and the caller is then responsible for disposing of the layer
// once any animation completes. Note that layer() will remain valid until the
// end of ~LayerOwner().
- Layer* AcquireLayer() WARN_UNUSED_RESULT;
+ scoped_ptr<Layer> AcquireLayer();
// Asks the owner to recreate the layer, returning the old Layer. NULL is
// returned if there is no existing layer, or recreate is not supported.
diff --git a/ui/display/chromeos/x11/native_display_delegate_x11.cc b/ui/display/chromeos/x11/native_display_delegate_x11.cc
index 2258fa3246..3dff81bb31 100644
--- a/ui/display/chromeos/x11/native_display_delegate_x11.cc
+++ b/ui/display/chromeos/x11/native_display_delegate_x11.cc
@@ -19,7 +19,7 @@
#include "ui/display/chromeos/x11/display_util_x11.h"
#include "ui/display/chromeos/x11/native_display_event_dispatcher_x11.h"
#include "ui/display/types/chromeos/native_display_observer.h"
-#include "ui/display/x11/edid_parser_x11.h"
+#include "ui/display/util/x11/edid_parser_x11.h"
#include "ui/events/platform/platform_event_observer.h"
#include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/x/x11_error_tracker.h"
@@ -149,7 +149,8 @@ void NativeDisplayDelegateX11::PlatformEventObserverX11::DidProcessEvent(
NativeDisplayDelegateX11::NativeDisplayDelegateX11()
: display_(gfx::GetXDisplay()),
window_(DefaultRootWindow(display_)),
- screen_(NULL) {}
+ screen_(NULL),
+ background_color_argb_(0) {}
NativeDisplayDelegateX11::~NativeDisplayDelegateX11() {
if (ui::PlatformEventSource::GetInstance()) {
@@ -201,22 +202,7 @@ void NativeDisplayDelegateX11::UngrabServer() {
void NativeDisplayDelegateX11::SyncWithServer() { XSync(display_, 0); }
void NativeDisplayDelegateX11::SetBackgroundColor(uint32_t color_argb) {
- // Configuring CRTCs/Framebuffer clears the boot screen image. Set the
- // same background color while configuring the display to minimize the
- // duration of black screen at boot time. The background is filled with
- // black later in ash::DisplayManager. crbug.com/171050.
- XSetWindowAttributes swa = {0};
- XColor color;
- Colormap colormap = DefaultColormap(display_, 0);
- // XColor uses 16 bits per color.
- color.red = (color_argb & 0x00FF0000) >> 8;
- color.green = (color_argb & 0x0000FF00);
- color.blue = (color_argb & 0x000000FF) << 8;
- color.flags = DoRed | DoGreen | DoBlue;
- XAllocColor(display_, colormap, &color);
- swa.background_pixel = color.pixel;
- XChangeWindowAttributes(display_, window_, CWBackPixel, &swa);
- XFreeColors(display_, colormap, &color.pixel, 1, 0);
+ background_color_argb_ = color_argb;
}
void NativeDisplayDelegateX11::ForceDPMSOn() {
@@ -316,6 +302,21 @@ void NativeDisplayDelegateX11::CreateFrameBuffer(const gfx::Size& size) {
int mm_height = size.height() * kPixelsToMmScale;
XRRSetScreenSize(
display_, window_, size.width(), size.height(), mm_width, mm_height);
+ // We don't wait for root window resize, therefore this end up with drawing
+ // in the old window size, which we care during the boot.
+ DrawBackground();
+
+ // Don't redraw the background upon framebuffer change again. This should
+ // happen only once after boot.
+ background_color_argb_ = 0;
+}
+
+void NativeDisplayDelegateX11::AddObserver(NativeDisplayObserver* observer) {
+ observers_.AddObserver(observer);
+}
+
+void NativeDisplayDelegateX11::RemoveObserver(NativeDisplayObserver* observer) {
+ observers_.RemoveObserver(observer);
}
void NativeDisplayDelegateX11::InitModes() {
@@ -651,12 +652,29 @@ XRRCrtcGamma* NativeDisplayDelegateX11::CreateGammaRampForProfile(
return NULL;
}
-void NativeDisplayDelegateX11::AddObserver(NativeDisplayObserver* observer) {
- observers_.AddObserver(observer);
-}
+void NativeDisplayDelegateX11::DrawBackground() {
+ if (!background_color_argb_)
+ return;
+ // Configuring CRTCs/Framebuffer clears the boot screen image. Paint the
+ // same background color after updating framebuffer to minimize the
+ // duration of black screen at boot time.
+ XColor color;
+ Colormap colormap = DefaultColormap(display_, 0);
+ // XColor uses 16 bits per color.
+ color.red = (background_color_argb_ & 0x00FF0000) >> 8;
+ color.green = (background_color_argb_ & 0x0000FF00);
+ color.blue = (background_color_argb_ & 0x000000FF) << 8;
+ color.flags = DoRed | DoGreen | DoBlue;
+ XAllocColor(display_, colormap, &color);
-void NativeDisplayDelegateX11::RemoveObserver(NativeDisplayObserver* observer) {
- observers_.RemoveObserver(observer);
+ GC gc = XCreateGC(display_, window_, 0, 0);
+ XSetForeground(display_, gc, color.pixel);
+ XSetFillStyle(display_, gc, FillSolid);
+ int width = DisplayWidth(display_, DefaultScreen(display_));
+ int height = DisplayHeight(display_, DefaultScreen(display_));
+ XFillRectangle(display_, window_, gc, 0, 0, width, height);
+ XFreeGC(display_, gc);
+ XFreeColors(display_, colormap, &color.pixel, 1, 0);
}
} // namespace ui
diff --git a/ui/display/chromeos/x11/native_display_delegate_x11.h b/ui/display/chromeos/x11/native_display_delegate_x11.h
index 511219779b..f9eade3907 100644
--- a/ui/display/chromeos/x11/native_display_delegate_x11.h
+++ b/ui/display/chromeos/x11/native_display_delegate_x11.h
@@ -124,6 +124,8 @@ class DISPLAY_EXPORT NativeDisplayDelegateX11 : public NativeDisplayDelegate {
const DisplaySnapshotX11& x11_output,
ColorCalibrationProfile new_profile);
+ void DrawBackground();
+
Display* display_;
Window window_;
@@ -149,6 +151,9 @@ class DISPLAY_EXPORT NativeDisplayDelegateX11 : public NativeDisplayDelegate {
// List of observers waiting for display configuration change events.
ObserverList<NativeDisplayObserver> observers_;
+ // A background color used during boot time + multi displays.
+ uint32_t background_color_argb_;
+
DISALLOW_COPY_AND_ASSIGN(NativeDisplayDelegateX11);
};
diff --git a/ui/display/display.gyp b/ui/display/display.gyp
index 3cc5d8e2e4..44a3038122 100644
--- a/ui/display/display.gyp
+++ b/ui/display/display.gyp
@@ -23,7 +23,7 @@
'types/chromeos/display_snapshot.cc',
'types/chromeos/display_snapshot.h',
'types/chromeos/native_display_delegate.h',
- 'types/chromeos/native_display_observer',
+ 'types/chromeos/native_display_observer.h',
'types/display_constants.h',
'types/display_types_export.h',
],
@@ -35,6 +35,7 @@
'../../base/base.gyp:base',
'../../ui/gfx/gfx.gyp:gfx',
'../../ui/gfx/gfx.gyp:gfx_geometry',
+ 'display_util',
],
'defines': [
'DISPLAY_IMPLEMENTATION',
@@ -61,12 +62,6 @@
'display_export.h',
'display_switches.cc',
'display_switches.h',
- 'display_util.cc',
- 'display_util.h',
- 'edid_parser.cc',
- 'edid_parser.h',
- 'x11/edid_parser_x11.cc',
- 'x11/edid_parser_x11.h',
],
'conditions': [
['use_x11 == 1', {
@@ -82,6 +77,44 @@
'display_types',
],
}],
+ ['use_ozone == 1', {
+ 'dependencies': [
+ '../../ui/ozone/ozone.gyp:ozone',
+ ],
+ }],
+ ],
+ },
+ {
+ 'target_name': 'display_util',
+ 'type': '<(component)',
+ 'dependencies': [
+ '../../base/base.gyp:base',
+ '../../ui/gfx/gfx.gyp:gfx_geometry',
+ ],
+ 'defines': [
+ 'DISPLAY_UTIL_IMPLEMENTATION',
+ ],
+ 'sources': [
+ 'util/display_util.cc',
+ 'util/display_util.h',
+ 'util/display_util_export.h',
+ 'util/edid_parser.cc',
+ 'util/edid_parser.h',
+ 'util/x11/edid_parser_x11.cc',
+ 'util/x11/edid_parser_x11.h',
+ ],
+ 'conditions': [
+ ['use_x11 == 1', {
+ 'dependencies': [
+ '../../build/linux/system.gyp:xrandr',
+ '../../ui/gfx/gfx.gyp:gfx',
+ ],
+ }],
+ ['chromeos == 1', {
+ 'dependencies': [
+ 'display_types',
+ ],
+ }],
],
},
{
diff --git a/ui/display/display_unittests.gypi b/ui/display/display_unittests.gypi
index 75f5c77555..b266a1a32c 100644
--- a/ui/display/display_unittests.gypi
+++ b/ui/display/display_unittests.gypi
@@ -8,15 +8,15 @@
'dependencies': [
'../base/base.gyp:test_support_base',
'../testing/gtest.gyp:gtest',
- '../ui/display/display.gyp:display',
+ '../ui/display/display.gyp:display_util',
'../ui/gfx/gfx.gyp:gfx_geometry',
],
'sources': [
- 'edid_parser_unittest.cc',
'chromeos/display_configurator_unittest.cc',
'chromeos/x11/display_util_x11_unittest.cc',
'chromeos/x11/native_display_event_dispatcher_x11_unittest.cc',
- 'display_util_unittest.cc',
+ 'util/display_util_unittest.cc',
+ 'util/edid_parser_unittest.cc',
],
'conditions': [
# TODO(dnicoara) When we add non-chromeos display code this dependency can
@@ -24,6 +24,7 @@
# not like empty libraries.
['chromeos == 1', {
'dependencies': [
+ '../ui/display/display.gyp:display',
'../ui/display/display.gyp:display_test_util',
'../ui/display/display.gyp:display_types',
],
diff --git a/ui/display/display_util.cc b/ui/display/util/display_util.cc
index aeaeed939a..aa23ec69a7 100644
--- a/ui/display/display_util.cc
+++ b/ui/display/util/display_util.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/display/display_util.h"
+#include "ui/display/util/display_util.h"
#include "base/logging.h"
@@ -41,14 +41,14 @@ bool IsDisplaySizeBlackListed(const gfx::Size& physical_size) {
// Ignore if the reported display is smaller than minimum size.
if (physical_size.width() <= kInvalidDisplaySizeList[0][0] ||
physical_size.height() <= kInvalidDisplaySizeList[0][1]) {
- LOG(WARNING) << "Smaller than minimum display size";
+ VLOG(1) << "Smaller than minimum display size";
return true;
}
for (size_t i = 1; i < arraysize(kInvalidDisplaySizeList); ++i) {
const gfx::Size size(kInvalidDisplaySizeList[i][0],
kInvalidDisplaySizeList[i][1]);
if (physical_size == size) {
- LOG(WARNING) << "Black listed display size detected:" << size.ToString();
+ VLOG(1) << "Black listed display size detected:" << size.ToString();
return true;
}
}
diff --git a/ui/display/display_util.h b/ui/display/util/display_util.h
index 0928ef5c84..012269d103 100644
--- a/ui/display/display_util.h
+++ b/ui/display/util/display_util.h
@@ -2,24 +2,25 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_DISPLAY_DISPLAY_UTIL_H_
-#define UI_DISPLAY_DISPLAY_UTIL_H_
+#ifndef UI_DISPLAY_UTIL_DISPLAY_UTIL_H_
+#define UI_DISPLAY_UTIL_DISPLAY_UTIL_H_
-#include "ui/display/display_export.h"
+#include "ui/display/util/display_util_export.h"
#include "ui/gfx/geometry/size.h"
namespace ui {
// Returns true if a given size is in the list of bogus sizes in mm that should
// be ignored.
-DISPLAY_EXPORT bool IsDisplaySizeBlackListed(const gfx::Size& physical_size);
+DISPLAY_UTIL_EXPORT bool IsDisplaySizeBlackListed(
+ const gfx::Size& physical_size);
// Returns the desired device scale factor for the display with the given
// physical_size and resoultion.
-DISPLAY_EXPORT float GetScaleFactor(
+DISPLAY_UTIL_EXPORT float GetScaleFactor(
const gfx::Size& physical_size_in_mm,
const gfx::Size& screen_size_in_pixels);
} // namespace ui
-#endif // UI_DISPLAY_DISPLAY_UTIL_H_
+#endif // UI_DISPLAY_UTIL_DISPLAY_UTIL_H_
diff --git a/ui/display/util/display_util_export.h b/ui/display/util/display_util_export.h
new file mode 100644
index 0000000000..8eeb30d4e2
--- /dev/null
+++ b/ui/display/util/display_util_export.h
@@ -0,0 +1,37 @@
+// 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 UI_DISPLAY_UTIL_DISPLAY_UTIL_EXPORT_H_
+#define UI_DISPLAY_UTIL_DISPLAY_UTIL_EXPORT_H_
+
+// Defines DISPLAY_UTIL_EXPORT so that functionality implemented by the
+// display_util module can be exported to consumers.
+
+#if defined(COMPONENT_BUILD)
+
+#if defined(WIN32)
+
+#if defined(DISPLAY_UTIL_IMPLEMENTATION)
+#define DISPLAY_UTIL_EXPORT __declspec(dllexport)
+#else
+#define DISPLAY_UTIL_EXPORT __declspec(dllimport)
+#endif
+
+#else // !defined(WIN32)
+
+#if defined(DISPLAY_UTIL_IMPLEMENTATION)
+#define DISPLAY_UTIL_EXPORT __attribute__((visibility("default")))
+#else
+#define DISPLAY_UTIL_EXPORT
+#endif
+
+#endif
+
+#else // !defined(COMPONENT_BUILD)
+
+#define DISPLAY_UTIL_EXPORT
+
+#endif
+
+#endif // UI_DISPLAY_UTIL_DISPLAY_UTIL_EXPORT_H_
diff --git a/ui/display/display_util_unittest.cc b/ui/display/util/display_util_unittest.cc
index 8b426734c1..ddb4a1cd07 100644
--- a/ui/display/display_util_unittest.cc
+++ b/ui/display/util/display_util_unittest.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/display/display_util.h"
+#include "ui/display/util/display_util.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/ui/display/edid_parser.cc b/ui/display/util/edid_parser.cc
index 686b07147c..b95eef4c62 100644
--- a/ui/display/edid_parser.cc
+++ b/ui/display/util/edid_parser.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/display/edid_parser.h"
+#include "ui/display/util/edid_parser.h"
#include <algorithm>
diff --git a/ui/display/edid_parser.h b/ui/display/util/edid_parser.h
index 2527abf86d..4f12d40aaa 100644
--- a/ui/display/edid_parser.h
+++ b/ui/display/util/edid_parser.h
@@ -2,15 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_DISPLAY_EDID_PARSER_H_
-#define UI_DISPLAY_EDID_PARSER_H_
+#ifndef UI_DISPLAY_UTIL_EDID_PARSER_H_
+#define UI_DISPLAY_UTIL_EDID_PARSER_H_
#include <stdint.h>
#include <string>
#include <vector>
-#include "ui/display/display_export.h"
+#include "ui/display/util/display_util_export.h"
// EDID (Extended Display Identification Data) is a format for monitor
// metadata. This provides a parser for the data.
@@ -20,21 +20,23 @@ namespace ui {
// Generates the display id for the pair of |edid| and |index|, and store in
// |display_id_out|. Returns true if the display id is successfully generated,
// or false otherwise.
-DISPLAY_EXPORT bool GetDisplayIdFromEDID(const std::vector<uint8_t>& edid,
- uint8_t index,
- int64_t* display_id_out);
+DISPLAY_UTIL_EXPORT bool GetDisplayIdFromEDID(const std::vector<uint8_t>& edid,
+ uint8_t index,
+ int64_t* display_id_out);
// Parses |edid| as EDID data and stores extracted data into |manufacturer_id|
// and |human_readable_name| and returns true. NULL can be passed for unwanted
// output parameters. Some devices (especially internal displays) may not have
// the field for |human_readable_name|, and it will return true in that case.
-DISPLAY_EXPORT bool ParseOutputDeviceData(const std::vector<uint8_t>& edid,
- uint16_t* manufacturer_id,
- std::string* human_readable_name);
+DISPLAY_UTIL_EXPORT bool ParseOutputDeviceData(
+ const std::vector<uint8_t>& edid,
+ uint16_t* manufacturer_id,
+ std::string* human_readable_name);
-DISPLAY_EXPORT bool ParseOutputOverscanFlag(const std::vector<uint8_t>& edid,
- bool* flag);
+DISPLAY_UTIL_EXPORT bool ParseOutputOverscanFlag(
+ const std::vector<uint8_t>& edid,
+ bool* flag);
} // namespace ui
-#endif // UI_DISPLAY_EDID_PARSER_H_
+#endif // UI_DISPLAY_UTIL_EDID_PARSER_H_
diff --git a/ui/display/edid_parser_unittest.cc b/ui/display/util/edid_parser_unittest.cc
index cac630e860..ef55bd682f 100644
--- a/ui/display/edid_parser_unittest.cc
+++ b/ui/display/util/edid_parser_unittest.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/display/edid_parser.h"
+#include "ui/display/util/edid_parser.h"
#include "base/memory/scoped_ptr.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/ui/display/x11/DEPS b/ui/display/util/x11/DEPS
index 25c2d71b78..25c2d71b78 100644
--- a/ui/display/x11/DEPS
+++ b/ui/display/util/x11/DEPS
diff --git a/ui/display/x11/edid_parser_x11.cc b/ui/display/util/x11/edid_parser_x11.cc
index 55fa62b62f..407639b650 100644
--- a/ui/display/x11/edid_parser_x11.cc
+++ b/ui/display/util/x11/edid_parser_x11.cc
@@ -2,14 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/display/x11/edid_parser_x11.h"
+#include "ui/display/util/x11/edid_parser_x11.h"
#include <X11/extensions/Xrandr.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include "base/strings/string_util.h"
-#include "ui/display/edid_parser.h"
+#include "ui/display/util/edid_parser.h"
#include "ui/gfx/x/x11_types.h"
namespace ui {
@@ -20,8 +20,7 @@ bool IsRandRAvailable() {
int randr_version_major = 0;
int randr_version_minor = 0;
static bool is_randr_available = XRRQueryVersion(
- gfx::GetXDisplay(),
- &randr_version_major, &randr_version_minor);
+ gfx::GetXDisplay(), &randr_version_major, &randr_version_minor);
return is_randr_available;
}
diff --git a/ui/display/x11/edid_parser_x11.h b/ui/display/util/x11/edid_parser_x11.h
index d6ac9b96c6..55048e699e 100644
--- a/ui/display/x11/edid_parser_x11.h
+++ b/ui/display/util/x11/edid_parser_x11.h
@@ -2,15 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_DISPLAY_X11_EDID_PARSER_X11_H_
-#define UI_DISPLAY_X11_EDID_PARSER_X11_H_
+#ifndef UI_DISPLAY_UTIL_X11_EDID_PARSER_X11_H_
+#define UI_DISPLAY_UTIL_X11_EDID_PARSER_X11_H_
#include <stdint.h>
#include <string>
-#include "ui/display/display_export.h"
#include "ui/display/types/display_constants.h"
+#include "ui/display/util/display_util_export.h"
typedef unsigned long XID;
typedef XID RROutput;
@@ -21,20 +21,20 @@ namespace ui {
// Gets the EDID data from |output| and generates the display id through
// |GetDisplayIdFromEDID|.
-DISPLAY_EXPORT bool GetDisplayId(XID output,
- uint8_t index,
- int64_t* display_id_out);
+DISPLAY_UTIL_EXPORT bool GetDisplayId(XID output,
+ uint8_t index,
+ int64_t* display_id_out);
// Generate the human readable string from EDID obtained from |output|.
-DISPLAY_EXPORT std::string GetDisplayName(RROutput output);
+DISPLAY_UTIL_EXPORT std::string GetDisplayName(RROutput output);
// Gets the overscan flag from |output| and stores to |flag|. Returns true if
// the flag is found. Otherwise returns false and doesn't touch |flag|. The
// output will produce overscan if |flag| is set to true, but the output may
// still produce overscan even though it returns true and |flag| is set to
// false.
-DISPLAY_EXPORT bool GetOutputOverscanFlag(RROutput output, bool* flag);
+DISPLAY_UTIL_EXPORT bool GetOutputOverscanFlag(RROutput output, bool* flag);
} // namespace ui
-#endif // UI_DISPLAY_X11_EDID_PARSER_X11_H_
+#endif // UI_DISPLAY_UTIL_X11_EDID_PARSER_X11_H_
diff --git a/ui/events/BUILD.gn b/ui/events/BUILD.gn
index 91c32ffeb9..a6061ed891 100644
--- a/ui/events/BUILD.gn
+++ b/ui/events/BUILD.gn
@@ -215,7 +215,7 @@ component("gesture_detection") {
}
if (!use_aura && !is_android) {
- sources -= [ "gesture_detection/gesture_config_helper.cc" ]
+ sources -= [ "gesture_detection/gesture_config_helper_aura.cc" ]
}
}
@@ -259,7 +259,7 @@ source_set("events_test_support") {
}
}
-test("events_unittest") {
+test("events_unittests") {
sources = [
"cocoa/cocoa_event_utils_unittest.mm",
"event_dispatcher_unittest.cc",
@@ -300,5 +300,6 @@ test("events_unittest") {
"//base",
"//base/test:run_all_unittests",
"//testing/gtest",
+ "//ui/gfx:gfx_test_support",
]
}
diff --git a/ui/events/dom4_keycode_converter.target.darwin-arm.mk b/ui/events/dom4_keycode_converter.target.darwin-arm.mk
index 53cc173e35..b0a045c184 100644
--- a/ui/events/dom4_keycode_converter.target.darwin-arm.mk
+++ b/ui/events/dom4_keycode_converter.target.darwin-arm.mk
@@ -219,7 +219,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/dom4_keycode_converter.target.darwin-mips.mk b/ui/events/dom4_keycode_converter.target.darwin-mips.mk
index cb61e356d9..514ad3d0cd 100644
--- a/ui/events/dom4_keycode_converter.target.darwin-mips.mk
+++ b/ui/events/dom4_keycode_converter.target.darwin-mips.mk
@@ -215,7 +215,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/dom4_keycode_converter.target.darwin-x86.mk b/ui/events/dom4_keycode_converter.target.darwin-x86.mk
index 7355649a6e..ed11429d35 100644
--- a/ui/events/dom4_keycode_converter.target.darwin-x86.mk
+++ b/ui/events/dom4_keycode_converter.target.darwin-x86.mk
@@ -217,7 +217,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/dom4_keycode_converter.target.darwin-x86_64.mk b/ui/events/dom4_keycode_converter.target.darwin-x86_64.mk
index 6a5bd35fd0..da5b2ada44 100644
--- a/ui/events/dom4_keycode_converter.target.darwin-x86_64.mk
+++ b/ui/events/dom4_keycode_converter.target.darwin-x86_64.mk
@@ -217,7 +217,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/dom4_keycode_converter.target.linux-arm.mk b/ui/events/dom4_keycode_converter.target.linux-arm.mk
index 53cc173e35..b0a045c184 100644
--- a/ui/events/dom4_keycode_converter.target.linux-arm.mk
+++ b/ui/events/dom4_keycode_converter.target.linux-arm.mk
@@ -219,7 +219,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/dom4_keycode_converter.target.linux-mips.mk b/ui/events/dom4_keycode_converter.target.linux-mips.mk
index cb61e356d9..514ad3d0cd 100644
--- a/ui/events/dom4_keycode_converter.target.linux-mips.mk
+++ b/ui/events/dom4_keycode_converter.target.linux-mips.mk
@@ -215,7 +215,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/dom4_keycode_converter.target.linux-x86.mk b/ui/events/dom4_keycode_converter.target.linux-x86.mk
index 7355649a6e..ed11429d35 100644
--- a/ui/events/dom4_keycode_converter.target.linux-x86.mk
+++ b/ui/events/dom4_keycode_converter.target.linux-x86.mk
@@ -217,7 +217,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/dom4_keycode_converter.target.linux-x86_64.mk b/ui/events/dom4_keycode_converter.target.linux-x86_64.mk
index 6a5bd35fd0..da5b2ada44 100644
--- a/ui/events/dom4_keycode_converter.target.linux-x86_64.mk
+++ b/ui/events/dom4_keycode_converter.target.linux-x86_64.mk
@@ -217,7 +217,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/event_constants.h b/ui/events/event_constants.h
index 467a9fa989..a19a136f0d 100644
--- a/ui/events/event_constants.h
+++ b/ui/events/event_constants.h
@@ -92,6 +92,11 @@ enum EventFlags {
EF_MOD3_DOWN = 1 << 11,
};
+// Flags specific to key events
+enum KeyEventFlags {
+ EF_NUMPAD_KEY = 1 << 16, // Key originates from number pad (Xkb only)
+};
+
// Flags specific to mouse events
enum MouseEventFlags {
EF_IS_DOUBLE_CLICK = 1 << 16,
diff --git a/ui/events/event_switches.cc b/ui/events/event_switches.cc
index 314370af41..829b9d0d79 100644
--- a/ui/events/event_switches.cc
+++ b/ui/events/event_switches.cc
@@ -27,7 +27,7 @@ const char kTouchEventsDisabled[] = "disabled";
const char kTouchDevices[] = "touch-devices";
#endif
-#if defined(USE_XI2_MT)
+#if defined(USE_XI2_MT) || defined(USE_OZONE)
// The calibration factors given as "<left>,<right>,<top>,<bottom>".
const char kTouchCalibration[] = "touch-calibration";
#endif
diff --git a/ui/events/event_switches.h b/ui/events/event_switches.h
index caaa779f46..7ac2722b03 100644
--- a/ui/events/event_switches.h
+++ b/ui/events/event_switches.h
@@ -20,7 +20,7 @@ EVENTS_BASE_EXPORT extern const char kTouchEventsDisabled[];
EVENTS_BASE_EXPORT extern const char kTouchDevices[];
#endif
-#if defined(USE_XI2_MT)
+#if defined(USE_XI2_MT) || defined(USE_OZONE)
EVENTS_BASE_EXPORT extern const char kTouchCalibration[];
#endif
diff --git a/ui/events/events.gyp b/ui/events/events.gyp
index c7dd93b750..00f5186c11 100644
--- a/ui/events/events.gyp
+++ b/ui/events/events.gyp
@@ -117,6 +117,14 @@
'gestures/gesture_types.h',
'gestures/velocity_calculator.cc',
'gestures/velocity_calculator.h',
+ 'ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc',
+ 'ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h',
+ 'ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc',
+ 'ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h',
+ 'ozone/evdev/libgestures_glue/gesture_logging.cc',
+ 'ozone/evdev/libgestures_glue/gesture_logging.h',
+ 'ozone/evdev/libgestures_glue/gesture_timer_provider.cc',
+ 'ozone/evdev/libgestures_glue/gesture_timer_provider.h',
'ozone/evdev/device_manager_evdev.cc',
'ozone/evdev/device_manager_evdev.h',
'ozone/evdev/device_manager_udev.cc',
@@ -146,6 +154,8 @@
'platform/scoped_event_dispatcher.h',
'platform/x11/x11_event_source.cc',
'platform/x11/x11_event_source.h',
+ 'platform/x11/x11_event_source_glib.cc',
+ 'platform/x11/x11_event_source_libevent.cc',
'win/events_win.cc',
'x/events_x.cc',
'linux/text_edit_command_auralinux.cc',
@@ -182,6 +192,14 @@
'dependencies': [
'../../build/linux/system.gyp:glib',
],
+ 'sources!': [
+ 'platform/x11/x11_event_source_libevent.cc',
+ ],
+ }, {
+ # use_glib == 0
+ 'sources!': [
+ 'platform/x11/x11_event_source_glib.cc',
+ ],
}],
['use_ozone_evdev==1', {
'defines': ['USE_OZONE_EVDEV=1'],
@@ -191,6 +209,19 @@
'<(DEPTH)/build/linux/system.gyp:udev',
],
}],
+ ['use_ozone_evdev==1 and use_evdev_gestures==1', {
+ 'dependencies': [
+ '<(DEPTH)/build/linux/system.gyp:libgestures',
+ '<(DEPTH)/build/linux/system.gyp:libevdev-cros',
+ ],
+ 'defines': [
+ 'USE_EVDEV_GESTURES',
+ ],
+ }, {
+ 'sources/': [
+ ['exclude', '^ozone/evdev/libgestures_glue/'],
+ ],
+ }],
['use_udev==0', {
'sources!': [
'ozone/evdev/device_manager_udev.cc',
@@ -361,7 +392,6 @@
],
'variables': {
'test_suite_name': 'events_unittests',
- 'input_shlib_path': '<(SHARED_LIB_DIR)/<(SHARED_LIB_PREFIX)events_unittests<(SHARED_LIB_SUFFIX)',
},
'includes': [ '../../build/apk_test.gypi' ],
},
diff --git a/ui/events/events.target.darwin-arm.mk b/ui/events/events.target.darwin-arm.mk
deleted file mode 100644
index d2be3d574c..0000000000
--- a/ui/events/events.target.darwin-arm.mk
+++ /dev/null
@@ -1,353 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := ui_events_events_gyp
-LOCAL_MODULE_SUFFIX := .a
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH)
-gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX))
-gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX))
-
-# Make sure our deps are built first.
-GYP_TARGET_DEPENDENCIES := \
- $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \
- $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a
-
-GYP_GENERATED_OUTPUTS :=
-
-# Make sure our deps and generated files are built first.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
-
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_GENERATED_SOURCES :=
-
-GYP_COPIED_SOURCE_ORIGIN_DIRS :=
-
-LOCAL_SRC_FILES := \
- ui/events/event.cc \
- ui/events/event_dispatcher.cc \
- ui/events/event_handler.cc \
- ui/events/event_processor.cc \
- ui/events/event_source.cc \
- ui/events/event_target.cc \
- ui/events/event_targeter.cc \
- ui/events/event_utils.cc \
- ui/events/events_stub.cc \
- ui/events/gestures/gesture_configuration.cc \
- ui/events/gestures/gesture_point.cc \
- ui/events/gestures/gesture_recognizer_impl.cc \
- ui/events/gestures/gesture_sequence.cc \
- ui/events/gestures/velocity_calculator.cc \
- ui/events/platform/platform_event_source.cc \
- ui/events/platform/platform_event_source_stub.cc \
- ui/events/platform/scoped_event_dispatcher.cc
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Debug := \
- -fstack-protector \
- --param=ssp-buffer-size=4 \
- -Werror \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -fno-tree-sra \
- -fuse-ld=gold \
- -Wno-psabi \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fstack-protector \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -Os \
- -g \
- -fomit-frame-pointer \
- -fdata-sections \
- -ffunction-sections \
- -funwind-tables
-
-MY_DEFS_Debug := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
- '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
- '-D_DEBUG'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Debug := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Debug := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-abi \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Release := \
- -fstack-protector \
- --param=ssp-buffer-size=4 \
- -Werror \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -fno-tree-sra \
- -fuse-ld=gold \
- -Wno-psabi \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fstack-protector \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -Os \
- -fno-ident \
- -fdata-sections \
- -ffunction-sections \
- -fomit-frame-pointer \
- -funwind-tables
-
-MY_DEFS_Release := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DNDEBUG' \
- '-DNVALGRIND' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
- '-D_FORTIFY_SOURCE=2'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Release := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Release := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-abi \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
-LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
-LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
-LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
-### Rules for final target.
-
-LOCAL_LDFLAGS_Debug := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -Wl,-z,relro \
- -Wl,-z,now \
- -fuse-ld=gold \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,--icf=safe \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel \
- -Wl,-O1 \
- -Wl,--as-needed
-
-
-LOCAL_LDFLAGS_Release := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -Wl,-z,relro \
- -Wl,-z,now \
- -fuse-ld=gold \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,--icf=safe \
- -Wl,-O1 \
- -Wl,--as-needed \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel
-
-
-LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))
-
-LOCAL_STATIC_LIBRARIES := \
- skia_skia_library_gyp
-
-# Enable grouping to fix circular references
-LOCAL_GROUP_STATIC_LIBRARIES := true
-
-LOCAL_SHARED_LIBRARIES := \
- libstlport \
- libdl
-
-# Add target alias to "gyp_all_modules" target.
-.PHONY: gyp_all_modules
-gyp_all_modules: ui_events_events_gyp
-
-# Alias gyp target name.
-.PHONY: events
-events: ui_events_events_gyp
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/ui/events/events.target.darwin-mips.mk b/ui/events/events.target.darwin-mips.mk
deleted file mode 100644
index 34eae586f6..0000000000
--- a/ui/events/events.target.darwin-mips.mk
+++ /dev/null
@@ -1,347 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := ui_events_events_gyp
-LOCAL_MODULE_SUFFIX := .a
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH)
-gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX))
-gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX))
-
-# Make sure our deps are built first.
-GYP_TARGET_DEPENDENCIES := \
- $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \
- $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a
-
-GYP_GENERATED_OUTPUTS :=
-
-# Make sure our deps and generated files are built first.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
-
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_GENERATED_SOURCES :=
-
-GYP_COPIED_SOURCE_ORIGIN_DIRS :=
-
-LOCAL_SRC_FILES := \
- ui/events/event.cc \
- ui/events/event_dispatcher.cc \
- ui/events/event_handler.cc \
- ui/events/event_processor.cc \
- ui/events/event_source.cc \
- ui/events/event_target.cc \
- ui/events/event_targeter.cc \
- ui/events/event_utils.cc \
- ui/events/events_stub.cc \
- ui/events/gestures/gesture_configuration.cc \
- ui/events/gestures/gesture_point.cc \
- ui/events/gestures/gesture_recognizer_impl.cc \
- ui/events/gestures/gesture_sequence.cc \
- ui/events/gestures/velocity_calculator.cc \
- ui/events/platform/platform_event_source.cc \
- ui/events/platform/platform_event_source_stub.cc \
- ui/events/platform/scoped_event_dispatcher.cc
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Debug := \
- -fstack-protector \
- --param=ssp-buffer-size=4 \
- \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -EL \
- -mhard-float \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fstack-protector \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -Os \
- -g \
- -fomit-frame-pointer \
- -fdata-sections \
- -ffunction-sections \
- -funwind-tables
-
-MY_DEFS_Debug := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
- '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
- '-D_DEBUG'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Debug := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Debug := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-uninitialized \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Release := \
- -fstack-protector \
- --param=ssp-buffer-size=4 \
- \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -EL \
- -mhard-float \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fstack-protector \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -Os \
- -fno-ident \
- -fdata-sections \
- -ffunction-sections \
- -fomit-frame-pointer \
- -funwind-tables
-
-MY_DEFS_Release := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DNDEBUG' \
- '-DNVALGRIND' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
- '-D_FORTIFY_SOURCE=2'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Release := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Release := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-uninitialized \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
-LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
-LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
-LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
-### Rules for final target.
-
-LOCAL_LDFLAGS_Debug := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -EL \
- -Wl,--no-keep-memory \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel \
- -Wl,-O1 \
- -Wl,--as-needed
-
-
-LOCAL_LDFLAGS_Release := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -EL \
- -Wl,--no-keep-memory \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,-O1 \
- -Wl,--as-needed \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel
-
-
-LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))
-
-LOCAL_STATIC_LIBRARIES := \
- skia_skia_library_gyp
-
-# Enable grouping to fix circular references
-LOCAL_GROUP_STATIC_LIBRARIES := true
-
-LOCAL_SHARED_LIBRARIES := \
- libstlport \
- libdl
-
-# Add target alias to "gyp_all_modules" target.
-.PHONY: gyp_all_modules
-gyp_all_modules: ui_events_events_gyp
-
-# Alias gyp target name.
-.PHONY: events
-events: ui_events_events_gyp
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/ui/events/events.target.darwin-x86.mk b/ui/events/events.target.darwin-x86.mk
deleted file mode 100644
index c56cc1d74d..0000000000
--- a/ui/events/events.target.darwin-x86.mk
+++ /dev/null
@@ -1,349 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := ui_events_events_gyp
-LOCAL_MODULE_SUFFIX := .a
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH)
-gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX))
-gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX))
-
-# Make sure our deps are built first.
-GYP_TARGET_DEPENDENCIES := \
- $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \
- $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a
-
-GYP_GENERATED_OUTPUTS :=
-
-# Make sure our deps and generated files are built first.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
-
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_GENERATED_SOURCES :=
-
-GYP_COPIED_SOURCE_ORIGIN_DIRS :=
-
-LOCAL_SRC_FILES := \
- ui/events/event.cc \
- ui/events/event_dispatcher.cc \
- ui/events/event_handler.cc \
- ui/events/event_processor.cc \
- ui/events/event_source.cc \
- ui/events/event_target.cc \
- ui/events/event_targeter.cc \
- ui/events/event_utils.cc \
- ui/events/events_stub.cc \
- ui/events/gestures/gesture_configuration.cc \
- ui/events/gestures/gesture_point.cc \
- ui/events/gestures/gesture_recognizer_impl.cc \
- ui/events/gestures/gesture_sequence.cc \
- ui/events/gestures/velocity_calculator.cc \
- ui/events/platform/platform_event_source.cc \
- ui/events/platform/platform_event_source_stub.cc \
- ui/events/platform/scoped_event_dispatcher.cc
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Debug := \
- --param=ssp-buffer-size=4 \
- -Werror \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -msse2 \
- -mfpmath=sse \
- -mmmx \
- -m32 \
- -fuse-ld=gold \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -fno-stack-protector \
- -Os \
- -g \
- -fomit-frame-pointer \
- -fdata-sections \
- -ffunction-sections \
- -funwind-tables
-
-MY_DEFS_Debug := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
- '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
- '-D_DEBUG'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Debug := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Debug := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Release := \
- --param=ssp-buffer-size=4 \
- -Werror \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -msse2 \
- -mfpmath=sse \
- -mmmx \
- -m32 \
- -fuse-ld=gold \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -fno-stack-protector \
- -Os \
- -fno-ident \
- -fdata-sections \
- -ffunction-sections \
- -fomit-frame-pointer \
- -funwind-tables
-
-MY_DEFS_Release := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DNDEBUG' \
- '-DNVALGRIND' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
- '-D_FORTIFY_SOURCE=2'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Release := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Release := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
-LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
-LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
-LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
-### Rules for final target.
-
-LOCAL_LDFLAGS_Debug := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -m32 \
- -fuse-ld=gold \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel \
- -Wl,-O1 \
- -Wl,--as-needed
-
-
-LOCAL_LDFLAGS_Release := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -m32 \
- -fuse-ld=gold \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,-O1 \
- -Wl,--as-needed \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel
-
-
-LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))
-
-LOCAL_STATIC_LIBRARIES := \
- skia_skia_library_gyp
-
-# Enable grouping to fix circular references
-LOCAL_GROUP_STATIC_LIBRARIES := true
-
-LOCAL_SHARED_LIBRARIES := \
- libstlport \
- libdl
-
-# Add target alias to "gyp_all_modules" target.
-.PHONY: gyp_all_modules
-gyp_all_modules: ui_events_events_gyp
-
-# Alias gyp target name.
-.PHONY: events
-events: ui_events_events_gyp
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/ui/events/events.target.darwin-x86_64.mk b/ui/events/events.target.darwin-x86_64.mk
deleted file mode 100644
index 00e97fd437..0000000000
--- a/ui/events/events.target.darwin-x86_64.mk
+++ /dev/null
@@ -1,349 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := ui_events_events_gyp
-LOCAL_MODULE_SUFFIX := .a
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH)
-gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX))
-gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX))
-
-# Make sure our deps are built first.
-GYP_TARGET_DEPENDENCIES := \
- $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \
- $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a
-
-GYP_GENERATED_OUTPUTS :=
-
-# Make sure our deps and generated files are built first.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
-
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_GENERATED_SOURCES :=
-
-GYP_COPIED_SOURCE_ORIGIN_DIRS :=
-
-LOCAL_SRC_FILES := \
- ui/events/event.cc \
- ui/events/event_dispatcher.cc \
- ui/events/event_handler.cc \
- ui/events/event_processor.cc \
- ui/events/event_source.cc \
- ui/events/event_target.cc \
- ui/events/event_targeter.cc \
- ui/events/event_utils.cc \
- ui/events/events_stub.cc \
- ui/events/gestures/gesture_configuration.cc \
- ui/events/gestures/gesture_point.cc \
- ui/events/gestures/gesture_recognizer_impl.cc \
- ui/events/gestures/gesture_sequence.cc \
- ui/events/gestures/velocity_calculator.cc \
- ui/events/platform/platform_event_source.cc \
- ui/events/platform/platform_event_source_stub.cc \
- ui/events/platform/scoped_event_dispatcher.cc
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Debug := \
- -fstack-protector \
- --param=ssp-buffer-size=4 \
- -Werror \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -Wno-unused-local-typedefs \
- -m64 \
- -march=x86-64 \
- -fuse-ld=gold \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fstack-protector \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -Os \
- -g \
- -fomit-frame-pointer \
- -fdata-sections \
- -ffunction-sections \
- -funwind-tables
-
-MY_DEFS_Debug := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
- '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
- '-D_DEBUG'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Debug := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Debug := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Release := \
- -fstack-protector \
- --param=ssp-buffer-size=4 \
- -Werror \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -Wno-unused-local-typedefs \
- -m64 \
- -march=x86-64 \
- -fuse-ld=gold \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fstack-protector \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -Os \
- -fno-ident \
- -fdata-sections \
- -ffunction-sections \
- -fomit-frame-pointer \
- -funwind-tables
-
-MY_DEFS_Release := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DNDEBUG' \
- '-DNVALGRIND' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
- '-D_FORTIFY_SOURCE=2'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Release := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Release := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
-LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
-LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
-LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
-### Rules for final target.
-
-LOCAL_LDFLAGS_Debug := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -m64 \
- -fuse-ld=gold \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel \
- -Wl,-O1 \
- -Wl,--as-needed
-
-
-LOCAL_LDFLAGS_Release := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -m64 \
- -fuse-ld=gold \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,-O1 \
- -Wl,--as-needed \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel
-
-
-LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))
-
-LOCAL_STATIC_LIBRARIES := \
- skia_skia_library_gyp
-
-# Enable grouping to fix circular references
-LOCAL_GROUP_STATIC_LIBRARIES := true
-
-LOCAL_SHARED_LIBRARIES := \
- libstlport \
- libdl
-
-# Add target alias to "gyp_all_modules" target.
-.PHONY: gyp_all_modules
-gyp_all_modules: ui_events_events_gyp
-
-# Alias gyp target name.
-.PHONY: events
-events: ui_events_events_gyp
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/ui/events/events.target.linux-arm.mk b/ui/events/events.target.linux-arm.mk
deleted file mode 100644
index d2be3d574c..0000000000
--- a/ui/events/events.target.linux-arm.mk
+++ /dev/null
@@ -1,353 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := ui_events_events_gyp
-LOCAL_MODULE_SUFFIX := .a
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH)
-gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX))
-gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX))
-
-# Make sure our deps are built first.
-GYP_TARGET_DEPENDENCIES := \
- $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \
- $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a
-
-GYP_GENERATED_OUTPUTS :=
-
-# Make sure our deps and generated files are built first.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
-
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_GENERATED_SOURCES :=
-
-GYP_COPIED_SOURCE_ORIGIN_DIRS :=
-
-LOCAL_SRC_FILES := \
- ui/events/event.cc \
- ui/events/event_dispatcher.cc \
- ui/events/event_handler.cc \
- ui/events/event_processor.cc \
- ui/events/event_source.cc \
- ui/events/event_target.cc \
- ui/events/event_targeter.cc \
- ui/events/event_utils.cc \
- ui/events/events_stub.cc \
- ui/events/gestures/gesture_configuration.cc \
- ui/events/gestures/gesture_point.cc \
- ui/events/gestures/gesture_recognizer_impl.cc \
- ui/events/gestures/gesture_sequence.cc \
- ui/events/gestures/velocity_calculator.cc \
- ui/events/platform/platform_event_source.cc \
- ui/events/platform/platform_event_source_stub.cc \
- ui/events/platform/scoped_event_dispatcher.cc
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Debug := \
- -fstack-protector \
- --param=ssp-buffer-size=4 \
- -Werror \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -fno-tree-sra \
- -fuse-ld=gold \
- -Wno-psabi \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fstack-protector \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -Os \
- -g \
- -fomit-frame-pointer \
- -fdata-sections \
- -ffunction-sections \
- -funwind-tables
-
-MY_DEFS_Debug := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
- '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
- '-D_DEBUG'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Debug := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Debug := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-abi \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Release := \
- -fstack-protector \
- --param=ssp-buffer-size=4 \
- -Werror \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -fno-tree-sra \
- -fuse-ld=gold \
- -Wno-psabi \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fstack-protector \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -Os \
- -fno-ident \
- -fdata-sections \
- -ffunction-sections \
- -fomit-frame-pointer \
- -funwind-tables
-
-MY_DEFS_Release := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DNDEBUG' \
- '-DNVALGRIND' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
- '-D_FORTIFY_SOURCE=2'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Release := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Release := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-abi \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
-LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
-LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
-LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
-### Rules for final target.
-
-LOCAL_LDFLAGS_Debug := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -Wl,-z,relro \
- -Wl,-z,now \
- -fuse-ld=gold \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,--icf=safe \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel \
- -Wl,-O1 \
- -Wl,--as-needed
-
-
-LOCAL_LDFLAGS_Release := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -Wl,-z,relro \
- -Wl,-z,now \
- -fuse-ld=gold \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,--icf=safe \
- -Wl,-O1 \
- -Wl,--as-needed \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel
-
-
-LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))
-
-LOCAL_STATIC_LIBRARIES := \
- skia_skia_library_gyp
-
-# Enable grouping to fix circular references
-LOCAL_GROUP_STATIC_LIBRARIES := true
-
-LOCAL_SHARED_LIBRARIES := \
- libstlport \
- libdl
-
-# Add target alias to "gyp_all_modules" target.
-.PHONY: gyp_all_modules
-gyp_all_modules: ui_events_events_gyp
-
-# Alias gyp target name.
-.PHONY: events
-events: ui_events_events_gyp
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/ui/events/events.target.linux-mips.mk b/ui/events/events.target.linux-mips.mk
deleted file mode 100644
index 34eae586f6..0000000000
--- a/ui/events/events.target.linux-mips.mk
+++ /dev/null
@@ -1,347 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := ui_events_events_gyp
-LOCAL_MODULE_SUFFIX := .a
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH)
-gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX))
-gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX))
-
-# Make sure our deps are built first.
-GYP_TARGET_DEPENDENCIES := \
- $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \
- $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a
-
-GYP_GENERATED_OUTPUTS :=
-
-# Make sure our deps and generated files are built first.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
-
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_GENERATED_SOURCES :=
-
-GYP_COPIED_SOURCE_ORIGIN_DIRS :=
-
-LOCAL_SRC_FILES := \
- ui/events/event.cc \
- ui/events/event_dispatcher.cc \
- ui/events/event_handler.cc \
- ui/events/event_processor.cc \
- ui/events/event_source.cc \
- ui/events/event_target.cc \
- ui/events/event_targeter.cc \
- ui/events/event_utils.cc \
- ui/events/events_stub.cc \
- ui/events/gestures/gesture_configuration.cc \
- ui/events/gestures/gesture_point.cc \
- ui/events/gestures/gesture_recognizer_impl.cc \
- ui/events/gestures/gesture_sequence.cc \
- ui/events/gestures/velocity_calculator.cc \
- ui/events/platform/platform_event_source.cc \
- ui/events/platform/platform_event_source_stub.cc \
- ui/events/platform/scoped_event_dispatcher.cc
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Debug := \
- -fstack-protector \
- --param=ssp-buffer-size=4 \
- \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -EL \
- -mhard-float \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fstack-protector \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -Os \
- -g \
- -fomit-frame-pointer \
- -fdata-sections \
- -ffunction-sections \
- -funwind-tables
-
-MY_DEFS_Debug := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
- '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
- '-D_DEBUG'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Debug := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Debug := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-uninitialized \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Release := \
- -fstack-protector \
- --param=ssp-buffer-size=4 \
- \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -EL \
- -mhard-float \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fstack-protector \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -Os \
- -fno-ident \
- -fdata-sections \
- -ffunction-sections \
- -fomit-frame-pointer \
- -funwind-tables
-
-MY_DEFS_Release := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DNDEBUG' \
- '-DNVALGRIND' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
- '-D_FORTIFY_SOURCE=2'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Release := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Release := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-uninitialized \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
-LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
-LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
-LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
-### Rules for final target.
-
-LOCAL_LDFLAGS_Debug := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -EL \
- -Wl,--no-keep-memory \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel \
- -Wl,-O1 \
- -Wl,--as-needed
-
-
-LOCAL_LDFLAGS_Release := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -EL \
- -Wl,--no-keep-memory \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,-O1 \
- -Wl,--as-needed \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel
-
-
-LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))
-
-LOCAL_STATIC_LIBRARIES := \
- skia_skia_library_gyp
-
-# Enable grouping to fix circular references
-LOCAL_GROUP_STATIC_LIBRARIES := true
-
-LOCAL_SHARED_LIBRARIES := \
- libstlport \
- libdl
-
-# Add target alias to "gyp_all_modules" target.
-.PHONY: gyp_all_modules
-gyp_all_modules: ui_events_events_gyp
-
-# Alias gyp target name.
-.PHONY: events
-events: ui_events_events_gyp
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/ui/events/events.target.linux-x86.mk b/ui/events/events.target.linux-x86.mk
deleted file mode 100644
index c56cc1d74d..0000000000
--- a/ui/events/events.target.linux-x86.mk
+++ /dev/null
@@ -1,349 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := ui_events_events_gyp
-LOCAL_MODULE_SUFFIX := .a
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH)
-gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX))
-gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX))
-
-# Make sure our deps are built first.
-GYP_TARGET_DEPENDENCIES := \
- $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \
- $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a
-
-GYP_GENERATED_OUTPUTS :=
-
-# Make sure our deps and generated files are built first.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
-
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_GENERATED_SOURCES :=
-
-GYP_COPIED_SOURCE_ORIGIN_DIRS :=
-
-LOCAL_SRC_FILES := \
- ui/events/event.cc \
- ui/events/event_dispatcher.cc \
- ui/events/event_handler.cc \
- ui/events/event_processor.cc \
- ui/events/event_source.cc \
- ui/events/event_target.cc \
- ui/events/event_targeter.cc \
- ui/events/event_utils.cc \
- ui/events/events_stub.cc \
- ui/events/gestures/gesture_configuration.cc \
- ui/events/gestures/gesture_point.cc \
- ui/events/gestures/gesture_recognizer_impl.cc \
- ui/events/gestures/gesture_sequence.cc \
- ui/events/gestures/velocity_calculator.cc \
- ui/events/platform/platform_event_source.cc \
- ui/events/platform/platform_event_source_stub.cc \
- ui/events/platform/scoped_event_dispatcher.cc
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Debug := \
- --param=ssp-buffer-size=4 \
- -Werror \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -msse2 \
- -mfpmath=sse \
- -mmmx \
- -m32 \
- -fuse-ld=gold \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -fno-stack-protector \
- -Os \
- -g \
- -fomit-frame-pointer \
- -fdata-sections \
- -ffunction-sections \
- -funwind-tables
-
-MY_DEFS_Debug := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
- '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
- '-D_DEBUG'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Debug := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Debug := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Release := \
- --param=ssp-buffer-size=4 \
- -Werror \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -msse2 \
- -mfpmath=sse \
- -mmmx \
- -m32 \
- -fuse-ld=gold \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -fno-stack-protector \
- -Os \
- -fno-ident \
- -fdata-sections \
- -ffunction-sections \
- -fomit-frame-pointer \
- -funwind-tables
-
-MY_DEFS_Release := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DNDEBUG' \
- '-DNVALGRIND' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
- '-D_FORTIFY_SOURCE=2'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Release := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Release := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
-LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
-LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
-LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
-### Rules for final target.
-
-LOCAL_LDFLAGS_Debug := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -m32 \
- -fuse-ld=gold \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel \
- -Wl,-O1 \
- -Wl,--as-needed
-
-
-LOCAL_LDFLAGS_Release := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -m32 \
- -fuse-ld=gold \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,-O1 \
- -Wl,--as-needed \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel
-
-
-LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))
-
-LOCAL_STATIC_LIBRARIES := \
- skia_skia_library_gyp
-
-# Enable grouping to fix circular references
-LOCAL_GROUP_STATIC_LIBRARIES := true
-
-LOCAL_SHARED_LIBRARIES := \
- libstlport \
- libdl
-
-# Add target alias to "gyp_all_modules" target.
-.PHONY: gyp_all_modules
-gyp_all_modules: ui_events_events_gyp
-
-# Alias gyp target name.
-.PHONY: events
-events: ui_events_events_gyp
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/ui/events/events.target.linux-x86_64.mk b/ui/events/events.target.linux-x86_64.mk
deleted file mode 100644
index 00e97fd437..0000000000
--- a/ui/events/events.target.linux-x86_64.mk
+++ /dev/null
@@ -1,349 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_MODULE := ui_events_events_gyp
-LOCAL_MODULE_SUFFIX := .a
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH)
-gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX))
-gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX))
-
-# Make sure our deps are built first.
-GYP_TARGET_DEPENDENCIES := \
- $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \
- $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a
-
-GYP_GENERATED_OUTPUTS :=
-
-# Make sure our deps and generated files are built first.
-LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
-
-LOCAL_CPP_EXTENSION := .cc
-LOCAL_GENERATED_SOURCES :=
-
-GYP_COPIED_SOURCE_ORIGIN_DIRS :=
-
-LOCAL_SRC_FILES := \
- ui/events/event.cc \
- ui/events/event_dispatcher.cc \
- ui/events/event_handler.cc \
- ui/events/event_processor.cc \
- ui/events/event_source.cc \
- ui/events/event_target.cc \
- ui/events/event_targeter.cc \
- ui/events/event_utils.cc \
- ui/events/events_stub.cc \
- ui/events/gestures/gesture_configuration.cc \
- ui/events/gestures/gesture_point.cc \
- ui/events/gestures/gesture_recognizer_impl.cc \
- ui/events/gestures/gesture_sequence.cc \
- ui/events/gestures/velocity_calculator.cc \
- ui/events/platform/platform_event_source.cc \
- ui/events/platform/platform_event_source_stub.cc \
- ui/events/platform/scoped_event_dispatcher.cc
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Debug := \
- -fstack-protector \
- --param=ssp-buffer-size=4 \
- -Werror \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -Wno-unused-local-typedefs \
- -m64 \
- -march=x86-64 \
- -fuse-ld=gold \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fstack-protector \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -Os \
- -g \
- -fomit-frame-pointer \
- -fdata-sections \
- -ffunction-sections \
- -funwind-tables
-
-MY_DEFS_Debug := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
- '-DWTF_USE_DYNAMIC_ANNOTATIONS=1' \
- '-D_DEBUG'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Debug := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Debug := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-# Flags passed to both C and C++ files.
-MY_CFLAGS_Release := \
- -fstack-protector \
- --param=ssp-buffer-size=4 \
- -Werror \
- -fno-exceptions \
- -fno-strict-aliasing \
- -Wall \
- -Wno-unused-parameter \
- -Wno-missing-field-initializers \
- -fvisibility=hidden \
- -pipe \
- -fPIC \
- -Wno-unused-local-typedefs \
- -m64 \
- -march=x86-64 \
- -fuse-ld=gold \
- -ffunction-sections \
- -funwind-tables \
- -g \
- -fstack-protector \
- -fno-short-enums \
- -finline-limit=64 \
- -Wa,--noexecstack \
- -U_FORTIFY_SOURCE \
- -Wno-extra \
- -Wno-ignored-qualifiers \
- -Wno-type-limits \
- -Wno-unused-but-set-variable \
- -Os \
- -fno-ident \
- -fdata-sections \
- -ffunction-sections \
- -fomit-frame-pointer \
- -funwind-tables
-
-MY_DEFS_Release := \
- '-DV8_DEPRECATION_WARNINGS' \
- '-DBLINK_SCALE_FILTERS_AT_RECORD_TIME' \
- '-D_FILE_OFFSET_BITS=64' \
- '-DNO_TCMALLOC' \
- '-DDISABLE_NACL' \
- '-DCHROMIUM_BUILD' \
- '-DUSE_LIBJPEG_TURBO=1' \
- '-DENABLE_WEBRTC=1' \
- '-DUSE_PROPRIETARY_CODECS' \
- '-DENABLE_CONFIGURATION_POLICY' \
- '-DDISCARDABLE_MEMORY_ALWAYS_SUPPORTED_NATIVELY' \
- '-DSYSTEM_NATIVELY_SIGNALS_MEMORY_PRESSURE' \
- '-DENABLE_EGLIMAGE=1' \
- '-DCLD_VERSION=1' \
- '-DENABLE_PRINTING=1' \
- '-DENABLE_MANAGED_USERS=1' \
- '-DEVENTS_IMPLEMENTATION' \
- '-DSK_ENABLE_INST_COUNT=0' \
- '-DSK_SUPPORT_GPU=1' \
- '-DGR_GL_CUSTOM_SETUP_HEADER="GrGLConfig_chrome.h"' \
- '-DSK_ENABLE_LEGACY_API_ALIASING=1' \
- '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \
- '-DGR_GL_IGNORE_ES3_MSAA=0' \
- '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \
- '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
- '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
- '-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
- '-DSK_SUPPORT_LEGACY_N32_NAME' \
- '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
- '-DSK_BUILD_FOR_ANDROID' \
- '-DSK_USE_POSIX_THREADS' \
- '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
- '-DU_USING_ICU_NAMESPACE=0' \
- '-DUSE_OPENSSL=1' \
- '-DUSE_OPENSSL_CERTS=1' \
- '-D__STDC_CONSTANT_MACROS' \
- '-D__STDC_FORMAT_MACROS' \
- '-DANDROID' \
- '-D__GNU_SOURCE=1' \
- '-DUSE_STLPORT=1' \
- '-D_STLP_USE_PTR_SPECIALIZATIONS=1' \
- '-DCHROME_BUILD_ID=""' \
- '-DNDEBUG' \
- '-DNVALGRIND' \
- '-DDYNAMIC_ANNOTATIONS_ENABLED=0' \
- '-D_FORTIFY_SOURCE=2'
-
-
-# Include paths placed before CFLAGS/CPPFLAGS
-LOCAL_C_INCLUDES_Release := \
- $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \
- $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \
- $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \
- $(LOCAL_PATH) \
- $(LOCAL_PATH)/skia/config \
- $(LOCAL_PATH)/third_party/skia/src/core \
- $(LOCAL_PATH)/third_party/skia/include/core \
- $(LOCAL_PATH)/third_party/skia/include/effects \
- $(LOCAL_PATH)/third_party/skia/include/pdf \
- $(LOCAL_PATH)/third_party/skia/include/gpu \
- $(LOCAL_PATH)/third_party/skia/include/lazy \
- $(LOCAL_PATH)/third_party/skia/include/pathops \
- $(LOCAL_PATH)/third_party/skia/include/pipe \
- $(LOCAL_PATH)/third_party/skia/include/ports \
- $(LOCAL_PATH)/third_party/skia/include/utils \
- $(LOCAL_PATH)/skia/ext \
- $(PWD)/external/icu4c/common \
- $(PWD)/external/icu4c/i18n \
- $(PWD)/frameworks/wilhelm/include \
- $(PWD)/bionic \
- $(PWD)/external/stlport/stlport
-
-
-# Flags passed to only C++ (and not C) files.
-LOCAL_CPPFLAGS_Release := \
- -fno-rtti \
- -fno-threadsafe-statics \
- -fvisibility-inlines-hidden \
- -Wsign-compare \
- -Wno-non-virtual-dtor \
- -Wno-sign-promo
-
-
-LOCAL_CFLAGS := $(MY_CFLAGS_$(GYP_CONFIGURATION)) $(MY_DEFS_$(GYP_CONFIGURATION))
-LOCAL_C_INCLUDES := $(GYP_COPIED_SOURCE_ORIGIN_DIRS) $(LOCAL_C_INCLUDES_$(GYP_CONFIGURATION))
-LOCAL_CPPFLAGS := $(LOCAL_CPPFLAGS_$(GYP_CONFIGURATION))
-LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
-### Rules for final target.
-
-LOCAL_LDFLAGS_Debug := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -m64 \
- -fuse-ld=gold \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel \
- -Wl,-O1 \
- -Wl,--as-needed
-
-
-LOCAL_LDFLAGS_Release := \
- -Wl,-z,now \
- -Wl,-z,relro \
- -Wl,--fatal-warnings \
- -Wl,-z,noexecstack \
- -fPIC \
- -m64 \
- -fuse-ld=gold \
- -nostdlib \
- -Wl,--no-undefined \
- -Wl,--exclude-libs=ALL \
- -Wl,-O1 \
- -Wl,--as-needed \
- -Wl,--gc-sections \
- -Wl,--warn-shared-textrel
-
-
-LOCAL_LDFLAGS := $(LOCAL_LDFLAGS_$(GYP_CONFIGURATION))
-
-LOCAL_STATIC_LIBRARIES := \
- skia_skia_library_gyp
-
-# Enable grouping to fix circular references
-LOCAL_GROUP_STATIC_LIBRARIES := true
-
-LOCAL_SHARED_LIBRARIES := \
- libstlport \
- libdl
-
-# Add target alias to "gyp_all_modules" target.
-.PHONY: gyp_all_modules
-gyp_all_modules: ui_events_events_gyp
-
-# Alias gyp target name.
-.PHONY: events
-events: ui_events_events_gyp
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/ui/events/events_base.target.darwin-arm.mk b/ui/events/events_base.target.darwin-arm.mk
index 19e3baa9e7..570bc45e1e 100644
--- a/ui/events/events_base.target.darwin-arm.mk
+++ b/ui/events/events_base.target.darwin-arm.mk
@@ -95,12 +95,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -215,12 +218,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -292,7 +298,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/events_base.target.darwin-mips.mk b/ui/events/events_base.target.darwin-mips.mk
index 3e9e19d524..6420e3401e 100644
--- a/ui/events/events_base.target.darwin-mips.mk
+++ b/ui/events/events_base.target.darwin-mips.mk
@@ -94,12 +94,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -213,12 +216,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -288,7 +294,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/events_base.target.darwin-x86.mk b/ui/events/events_base.target.darwin-x86.mk
index b15bb089ca..b1557b46ae 100644
--- a/ui/events/events_base.target.darwin-x86.mk
+++ b/ui/events/events_base.target.darwin-x86.mk
@@ -96,12 +96,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -216,12 +219,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/events_base.target.darwin-x86_64.mk b/ui/events/events_base.target.darwin-x86_64.mk
index 26c84cdb3f..0c2555240d 100644
--- a/ui/events/events_base.target.darwin-x86_64.mk
+++ b/ui/events/events_base.target.darwin-x86_64.mk
@@ -96,12 +96,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -216,12 +219,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/events_base.target.linux-arm.mk b/ui/events/events_base.target.linux-arm.mk
index 19e3baa9e7..570bc45e1e 100644
--- a/ui/events/events_base.target.linux-arm.mk
+++ b/ui/events/events_base.target.linux-arm.mk
@@ -95,12 +95,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -215,12 +218,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -292,7 +298,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/events_base.target.linux-mips.mk b/ui/events/events_base.target.linux-mips.mk
index 3e9e19d524..6420e3401e 100644
--- a/ui/events/events_base.target.linux-mips.mk
+++ b/ui/events/events_base.target.linux-mips.mk
@@ -94,12 +94,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -213,12 +216,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -288,7 +294,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/events_base.target.linux-x86.mk b/ui/events/events_base.target.linux-x86.mk
index b15bb089ca..b1557b46ae 100644
--- a/ui/events/events_base.target.linux-x86.mk
+++ b/ui/events/events_base.target.linux-x86.mk
@@ -96,12 +96,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -216,12 +219,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/events_base.target.linux-x86_64.mk b/ui/events/events_base.target.linux-x86_64.mk
index 26c84cdb3f..0c2555240d 100644
--- a/ui/events/events_base.target.linux-x86_64.mk
+++ b/ui/events/events_base.target.linux-x86_64.mk
@@ -96,12 +96,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -216,12 +219,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/gesture_detection.target.darwin-arm.mk b/ui/events/gesture_detection.target.darwin-arm.mk
index 86dd26c3eb..a684bbcc73 100644
--- a/ui/events/gesture_detection.target.darwin-arm.mk
+++ b/ui/events/gesture_detection.target.darwin-arm.mk
@@ -101,12 +101,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -221,12 +224,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -298,7 +304,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/gesture_detection.target.darwin-mips.mk b/ui/events/gesture_detection.target.darwin-mips.mk
index 766cbdcd44..76e78d1bee 100644
--- a/ui/events/gesture_detection.target.darwin-mips.mk
+++ b/ui/events/gesture_detection.target.darwin-mips.mk
@@ -100,12 +100,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -219,12 +222,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -294,7 +300,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/gesture_detection.target.darwin-x86.mk b/ui/events/gesture_detection.target.darwin-x86.mk
index 2134ec1bd1..c35addd757 100644
--- a/ui/events/gesture_detection.target.darwin-x86.mk
+++ b/ui/events/gesture_detection.target.darwin-x86.mk
@@ -102,12 +102,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -222,12 +225,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/gesture_detection.target.darwin-x86_64.mk b/ui/events/gesture_detection.target.darwin-x86_64.mk
index 489761dd68..e59f0d6d30 100644
--- a/ui/events/gesture_detection.target.darwin-x86_64.mk
+++ b/ui/events/gesture_detection.target.darwin-x86_64.mk
@@ -102,12 +102,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -222,12 +225,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/gesture_detection.target.linux-arm.mk b/ui/events/gesture_detection.target.linux-arm.mk
index 86dd26c3eb..a684bbcc73 100644
--- a/ui/events/gesture_detection.target.linux-arm.mk
+++ b/ui/events/gesture_detection.target.linux-arm.mk
@@ -101,12 +101,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -221,12 +224,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -298,7 +304,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/gesture_detection.target.linux-mips.mk b/ui/events/gesture_detection.target.linux-mips.mk
index 766cbdcd44..76e78d1bee 100644
--- a/ui/events/gesture_detection.target.linux-mips.mk
+++ b/ui/events/gesture_detection.target.linux-mips.mk
@@ -100,12 +100,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -219,12 +222,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -294,7 +300,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/gesture_detection.target.linux-x86.mk b/ui/events/gesture_detection.target.linux-x86.mk
index 2134ec1bd1..c35addd757 100644
--- a/ui/events/gesture_detection.target.linux-x86.mk
+++ b/ui/events/gesture_detection.target.linux-x86.mk
@@ -102,12 +102,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -222,12 +225,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/gesture_detection.target.linux-x86_64.mk b/ui/events/gesture_detection.target.linux-x86_64.mk
index 489761dd68..e59f0d6d30 100644
--- a/ui/events/gesture_detection.target.linux-x86_64.mk
+++ b/ui/events/gesture_detection.target.linux-x86_64.mk
@@ -102,12 +102,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -222,12 +225,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/events/gesture_detection/filtered_gesture_provider.cc b/ui/events/gesture_detection/filtered_gesture_provider.cc
index 9e3c49359c..76ee5201d1 100644
--- a/ui/events/gesture_detection/filtered_gesture_provider.cc
+++ b/ui/events/gesture_detection/filtered_gesture_provider.cc
@@ -41,12 +41,9 @@ void FilteredGestureProvider::OnTouchEventAck(bool event_consumed) {
gesture_filter_.OnTouchEventAck(event_consumed);
}
-void FilteredGestureProvider::ResetGestureDetectors() {
- gesture_provider_.ResetGestureDetectors();
-}
-
-void FilteredGestureProvider::SetMultiTouchSupportEnabled(bool enabled) {
- gesture_provider_.SetMultiTouchSupportEnabled(enabled);
+void FilteredGestureProvider::SetMultiTouchZoomSupportEnabled(
+ bool enabled) {
+ gesture_provider_.SetMultiTouchZoomSupportEnabled(enabled);
}
void FilteredGestureProvider::SetDoubleTapSupportForPlatformEnabled(
diff --git a/ui/events/gesture_detection/filtered_gesture_provider.h b/ui/events/gesture_detection/filtered_gesture_provider.h
index b1f71e3be5..4d63be64a8 100644
--- a/ui/events/gesture_detection/filtered_gesture_provider.h
+++ b/ui/events/gesture_detection/filtered_gesture_provider.h
@@ -33,8 +33,7 @@ class GESTURE_DETECTION_EXPORT FilteredGestureProvider
void OnTouchEventAck(bool event_consumed);
// Methods delegated to |gesture_provider_|.
- void ResetGestureDetectors();
- void SetMultiTouchSupportEnabled(bool enabled);
+ void SetMultiTouchZoomSupportEnabled(bool enabled);
void SetDoubleTapSupportForPlatformEnabled(bool enabled);
void SetDoubleTapSupportForPageEnabled(bool enabled);
const ui::MotionEvent* GetCurrentDownEvent() const;
diff --git a/ui/events/gesture_detection/gesture_detector.cc b/ui/events/gesture_detection/gesture_detector.cc
index 1628c266b7..e086ef0745 100644
--- a/ui/events/gesture_detection/gesture_detector.cc
+++ b/ui/events/gesture_detection/gesture_detector.cc
@@ -347,6 +347,24 @@ bool GestureDetector::OnTouchEvent(const MotionEvent& ev) {
return handled;
}
+void GestureDetector::SetDoubleTapListener(
+ DoubleTapListener* double_tap_listener) {
+ if (double_tap_listener == double_tap_listener_)
+ return;
+
+ DCHECK(!is_double_tapping_);
+
+ // Null'ing the double-tap listener should flush an active tap timeout.
+ if (!double_tap_listener) {
+ if (timeout_handler_->HasTimeout(TAP)) {
+ timeout_handler_->StopTimeout(TAP);
+ OnTapTimeout();
+ }
+ }
+
+ double_tap_listener_ = double_tap_listener;
+}
+
void GestureDetector::Init(const Config& config) {
DCHECK(listener_);
diff --git a/ui/events/gesture_detection/gesture_detector.h b/ui/events/gesture_detection/gesture_detector.h
index c09b31fd68..5fe6a27c82 100644
--- a/ui/events/gesture_detection/gesture_detector.h
+++ b/ui/events/gesture_detection/gesture_detector.h
@@ -93,10 +93,10 @@ class GestureDetector {
bool OnTouchEvent(const MotionEvent& ev);
- void set_doubletap_listener(DoubleTapListener* double_tap_listener) {
- DCHECK(!is_double_tapping_ || double_tap_listener_);
- double_tap_listener_ = double_tap_listener;
- }
+ // Setting a valid |double_tap_listener| will enable double-tap detection,
+ // wherein calls to |OnSimpleTapConfirmed| are delayed by the tap timeout.
+ // Note: The listener must never be changed while |is_double_tapping| is true.
+ void SetDoubleTapListener(DoubleTapListener* double_tap_listener);
bool has_doubletap_listener() const { return double_tap_listener_ != NULL; }
diff --git a/ui/events/gesture_detection/gesture_event_data.cc b/ui/events/gesture_detection/gesture_event_data.cc
index 0177d96557..9cd92b30f1 100644
--- a/ui/events/gesture_detection/gesture_event_data.cc
+++ b/ui/events/gesture_detection/gesture_event_data.cc
@@ -14,6 +14,7 @@ GestureEventData::GestureEventData(EventType type,
float x,
float y,
int touch_point_count,
+ const gfx::RectF& bounding_box,
const GestureEventDetails& details)
: type(type),
motion_event_id(motion_event_id),
@@ -25,6 +26,7 @@ GestureEventData::GestureEventData(EventType type,
DCHECK_NE(0, touch_point_count);
DCHECK(ET_GESTURE_TYPE_START <= type && type <= ET_GESTURE_TYPE_END);
this->details.set_touch_points(touch_point_count);
+ this->details.set_bounding_box(bounding_box);
}
GestureEventData::GestureEventData(EventType type,
@@ -32,7 +34,8 @@ GestureEventData::GestureEventData(EventType type,
base::TimeTicks time,
float x,
float y,
- int touch_point_count)
+ int touch_point_count,
+ const gfx::RectF& bounding_box)
: type(type),
motion_event_id(motion_event_id),
time(time),
@@ -43,6 +46,7 @@ GestureEventData::GestureEventData(EventType type,
DCHECK_NE(0, touch_point_count);
DCHECK(ET_GESTURE_TYPE_START <= type && type <= ET_GESTURE_TYPE_END);
details.set_touch_points(touch_point_count);
+ details.set_bounding_box(bounding_box);
}
GestureEventData::GestureEventData() : type(ET_UNKNOWN), x(0), y(0) {}
diff --git a/ui/events/gesture_detection/gesture_event_data.h b/ui/events/gesture_detection/gesture_event_data.h
index 4953284c76..c5e24e048a 100644
--- a/ui/events/gesture_detection/gesture_event_data.h
+++ b/ui/events/gesture_detection/gesture_event_data.h
@@ -21,6 +21,7 @@ struct GESTURE_DETECTION_EXPORT GestureEventData {
float x,
float y,
int touch_point_count,
+ const gfx::RectF& bounding_box,
const GestureEventDetails& details);
GestureEventData(EventType type,
@@ -28,7 +29,8 @@ struct GESTURE_DETECTION_EXPORT GestureEventData {
base::TimeTicks time,
float x,
float y,
- int touch_point_count);
+ int touch_point_count,
+ const gfx::RectF& bounding_box);
EventType type;
int motion_event_id;
diff --git a/ui/events/gesture_detection/gesture_provider.cc b/ui/events/gesture_detection/gesture_provider.cc
index d932a02ca5..84fb854aec 100644
--- a/ui/events/gesture_detection/gesture_provider.cc
+++ b/ui/events/gesture_detection/gesture_provider.cc
@@ -30,12 +30,25 @@ const char* GetMotionEventActionName(MotionEvent::Action action) {
return "";
}
+gfx::RectF GetBoundingBox(const MotionEvent& event) {
+ gfx::RectF bounds;
+ for (size_t i = 0; i < event.GetPointerCount(); ++i) {
+ float diameter = event.GetTouchMajor(i);
+ bounds.Union(gfx::RectF(event.GetX(i) - diameter / 2,
+ event.GetY(i) - diameter / 2,
+ diameter,
+ diameter));
+ }
+ return bounds;
+}
+
GestureEventData CreateGesture(EventType type,
int motion_event_id,
base::TimeTicks time,
float x,
float y,
size_t touch_point_count,
+ const gfx::RectF& bounding_box,
const GestureEventDetails& details) {
return GestureEventData(type,
motion_event_id,
@@ -43,6 +56,7 @@ GestureEventData CreateGesture(EventType type,
x,
y,
static_cast<int>(touch_point_count),
+ bounding_box,
details);
}
@@ -51,9 +65,15 @@ GestureEventData CreateGesture(EventType type,
base::TimeTicks time,
float x,
float y,
- size_t touch_point_count) {
- return GestureEventData(
- type, motion_event_id, time, x, y, static_cast<int>(touch_point_count));
+ size_t touch_point_count,
+ const gfx::RectF& bounding_box) {
+ return GestureEventData(type,
+ motion_event_id,
+ time,
+ x,
+ y,
+ static_cast<int>(touch_point_count),
+ bounding_box);
}
GestureEventData CreateGesture(EventType type,
@@ -65,6 +85,7 @@ GestureEventData CreateGesture(EventType type,
event.GetX(),
event.GetY(),
event.GetPointerCount(),
+ GetBoundingBox(event),
details);
}
@@ -75,7 +96,8 @@ GestureEventData CreateGesture(EventType type,
event.GetEventTime(),
event.GetX(),
event.GetY(),
- event.GetPointerCount());
+ event.GetPointerCount(),
+ GetBoundingBox(event));
}
GestureEventDetails CreateTapGestureDetails(EventType type,
@@ -84,8 +106,6 @@ GestureEventDetails CreateTapGestureDetails(EventType type,
// consistent with double tap behavior on a mobile viewport. See
// crbug.com/234986 for context.
GestureEventDetails tap_details(type, 1, 0);
- tap_details.set_bounding_box(
- gfx::RectF(event.GetTouchMajor(), event.GetTouchMajor()));
return tap_details;
}
@@ -142,7 +162,8 @@ class GestureProvider::ScaleGestureListenerImpl
detector.GetEventTime(),
0,
0,
- e.GetPointerCount()));
+ e.GetPointerCount(),
+ GetBoundingBox(e)));
pinch_event_sent_ = false;
}
@@ -157,7 +178,8 @@ class GestureProvider::ScaleGestureListenerImpl
detector.GetEventTime(),
detector.GetFocusX(),
detector.GetFocusY(),
- e.GetPointerCount()));
+ e.GetPointerCount(),
+ GetBoundingBox(e)));
}
float scale = detector.GetScaleFactor();
@@ -183,6 +205,7 @@ class GestureProvider::ScaleGestureListenerImpl
detector.GetFocusX(),
detector.GetFocusY(),
e.GetPointerCount(),
+ GetBoundingBox(e),
pinch_details));
return true;
}
@@ -192,12 +215,12 @@ class GestureProvider::ScaleGestureListenerImpl
scale_gesture_detector_.SetQuickScaleEnabled(enabled);
}
- void SetMultiTouchEnabled(bool value) {
+ void SetMultiTouchEnabled(bool enabled) {
// Note that returning false from OnScaleBegin / OnScale makes the
// gesture detector not to emit further scaling notifications
// related to this gesture. Thus, if detector events are enabled in
// the middle of the gesture, we don't need to do anything.
- ignore_multitouch_events_ = value;
+ ignore_multitouch_events_ = !enabled;
}
bool IsDoubleTapInProgress() const {
@@ -270,8 +293,6 @@ class GestureProvider::GestureListenerImpl
seen_first_scroll_event_ = false;
GestureEventDetails tap_details(ET_GESTURE_TAP_DOWN, 0, 0);
- tap_details.set_bounding_box(
- gfx::RectF(e.GetTouchMajor(), e.GetTouchMajor()));
provider_->Send(CreateGesture(ET_GESTURE_TAP_DOWN, e, tap_details));
// Return true to indicate that we want to handle touch.
@@ -320,6 +341,7 @@ class GestureProvider::GestureListenerImpl
e1.GetX(),
e1.GetY(),
e2.GetPointerCount(),
+ GetBoundingBox(e2),
scroll_details));
}
@@ -351,9 +373,6 @@ class GestureProvider::GestureListenerImpl
virtual void OnShowPress(const MotionEvent& e) OVERRIDE {
GestureEventDetails show_press_details(ET_GESTURE_SHOW_PRESS, 0, 0);
- // TODO(jdduke): Expose minor axis length and rotation in |MotionEvent|.
- show_press_details.set_bounding_box(
- gfx::RectF(e.GetTouchMajor(), e.GetTouchMajor()));
provider_->Send(
CreateGesture(ET_GESTURE_SHOW_PRESS, e, show_press_details));
}
@@ -430,8 +449,6 @@ class GestureProvider::GestureListenerImpl
SetIgnoreSingleTap(true);
GestureEventDetails long_press_details(ET_GESTURE_LONG_PRESS, 0, 0);
- long_press_details.set_bounding_box(
- gfx::RectF(e.GetTouchMajor(), e.GetTouchMajor()));
provider_->Send(
CreateGesture(ET_GESTURE_LONG_PRESS, e, long_press_details));
@@ -443,16 +460,9 @@ class GestureProvider::GestureListenerImpl
void SetDoubleTapEnabled(bool enabled) {
DCHECK(!IsDoubleTapInProgress());
- if (enabled) {
- gesture_detector_.set_doubletap_listener(this);
- } else {
- // TODO(jdduke): Send GESTURE_TAP if GESTURE_TAP_UNCONFIRMED already sent.
- gesture_detector_.set_doubletap_listener(NULL);
- }
+ gesture_detector_.SetDoubleTapListener(enabled ? this : NULL);
}
- bool IsClickDelayDisabled() const { return disable_click_delay_; }
-
bool IsDoubleTapInProgress() const {
return gesture_detector_.is_double_tapping();
}
@@ -526,24 +536,20 @@ bool GestureProvider::OnTouchEvent(const MotionEvent& event) {
return true;
}
-void GestureProvider::ResetGestureDetectors() {
- if (!current_down_event_)
- return;
- scoped_ptr<MotionEvent> cancel_event = current_down_event_->Cancel();
- gesture_listener_->OnTouchEvent(*cancel_event, false);
- scale_gesture_listener_->OnTouchEvent(*cancel_event);
-}
-
-void GestureProvider::SetMultiTouchSupportEnabled(bool enabled) {
- scale_gesture_listener_->SetMultiTouchEnabled(!enabled);
+void GestureProvider::SetMultiTouchZoomSupportEnabled(bool enabled) {
+ scale_gesture_listener_->SetMultiTouchEnabled(enabled);
}
void GestureProvider::SetDoubleTapSupportForPlatformEnabled(bool enabled) {
+ if (double_tap_support_for_platform_ == enabled)
+ return;
double_tap_support_for_platform_ = enabled;
UpdateDoubleTapDetectionSupport();
}
void GestureProvider::SetDoubleTapSupportForPageEnabled(bool enabled) {
+ if (double_tap_support_for_page_ == enabled)
+ return;
double_tap_support_for_page_ = enabled;
UpdateDoubleTapDetectionSupport();
}
@@ -561,14 +567,6 @@ bool GestureProvider::IsDoubleTapInProgress() const {
scale_gesture_listener_->IsDoubleTapInProgress();
}
-bool GestureProvider::IsDoubleTapSupported() const {
- return double_tap_support_for_page_ && double_tap_support_for_platform_;
-}
-
-bool GestureProvider::IsClickDelayDisabled() const {
- return gesture_listener_->IsClickDelayDisabled();
-}
-
void GestureProvider::InitGestureDetectors(const Config& config) {
TRACE_EVENT0("input", "GestureProvider::InitGestureDetectors");
gesture_listener_.reset(
@@ -640,7 +638,8 @@ void GestureProvider::Send(const GestureEventData& gesture) {
gesture.time,
gesture.x,
gesture.y,
- gesture.details.touch_points()));
+ gesture.details.touch_points(),
+ gesture.details.bounding_box()));
touch_scroll_in_progress_ = false;
break;
case ET_GESTURE_PINCH_BEGIN:
@@ -651,7 +650,8 @@ void GestureProvider::Send(const GestureEventData& gesture) {
gesture.time,
gesture.x,
gesture.y,
- gesture.details.touch_points()));
+ gesture.details.touch_points(),
+ gesture.details.bounding_box()));
pinch_in_progress_ = true;
break;
case ET_GESTURE_PINCH_END:
@@ -676,8 +676,6 @@ bool GestureProvider::SendLongTapIfNecessary(const MotionEvent& event) {
!current_longpress_time_.is_null() &&
!scale_gesture_listener_->IsScaleGestureDetectionInProgress()) {
GestureEventDetails long_tap_details(ET_GESTURE_LONG_TAP, 0, 0);
- long_tap_details.set_bounding_box(
- gfx::RectF(event.GetTouchMajor(), event.GetTouchMajor()));
Send(CreateGesture(ET_GESTURE_LONG_TAP, event, long_tap_details));
return true;
}
@@ -693,15 +691,6 @@ void GestureProvider::EndTouchScrollIfNecessary(const MotionEvent& event,
touch_scroll_in_progress_ = false;
}
-void GestureProvider::UpdateDoubleTapDetectionSupport() {
- if (current_down_event_ || IsDoubleTapInProgress())
- return;
-
- const bool supports_double_tap = IsDoubleTapSupported();
- gesture_listener_->SetDoubleTapEnabled(supports_double_tap);
- scale_gesture_listener_->SetDoubleTapEnabled(supports_double_tap);
-}
-
void GestureProvider::OnTouchEventHandlingBegin(const MotionEvent& event) {
switch (event.GetAction()) {
case MotionEvent::ACTION_DOWN:
@@ -750,4 +739,17 @@ void GestureProvider::OnTouchEventHandlingEnd(const MotionEvent& event) {
}
}
+void GestureProvider::UpdateDoubleTapDetectionSupport() {
+ // The GestureDetector requires that any provided DoubleTapListener remain
+ // attached to it for the duration of a touch sequence. Defer any potential
+ // null'ing of the listener until the sequence has ended.
+ if (current_down_event_)
+ return;
+
+ const bool double_tap_enabled = double_tap_support_for_page_ &&
+ double_tap_support_for_platform_;
+ gesture_listener_->SetDoubleTapEnabled(double_tap_enabled);
+ scale_gesture_listener_->SetDoubleTapEnabled(double_tap_enabled);
+}
+
} // namespace ui
diff --git a/ui/events/gesture_detection/gesture_provider.h b/ui/events/gesture_detection/gesture_provider.h
index 41f09900e5..22558f198f 100644
--- a/ui/events/gesture_detection/gesture_provider.h
+++ b/ui/events/gesture_detection/gesture_provider.h
@@ -54,21 +54,15 @@ class GESTURE_DETECTION_EXPORT GestureProvider {
// be handled.
bool OnTouchEvent(const MotionEvent& event);
- // Resets all gesture detectors; called on DidStartLoading().
- void ResetGestureDetectors();
+ // Update whether multi-touch pinch zoom is supported by the platform.
+ void SetMultiTouchZoomSupportEnabled(bool enabled);
- // Update whether multi-touch gestures are supported.
- void SetMultiTouchSupportEnabled(bool enabled);
-
- // Update whether double-tap gestures are supported. This allows
- // double-tap gesture suppression independent of whether or not the page's
- // viewport and scale would normally prevent double-tap.
- // Note: This should not be called while a double-tap gesture is in progress.
+ // Update whether double-tap gestures are supported by the platform.
void SetDoubleTapSupportForPlatformEnabled(bool enabled);
- // Update whether double-tap gesture detection should be suppressed due to
- // the viewport or scale of the current page. Suppressing double-tap gesture
- // detection allows for rapid and responsive single-tap gestures.
+ // Update whether double-tap gesture detection should be suppressed, e.g.,
+ // if the page scale is fixed or the page has a mobile viewport. This disables
+ // the tap delay, allowing rapid and responsive single-tap gestures.
void SetDoubleTapSupportForPageEnabled(bool enabled);
// Whether a scroll gesture is in-progress.
@@ -82,13 +76,6 @@ class GESTURE_DETECTION_EXPORT GestureProvider {
// double-tap drag zoom).
bool IsDoubleTapInProgress() const;
- // Whether double-tap gesture detection is supported.
- bool IsDoubleTapSupported() const;
-
- // Whether the tap gesture delay is explicitly disabled (independent of
- // whether double-tap is supported), see |Config.disable_click_delay|.
- bool IsClickDelayDisabled() const;
-
// May be NULL if there is no currently active touch sequence.
const ui::MotionEvent* current_down_event() const {
return current_down_event_.get();
diff --git a/ui/events/gesture_detection/gesture_provider_unittest.cc b/ui/events/gesture_detection/gesture_provider_unittest.cc
index 5d9c664d02..9720a20153 100644
--- a/ui/events/gesture_detection/gesture_provider_unittest.cc
+++ b/ui/events/gesture_detection/gesture_provider_unittest.cc
@@ -26,6 +26,7 @@ const float kFakeCoordY = 24.f;
const TimeDelta kOneSecond = TimeDelta::FromSeconds(1);
const TimeDelta kOneMicrosecond = TimeDelta::FromMicroseconds(1);
const TimeDelta kDeltaTimeForFlingSequences = TimeDelta::FromMilliseconds(5);
+const float kMockTouchRadius = MockMotionEvent::TOUCH_MAJOR / 2;
GestureProvider::Config CreateDefaultConfig() {
GestureProvider::Config sConfig;
@@ -44,6 +45,11 @@ GestureProvider::Config CreateDefaultConfig() {
return sConfig;
}
+gfx::RectF BoundsForSingleMockTouchAtLocation(float x, float y) {
+ float diameter = MockMotionEvent::TOUCH_MAJOR;
+ return gfx::RectF(x - diameter / 2, y - diameter / 2, diameter, diameter);
+}
+
} // namespace
class GestureProviderTest : public testing::Test, public GestureProviderClient {
@@ -75,7 +81,7 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient {
// Test
virtual void SetUp() OVERRIDE {
gesture_provider_.reset(new GestureProvider(GetDefaultConfig(), this));
- gesture_provider_->SetMultiTouchSupportEnabled(false);
+ gesture_provider_->SetMultiTouchZoomSupportEnabled(false);
}
virtual void TearDown() OVERRIDE {
@@ -110,7 +116,7 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient {
return gestures_.back();
}
- const EventType GetMostRecentGestureEventType() const {
+ EventType GetMostRecentGestureEventType() const {
EXPECT_FALSE(gestures_.empty());
return gestures_.back().type;
}
@@ -147,7 +153,7 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient {
GestureProvider::Config config = GetDefaultConfig();
config.gesture_begin_end_types_enabled = true;
gesture_provider_.reset(new GestureProvider(config, this));
- gesture_provider_->SetMultiTouchSupportEnabled(false);
+ gesture_provider_->SetMultiTouchZoomSupportEnabled(false);
}
bool HasDownEvent() const { return gesture_provider_->current_down_event(); }
@@ -177,6 +183,8 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient {
EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetMostRecentGestureEventType());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(scroll_to_x, scroll_to_y),
+ GetMostRecentGestureEvent().details.bounding_box());
ASSERT_EQ(3U, GetReceivedGestureCount()) << "Only TapDown, "
"ScrollBegin and ScrollBy "
"should have been sent";
@@ -196,6 +204,8 @@ class GestureProviderTest : public testing::Test, public GestureProviderClient {
EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType());
EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(scroll_to_x, scroll_to_y),
+ GetMostRecentGestureEvent().details.bounding_box());
}
static void RunTasksAndWait(base::TimeDelta delay) {
@@ -224,6 +234,8 @@ TEST_F(GestureProviderTest, GestureTapTap) {
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
+ GetMostRecentGestureEvent().details.bounding_box());
event = ObtainMotionEvent(event_time + kOneMicrosecond,
MotionEvent::ACTION_UP);
@@ -232,11 +244,11 @@ TEST_F(GestureProviderTest, GestureTapTap) {
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
// Ensure tap details have been set.
- EXPECT_EQ(10, GetMostRecentGestureEvent().details.bounding_box().width());
- EXPECT_EQ(10, GetMostRecentGestureEvent().details.bounding_box().height());
EXPECT_EQ(1, GetMostRecentGestureEvent().details.tap_count());
EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
+ GetMostRecentGestureEvent().details.bounding_box());
}
// Verify that a DOWN followed shortly by an UP will trigger
@@ -255,6 +267,8 @@ TEST_F(GestureProviderTest, GestureTapTapWithDelay) {
EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
+ GetMostRecentGestureEvent().details.bounding_box());
event = ObtainMotionEvent(event_time + kOneMicrosecond,
MotionEvent::ACTION_UP);
@@ -263,11 +277,11 @@ TEST_F(GestureProviderTest, GestureTapTapWithDelay) {
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
// Ensure tap details have been set.
- EXPECT_EQ(10, GetMostRecentGestureEvent().details.bounding_box().width());
- EXPECT_EQ(10, GetMostRecentGestureEvent().details.bounding_box().height());
EXPECT_EQ(1, GetMostRecentGestureEvent().details.tap_count());
EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
+ GetMostRecentGestureEvent().details.bounding_box());
EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_TAP));
}
@@ -305,6 +319,9 @@ TEST_F(GestureProviderTest, GestureFlingAndCancelLongPress) {
EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_LONG_PRESS));
+ EXPECT_EQ(
+ BoundsForSingleMockTouchAtLocation(kFakeCoordX * 10, kFakeCoordY * 10),
+ GetMostRecentGestureEvent().details.bounding_box());
}
// Verify that for a normal scroll the following events are sent:
@@ -504,6 +521,8 @@ TEST_F(GestureProviderTest, DoubleTapDragZoomBasic) {
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
ASSERT_EQ(ET_GESTURE_PINCH_BEGIN, GetMostRecentGestureEventType());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY + 100),
+ GetMostRecentGestureEvent().details.bounding_box());
event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 2,
MotionEvent::ACTION_MOVE,
@@ -512,6 +531,8 @@ TEST_F(GestureProviderTest, DoubleTapDragZoomBasic) {
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
ASSERT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType());
EXPECT_LT(1.f, GetMostRecentGestureEvent().details.scale());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY + 200),
+ GetMostRecentGestureEvent().details.bounding_box());
event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 3,
MotionEvent::ACTION_MOVE,
@@ -520,6 +541,8 @@ TEST_F(GestureProviderTest, DoubleTapDragZoomBasic) {
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
ASSERT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType());
EXPECT_GT(1.f, GetMostRecentGestureEvent().details.scale());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY + 100),
+ GetMostRecentGestureEvent().details.bounding_box());
event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 4,
MotionEvent::ACTION_UP,
@@ -528,6 +551,8 @@ TEST_F(GestureProviderTest, DoubleTapDragZoomBasic) {
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_PINCH_END));
EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY - 200),
+ GetMostRecentGestureEvent().details.bounding_box());
}
// Generate a scroll gesture and verify that the resulting scroll motion event
@@ -696,11 +721,15 @@ TEST_F(GestureProviderTest, GestureLongTap) {
EXPECT_EQ(ET_GESTURE_LONG_PRESS, GetMostRecentGestureEventType());
EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
+ GetMostRecentGestureEvent().details.bounding_box());
event = ObtainMotionEvent(event_time + kOneSecond, MotionEvent::ACTION_UP);
gesture_provider_->OnTouchEvent(event);
EXPECT_EQ(ET_GESTURE_LONG_TAP, GetMostRecentGestureEventType());
EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
+ GetMostRecentGestureEvent().details.bounding_box());
}
TEST_F(GestureProviderTest, GestureLongPressDoesNotPreventScrolling) {
@@ -862,15 +891,14 @@ TEST_F(GestureProviderTest, NoScrollWithinTouchSlop) {
}
TEST_F(GestureProviderTest, NoDoubleTapWhenExplicitlyDisabled) {
+ // Ensure that double-tap gestures can be disabled.
gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
base::TimeTicks event_time = base::TimeTicks::Now();
MockMotionEvent event = ObtainMotionEvent(
event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
- EXPECT_EQ(1U, GetReceivedGestureCount());
EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
- EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
event = ObtainMotionEvent(event_time + kOneMicrosecond,
MotionEvent::ACTION_UP,
@@ -878,7 +906,6 @@ TEST_F(GestureProviderTest, NoDoubleTapWhenExplicitlyDisabled) {
kFakeCoordY);
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
- EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
MotionEvent::ACTION_DOWN,
@@ -886,7 +913,6 @@ TEST_F(GestureProviderTest, NoDoubleTapWhenExplicitlyDisabled) {
kFakeCoordY);
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
- EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
event = ObtainMotionEvent(event_time + kOneMicrosecond * 3,
MotionEvent::ACTION_UP,
@@ -894,7 +920,86 @@ TEST_F(GestureProviderTest, NoDoubleTapWhenExplicitlyDisabled) {
kFakeCoordY);
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
- EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
+
+ // Ensure that double-tap gestures can be interrupted.
+ gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
+
+ event_time = base::TimeTicks::Now();
+ event = ObtainMotionEvent(
+ event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
+ EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
+ EXPECT_EQ(5U, GetReceivedGestureCount());
+
+ event = ObtainMotionEvent(event_time + kOneMicrosecond,
+ MotionEvent::ACTION_UP,
+ kFakeCoordX,
+ kFakeCoordY);
+ EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
+ EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
+
+ gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
+ EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
+
+ // Ensure that double-tap gestures can be resumed.
+ gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
+
+ event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
+ MotionEvent::ACTION_DOWN,
+ kFakeCoordX,
+ kFakeCoordY);
+ EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
+ EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
+
+ event = ObtainMotionEvent(event_time + kOneMicrosecond * 3,
+ MotionEvent::ACTION_UP,
+ kFakeCoordX,
+ kFakeCoordY);
+ EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
+ EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
+
+ event = ObtainMotionEvent(event_time + kOneMicrosecond * 4,
+ MotionEvent::ACTION_DOWN,
+ kFakeCoordX,
+ kFakeCoordY);
+ EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
+ EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
+
+ event = ObtainMotionEvent(event_time + kOneMicrosecond * 5,
+ MotionEvent::ACTION_UP,
+ kFakeCoordX,
+ kFakeCoordY);
+ EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
+ EXPECT_EQ(ET_GESTURE_DOUBLE_TAP, GetMostRecentGestureEventType());
+}
+
+TEST_F(GestureProviderTest, NoDelayedTapWhenDoubleTapSupportToggled) {
+ gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
+
+ base::TimeTicks event_time = base::TimeTicks::Now();
+ MockMotionEvent event = ObtainMotionEvent(
+ event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
+ EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
+ EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
+ EXPECT_EQ(1U, GetReceivedGestureCount());
+
+ event = ObtainMotionEvent(event_time + kOneMicrosecond,
+ MotionEvent::ACTION_UP,
+ kFakeCoordX,
+ kFakeCoordY);
+ EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
+ EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
+ EXPECT_EQ(2U, GetReceivedGestureCount());
+
+ // Disabling double-tap during the tap timeout should flush the delayed tap.
+ gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
+ EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
+ EXPECT_EQ(3U, GetReceivedGestureCount());
+
+ // No further timeout gestures should arrive.
+ const base::TimeDelta long_press_timeout =
+ GetLongPressTimeout() + GetShowPressTimeout() + kOneMicrosecond;
+ RunTasksAndWait(long_press_timeout);
+ EXPECT_EQ(3U, GetReceivedGestureCount());
}
TEST_F(GestureProviderTest, NoDoubleTapDragZoomWhenDisabledOnPlatform) {
@@ -1098,7 +1203,7 @@ TEST_F(GestureProviderTest, PinchZoom) {
gesture_provider_->SetDoubleTapSupportForPageEnabled(false);
gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
- gesture_provider_->SetMultiTouchSupportEnabled(true);
+ gesture_provider_->SetMultiTouchZoomSupportEnabled(true);
int secondary_coord_x = kFakeCoordX + 20 * touch_slop;
int secondary_coord_y = kFakeCoordY + 20 * touch_slop;
@@ -1109,6 +1214,8 @@ TEST_F(GestureProviderTest, PinchZoom) {
EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
+ GetMostRecentGestureEvent().details.bounding_box());
// Toggling double-tap support should not take effect until the next sequence.
gesture_provider_->SetDoubleTapSupportForPageEnabled(true);
@@ -1124,6 +1231,8 @@ TEST_F(GestureProviderTest, PinchZoom) {
gesture_provider_->OnTouchEvent(event);
EXPECT_EQ(1U, GetReceivedGestureCount());
EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
+ EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
+ GetMostRecentGestureEvent().details.bounding_box());
secondary_coord_x += 5 * touch_slop;
secondary_coord_y += 5 * touch_slop;
@@ -1144,6 +1253,12 @@ TEST_F(GestureProviderTest, PinchZoom) {
EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_PINCH_BEGIN));
EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_UPDATE));
+ EXPECT_EQ(
+ gfx::RectF(kFakeCoordX - kMockTouchRadius,
+ kFakeCoordY - kMockTouchRadius,
+ secondary_coord_x - kFakeCoordX + kMockTouchRadius * 2,
+ secondary_coord_y - kFakeCoordY + kMockTouchRadius * 2),
+ GetMostRecentGestureEvent().details.bounding_box());
secondary_coord_x += 2 * touch_slop;
secondary_coord_y += 2 * touch_slop;
@@ -1164,6 +1279,12 @@ TEST_F(GestureProviderTest, PinchZoom) {
EXPECT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType());
EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
EXPECT_LT(1.f, GetMostRecentGestureEvent().details.scale());
+ EXPECT_EQ(
+ gfx::RectF(kFakeCoordX - kMockTouchRadius,
+ kFakeCoordY - kMockTouchRadius,
+ secondary_coord_x - kFakeCoordX + kMockTouchRadius * 2,
+ secondary_coord_y - kFakeCoordY + kMockTouchRadius * 2),
+ GetMostRecentGestureEvent().details.bounding_box());
event = ObtainMotionEvent(event_time,
MotionEvent::ACTION_POINTER_UP,
@@ -1178,11 +1299,22 @@ TEST_F(GestureProviderTest, PinchZoom) {
EXPECT_EQ(ET_GESTURE_PINCH_END, GetMostRecentGestureEventType());
EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SCROLL_END));
+ EXPECT_EQ(
+ gfx::RectF(kFakeCoordX - kMockTouchRadius,
+ kFakeCoordY - kMockTouchRadius,
+ secondary_coord_x - kFakeCoordX + kMockTouchRadius * 2,
+ secondary_coord_y - kFakeCoordY + kMockTouchRadius * 2),
+ GetMostRecentGestureEvent().details.bounding_box());
event = ObtainMotionEvent(event_time, MotionEvent::ACTION_UP);
gesture_provider_->OnTouchEvent(event);
EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType());
EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
+ EXPECT_EQ(gfx::RectF(kFakeCoordX - kMockTouchRadius,
+ kFakeCoordY - kMockTouchRadius,
+ kMockTouchRadius * 2,
+ kMockTouchRadius * 2),
+ GetMostRecentGestureEvent().details.bounding_box());
}
// Verify that the timer of LONG_PRESS will be cancelled when scrolling begins
@@ -1319,6 +1451,11 @@ TEST_F(GestureProviderTest, GestureBeginAndEnd) {
EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
EXPECT_EQ(2U, GetReceivedGestureCount());
EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
+ EXPECT_EQ(gfx::RectF(kFakeCoordX - kMockTouchRadius,
+ kFakeCoordY - kMockTouchRadius,
+ kMockTouchRadius * 2,
+ kMockTouchRadius * 2),
+ GetMostRecentGestureEvent().details.bounding_box());
event = ObtainMotionEvent(event_time, MotionEvent::ACTION_POINTER_DOWN);
event.pointer_count = 2;
diff --git a/ui/events/gesture_detection/mock_motion_event.cc b/ui/events/gesture_detection/mock_motion_event.cc
index cf293874ba..65bfe03136 100644
--- a/ui/events/gesture_detection/mock_motion_event.cc
+++ b/ui/events/gesture_detection/mock_motion_event.cc
@@ -9,9 +9,6 @@
using base::TimeTicks;
namespace ui {
-namespace {
-const float kTouchMajor = 10.f;
-} // namespace
MockMotionEvent::MockMotionEvent()
: action(ACTION_CANCEL), pointer_count(1), id(0) {}
@@ -79,7 +76,7 @@ float MockMotionEvent::GetY(size_t pointer_index) const {
}
float MockMotionEvent::GetTouchMajor(size_t pointer_index) const {
- return kTouchMajor;
+ return TOUCH_MAJOR;
}
float MockMotionEvent::GetPressure(size_t pointer_index) const {
diff --git a/ui/events/gesture_detection/mock_motion_event.h b/ui/events/gesture_detection/mock_motion_event.h
index 9793494e28..c9f43d93a1 100644
--- a/ui/events/gesture_detection/mock_motion_event.h
+++ b/ui/events/gesture_detection/mock_motion_event.h
@@ -11,6 +11,7 @@ namespace ui {
struct MockMotionEvent : public MotionEvent {
enum { MAX_POINTERS = 3 };
+ enum { TOUCH_MAJOR = 10 };
MockMotionEvent();
explicit MockMotionEvent(Action action);
@@ -54,7 +55,6 @@ struct MockMotionEvent : public MotionEvent {
void MovePoint(size_t index, float x, float y);
void ReleasePoint();
void CancelPoint();
-
MotionEvent::Action action;
size_t pointer_count;
gfx::PointF points[MAX_POINTERS];
diff --git a/ui/events/gesture_detection/touch_disposition_gesture_filter.cc b/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
index 2e14aaf92a..d4ba635ac7 100644
--- a/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
+++ b/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
@@ -17,13 +17,15 @@ COMPILE_ASSERT(ET_GESTURE_TYPE_END - ET_GESTURE_TYPE_START < 32,
GestureEventData CreateGesture(EventType type,
int motion_event_id) {
+ GestureEventDetails details(type, 0, 0);
return GestureEventData(type,
motion_event_id,
base::TimeTicks(),
0,
0,
1,
- GestureEventDetails(type, 0, 0));
+ gfx::RectF(0, 0, 0, 0),
+ details);
}
enum RequiredTouches {
@@ -37,8 +39,8 @@ struct DispositionHandlingInfo {
int required_touches;
EventType antecedent_event_type;
- DispositionHandlingInfo(int required_touches)
- : required_touches(required_touches) {}
+ explicit DispositionHandlingInfo(int required_touches)
+ : required_touches(required_touches), antecedent_event_type(ET_UNKNOWN) {}
DispositionHandlingInfo(int required_touches,
EventType antecedent_event_type)
@@ -104,6 +106,8 @@ DispositionHandlingInfo GetDispositionHandlingInfo(EventType type) {
}
int GetGestureTypeIndex(EventType type) {
+ DCHECK_GE(type, ET_GESTURE_TYPE_START);
+ DCHECK_LE(type, ET_GESTURE_TYPE_END);
return type - ET_GESTURE_TYPE_START;
}
@@ -337,10 +341,13 @@ bool TouchDispositionGestureFilter::GestureHandlingState::Filter(
GetDispositionHandlingInfo(gesture_type);
int required_touches = disposition_handling_info.required_touches;
+ EventType antecedent_event_type =
+ disposition_handling_info.antecedent_event_type;
if ((required_touches & RT_START && start_touch_consumed_) ||
(required_touches & RT_CURRENT && current_touch_consumed_) ||
- (last_gesture_of_type_dropped_.has_bit(GetGestureTypeIndex(
- disposition_handling_info.antecedent_event_type)))) {
+ (antecedent_event_type != ET_UNKNOWN &&
+ last_gesture_of_type_dropped_.has_bit(
+ GetGestureTypeIndex(antecedent_event_type)))) {
last_gesture_of_type_dropped_.mark_bit(GetGestureTypeIndex(gesture_type));
return true;
}
diff --git a/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc b/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc
index 837ec7df4d..d201c87f3a 100644
--- a/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc
+++ b/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc
@@ -168,7 +168,8 @@ class TouchDispositionGestureFilterTest
}
static GestureEventData CreateGesture(EventType type) {
- return GestureEventData(type, 0, base::TimeTicks(), 0, 0, 1);
+ return GestureEventData(
+ type, 0, base::TimeTicks(), 0, 0, 1, gfx::RectF(0, 0, 0, 0));
}
private:
diff --git a/ui/events/gesture_event_details.cc b/ui/events/gesture_event_details.cc
index ead9f4a59f..389a924962 100644
--- a/ui/events/gesture_event_details.cc
+++ b/ui/events/gesture_event_details.cc
@@ -95,17 +95,6 @@ GestureEventDetails::GestureEventDetails(ui::EventType type,
}
}
-void GestureEventDetails::SetScrollVelocity(float velocity_x,
- float velocity_y,
- float velocity_x_ordinal,
- float velocity_y_ordinal) {
- CHECK_EQ(ui::ET_GESTURE_SCROLL_UPDATE, type_);
- data.scroll_update.velocity_x = velocity_x;
- data.scroll_update.velocity_y = velocity_y;
- data.scroll_update.velocity_x_ordinal = velocity_x_ordinal;
- data.scroll_update.velocity_y_ordinal = velocity_y_ordinal;
-}
-
GestureEventDetails::Details::Details() {
memset(this, 0, sizeof(Details));
}
diff --git a/ui/events/gesture_event_details.h b/ui/events/gesture_event_details.h
index c97ca84194..17c73acc6a 100644
--- a/ui/events/gesture_event_details.h
+++ b/ui/events/gesture_event_details.h
@@ -37,9 +37,6 @@ struct EVENTS_BASE_EXPORT GestureEventDetails {
void set_bounding_box(const gfx::RectF& box) { bounding_box_ = box; }
- void SetScrollVelocity(float velocity_x, float velocity_y,
- float velocity_x_ordinal, float velocity_y_ordinal);
-
float scroll_x_hint() const {
DCHECK_EQ(ui::ET_GESTURE_SCROLL_BEGIN, type_);
return data.scroll_begin.x_hint;
@@ -61,17 +58,13 @@ struct EVENTS_BASE_EXPORT GestureEventDetails {
}
float velocity_x() const {
- DCHECK(type_ == ui::ET_GESTURE_SCROLL_UPDATE ||
- type_ == ui::ET_SCROLL_FLING_START);
- return type_ == ui::ET_SCROLL_FLING_START ? data.fling_velocity.x :
- data.scroll_update.velocity_x;
+ DCHECK(type_ == ui::ET_SCROLL_FLING_START);
+ return data.fling_velocity.x;
}
float velocity_y() const {
- DCHECK(type_ == ui::ET_GESTURE_SCROLL_UPDATE ||
- type_ == ui::ET_SCROLL_FLING_START);
- return type_ == ui::ET_SCROLL_FLING_START ? data.fling_velocity.y :
- data.scroll_update.velocity_y;
+ DCHECK(type_ == ui::ET_SCROLL_FLING_START);
+ return data.fling_velocity.y;
}
// *_ordinal values are unmodified by rail based clamping.
@@ -86,19 +79,13 @@ struct EVENTS_BASE_EXPORT GestureEventDetails {
}
float velocity_x_ordinal() const {
- DCHECK(type_ == ui::ET_GESTURE_SCROLL_UPDATE ||
- type_ == ui::ET_SCROLL_FLING_START);
- return type_ == ui::ET_SCROLL_FLING_START ?
- data.fling_velocity.x_ordinal :
- data.scroll_update.velocity_x_ordinal;
+ DCHECK(type_ == ui::ET_SCROLL_FLING_START);
+ return data.fling_velocity.x_ordinal;
}
float velocity_y_ordinal() const {
- DCHECK(type_ == ui::ET_GESTURE_SCROLL_UPDATE ||
- type_ == ui::ET_SCROLL_FLING_START);
- return type_ == ui::ET_SCROLL_FLING_START ?
- data.fling_velocity.y_ordinal :
- data.scroll_update.velocity_y_ordinal;
+ DCHECK(type_ == ui::ET_SCROLL_FLING_START);
+ return data.fling_velocity.y_ordinal;
}
float first_finger_width() const {
@@ -157,12 +144,8 @@ struct EVENTS_BASE_EXPORT GestureEventDetails {
struct { // SCROLL delta.
float x;
float y;
- float velocity_x;
- float velocity_y;
float x_ordinal;
float y_ordinal;
- float velocity_x_ordinal;
- float velocity_y_ordinal;
} scroll_update;
float scale; // PINCH scale.
diff --git a/ui/events/gestures/gesture_sequence.cc b/ui/events/gestures/gesture_sequence.cc
index f0513dd7a1..d9a5e68a72 100644
--- a/ui/events/gestures/gesture_sequence.cc
+++ b/ui/events/gestures/gesture_sequence.cc
@@ -1055,11 +1055,6 @@ void GestureSequence::AppendScrollGestureUpdate(GesturePoint& point,
GestureEventDetails details(ui::ET_GESTURE_SCROLL_UPDATE,
d.x(), d.y(), o.x(), o.y());
- details.SetScrollVelocity(
- scroll_type_ == ST_VERTICAL ? 0 : point.XVelocity(),
- scroll_type_ == ST_HORIZONTAL ? 0 : point.YVelocity(),
- point.XVelocity(),
- point.YVelocity());
gestures->push_back(CreateGestureEvent(
details,
location,
@@ -1423,7 +1418,6 @@ bool GestureSequence::MaybeSwipe(const TouchEvent& event,
}
float min_velocity = GestureConfiguration::min_swipe_speed();
- min_velocity *= min_velocity;
velocity_x = fabs(velocity_x / point_count_);
velocity_y = fabs(velocity_y / point_count_);
diff --git a/ui/events/ozone/evdev/event_converter_evdev.cc b/ui/events/ozone/evdev/event_converter_evdev.cc
index d3d9aedad8..0a54fc4c22 100644
--- a/ui/events/ozone/evdev/event_converter_evdev.cc
+++ b/ui/events/ozone/evdev/event_converter_evdev.cc
@@ -11,6 +11,9 @@ namespace ui {
EventConverterEvdev::EventConverterEvdev() {}
+EventConverterEvdev::EventConverterEvdev(const EventDispatchCallback& callback)
+ : dispatch_callback_(callback) {}
+
EventConverterEvdev::~EventConverterEvdev() {}
void EventConverterEvdev::DispatchEventToCallback(ui::Event* event) {
diff --git a/ui/events/ozone/evdev/event_converter_evdev.h b/ui/events/ozone/evdev/event_converter_evdev.h
index 5dd9988f81..7f6223d854 100644
--- a/ui/events/ozone/evdev/event_converter_evdev.h
+++ b/ui/events/ozone/evdev/event_converter_evdev.h
@@ -15,16 +15,15 @@ namespace ui {
class Event;
class EventModifiersEvdev;
+typedef base::Callback<void(Event*)> EventDispatchCallback;
+
// Base class for device-specific evdev event conversion.
class EVENTS_EXPORT EventConverterEvdev {
public:
EventConverterEvdev();
+ explicit EventConverterEvdev(const EventDispatchCallback& callback);
virtual ~EventConverterEvdev();
- void SetDispatchCallback(base::Callback<void(void*)> callback) {
- dispatch_callback_ = callback;
- }
-
// Start converting events.
virtual void Start() = 0;
@@ -37,7 +36,7 @@ class EVENTS_EXPORT EventConverterEvdev {
virtual void DispatchEventToCallback(ui::Event* event);
private:
- base::Callback<void(void*)> dispatch_callback_;
+ EventDispatchCallback dispatch_callback_;
DISALLOW_COPY_AND_ASSIGN(EventConverterEvdev);
};
diff --git a/ui/events/ozone/evdev/event_device_info.cc b/ui/events/ozone/evdev/event_device_info.cc
index 858f57c1af..2734b9d2f4 100644
--- a/ui/events/ozone/evdev/event_device_info.cc
+++ b/ui/events/ozone/evdev/event_device_info.cc
@@ -149,4 +149,41 @@ int32 EventDeviceInfo::GetAbsMaximum(unsigned int code) const {
return abs_info_[code].maximum;
}
+bool EventDeviceInfo::HasAbsXY() const {
+ if (HasAbsEvent(ABS_X) && HasAbsEvent(ABS_Y))
+ return true;
+
+ if (HasAbsEvent(ABS_MT_POSITION_X) && HasAbsEvent(ABS_MT_POSITION_Y))
+ return true;
+
+ return false;
+}
+
+bool EventDeviceInfo::HasRelXY() const {
+ return HasRelEvent(REL_X) && HasRelEvent(REL_Y);
+}
+
+bool EventDeviceInfo::IsMappedToScreen() const {
+ // Device position is mapped directly to the screen.
+ if (HasProp(INPUT_PROP_DIRECT))
+ return true;
+
+ // Device position moves the cursor.
+ if (HasProp(INPUT_PROP_POINTER))
+ return false;
+
+ // Tablets are mapped to the screen.
+ if (HasKeyEvent(BTN_TOOL_PEN) || HasKeyEvent(BTN_STYLUS) ||
+ HasKeyEvent(BTN_STYLUS2))
+ return true;
+
+ // Touchpads are not mapped to the screen.
+ if (HasKeyEvent(BTN_LEFT) || HasKeyEvent(BTN_MIDDLE) ||
+ HasKeyEvent(BTN_RIGHT) || HasKeyEvent(BTN_TOOL_FINGER))
+ return false;
+
+ // Touchscreens are mapped to the screen.
+ return true;
+}
+
} // namespace ui
diff --git a/ui/events/ozone/evdev/event_device_info.h b/ui/events/ozone/evdev/event_device_info.h
index 284d1e83cc..309ee38489 100644
--- a/ui/events/ozone/evdev/event_device_info.h
+++ b/ui/events/ozone/evdev/event_device_info.h
@@ -44,6 +44,16 @@ class EVENTS_EXPORT EventDeviceInfo {
// Check input device properties.
bool HasProp(unsigned int code) const;
+ // Has absolute X & Y axes.
+ bool HasAbsXY() const;
+
+ // Has relativeX & Y axes.
+ bool HasRelXY() const;
+
+ // Determine whether absolute device X/Y coordinates are mapped onto the
+ // screen. This is the case for touchscreens and tablets but not touchpads.
+ bool IsMappedToScreen() const;
+
private:
unsigned long ev_bits_[EVDEV_BITS_TO_LONGS(EV_CNT)];
unsigned long key_bits_[EVDEV_BITS_TO_LONGS(KEY_CNT)];
diff --git a/ui/events/ozone/evdev/event_factory_evdev.cc b/ui/events/ozone/evdev/event_factory_evdev.cc
index 78d34b8cdc..a36d9e7118 100644
--- a/ui/events/ozone/evdev/event_factory_evdev.cc
+++ b/ui/events/ozone/evdev/event_factory_evdev.cc
@@ -20,6 +20,11 @@
#include "ui/events/ozone/evdev/device_manager_udev.h"
#endif
+#if defined(USE_EVDEV_GESTURES)
+#include "ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h"
+#include "ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h"
+#endif
+
#ifndef EVIOCSCLOCKID
#define EVIOCSCLOCKID _IOW('E', 0xa0, int)
#endif
@@ -28,16 +33,49 @@ namespace ui {
namespace {
-bool IsTouchPad(const EventDeviceInfo& devinfo) {
- if (!devinfo.HasEventType(EV_ABS))
- return false;
+#if defined(USE_EVDEV_GESTURES)
+bool UseGesturesLibraryForDevice(const EventDeviceInfo& devinfo) {
+ if (devinfo.HasAbsXY() && !devinfo.IsMappedToScreen())
+ return true; // touchpad
+
+ if (devinfo.HasRelXY())
+ return true; // mouse
- return devinfo.HasKeyEvent(BTN_LEFT) || devinfo.HasKeyEvent(BTN_MIDDLE) ||
- devinfo.HasKeyEvent(BTN_RIGHT) || devinfo.HasKeyEvent(BTN_TOOL_FINGER);
+ return false;
}
+#endif
+
+scoped_ptr<EventConverterEvdev> CreateConverter(
+ int fd,
+ const base::FilePath& path,
+ const EventDeviceInfo& devinfo,
+ const EventDispatchCallback& dispatch,
+ EventModifiersEvdev* modifiers,
+ CursorDelegateEvdev* cursor) {
+#if defined(USE_EVDEV_GESTURES)
+ // Touchpad or mouse: use gestures library.
+ // EventReaderLibevdevCros -> GestureInterpreterLibevdevCros -> DispatchEvent
+ if (UseGesturesLibraryForDevice(devinfo)) {
+ scoped_ptr<GestureInterpreterLibevdevCros> gesture_interp = make_scoped_ptr(
+ new GestureInterpreterLibevdevCros(modifiers, cursor, dispatch));
+ scoped_ptr<EventReaderLibevdevCros> libevdev_reader =
+ make_scoped_ptr(new EventReaderLibevdevCros(
+ fd,
+ path,
+ gesture_interp.PassAs<EventReaderLibevdevCros::Delegate>()));
+ return libevdev_reader.PassAs<EventConverterEvdev>();
+ }
+#endif
+
+ // Touchscreen: use TouchEventConverterEvdev.
+ scoped_ptr<EventConverterEvdev> converter;
+ if (devinfo.HasAbsXY())
+ return make_scoped_ptr<EventConverterEvdev>(
+ new TouchEventConverterEvdev(fd, path, devinfo, dispatch));
-bool IsTouchScreen(const EventDeviceInfo& devinfo) {
- return devinfo.HasEventType(EV_ABS) && !IsTouchPad(devinfo);
+ // Everything else: use KeyEventConverterEvdev.
+ return make_scoped_ptr<EventConverterEvdev>(
+ new KeyEventConverterEvdev(fd, path, modifiers, dispatch));
}
// Open an input device. Opening may put the calling thread to sleep, and
@@ -51,6 +89,7 @@ void OpenInputDevice(
EventModifiersEvdev* modifiers,
CursorDelegateEvdev* cursor,
scoped_refptr<base::TaskRunner> reply_runner,
+ const EventDispatchCallback& dispatch,
base::Callback<void(scoped_ptr<EventConverterEvdev>)> reply_callback) {
TRACE_EVENT1("ozone", "OpenInputDevice", "path", path.value());
@@ -74,26 +113,12 @@ void OpenInputDevice(
return;
}
- if (IsTouchPad(devinfo)) {
- LOG(WARNING) << "touchpad device not supported: " << path.value();
- close(fd);
- return;
- }
-
- // TODO(spang) Add more device types.
- scoped_ptr<EventConverterEvdev> converter;
- if (IsTouchScreen(devinfo))
- converter.reset(new TouchEventConverterEvdev(fd, path, devinfo));
- else if (devinfo.HasEventType(EV_KEY))
- converter.reset(new KeyEventConverterEvdev(fd, path, modifiers));
+ scoped_ptr<EventConverterEvdev> converter =
+ CreateConverter(fd, path, devinfo, dispatch, modifiers, cursor);
- if (converter) {
- // Reply with the constructed converter.
- reply_runner->PostTask(
- FROM_HERE, base::Bind(reply_callback, base::Passed(&converter)));
- } else {
- close(fd);
- }
+ // Reply with the constructed converter.
+ reply_runner->PostTask(FROM_HERE,
+ base::Bind(reply_callback, base::Passed(&converter)));
}
// Close an input device. Closing may put the calling thread to sleep, and
@@ -111,16 +136,26 @@ EventFactoryEvdev::EventFactoryEvdev()
: ui_task_runner_(base::MessageLoopProxy::current()),
file_task_runner_(base::MessageLoopProxy::current()),
cursor_(NULL),
+ dispatch_callback_(
+ base::Bind(base::IgnoreResult(&EventFactoryEvdev::DispatchUiEvent),
+ base::Unretained(this))),
weak_ptr_factory_(this) {}
EventFactoryEvdev::EventFactoryEvdev(CursorDelegateEvdev* cursor)
: ui_task_runner_(base::MessageLoopProxy::current()),
file_task_runner_(base::MessageLoopProxy::current()),
cursor_(cursor),
+ dispatch_callback_(
+ base::Bind(base::IgnoreResult(&EventFactoryEvdev::DispatchUiEvent),
+ base::Unretained(this))),
weak_ptr_factory_(this) {}
EventFactoryEvdev::~EventFactoryEvdev() { STLDeleteValues(&converters_); }
+void EventFactoryEvdev::DispatchUiEvent(Event* event) {
+ EventFactoryOzone::DispatchEvent(event);
+}
+
void EventFactoryEvdev::AttachInputDevice(
const base::FilePath& path,
scoped_ptr<EventConverterEvdev> converter) {
@@ -134,9 +169,6 @@ void EventFactoryEvdev::AttachInputDevice(
// Add initialized device to map.
converters_[path] = converter.release();
- converters_[path]->SetDispatchCallback(
- base::Bind(base::IgnoreResult(&EventFactoryEvdev::DispatchEvent),
- base::Unretained(this)));
converters_[path]->Start();
}
@@ -151,6 +183,7 @@ void EventFactoryEvdev::OnDeviceAdded(const base::FilePath& path) {
&modifiers_,
cursor_,
ui_task_runner_,
+ dispatch_callback_,
base::Bind(&EventFactoryEvdev::AttachInputDevice,
weak_ptr_factory_.GetWeakPtr(),
path)));
diff --git a/ui/events/ozone/evdev/event_factory_evdev.h b/ui/events/ozone/evdev/event_factory_evdev.h
index 39d61ba580..b1802fdbad 100644
--- a/ui/events/ozone/evdev/event_factory_evdev.h
+++ b/ui/events/ozone/evdev/event_factory_evdev.h
@@ -27,6 +27,8 @@ class EVENTS_EXPORT EventFactoryEvdev : public EventFactoryOzone {
explicit EventFactoryEvdev(CursorDelegateEvdev* cursor);
virtual ~EventFactoryEvdev();
+ void DispatchUiEvent(Event* event);
+
// EventFactoryOzone:
virtual void StartProcessingEvents() OVERRIDE;
virtual void SetFileTaskRunner(scoped_refptr<base::TaskRunner> task_runner)
@@ -66,6 +68,9 @@ class EVENTS_EXPORT EventFactoryEvdev : public EventFactoryOzone {
// Cursor movement.
CursorDelegateEvdev* cursor_;
+ // Dispatch callback for events.
+ EventDispatchCallback dispatch_callback_;
+
// Support weak pointers for attach & detach callbacks.
base::WeakPtrFactory<EventFactoryEvdev> weak_ptr_factory_;
diff --git a/ui/events/ozone/evdev/event_modifiers_evdev.cc b/ui/events/ozone/evdev/event_modifiers_evdev.cc
index 05d4bd6d14..d867b5eef7 100644
--- a/ui/events/ozone/evdev/event_modifiers_evdev.cc
+++ b/ui/events/ozone/evdev/event_modifiers_evdev.cc
@@ -71,4 +71,9 @@ void EventModifiersEvdev::UpdateFlags(unsigned int modifier) {
int EventModifiersEvdev::GetModifierFlags() { return modifier_flags_; }
+// static
+int EventModifiersEvdev::GetEventFlagFromModifier(unsigned int modifier) {
+ return kEventFlagFromModifiers[modifier];
+}
+
} // namespace ui
diff --git a/ui/events/ozone/evdev/event_modifiers_evdev.h b/ui/events/ozone/evdev/event_modifiers_evdev.h
index 4b8f21a76a..e767758519 100644
--- a/ui/events/ozone/evdev/event_modifiers_evdev.h
+++ b/ui/events/ozone/evdev/event_modifiers_evdev.h
@@ -53,6 +53,9 @@ class EVENTS_EXPORT EventModifiersEvdev {
// Return current flags to use for incoming events.
int GetModifierFlags();
+ // Return the mask for the specified modifier.
+ static int GetEventFlagFromModifier(unsigned int modifier);
+
private:
// Count of keys pressed for each modifier.
int modifiers_down_[EVDEV_NUM_MODIFIERS];
diff --git a/ui/events/ozone/evdev/key_event_converter_evdev.cc b/ui/events/ozone/evdev/key_event_converter_evdev.cc
index e17498c7e5..6f990d42a7 100644
--- a/ui/events/ozone/evdev/key_event_converter_evdev.cc
+++ b/ui/events/ozone/evdev/key_event_converter_evdev.cc
@@ -187,10 +187,15 @@ bool IsLockButton(unsigned int code) { return code == KEY_CAPSLOCK; }
} // namespace
-KeyEventConverterEvdev::KeyEventConverterEvdev(int fd,
- base::FilePath path,
- EventModifiersEvdev* modifiers)
- : fd_(fd), path_(path), modifiers_(modifiers) {
+KeyEventConverterEvdev::KeyEventConverterEvdev(
+ int fd,
+ base::FilePath path,
+ EventModifiersEvdev* modifiers,
+ const EventDispatchCallback& callback)
+ : EventConverterEvdev(callback),
+ fd_(fd),
+ path_(path),
+ modifiers_(modifiers) {
// TODO(spang): Initialize modifiers using EVIOCGKEY.
}
diff --git a/ui/events/ozone/evdev/key_event_converter_evdev.h b/ui/events/ozone/evdev/key_event_converter_evdev.h
index a30c58c598..ea0d983275 100644
--- a/ui/events/ozone/evdev/key_event_converter_evdev.h
+++ b/ui/events/ozone/evdev/key_event_converter_evdev.h
@@ -22,7 +22,8 @@ class EVENTS_EXPORT KeyEventConverterEvdev
public:
KeyEventConverterEvdev(int fd,
base::FilePath path,
- EventModifiersEvdev* modifiers);
+ EventModifiersEvdev* modifiers,
+ const EventDispatchCallback& dispatch);
virtual ~KeyEventConverterEvdev();
// Start & stop watching for events.
diff --git a/ui/events/ozone/evdev/key_event_converter_evdev_unittest.cc b/ui/events/ozone/evdev/key_event_converter_evdev_unittest.cc
index 52cc62e2d8..88ee64609e 100644
--- a/ui/events/ozone/evdev/key_event_converter_evdev_unittest.cc
+++ b/ui/events/ozone/evdev/key_event_converter_evdev_unittest.cc
@@ -19,7 +19,10 @@ const char kTestDevicePath[] = "/dev/input/test-device";
class MockKeyEventConverterEvdev : public KeyEventConverterEvdev {
public:
MockKeyEventConverterEvdev(int fd, EventModifiersEvdev* modifiers)
- : KeyEventConverterEvdev(fd, base::FilePath(kTestDevicePath), modifiers) {
+ : KeyEventConverterEvdev(fd,
+ base::FilePath(kTestDevicePath),
+ modifiers,
+ EventDispatchCallback()) {
Start();
}
virtual ~MockKeyEventConverterEvdev() {};
diff --git a/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc b/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc
new file mode 100644
index 0000000000..86f8834d38
--- /dev/null
+++ b/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc
@@ -0,0 +1,107 @@
+// 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 "ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h"
+
+#include <errno.h>
+#include <libevdev/libevdev.h>
+#include <linux/input.h>
+
+#include "base/message_loop/message_loop.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+
+namespace ui {
+
+namespace {
+
+std::string FormatLog(const char* fmt, va_list args) {
+ std::string msg = base::StringPrintV(fmt, args);
+ if (!msg.empty() && msg[msg.size() - 1] == '\n')
+ msg.erase(msg.end() - 1, msg.end());
+ return msg;
+}
+
+} // namespace
+
+EventReaderLibevdevCros::EventReaderLibevdevCros(int fd,
+ const base::FilePath& path,
+ scoped_ptr<Delegate> delegate)
+ : path_(path), delegate_(delegate.Pass()) {
+ memset(&evdev_, 0, sizeof(evdev_));
+ evdev_.log = OnLogMessage;
+ evdev_.log_udata = this;
+ evdev_.syn_report = OnSynReport;
+ evdev_.syn_report_udata = this;
+ evdev_.fd = fd;
+
+ memset(&evstate_, 0, sizeof(evstate_));
+ evdev_.evstate = &evstate_;
+ Event_Init(&evdev_);
+
+ Event_Open(&evdev_);
+
+ delegate_->OnLibEvdevCrosOpen(&evdev_, &evstate_);
+}
+
+EventReaderLibevdevCros::~EventReaderLibevdevCros() {
+ Stop();
+ EvdevClose(&evdev_);
+}
+
+EventReaderLibevdevCros::Delegate::~Delegate() {}
+
+void EventReaderLibevdevCros::Start() {
+ base::MessageLoopForUI::current()->WatchFileDescriptor(
+ evdev_.fd,
+ true,
+ base::MessagePumpLibevent::WATCH_READ,
+ &controller_,
+ this);
+}
+
+void EventReaderLibevdevCros::Stop() {
+ controller_.StopWatchingFileDescriptor();
+}
+
+void EventReaderLibevdevCros::OnFileCanReadWithoutBlocking(int fd) {
+ if (EvdevRead(&evdev_)) {
+ if (errno == EINTR || errno == EAGAIN)
+ return;
+ if (errno != ENODEV)
+ PLOG(ERROR) << "error reading device " << path_.value();
+ Stop();
+ return;
+ }
+}
+
+void EventReaderLibevdevCros::OnFileCanWriteWithoutBlocking(int fd) {
+ NOTREACHED();
+}
+
+// static
+void EventReaderLibevdevCros::OnSynReport(void* data,
+ EventStateRec* evstate,
+ struct timeval* tv) {
+ EventReaderLibevdevCros* reader = static_cast<EventReaderLibevdevCros*>(data);
+ reader->delegate_->OnLibEvdevCrosEvent(&reader->evdev_, evstate, *tv);
+}
+
+// static
+void EventReaderLibevdevCros::OnLogMessage(void* data,
+ int level,
+ const char* fmt,
+ ...) {
+ va_list args;
+ va_start(args, fmt);
+ if (level >= LOGLEVEL_ERROR)
+ LOG(ERROR) << "libevdev: " << FormatLog(fmt, args);
+ else if (level >= LOGLEVEL_WARNING)
+ LOG(WARNING) << "libevdev: " << FormatLog(fmt, args);
+ else
+ VLOG(3) << "libevdev: " << FormatLog(fmt, args);
+ va_end(args);
+}
+
+} // namespace ui
diff --git a/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h b/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h
new file mode 100644
index 0000000000..1631c5b685
--- /dev/null
+++ b/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h
@@ -0,0 +1,78 @@
+// 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 UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_EVENT_READER_LIBEVDEV_CROS_H_
+#define UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_EVENT_READER_LIBEVDEV_CROS_H_
+
+#include <libevdev/libevdev.h>
+
+#include "base/files/file_path.h"
+#include "base/message_loop/message_loop.h"
+#include "ui/events/ozone/evdev/event_converter_evdev.h"
+
+namespace ui {
+
+// Basic wrapper for libevdev-cros.
+//
+// This drives libevdev-cros from a file descriptor and calls delegate
+// with the updated event state from libevdev-cros.
+//
+// The library doesn't support all devices currently. In particular there
+// is no support for keyboard events.
+class EventReaderLibevdevCros : public base::MessagePumpLibevent::Watcher,
+ public EventConverterEvdev {
+ public:
+ class Delegate {
+ public:
+ virtual ~Delegate();
+
+ // Notifier for open. This is called with the initial event state.
+ virtual void OnLibEvdevCrosOpen(Evdev* evdev, EventStateRec* evstate) = 0;
+
+ // Notifier for event. This is called with the updated event state.
+ virtual void OnLibEvdevCrosEvent(Evdev* evdev,
+ EventStateRec* state,
+ const timeval& time) = 0;
+ };
+
+ EventReaderLibevdevCros(int fd,
+ const base::FilePath& path,
+ scoped_ptr<Delegate> delegate);
+ ~EventReaderLibevdevCros();
+
+ // Overridden from ui::EventDeviceEvdev.
+ void Start() OVERRIDE;
+ void Stop() OVERRIDE;
+
+ // Overidden from MessagePumpLibevent::Watcher.
+ virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE;
+ virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE;
+
+ private:
+ static void OnSynReport(void* data,
+ EventStateRec* evstate,
+ struct timeval* tv);
+ static void OnLogMessage(void*, int level, const char*, ...);
+
+ // Libevdev state.
+ Evdev evdev_;
+
+ // Event state.
+ EventStateRec evstate_;
+
+ // Path to input device.
+ base::FilePath path_;
+
+ // Delegate for event processing.
+ scoped_ptr<Delegate> delegate_;
+
+ // Controller for watching the input fd.
+ base::MessagePumpLibevent::FileDescriptorWatcher controller_;
+
+ DISALLOW_COPY_AND_ASSIGN(EventReaderLibevdevCros);
+};
+
+} // namspace ui
+
+#endif // UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_EVENT_READER_LIBEVDEV_CROS_H_
diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc
new file mode 100644
index 0000000000..503155a7c4
--- /dev/null
+++ b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc
@@ -0,0 +1,266 @@
+// 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 "ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h"
+
+#include <gestures/gestures.h>
+#include <libevdev/libevdev.h>
+
+#include "base/strings/stringprintf.h"
+#include "base/timer/timer.h"
+#include "ui/events/event.h"
+#include "ui/events/ozone/evdev/cursor_delegate_evdev.h"
+#include "ui/events/ozone/evdev/event_modifiers_evdev.h"
+#include "ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h"
+#include "ui/gfx/geometry/point_f.h"
+
+namespace ui {
+
+namespace {
+
+// Convert libevdev device class to libgestures device class.
+GestureInterpreterDeviceClass GestureDeviceClass(Evdev* evdev) {
+ switch (evdev->info.evdev_class) {
+ case EvdevClassMouse:
+ return GESTURES_DEVCLASS_MOUSE;
+ case EvdevClassMultitouchMouse:
+ return GESTURES_DEVCLASS_MULTITOUCH_MOUSE;
+ case EvdevClassTouchpad:
+ return GESTURES_DEVCLASS_TOUCHPAD;
+ case EvdevClassTouchscreen:
+ return GESTURES_DEVCLASS_TOUCHSCREEN;
+ default:
+ return GESTURES_DEVCLASS_UNKNOWN;
+ }
+}
+
+// Convert libevdev state to libgestures hardware properties.
+HardwareProperties GestureHardwareProperties(Evdev* evdev) {
+ HardwareProperties hwprops;
+ hwprops.left = Event_Get_Left(evdev);
+ hwprops.top = Event_Get_Top(evdev);
+ hwprops.right = Event_Get_Right(evdev);
+ hwprops.bottom = Event_Get_Bottom(evdev);
+ hwprops.res_x = Event_Get_Res_X(evdev);
+ hwprops.res_y = Event_Get_Res_Y(evdev);
+ hwprops.screen_x_dpi = 133;
+ hwprops.screen_y_dpi = 133;
+ hwprops.orientation_minimum = Event_Get_Orientation_Minimum(evdev);
+ hwprops.orientation_maximum = Event_Get_Orientation_Maximum(evdev);
+ hwprops.max_finger_cnt = Event_Get_Slot_Count(evdev);
+ hwprops.max_touch_cnt = Event_Get_Touch_Count_Max(evdev);
+ hwprops.supports_t5r2 = Event_Get_T5R2(evdev);
+ hwprops.support_semi_mt = Event_Get_Semi_MT(evdev);
+ /* buttonpad means a physical button under the touch surface */
+ hwprops.is_button_pad = Event_Get_Button_Pad(evdev);
+ return hwprops;
+}
+
+// Callback from libgestures when a gesture is ready.
+void OnGestureReadyHelper(void* client_data, const Gesture* gesture) {
+ GestureInterpreterLibevdevCros* interpreter =
+ static_cast<GestureInterpreterLibevdevCros*>(client_data);
+ interpreter->OnGestureReady(gesture);
+}
+
+// Convert gestures timestamp (stime_t) to ui::Event timestamp.
+base::TimeDelta StimeToTimedelta(stime_t timestamp) {
+ return base::TimeDelta::FromMicroseconds(timestamp *
+ base::Time::kMicrosecondsPerSecond);
+}
+
+// Number of fingers for scroll gestures.
+const int kGestureScrollFingerCount = 2;
+
+} // namespace
+
+GestureInterpreterLibevdevCros::GestureInterpreterLibevdevCros(
+ EventModifiersEvdev* modifiers,
+ CursorDelegateEvdev* cursor,
+ const EventDispatchCallback& callback)
+ : modifiers_(modifiers),
+ cursor_(cursor),
+ dispatch_callback_(callback),
+ interpreter_(NULL) {}
+
+GestureInterpreterLibevdevCros::~GestureInterpreterLibevdevCros() {
+ if (interpreter_) {
+ DeleteGestureInterpreter(interpreter_);
+ interpreter_ = NULL;
+ }
+}
+
+void GestureInterpreterLibevdevCros::OnLibEvdevCrosOpen(
+ Evdev* evdev,
+ EventStateRec* evstate) {
+ CHECK(evdev->info.is_monotonic) << "libevdev must use monotonic timestamps";
+ VLOG(9) << "HACK DO NOT REMOVE OR LINK WILL FAIL" << (void*)gestures_log;
+
+ HardwareProperties hwprops = GestureHardwareProperties(evdev);
+ GestureInterpreterDeviceClass devclass = GestureDeviceClass(evdev);
+
+ // Create & initialize GestureInterpreter.
+ CHECK(!interpreter_);
+ interpreter_ = NewGestureInterpreter();
+ GestureInterpreterInitialize(interpreter_, devclass);
+ GestureInterpreterSetHardwareProperties(interpreter_, &hwprops);
+ GestureInterpreterSetTimerProvider(
+ interpreter_,
+ const_cast<GesturesTimerProvider*>(&kGestureTimerProvider),
+ this);
+ GestureInterpreterSetCallback(interpreter_, OnGestureReadyHelper, this);
+}
+
+void GestureInterpreterLibevdevCros::OnLibEvdevCrosEvent(Evdev* evdev,
+ EventStateRec* evstate,
+ const timeval& time) {
+ HardwareState hwstate;
+ memset(&hwstate, 0, sizeof(hwstate));
+ hwstate.timestamp = StimeFromTimeval(&time);
+
+ // Mouse.
+ hwstate.rel_x = evstate->rel_x;
+ hwstate.rel_y = evstate->rel_y;
+ hwstate.rel_wheel = evstate->rel_wheel;
+ hwstate.rel_hwheel = evstate->rel_hwheel;
+
+ // Touch.
+ FingerState fingers[Event_Get_Slot_Count(evdev)];
+ memset(&fingers, 0, sizeof(fingers));
+ int current_finger = 0;
+ for (int i = 0; i < evstate->slot_count; i++) {
+ MtSlotPtr slot = &evstate->slots[i];
+ if (slot->tracking_id == -1)
+ continue;
+ fingers[current_finger].touch_major = slot->touch_major;
+ fingers[current_finger].touch_minor = slot->touch_minor;
+ fingers[current_finger].width_major = slot->width_major;
+ fingers[current_finger].width_minor = slot->width_minor;
+ fingers[current_finger].pressure = slot->pressure;
+ fingers[current_finger].orientation = slot->orientation;
+ fingers[current_finger].position_x = slot->position_x;
+ fingers[current_finger].position_y = slot->position_y;
+ fingers[current_finger].tracking_id = slot->tracking_id;
+ current_finger++;
+ }
+ hwstate.touch_cnt = Event_Get_Touch_Count(evdev);
+ hwstate.finger_cnt = current_finger;
+ hwstate.fingers = fingers;
+
+ // Buttons.
+ if (Event_Get_Button_Left(evdev))
+ hwstate.buttons_down |= GESTURES_BUTTON_LEFT;
+ if (Event_Get_Button_Middle(evdev))
+ hwstate.buttons_down |= GESTURES_BUTTON_MIDDLE;
+ if (Event_Get_Button_Right(evdev))
+ hwstate.buttons_down |= GESTURES_BUTTON_RIGHT;
+
+ GestureInterpreterPushHardwareState(interpreter_, &hwstate);
+}
+
+void GestureInterpreterLibevdevCros::OnGestureReady(const Gesture* gesture) {
+ switch (gesture->type) {
+ case kGestureTypeMove:
+ OnGestureMove(gesture, &gesture->details.move);
+ break;
+ case kGestureTypeScroll:
+ OnGestureScroll(gesture, &gesture->details.scroll);
+ break;
+ case kGestureTypeButtonsChange:
+ OnGestureButtonsChange(gesture, &gesture->details.buttons);
+ break;
+ case kGestureTypeContactInitiated:
+ case kGestureTypeFling:
+ case kGestureTypeSwipe:
+ case kGestureTypeSwipeLift:
+ case kGestureTypePinch:
+ case kGestureTypeMetrics:
+ // TODO(spang): Support remaining gestures.
+ NOTIMPLEMENTED();
+ break;
+ default:
+ LOG(WARNING) << base::StringPrintf("Unrecognized gesture type (%u)",
+ gesture->type);
+ break;
+ }
+}
+
+void GestureInterpreterLibevdevCros::OnGestureMove(const Gesture* gesture,
+ const GestureMove* move) {
+ DVLOG(3) << base::StringPrintf("Gesture Move: (%f, %f) [%f, %f]",
+ move->dx,
+ move->dy,
+ move->ordinal_dx,
+ move->ordinal_dy);
+ if (!cursor_)
+ return; // No cursor!
+ cursor_->MoveCursor(gfx::Vector2dF(move->dx, move->dy));
+ // TODO(spang): Use move->ordinal_dx, move->ordinal_dy
+ // TODO(spang): Use move->start_time, move->end_time
+ MouseEvent event(ET_MOUSE_MOVED,
+ cursor_->location(),
+ cursor_->location(),
+ modifiers_->GetModifierFlags(),
+ /* changed_button_flags */ 0);
+ Dispatch(&event);
+}
+
+void GestureInterpreterLibevdevCros::OnGestureScroll(
+ const Gesture* gesture,
+ const GestureScroll* scroll) {
+ DVLOG(3) << base::StringPrintf("Gesture Scroll: (%f, %f) [%f, %f]",
+ scroll->dx,
+ scroll->dy,
+ scroll->ordinal_dx,
+ scroll->ordinal_dy);
+ // TODO(spang): Support SetNaturalScroll
+ // TODO(spang): Use scroll->start_time
+ ScrollEvent event(ET_SCROLL,
+ cursor_->location(),
+ StimeToTimedelta(gesture->end_time),
+ modifiers_->GetModifierFlags(),
+ scroll->dx,
+ scroll->dy,
+ scroll->ordinal_dx,
+ scroll->ordinal_dy,
+ kGestureScrollFingerCount);
+ Dispatch(&event);
+}
+
+void GestureInterpreterLibevdevCros::OnGestureButtonsChange(
+ const Gesture* gesture,
+ const GestureButtonsChange* buttons) {
+ DVLOG(3) << base::StringPrintf("Gesture Button Change: down=0x%02x up=0x%02x",
+ buttons->down,
+ buttons->up);
+ // TODO(spang): Use buttons->start_time, buttons->end_time
+ if (buttons->down & GESTURES_BUTTON_LEFT)
+ DispatchMouseButton(EVDEV_MODIFIER_LEFT_MOUSE_BUTTON, true);
+ if (buttons->down & GESTURES_BUTTON_MIDDLE)
+ DispatchMouseButton(EVDEV_MODIFIER_MIDDLE_MOUSE_BUTTON, true);
+ if (buttons->down & GESTURES_BUTTON_RIGHT)
+ DispatchMouseButton(EVDEV_MODIFIER_RIGHT_MOUSE_BUTTON, true);
+ if (buttons->up & GESTURES_BUTTON_LEFT)
+ DispatchMouseButton(EVDEV_MODIFIER_LEFT_MOUSE_BUTTON, false);
+ if (buttons->up & GESTURES_BUTTON_MIDDLE)
+ DispatchMouseButton(EVDEV_MODIFIER_MIDDLE_MOUSE_BUTTON, false);
+ if (buttons->up & GESTURES_BUTTON_RIGHT)
+ DispatchMouseButton(EVDEV_MODIFIER_RIGHT_MOUSE_BUTTON, false);
+}
+
+void GestureInterpreterLibevdevCros::Dispatch(Event* event) {
+ dispatch_callback_.Run(event);
+}
+
+void GestureInterpreterLibevdevCros::DispatchMouseButton(unsigned int modifier,
+ bool down) {
+ const gfx::PointF& loc = cursor_->location();
+ int flag = modifiers_->GetEventFlagFromModifier(modifier);
+ EventType type = (down ? ET_MOUSE_PRESSED : ET_MOUSE_RELEASED);
+ modifiers_->UpdateModifier(modifier, down);
+ MouseEvent event(type, loc, loc, modifiers_->GetModifierFlags() | flag, flag);
+ Dispatch(&event);
+}
+
+} // namespace ui
diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h
new file mode 100644
index 0000000000..66bbef37ed
--- /dev/null
+++ b/ui/events/ozone/evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h
@@ -0,0 +1,82 @@
+// 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 UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_INTERPRETER_LIBEVDEV_CROS_H_
+#define UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_INTERPRETER_LIBEVDEV_CROS_H_
+
+#include <gestures/gestures.h>
+#include <libevdev/libevdev.h>
+
+#include "base/callback.h"
+#include "base/memory/scoped_ptr.h"
+#include "ui/events/events_export.h"
+#include "ui/events/ozone/evdev/cursor_delegate_evdev.h"
+#include "ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h"
+
+namespace ui {
+
+class Event;
+class EventDeviceInfo;
+class EventModifiersEvdev;
+class CursorDelegateEvdev;
+
+typedef base::Callback<void(Event*)> EventDispatchCallback;
+
+// Convert libevdev-cros events to ui::Events using libgestures.
+//
+// This builds a GestureInterpreter for an input device (touchpad or
+// mouse).
+//
+// Raw input events must be preprocessed into a form suitable for
+// libgestures. The kernel protocol only emits changes to the device state,
+// so changes must be accumulated until a sync event. The full device state
+// at sync is then processed by libgestures.
+//
+// Once we have the state at sync, we convert it to a HardwareState object
+// and forward it to libgestures. If any gestures are produced, they are
+// converted to ui::Events and dispatched.
+class EVENTS_EXPORT GestureInterpreterLibevdevCros
+ : public EventReaderLibevdevCros::Delegate {
+ public:
+ GestureInterpreterLibevdevCros(EventModifiersEvdev* modifiers,
+ CursorDelegateEvdev* cursor,
+ const EventDispatchCallback& callback);
+ virtual ~GestureInterpreterLibevdevCros();
+
+ // Overriden from ui::EventReaderLibevdevCros::Delegate
+ virtual void OnLibEvdevCrosOpen(Evdev* evdev,
+ EventStateRec* evstate) OVERRIDE;
+ virtual void OnLibEvdevCrosEvent(Evdev* evdev,
+ EventStateRec* evstate,
+ const timeval& time) OVERRIDE;
+
+ // Handler for gesture events generated from libgestures.
+ void OnGestureReady(const Gesture* gesture);
+
+ private:
+ void OnGestureMove(const Gesture* gesture, const GestureMove* move);
+ void OnGestureScroll(const Gesture* gesture, const GestureScroll* move);
+ void OnGestureButtonsChange(const Gesture* gesture,
+ const GestureButtonsChange* move);
+ void Dispatch(Event* event);
+ void DispatchMouseButton(unsigned int modifier, bool down);
+
+ // Shared modifier state.
+ EventModifiersEvdev* modifiers_;
+
+ // Shared cursor state.
+ CursorDelegateEvdev* cursor_;
+
+ // Callback for dispatching events.
+ EventDispatchCallback dispatch_callback_;
+
+ // Gestures interpretation state.
+ gestures::GestureInterpreter* interpreter_;
+
+ DISALLOW_COPY_AND_ASSIGN(GestureInterpreterLibevdevCros);
+};
+
+} // namspace ui
+
+#endif // UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_INTERPRETER_LIBEVDEV_CROS_H_
diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_logging.cc b/ui/events/ozone/evdev/libgestures_glue/gesture_logging.cc
new file mode 100644
index 0000000000..009fc93902
--- /dev/null
+++ b/ui/events/ozone/evdev/libgestures_glue/gesture_logging.cc
@@ -0,0 +1,32 @@
+// 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 "ui/events/ozone/evdev/libgestures_glue/gesture_logging.h"
+
+#include <gestures/gestures.h>
+#include <stdarg.h>
+
+#include "base/logging.h"
+#include "base/strings/stringprintf.h"
+
+namespace {
+
+std::string FormatLog(const char* fmt, va_list args) {
+ std::string msg = base::StringPrintV(fmt, args);
+ if (!msg.empty() && msg[msg.size() - 1] == '\n')
+ msg.erase(msg.end() - 1, msg.end());
+ return msg;
+}
+
+} // namespace
+
+void gestures_log(int verb, const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ if (verb <= GESTURES_LOG_ERROR)
+ LOG(ERROR) << "gestures: " << FormatLog(fmt, args);
+ else if (verb <= GESTURES_LOG_INFO)
+ VLOG(3) << "gestures: " << FormatLog(fmt, args);
+ va_end(args);
+}
diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_logging.h b/ui/events/ozone/evdev/libgestures_glue/gesture_logging.h
new file mode 100644
index 0000000000..a5f543556a
--- /dev/null
+++ b/ui/events/ozone/evdev/libgestures_glue/gesture_logging.h
@@ -0,0 +1,15 @@
+// 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 UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_LOGGING_H_
+#define UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_LOGGING_H_
+
+// libgestures.so binds to this function for logging.
+// TODO(spang): Fix libgestures to not require this.
+extern "C"
+ __attribute__((visibility("default"))) void gestures_log(int verb,
+ const char* fmt,
+ ...);
+
+#endif // UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_LOGGING_H_
diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc b/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc
new file mode 100644
index 0000000000..92f15b7782
--- /dev/null
+++ b/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.cc
@@ -0,0 +1,72 @@
+// 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 "ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h"
+
+#include <gestures/gestures.h>
+
+#include "base/timer/timer.h"
+
+// libgestures requires that this be in the top level namespace.
+class GesturesTimer {
+ public:
+ GesturesTimer() : callback_(NULL), callback_data_(NULL) {}
+ ~GesturesTimer() {}
+
+ void Set(stime_t delay, GesturesTimerCallback callback, void* callback_data) {
+ callback_ = callback;
+ callback_data_ = callback_data;
+ timer_.Start(FROM_HERE,
+ base::TimeDelta::FromMicroseconds(
+ delay * base::Time::kMicrosecondsPerSecond),
+ this,
+ &GesturesTimer::OnTimerExpired);
+ }
+
+ void Cancel() { timer_.Stop(); }
+
+ private:
+ void OnTimerExpired() {
+ struct timespec ts;
+ CHECK(!clock_gettime(CLOCK_MONOTONIC, &ts));
+ stime_t next_delay = callback_(StimeFromTimespec(&ts), callback_data_);
+ if (next_delay >= 0) {
+ timer_.Start(FROM_HERE,
+ base::TimeDelta::FromMicroseconds(
+ next_delay * base::Time::kMicrosecondsPerSecond),
+ this,
+ &GesturesTimer::OnTimerExpired);
+ }
+ }
+
+ GesturesTimerCallback callback_;
+ void* callback_data_;
+ base::OneShotTimer<GesturesTimer> timer_;
+};
+
+namespace ui {
+
+namespace {
+
+GesturesTimer* GesturesTimerCreate(void* data) { return new GesturesTimer; }
+
+void GesturesTimerSet(void* data,
+ GesturesTimer* timer,
+ stime_t delay,
+ GesturesTimerCallback callback,
+ void* callback_data) {
+ timer->Set(delay, callback, callback_data);
+}
+
+void GesturesTimerCancel(void* data, GesturesTimer* timer) { timer->Cancel(); }
+
+void GesturesTimerFree(void* data, GesturesTimer* timer) { delete timer; }
+
+} // namespace
+
+const GesturesTimerProvider kGestureTimerProvider = {
+ GesturesTimerCreate, GesturesTimerSet, GesturesTimerCancel,
+ GesturesTimerFree};
+
+} // namespace ui
diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h b/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h
new file mode 100644
index 0000000000..edc20ba9c0
--- /dev/null
+++ b/ui/events/ozone/evdev/libgestures_glue/gesture_timer_provider.h
@@ -0,0 +1,16 @@
+// 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 UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_TIMER_PROVIDER_H_
+#define UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_TIMER_PROVIDER_H_
+
+#include <gestures/gestures.h>
+
+namespace ui {
+
+extern const GesturesTimerProvider kGestureTimerProvider;
+
+} // namspace ui
+
+#endif // UI_EVENTS_OZONE_EVDEV_LIBGESTURES_GLUE_GESTURE_TIMER_PROVIDER_H_
diff --git a/ui/events/ozone/evdev/touch_event_converter_evdev.cc b/ui/events/ozone/evdev/touch_event_converter_evdev.cc
index 8d27e84a26..9efa8fcb65 100644
--- a/ui/events/ozone/evdev/touch_event_converter_evdev.cc
+++ b/ui/events/ozone/evdev/touch_event_converter_evdev.cc
@@ -16,11 +16,16 @@
#include "base/bind.h"
#include "base/callback.h"
+#include "base/command_line.h"
#include "base/logging.h"
#include "base/memory/scoped_vector.h"
#include "base/message_loop/message_loop.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
#include "ui/events/event.h"
#include "ui/events/event_constants.h"
+#include "ui/events/event_switches.h"
#include "ui/events/ozone/event_factory_ozone.h"
#include "ui/gfx/screen.h"
@@ -30,21 +35,60 @@ namespace {
// TODO(rjkroege): Configure this per device.
const float kFingerWidth = 25.f;
+struct TouchCalibration {
+ int bezel_left;
+ int bezel_right;
+ int bezel_top;
+ int bezel_bottom;
+};
+
+void GetTouchCalibration(TouchCalibration* cal) {
+ std::vector<std::string> parts;
+ if (Tokenize(CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ switches::kTouchCalibration),
+ ",",
+ &parts) >= 4) {
+ if (!base::StringToInt(parts[0], &cal->bezel_left))
+ DLOG(ERROR) << "Incorrect left border calibration value passed.";
+ if (!base::StringToInt(parts[1], &cal->bezel_right))
+ DLOG(ERROR) << "Incorrect right border calibration value passed.";
+ if (!base::StringToInt(parts[2], &cal->bezel_top))
+ DLOG(ERROR) << "Incorrect top border calibration value passed.";
+ if (!base::StringToInt(parts[3], &cal->bezel_bottom))
+ DLOG(ERROR) << "Incorrect bottom border calibration value passed.";
+ }
+}
+
+float TuxelsToPixels(float val,
+ float min_tuxels,
+ float num_tuxels,
+ float min_pixels,
+ float num_pixels) {
+ // Map [min_tuxels, min_tuxels + num_tuxels) to
+ // [min_pixels, min_pixels + num_pixels).
+ return min_pixels + (val - min_tuxels) * num_pixels / num_tuxels;
+}
+
} // namespace
namespace ui {
-TouchEventConverterEvdev::TouchEventConverterEvdev(int fd,
- base::FilePath path,
- const EventDeviceInfo& info)
- : pressure_min_(info.GetAbsMinimum(ABS_MT_PRESSURE)),
+TouchEventConverterEvdev::TouchEventConverterEvdev(
+ int fd,
+ base::FilePath path,
+ const EventDeviceInfo& info,
+ const EventDispatchCallback& callback)
+ : EventConverterEvdev(callback),
+ pressure_min_(info.GetAbsMinimum(ABS_MT_PRESSURE)),
pressure_max_(info.GetAbsMaximum(ABS_MT_PRESSURE)),
- x_scale_(1.),
- y_scale_(1.),
- x_min_(info.GetAbsMinimum(ABS_MT_POSITION_X)),
- x_max_(info.GetAbsMaximum(ABS_MT_POSITION_X)),
- y_min_(info.GetAbsMinimum(ABS_MT_POSITION_Y)),
- y_max_(info.GetAbsMaximum(ABS_MT_POSITION_Y)),
+ x_min_tuxels_(info.GetAbsMinimum(ABS_MT_POSITION_X)),
+ x_num_tuxels_(info.GetAbsMaximum(ABS_MT_POSITION_X) - x_min_tuxels_ + 1),
+ y_min_tuxels_(info.GetAbsMinimum(ABS_MT_POSITION_Y)),
+ y_num_tuxels_(info.GetAbsMaximum(ABS_MT_POSITION_Y) - y_min_tuxels_ + 1),
+ x_min_pixels_(x_min_tuxels_),
+ x_num_pixels_(x_num_tuxels_),
+ y_min_pixels_(y_min_tuxels_),
+ y_num_pixels_(y_num_tuxels_),
current_slot_(0),
fd_(fd),
path_(path) {
@@ -63,9 +107,29 @@ void TouchEventConverterEvdev::Init() {
gfx::Display display = screen->GetPrimaryDisplay();
gfx::Size size = display.GetSizeInPixel();
- x_scale_ = (double)size.width() / (x_max_ - x_min_);
- y_scale_ = (double)size.height() / (y_max_ - y_min_);
- VLOG(1) << "touch scaling x_scale=" << x_scale_ << " y_scale=" << y_scale_;
+ // Map coordinates onto screen.
+ x_min_pixels_ = 0;
+ y_min_pixels_ = 0;
+ x_num_pixels_ = size.width();
+ y_num_pixels_ = size.height();
+
+ VLOG(1) << "mapping touch coordinates to screen coordinates: "
+ << base::StringPrintf("%dx%d", size.width(), size.height());
+
+ // Apply --touch-calibration.
+ TouchCalibration cal = {};
+ GetTouchCalibration(&cal);
+ x_min_tuxels_ += cal.bezel_left;
+ x_num_tuxels_ -= cal.bezel_left + cal.bezel_right;
+ y_min_tuxels_ += cal.bezel_top;
+ y_num_tuxels_ -= cal.bezel_top + cal.bezel_bottom;
+
+ VLOG(1) << "applying touch calibration: "
+ << base::StringPrintf("[%d, %d, %d, %d]",
+ cal.bezel_left,
+ cal.bezel_right,
+ cal.bezel_top,
+ cal.bezel_bottom);
}
void TouchEventConverterEvdev::Start() {
@@ -106,12 +170,20 @@ void TouchEventConverterEvdev::OnFileCanReadWithoutBlocking(int fd) {
case ABS_X:
case ABS_MT_POSITION_X:
altered_slots_.set(current_slot_);
- events_[current_slot_].x_ = roundf(input.value * x_scale_);
+ events_[current_slot_].x_ = TuxelsToPixels(input.value,
+ x_min_tuxels_,
+ x_num_tuxels_,
+ x_min_pixels_,
+ x_num_pixels_);
break;
case ABS_Y:
case ABS_MT_POSITION_Y:
altered_slots_.set(current_slot_);
- events_[current_slot_].y_ = roundf(input.value * y_scale_);
+ events_[current_slot_].y_ = TuxelsToPixels(input.value,
+ y_min_tuxels_,
+ y_num_tuxels_,
+ y_min_pixels_,
+ y_num_pixels_);
break;
case ABS_MT_TRACKING_ID:
altered_slots_.set(current_slot_);
@@ -143,8 +215,7 @@ void TouchEventConverterEvdev::OnFileCanReadWithoutBlocking(int fd) {
// TODO(rjkroege): Support elliptical finger regions.
touch_events.push_back(new TouchEvent(
events_[j].type_,
- gfx::Point(std::min(x_max_, events_[j].x_),
- std::min(y_max_, events_[j].y_)),
+ gfx::PointF(events_[j].x_, events_[j].y_),
/* flags */ 0,
/* touch_id */ j,
base::TimeDelta::FromMicroseconds(
diff --git a/ui/events/ozone/evdev/touch_event_converter_evdev.h b/ui/events/ozone/evdev/touch_event_converter_evdev.h
index dea3ce8685..a1b81a6c0e 100644
--- a/ui/events/ozone/evdev/touch_event_converter_evdev.h
+++ b/ui/events/ozone/evdev/touch_event_converter_evdev.h
@@ -28,7 +28,8 @@ class EVENTS_EXPORT TouchEventConverterEvdev
};
TouchEventConverterEvdev(int fd,
base::FilePath path,
- const EventDeviceInfo& info);
+ const EventDeviceInfo& info,
+ const EventDispatchCallback& dispatch);
virtual ~TouchEventConverterEvdev();
// Start & stop watching for events.
@@ -49,17 +50,21 @@ class EVENTS_EXPORT TouchEventConverterEvdev
int pressure_min_;
int pressure_max_; // Used to normalize pressure values.
- // Touch scaling.
- float x_scale_;
- float y_scale_;
+ // Input range for x-axis.
+ float x_min_tuxels_;
+ float x_num_tuxels_;
- // Range for x-axis.
- int x_min_;
- int x_max_;
+ // Input range for y-axis.
+ float y_min_tuxels_;
+ float y_num_tuxels_;
- // Range for y-axis.
- int y_min_;
- int y_max_;
+ // Output range for x-axis.
+ float x_min_pixels_;
+ float x_num_pixels_;
+
+ // Output range for y-axis.
+ float y_min_pixels_;
+ float y_num_pixels_;
// Touch point currently being updated from the /dev/input/event* stream.
int current_slot_;
@@ -75,8 +80,8 @@ class EVENTS_EXPORT TouchEventConverterEvdev
std::bitset<MAX_FINGERS> altered_slots_;
struct InProgressEvents {
- int x_;
- int y_;
+ float x_;
+ float y_;
int id_; // Device reported "unique" touch point id; -1 means not active
int finger_; // "Finger" id starting from 0; -1 means not active
diff --git a/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc b/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc
index 472e79eb03..3fddb46a4f 100644
--- a/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc
+++ b/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc
@@ -53,7 +53,7 @@ class MockTouchEventConverterEvdev : public TouchEventConverterEvdev {
base::RunLoop().RunUntilIdle();
}
- void DispatchCallback(void* event) {
+ void DispatchCallback(Event* event) {
dispatched_events_.push_back(
new TouchEvent(*static_cast<TouchEvent*>(event)));
}
@@ -69,15 +69,20 @@ class MockTouchEventConverterEvdev : public TouchEventConverterEvdev {
MockTouchEventConverterEvdev::MockTouchEventConverterEvdev(int fd,
base::FilePath path)
- : TouchEventConverterEvdev(fd, path, EventDeviceInfo()) {
+ : TouchEventConverterEvdev(
+ fd,
+ path,
+ EventDeviceInfo(),
+ base::Bind(&MockTouchEventConverterEvdev::DispatchCallback,
+ base::Unretained(this))) {
pressure_min_ = 30;
pressure_max_ = 60;
// TODO(rjkroege): Check test axes.
- x_min_ = 0;
- x_max_ = std::numeric_limits<int>::max();
- y_min_ = 0;
- y_max_ = std::numeric_limits<int>::max();
+ x_min_pixels_ = x_min_tuxels_ = 0;
+ x_num_pixels_ = x_num_tuxels_ = std::numeric_limits<int>::max();
+ y_min_pixels_ = y_min_tuxels_ = 0;
+ y_num_pixels_ = y_num_tuxels_ = std::numeric_limits<int>::max();
int fds[2];
@@ -122,9 +127,6 @@ class TouchEventConverterEvdevTest : public testing::Test {
loop_ = new base::MessageLoopForUI;
device_ = new ui::MockTouchEventConverterEvdev(
events_in_, base::FilePath(kTestDevicePath));
- device_->SetDispatchCallback(
- base::Bind(&ui::MockTouchEventConverterEvdev::DispatchCallback,
- base::Unretained(device_)));
}
virtual void TearDown() OVERRIDE {
diff --git a/ui/events/platform/platform_event_source.cc b/ui/events/platform/platform_event_source.cc
index a1a79ce4f6..4abb4bad7d 100644
--- a/ui/events/platform/platform_event_source.cc
+++ b/ui/events/platform/platform_event_source.cc
@@ -34,17 +34,12 @@ PlatformEventSource* PlatformEventSource::GetInstance() { return instance_; }
void PlatformEventSource::AddPlatformEventDispatcher(
PlatformEventDispatcher* dispatcher) {
CHECK(dispatcher);
- DCHECK(std::find(dispatchers_.begin(), dispatchers_.end(), dispatcher) ==
- dispatchers_.end());
- dispatchers_.push_back(dispatcher);
+ dispatchers_.AddObserver(dispatcher);
}
void PlatformEventSource::RemovePlatformEventDispatcher(
PlatformEventDispatcher* dispatcher) {
- PlatformEventDispatcherList::iterator remove =
- std::remove(dispatchers_.begin(), dispatchers_.end(), dispatcher);
- if (remove != dispatchers_.end())
- dispatchers_.erase(remove);
+ dispatchers_.RemoveObserver(dispatcher);
}
scoped_ptr<ScopedEventDispatcher> PlatformEventSource::OverrideDispatcher(
@@ -77,11 +72,10 @@ uint32_t PlatformEventSource::DispatchEvent(PlatformEvent platform_event) {
action = overridden_dispatcher_->DispatchEvent(platform_event);
should_quit = !!(action & POST_DISPATCH_QUIT_LOOP);
- if (action & POST_DISPATCH_PERFORM_DEFAULT) {
- for (PlatformEventDispatcherList::iterator i = dispatchers_.begin();
- i != dispatchers_.end();
- ++i) {
- PlatformEventDispatcher* dispatcher = *(i);
+ if ((action & POST_DISPATCH_PERFORM_DEFAULT) &&
+ dispatchers_.might_have_observers()) {
+ ObserverList<PlatformEventDispatcher>::Iterator iter(dispatchers_);
+ while (PlatformEventDispatcher* dispatcher = iter.GetNext()) {
if (dispatcher->CanDispatchEvent(platform_event))
action = dispatcher->DispatchEvent(platform_event);
if (action & POST_DISPATCH_QUIT_LOOP)
diff --git a/ui/events/platform/platform_event_source.h b/ui/events/platform/platform_event_source.h
index 407085cfc7..d5867cd54d 100644
--- a/ui/events/platform/platform_event_source.h
+++ b/ui/events/platform/platform_event_source.h
@@ -30,7 +30,14 @@ class EVENTS_EXPORT PlatformEventSource {
static PlatformEventSource* GetInstance();
+ // Adds a dispatcher to the dispatcher list. If a dispatcher is added during
+ // dispatching an event, then the newly added dispatcher also receives that
+ // event.
void AddPlatformEventDispatcher(PlatformEventDispatcher* dispatcher);
+
+ // Removes a dispatcher from the dispatcher list. Dispatchers can safely be
+ // removed from the dispatcher list during an event is being dispatched,
+ // without affecting the dispatch of the event to other existing dispatchers.
void RemovePlatformEventDispatcher(PlatformEventDispatcher* dispatcher);
// Installs a PlatformEventDispatcher that receives all the events. The
@@ -65,7 +72,10 @@ class EVENTS_EXPORT PlatformEventSource {
void OnOverriddenDispatcherRestored();
- typedef std::vector<PlatformEventDispatcher*> PlatformEventDispatcherList;
+ // Use an ObserverList<> instead of an std::vector<> to store the list of
+ // dispatchers, so that adding/removing dispatchers during an event dispatch
+ // is well-defined.
+ typedef ObserverList<PlatformEventDispatcher> PlatformEventDispatcherList;
PlatformEventDispatcherList dispatchers_;
PlatformEventDispatcher* overridden_dispatcher_;
diff --git a/ui/events/platform/platform_event_source_unittest.cc b/ui/events/platform/platform_event_source_unittest.cc
index 78b7cc4448..fa5e9eff7f 100644
--- a/ui/events/platform/platform_event_source_unittest.cc
+++ b/ui/events/platform/platform_event_source_unittest.cc
@@ -27,6 +27,20 @@ scoped_ptr<PlatformEvent> CreatePlatformEvent() {
template <typename T>
void DestroyScopedPtr(scoped_ptr<T> object) {}
+void RemoveDispatcher(PlatformEventDispatcher* dispatcher) {
+ PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(dispatcher);
+}
+
+void RemoveDispatchers(PlatformEventDispatcher* first,
+ PlatformEventDispatcher* second) {
+ PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(first);
+ PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(second);
+}
+
+void AddDispatcher(PlatformEventDispatcher* dispatcher) {
+ PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(dispatcher);
+}
+
} // namespace
class TestPlatformEventSource : public PlatformEventSource {
@@ -302,6 +316,170 @@ TEST_F(PlatformEventTest, OverriddenDispatcherInvokeDefaultDispatcher) {
EXPECT_EQ(10, list[2]);
}
+// Runs a callback during an event dispatch.
+class RunCallbackDuringDispatch : public TestPlatformEventDispatcher {
+ public:
+ RunCallbackDuringDispatch(int id, std::vector<int>* list)
+ : TestPlatformEventDispatcher(id, list) {}
+ virtual ~RunCallbackDuringDispatch() {}
+
+ void set_callback(const base::Closure& callback) {
+ callback_ = callback;
+ }
+
+ protected:
+ // PlatformEventDispatcher:
+ virtual uint32_t DispatchEvent(const PlatformEvent& event) OVERRIDE {
+ if (!callback_.is_null())
+ callback_.Run();
+ return TestPlatformEventDispatcher::DispatchEvent(event);
+ }
+
+ private:
+ base::Closure callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(RunCallbackDuringDispatch);
+};
+
+// Test that if a dispatcher removes another dispatcher that is later in the
+// dispatcher list during dispatching an event, then event dispatching still
+// continues correctly.
+TEST_F(PlatformEventTest, DispatcherRemovesNextDispatcherDuringDispatch) {
+ std::vector<int> list;
+ TestPlatformEventDispatcher first(10, &list);
+ RunCallbackDuringDispatch second(15, &list);
+ TestPlatformEventDispatcher third(20, &list);
+ TestPlatformEventDispatcher fourth(30, &list);
+
+ second.set_callback(base::Bind(&RemoveDispatcher, base::Unretained(&third)));
+
+ scoped_ptr<PlatformEvent> event(CreatePlatformEvent());
+ source()->Dispatch(*event);
+ // |second| removes |third| from the dispatcher list during dispatch. So the
+ // event should only reach |first|, |second|, and |fourth|.
+ ASSERT_EQ(3u, list.size());
+ EXPECT_EQ(10, list[0]);
+ EXPECT_EQ(15, list[1]);
+ EXPECT_EQ(30, list[2]);
+}
+
+// Tests that if a dispatcher removes itself from the dispatcher list during
+// dispatching an event, then event dispatching continues correctly.
+TEST_F(PlatformEventTest, DispatcherRemovesSelfDuringDispatch) {
+ std::vector<int> list;
+ TestPlatformEventDispatcher first(10, &list);
+ RunCallbackDuringDispatch second(15, &list);
+ TestPlatformEventDispatcher third(20, &list);
+
+ second.set_callback(base::Bind(&RemoveDispatcher, base::Unretained(&second)));
+
+ scoped_ptr<PlatformEvent> event(CreatePlatformEvent());
+ source()->Dispatch(*event);
+ // |second| removes itself from the dispatcher list during dispatch. So the
+ // event should reach all three dispatchers in the list.
+ ASSERT_EQ(3u, list.size());
+ EXPECT_EQ(10, list[0]);
+ EXPECT_EQ(15, list[1]);
+ EXPECT_EQ(20, list[2]);
+}
+
+// Tests that if a dispatcher removes itself from the dispatcher list during
+// dispatching an event, and this dispatcher is last in the dispatcher-list,
+// then event dispatching ends correctly.
+TEST_F(PlatformEventTest, DispatcherRemovesSelfDuringDispatchLast) {
+ std::vector<int> list;
+ TestPlatformEventDispatcher first(10, &list);
+ RunCallbackDuringDispatch second(15, &list);
+
+ second.set_callback(base::Bind(&RemoveDispatcher, base::Unretained(&second)));
+
+ scoped_ptr<PlatformEvent> event(CreatePlatformEvent());
+ source()->Dispatch(*event);
+ // |second| removes itself during dispatch. So both dispatchers will have
+ // received the event.
+ ASSERT_EQ(2u, list.size());
+ EXPECT_EQ(10, list[0]);
+ EXPECT_EQ(15, list[1]);
+}
+
+// Tests that if a dispatcher removes a single dispatcher that comes before it
+// in the dispatcher list, then dispatch continues correctly.
+TEST_F(PlatformEventTest, DispatcherRemovesPrevDispatcherDuringDispatch) {
+ std::vector<int> list;
+ TestPlatformEventDispatcher first(10, &list);
+ RunCallbackDuringDispatch second(15, &list);
+ TestPlatformEventDispatcher third(20, &list);
+
+ second.set_callback(base::Bind(&RemoveDispatcher, base::Unretained(&first)));
+
+ scoped_ptr<PlatformEvent> event(CreatePlatformEvent());
+ source()->Dispatch(*event);
+ // |second| removes |first| from the dispatcher list during dispatch. The
+ // event should reach all three dispatchers.
+ ASSERT_EQ(3u, list.size());
+ EXPECT_EQ(10, list[0]);
+ EXPECT_EQ(15, list[1]);
+ EXPECT_EQ(20, list[2]);
+}
+
+// Tests that if a dispatcher removes multiple dispatchers that comes before it
+// in the dispatcher list, then dispatch continues correctly.
+TEST_F(PlatformEventTest, DispatcherRemovesPrevDispatchersDuringDispatch) {
+ std::vector<int> list;
+ TestPlatformEventDispatcher first(10, &list);
+ TestPlatformEventDispatcher second(12, &list);
+ RunCallbackDuringDispatch third(15, &list);
+ TestPlatformEventDispatcher fourth(20, &list);
+
+ third.set_callback(base::Bind(&RemoveDispatchers,
+ base::Unretained(&first),
+ base::Unretained(&second)));
+
+ scoped_ptr<PlatformEvent> event(CreatePlatformEvent());
+ source()->Dispatch(*event);
+ // |third| removes |first| and |second| from the dispatcher list during
+ // dispatch. The event should reach all three dispatchers.
+ ASSERT_EQ(4u, list.size());
+ EXPECT_EQ(10, list[0]);
+ EXPECT_EQ(12, list[1]);
+ EXPECT_EQ(15, list[2]);
+ EXPECT_EQ(20, list[3]);
+}
+
+// Tests that adding a dispatcher during dispatching an event receives that
+// event.
+TEST_F(PlatformEventTest, DispatcherAddedDuringDispatchReceivesEvent) {
+ std::vector<int> list;
+ TestPlatformEventDispatcher first(10, &list);
+ RunCallbackDuringDispatch second(15, &list);
+ TestPlatformEventDispatcher third(20, &list);
+ TestPlatformEventDispatcher fourth(30, &list);
+ RemoveDispatchers(&third, &fourth);
+
+ scoped_ptr<PlatformEvent> event(CreatePlatformEvent());
+ source()->Dispatch(*event);
+ ASSERT_EQ(2u, list.size());
+ EXPECT_EQ(10, list[0]);
+ EXPECT_EQ(15, list[1]);
+
+ second.set_callback(base::Bind(&AddDispatcher, base::Unretained(&third)));
+ list.clear();
+ source()->Dispatch(*event);
+ ASSERT_EQ(3u, list.size());
+ EXPECT_EQ(10, list[0]);
+ EXPECT_EQ(15, list[1]);
+ EXPECT_EQ(20, list[2]);
+
+ second.set_callback(base::Bind(&AddDispatcher, base::Unretained(&fourth)));
+ list.clear();
+ source()->Dispatch(*event);
+ ASSERT_EQ(4u, list.size());
+ EXPECT_EQ(10, list[0]);
+ EXPECT_EQ(15, list[1]);
+ EXPECT_EQ(20, list[2]);
+ EXPECT_EQ(30, list[3]);
+}
+
// Provides mechanism for running tests from inside an active message-loop.
class PlatformEventTestWithMessageLoop : public PlatformEventTest {
public:
diff --git a/ui/events/platform/x11/x11_event_source.cc b/ui/events/platform/x11/x11_event_source.cc
index 910578f0bf..e074bc8e79 100644
--- a/ui/events/platform/x11/x11_event_source.cc
+++ b/ui/events/platform/x11/x11_event_source.cc
@@ -4,7 +4,6 @@
#include "ui/events/platform/x11/x11_event_source.h"
-#include <glib.h>
#include <X11/extensions/XInput2.h>
#include <X11/X.h>
#include <X11/Xlib.h>
@@ -19,42 +18,6 @@ namespace ui {
namespace {
-struct GLibX11Source : public GSource {
- // Note: The GLibX11Source is created and destroyed by GLib. So its
- // constructor/destructor may or may not get called.
- XDisplay* display;
- GPollFD* poll_fd;
-};
-
-gboolean XSourcePrepare(GSource* source, gint* timeout_ms) {
- GLibX11Source* gxsource = static_cast<GLibX11Source*>(source);
- if (XPending(gxsource->display))
- *timeout_ms = 0;
- else
- *timeout_ms = -1;
- return FALSE;
-}
-
-gboolean XSourceCheck(GSource* source) {
- GLibX11Source* gxsource = static_cast<GLibX11Source*>(source);
- return XPending(gxsource->display);
-}
-
-gboolean XSourceDispatch(GSource* source,
- GSourceFunc unused_func,
- gpointer data) {
- X11EventSource* x11_source = static_cast<X11EventSource*>(data);
- x11_source->DispatchXEvents();
- return TRUE;
-}
-
-GSourceFuncs XSourceFuncs = {
- XSourcePrepare,
- XSourceCheck,
- XSourceDispatch,
- NULL
-};
-
int g_xinput_opcode = -1;
bool InitializeXInput2(XDisplay* display) {
@@ -117,18 +80,13 @@ bool InitializeXkb(XDisplay* display) {
} // namespace
X11EventSource::X11EventSource(XDisplay* display)
- : display_(display),
- x_source_(NULL) {
+ : display_(display) {
CHECK(display_);
InitializeXInput2(display_);
InitializeXkb(display_);
-
- InitXSource();
}
X11EventSource::~X11EventSource() {
- g_source_destroy(x_source_);
- g_source_unref(x_source_);
}
// static
@@ -166,27 +124,6 @@ void X11EventSource::BlockUntilWindowMapped(XID window) {
////////////////////////////////////////////////////////////////////////////////
// X11EventSource, private
-void X11EventSource::InitXSource() {
- CHECK(!x_source_);
- CHECK(display_) << "Unable to get connection to X server";
-
- x_poll_.reset(new GPollFD());
- x_poll_->fd = ConnectionNumber(display_);
- x_poll_->events = G_IO_IN;
- x_poll_->revents = 0;
-
- GLibX11Source* glib_x_source = static_cast<GLibX11Source*>
- (g_source_new(&XSourceFuncs, sizeof(GLibX11Source)));
- glib_x_source->display = display_;
- glib_x_source->poll_fd = x_poll_.get();
-
- x_source_ = glib_x_source;
- g_source_add_poll(x_source_, x_poll_.get());
- g_source_set_can_recurse(x_source_, TRUE);
- g_source_set_callback(x_source_, NULL, this, NULL);
- g_source_attach(x_source_, g_main_context_default());
-}
-
uint32_t X11EventSource::DispatchEvent(XEvent* xevent) {
bool have_cookie = false;
if (xevent->type == GenericEvent &&
@@ -205,9 +142,4 @@ uint32_t X11EventSource::DispatchEvent(XEvent* xevent) {
return action;
}
-scoped_ptr<PlatformEventSource> PlatformEventSource::CreateDefault() {
- return scoped_ptr<PlatformEventSource>(
- new X11EventSource(gfx::GetXDisplay()));
-}
-
} // namespace ui
diff --git a/ui/events/platform/x11/x11_event_source.h b/ui/events/platform/x11/x11_event_source.h
index 93a371e4ac..b05918dfd1 100644
--- a/ui/events/platform/x11/x11_event_source.h
+++ b/ui/events/platform/x11/x11_event_source.h
@@ -41,22 +41,16 @@ class EVENTS_EXPORT X11EventSource : public PlatformEventSource {
// functions which require a mapped window.
void BlockUntilWindowMapped(XID window);
- private:
- // Initializes the glib event source for X.
- void InitXSource();
+ protected:
+ XDisplay* display() { return display_; }
+ private:
// PlatformEventSource:
virtual uint32_t DispatchEvent(XEvent* xevent) OVERRIDE;
// The connection to the X11 server used to receive the events.
XDisplay* display_;
- // The GLib event source for X events.
- GSource* x_source_;
-
- // The poll attached to |x_source_|.
- scoped_ptr<GPollFD> x_poll_;
-
DISALLOW_COPY_AND_ASSIGN(X11EventSource);
};
diff --git a/ui/events/platform/x11/x11_event_source_glib.cc b/ui/events/platform/x11/x11_event_source_glib.cc
new file mode 100644
index 0000000000..95044226b5
--- /dev/null
+++ b/ui/events/platform/x11/x11_event_source_glib.cc
@@ -0,0 +1,101 @@
+// 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 "ui/events/platform/x11/x11_event_source.h"
+
+#include <glib.h>
+#include <X11/Xlib.h>
+
+namespace ui {
+
+namespace {
+
+struct GLibX11Source : public GSource {
+ // Note: The GLibX11Source is created and destroyed by GLib. So its
+ // constructor/destructor may or may not get called.
+ XDisplay* display;
+ GPollFD* poll_fd;
+};
+
+gboolean XSourcePrepare(GSource* source, gint* timeout_ms) {
+ GLibX11Source* gxsource = static_cast<GLibX11Source*>(source);
+ if (XPending(gxsource->display))
+ *timeout_ms = 0;
+ else
+ *timeout_ms = -1;
+ return FALSE;
+}
+
+gboolean XSourceCheck(GSource* source) {
+ GLibX11Source* gxsource = static_cast<GLibX11Source*>(source);
+ return XPending(gxsource->display);
+}
+
+gboolean XSourceDispatch(GSource* source,
+ GSourceFunc unused_func,
+ gpointer data) {
+ X11EventSource* x11_source = static_cast<X11EventSource*>(data);
+ x11_source->DispatchXEvents();
+ return TRUE;
+}
+
+GSourceFuncs XSourceFuncs = {
+ XSourcePrepare,
+ XSourceCheck,
+ XSourceDispatch,
+ NULL
+};
+
+class X11EventSourceGlib : public X11EventSource {
+ public:
+ explicit X11EventSourceGlib(XDisplay* display)
+ : X11EventSource(display),
+ x_source_(NULL) {
+ InitXSource(ConnectionNumber(display));
+ }
+
+ virtual ~X11EventSourceGlib() {
+ g_source_destroy(x_source_);
+ g_source_unref(x_source_);
+ }
+
+ private:
+ void InitXSource(int fd) {
+ CHECK(!x_source_);
+ CHECK(display()) << "Unable to get connection to X server";
+
+ x_poll_.reset(new GPollFD());
+ x_poll_->fd = fd;
+ x_poll_->events = G_IO_IN;
+ x_poll_->revents = 0;
+
+ GLibX11Source* glib_x_source = static_cast<GLibX11Source*>
+ (g_source_new(&XSourceFuncs, sizeof(GLibX11Source)));
+ glib_x_source->display = display();
+ glib_x_source->poll_fd = x_poll_.get();
+
+ x_source_ = glib_x_source;
+ g_source_add_poll(x_source_, x_poll_.get());
+ g_source_set_can_recurse(x_source_, TRUE);
+ g_source_set_callback(x_source_, NULL, this, NULL);
+ g_source_attach(x_source_, g_main_context_default());
+ }
+
+ // The GLib event source for X events.
+ GSource* x_source_;
+
+ // The poll attached to |x_source_|.
+ scoped_ptr<GPollFD> x_poll_;
+
+ DISALLOW_COPY_AND_ASSIGN(X11EventSourceGlib);
+};
+
+} // namespace
+
+scoped_ptr<PlatformEventSource> PlatformEventSource::CreateDefault() {
+ return scoped_ptr<PlatformEventSource>(
+ new X11EventSourceGlib(gfx::GetXDisplay()));
+}
+
+} // namespace ui
diff --git a/ui/events/platform/x11/x11_event_source_libevent.cc b/ui/events/platform/x11/x11_event_source_libevent.cc
new file mode 100644
index 0000000000..0f27e69f69
--- /dev/null
+++ b/ui/events/platform/x11/x11_event_source_libevent.cc
@@ -0,0 +1,51 @@
+// 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 "ui/events/platform/x11/x11_event_source.h"
+
+#include <X11/Xlib.h>
+
+#include "base/message_loop/message_loop.h"
+#include "base/message_loop/message_pump_libevent.h"
+
+namespace ui {
+
+namespace {
+
+class X11EventSourceLibevent : public X11EventSource,
+ public base::MessagePumpLibevent::Watcher {
+ public:
+ explicit X11EventSourceLibevent(XDisplay* display)
+ : X11EventSource(display) {
+ int fd = ConnectionNumber(display);
+ base::MessageLoopForUI::current()->WatchFileDescriptor(fd, true,
+ base::MessagePumpLibevent::WATCH_READ, &watcher_controller_, this);
+ }
+
+ virtual ~X11EventSourceLibevent() {
+ }
+
+ private:
+ // base::MessagePumpLibevent::Watcher:
+ virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE {
+ DispatchXEvents();
+ }
+
+ virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE {
+ NOTREACHED();
+ }
+
+ base::MessagePumpLibevent::FileDescriptorWatcher watcher_controller_;
+
+ DISALLOW_COPY_AND_ASSIGN(X11EventSourceLibevent);
+};
+
+} // namespace
+
+scoped_ptr<PlatformEventSource> PlatformEventSource::CreateDefault() {
+ return scoped_ptr<PlatformEventSource>(
+ new X11EventSourceLibevent(gfx::GetXDisplay()));
+}
+
+} // namespace ui
diff --git a/ui/events/win/events_win.cc b/ui/events/win/events_win.cc
index 1588562ecf..7b559a6ea2 100644
--- a/ui/events/win/events_win.cc
+++ b/ui/events/win/events_win.cc
@@ -236,7 +236,7 @@ gfx::Point EventLocationFromNative(const base::NativeEvent& native_event) {
native_point.y = GET_Y_LPARAM(native_event.lParam);
}
ScreenToClient(native_event.hwnd, &native_point);
- return gfx::win::ScreenToDIPPoint(gfx::Point(native_point));
+ return gfx::Point(native_point);
}
gfx::Point EventSystemLocationFromNative(
diff --git a/ui/events/x/events_x.cc b/ui/events/x/events_x.cc
index 15b1adc611..7a3ff70e6a 100644
--- a/ui/events/x/events_x.cc
+++ b/ui/events/x/events_x.cc
@@ -9,6 +9,7 @@
#include <X11/extensions/XInput.h>
#include <X11/extensions/XInput2.h>
#include <X11/Xlib.h>
+#include <X11/Xutil.h>
#include "base/logging.h"
#include "base/memory/singleton.h"
@@ -147,6 +148,11 @@ int GetEventFlagsFromXState(unsigned int state) {
return flags;
}
+int GetEventFlagsFromXKeyEvent(XEvent* xevent) {
+ return GetEventFlagsFromXState(xevent->xkey.state) |
+ (IsKeypadKey(XLookupKeysym(&xevent->xkey, 0)) ? ui::EF_NUMPAD_KEY : 0);
+}
+
// Get the event flag for the button in XButtonEvent. During a ButtonPress
// event, |state| in XButtonEvent does not include the button that has just been
// pressed. Instead |state| contains flags for the buttons (if any) that had
@@ -327,7 +333,7 @@ int EventFlagsFromNative(const base::NativeEvent& native_event) {
case KeyPress:
case KeyRelease: {
XModifierStateWatcher::GetInstance()->UpdateStateFromEvent(native_event);
- return GetEventFlagsFromXState(native_event->xkey.state);
+ return GetEventFlagsFromXKeyEvent(native_event);
}
case ButtonPress:
case ButtonRelease: {
diff --git a/ui/events/x/events_x_unittest.cc b/ui/events/x/events_x_unittest.cc
index d4fc3af76b..368682cbb1 100644
--- a/ui/events/x/events_x_unittest.cc
+++ b/ui/events/x/events_x_unittest.cc
@@ -6,6 +6,8 @@
#include <X11/extensions/XInput2.h>
#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/XKBlib.h>
// Generically-named #defines from Xlib that conflict with symbols in GTest.
#undef Bool
@@ -40,6 +42,23 @@ void InitButtonEvent(XEvent* event,
button_event->state = state;
}
+// Initializes the passed-in Xlib event.
+void InitKeyEvent(Display* display,
+ XEvent* event,
+ bool is_press,
+ int keycode,
+ int state) {
+ memset(event, 0, sizeof(*event));
+
+ // We don't bother setting fields that the event code doesn't use, such as
+ // x_root/y_root and window/root/subwindow.
+ XKeyEvent* key_event = &(event->xkey);
+ key_event->display = display;
+ key_event->type = is_press ? KeyPress : KeyRelease;
+ key_event->keycode = keycode;
+ key_event->state = state;
+}
+
} // namespace
TEST(EventsXTest, ButtonEvents) {
@@ -238,4 +257,117 @@ TEST(EventsXTest, TouchEventBasic) {
EXPECT_FLOAT_EQ(GetTouchForce(scoped_xevent), 0.5f);
}
#endif
+
+TEST(EventsXTest, NumpadKeyEvents) {
+ XEvent event;
+ Display* display = gfx::GetXDisplay();
+
+ struct {
+ bool is_numpad_key;
+ int x_keysym;
+ ui::KeyboardCode ui_keycode;
+ } keys[] = {
+ // XK_KP_Space and XK_KP_Equal are the extrema in the conventional
+ // keysymdef.h numbering.
+ { true, XK_KP_Space },
+ { true, XK_KP_Equal },
+ // Other numpad keysyms. (This is actually exhaustive in the current list.)
+ { true, XK_KP_Tab },
+ { true, XK_KP_Enter },
+ { true, XK_KP_F1 },
+ { true, XK_KP_F2 },
+ { true, XK_KP_F3 },
+ { true, XK_KP_F4 },
+ { true, XK_KP_Home },
+ { true, XK_KP_Left },
+ { true, XK_KP_Up },
+ { true, XK_KP_Right },
+ { true, XK_KP_Down },
+ { true, XK_KP_Prior },
+ { true, XK_KP_Page_Up },
+ { true, XK_KP_Next },
+ { true, XK_KP_Page_Down },
+ { true, XK_KP_End },
+ { true, XK_KP_Begin },
+ { true, XK_KP_Insert },
+ { true, XK_KP_Delete },
+ { true, XK_KP_Multiply },
+ { true, XK_KP_Add },
+ { true, XK_KP_Separator },
+ { true, XK_KP_Subtract },
+ { true, XK_KP_Decimal },
+ { true, XK_KP_Divide },
+ { true, XK_KP_0 },
+ { true, XK_KP_1 },
+ { true, XK_KP_2 },
+ { true, XK_KP_3 },
+ { true, XK_KP_4 },
+ { true, XK_KP_5 },
+ { true, XK_KP_6 },
+ { true, XK_KP_7 },
+ { true, XK_KP_8 },
+ { true, XK_KP_9 },
+ // Largest keysym preceding XK_KP_Space.
+ { false, XK_Num_Lock },
+ // Smallest keysym following XK_KP_Equal.
+ { false, XK_F1 },
+ // Non-numpad analogues of numpad keysyms.
+ { false, XK_Tab },
+ { false, XK_Return },
+ { false, XK_F1 },
+ { false, XK_F2 },
+ { false, XK_F3 },
+ { false, XK_F4 },
+ { false, XK_Home },
+ { false, XK_Left },
+ { false, XK_Up },
+ { false, XK_Right },
+ { false, XK_Down },
+ { false, XK_Prior },
+ { false, XK_Page_Up },
+ { false, XK_Next },
+ { false, XK_Page_Down },
+ { false, XK_End },
+ { false, XK_Insert },
+ { false, XK_Delete },
+ { false, XK_multiply },
+ { false, XK_plus },
+ { false, XK_minus },
+ { false, XK_period },
+ { false, XK_slash },
+ { false, XK_0 },
+ { false, XK_1 },
+ { false, XK_2 },
+ { false, XK_3 },
+ { false, XK_4 },
+ { false, XK_5 },
+ { false, XK_6 },
+ { false, XK_7 },
+ { false, XK_8 },
+ { false, XK_9 },
+ // Miscellaneous other keysyms.
+ { false, XK_BackSpace },
+ { false, XK_Scroll_Lock },
+ { false, XK_Multi_key },
+ { false, XK_Select },
+ { false, XK_Num_Lock },
+ { false, XK_Shift_L },
+ { false, XK_space },
+ { false, XK_A },
+ };
+
+ for (size_t k = 0; k < ARRAYSIZE_UNSAFE(keys); ++k) {
+ int x_keycode = XKeysymToKeycode(display, keys[k].x_keysym);
+ // Exclude keysyms for which the server has no corresponding keycode.
+ if (x_keycode) {
+ InitKeyEvent(display, &event, true, x_keycode, 0);
+ // int keysym = XLookupKeysym(&event.xkey, 0);
+ // if (keysym) {
+ ui::KeyEvent ui_key_event(&event, false);
+ EXPECT_EQ(keys[k].is_numpad_key ? ui::EF_NUMPAD_KEY : 0,
+ ui_key_event.flags() & ui::EF_NUMPAD_KEY);
+ }
+ }
+}
+
} // namespace ui
diff --git a/ui/file_manager/DEPS b/ui/file_manager/DEPS
new file mode 100644
index 0000000000..a99be7d7bc
--- /dev/null
+++ b/ui/file_manager/DEPS
@@ -0,0 +1,6 @@
+include_rules = [
+ "+grit/file_manager_resources.h",
+ "+grit/file_manager_resources_map.h",
+ "+ui/base",
+ "+ui/webui",
+]
diff --git a/ui/file_manager/OWNERS b/ui/file_manager/OWNERS
new file mode 100644
index 0000000000..bca0cd957a
--- /dev/null
+++ b/ui/file_manager/OWNERS
@@ -0,0 +1,3 @@
+hirono@chromium.org
+mtomasz@chromium.org
+yoshiki@chromium.org
diff --git a/ui/file_manager/file_manager.gyp b/ui/file_manager/file_manager.gyp
new file mode 100644
index 0000000000..ec12f68839
--- /dev/null
+++ b/ui/file_manager/file_manager.gyp
@@ -0,0 +1,52 @@
+# 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.
+
+{
+ 'variables': {
+ 'chromium_code': 1,
+ 'grit_out_dir': '<(SHARED_INTERMEDIATE_DIR)/ui/file_manager',
+ },
+ 'targets': [
+ {
+ 'target_name': 'file_manager_resources',
+ 'type': 'none',
+ 'actions': [
+ {
+ 'action_name': 'file_manager_resources',
+ 'variables': {
+ 'grit_grd_file': 'file_manager_resources.grd',
+ },
+ 'includes': [ '../../build/grit_action.gypi' ],
+ },
+ ],
+ 'includes': [ '../../build/grit_target.gypi' ],
+ 'copies': [
+ {
+ 'destination': '<(PRODUCT_DIR)',
+ 'files': [
+ '<(SHARED_INTERMEDIATE_DIR)/ui/file_manager/file_manager_resources.pak',
+ ],
+ },
+ ],
+ },
+ {
+ 'target_name': 'file_manager',
+ 'type': '<(component)',
+ 'dependencies': [
+ '../../base/base.gyp:base',
+ 'file_manager_resources',
+ ],
+ 'defines': [
+ 'FILE_MANAGER_IMPLEMENTATION',
+ ],
+ 'sources': [
+ 'file_manager_export.h',
+ 'file_manager_resource_util.cc',
+ 'file_manager_resource_util.h',
+ '<(grit_out_dir)/grit/file_manager_resources_map.cc',
+ '<(grit_out_dir)/grit/file_manager_resources_map.h',
+ ]
+ },
+ ],
+}
diff --git a/ui/file_manager/file_manager_export.h b/ui/file_manager/file_manager_export.h
new file mode 100644
index 0000000000..a61bf831a7
--- /dev/null
+++ b/ui/file_manager/file_manager_export.h
@@ -0,0 +1,32 @@
+// 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 UI_FILE_MANAGER_FILE_MANAGER_EXPORT_H_
+#define UI_FILE_MANAGER_FILE_MANAGER_EXPORT_H_
+
+// Defines FILE_MANAGER_EXPORT so that functionality implemented by the
+// FILE_MANAGER module can be exported to consumers.
+
+#if defined(COMPONENT_BUILD)
+#if defined(WIN32)
+
+#if defined(FILE_MANAGER_IMPLEMENTATION)
+#define FILE_MANAGER_EXPORT __declspec(dllexport)
+#else
+#define FILE_MANAGER_EXPORT __declspec(dllimport)
+#endif // defined(FILE_MANAGER_IMPLEMENTATION)
+
+#else // defined(WIN32)
+#if defined(FILE_MANAGER_IMPLEMENTATION)
+#define FILE_MANAGER_EXPORT __attribute__((visibility("default")))
+#else
+#define FILE_MANAGER_EXPORT
+#endif
+#endif
+
+#else // defined(COMPONENT_BUILD)
+#define FILE_MANAGER_EXPORT
+#endif
+
+#endif // UI_FILE_MANAGER_FILE_MANAGER_EXPORT_H_
diff --git a/ui/file_manager/file_manager_resource_util.cc b/ui/file_manager/file_manager_resource_util.cc
new file mode 100644
index 0000000000..5e8972073c
--- /dev/null
+++ b/ui/file_manager/file_manager_resource_util.cc
@@ -0,0 +1,18 @@
+// 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 "ui/file_manager/file_manager_resource_util.h"
+
+#include "grit/file_manager_resources_map.h"
+#include "ui/base/resource/resource_bundle.h"
+
+namespace file_manager {
+
+const GritResourceMap* GetFileManagerResources(size_t* size) {
+ DCHECK(size);
+ *size = kFileManagerResourcesSize;
+ return kFileManagerResources;
+}
+
+} // namespace keyboard
diff --git a/ui/file_manager/file_manager_resource_util.h b/ui/file_manager/file_manager_resource_util.h
new file mode 100644
index 0000000000..826eb99e8d
--- /dev/null
+++ b/ui/file_manager/file_manager_resource_util.h
@@ -0,0 +1,23 @@
+// 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 UI_FILE_MANAGER_FILE_MANAGER_RESOURCE_UTIL_H_
+#define UI_FILE_MANAGER_FILE_MANAGER_RESOURCE_UTIL_H_
+
+#include <cstddef>
+
+#include "ui/file_manager/file_manager_export.h"
+
+struct GritResourceMap;
+
+namespace file_manager {
+
+// Get the list of resources. |size| is populated with the number of resources
+// in the returned array.
+FILE_MANAGER_EXPORT const GritResourceMap* GetFileManagerResources(
+ size_t* size);
+
+} // namespace file_manager
+
+#endif // UI_FILE_MANAGER_FILE_MANAGER_RESOURCE_UTIL_H_
diff --git a/ui/file_manager/file_manager_resources.grd b/ui/file_manager/file_manager_resources.grd
new file mode 100644
index 0000000000..3473d92371
--- /dev/null
+++ b/ui/file_manager/file_manager_resources.grd
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grit latest_public_release="0" current_release="1">
+ <outputs>
+ <output filename="grit/file_manager_resources.h" type="rc_header">
+ <emit emit_type='prepend'></emit>
+ </output>
+ <output filename="grit/file_manager_resources_map.cc" type="resource_file_map_source" />
+ <output filename="grit/file_manager_resources_map.h" type="resource_map_header" />
+ <output filename="file_manager_resources.pak" type="data_package" />
+ <output filename="file_manager_resources.rc" type="rc_all" />
+ </outputs>
+ <release seq="1">
+ <includes>
+ <!-- VideoPlayer.app pages and scripts. -->
+ <include name="IDR_VIDEO_PLAYER_MANIFEST" file="video_player/manifest.json" type="BINDATA" />
+ <include name="IDR_VIDEO_PLAYER" file="video_player/video_player.html" allowexternalscript="true" flattenhtml="true" type="BINDATA" />
+ <include name="IDR_VIDEO_PLAYER_JS" file="video_player/js/video_player_scripts.js" flattenhtml="true" type="BINDATA" />
+ <include name="IDR_VIDEO_PLAYER_BKGND_JS" file="video_player/js/background.js" flattenhtml="true" type="BINDATA" />
+ <include name="IDR_VIDEO_PLAYER_TEST_UTIL_JS" file="video_player/js/test_util.js" flattenhtml="false" type="BINDATA" />
+ <include name="IDR_VIDEO_PLAYER_ERROR_UTIL_JS" file="video_player/js/error_util.js" flattenhtml="false" type="BINDATA" />
+ <include name="IDR_VIDEO_PLAYER_ICON_16" file="video_player/images/100/icon.png" type="BINDATA" />
+ <include name="IDR_VIDEO_PLAYER_ICON_32" file="video_player/images/200/icon.png" type="BINDATA" />
+
+ <!-- Gallery.app pages and scripts. -->
+ <include name="IDR_GALLERY_MANIFEST" file="gallery/manifest.json" type="BINDATA" />
+ <include name="IDR_GALLERY" file="gallery/gallery.html" allowexternalscript="true" flattenhtml="true" type="BINDATA" />
+ <include name="IDR_GALLERY_JS" file="gallery/js/gallery_scripts.js" flattenhtml="true" type="BINDATA" />
+ <include name="IDR_GALLERY_BKGND_JS" file="gallery/js/background.js" flattenhtml="true" type="BINDATA" />
+ <include name="IDR_GALLERY_TEST_UTIL_JS" file="gallery/js/test_util.js" flattenhtml="false" type="BINDATA" />
+ <include name="IDR_GALLERY_ERROR_UTIL_JS" file="gallery/js/error_util.js" flattenhtml="false" type="BINDATA" />
+ <include name="IDR_GALLERY_ICON_16" file="gallery/images/100/icon.png" type="BINDATA" />
+ <include name="IDR_GALLERY_ICON_32" file="gallery/images/200/icon.png" type="BINDATA" />
+
+ <!-- Image loader extension manifest and scripts. -->
+ <if expr="image_loader_extension">
+ <include name="IDR_IMAGE_LOADER_MANIFEST" file="image_loader/manifest.json" type="BINDATA" />
+ <include name="IDR_IMAGE_LOADER_IMAGE_LOADER_JS" file="image_loader/image_loader.js" type="BINDATA" />
+ <include name="IDR_IMAGE_LOADER_CACHE_JS" file="image_loader/cache.js" type="BINDATA" />
+ <include name="IDR_IMAGE_LOADER_WORKER_JS" file="image_loader/worker.js" type="BINDATA" />
+ <include name="IDR_IMAGE_LOADER_REQUEST_JS" file="image_loader/request.js" type="BINDATA" />
+ <include name="IDR_IMAGE_LOADER_BACKGROUND_JS" file="image_loader/background.js" type="BINDATA" />
+ <include name="IDR_IMAGE_LOADER_CLIENT_JS" file="image_loader/image_loader_client.js" type="BINDATA" />
+ </if>
+ </includes>
+ </release>
+</grit>
diff --git a/ui/file_manager/gallery/css/gallery.css b/ui/file_manager/gallery/css/gallery.css
new file mode 100644
index 0000000000..ae32e96763
--- /dev/null
+++ b/ui/file_manager/gallery/css/gallery.css
@@ -0,0 +1,1381 @@
+/* Copyright (c) 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. */
+
+body {
+ -webkit-user-select: none;
+ font-family: Open Sans, Droid Sans Fallback, sans-serif;
+ font-size: 84%;
+ margin: 0;
+}
+
+.gallery,
+.gallery .content {
+ bottom: 0;
+ left: 0;
+ overflow: hidden;
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+
+/* Common background for both mosaic and slide mode. */
+.gallery .content {
+ background-color: black;
+}
+
+/* Close button */
+
+/* We actually want (left,top) to be (0,0) but for some weird reason
+ this triggers :hover style on page reload which is ugly. */
+.gallery > .back-button {
+ cursor: pointer;
+ left: 1px;
+ position: absolute;
+ top: 1px;
+ z-index: 200;
+}
+
+/* The close icon is in a nested div so that its opacity can be manipulated
+ independently from its parent (which can be dimmed when the crop frame
+ overlaps it) */
+.gallery > .back-button div {
+ background-image: -webkit-image-set(
+ url('../images/100/back_to_files.png') 1x,
+ url('../images/200/back_to_files.png') 2x);
+ background-position: center center;
+ background-repeat: no-repeat;
+ height: 40px;
+ opacity: 0;
+ width: 64px;
+}
+
+.gallery[tools] > .back-button div {
+ opacity: 0.5;
+}
+
+.gallery[tools] > .back-button div:hover {
+ opacity: 1;
+}
+
+/* Image container and canvas elements */
+
+.gallery .image-container {
+ cursor: none; /* Only visible when the toolbar is active */
+ height: 100%;
+ position: absolute;
+ width: 100%;
+}
+
+.gallery[tools] .image-container[cursor='default'] {
+ cursor: default;
+}
+
+.gallery[tools] .image-container[cursor='move'] {
+ cursor: -webkit-image-set(
+ url('../images/100/cursor_move.png') 1x,
+ url('../images/200/cursor_move.png') 2x) 15 15, auto;
+}
+
+.gallery[tools] .image-container[cursor='crop'] {
+ cursor: -webkit-image-set(
+ url('../images/100/cursor_crop.png') 1x,
+ url('../images/200/cursor_crop.png') 2x) 15 15, auto;
+}
+
+.gallery[tools] .image-container[cursor='n-resize'],
+.gallery[tools] .image-container[cursor='s-resize'] {
+ cursor: -webkit-image-set(
+ url('../images/100/cursor_updown.png') 1x,
+ url('../images/200/cursor_updown.png') 2x) 15 15, auto;
+}
+
+.gallery[tools] .image-container[cursor='e-resize'],
+.gallery[tools] .image-container[cursor='w-resize'] {
+ cursor: -webkit-image-set(
+ url('../images/100/cursor_leftright.png') 1x,
+ url('../images/200/cursor_leftright.png') 2x) 15 15, auto;
+}
+
+.gallery[tools] .image-container[cursor='nw-resize'],
+.gallery[tools] .image-container[cursor='se-resize'] {
+ cursor: -webkit-image-set(
+ url('../images/100/cursor_nwse.png') 1x,
+ url('../images/200/cursor_nwse.png') 2x) 15 15, auto;
+}
+
+.gallery[tools] .image-container[cursor='ne-resize'],
+.gallery[tools] .image-container[cursor='sw-resize'] {
+ cursor: -webkit-image-set(
+ url('../images/100/cursor_swne.png') 1x,
+ url('../images/200/cursor_swne.png') 2x) 15 15, auto;
+}
+
+.gallery .image-container > .image {
+ pointer-events: none;
+ position: absolute;
+ /* Duration and timing function are set in Javascript. */
+ transition-property: -webkit-transform, opacity;
+}
+
+.gallery .image-container > .image[fade] {
+ opacity: 0;
+}
+
+/* Full resolution image is invisible unless printing. */
+.gallery .image-container > canvas.fullres {
+ display: none;
+}
+
+@media print {
+ /* Do not print anything but the image content. */
+ .gallery > :not(.content) {
+ display: none !important;
+ }
+
+ /* Center the printed image. */
+ .gallery .image-container {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ display: -webkit-box;
+ }
+
+ /* Do not print the screen resolution image. */
+ .gallery .image-container > canvas.image {
+ display: none !important;
+ }
+
+ /* Print the full resolution image instead. */
+ .gallery .image-container > canvas.fullres {
+ display: block !important;
+ max-height: 100%;
+ max-width: 100%;
+ }
+
+ /* Print video at the center of the page */
+ .gallery .image-container > video.image {
+ position: auto !important;
+ }
+}
+
+/* Toolbar */
+
+.gallery > .header,
+.gallery > .toolbar {
+ -webkit-box-align: stretch;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: start;
+ background-color: rgba(30, 30, 30, 0.8);
+ display: -webkit-box;
+ left: 0;
+ opacity: 0;
+ padding: 0 10px;
+ pointer-events: none;
+ position: absolute;
+ right: 0;
+ transition: opacity 300ms ease;
+}
+
+.gallery > .header {
+ -webkit-box-align: center;
+ -webkit-box-pack: end;
+ border-bottom: 1px solid rgba(50, 50, 50, 0.8);
+ display: -webkit-box;
+ height: 45px;
+ top: 0;
+}
+
+.gallery > .toolbar {
+ border-top: 1px solid rgba(50, 50, 50, 0.8);
+ bottom: 0;
+ height: 55px;
+ min-width: 800px;
+}
+
+.gallery[tools]:not([slideshow]) > .header,
+.gallery[tools]:not([slideshow]) > .toolbar {
+ opacity: 1;
+ pointer-events: auto;
+}
+
+/* Hide immediately when entering the slideshow. */
+.gallery[tools][slideshow] > .toolbar {
+ transition-duration: 0;
+}
+
+.gallery[tools][locked] > .toolbar {
+ pointer-events: none;
+}
+
+.gallery .arrow-box {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ display: -webkit-box;
+ height: 100%;
+ pointer-events: none;
+ position: absolute;
+ width: 100%;
+ z-index: 100;
+}
+
+.gallery .arrow-box .arrow {
+ opacity: 0;
+ pointer-events: none;
+}
+
+.gallery .arrow-box .arrow-spacer {
+ -webkit-box-flex: 1;
+ pointer-events: none;
+}
+
+.gallery[tools] .arrow-box[active] .arrow {
+ cursor: pointer;
+ opacity: 1;
+ pointer-events: auto;
+}
+
+/* The arrow icons are in nested divs so that their opacity can be manipulated
+ * independently from their parent (which can be dimmed when the crop frame
+ * overlaps it) */
+.gallery .arrow div {
+ background-position: center center;
+ background-repeat: no-repeat;
+ height: 193px;
+ opacity: 0;
+ width: 105px;
+}
+
+.gallery[tools] .arrow-box[active] .arrow div {
+ opacity: 0.25;
+}
+
+.gallery[tools] .arrow-box[active] .arrow div:hover {
+ opacity: 1;
+}
+
+.gallery .arrow.left div {
+ background-image: -webkit-image-set(
+ url('../images/100/arrow_left.png') 1x,
+ url('../images/200/arrow_left.png') 2x);
+}
+
+.gallery .arrow.right div {
+ background-image: -webkit-image-set(
+ url('../images/100/arrow_right.png') 1x,
+ url('../images/200/arrow_right.png') 2x);
+}
+
+/* Special behavior on mouse drag.
+ Redundant .gallery attributes included to make the rules more specific */
+
+/* Everything but the image container should become mouse-transparent */
+.gallery[tools][editing][mousedrag] * {
+ pointer-events: none;
+}
+
+.gallery[tools][editing][mousedrag] .image-container {
+ pointer-events: auto;
+}
+
+/* The editor marks elements with 'dimmed' attribute to get them out of the way
+ of the crop frame */
+.gallery[tools][editing] [dimmed],
+.gallery[tools][editing] [dimmed] * {
+ pointer-events: none;
+}
+
+.gallery[tools][editing] [dimmed] {
+ opacity: 0.2;
+}
+
+/* Filename */
+
+.gallery .filename-spacer {
+ position: relative;
+ width: 270px;
+}
+
+.gallery .filename-spacer > * {
+ background-color: transparent;
+ overflow: hidden;
+ position: absolute;
+ transition: visibility 0 linear 180ms, all 180ms linear;
+ width: 260px;
+}
+
+.gallery .filename-spacer * {
+ color: white;
+}
+
+.gallery .filename-spacer .namebox {
+ height: 22px;
+ top: 15px;
+}
+
+.gallery[editing] .filename-spacer .namebox {
+ height: 21px;
+ top: 5px;
+}
+
+
+.gallery .filename-spacer .namebox {
+ background-color: transparent;
+ border: none;
+ box-sizing: border-box;
+ cursor: pointer;
+ display: block;
+ font-size: 120%;
+ outline: none;
+ overflow: hidden;
+ padding: 0 3px;
+ position: absolute;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.gallery .filename-spacer .namebox[disabled] {
+ -webkit-user-select: none;
+ cursor: default;
+}
+
+.gallery .filename-spacer .namebox:not([disabled]):not(:focus):hover {
+ background-color: rgba(48, 48, 48, 1.0);
+}
+
+.gallery .filename-spacer .namebox:focus {
+ background-color: white;
+ color: black;
+ cursor: text;
+}
+
+.gallery .filename-spacer .options {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: start;
+ display: -webkit-box;
+ opacity: 0;
+ top: 50px;
+ visibility: hidden;
+}
+
+.gallery[editing] .filename-spacer .options {
+ opacity: 1;
+ top: 28px;
+ visibility: visible;
+}
+
+.gallery .filename-spacer .saved,
+.gallery .filename-spacer .overwrite-original {
+ cursor: inherit;
+ font-size: 90%;
+ margin-left: 3px;
+ margin-right: 18px;
+ opacity: 0;
+ pointer-events: none;
+ transition: all linear 120ms;
+}
+
+.gallery[editing] .filename-spacer .saved {
+ color: white;
+ opacity: 0.5;
+}
+
+.gallery[editing] .filename-spacer .overwrite-original,
+.gallery[editing] .filename-spacer .overwrite-original > * {
+ cursor: pointer;
+ opacity: 1;
+ pointer-events: auto;
+}
+
+.gallery[editing] .options[saved] .overwrite-original {
+ opacity: 0.5;
+}
+
+.gallery[editing] .options[saved] .overwrite-original,
+.gallery[editing] .options[saved] .overwrite-original > * {
+ cursor: default;
+ pointer-events: none;
+}
+
+.gallery .filename-spacer .overwrite-original input {
+ margin-bottom: -2px;
+ margin-right: 6px;
+}
+
+.gallery .filename-spacer .saved[highlighted] {
+ -webkit-transform: scaleX(1.1) scaleY(1.1) rotate(0);
+ opacity: 1;
+}
+
+/* Bubble */
+.gallery .toolbar .bubble {
+ bottom: 65px;
+ font-size: 85%;
+ left: 50px;
+ position: absolute;
+ width: 220px;
+}
+
+.gallery:not([editing]) .toolbar .bubble {
+ display: none;
+}
+
+/* Toolbar buttons */
+
+.gallery .button-spacer {
+ -webkit-box-flex: 1;
+ display: -webkit-box;
+}
+
+/* Thumbnails */
+
+.gallery .ribbon-spacer {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ display: -webkit-box;
+ height: 100%;
+ left: 280px;
+ position: absolute;
+ right: 280px;
+}
+
+.gallery .toolbar .ribbon {
+ -webkit-box-flex: 0;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: start;
+ display: -webkit-box;
+ height: 100%;
+ overflow: hidden;
+ transition: opacity 180ms linear, visibility 0 linear;
+ z-index: 0;
+}
+
+.gallery[editing] .toolbar .ribbon {
+ opacity: 0;
+ transition-delay: 0, 180ms;
+ visibility: hidden;
+}
+
+.gallery .ribbon-image {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ border: 2px solid rgba(255, 255, 255, 0); /* transparent white */
+ cursor: pointer;
+ display: -webkit-box;
+ height: 47px;
+ margin: 2px;
+ overflow: hidden;
+ transition: all 180ms linear;
+ width: 47px;
+}
+
+.ribbon-image[vanishing='smooth'] {
+ border-left-width: 0;
+ border-right-width: 0;
+ margin-left: 0;
+ margin-right: 0;
+ width: 0;
+}
+
+.gallery .ribbon-image[selected] {
+ border: 2px solid rgba(255, 233, 168, 1);
+}
+
+.gallery .toolbar .ribbon.fade-left {
+ -webkit-mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0,
+ rgba(0, 0, 0, 1) 40px);
+}
+
+.gallery .toolbar .ribbon.fade-right {
+ -webkit-mask-image: linear-gradient(to left, rgba(0, 0, 0, 0) 0,
+ rgba(0, 0, 0, 1) 40px);
+}
+
+.gallery .toolbar .ribbon.fade-left.fade-right {
+ -webkit-mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0,
+ rgba(0, 0, 0, 1) 40px,
+ rgba(0, 0, 0, 1) 230px,
+ rgba(0, 0, 0, 0) 100%);
+}
+
+.gallery .image-wrapper {
+ background-size: 45px 45px;
+ border: 1px solid rgba(0, 0, 0, 0); /* transparent black */
+ height: 45px;
+ overflow: hidden;
+ position: relative;
+ width: 45px;
+}
+
+.gallery .image-wrapper > img {
+ position: absolute;
+}
+
+.gallery .image-wrapper > img:not(.cached) {
+ -webkit-animation: fadeIn 500ms ease-in;
+}
+
+/* Editor buttons */
+
+.gallery .edit-bar-spacer {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ display: -webkit-box;
+ height: 100%;
+ left: 280px;
+ opacity: 0;
+ position: absolute;
+ right: 280px;
+ transition: opacity 180ms linear, visibility 0 linear 180ms;
+ visibility: hidden;
+}
+
+.gallery .toolbar .edit-main {
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ color: white;
+ display: -webkit-box;
+ height: 55px;
+ overflow: visible;
+}
+
+.gallery[editing] .edit-bar-spacer {
+ opacity: 1.0;
+ pointer-events: auto;
+ transition-delay: 100ms, 100ms;
+ visibility: visible;
+}
+
+.gallery .header button,
+.gallery .toolbar button,
+.gallery .header button[disabled],
+.gallery .toolbar button[disabled] {
+ -webkit-box-align: center;
+ -webkit-box-flex: 0;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: end;
+ background-color: rgba(0, 0, 0, 0);
+ background-position: center;
+ background-repeat: no-repeat;
+ border: none;
+ box-shadow: none;
+ color: white;
+ cursor: pointer;
+ display: -webkit-box;
+ opacity: 0.99; /* Workaround for http://crosbug.com/21065 */
+ padding: 1px; /* Instead of a border. */
+ position: relative;
+ z-index: 10;
+}
+
+.gallery .header button,
+.gallery .toolbar button {
+ height: 40px;
+ margin: 6px 0;
+ min-width: 40px; /* Reset. */
+ width: 40px;
+}
+
+/* By default, labels are hidden. */
+.gallery > .toolbar button span {
+ display: none;
+}
+
+/* Show labels if there is enough space. */
+@media (min-width: 1180px) {
+
+ .gallery .edit-main button,
+ .gallery .edit-main button[disabled] {
+ background-position: 5px center;
+ max-width: 60px;
+ min-width: 0; /* Reset. */
+ padding: 0 10px 0 35px;
+ width: auto;
+ }
+
+ .gallery > .toolbar button span {
+ display: inline;
+ }
+
+}
+
+.gallery .header button:hover,
+.gallery .toolbar button:hover {
+ background-color: rgba(31, 31, 31, 1);
+ color: white;
+}
+
+.gallery .header button:active,
+.gallery .toolbar button:active,
+.gallery .header button[pressed],
+.gallery .toolbar button[pressed],
+.gallery .header button[pressed]:hover,
+.gallery .toolbar button[pressed]:hover {
+ background-color: rgba(240, 240, 240, 1);
+ color: black;
+}
+
+.gallery > .toolbar button.autofix {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_autofix.png') 1x,
+ url('../images/200/icon_autofix.png') 2x);
+}
+
+.gallery > .toolbar button.autofix:active,
+.gallery > .toolbar button.autofix[pressed] {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_autofix_selected.png') 1x,
+ url('../images/200/icon_autofix_selected.png') 2x);
+}
+
+.gallery > .toolbar button.crop {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_crop.png') 1x,
+ url('../images/200/icon_crop.png') 2x);
+}
+
+.gallery > .toolbar button.crop:active,
+.gallery > .toolbar button.crop[pressed] {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_crop_selected.png') 1x,
+ url('../images/200/icon_crop_selected.png') 2x);
+}
+
+.gallery > .toolbar button.exposure {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_brightness.png') 1x,
+ url('../images/200/icon_brightness.png') 2x);
+}
+
+.gallery > .toolbar button.exposure:active,
+.gallery > .toolbar button.exposure[pressed] {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_brightness_selected.png') 1x,
+ url('../images/200/icon_brightness_selected.png') 2x);
+}
+
+.gallery > .toolbar button.rotate_right {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_rotate.png') 1x,
+ url('../images/200/icon_rotate.png') 2x);
+}
+
+.gallery > .toolbar button.rotate_right:active,
+.gallery > .toolbar button.rotate_right[pressed] {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_rotate_selected.png') 1x,
+ url('../images/200/icon_rotate_selected.png') 2x);
+}
+
+.gallery > .toolbar button.rotate_left {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_rotate_left.png') 1x,
+ url('../images/200/icon_rotate_left.png') 2x);
+}
+
+.gallery > .toolbar button.rotate_left:active,
+.gallery > .toolbar button.rotate_left[pressed] {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_rotate_left_selected.png') 1x,
+ url('../images/200/icon_rotate_left_selected.png') 2x);
+}
+
+.gallery > .toolbar button.undo {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_undo.png') 1x,
+ url('../images/200/icon_undo.png') 2x);
+}
+
+.gallery > .toolbar button.undo:active,
+.gallery > .toolbar button.undo[pressed] {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_undo_selected.png') 1x,
+ url('../images/200/icon_undo_selected.png') 2x);
+}
+
+.gallery > .toolbar button.redo {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_redo.png') 1x,
+ url('../images/200/icon_redo.png') 2x);
+ position: absolute; /* Exclude from center-packing*/
+}
+
+.gallery > .toolbar button.redo:active,
+.gallery > .toolbar button.redo[pressed] {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_redo_selected.png') 1x,
+ url('../images/200/icon_redo_selected.png') 2x);
+}
+
+.gallery > .toolbar button[disabled],
+.gallery[tools][locked] > .toolbar button {
+ opacity: 0.5;
+ pointer-events: none;
+}
+
+.gallery > .toolbar button[hidden] {
+ display: none;
+}
+
+.gallery[mode='slide'] > .toolbar > button.mode {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_mosaic.png') 1x,
+ url('../images/200/icon_mosaic.png') 2x);
+}
+
+.gallery[mode='slide'] > .toolbar > button.mode:active {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_mosaic_selected.png') 1x,
+ url('../images/200/icon_mosaic_selected.png') 2x);
+}
+
+.gallery[mode='mosaic'] > .toolbar > button.mode {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_1up.png') 1x,
+ url('../images/200/icon_1up.png') 2x);
+}
+
+.gallery[mode='mosaic'] > .toolbar > button.mode:active {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_1up_selected.png') 1x,
+ url('../images/200/icon_1up_selected.png') 2x);
+}
+
+.gallery > .toolbar > button.slideshow {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_slideshow.png') 1x,
+ url('../images/200/icon_slideshow.png') 2x);
+}
+
+.gallery > .toolbar > button.slideshow:active,
+.gallery > .toolbar > button.slideshow[pressed] {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_slideshow_selected.png') 1x,
+ url('../images/200/icon_slideshow_selected.png') 2x);
+}
+
+.gallery > .toolbar > button.delete {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_delete.png') 1x,
+ url('../images/200/icon_delete.png') 2x);
+}
+
+.gallery > .toolbar > button.delete:active {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_delete_selected.png') 1x,
+ url('../images/200/icon_delete_selected.png') 2x);
+}
+
+.gallery > .toolbar > button.edit {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_edit.png') 1x,
+ url('../images/200/icon_edit.png') 2x);
+}
+
+.gallery > .toolbar > button.edit:active,
+.gallery > .toolbar > button.edit[pressed] {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_edit_selected.png') 1x,
+ url('../images/200/icon_edit_selected.png') 2x);
+}
+
+.gallery > .toolbar > button.print {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_print.png') 1x,
+ url('../images/200/icon_print.png') 2x);
+}
+
+.gallery > .toolbar > button.print:active,
+.gallery > .toolbar > button.print[pressed] {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_print_selected.png') 1x,
+ url('../images/200/icon_print_selected.png') 2x);
+}
+
+.gallery > .toolbar > button.share {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_share.png') 1x,
+ url('../images/200/icon_share.png') 2x);
+}
+
+.gallery > .toolbar > button.share:active,
+.gallery > .toolbar > button.share[pressed] {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_share_selected.png') 1x,
+ url('../images/200/icon_share_selected.png') 2x);
+}
+
+.gallery > .toolbar > button.share[disabled] {
+ display: none;
+}
+
+/* Secondary toolbar (mode-specific tools) */
+
+.gallery .edit-modal {
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ bottom: 80px;
+ display: -webkit-box;
+ height: 40px;
+ pointer-events: none;
+ position: absolute;
+ width: 100%;
+}
+
+.gallery .edit-modal-wrapper[hidden] {
+ display: none;
+}
+
+.gallery .edit-modal-wrapper {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ background-color: rgba(0, 0, 0, 0.75);
+ color: white;
+ display: -webkit-box;
+ padding-right: 5px;
+ pointer-events: auto;
+}
+
+.gallery .edit-modal .label {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ background-position: 20px center;
+ background-repeat: no-repeat;
+ display: -webkit-box;
+ height: 20px;
+ padding-left: 50px;
+ padding-right: 10px;
+}
+
+.gallery .edit-modal .label.brightness {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_brightness.png') 1x,
+ url('../images/200/icon_brightness.png') 2x);
+}
+
+.gallery .edit-modal .label.contrast {
+ background-image: -webkit-image-set(
+ url('../images/100/icon_contrast.png') 1x,
+ url('../images/200/icon_contrast.png') 2x);
+ height: 24px;
+ margin-left: 15px;
+}
+
+.gallery .edit-modal .range {
+ -webkit-appearance: none !important;
+ height: 3px;
+ margin-right: 10px;
+ margin-top: 1px;
+}
+
+.gallery .edit-modal .range::-webkit-slider-thumb {
+ -webkit-appearance: none;
+ background-image: -webkit-image-set(
+ url('../images/100/slider_thumb.png') 1x,
+ url('../images/200/slider_thumb.png') 2x);
+ height: 29px;
+ width: 16px;
+}
+
+/* Crop frame */
+
+.gallery .crop-overlay {
+ -webkit-box-orient: vertical;
+ display: -webkit-box;
+ pointer-events: none;
+ position: absolute;
+}
+
+.gallery .crop-overlay .shadow {
+ background-color: rgba(0, 0, 0, 0.65);
+}
+
+.gallery .crop-overlay .middle-box {
+ -webkit-box-flex: 1;
+ -webkit-box-orient: horizontal;
+ display: -webkit-box;
+}
+
+.gallery .crop-frame {
+ -webkit-box-flex: 1;
+ display: -webkit-box;
+ position: relative;
+}
+
+.gallery .crop-frame div {
+ background-color: rgba(255, 255, 255, 1);
+ box-shadow: 0 0 3px rgba(0, 0, 0, 0.75);
+ position: absolute;
+}
+
+.gallery .crop-frame .horizontal {
+ height: 1px;
+ left: 7px;
+ right: 7px;
+}
+
+.gallery .crop-frame .horizontal.top {
+ top: 0;
+}
+
+.gallery .crop-frame .horizontal.bottom {
+ bottom: 0;
+}
+
+.gallery .crop-frame .vertical {
+ bottom: 7px;
+ top: 7px;
+ width: 1px;
+}
+
+.gallery .crop-frame .vertical.left {
+ left: 0;
+}
+
+.gallery .crop-frame .vertical.right {
+ right: 0;
+}
+
+.gallery .crop-frame .corner {
+ border-radius: 6px;
+ height: 13px;
+ width: 13px;
+}
+
+.gallery .crop-frame .corner.left {
+ left: -6px;
+}
+
+.gallery .crop-frame .corner.right {
+ right: -6px;
+}
+
+.gallery .crop-frame .corner.top {
+ top: -6px;
+}
+
+.gallery .crop-frame .corner.bottom {
+ bottom: -6px;
+}
+
+/* Prompt/notification panel */
+
+.gallery .prompt-wrapper {
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ display: -webkit-box;
+ height: 100%;
+ pointer-events: none;
+ position: absolute;
+ width: 100%;
+}
+
+.gallery .prompt-wrapper[pos=top] {
+ -webkit-box-align: start;
+}
+
+.gallery .prompt-wrapper[pos=center] {
+ -webkit-box-align: center;
+}
+
+.gallery .prompt-wrapper[pos=center] .back-button {
+ display: none;
+}
+
+.gallery .prompt-wrapper > div.dimmable {
+ opacity: 1;
+ transition: opacity 220ms ease;
+}
+
+.gallery .prompt {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ background-color: rgba(0, 0, 0, 0.8);
+ color: white;
+ display: -webkit-box;
+ font-size: 120%;
+ height: 40px;
+ opacity: 0;
+ padding: 0 20px;
+ position: relative;
+ top: 5px;
+ transition: all 180ms ease;
+}
+
+.gallery .prompt[state='fadein'] {
+ opacity: 1;
+ top: 0;
+}
+
+.gallery .prompt[state='fadeout'] {
+ opacity: 0;
+ top: 0;
+}
+
+.gallery .prompt-wrapper[pos=top] .prompt {
+ padding-right: 10px;
+}
+
+.gallery .prompt .back-button {
+ background-image: -webkit-image-set(
+ url('../images/100/butterbar_close_button.png') 1x,
+ url('../images/200/butterbar_close_button.png') 2x);
+ background-position: center center;
+ background-repeat: no-repeat;
+ height: 16px;
+ margin-left: 16px;
+ opacity: 0.65;
+ pointer-events: auto;
+ width: 16px;
+}
+
+.gallery .prompt .back-button:hover {
+ background-color: rgba(81, 81, 81, 1);
+ opacity: 1.0;
+}
+
+.gallery .share-menu {
+ -webkit-box-align: stretch;
+ -webkit-box-orient: vertical;
+ -webkit-box-pack: start;
+ background-color: white;
+ border: 1px solid #7f7f7f;
+ border-radius: 1px;
+ bottom: 60px;
+ display: -webkit-box;
+ opacity: 1.0;
+ padding: 8px;
+ position: absolute;
+ right: 10px;
+ transition: opacity 500ms ease-in-out;
+}
+
+.gallery .share-menu .bubble-point {
+ background-image: -webkit-image-set(
+ url('../images/100/bubble_point.png') 1x,
+ url('../images/200/bubble_point.png') 2x);
+ background-position: center top;
+ background-repeat: no-repeat;
+ bottom: -8px;
+ height: 8px;
+ padding: 0;
+ position: absolute;
+ right: 20px;
+ width: 20px;
+}
+
+.gallery .share-menu[hidden] {
+ bottom: -100%; /* Offscreen so that 'dimmed' attribute does not show it. */
+ opacity: 0;
+ pointer-events: none;
+}
+
+.gallery .share-menu > .item {
+ background-color: rgba(0, 0, 0, 0);
+ background-position: 5px center;
+ background-repeat: no-repeat;
+ cursor: pointer;
+ padding: 5px;
+ padding-left: 26px;
+}
+
+.gallery .share-menu > .item:hover {
+ background-color: rgba(240, 240, 240, 1);
+}
+
+.gallery .share-menu > div > img {
+ display: block;
+ margin-right: 5px;
+}
+
+/* Load spinner and error banner. */
+
+.gallery .spinner {
+ background-image: url(../images/100/common/spinner.svg);
+ background-size: 100%;
+ height: 16px;
+ left: 50%;
+ margin-left: -8px;
+ margin-top: -8px;
+ position: absolute;
+ top: 50%;
+ width: 16px;
+}
+
+.gallery:not([spinner]) .spinner {
+ display: none;
+}
+
+.gallery .error-banner {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ background-color: rgba(24, 24, 24, 1);
+ background-image: -webkit-image-set(
+ url('../images/100/media/error.png') 1x,
+ url('../images/100/media/2x/error.png') 2x);
+ background-position: 25px center;
+ background-repeat: no-repeat;
+ color: white;
+ display: -webkit-box;
+ height: 54px;
+ padding-left: 70px;
+ padding-right: 35px;
+}
+
+.gallery:not([error]) .error-banner {
+ display: none;
+}
+
+/* Video playback support. */
+
+.gallery video {
+ height: 100%;
+ position: absolute;
+ width: 100%;
+}
+
+.gallery .video-controls-spacer {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ bottom: 60px; /* Just above the toolbar */
+ display: -webkit-box;
+ height: 30px;
+ left: 0;
+ opacity: 0;
+ pointer-events: none;
+ position: absolute;
+ right: 0;
+}
+
+.gallery[video] .video-controls-spacer {
+ /* Animate opacity on 'tools' attribute toggle. */
+ /* Change opacity immediately on 'video' attribute change. */
+ transition: opacity 280ms ease;
+}
+
+.gallery[video][tools] .video-controls-spacer {
+ opacity: 1;
+}
+
+.gallery .video-controls {
+ display: none;
+ max-width: 800px;
+}
+
+.gallery[video] .video-controls {
+ -webkit-box-flex: 1;
+ display: -webkit-box;
+}
+
+.gallery[video] > .toolbar .edit-main {
+ display: none;
+}
+
+/* Mosaic view. */
+.mosaic {
+ bottom: 55px; /* Toolbar height. */
+ left: 0;
+ overflow-x: scroll;
+ overflow-y: hidden;
+ position: absolute;
+ right: 0;
+ top: 0;
+
+ /* transition-duration is set in Javascript. */
+ transition-property: -webkit-transform;
+ transition-timing-function: linear;
+}
+
+.mosaic::-webkit-scrollbar {
+ background: transparent;
+}
+
+.mosaic::-webkit-scrollbar-thumb {
+ background: rgb(31, 31, 31);
+}
+
+.gallery:not([mode='mosaic']) .mosaic::-webkit-scrollbar-thumb {
+ background: transparent;
+}
+
+.mosaic-tile {
+ position: absolute;
+ /* Tile's zoom factor is animated on hover. We apply the transform to
+ the entire tile so that the image outline is included into the animation. */
+ transition: -webkit-transform 150ms linear;
+}
+
+/* Mosaic tile's opacity is controlled by |visible| attribute which changes
+ separately from .gallery[mode] */
+.mosaic:not([visible]) .mosaic-tile .img-border {
+ opacity: 0;
+}
+
+/* Animate tile's opacity, except for the selected tile which should show/hide
+ instantly (this looks better when zooming to/from the slide mode). */
+.mosaic-tile:not([selected]) .img-border {
+ transition: opacity 350ms linear;
+}
+
+/* Must be in sync with mosaic_mode.js.
+ Mosaic.Layout.SPACING should be equal to
+ top + bottom + border-top-width + border-bottom-width AND
+ left + right + border-left-width + border-right-width */
+.mosaic-tile .img-border {
+ border: 1px solid black; /* Space between the outline and the image. */
+ bottom: 4px;
+ left: 4px;
+ outline: 2px solid transparent;
+ overflow: hidden;
+ position: absolute;
+ right: 4px;
+ top: 4px;
+}
+
+/* Selected and hover state are only visible when zoom transition is over. */
+.mosaic[visible='normal'] .mosaic-tile[selected] .img-border {
+ outline-color: rgb(51, 153, 255);
+}
+
+.mosaic[visible='normal'].hover-visible .mosaic-tile:hover {
+ -webkit-transform: scale(1.05);
+ z-index: 50;
+}
+
+.mosaic[visible='normal'].hover-visible
+ .mosaic-tile:hover:not([selected]) .img-border {
+ outline-color: rgb(182, 212, 252);
+}
+
+.mosaic-tile .img-wrapper {
+ bottom: 0;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+
+.mosaic-tile .img-wrapper[generic-thumbnail],
+.mosaic-tile .img-wrapper.animated:not([generic-thumbnail])
+ canvas:not(.cached) {
+ -webkit-animation: fadeIn ease-in 1;
+ -webkit-animation-duration: 500ms;
+ -webkit-animation-fill-mode: forwards;
+}
+
+@-webkit-keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+/* In order to do mode animated transitions smoothly we keep both mosaic and
+ image-container but transparent. */
+.gallery:not([mode='mosaic']) .mosaic,
+.gallery:not([mode='slide']) .image-container {
+ pointer-events: none;
+}
+
+.gallery:not([mode='slide']) .ribbon,
+.gallery:not([mode='slide']) .arrow-box {
+ opacity: 0;
+ pointer-events: none;
+}
+
+/* Temporary. Remove this along with the delete confirmation dialog
+ when Undo delete is implemented. */
+.cr-dialog-shield {
+ background-color: black;
+}
+
+/* Slideshow controls */
+
+.slideshow-toolbar {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ bottom: 0;
+ display: none;
+ left: 0;
+ padding-bottom: 6px;
+ pointer-events: none;
+ position: absolute;
+ right: 0;
+}
+
+.gallery[tools][slideshow] .slideshow-toolbar {
+ display: -webkit-box;
+}
+
+.slideshow-toolbar > div {
+ background-position: center;
+ background-repeat: no-repeat;
+ height: 68px;
+ opacity: 0.5;
+ pointer-events: auto;
+ width: 68px;
+}
+
+.slideshow-toolbar > div:hover {
+ opacity: 1;
+}
+
+.slideshow-toolbar > .slideshow-play {
+ background-image: -webkit-image-set(
+ url('../images/100/slideshow-play.png') 1x,
+ url('../images/200/slideshow-play.png') 2x);
+ margin-right: -2px;
+}
+
+.gallery[slideshow='playing'] .slideshow-toolbar > .slideshow-play {
+ background-image: -webkit-image-set(
+ url('../images/100/slideshow-pause.png') 1x,
+ url('../images/200/slideshow-pause.png') 2x);
+}
+
+.slideshow-toolbar > .slideshow-end {
+ background-image: -webkit-image-set(
+ url('../images/100/slideshow-end.png') 1x,
+ url('../images/200/slideshow-end.png') 2x);
+ margin-left: -2px;
+}
+
+.gallery > .header > button {
+ -webkit-margin-start: 10px;
+ cursor: default;
+ height: 32px;
+ min-width: 32px;
+ width: 32px;
+}
+
+.gallery > .header > .minimize-button {
+ background: -webkit-image-set(
+ url('chrome://resources/images/apps/topbar_button_minimize.png') 1x,
+ url('chrome://resources/images/2x/apps/topbar_button_minimize.png') 2x)
+ center;
+}
+
+.gallery > .header > .maximize-button {
+ background: -webkit-image-set(
+ url('chrome://resources/images/apps/topbar_button_maximize.png') 1x,
+ url('chrome://resources/images/2x/apps/topbar_button_maximize.png') 2x)
+ center;
+}
+
+.gallery > .header > .close-button {
+ background: -webkit-image-set(
+ url('chrome://resources/images/apps/topbar_button_close.png') 1x,
+ url('chrome://resources/images/2x/apps/topbar_button_close.png') 2x)
+ center;
+}
diff --git a/ui/file_manager/gallery/gallery.html b/ui/file_manager/gallery/gallery.html
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/ui/file_manager/gallery/gallery.html
diff --git a/ui/file_manager/gallery/images/100/arrow_left.png b/ui/file_manager/gallery/images/100/arrow_left.png
new file mode 100644
index 0000000000..85e687a116
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/arrow_left.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/arrow_right.png b/ui/file_manager/gallery/images/100/arrow_right.png
new file mode 100644
index 0000000000..0361556bd2
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/arrow_right.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/back_to_files.png b/ui/file_manager/gallery/images/100/back_to_files.png
new file mode 100644
index 0000000000..96e420a657
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/back_to_files.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/bubble_point.png b/ui/file_manager/gallery/images/100/bubble_point.png
new file mode 100644
index 0000000000..a4a44e0cf0
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/bubble_point.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/butterbar_close_button.png b/ui/file_manager/gallery/images/100/butterbar_close_button.png
new file mode 100644
index 0000000000..3c65c23015
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/butterbar_close_button.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/cursor_crop.png b/ui/file_manager/gallery/images/100/cursor_crop.png
new file mode 100644
index 0000000000..6084188e0a
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/cursor_crop.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/cursor_leftright.png b/ui/file_manager/gallery/images/100/cursor_leftright.png
new file mode 100644
index 0000000000..30eeb03acc
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/cursor_leftright.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/cursor_move.png b/ui/file_manager/gallery/images/100/cursor_move.png
new file mode 100644
index 0000000000..c5026d1b41
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/cursor_move.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/cursor_nwse.png b/ui/file_manager/gallery/images/100/cursor_nwse.png
new file mode 100644
index 0000000000..87fb564ba6
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/cursor_nwse.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/cursor_swne.png b/ui/file_manager/gallery/images/100/cursor_swne.png
new file mode 100644
index 0000000000..5e34475c86
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/cursor_swne.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/cursor_updown.png b/ui/file_manager/gallery/images/100/cursor_updown.png
new file mode 100644
index 0000000000..f3a422477c
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/cursor_updown.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon.png b/ui/file_manager/gallery/images/100/icon.png
new file mode 100644
index 0000000000..9ec2dbd5cb
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_1up.png b/ui/file_manager/gallery/images/100/icon_1up.png
new file mode 100644
index 0000000000..546e87ae49
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_1up.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_1up_selected.png b/ui/file_manager/gallery/images/100/icon_1up_selected.png
new file mode 100644
index 0000000000..a3043a8a05
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_1up_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_autofix.png b/ui/file_manager/gallery/images/100/icon_autofix.png
new file mode 100644
index 0000000000..0fb5b827d7
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_autofix.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_autofix_selected.png b/ui/file_manager/gallery/images/100/icon_autofix_selected.png
new file mode 100644
index 0000000000..fb5972d4d9
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_autofix_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_brightness.png b/ui/file_manager/gallery/images/100/icon_brightness.png
new file mode 100644
index 0000000000..ec9c114d24
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_brightness.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_brightness_selected.png b/ui/file_manager/gallery/images/100/icon_brightness_selected.png
new file mode 100644
index 0000000000..88ee72290a
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_brightness_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_contrast.png b/ui/file_manager/gallery/images/100/icon_contrast.png
new file mode 100644
index 0000000000..0188d48344
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_contrast.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_crop.png b/ui/file_manager/gallery/images/100/icon_crop.png
new file mode 100644
index 0000000000..efff5ba58f
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_crop.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_crop_selected.png b/ui/file_manager/gallery/images/100/icon_crop_selected.png
new file mode 100644
index 0000000000..18b8317cba
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_crop_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_delete.png b/ui/file_manager/gallery/images/100/icon_delete.png
new file mode 100644
index 0000000000..efb132aa72
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_delete.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_delete_selected.png b/ui/file_manager/gallery/images/100/icon_delete_selected.png
new file mode 100644
index 0000000000..f2f88d8d0f
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_delete_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_edit.png b/ui/file_manager/gallery/images/100/icon_edit.png
new file mode 100644
index 0000000000..fc72ecf3b6
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_edit.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_edit_selected.png b/ui/file_manager/gallery/images/100/icon_edit_selected.png
new file mode 100644
index 0000000000..61540b5b46
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_edit_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_mosaic.png b/ui/file_manager/gallery/images/100/icon_mosaic.png
new file mode 100644
index 0000000000..6e49d3c929
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_mosaic.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_mosaic_selected.png b/ui/file_manager/gallery/images/100/icon_mosaic_selected.png
new file mode 100644
index 0000000000..86edb6e1ec
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_mosaic_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_print.png b/ui/file_manager/gallery/images/100/icon_print.png
new file mode 100644
index 0000000000..b2355367c2
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_print.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_print_selected.png b/ui/file_manager/gallery/images/100/icon_print_selected.png
new file mode 100644
index 0000000000..657b9c8e29
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_print_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_redo.png b/ui/file_manager/gallery/images/100/icon_redo.png
new file mode 100644
index 0000000000..7b4703b618
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_redo.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_redo_selected.png b/ui/file_manager/gallery/images/100/icon_redo_selected.png
new file mode 100644
index 0000000000..0022a136d0
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_redo_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_rotate.png b/ui/file_manager/gallery/images/100/icon_rotate.png
new file mode 100644
index 0000000000..c60f258f6b
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_rotate.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_rotate_left.png b/ui/file_manager/gallery/images/100/icon_rotate_left.png
new file mode 100644
index 0000000000..ef2f21f435
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_rotate_left.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_rotate_left_selected.png b/ui/file_manager/gallery/images/100/icon_rotate_left_selected.png
new file mode 100644
index 0000000000..1e4c1d6d62
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_rotate_left_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_rotate_selected.png b/ui/file_manager/gallery/images/100/icon_rotate_selected.png
new file mode 100644
index 0000000000..445350fcaf
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_rotate_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_share.png b/ui/file_manager/gallery/images/100/icon_share.png
new file mode 100644
index 0000000000..36bb2218a8
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_share.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_share_selected.png b/ui/file_manager/gallery/images/100/icon_share_selected.png
new file mode 100644
index 0000000000..438e8a2599
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_share_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_slideshow.png b/ui/file_manager/gallery/images/100/icon_slideshow.png
new file mode 100644
index 0000000000..72763d44ed
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_slideshow.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_slideshow_selected.png b/ui/file_manager/gallery/images/100/icon_slideshow_selected.png
new file mode 100644
index 0000000000..4f80a48d40
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_slideshow_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_undo.png b/ui/file_manager/gallery/images/100/icon_undo.png
new file mode 100644
index 0000000000..79e3fddf26
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_undo.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/icon_undo_selected.png b/ui/file_manager/gallery/images/100/icon_undo_selected.png
new file mode 100644
index 0000000000..d5d13a71a9
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/icon_undo_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/slider_thumb.png b/ui/file_manager/gallery/images/100/slider_thumb.png
new file mode 100644
index 0000000000..cb2d712068
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/slider_thumb.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/slideshow-end.png b/ui/file_manager/gallery/images/100/slideshow-end.png
new file mode 100644
index 0000000000..f437111536
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/slideshow-end.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/slideshow-pause.png b/ui/file_manager/gallery/images/100/slideshow-pause.png
new file mode 100644
index 0000000000..2170ce90cf
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/slideshow-pause.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/100/slideshow-play.png b/ui/file_manager/gallery/images/100/slideshow-play.png
new file mode 100644
index 0000000000..f949121d24
--- /dev/null
+++ b/ui/file_manager/gallery/images/100/slideshow-play.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/arrow_left.png b/ui/file_manager/gallery/images/200/arrow_left.png
new file mode 100644
index 0000000000..6e4fb6659a
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/arrow_left.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/arrow_right.png b/ui/file_manager/gallery/images/200/arrow_right.png
new file mode 100644
index 0000000000..22a6c73943
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/arrow_right.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/back_to_files.png b/ui/file_manager/gallery/images/200/back_to_files.png
new file mode 100644
index 0000000000..e04d9d317c
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/back_to_files.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/bubble_point.png b/ui/file_manager/gallery/images/200/bubble_point.png
new file mode 100644
index 0000000000..161e4c06be
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/bubble_point.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/butterbar_close_button.png b/ui/file_manager/gallery/images/200/butterbar_close_button.png
new file mode 100644
index 0000000000..aa6c816938
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/butterbar_close_button.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/cursor_crop.png b/ui/file_manager/gallery/images/200/cursor_crop.png
new file mode 100644
index 0000000000..6202fa978a
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/cursor_crop.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/cursor_leftright.png b/ui/file_manager/gallery/images/200/cursor_leftright.png
new file mode 100644
index 0000000000..a7ee09c632
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/cursor_leftright.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/cursor_move.png b/ui/file_manager/gallery/images/200/cursor_move.png
new file mode 100644
index 0000000000..faa3c8ac39
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/cursor_move.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/cursor_nwse.png b/ui/file_manager/gallery/images/200/cursor_nwse.png
new file mode 100644
index 0000000000..0cd6399da7
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/cursor_nwse.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/cursor_swne.png b/ui/file_manager/gallery/images/200/cursor_swne.png
new file mode 100644
index 0000000000..04d9dc0270
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/cursor_swne.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/cursor_updown.png b/ui/file_manager/gallery/images/200/cursor_updown.png
new file mode 100644
index 0000000000..1e9adfb516
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/cursor_updown.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon.png b/ui/file_manager/gallery/images/200/icon.png
new file mode 100644
index 0000000000..df61101582
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_1up.png b/ui/file_manager/gallery/images/200/icon_1up.png
new file mode 100644
index 0000000000..58cbc28c4c
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_1up.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_1up_selected.png b/ui/file_manager/gallery/images/200/icon_1up_selected.png
new file mode 100644
index 0000000000..a0ca726fa0
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_1up_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_autofix.png b/ui/file_manager/gallery/images/200/icon_autofix.png
new file mode 100644
index 0000000000..8ce4917d4d
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_autofix.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_autofix_selected.png b/ui/file_manager/gallery/images/200/icon_autofix_selected.png
new file mode 100644
index 0000000000..8838d5ce5f
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_autofix_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_brightness.png b/ui/file_manager/gallery/images/200/icon_brightness.png
new file mode 100644
index 0000000000..ffcd385294
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_brightness.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_brightness_selected.png b/ui/file_manager/gallery/images/200/icon_brightness_selected.png
new file mode 100644
index 0000000000..90bf03bbd8
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_brightness_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_contrast.png b/ui/file_manager/gallery/images/200/icon_contrast.png
new file mode 100644
index 0000000000..eec931d56d
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_contrast.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_crop.png b/ui/file_manager/gallery/images/200/icon_crop.png
new file mode 100644
index 0000000000..7c12fb5423
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_crop.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_crop_selected.png b/ui/file_manager/gallery/images/200/icon_crop_selected.png
new file mode 100644
index 0000000000..bb2e9e6cc0
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_crop_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_delete.png b/ui/file_manager/gallery/images/200/icon_delete.png
new file mode 100644
index 0000000000..a55ac6c808
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_delete.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_delete_selected.png b/ui/file_manager/gallery/images/200/icon_delete_selected.png
new file mode 100644
index 0000000000..af54168a2e
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_delete_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_edit.png b/ui/file_manager/gallery/images/200/icon_edit.png
new file mode 100644
index 0000000000..288bc5b7e4
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_edit.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_edit_selected.png b/ui/file_manager/gallery/images/200/icon_edit_selected.png
new file mode 100644
index 0000000000..bcf993396d
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_edit_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_mosaic.png b/ui/file_manager/gallery/images/200/icon_mosaic.png
new file mode 100644
index 0000000000..3e1a621b55
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_mosaic.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_mosaic_selected.png b/ui/file_manager/gallery/images/200/icon_mosaic_selected.png
new file mode 100644
index 0000000000..d9e329d907
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_mosaic_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_print.png b/ui/file_manager/gallery/images/200/icon_print.png
new file mode 100644
index 0000000000..b5a9be0c6b
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_print.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_print_selected.png b/ui/file_manager/gallery/images/200/icon_print_selected.png
new file mode 100644
index 0000000000..048a34172e
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_print_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_redo.png b/ui/file_manager/gallery/images/200/icon_redo.png
new file mode 100644
index 0000000000..075275da89
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_redo.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_redo_selected.png b/ui/file_manager/gallery/images/200/icon_redo_selected.png
new file mode 100644
index 0000000000..beed584ffe
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_redo_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_rotate.png b/ui/file_manager/gallery/images/200/icon_rotate.png
new file mode 100644
index 0000000000..db2c0b09f9
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_rotate.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_rotate_left.png b/ui/file_manager/gallery/images/200/icon_rotate_left.png
new file mode 100644
index 0000000000..da57329d89
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_rotate_left.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_rotate_left_selected.png b/ui/file_manager/gallery/images/200/icon_rotate_left_selected.png
new file mode 100644
index 0000000000..d1b00a7e73
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_rotate_left_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_rotate_selected.png b/ui/file_manager/gallery/images/200/icon_rotate_selected.png
new file mode 100644
index 0000000000..b3a9bf60a2
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_rotate_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_share.png b/ui/file_manager/gallery/images/200/icon_share.png
new file mode 100644
index 0000000000..b1da6d96d4
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_share.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_share_selected.png b/ui/file_manager/gallery/images/200/icon_share_selected.png
new file mode 100644
index 0000000000..b3cd00f111
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_share_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_slideshow.png b/ui/file_manager/gallery/images/200/icon_slideshow.png
new file mode 100644
index 0000000000..fec87c0ae9
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_slideshow.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_slideshow_selected.png b/ui/file_manager/gallery/images/200/icon_slideshow_selected.png
new file mode 100644
index 0000000000..4e1ed5aabf
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_slideshow_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_undo.png b/ui/file_manager/gallery/images/200/icon_undo.png
new file mode 100644
index 0000000000..c51fd6258e
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_undo.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/icon_undo_selected.png b/ui/file_manager/gallery/images/200/icon_undo_selected.png
new file mode 100644
index 0000000000..92d3a01d8e
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/icon_undo_selected.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/slider_thumb.png b/ui/file_manager/gallery/images/200/slider_thumb.png
new file mode 100644
index 0000000000..e100da6261
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/slider_thumb.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/slideshow-end.png b/ui/file_manager/gallery/images/200/slideshow-end.png
new file mode 100644
index 0000000000..5e19f8d002
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/slideshow-end.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/slideshow-pause.png b/ui/file_manager/gallery/images/200/slideshow-pause.png
new file mode 100644
index 0000000000..13457d999f
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/slideshow-pause.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/200/slideshow-play.png b/ui/file_manager/gallery/images/200/slideshow-play.png
new file mode 100644
index 0000000000..aa9bd88fc8
--- /dev/null
+++ b/ui/file_manager/gallery/images/200/slideshow-play.png
Binary files differ
diff --git a/ui/file_manager/gallery/js/background.js b/ui/file_manager/gallery/js/background.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/ui/file_manager/gallery/js/background.js
diff --git a/ui/file_manager/gallery/js/error_util.js b/ui/file_manager/gallery/js/error_util.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/ui/file_manager/gallery/js/error_util.js
diff --git a/ui/file_manager/gallery/js/gallery.js b/ui/file_manager/gallery/js/gallery.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/ui/file_manager/gallery/js/gallery.js
diff --git a/ui/file_manager/gallery/js/gallery_scripts.js b/ui/file_manager/gallery/js/gallery_scripts.js
new file mode 100644
index 0000000000..a9286e09ab
--- /dev/null
+++ b/ui/file_manager/gallery/js/gallery_scripts.js
@@ -0,0 +1,20 @@
+// 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.
+
+// The include directives are put into Javascript-style comments to prevent
+// parsing errors in non-flattened mode. The flattener still sees them.
+// Note that this makes the flattener to comment out the first line of the
+// included file but that's all right since any javascript file should start
+// with a copyright comment anyway.
+
+//<include src="error_util.js"/>
+
+//<include src="../../../webui/resources/js/cr.js"/>
+//<include src="../../../webui/resources/js/load_time_data.js"/>
+
+(function() {
+'use strict';
+
+//<include src="gallery.js"/>
+})();
diff --git a/ui/file_manager/gallery/js/test_util.js b/ui/file_manager/gallery/js/test_util.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/ui/file_manager/gallery/js/test_util.js
diff --git a/ui/file_manager/gallery/manifest.json b/ui/file_manager/gallery/manifest.json
new file mode 100644
index 0000000000..3dbeda2222
--- /dev/null
+++ b/ui/file_manager/gallery/manifest.json
@@ -0,0 +1,50 @@
+{
+ // chrome-extension://jcgeabjmjgoblfofpppfkcoakmfobdko/
+ "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0/gRbJc545iEGRZs20Rl/HtrSUp8H3gJd4Y6hCe0CG1xQiJhZ5nc8qZyxa96gMxRAKBq54S6sjVVtV6uS70oU6FvrvwItByYkkqr4ZE7eMJKwMqnGItxWbh6KBodf89lpKoIy6MtYTqubBhXB/IQBZsXah90tXwRzaaJNWw+2BBRIhcPsH3ng+wgN7rwFxo4HIv9ZpqkYlx90rwkfjOmKPPnSXyXFIBJfmqfdbd8PLtcxzzOTE+vxwoXZuYWrthKm4uKfNqXIYns74sSJlqyKfctuR+nQdNh8uePv0e+/Ul3wER1/jIXULLjfyoaklyDs+ak3SDf+xWScJ+0LJ0AwIDAQAB",
+ "manifest_version": 2,
+ "name": "Gallery",
+ "version": "2.0",
+ "description": "Picture and video browser app.",
+ "display_in_launcher": false,
+ "incognito" : "split",
+ "icons": {
+ "16": "images/100/icon.png",
+ "32": "images/200/icon.png"
+ },
+ "permissions": [
+ "fileSystem",
+ "fileBrowserPrivate",
+ "fullscreen",
+ "mediaPlayerPrivate",
+ "storage",
+ "chrome://theme/"
+ ],
+ "file_handlers": {
+ "video": {
+ "types": [
+ "image/*"
+ ],
+ "extensions": [
+ "bmp",
+ "gif",
+ "ico",
+ "jpg",
+ "jpeg",
+ "png",
+ "webp"
+ ],
+ // TODO(hirono): Rename and localize this.
+ "title": "Open in new Gallery"
+ }
+ },
+ "app": {
+ "background": {
+ "scripts": [
+ "js/error_util.js",
+ "js/test_util.js",
+ "js/background.js"
+ ]
+ },
+ "content_security_policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' chrome://theme data:; media-src 'self'; object-src 'self'"
+ }
+}
diff --git a/ui/file_manager/image_loader/background.js b/ui/file_manager/image_loader/background.js
new file mode 100644
index 0000000000..028a08298c
--- /dev/null
+++ b/ui/file_manager/image_loader/background.js
@@ -0,0 +1,8 @@
+// Copyright 2013 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.
+
+'use strict';
+
+// Load the extension.
+ImageLoader.getInstance();
diff --git a/ui/file_manager/image_loader/cache.js b/ui/file_manager/image_loader/cache.js
new file mode 100644
index 0000000000..dde287c1a0
--- /dev/null
+++ b/ui/file_manager/image_loader/cache.js
@@ -0,0 +1,410 @@
+// Copyright 2013 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.
+
+'use strict';
+
+/**
+ * Persistent cache storing images in an indexed database on the hard disk.
+ * @constructor
+ */
+function Cache() {
+ /**
+ * IndexedDB database handle.
+ * @type {IDBDatabase}
+ * @private
+ */
+ this.db_ = null;
+}
+
+/**
+ * Cache database name.
+ * @type {string}
+ * @const
+ */
+Cache.DB_NAME = 'image-loader';
+
+/**
+ * Cache database version.
+ * @type {number}
+ * @const
+ */
+Cache.DB_VERSION = 11;
+
+/**
+ * Memory limit for images data in bytes.
+ *
+ * @const
+ * @type {number}
+ */
+Cache.MEMORY_LIMIT = 250 * 1024 * 1024; // 250 MB.
+
+/**
+ * Minimal amount of memory freed per eviction. Used to limit number of
+ * evictions which are expensive.
+ *
+ * @const
+ * @type {number}
+ */
+Cache.EVICTION_CHUNK_SIZE = 50 * 1024 * 1024; // 50 MB.
+
+/**
+ * Creates a cache key.
+ *
+ * @param {Object} request Request options.
+ * @return {string} Cache key.
+ */
+Cache.createKey = function(request) {
+ return JSON.stringify({url: request.url,
+ scale: request.scale,
+ width: request.width,
+ height: request.height,
+ maxWidth: request.maxWidth,
+ maxHeight: request.maxHeight});
+};
+
+/**
+ * Initializes the cache database.
+ * @param {function()} callback Completion callback.
+ */
+Cache.prototype.initialize = function(callback) {
+ // Establish a connection to the database or (re)create it if not available
+ // or not up to date. After changing the database's schema, increment
+ // Cache.DB_VERSION to force database recreating.
+ var openRequest = window.webkitIndexedDB.open(Cache.DB_NAME,
+ Cache.DB_VERSION);
+
+ openRequest.onsuccess = function(e) {
+ this.db_ = e.target.result;
+ callback();
+ }.bind(this);
+
+ openRequest.onerror = callback;
+
+ openRequest.onupgradeneeded = function(e) {
+ console.info('Cache database creating or upgrading.');
+ var db = e.target.result;
+ if (db.objectStoreNames.contains('metadata'))
+ db.deleteObjectStore('metadata');
+ if (db.objectStoreNames.contains('data'))
+ db.deleteObjectStore('data');
+ if (db.objectStoreNames.contains('settings'))
+ db.deleteObjectStore('settings');
+ db.createObjectStore('metadata', {keyPath: 'key'});
+ db.createObjectStore('data', {keyPath: 'key'});
+ db.createObjectStore('settings', {keyPath: 'key'});
+ };
+};
+
+/**
+ * Sets size of the cache.
+ *
+ * @param {number} size Size in bytes.
+ * @param {IDBTransaction=} opt_transaction Transaction to be reused. If not
+ * provided, then a new one is created.
+ * @private
+ */
+Cache.prototype.setCacheSize_ = function(size, opt_transaction) {
+ var transaction = opt_transaction ||
+ this.db_.transaction(['settings'], 'readwrite');
+ var settingsStore = transaction.objectStore('settings');
+
+ settingsStore.put({key: 'size', value: size}); // Update asynchronously.
+};
+
+/**
+ * Fetches current size of the cache.
+ *
+ * @param {function(number)} onSuccess Callback to return the size.
+ * @param {function()} onFailure Failure callback.
+ * @param {IDBTransaction=} opt_transaction Transaction to be reused. If not
+ * provided, then a new one is created.
+ * @private
+ */
+Cache.prototype.fetchCacheSize_ = function(
+ onSuccess, onFailure, opt_transaction) {
+ var transaction = opt_transaction ||
+ this.db_.transaction(['settings', 'metadata', 'data'], 'readwrite');
+ var settingsStore = transaction.objectStore('settings');
+ var sizeRequest = settingsStore.get('size');
+
+ sizeRequest.onsuccess = function(e) {
+ if (e.target.result)
+ onSuccess(e.target.result.value);
+ else
+ onSuccess(0);
+ };
+
+ sizeRequest.onerror = function() {
+ console.error('Failed to fetch size from the database.');
+ onFailure();
+ };
+};
+
+/**
+ * Evicts the least used elements in cache to make space for a new image and
+ * updates size of the cache taking into account the upcoming item.
+ *
+ * @param {number} size Requested size.
+ * @param {function()} onSuccess Success callback.
+ * @param {function()} onFailure Failure callback.
+ * @param {IDBTransaction=} opt_transaction Transaction to be reused. If not
+ * provided, then a new one is created.
+ * @private
+ */
+Cache.prototype.evictCache_ = function(
+ size, onSuccess, onFailure, opt_transaction) {
+ var transaction = opt_transaction ||
+ this.db_.transaction(['settings', 'metadata', 'data'], 'readwrite');
+
+ // Check if the requested size is smaller than the cache size.
+ if (size > Cache.MEMORY_LIMIT) {
+ onFailure();
+ return;
+ }
+
+ var onCacheSize = function(cacheSize) {
+ if (size < Cache.MEMORY_LIMIT - cacheSize) {
+ // Enough space, no need to evict.
+ this.setCacheSize_(cacheSize + size, transaction);
+ onSuccess();
+ return;
+ }
+
+ var bytesToEvict = Math.max(size, Cache.EVICTION_CHUNK_SIZE);
+
+ // Fetch all metadata.
+ var metadataEntries = [];
+ var metadataStore = transaction.objectStore('metadata');
+ var dataStore = transaction.objectStore('data');
+
+ var onEntriesFetched = function() {
+ metadataEntries.sort(function(a, b) {
+ return b.lastLoadTimestamp - a.lastLoadTimestamp;
+ });
+
+ var totalEvicted = 0;
+ while (bytesToEvict > 0) {
+ var entry = metadataEntries.pop();
+ totalEvicted += entry.size;
+ bytesToEvict -= entry.size;
+ metadataStore.delete(entry.key); // Remove asynchronously.
+ dataStore.delete(entry.key); // Remove asynchronously.
+ }
+
+ this.setCacheSize_(cacheSize - totalEvicted + size, transaction);
+ }.bind(this);
+
+ metadataStore.openCursor().onsuccess = function(e) {
+ var cursor = event.target.result;
+ if (cursor) {
+ metadataEntries.push(cursor.value);
+ cursor.continue();
+ } else {
+ onEntriesFetched();
+ }
+ };
+ }.bind(this);
+
+ this.fetchCacheSize_(onCacheSize, onFailure, transaction);
+};
+
+/**
+ * Saves an image in the cache.
+ *
+ * @param {string} key Cache key.
+ * @param {string} data Image data.
+ * @param {number} timestamp Last modification timestamp. Used to detect
+ * if the cache entry becomes out of date.
+ */
+Cache.prototype.saveImage = function(key, data, timestamp) {
+ if (!this.db_) {
+ console.warn('Cache database not available.');
+ return;
+ }
+
+ var onNotFoundInCache = function() {
+ var metadataEntry = {key: key,
+ timestamp: timestamp,
+ size: data.length,
+ lastLoadTimestamp: Date.now()};
+ var dataEntry = {key: key,
+ data: data};
+
+ var transaction = this.db_.transaction(['settings', 'metadata', 'data'],
+ 'readwrite');
+ var metadataStore = transaction.objectStore('metadata');
+ var dataStore = transaction.objectStore('data');
+
+ var onCacheEvicted = function() {
+ metadataStore.put(metadataEntry); // Add asynchronously.
+ dataStore.put(dataEntry); // Add asynchronously.
+ };
+
+ // Make sure there is enough space in the cache.
+ this.evictCache_(data.length, onCacheEvicted, function() {}, transaction);
+ }.bind(this);
+
+ // Check if the image is already in cache. If not, then save it to cache.
+ this.loadImage(key, timestamp, function() {}, onNotFoundInCache);
+};
+
+/**
+ * Loads an image from the cache (if available) or returns null.
+ *
+ * @param {string} key Cache key.
+ * @param {number} timestamp Last modification timestamp. If different
+ * that the one in cache, then the entry will be invalidated.
+ * @param {function(<string>)} onSuccess Success callback with the image's data.
+ * @param {function()} onFailure Failure callback.
+ */
+Cache.prototype.loadImage = function(key, timestamp, onSuccess, onFailure) {
+ if (!this.db_) {
+ console.warn('Cache database not available.');
+ onFailure();
+ return;
+ }
+
+ var transaction = this.db_.transaction(['settings', 'metadata', 'data'],
+ 'readwrite');
+ var metadataStore = transaction.objectStore('metadata');
+ var dataStore = transaction.objectStore('data');
+ var metadataRequest = metadataStore.get(key);
+ var dataRequest = dataStore.get(key);
+
+ var metadataEntry = null;
+ var metadataReceived = false;
+ var dataEntry = null;
+ var dataReceived = false;
+
+ var onPartialSuccess = function() {
+ // Check if all sub-requests have finished.
+ if (!metadataReceived || !dataReceived)
+ return;
+
+ // Check if both entries are available or both unavailable.
+ if (!!metadataEntry != !!dataEntry) {
+ console.warn('Incosistent cache database.');
+ onFailure();
+ return;
+ }
+
+ // Process the responses.
+ if (!metadataEntry) {
+ // The image not found.
+ onFailure();
+ } else if (metadataEntry.timestamp != timestamp) {
+ // The image is not up to date, so remove it.
+ this.removeImage(key, function() {}, function() {}, transaction);
+ onFailure();
+ } else {
+ // The image is available. Update the last load time and return the
+ // image data.
+ metadataEntry.lastLoadTimestamp = Date.now();
+ metadataStore.put(metadataEntry); // Added asynchronously.
+ onSuccess(dataEntry.data);
+ }
+ }.bind(this);
+
+ metadataRequest.onsuccess = function(e) {
+ if (e.target.result)
+ metadataEntry = e.target.result;
+ metadataReceived = true;
+ onPartialSuccess();
+ };
+
+ dataRequest.onsuccess = function(e) {
+ if (e.target.result)
+ dataEntry = e.target.result;
+ dataReceived = true;
+ onPartialSuccess();
+ };
+
+ metadataRequest.onerror = function() {
+ console.error('Failed to fetch metadata from the database.');
+ metadataReceived = true;
+ onPartialSuccess();
+ };
+
+ dataRequest.onerror = function() {
+ console.error('Failed to fetch image data from the database.');
+ dataReceived = true;
+ onPartialSuccess();
+ };
+};
+
+/**
+ * Removes the image from the cache.
+ *
+ * @param {string} key Cache key.
+ * @param {function()=} opt_onSuccess Success callback.
+ * @param {function()=} opt_onFailure Failure callback.
+ * @param {IDBTransaction=} opt_transaction Transaction to be reused. If not
+ * provided, then a new one is created.
+ */
+Cache.prototype.removeImage = function(
+ key, opt_onSuccess, opt_onFailure, opt_transaction) {
+ if (!this.db_) {
+ console.warn('Cache database not available.');
+ return;
+ }
+
+ var transaction = opt_transaction ||
+ this.db_.transaction(['settings', 'metadata', 'data'], 'readwrite');
+ var metadataStore = transaction.objectStore('metadata');
+ var dataStore = transaction.objectStore('data');
+
+ var cacheSize = null;
+ var cacheSizeReceived = false;
+ var metadataEntry = null;
+ var metadataReceived = false;
+
+ var onPartialSuccess = function() {
+ if (!cacheSizeReceived || !metadataReceived)
+ return;
+
+ // If either cache size or metadata entry is not available, then it is
+ // an error.
+ if (cacheSize === null || !metadataEntry) {
+ if (opt_onFailure)
+ onFailure();
+ return;
+ }
+
+ if (opt_onSuccess)
+ opt_onSuccess();
+
+ this.setCacheSize_(cacheSize - metadataEntry.size, transaction);
+ metadataStore.delete(key); // Delete asynchronously.
+ dataStore.delete(key); // Delete asynchronously.
+ }.bind(this);
+
+ var onCacheSizeFailure = function() {
+ cacheSizeReceived = true;
+ };
+
+ var onCacheSizeSuccess = function(result) {
+ cacheSize = result;
+ cacheSizeReceived = true;
+ onPartialSuccess();
+ };
+
+ // Fetch the current cache size.
+ this.fetchCacheSize_(onCacheSizeSuccess, onCacheSizeFailure, transaction);
+
+ // Receive image's metadata.
+ var metadataRequest = metadataStore.get(key);
+
+ metadataRequest.onsuccess = function(e) {
+ if (e.target.result)
+ metadataEntry = e.target.result;
+ metadataReceived = true;
+ onPartialSuccess();
+ };
+
+ metadataRequest.onerror = function() {
+ console.error('Failed to remove an image.');
+ metadataReceived = true;
+ onPartialSuccess();
+ };
+};
diff --git a/ui/file_manager/image_loader/image_loader.js b/ui/file_manager/image_loader/image_loader.js
new file mode 100644
index 0000000000..24b07a4d62
--- /dev/null
+++ b/ui/file_manager/image_loader/image_loader.js
@@ -0,0 +1,234 @@
+// Copyright 2013 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.
+
+'use strict';
+
+/**
+ * Loads and resizes an image.
+ * @constructor
+ */
+function ImageLoader() {
+ /**
+ * Persistent cache object.
+ * @type {Cache}
+ * @private
+ */
+ this.cache_ = new Cache();
+
+ /**
+ * Manages pending requests and runs them in order of priorities.
+ * @type {Worker}
+ * @private
+ */
+ this.worker_ = new Worker();
+
+ // Grant permissions to all volumes, initialize the cache and then start the
+ // worker.
+ chrome.fileBrowserPrivate.getVolumeMetadataList(function(volumeMetadataList) {
+ var initPromises = volumeMetadataList.map(function(volumeMetadata) {
+ var requestPromise = new Promise(function(callback) {
+ chrome.fileBrowserPrivate.requestFileSystem(
+ volumeMetadata.volumeId,
+ callback);
+ });
+ return requestPromise;
+ });
+ initPromises.push(new Promise(this.cache_.initialize.bind(this.cache_)));
+
+ // After all initializatino promises are done, start the worker.
+ Promise.all(initPromises).then(this.worker_.start.bind(this.worker_));
+
+ // Listen for mount events, and grant permissions to volumes being mounted.
+ chrome.fileBrowserPrivate.onMountCompleted.addListener(
+ function(event) {
+ if (event.eventType == 'mount' && event.status == 'success') {
+ chrome.fileBrowserPrivate.requestFileSystem(
+ event.volumeMetadata.volumeId, function() {});
+ }
+ });
+ }.bind(this));
+
+ // Listen for incoming requests.
+ chrome.extension.onMessageExternal.addListener(function(request,
+ sender,
+ sendResponse) {
+ if (ImageLoader.ALLOWED_CLIENTS.indexOf(sender.id) !== -1) {
+ // Sending a response may fail if the receiver already went offline.
+ // This is not an error, but a normal and quite common situation.
+ var failSafeSendResponse = function(response) {
+ try {
+ sendResponse(response);
+ }
+ catch (e) {
+ // Ignore the error.
+ }
+ };
+ return this.onMessage_(sender.id, request, failSafeSendResponse);
+ }
+ }.bind(this));
+}
+
+/**
+ * List of extensions allowed to perform image requests.
+ *
+ * @const
+ * @type {Array.<string>}
+ */
+ImageLoader.ALLOWED_CLIENTS =
+ ['hhaomjibdihmijegdhdafkllkbggdgoj']; // File Manager's extension id.
+
+/**
+ * Handles a request. Depending on type of the request, starts or stops
+ * an image task.
+ *
+ * @param {string} senderId Sender's extension id.
+ * @param {Object} request Request message as a hash array.
+ * @param {function} callback Callback to be called to return response.
+ * @return {boolean} True if the message channel should stay alive until the
+ * callback is called.
+ * @private
+ */
+ImageLoader.prototype.onMessage_ = function(senderId, request, callback) {
+ var requestId = senderId + ':' + request.taskId;
+ if (request.cancel) {
+ // Cancel a task.
+ this.worker_.remove(requestId);
+ return false; // No callback calls.
+ } else {
+ // Create a request task and add it to the worker (queue).
+ var requestTask = new Request(requestId, this.cache_, request, callback);
+ this.worker_.add(requestTask);
+ return true; // Request will call the callback.
+ }
+};
+
+/**
+ * Returns the singleton instance.
+ * @return {ImageLoader} ImageLoader object.
+ */
+ImageLoader.getInstance = function() {
+ if (!ImageLoader.instance_)
+ ImageLoader.instance_ = new ImageLoader();
+ return ImageLoader.instance_;
+};
+
+/**
+ * Checks if the options contain any image processing.
+ *
+ * @param {number} width Source width.
+ * @param {number} height Source height.
+ * @param {Object} options Resizing options as a hash array.
+ * @return {boolean} True if yes, false if not.
+ */
+ImageLoader.shouldProcess = function(width, height, options) {
+ var targetDimensions = ImageLoader.resizeDimensions(width, height, options);
+
+ // Dimensions has to be adjusted.
+ if (targetDimensions.width != width || targetDimensions.height != height)
+ return true;
+
+ // Orientation has to be adjusted.
+ if (options.orientation)
+ return true;
+
+ // No changes required.
+ return false;
+};
+
+/**
+ * Calculates dimensions taking into account resize options, such as:
+ * - scale: for scaling,
+ * - maxWidth, maxHeight: for maximum dimensions,
+ * - width, height: for exact requested size.
+ * Returns the target size as hash array with width, height properties.
+ *
+ * @param {number} width Source width.
+ * @param {number} height Source height.
+ * @param {Object} options Resizing options as a hash array.
+ * @return {Object} Dimensions, eg. {width: 100, height: 50}.
+ */
+ImageLoader.resizeDimensions = function(width, height, options) {
+ var sourceWidth = width;
+ var sourceHeight = height;
+
+ // Flip dimensions for odd orientation values: 1 (90deg) and 3 (270deg).
+ if (options.orientation && options.orientation % 2) {
+ sourceWidth = height;
+ sourceHeight = width;
+ }
+
+ var targetWidth = sourceWidth;
+ var targetHeight = sourceHeight;
+
+ if ('scale' in options) {
+ targetWidth = sourceWidth * options.scale;
+ targetHeight = sourceHeight * options.scale;
+ }
+
+ if (options.maxWidth &&
+ targetWidth > options.maxWidth) {
+ var scale = options.maxWidth / targetWidth;
+ targetWidth *= scale;
+ targetHeight *= scale;
+ }
+
+ if (options.maxHeight &&
+ targetHeight > options.maxHeight) {
+ var scale = options.maxHeight / targetHeight;
+ targetWidth *= scale;
+ targetHeight *= scale;
+ }
+
+ if (options.width)
+ targetWidth = options.width;
+
+ if (options.height)
+ targetHeight = options.height;
+
+ targetWidth = Math.round(targetWidth);
+ targetHeight = Math.round(targetHeight);
+
+ return {width: targetWidth, height: targetHeight};
+};
+
+/**
+ * Performs resizing of the source image into the target canvas.
+ *
+ * @param {HTMLCanvasElement|Image} source Source image or canvas.
+ * @param {HTMLCanvasElement} target Target canvas.
+ * @param {Object} options Resizing options as a hash array.
+ */
+ImageLoader.resize = function(source, target, options) {
+ var targetDimensions = ImageLoader.resizeDimensions(
+ source.width, source.height, options);
+
+ target.width = targetDimensions.width;
+ target.height = targetDimensions.height;
+
+ // Default orientation is 0deg.
+ var orientation = options.orientation || 0;
+
+ // For odd orientation values: 1 (90deg) and 3 (270deg) flip dimensions.
+ var drawImageWidth;
+ var drawImageHeight;
+ if (orientation % 2) {
+ drawImageWidth = target.height;
+ drawImageHeight = target.width;
+ } else {
+ drawImageWidth = target.width;
+ drawImageHeight = target.height;
+ }
+
+ var targetContext = target.getContext('2d');
+ targetContext.save();
+ targetContext.translate(target.width / 2, target.height / 2);
+ targetContext.rotate(orientation * Math.PI / 2);
+ targetContext.drawImage(
+ source,
+ 0, 0,
+ source.width, source.height,
+ -drawImageWidth / 2, -drawImageHeight / 2,
+ drawImageWidth, drawImageHeight);
+ targetContext.restore();
+};
diff --git a/ui/file_manager/image_loader/image_loader_client.js b/ui/file_manager/image_loader/image_loader_client.js
new file mode 100644
index 0000000000..9baba5997b
--- /dev/null
+++ b/ui/file_manager/image_loader/image_loader_client.js
@@ -0,0 +1,366 @@
+// Copyright 2013 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.
+
+'use strict';
+
+/**
+ * Client used to connect to the remote ImageLoader extension. Client class runs
+ * in the extension, where the client.js is included (eg. Files.app).
+ * It sends remote requests using IPC to the ImageLoader class and forwards
+ * its responses.
+ *
+ * Implements cache, which is stored in the calling extension.
+ *
+ * @constructor
+ */
+function ImageLoaderClient() {
+ /**
+ * Hash array with active tasks.
+ * @type {Object}
+ * @private
+ */
+ this.tasks_ = {};
+
+ /**
+ * @type {number}
+ * @private
+ */
+ this.lastTaskId_ = 0;
+
+ /**
+ * LRU cache for images.
+ * @type {ImageLoaderClient.Cache}
+ * @private
+ */
+ this.cache_ = new ImageLoaderClient.Cache();
+}
+
+/**
+ * Image loader's extension id.
+ * @const
+ * @type {string}
+ */
+ImageLoaderClient.EXTENSION_ID = 'pmfjbimdmchhbnneeidfognadeopoehp';
+
+/**
+ * Returns a singleton instance.
+ * @return {Client} Client instance.
+ */
+ImageLoaderClient.getInstance = function() {
+ if (!ImageLoaderClient.instance_)
+ ImageLoaderClient.instance_ = new ImageLoaderClient();
+ return ImageLoaderClient.instance_;
+};
+
+/**
+ * Records binary metrics. Counts for true and false are stored as a histogram.
+ * @param {string} name Histogram's name.
+ * @param {boolean} value True or false.
+ */
+ImageLoaderClient.recordBinary = function(name, value) {
+ chrome.metricsPrivate.recordValue(
+ { metricName: 'ImageLoader.Client.' + name,
+ type: 'histogram-linear',
+ min: 1, // According to histogram.h, this should be 1 for enums.
+ max: 2, // Maximum should be exclusive.
+ buckets: 3 }, // Number of buckets: 0, 1 and overflowing 2.
+ value ? 1 : 0);
+};
+
+/**
+ * Records percent metrics, stored as a histogram.
+ * @param {string} name Histogram's name.
+ * @param {number} value Value (0..100).
+ */
+ImageLoaderClient.recordPercentage = function(name, value) {
+ chrome.metricsPrivate.recordPercentage('ImageLoader.Client.' + name,
+ Math.round(value));
+};
+
+/**
+ * Sends a message to the Image Loader extension.
+ * @param {Object} request Hash array with request data.
+ * @param {function(Object)=} opt_callback Response handling callback.
+ * The response is passed as a hash array.
+ * @private
+ */
+ImageLoaderClient.sendMessage_ = function(request, opt_callback) {
+ opt_callback = opt_callback || function(response) {};
+ var sendMessage = chrome.runtime ? chrome.runtime.sendMessage :
+ chrome.extension.sendMessage;
+ sendMessage(ImageLoaderClient.EXTENSION_ID, request, opt_callback);
+};
+
+/**
+ * Handles a message from the remote image loader and calls the registered
+ * callback to pass the response back to the requester.
+ *
+ * @param {Object} message Response message as a hash array.
+ * @private
+ */
+ImageLoaderClient.prototype.handleMessage_ = function(message) {
+ if (!(message.taskId in this.tasks_)) {
+ // This task has been canceled, but was already fetched, so it's result
+ // should be discarded anyway.
+ return;
+ }
+
+ var task = this.tasks_[message.taskId];
+
+ // Check if the task is still valid.
+ if (task.isValid())
+ task.accept(message);
+
+ delete this.tasks_[message.taskId];
+};
+
+/**
+ * Loads and resizes and image. Use opt_isValid to easily cancel requests
+ * which are not valid anymore, which will reduce cpu consumption.
+ *
+ * @param {string} url Url of the requested image.
+ * @param {function} callback Callback used to return response.
+ * @param {Object=} opt_options Loader options, such as: scale, maxHeight,
+ * width, height and/or cache.
+ * @param {function=} opt_isValid Function returning false in case
+ * a request is not valid anymore, eg. parent node has been detached.
+ * @return {?number} Remote task id or null if loaded from cache.
+ */
+ImageLoaderClient.prototype.load = function(
+ url, callback, opt_options, opt_isValid) {
+ opt_options = opt_options || {};
+ opt_isValid = opt_isValid || function() { return true; };
+
+ // Record cache usage.
+ ImageLoaderClient.recordPercentage('Cache.Usage', this.cache_.getUsage());
+
+ // Cancel old, invalid tasks.
+ var taskKeys = Object.keys(this.tasks_);
+ for (var index = 0; index < taskKeys.length; index++) {
+ var taskKey = taskKeys[index];
+ var task = this.tasks_[taskKey];
+ if (!task.isValid()) {
+ // Cancel this task since it is not valid anymore.
+ this.cancel(taskKey);
+ delete this.tasks_[taskKey];
+ }
+ }
+
+ // Replace the extension id.
+ var sourceId = chrome.i18n.getMessage('@@extension_id');
+ var targetId = ImageLoaderClient.EXTENSION_ID;
+
+ url = url.replace('filesystem:chrome-extension://' + sourceId,
+ 'filesystem:chrome-extension://' + targetId);
+
+ // Try to load from cache, if available.
+ var cacheKey = ImageLoaderClient.Cache.createKey(url, opt_options);
+ if (opt_options.cache) {
+ // Load from cache.
+ ImageLoaderClient.recordBinary('Cached', 1);
+ var cachedData = this.cache_.loadImage(cacheKey, opt_options.timestamp);
+ if (cachedData) {
+ ImageLoaderClient.recordBinary('Cache.HitMiss', 1);
+ callback({status: 'success', data: cachedData});
+ return null;
+ } else {
+ ImageLoaderClient.recordBinary('Cache.HitMiss', 0);
+ }
+ } else {
+ // Remove from cache.
+ ImageLoaderClient.recordBinary('Cached', 0);
+ this.cache_.removeImage(cacheKey);
+ }
+
+ // Not available in cache, performing a request to a remote extension.
+ var request = opt_options;
+ this.lastTaskId_++;
+ var task = {isValid: opt_isValid};
+ this.tasks_[this.lastTaskId_] = task;
+
+ request.url = url;
+ request.taskId = this.lastTaskId_;
+ request.timestamp = opt_options.timestamp;
+
+ ImageLoaderClient.sendMessage_(
+ request,
+ function(result) {
+ // Save to cache.
+ if (result.status == 'success' && opt_options.cache)
+ this.cache_.saveImage(cacheKey, result.data, opt_options.timestamp);
+ callback(result);
+ }.bind(this));
+ return request.taskId;
+};
+
+/**
+ * Cancels the request.
+ * @param {number} taskId Task id returned by ImageLoaderClient.load().
+ */
+ImageLoaderClient.prototype.cancel = function(taskId) {
+ ImageLoaderClient.sendMessage_({taskId: taskId, cancel: true});
+};
+
+/**
+ * Least Recently Used (LRU) cache implementation to be used by
+ * Client class. It has memory constraints, so it will never
+ * exceed specified memory limit defined in MEMORY_LIMIT.
+ *
+ * @constructor
+ */
+ImageLoaderClient.Cache = function() {
+ this.images_ = [];
+ this.size_ = 0;
+};
+
+/**
+ * Memory limit for images data in bytes.
+ *
+ * @const
+ * @type {number}
+ */
+ImageLoaderClient.Cache.MEMORY_LIMIT = 20 * 1024 * 1024; // 20 MB.
+
+/**
+ * Creates a cache key.
+ *
+ * @param {string} url Image url.
+ * @param {Object=} opt_options Loader options as a hash array.
+ * @return {string} Cache key.
+ */
+ImageLoaderClient.Cache.createKey = function(url, opt_options) {
+ opt_options = opt_options || {};
+ return JSON.stringify({url: url,
+ orientation: opt_options.orientation,
+ scale: opt_options.scale,
+ width: opt_options.width,
+ height: opt_options.height,
+ maxWidth: opt_options.maxWidth,
+ maxHeight: opt_options.maxHeight});
+};
+
+/**
+ * Evicts the least used elements in cache to make space for a new image.
+ *
+ * @param {number} size Requested size.
+ * @private
+ */
+ImageLoaderClient.Cache.prototype.evictCache_ = function(size) {
+ // Sort from the most recent to the oldest.
+ this.images_.sort(function(a, b) {
+ return b.lastLoadTimestamp - a.lastLoadTimestamp;
+ });
+
+ while (this.images_.length > 0 &&
+ (ImageLoaderClient.Cache.MEMORY_LIMIT - this.size_ < size)) {
+ var entry = this.images_.pop();
+ this.size_ -= entry.data.length;
+ }
+};
+
+/**
+ * Saves an image in the cache.
+ *
+ * @param {string} key Cache key.
+ * @param {string} data Image data.
+ * @param {number=} opt_timestamp Last modification timestamp. Used to detect
+ * if the cache entry becomes out of date.
+ */
+ImageLoaderClient.Cache.prototype.saveImage = function(
+ key, data, opt_timestamp) {
+ // If the image is currently in cache, then remove it.
+ if (this.images_[key])
+ this.removeImage(key);
+
+ if (ImageLoaderClient.Cache.MEMORY_LIMIT - this.size_ < data.length) {
+ ImageLoaderClient.recordBinary('Evicted', 1);
+ this.evictCache_(data.length);
+ } else {
+ ImageLoaderClient.recordBinary('Evicted', 0);
+ }
+
+ if (ImageLoaderClient.Cache.MEMORY_LIMIT - this.size_ >= data.length) {
+ this.images_[key] = {lastLoadTimestamp: Date.now(),
+ timestamp: opt_timestamp ? opt_timestamp : null,
+ data: data};
+ this.size_ += data.length;
+ }
+};
+
+/**
+ * Loads an image from the cache (if available) or returns null.
+ *
+ * @param {string} key Cache key.
+ * @param {number=} opt_timestamp Last modification timestamp. If different
+ * that the one in cache, then the entry will be invalidated.
+ * @return {?string} Data of the loaded image or null.
+ */
+ImageLoaderClient.Cache.prototype.loadImage = function(key, opt_timestamp) {
+ if (!(key in this.images_))
+ return null;
+
+ var entry = this.images_[key];
+ entry.lastLoadTimestamp = Date.now();
+
+ // Check if the image in cache is up to date. If not, then remove it and
+ // return null.
+ if (entry.timestamp != opt_timestamp) {
+ this.removeImage(key);
+ return null;
+ }
+
+ return entry.data;
+};
+
+/**
+ * Returns cache usage.
+ * @return {number} Value in percent points (0..100).
+ */
+ImageLoaderClient.Cache.prototype.getUsage = function() {
+ return this.size_ / ImageLoaderClient.Cache.MEMORY_LIMIT * 100.0;
+};
+
+/**
+ * Removes the image from the cache.
+ * @param {string} key Cache key.
+ */
+ImageLoaderClient.Cache.prototype.removeImage = function(key) {
+ if (!(key in this.images_))
+ return;
+
+ var entry = this.images_[key];
+ this.size_ -= entry.data.length;
+ delete this.images_[key];
+};
+
+// Helper functions.
+
+/**
+ * Loads and resizes and image. Use opt_isValid to easily cancel requests
+ * which are not valid anymore, which will reduce cpu consumption.
+ *
+ * @param {string} url Url of the requested image.
+ * @param {Image} image Image node to load the requested picture into.
+ * @param {Object} options Loader options, such as: orientation, scale,
+ * maxHeight, width, height and/or cache.
+ * @param {function=} onSuccess Callback for success.
+ * @param {function=} onError Callback for failure.
+ * @param {function=} opt_isValid Function returning false in case
+ * a request is not valid anymore, eg. parent node has been detached.
+ * @return {?number} Remote task id or null if loaded from cache.
+ */
+ImageLoaderClient.loadToImage = function(
+ url, image, options, onSuccess, onError, opt_isValid) {
+ var callback = function(result) {
+ if (result.status == 'error') {
+ onError();
+ return;
+ }
+ image.src = result.data;
+ onSuccess();
+ };
+
+ return ImageLoaderClient.getInstance().load(
+ url, callback, options, opt_isValid);
+};
diff --git a/ui/file_manager/image_loader/manifest.json b/ui/file_manager/image_loader/manifest.json
new file mode 100644
index 0000000000..ba4e8206b8
--- /dev/null
+++ b/ui/file_manager/image_loader/manifest.json
@@ -0,0 +1,26 @@
+{
+ // chrome-extension://pmfjbimdmchhbnneeidfognadeopoehp
+ "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDowC9B4+K6zbl4PnALNyOUgra/MPdD8gZ39Fk/IAJWt03qrN7vz1gd/mmrBg0EEIsyLRmUmfyVEfvcIUOZxFqn4A9D2aaRSvNHy9qkasZMBDEql8Nt2iNZm/kGS7sizidDV6Bc/vyLNiH1gKOXBQ42JIxKjgtrmnhGV2giw2vJGwIDAQAB",
+ "name": "Image loader",
+ "version": "0.1",
+ "description": "Image loader",
+ "incognito" : "split",
+ "manifest_version": 2,
+ "permissions": [
+ "fileBrowserHandler",
+ "fileBrowserPrivate",
+ "https://www.googledrive.com/"
+ ],
+ "content_security_policy": "default-src 'none'; script-src 'self'; style-src 'self'; frame-src 'self'; img-src 'self' data:; media-src 'self'; connect-src 'self' https://www.googledrive.com",
+ "background": {
+ "scripts": [
+ "image_loader.js",
+ "cache.js",
+ "worker.js",
+ "request.js",
+ "background.js"
+ ],
+ "persistent": false
+ },
+ "web_accessible_resources": ["image_loader_client.js"]
+}
diff --git a/ui/file_manager/image_loader/request.js b/ui/file_manager/image_loader/request.js
new file mode 100644
index 0000000000..11fc7c1ec6
--- /dev/null
+++ b/ui/file_manager/image_loader/request.js
@@ -0,0 +1,438 @@
+// Copyright 2013 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.
+
+'use strict';
+
+/**
+ * Creates and starts downloading and then resizing of the image. Finally,
+ * returns the image using the callback.
+ *
+ * @param {string} id Request ID.
+ * @param {Cache} cache Cache object.
+ * @param {Object} request Request message as a hash array.
+ * @param {function} callback Callback used to send the response.
+ * @constructor
+ */
+function Request(id, cache, request, callback) {
+ /**
+ * @type {string}
+ * @private
+ */
+ this.id_ = id;
+
+ /**
+ * @type {Cache}
+ * @private
+ */
+ this.cache_ = cache;
+
+ /**
+ * @type {Object}
+ * @private
+ */
+ this.request_ = request;
+
+ /**
+ * @type {function}
+ * @private
+ */
+ this.sendResponse_ = callback;
+
+ /**
+ * Temporary image used to download images.
+ * @type {Image}
+ * @private
+ */
+ this.image_ = new Image();
+
+ /**
+ * MIME type of the fetched image.
+ * @type {string}
+ * @private
+ */
+ this.contentType_ = null;
+
+ /**
+ * Used to download remote images using http:// or https:// protocols.
+ * @type {AuthorizedXHR}
+ * @private
+ */
+ this.xhr_ = new AuthorizedXHR();
+
+ /**
+ * Temporary canvas used to resize and compress the image.
+ * @type {HTMLCanvasElement}
+ * @private
+ */
+ this.canvas_ = document.createElement('canvas');
+
+ /**
+ * @type {CanvasRenderingContext2D}
+ * @private
+ */
+ this.context_ = this.canvas_.getContext('2d');
+
+ /**
+ * Callback to be called once downloading is finished.
+ * @type {function()}
+ * @private
+ */
+ this.downloadCallback_ = null;
+}
+
+/**
+ * Returns ID of the request.
+ * @return {string} Request ID.
+ */
+Request.prototype.getId = function() {
+ return this.id_;
+};
+
+/**
+ * Returns priority of the request. The higher priority, the faster it will
+ * be handled. The highest priority is 0. The default one is 2.
+ *
+ * @return {number} Priority.
+ */
+Request.prototype.getPriority = function() {
+ return (this.request_.priority !== undefined) ? this.request_.priority : 2;
+};
+
+/**
+ * Tries to load the image from cache if exists and sends the response.
+ *
+ * @param {function()} onSuccess Success callback.
+ * @param {function()} onFailure Failure callback.
+ */
+Request.prototype.loadFromCacheAndProcess = function(onSuccess, onFailure) {
+ this.loadFromCache_(
+ function(data) { // Found in cache.
+ this.sendImageData_(data);
+ onSuccess();
+ }.bind(this),
+ onFailure); // Not found in cache.
+};
+
+/**
+ * Tries to download the image, resizes and sends the response.
+ * @param {function()} callback Completion callback.
+ */
+Request.prototype.downloadAndProcess = function(callback) {
+ if (this.downloadCallback_)
+ throw new Error('Downloading already started.');
+
+ this.downloadCallback_ = callback;
+ this.downloadOriginal_(this.onImageLoad_.bind(this),
+ this.onImageError_.bind(this));
+};
+
+/**
+ * Fetches the image from the persistent cache.
+ *
+ * @param {function()} onSuccess Success callback.
+ * @param {function()} onFailure Failure callback.
+ * @private
+ */
+Request.prototype.loadFromCache_ = function(onSuccess, onFailure) {
+ var cacheKey = Cache.createKey(this.request_);
+
+ if (!this.request_.cache) {
+ // Cache is disabled for this request; therefore, remove it from cache
+ // if existed.
+ this.cache_.removeImage(cacheKey);
+ onFailure();
+ return;
+ }
+
+ if (!this.request_.timestamp) {
+ // Persistent cache is available only when a timestamp is provided.
+ onFailure();
+ return;
+ }
+
+ this.cache_.loadImage(cacheKey,
+ this.request_.timestamp,
+ onSuccess,
+ onFailure);
+};
+
+/**
+ * Saves the image to the persistent cache.
+ *
+ * @param {string} data The image's data.
+ * @private
+ */
+Request.prototype.saveToCache_ = function(data) {
+ if (!this.request_.cache || !this.request_.timestamp) {
+ // Persistent cache is available only when a timestamp is provided.
+ return;
+ }
+
+ var cacheKey = Cache.createKey(this.request_);
+ this.cache_.saveImage(cacheKey,
+ data,
+ this.request_.timestamp);
+};
+
+/**
+ * Downloads an image directly or for remote resources using the XmlHttpRequest.
+ *
+ * @param {function()} onSuccess Success callback.
+ * @param {function()} onFailure Failure callback.
+ * @private
+ */
+Request.prototype.downloadOriginal_ = function(onSuccess, onFailure) {
+ this.image_.onload = onSuccess;
+ this.image_.onerror = onFailure;
+
+ // Download data urls directly since they are not supported by XmlHttpRequest.
+ var dataUrlMatches = this.request_.url.match(/^data:([^,;]*)[,;]/);
+ if (dataUrlMatches) {
+ this.image_.src = this.request_.url;
+ this.contentType_ = dataUrlMatches[1];
+ return;
+ }
+
+ // Fetch the image via authorized XHR and parse it.
+ var parseImage = function(contentType, blob) {
+ var reader = new FileReader();
+ reader.onerror = onFailure;
+ reader.onload = function(e) {
+ this.image_.src = e.target.result;
+ }.bind(this);
+
+ // Load the data to the image as a data url.
+ reader.readAsDataURL(blob);
+ }.bind(this);
+
+ // Request raw data via XHR.
+ this.xhr_.load(this.request_.url, parseImage, onFailure);
+};
+
+/**
+ * Creates a XmlHttpRequest wrapper with injected OAuth2 authentication headers.
+ * @constructor
+ */
+function AuthorizedXHR() {
+ this.xhr_ = null;
+ this.aborted_ = false;
+}
+
+/**
+ * Aborts the current request (if running).
+ */
+AuthorizedXHR.prototype.abort = function() {
+ this.aborted_ = true;
+ if (this.xhr_)
+ this.xhr_.abort();
+};
+
+/**
+ * Loads an image using a OAuth2 token. If it fails, then tries to retry with
+ * a refreshed OAuth2 token.
+ *
+ * @param {string} url URL to the resource to be fetched.
+ * @param {function(string, Blob}) onSuccess Success callback with the content
+ * type and the fetched data.
+ * @param {function()} onFailure Failure callback.
+ */
+AuthorizedXHR.prototype.load = function(url, onSuccess, onFailure) {
+ this.aborted_ = false;
+
+ // Do not call any callbacks when aborting.
+ var onMaybeSuccess = function(contentType, response) {
+ if (!this.aborted_)
+ onSuccess(contentType, response);
+ }.bind(this);
+ var onMaybeFailure = function(opt_code) {
+ if (!this.aborted_)
+ onFailure();
+ }.bind(this);
+
+ // Fetches the access token and makes an authorized call. If refresh is true,
+ // then forces refreshing the access token.
+ var requestTokenAndCall = function(refresh, onInnerSuccess, onInnerFailure) {
+ chrome.fileBrowserPrivate.requestAccessToken(refresh, function(token) {
+ if (this.aborted_)
+ return;
+ if (!token) {
+ onInnerFailure();
+ return;
+ }
+ this.xhr_ = AuthorizedXHR.load_(
+ token, url, onInnerSuccess, onInnerFailure);
+ }.bind(this));
+ }.bind(this);
+
+ // Refreshes the access token and retries the request.
+ var maybeRetryCall = function(code) {
+ if (this.aborted_)
+ return;
+ requestTokenAndCall(true, onMaybeSuccess, onMaybeFailure);
+ }.bind(this);
+
+ // Do not request a token for local resources, since it is not necessary.
+ if (url.indexOf('filesystem:') === 0) {
+ this.xhr_ = AuthorizedXHR.load_(null, url, onMaybeSuccess, onMaybeFailure);
+ return;
+ }
+
+ // Make the request with reusing the current token. If it fails, then retry.
+ requestTokenAndCall(false, onMaybeSuccess, maybeRetryCall);
+};
+
+/**
+ * Fetches data using authorized XmlHttpRequest with the provided OAuth2 token.
+ * If the token is invalid, the request will fail.
+ *
+ * @param {?string} token OAuth2 token to be injected to the request. Null for
+ * no token.
+ * @param {string} url URL to the resource to be fetched.
+ * @param {function(string, Blob}) onSuccess Success callback with the content
+ * type and the fetched data.
+ * @param {function(number=)} onFailure Failure callback with the error code
+ * if available.
+ * @return {AuthorizedXHR} XHR instance.
+ * @private
+ */
+AuthorizedXHR.load_ = function(token, url, onSuccess, onFailure) {
+ var xhr = new XMLHttpRequest();
+ xhr.responseType = 'blob';
+
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState != 4)
+ return;
+ if (xhr.status != 200) {
+ onFailure(xhr.status);
+ return;
+ }
+ var contentType = xhr.getResponseHeader('Content-Type');
+ onSuccess(contentType, xhr.response);
+ }.bind(this);
+
+ // Perform a xhr request.
+ try {
+ xhr.open('GET', url, true);
+ if (token)
+ xhr.setRequestHeader('Authorization', 'Bearer ' + token);
+ xhr.send();
+ } catch (e) {
+ onFailure();
+ }
+
+ return xhr;
+};
+
+/**
+ * Sends the resized image via the callback. If the image has been changed,
+ * then packs the canvas contents, otherwise sends the raw image data.
+ *
+ * @param {boolean} imageChanged Whether the image has been changed.
+ * @private
+ */
+Request.prototype.sendImage_ = function(imageChanged) {
+ var imageData;
+ if (!imageChanged) {
+ // The image hasn't been processed, so the raw data can be directly
+ // forwarded for speed (no need to encode the image again).
+ imageData = this.image_.src;
+ } else {
+ // The image has been resized or rotated, therefore the canvas has to be
+ // encoded to get the correct compressed image data.
+ switch (this.contentType_) {
+ case 'image/gif':
+ case 'image/png':
+ case 'image/svg':
+ case 'image/bmp':
+ imageData = this.canvas_.toDataURL('image/png');
+ break;
+ case 'image/jpeg':
+ default:
+ imageData = this.canvas_.toDataURL('image/jpeg', 0.9);
+ }
+ }
+
+ // Send and store in the persistent cache.
+ this.sendImageData_(imageData);
+ this.saveToCache_(imageData);
+};
+
+/**
+ * Sends the resized image via the callback.
+ * @param {string} data Compressed image data.
+ * @private
+ */
+Request.prototype.sendImageData_ = function(data) {
+ this.sendResponse_({status: 'success',
+ data: data,
+ taskId: this.request_.taskId});
+};
+
+/**
+ * Handler, when contents are loaded into the image element. Performs resizing
+ * and finalizes the request process.
+ *
+ * @param {function()} callback Completion callback.
+ * @private
+ */
+Request.prototype.onImageLoad_ = function(callback) {
+ // Perform processing if the url is not a data url, or if there are some
+ // operations requested.
+ if (!this.request_.url.match(/^data/) ||
+ ImageLoader.shouldProcess(this.image_.width,
+ this.image_.height,
+ this.request_)) {
+ ImageLoader.resize(this.image_, this.canvas_, this.request_);
+ this.sendImage_(true); // Image changed.
+ } else {
+ this.sendImage_(false); // Image not changed.
+ }
+ this.cleanup_();
+ this.downloadCallback_();
+};
+
+/**
+ * Handler, when loading of the image fails. Sends a failure response and
+ * finalizes the request process.
+ *
+ * @param {function()} callback Completion callback.
+ * @private
+ */
+Request.prototype.onImageError_ = function(callback) {
+ this.sendResponse_({status: 'error',
+ taskId: this.request_.taskId});
+ this.cleanup_();
+ this.downloadCallback_();
+};
+
+/**
+ * Cancels the request.
+ */
+Request.prototype.cancel = function() {
+ this.cleanup_();
+
+ // If downloading has started, then call the callback.
+ if (this.downloadCallback_)
+ this.downloadCallback_();
+};
+
+/**
+ * Cleans up memory used by this request.
+ * @private
+ */
+Request.prototype.cleanup_ = function() {
+ this.image_.onerror = function() {};
+ this.image_.onload = function() {};
+
+ // Transparent 1x1 pixel gif, to force garbage collecting.
+ this.image_.src = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAA' +
+ 'ABAAEAAAICTAEAOw==';
+
+ this.xhr_.onload = function() {};
+ this.xhr_.abort();
+
+ // Dispose memory allocated by Canvas.
+ this.canvas_.width = 0;
+ this.canvas_.height = 0;
+};
diff --git a/ui/file_manager/image_loader/worker.js b/ui/file_manager/image_loader/worker.js
new file mode 100644
index 0000000000..fe1f2f1535
--- /dev/null
+++ b/ui/file_manager/image_loader/worker.js
@@ -0,0 +1,166 @@
+// Copyright 2013 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.
+
+'use strict';
+
+/**
+ * Worker for requests. Fetches requests from a queue and processes them
+ * synchronously, taking into account priorities. The highest priority is 0.
+ */
+function Worker() {
+ /**
+ * List of requests waiting to be checked. If these items are available in
+ * cache, then they are processed immediately after starting the worker.
+ * However, if they have to be downloaded, then these requests are moved
+ * to pendingRequests_.
+ *
+ * @type {Array.<Request>}
+ * @private
+ */
+ this.newRequests_ = [];
+
+ /**
+ * List of pending requests for images to be downloaded.
+ * @type {Array.<Request>}
+ * @private
+ */
+ this.pendingRequests_ = [];
+
+ /**
+ * List of requests being processed.
+ * @type {Array.<Request>}
+ * @private
+ */
+ this.activeRequests_ = [];
+
+ /**
+ * Hash array of requests being added to the queue, but not finalized yet.
+ * @type {Object}
+ * @private
+ */
+ this.requests_ = {};
+
+ /**
+ * If the worker has been started.
+ * @type {boolean}
+ * @private
+ */
+ this.started_ = false;
+}
+
+/**
+ * Maximum download requests to be run in parallel.
+ * @type {number}
+ * @const
+ */
+Worker.MAXIMUM_IN_PARALLEL = 5;
+
+/**
+ * Adds a request to the internal priority queue and executes it when requests
+ * with higher priorities are finished. If the result is cached, then it is
+ * processed immediately once the worker is started.
+ *
+ * @param {Request} request Request object.
+ */
+Worker.prototype.add = function(request) {
+ if (!this.started_) {
+ this.newRequests_.push(request);
+ this.requests_[request.getId()] = request;
+ return;
+ }
+
+ // Enqueue the request, since already started.
+ this.pendingRequests_.push(request);
+ this.sortPendingRequests_();
+
+ this.continue_();
+};
+
+/**
+ * Removes a request from the worker (if exists).
+ * @param {string} requestId Unique ID of the request.
+ */
+Worker.prototype.remove = function(requestId) {
+ var request = this.requests_[requestId];
+ if (!request)
+ return;
+
+ // Remove from the internal queues with pending tasks.
+ var newIndex = this.pendingRequests_.indexOf(request);
+ if (newIndex != -1)
+ this.newRequests_.splice(newIndex, 1);
+ var pendingIndex = this.pendingRequests_.indexOf(request);
+ if (pendingIndex != -1)
+ this.pendingRequests_.splice(pendingIndex, 1);
+
+ // Cancel the request.
+ request.cancel();
+ delete this.requests_[requestId];
+};
+
+/**
+ * Starts handling requests.
+ */
+Worker.prototype.start = function() {
+ this.started_ = true;
+
+ // Process tasks added before worker has been started.
+ this.pendingRequests_ = this.newRequests_;
+ this.sortPendingRequests_();
+ this.newRequests_ = [];
+
+ // Start serving enqueued requests.
+ this.continue_();
+};
+
+/**
+ * Sorts pending requests by priorities.
+ * @private
+ */
+Worker.prototype.sortPendingRequests_ = function() {
+ this.pendingRequests_.sort(function(a, b) {
+ return a.getPriority() - b.getPriority();
+ });
+};
+
+/**
+ * Processes pending requests from the queue. There is no guarantee that
+ * all of the tasks will be processed at once.
+ *
+ * @private
+ */
+Worker.prototype.continue_ = function() {
+ // Run only up to MAXIMUM_IN_PARALLEL in the same time.
+ while (this.pendingRequests_.length &&
+ this.activeRequests_.length < Worker.MAXIMUM_IN_PARALLEL) {
+ var request = this.pendingRequests_.shift();
+ this.activeRequests_.push(request);
+
+ // Try to load from cache. If doesn't exist, then download.
+ request.loadFromCacheAndProcess(
+ this.finish_.bind(this, request),
+ function(currentRequest) {
+ currentRequest.downloadAndProcess(
+ this.finish_.bind(this, currentRequest));
+ }.bind(this, request));
+ }
+};
+
+/**
+ * Handles finished requests.
+ *
+ * @param {Request} request Finished request.
+ * @private
+ */
+Worker.prototype.finish_ = function(request) {
+ var index = this.activeRequests_.indexOf(request);
+ if (index < 0)
+ console.warn('Request not found.');
+ this.activeRequests_.splice(index, 1);
+ delete this.requests_[request.getId()];
+
+ // Continue handling the most important requests (if started).
+ if (this.started_)
+ this.continue_();
+};
diff --git a/ui/file_manager/video_player/OWNERS b/ui/file_manager/video_player/OWNERS
new file mode 100644
index 0000000000..f19953323c
--- /dev/null
+++ b/ui/file_manager/video_player/OWNERS
@@ -0,0 +1 @@
+yoshiki@chromium.org \ No newline at end of file
diff --git a/ui/file_manager/video_player/css/video_player.css b/ui/file_manager/video_player/css/video_player.css
new file mode 100644
index 0000000000..2c11c339ce
--- /dev/null
+++ b/ui/file_manager/video_player/css/video_player.css
@@ -0,0 +1,103 @@
+/* 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. */
+
+body {
+ -webkit-user-select: none;
+ background: black;
+ font-family: Noto Sans UI,Droid Sans Fallback,sans-serif;
+ font-size: 84%;
+ margin: 0;
+ overflow: hidden;
+}
+
+#video-player {
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+
+#video-container {
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+
+video {
+ height: 100%;
+ left: 0;
+ pointer-events: none;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+
+#controls-wrapper {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ bottom: 0;
+ display: -webkit-box;
+ left: 0;
+ position: absolute;
+ right: 0;
+}
+
+#controls {
+ -webkit-box-flex: 1;
+ display: -webkit-box;
+}
+
+#video-player:not([tools]) .tool {
+ opacity: 0;
+}
+
+#video-player:not([tools]) {
+ cursor: none;
+}
+
+#video-player[disabled] .tool {
+ display: none;
+}
+
+.tool {
+ transition: opacity 180ms linear;
+}
+
+#error-wrapper {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ display: -webkit-box;
+ height: 100%;
+ left: 0;
+ pointer-events: none;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+
+#error {
+ -webkit-box-align: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-pack: center;
+ background-color: rgba(24, 24, 24, 1);
+ background-image: -webkit-image-set(
+ url('../images/100/error.png') 1x,
+ url('../images/200/error.png') 2x);
+ background-position: 25px center;
+ background-repeat: no-repeat;
+ color: white;
+ display: -webkit-box;
+ height: 54px;
+ padding-left: 70px;
+ padding-right: 35px;
+}
+
+#error:not([visible]) {
+ display: none;
+}
diff --git a/ui/file_manager/video_player/images/100/error.png b/ui/file_manager/video_player/images/100/error.png
new file mode 100644
index 0000000000..125c0b7589
--- /dev/null
+++ b/ui/file_manager/video_player/images/100/error.png
Binary files differ
diff --git a/ui/file_manager/video_player/images/100/icon.png b/ui/file_manager/video_player/images/100/icon.png
new file mode 100644
index 0000000000..73b70f63b2
--- /dev/null
+++ b/ui/file_manager/video_player/images/100/icon.png
Binary files differ
diff --git a/ui/file_manager/video_player/images/200/error.png b/ui/file_manager/video_player/images/200/error.png
new file mode 100644
index 0000000000..200baf571a
--- /dev/null
+++ b/ui/file_manager/video_player/images/200/error.png
Binary files differ
diff --git a/ui/file_manager/video_player/images/200/icon.png b/ui/file_manager/video_player/images/200/icon.png
new file mode 100644
index 0000000000..a8346a3f20
--- /dev/null
+++ b/ui/file_manager/video_player/images/200/icon.png
Binary files differ
diff --git a/ui/file_manager/video_player/js/background.js b/ui/file_manager/video_player/js/background.js
new file mode 100644
index 0000000000..57ff169de2
--- /dev/null
+++ b/ui/file_manager/video_player/js/background.js
@@ -0,0 +1,43 @@
+// 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.
+
+'use strict';
+
+
+// Stores the app windows OLNY for test purpose.
+// We SHOULD NOT use it as it is except for test, since the files which have
+// the same name will be overridden each other.
+var appWindowsForTest = {};
+
+chrome.app.runtime.onLaunched.addListener(function(launchData) {
+ if (!launchData || !launchData.items || launchData.items.length == 0)
+ return;
+
+ var entry = launchData.items[0].entry;
+ entry.file(function(file) {
+ var url = window.URL.createObjectURL(file);
+ open(url, entry.name);
+ }.wrap(),
+ function() {
+ // TODO(yoshiki): handle error in a smarter way.
+ open('', 'error'); // Empty URL shows the error message.
+ }.wrap());
+}.wrap());
+
+function open(url, title) {
+ chrome.app.window.create('video_player.html', {
+ id: 'video',
+ singleton: false,
+ minWidth: 160,
+ minHeight: 100
+ },
+ function(createdWindow) {
+ // Stores the window for test purpose.
+ appWindowsForTest[title] = createdWindow;
+
+ createdWindow.setIcon('images/200/icon.png');
+ createdWindow.contentWindow.videoUrl = url;
+ createdWindow.contentWindow.videoTitle = title;
+ }.wrap());
+}
diff --git a/ui/file_manager/video_player/js/error_util.js b/ui/file_manager/video_player/js/error_util.js
new file mode 100644
index 0000000000..fedf9f534b
--- /dev/null
+++ b/ui/file_manager/video_player/js/error_util.js
@@ -0,0 +1,43 @@
+// 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.
+
+'use strict';
+
+/**
+ * This variable is checked in SelectFileDialogExtensionBrowserTest.
+ * @type {number}
+ */
+window.JSErrorCount = 0;
+
+/**
+ * Counts uncaught exceptions.
+ */
+window.onerror = function() { window.JSErrorCount++; };
+
+/**
+ * Wraps the function to use it as a callback.
+ * This does:
+ * - Capture the stack trace in case of error.
+ * - Bind this object
+ *
+ * @param {Object} thisObject Object to be used as this.
+ * @return {function} Wapped function.
+ */
+Function.prototype.wrap = function(thisObject) {
+ var func = this;
+ var liveStack = (new Error('Stack trace before async call')).stack;
+ if (thisObject === undefined)
+ thisObject = null;
+
+ return function wrappedCallback() {
+ try {
+ return func.apply(thisObject, arguments);
+ } catch (e) {
+ console.error('Exception happens in callback.', liveStack);
+
+ window.JSErrorCount++;
+ throw e;
+ }
+ }
+};
diff --git a/ui/file_manager/video_player/js/test_util.js b/ui/file_manager/video_player/js/test_util.js
new file mode 100644
index 0000000000..c01df4a8eb
--- /dev/null
+++ b/ui/file_manager/video_player/js/test_util.js
@@ -0,0 +1,121 @@
+// 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.
+
+/**
+ * Namespace for test related things.
+ */
+var test = test || {};
+
+/**
+ * Namespace for test utility functions.
+ *
+ * Public functions in the test.util.sync and the test.util.async namespaces are
+ * published to test cases and can be called by using callRemoteTestUtil. The
+ * arguments are serialized as JSON internally. If application ID is passed to
+ * callRemoteTestUtil, the content window of the application is added as the
+ * first argument. The functions in the test.util.async namespace are passed the
+ * callback function as the last argument.
+ */
+test.util = {};
+
+/**
+ * Namespace for synchronous utility functions.
+ */
+test.util.sync = {};
+
+/**
+ * Namespace for asynchronous utility functions.
+ */
+test.util.async = {};
+
+/**
+ * Extension ID of the testing extension.
+ * @type {string}
+ * @const
+ */
+test.util.TESTING_EXTENSION_ID = 'oobinhbdbiehknkpbpejbbpdbkdjmoco';
+
+/**
+ * Opens the main Files.app's window and waits until it is ready.
+ *
+ * @param {Window} contentWindow Video player window to be chacked toOB.
+ * @return {boolean} True if the video is playing, false otherwise.
+ */
+test.util.sync.isPlaying = function(contentWindow) {
+ var selector = 'video[src]';
+ var element = contentWindow.document.querySelector(selector);
+ if (!element)
+ return false;
+
+ return !element.paused;
+};
+
+/**
+ * Gets total Javascript error count from each app window.
+ * @return {number} Error count.
+ */
+test.util.sync.getErrorCount = function() {
+ var totalCount = JSErrorCount;
+ for (var appId in appWindowsForTest) {
+ var contentWindow = appWindowsForTest[appId].contentWindow;
+ if (contentWindow.JSErrorCount)
+ totalCount += contentWindow.JSErrorCount;
+ }
+
+ // Errors in the background page.
+ totalCount += window.JSErrorCount;
+
+ return totalCount;
+};
+
+/**
+ * Registers message listener, which runs test utility functions.
+ */
+test.util.registerRemoteTestUtils = function() {
+ // Register the message listener.
+ var onMessage = chrome.runtime ? chrome.runtime.onMessageExternal :
+ chrome.extension.onMessageExternal;
+ // Return true for asynchronous functions and false for synchronous.
+ onMessage.addListener(function(request, sender, sendResponse) {
+ // Check the sender.
+ if (sender.id != test.util.TESTING_EXTENSION_ID) {
+ console.error('The testing extension must be white-listed.');
+ sendResponse(false);
+ return false;
+ }
+ if (!request.func || request.func[request.func.length - 1] == '_') {
+ request.func = '';
+ }
+ // Prepare arguments.
+ var args = request.args.slice(); // shallow copy
+ if (request.file) {
+ if (!appWindowsForTest[request.file]) {
+ console.error('Specified window not found: ' + request.file);
+ sendResponse(false);
+ return false;
+ }
+ args.unshift(appWindowsForTest[request.file].contentWindow);
+ }
+ // Call the test utility function and respond the result.
+ if (test.util.async[request.func]) {
+ args[test.util.async[request.func].length - 1] = function() {
+ console.debug('Received the result of ' + request.func);
+ sendResponse.apply(null, arguments);
+ };
+ console.debug('Waiting for the result of ' + request.func);
+ test.util.async[request.func].apply(null, args);
+ return true;
+ } else if (test.util.sync[request.func]) {
+ sendResponse(test.util.sync[request.func].apply(null, args));
+ return false;
+ } else {
+ console.error('Invalid function name.');
+ sendResponse(false);
+ return false;
+ }
+ }.wrap());
+};
+
+// Register the test utils.
+test.util.registerRemoteTestUtils();
diff --git a/ui/file_manager/video_player/js/video_player.js b/ui/file_manager/video_player/js/video_player.js
new file mode 100644
index 0000000000..f472cdff9a
--- /dev/null
+++ b/ui/file_manager/video_player/js/video_player.js
@@ -0,0 +1,215 @@
+// 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.
+
+'use strict';
+
+/**
+ * Displays error message.
+ * @param {string} message Message id.
+ */
+function showErrorMessage(message) {
+ var errorBanner = document.querySelector('#error');
+ errorBanner.textContent =
+ loadTimeData.getString(message);
+ errorBanner.setAttribute('visible', 'true');
+
+ // The window is hidden if the video has not loaded yet.
+ chrome.app.window.current().show();
+}
+
+/**
+ * Handles playback (decoder) errors.
+ */
+function onPlaybackError() {
+ showErrorMessage('GALLERY_VIDEO_DECODING_ERROR');
+ decodeErrorOccured = true;
+
+ // Disable inactivity watcher, and disable the ui, by hiding tools manually.
+ controls.inactivityWatcher.disabled = true;
+ document.querySelector('#video-player').setAttribute('disabled', 'true');
+
+ // Detach the video element, since it may be unreliable and reset stored
+ // current playback time.
+ controls.cleanup();
+ controls.clearState();
+
+ // Avoid reusing a video element.
+ video.parentNode.removeChild(video);
+ video = null;
+}
+
+/**
+ * @param {Element} playerContainer Main container.
+ * @param {Element} videoContainer Container for the video element.
+ * @param {Element} controlsContainer Container for video controls.
+ * @constructor
+ */
+function FullWindowVideoControls(
+ playerContainer, videoContainer, controlsContainer) {
+ VideoControls.call(this,
+ controlsContainer,
+ onPlaybackError,
+ loadTimeData.getString.wrap(loadTimeData),
+ this.toggleFullScreen_.wrap(this),
+ videoContainer);
+
+ this.playerContainer_ = playerContainer;
+
+ this.updateStyle();
+ window.addEventListener('resize', this.updateStyle.wrap(this));
+
+ document.addEventListener('keydown', function(e) {
+ if (e.keyIdentifier == 'U+0020') { // Space
+ this.togglePlayStateWithFeedback();
+ e.preventDefault();
+ }
+ if (e.keyIdentifier == 'U+001B') { // Escape
+ util.toggleFullScreen(
+ chrome.app.window.current(),
+ false); // Leave the full screen mode.
+ e.preventDefault();
+ }
+ }.wrap(this));
+
+ // TODO(mtomasz): Simplify. crbug.com/254318.
+ videoContainer.addEventListener('click', function(e) {
+ if (e.ctrlKey) {
+ this.toggleLoopedModeWithFeedback(true);
+ if (!this.isPlaying())
+ this.togglePlayStateWithFeedback();
+ } else {
+ this.togglePlayStateWithFeedback();
+ }
+ }.wrap(this));
+
+ this.inactivityWatcher_ = new MouseInactivityWatcher(playerContainer);
+ this.__defineGetter__('inactivityWatcher', function() {
+ return this.inactivityWatcher_;
+ });
+
+ this.inactivityWatcher_.check();
+}
+
+FullWindowVideoControls.prototype = { __proto__: VideoControls.prototype };
+
+/**
+ * Toggles the full screen mode.
+ * @private
+ */
+FullWindowVideoControls.prototype.toggleFullScreen_ = function() {
+ var appWindow = chrome.app.window.current();
+ util.toggleFullScreen(appWindow, !util.isFullScreen(appWindow));
+};
+
+// TODO(mtomasz): Convert it to class members: crbug.com/171191.
+var decodeErrorOccured;
+var video;
+var controls;
+
+/**
+ * Initializes the video player window.
+ */
+function loadVideoPlayer() {
+ document.ondragstart = function(e) { e.preventDefault() };
+
+ chrome.fileBrowserPrivate.getStrings(function(strings) {
+ loadTimeData.data = strings;
+
+ var url = window.videoUrl;
+ document.title = window.videoTitle;
+
+ controls = new FullWindowVideoControls(
+ document.querySelector('#video-player'),
+ document.querySelector('#video-container'),
+ document.querySelector('#controls'));
+
+ var reloadVideo = function(e) {
+ if (decodeErrorOccured &&
+ // Ignore shortcut keys
+ !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {
+ loadVideo(url);
+ e.preventDefault();
+ }
+ };
+
+ loadVideo(url);
+ document.addEventListener('keydown', reloadVideo, true);
+ document.addEventListener('click', reloadVideo, true);
+ });
+}
+
+/**
+ * Unloads the player.
+ */
+function unload() {
+ if (!controls.getMedia())
+ return;
+
+ controls.savePosition(true /* exiting */);
+ controls.cleanup();
+}
+
+/**
+ * Reloads the player.
+ * @param {string} url URL of the video file.
+ */
+function loadVideo(url) {
+ // Re-enable ui and hide error message if already displayed.
+ document.querySelector('#video-player').removeAttribute('disabled');
+ document.querySelector('#error').removeAttribute('visible');
+ controls.inactivityWatcher.disabled = false;
+ decodeErrorOccured = false;
+
+ // Detach the previous video element, if exists.
+ if (video)
+ video.parentNode.removeChild(video);
+
+ video = document.createElement('video');
+ document.querySelector('#video-container').appendChild(video);
+ controls.attachMedia(video);
+
+ video.src = url;
+ video.load();
+ video.addEventListener('loadedmetadata', function() {
+ // TODO: chrome.app.window soon will be able to resize the content area.
+ // Until then use approximate title bar height.
+ var TITLE_HEIGHT = 33;
+
+ var aspect = video.videoWidth / video.videoHeight;
+ var newWidth = video.videoWidth;
+ var newHeight = video.videoHeight + TITLE_HEIGHT;
+
+ var shrinkX = newWidth / window.screen.availWidth;
+ var shrinkY = newHeight / window.screen.availHeight;
+ if (shrinkX > 1 || shrinkY > 1) {
+ if (shrinkY > shrinkX) {
+ newHeight = newHeight / shrinkY;
+ newWidth = (newHeight - TITLE_HEIGHT) * aspect;
+ } else {
+ newWidth = newWidth / shrinkX;
+ newHeight = newWidth / aspect + TITLE_HEIGHT;
+ }
+ }
+
+ var oldLeft = window.screenX;
+ var oldTop = window.screenY;
+ var oldWidth = window.outerWidth;
+ var oldHeight = window.outerHeight;
+
+ if (!oldWidth && !oldHeight) {
+ oldLeft = window.screen.availWidth / 2;
+ oldTop = window.screen.availHeight / 2;
+ }
+
+ var appWindow = chrome.app.window.current();
+ appWindow.resizeTo(newWidth, newHeight);
+ appWindow.moveTo(oldLeft - (newWidth - oldWidth) / 2,
+ oldTop - (newHeight - oldHeight) / 2);
+ appWindow.show();
+
+ video.play();
+ });
+}
+
+util.addPageLoadHandler(loadVideoPlayer);
diff --git a/ui/file_manager/video_player/js/video_player_scripts.js b/ui/file_manager/video_player/js/video_player_scripts.js
new file mode 100644
index 0000000000..a3f6c6a7c3
--- /dev/null
+++ b/ui/file_manager/video_player/js/video_player_scripts.js
@@ -0,0 +1,27 @@
+// 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.
+
+// The include directives are put into Javascript-style comments to prevent
+// parsing errors in non-flattened mode. The flattener still sees them.
+// Note that this makes the flattener to comment out the first line of the
+// included file but that's all right since any javascript file should start
+// with a copyright comment anyway.
+
+//<include src="error_util.js"/>
+
+//<include src="../../../webui/resources/js/cr.js"/>
+//<include src="../../../webui/resources/js/load_time_data.js"/>
+
+(function() {
+'use strict';
+
+//<include src="../../../../chrome/browser/resources/file_manager/common/js/util.js"/>
+//<include src="../../../../chrome/browser/resources/file_manager/foreground/js/media/media_controls.js"/>
+//<include src="../../../../chrome/browser/resources/file_manager/foreground/js/media/util.js"/>
+
+//<include src="video_player.js"/>
+
+window.unload = unload;
+
+})();
diff --git a/ui/file_manager/video_player/manifest.json b/ui/file_manager/video_player/manifest.json
new file mode 100644
index 0000000000..5478a98b30
--- /dev/null
+++ b/ui/file_manager/video_player/manifest.json
@@ -0,0 +1,57 @@
+{
+ // chrome-extension://jcgeabjmjgoblfofpppfkcoakmfobdko/
+ "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0/gRbJc545iEGRZs20Rl/HtrSUp8H3gJd4Y6hCe0CG1xQiJhZ5nc8qZyxa96gMxRAKBq54S6sjVVtV6uS70oU6FvrvwItByYkkqr4ZE7eMJKwMqnGItxWbh6KBodf89lpKoIy6MtYTqubBhXB/IQBZsXah90tXwRzaaJNWw+2BBRIhcPsH3ng+wgN7rwFxo4HIv9ZpqkYlx90rwkfjOmKPPnSXyXFIBJfmqfdbd8PLtcxzzOTE+vxwoXZuYWrthKm4uKfNqXIYns74sSJlqyKfctuR+nQdNh8uePv0e+/Ul3wER1/jIXULLjfyoaklyDs+ak3SDf+xWScJ+0LJ0AwIDAQAB",
+ "manifest_version": 2,
+ "name": "Video Player",
+ "version": "1.0",
+ "description": "Video Player",
+ "display_in_launcher": false,
+ "incognito" : "split",
+ "icons": {
+ "16": "images/100/icon.png",
+ "32": "images/200/icon.png"
+ },
+ "permissions": [
+ "fileSystem",
+ "fileBrowserPrivate",
+ "fullscreen",
+ "mediaPlayerPrivate",
+ "storage",
+ "chrome://theme/"
+ ],
+ "file_handlers": {
+ "video": {
+ "types": [
+ "video/*"
+ ],
+ "extensions": [
+ "3gp",
+ "avi",
+ "m4v",
+ "mkv",
+ "mov",
+ "mp4",
+ "mpeg",
+ "mpeg4",
+ "mpg",
+ "mpg4",
+ "ogm",
+ "ogv",
+ "ogx",
+ "webm"
+ ],
+ // TODO(yoshiki): localize this.
+ "title": "Watch"
+ }
+ },
+ "app": {
+ "background": {
+ "scripts": [
+ "js/error_util.js",
+ "js/test_util.js",
+ "js/background.js"
+ ]
+ },
+ "content_security_policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' chrome://theme data:; media-src 'self'; object-src 'self'"
+ }
+}
diff --git a/ui/file_manager/video_player/video_player.html b/ui/file_manager/video_player/video_player.html
new file mode 100644
index 0000000000..52b50f0e44
--- /dev/null
+++ b/ui/file_manager/video_player/video_player.html
@@ -0,0 +1,28 @@
+<!--
+ -- 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.
+ -->
+<html>
+<head>
+ <title>#xFEFF;</title>
+ <link rel="icon" type="image/png" href="images/200/icon.png">
+ <link rel="stylesheet" type="text/css"
+ href="../../../chrome/browser/resources/file_manager/foreground/css/media_controls.css">
+ <link rel="stylesheet" type="text/css" href="css/video_player.css">
+
+ <script src="js/video_player_scripts.js"></script>
+</head>
+<body>
+ <div id="video-player" tools>
+ <div id="video-container">
+ </div>
+ <div id="controls-wrapper">
+ <div id="controls" class="tool"></div>
+ </div>
+ <div id="error-wrapper">
+ <div id="error"></div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index 02d2e776c3..783394556c 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -7,6 +7,16 @@ if (is_android) {
import("//build/config/android/config.gni")
}
+# Several targets want to include this header file, and some of them are
+# child dependencies of "gfx". Therefore, we separate it out here so multiple
+# targets can all have a dependency for header checking purposes without
+# creating circular dependencies.
+source_set("gfx_export") {
+ sources = [
+ "gfx_export.h",
+ ]
+}
+
component("gfx") {
sources = [
"android/device_display_info.cc",
@@ -84,7 +94,6 @@ component("gfx") {
"frame_time.h",
"gdi_util.cc",
"gdi_util.h",
- "gfx_export.h",
"gfx_paths.cc",
"gfx_paths.h",
"gpu_memory_buffer.cc",
@@ -235,6 +244,7 @@ component("gfx") {
defines = [ "GFX_IMPLEMENTATION" ]
deps = [
+ ":gfx_export",
"//base",
"//base:i18n",
"//base:base_static",
@@ -347,13 +357,20 @@ component("gfx") {
sources -= [
"nine_image_painter.cc",
"nine_image_painter.h",
+ "path_aura.cc",
]
}
+
if (use_x11) {
deps += [
":gfx_x11",
]
+ } else {
+ sources -= [
+ "path_x11.cc",
+ ]
}
+
if (use_pango) {
sources -= [
"platform_font_ozone.cc",
@@ -382,6 +399,7 @@ source_set("gfx_test_support") {
deps = [
"//base",
+ "//base/test:test_support",
"//skia",
"//testing/gtest",
]
diff --git a/ui/gfx/android/device_display_info.cc b/ui/gfx/android/device_display_info.cc
index f7c9eed85b..4d2c80c09d 100644
--- a/ui/gfx/android/device_display_info.cc
+++ b/ui/gfx/android/device_display_info.cc
@@ -47,4 +47,8 @@ int DeviceDisplayInfo::GetSmallestDIPWidth() {
return SharedDeviceDisplayInfo::GetInstance()->GetSmallestDIPWidth();
}
+int DeviceDisplayInfo::GetRotationDegrees() {
+ return SharedDeviceDisplayInfo::GetInstance()->GetRotationDegrees();
+}
+
} // namespace gfx
diff --git a/ui/gfx/android/device_display_info.h b/ui/gfx/android/device_display_info.h
index 2c6db28df1..74e0ada487 100644
--- a/ui/gfx/android/device_display_info.h
+++ b/ui/gfx/android/device_display_info.h
@@ -51,6 +51,11 @@ class GFX_EXPORT DeviceDisplayInfo {
// Smallest possible screen size in density-independent pixels.
int GetSmallestDIPWidth();
+ // Returns the display rotation angle from its natural orientation. Expected
+ // values are one of { 0, 90, 180, 270 }.
+ // See DeviceDispayInfo.java for more information.
+ int GetRotationDegrees();
+
private:
DISALLOW_COPY_AND_ASSIGN(DeviceDisplayInfo);
};
diff --git a/ui/gfx/android/shared_device_display_info.cc b/ui/gfx/android/shared_device_display_info.cc
index ae02ef5d92..c58813dfce 100644
--- a/ui/gfx/android/shared_device_display_info.cc
+++ b/ui/gfx/android/shared_device_display_info.cc
@@ -21,12 +21,13 @@ static void UpdateSharedDeviceDisplayInfo(JNIEnv* env,
jint bits_per_pixel,
jint bits_per_component,
jdouble dip_scale,
- jint smallest_dip_width) {
+ jint smallest_dip_width,
+ jint rotation_degrees) {
SharedDeviceDisplayInfo::GetInstance()->InvokeUpdate(env, obj,
display_height, display_width,
physical_display_height, physical_display_width,
bits_per_pixel, bits_per_component,
- dip_scale, smallest_dip_width);
+ dip_scale, smallest_dip_width, rotation_degrees);
}
// static
@@ -80,6 +81,11 @@ int SharedDeviceDisplayInfo::GetSmallestDIPWidth() {
return smallest_dip_width_;
}
+int SharedDeviceDisplayInfo::GetRotationDegrees() {
+ base::AutoLock autolock(lock_);
+ return rotation_degrees_;
+}
+
// static
bool SharedDeviceDisplayInfo::RegisterSharedDeviceDisplayInfo(JNIEnv* env) {
return RegisterNativesImpl(env);
@@ -94,14 +100,15 @@ void SharedDeviceDisplayInfo::InvokeUpdate(JNIEnv* env,
jint bits_per_pixel,
jint bits_per_component,
jdouble dip_scale,
- jint smallest_dip_width) {
+ jint smallest_dip_width,
+ jint rotation_degrees) {
base::AutoLock autolock(lock_);
UpdateDisplayInfo(env, obj,
display_height, display_width,
physical_display_height, physical_display_width,
bits_per_pixel, bits_per_component, dip_scale,
- smallest_dip_width);
+ smallest_dip_width, rotation_degrees);
}
SharedDeviceDisplayInfo::SharedDeviceDisplayInfo()
@@ -124,7 +131,8 @@ SharedDeviceDisplayInfo::SharedDeviceDisplayInfo()
Java_DeviceDisplayInfo_getBitsPerPixel(env, j_device_info_.obj()),
Java_DeviceDisplayInfo_getBitsPerComponent(env, j_device_info_.obj()),
Java_DeviceDisplayInfo_getDIPScale(env, j_device_info_.obj()),
- Java_DeviceDisplayInfo_getSmallestDIPWidth(env, j_device_info_.obj()));
+ Java_DeviceDisplayInfo_getSmallestDIPWidth(env, j_device_info_.obj()),
+ Java_DeviceDisplayInfo_getRotationDegrees(env, j_device_info_.obj()));
}
SharedDeviceDisplayInfo::~SharedDeviceDisplayInfo() {
@@ -139,7 +147,8 @@ void SharedDeviceDisplayInfo::UpdateDisplayInfo(JNIEnv* env,
jint bits_per_pixel,
jint bits_per_component,
jdouble dip_scale,
- jint smallest_dip_width) {
+ jint smallest_dip_width,
+ jint rotation_degrees) {
display_height_ = static_cast<int>(display_height);
display_width_ = static_cast<int>(display_width);
physical_display_height_ = static_cast<int>(physical_display_height);
@@ -148,6 +157,7 @@ void SharedDeviceDisplayInfo::UpdateDisplayInfo(JNIEnv* env,
bits_per_component_ = static_cast<int>(bits_per_component);
dip_scale_ = static_cast<double>(dip_scale);
smallest_dip_width_ = static_cast<int>(smallest_dip_width);
+ rotation_degrees_ = static_cast<int>(rotation_degrees);
}
} // namespace gfx
diff --git a/ui/gfx/android/shared_device_display_info.h b/ui/gfx/android/shared_device_display_info.h
index 7d81353d11..e6983e58aa 100644
--- a/ui/gfx/android/shared_device_display_info.h
+++ b/ui/gfx/android/shared_device_display_info.h
@@ -27,6 +27,7 @@ class SharedDeviceDisplayInfo {
int GetBitsPerComponent();
double GetDIPScale();
int GetSmallestDIPWidth();
+ int GetRotationDegrees();
// Registers methods with JNI and returns true if succeeded.
static bool RegisterSharedDeviceDisplayInfo(JNIEnv* env);
@@ -40,7 +41,8 @@ class SharedDeviceDisplayInfo {
jint bits_per_pixel,
jint bits_per_component,
jdouble dip_scale,
- jint smallest_dip_width);
+ jint smallest_dip_width,
+ jint rotation_degrees);
private:
friend struct DefaultSingletonTraits<SharedDeviceDisplayInfo>;
@@ -55,7 +57,8 @@ class SharedDeviceDisplayInfo {
jint bits_per_pixel,
jint bits_per_component,
jdouble dip_scale,
- jint smallest_dip_width);
+ jint smallest_dip_width,
+ jint rotation_degrees);
base::Lock lock_;
base::android::ScopedJavaGlobalRef<jobject> j_device_info_;
@@ -68,6 +71,7 @@ class SharedDeviceDisplayInfo {
int bits_per_component_;
double dip_scale_;
int smallest_dip_width_;
+ int rotation_degrees_;
DISALLOW_COPY_AND_ASSIGN(SharedDeviceDisplayInfo);
};
diff --git a/ui/gfx/display.cc b/ui/gfx/display.cc
index 2cdc9a539a..069c79eccc 100644
--- a/ui/gfx/display.cc
+++ b/ui/gfx/display.cc
@@ -85,6 +85,42 @@ Display::Display(int64 id, const gfx::Rect& bounds)
Display::~Display() {
}
+int Display::RotationAsDegree() const {
+ switch (rotation_) {
+ case ROTATE_0:
+ return 0;
+ case ROTATE_90:
+ return 90;
+ case ROTATE_180:
+ return 180;
+ case ROTATE_270:
+ return 270;
+ }
+
+ NOTREACHED();
+ return 0;
+}
+
+void Display::SetRotationAsDegree(int rotation) {
+ switch (rotation) {
+ case 0:
+ rotation_ = ROTATE_0;
+ break;
+ case 90:
+ rotation_ = ROTATE_90;
+ break;
+ case 180:
+ rotation_ = ROTATE_180;
+ break;
+ case 270:
+ rotation_ = ROTATE_270;
+ break;
+ default:
+ // We should not reach that but we will just ignore the call if we do.
+ NOTREACHED();
+ }
+}
+
Insets Display::GetWorkAreaInsets() const {
return gfx::Insets(work_area_.y() - bounds_.y(),
work_area_.x() - bounds_.x(),
diff --git a/ui/gfx/display.h b/ui/gfx/display.h
index eb35a5f5c6..90fc42f5c3 100644
--- a/ui/gfx/display.h
+++ b/ui/gfx/display.h
@@ -73,6 +73,8 @@ class GFX_EXPORT Display {
Rotation rotation() const { return rotation_; }
void set_rotation(Rotation rotation) { rotation_ = rotation; }
+ int RotationAsDegree() const;
+ void SetRotationAsDegree(int rotation);
TouchSupport touch_support() const { return touch_support_; }
void set_touch_support(TouchSupport support) { touch_support_ = support; }
diff --git a/ui/gfx/gdk_compat.h b/ui/gfx/gdk_compat.h
deleted file mode 100644
index b11d779583..0000000000
--- a/ui/gfx/gdk_compat.h
+++ /dev/null
@@ -1,27 +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 UI_GFX_GDK_COMPAT_H_
-#define UI_GFX_GDK_COMPAT_H_
-
-#include <gtk/gtk.h>
-#include <gdk/gdkx.h>
-
-// Google Chrome must depend on GTK 2.18, at least until the next LTS drops
-// (and we might have to extend which version of GTK we want to target due to
-// RHEL). To make our porting job for GTK3 easier, we define all the methods
-// that replace deprecated APIs in this file and then include it everywhere.
-//
-// This file is organized first by version, and then with each version,
-// alphabetically by method.
-
-#if !GTK_CHECK_VERSION(2, 24, 0)
-inline GdkWindow* gdk_x11_window_lookup_for_display(GdkDisplay* display,
- Window window) {
- return static_cast<GdkWindow*>(gdk_xid_table_lookup_for_display(display,
- window));
-}
-#endif
-
-#endif // UI_GFX_GDK_COMPAT_H_
diff --git a/ui/gfx/geometry/BUILD.gn b/ui/gfx/geometry/BUILD.gn
index ac10b1119e..9492ced963 100644
--- a/ui/gfx/geometry/BUILD.gn
+++ b/ui/gfx/geometry/BUILD.gn
@@ -56,5 +56,6 @@ component("geometry") {
deps = [
"//base",
+ "//ui/gfx:gfx_export",
]
}
diff --git a/ui/gfx/gfx.gyp b/ui/gfx/gfx.gyp
index f0b4099dfa..cb94431a0d 100644
--- a/ui/gfx/gfx.gyp
+++ b/ui/gfx/gfx.gyp
@@ -201,18 +201,6 @@
'nine_image_painter.cc',
'nine_image_painter.h',
'overlay_transform.h',
- 'ozone/dri/dri_buffer.cc',
- 'ozone/dri/dri_buffer.h',
- 'ozone/dri/dri_surface.cc',
- 'ozone/dri/dri_surface.h',
- 'ozone/dri/dri_surface_factory.cc',
- 'ozone/dri/dri_surface_factory.h',
- 'ozone/dri/dri_vsync_provider.cc',
- 'ozone/dri/dri_vsync_provider.h',
- 'ozone/dri/dri_wrapper.cc',
- 'ozone/dri/dri_wrapper.h',
- 'ozone/dri/hardware_display_controller.cc',
- 'ozone/dri/hardware_display_controller.h',
'ozone/impl/file_surface_factory.cc',
'ozone/impl/file_surface_factory.h',
'ozone/surface_factory_ozone.cc',
@@ -402,11 +390,6 @@
'render_text_ozone.cc',
],
}],
- ['ozone_platform_dri==1', {
- 'dependencies': [
- '<(DEPTH)/build/linux/system.gyp:dridrm',
- ],
- }],
['desktop_linux==1 or chromeos==1', {
'dependencies': [
# font_render_params_linux.cc uses fontconfig
diff --git a/ui/gfx/gfx.target.darwin-arm.mk b/ui/gfx/gfx.target.darwin-arm.mk
index faada444af..e9fb59fcff 100644
--- a/ui/gfx/gfx.target.darwin-arm.mk
+++ b/ui/gfx/gfx.target.darwin-arm.mk
@@ -151,12 +151,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -279,12 +282,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -364,7 +370,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx.target.darwin-mips.mk b/ui/gfx/gfx.target.darwin-mips.mk
index 9902bbb3de..0c02a51cb9 100644
--- a/ui/gfx/gfx.target.darwin-mips.mk
+++ b/ui/gfx/gfx.target.darwin-mips.mk
@@ -150,12 +150,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -277,12 +280,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -360,7 +366,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx.target.darwin-x86.mk b/ui/gfx/gfx.target.darwin-x86.mk
index 063a6414cc..6bda3fcb0f 100644
--- a/ui/gfx/gfx.target.darwin-x86.mk
+++ b/ui/gfx/gfx.target.darwin-x86.mk
@@ -152,12 +152,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -280,12 +283,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -362,7 +368,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx.target.darwin-x86_64.mk b/ui/gfx/gfx.target.darwin-x86_64.mk
index 490fd4783f..c07caa0ab8 100644
--- a/ui/gfx/gfx.target.darwin-x86_64.mk
+++ b/ui/gfx/gfx.target.darwin-x86_64.mk
@@ -152,12 +152,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -280,12 +283,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -362,7 +368,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx.target.linux-arm.mk b/ui/gfx/gfx.target.linux-arm.mk
index faada444af..e9fb59fcff 100644
--- a/ui/gfx/gfx.target.linux-arm.mk
+++ b/ui/gfx/gfx.target.linux-arm.mk
@@ -151,12 +151,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -279,12 +282,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -364,7 +370,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx.target.linux-mips.mk b/ui/gfx/gfx.target.linux-mips.mk
index 9902bbb3de..0c02a51cb9 100644
--- a/ui/gfx/gfx.target.linux-mips.mk
+++ b/ui/gfx/gfx.target.linux-mips.mk
@@ -150,12 +150,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -277,12 +280,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -360,7 +366,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx.target.linux-x86.mk b/ui/gfx/gfx.target.linux-x86.mk
index 063a6414cc..6bda3fcb0f 100644
--- a/ui/gfx/gfx.target.linux-x86.mk
+++ b/ui/gfx/gfx.target.linux-x86.mk
@@ -152,12 +152,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -280,12 +283,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -362,7 +368,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx.target.linux-x86_64.mk b/ui/gfx/gfx.target.linux-x86_64.mk
index 490fd4783f..c07caa0ab8 100644
--- a/ui/gfx/gfx.target.linux-x86_64.mk
+++ b/ui/gfx/gfx.target.linux-x86_64.mk
@@ -152,12 +152,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -280,12 +283,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DCHROME_PNG_WRITE_SUPPORT' \
'-DPNG_USER_CONFIG' \
@@ -362,7 +368,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx_geometry.target.darwin-arm.mk b/ui/gfx/gfx_geometry.target.darwin-arm.mk
index b791ca673c..0bb7755f19 100644
--- a/ui/gfx/gfx_geometry.target.darwin-arm.mk
+++ b/ui/gfx/gfx_geometry.target.darwin-arm.mk
@@ -240,7 +240,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx_geometry.target.darwin-mips.mk b/ui/gfx/gfx_geometry.target.darwin-mips.mk
index 91d8873d43..e9af83c1f6 100644
--- a/ui/gfx/gfx_geometry.target.darwin-mips.mk
+++ b/ui/gfx/gfx_geometry.target.darwin-mips.mk
@@ -236,7 +236,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx_geometry.target.darwin-x86.mk b/ui/gfx/gfx_geometry.target.darwin-x86.mk
index 8d943f4d55..33945e18a8 100644
--- a/ui/gfx/gfx_geometry.target.darwin-x86.mk
+++ b/ui/gfx/gfx_geometry.target.darwin-x86.mk
@@ -238,7 +238,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx_geometry.target.darwin-x86_64.mk b/ui/gfx/gfx_geometry.target.darwin-x86_64.mk
index 74957f47a7..c4f41b8fa4 100644
--- a/ui/gfx/gfx_geometry.target.darwin-x86_64.mk
+++ b/ui/gfx/gfx_geometry.target.darwin-x86_64.mk
@@ -238,7 +238,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx_geometry.target.linux-arm.mk b/ui/gfx/gfx_geometry.target.linux-arm.mk
index b791ca673c..0bb7755f19 100644
--- a/ui/gfx/gfx_geometry.target.linux-arm.mk
+++ b/ui/gfx/gfx_geometry.target.linux-arm.mk
@@ -240,7 +240,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx_geometry.target.linux-mips.mk b/ui/gfx/gfx_geometry.target.linux-mips.mk
index 91d8873d43..e9af83c1f6 100644
--- a/ui/gfx/gfx_geometry.target.linux-mips.mk
+++ b/ui/gfx/gfx_geometry.target.linux-mips.mk
@@ -236,7 +236,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx_geometry.target.linux-x86.mk b/ui/gfx/gfx_geometry.target.linux-x86.mk
index 8d943f4d55..33945e18a8 100644
--- a/ui/gfx/gfx_geometry.target.linux-x86.mk
+++ b/ui/gfx/gfx_geometry.target.linux-x86.mk
@@ -238,7 +238,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/gfx_geometry.target.linux-x86_64.mk b/ui/gfx/gfx_geometry.target.linux-x86_64.mk
index 74957f47a7..c4f41b8fa4 100644
--- a/ui/gfx/gfx_geometry.target.linux-x86_64.mk
+++ b/ui/gfx/gfx_geometry.target.linux-x86_64.mk
@@ -238,7 +238,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gfx/screen_android.cc b/ui/gfx/screen_android.cc
index e90bb76725..9114b85545 100644
--- a/ui/gfx/screen_android.cc
+++ b/ui/gfx/screen_android.cc
@@ -43,6 +43,7 @@ class ScreenAndroid : public Screen {
gfx::Display display(0, bounds_in_dip);
if (!gfx::Display::HasForceDeviceScaleFactor())
display.set_device_scale_factor(device_scale_factor);
+ display.SetRotationAsDegree(device_info.GetRotationDegrees());
return display;
}
diff --git a/ui/gfx/win/dpi.cc b/ui/gfx/win/dpi.cc
index fbcbb77866..1afd5156b8 100644
--- a/ui/gfx/win/dpi.cc
+++ b/ui/gfx/win/dpi.cc
@@ -44,6 +44,10 @@ float GetUnforcedDeviceScaleFactor() {
float GetModernUIScaleWrapper() {
float result = 1.0f;
+ // TODO(cpu) : Fix scale for Win7.
+ if (base::win::GetVersion() < base::win::VERSION_WIN8)
+ return result;
+
typedef float(WINAPI *GetModernUIScalePtr)(VOID);
HMODULE lib = LoadLibraryA("metro_driver.dll");
if (lib) {
@@ -191,12 +195,8 @@ float GetDeviceScaleFactor() {
}
Point ScreenToDIPPoint(const Point& pixel_point) {
- static float scaling_factor =
- GetDeviceScaleFactor() > GetUnforcedDeviceScaleFactor() ?
- 1.0f / GetDeviceScaleFactor() :
- 1.0f;
return ToFlooredPoint(ScalePoint(pixel_point,
- scaling_factor));
+ 1.0f / GetDeviceScaleFactor()));
}
Point DIPToScreenPoint(const Point& dip_point) {
diff --git a/ui/gfx/x/x11_error_tracker.cc b/ui/gfx/x/x11_error_tracker.cc
index 16ed5955d5..110f79ccd0 100644
--- a/ui/gfx/x/x11_error_tracker.cc
+++ b/ui/gfx/x/x11_error_tracker.cc
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/logging.h"
#include "ui/gfx/x/x11_error_tracker.h"
#include "ui/gfx/x/x11_types.h"
@@ -9,6 +10,7 @@
namespace {
unsigned char g_x11_error_code = 0;
+static gfx::X11ErrorTracker* g_handler = NULL;
int X11ErrorHandler(Display* display, XErrorEvent* error) {
g_x11_error_code = error->error_code;
@@ -19,10 +21,19 @@ int X11ErrorHandler(Display* display, XErrorEvent* error) {
namespace gfx {
X11ErrorTracker::X11ErrorTracker() {
+ // This is a poor-man's check for incorrect usage. It disallows nested
+ // X11ErrorTracker instances on the same thread.
+ DCHECK(g_handler == NULL);
+ g_handler = this;
+ XSync(GetXDisplay(), False);
old_handler_ = XSetErrorHandler(X11ErrorHandler);
+ g_x11_error_code = 0;
}
-X11ErrorTracker::~X11ErrorTracker() { XSetErrorHandler(old_handler_); }
+X11ErrorTracker::~X11ErrorTracker() {
+ g_handler = NULL;
+ XSetErrorHandler(old_handler_);
+}
bool X11ErrorTracker::FoundNewError() {
XSync(GetXDisplay(), False);
diff --git a/ui/gl/gl.target.darwin-arm.mk b/ui/gl/gl.target.darwin-arm.mk
index 44322bbf9d..fb24817377 100644
--- a/ui/gl/gl.target.darwin-arm.mk
+++ b/ui/gl/gl.target.darwin-arm.mk
@@ -139,7 +139,6 @@ MY_CFLAGS_Debug := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-fno-tree-sra \
-fuse-ld=gold \
-Wno-psabi \
@@ -192,12 +191,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -268,7 +270,6 @@ MY_CFLAGS_Release := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-fno-tree-sra \
-fuse-ld=gold \
-Wno-psabi \
@@ -321,12 +322,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -404,7 +408,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gl/gl.target.darwin-mips.mk b/ui/gl/gl.target.darwin-mips.mk
index 38fb6056cb..f8cf564a0c 100644
--- a/ui/gl/gl.target.darwin-mips.mk
+++ b/ui/gl/gl.target.darwin-mips.mk
@@ -139,7 +139,6 @@ MY_CFLAGS_Debug := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-EL \
-mhard-float \
-ffunction-sections \
@@ -191,12 +190,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -267,7 +269,6 @@ MY_CFLAGS_Release := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-EL \
-mhard-float \
-ffunction-sections \
@@ -319,12 +320,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -400,7 +404,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gl/gl.target.darwin-x86.mk b/ui/gl/gl.target.darwin-x86.mk
index 486ad80f0b..bba382d9b6 100644
--- a/ui/gl/gl.target.darwin-x86.mk
+++ b/ui/gl/gl.target.darwin-x86.mk
@@ -138,7 +138,6 @@ MY_CFLAGS_Debug := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-msse2 \
-mfpmath=sse \
-mmmx \
@@ -193,12 +192,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -267,7 +269,6 @@ MY_CFLAGS_Release := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-msse2 \
-mfpmath=sse \
-mmmx \
@@ -322,12 +323,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -402,7 +406,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gl/gl.target.darwin-x86_64.mk b/ui/gl/gl.target.darwin-x86_64.mk
index ba2e9d5786..f4811f34e1 100644
--- a/ui/gl/gl.target.darwin-x86_64.mk
+++ b/ui/gl/gl.target.darwin-x86_64.mk
@@ -140,7 +140,6 @@ MY_CFLAGS_Debug := \
-pipe \
-fPIC \
-Wno-unused-local-typedefs \
- -Wno-unknown-pragmas \
-m64 \
-march=x86-64 \
-fuse-ld=gold \
@@ -193,12 +192,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -269,7 +271,6 @@ MY_CFLAGS_Release := \
-pipe \
-fPIC \
-Wno-unused-local-typedefs \
- -Wno-unknown-pragmas \
-m64 \
-march=x86-64 \
-fuse-ld=gold \
@@ -322,12 +323,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -402,7 +406,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gl/gl.target.linux-arm.mk b/ui/gl/gl.target.linux-arm.mk
index 44322bbf9d..fb24817377 100644
--- a/ui/gl/gl.target.linux-arm.mk
+++ b/ui/gl/gl.target.linux-arm.mk
@@ -139,7 +139,6 @@ MY_CFLAGS_Debug := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-fno-tree-sra \
-fuse-ld=gold \
-Wno-psabi \
@@ -192,12 +191,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -268,7 +270,6 @@ MY_CFLAGS_Release := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-fno-tree-sra \
-fuse-ld=gold \
-Wno-psabi \
@@ -321,12 +322,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -404,7 +408,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gl/gl.target.linux-mips.mk b/ui/gl/gl.target.linux-mips.mk
index 38fb6056cb..f8cf564a0c 100644
--- a/ui/gl/gl.target.linux-mips.mk
+++ b/ui/gl/gl.target.linux-mips.mk
@@ -139,7 +139,6 @@ MY_CFLAGS_Debug := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-EL \
-mhard-float \
-ffunction-sections \
@@ -191,12 +190,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -267,7 +269,6 @@ MY_CFLAGS_Release := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-EL \
-mhard-float \
-ffunction-sections \
@@ -319,12 +320,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -400,7 +404,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gl/gl.target.linux-x86.mk b/ui/gl/gl.target.linux-x86.mk
index 486ad80f0b..bba382d9b6 100644
--- a/ui/gl/gl.target.linux-x86.mk
+++ b/ui/gl/gl.target.linux-x86.mk
@@ -138,7 +138,6 @@ MY_CFLAGS_Debug := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-msse2 \
-mfpmath=sse \
-mmmx \
@@ -193,12 +192,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -267,7 +269,6 @@ MY_CFLAGS_Release := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-msse2 \
-mfpmath=sse \
-mmmx \
@@ -322,12 +323,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -402,7 +406,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gl/gl.target.linux-x86_64.mk b/ui/gl/gl.target.linux-x86_64.mk
index ba2e9d5786..f4811f34e1 100644
--- a/ui/gl/gl.target.linux-x86_64.mk
+++ b/ui/gl/gl.target.linux-x86_64.mk
@@ -140,7 +140,6 @@ MY_CFLAGS_Debug := \
-pipe \
-fPIC \
-Wno-unused-local-typedefs \
- -Wno-unknown-pragmas \
-m64 \
-march=x86-64 \
-fuse-ld=gold \
@@ -193,12 +192,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -269,7 +271,6 @@ MY_CFLAGS_Release := \
-pipe \
-fPIC \
-Wno-unused-local-typedefs \
- -Wno-unknown-pragmas \
-m64 \
-march=x86-64 \
-fuse-ld=gold \
@@ -322,12 +323,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -402,7 +406,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/gl/gl_bindings.h b/ui/gl/gl_bindings.h
index 8e0f2c6e61..8b136088fe 100644
--- a/ui/gl/gl_bindings.h
+++ b/ui/gl/gl_bindings.h
@@ -128,6 +128,9 @@
#define GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM 0x84F5
#define GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM 0x84F6
+// GL_CHROMIUM_sync_query
+#define GL_COMMANDS_COMPLETED_CHROMIUM 0x84F7
+
// GL_OES_texure_3D
#define GL_SAMPLER_3D_OES 0x8B5F
diff --git a/ui/gl/gl_fence.cc b/ui/gl/gl_fence.cc
index 262de48af6..def030b5de 100644
--- a/ui/gl/gl_fence.cc
+++ b/ui/gl/gl_fence.cc
@@ -7,6 +7,7 @@
#include "base/compiler_specific.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_version_info.h"
namespace {
@@ -165,7 +166,8 @@ gfx::GLFence* CreateFence(bool flush) {
return new EGLFenceSync(flush);
#endif
// Prefer ARB_sync which supports server-side wait.
- if (gfx::g_driver_gl.ext.b_GL_ARB_sync)
+ if (gfx::g_driver_gl.ext.b_GL_ARB_sync ||
+ gfx::GLContext::GetCurrent()->GetVersionInfo()->is_es3)
return new GLFenceARBSync(flush);
if (gfx::g_driver_gl.ext.b_GL_NV_fence)
return new GLFenceNVFence(flush);
diff --git a/ui/keyboard/keyboard.gyp b/ui/keyboard/keyboard.gyp
index fe359c6ae1..153b38c44a 100644
--- a/ui/keyboard/keyboard.gyp
+++ b/ui/keyboard/keyboard.gyp
@@ -48,7 +48,7 @@
'../events/events.gyp:events',
'../gfx/gfx.gyp:gfx',
'../gfx/gfx.gyp:gfx_geometry',
- '../wm/wm.gyp:wm_core',
+ '../wm/wm.gyp:wm',
'keyboard_resources',
],
'defines': [
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc
index 4dd085c6e0..52c7c14771 100644
--- a/ui/keyboard/keyboard_controller.cc
+++ b/ui/keyboard/keyboard_controller.cc
@@ -275,9 +275,9 @@ void KeyboardController::RemoveObserver(KeyboardControllerObserver* observer) {
observer_list_.RemoveObserver(observer);
}
-void KeyboardController::ShowAndLockKeyboard() {
- set_lock_keyboard(true);
- OnShowImeIfNeeded();
+void KeyboardController::ShowKeyboard(bool lock) {
+ set_lock_keyboard(lock);
+ ShowKeyboardInternal();
}
void KeyboardController::OnWindowHierarchyChanged(
@@ -298,7 +298,7 @@ void KeyboardController::OnTextInputStateChanged(
return;
if (IsKeyboardUsabilityExperimentEnabled()) {
- OnShowImeIfNeeded();
+ ShowKeyboardInternal();
return;
}
@@ -337,6 +337,10 @@ void KeyboardController::OnInputMethodDestroyed(
}
void KeyboardController::OnShowImeIfNeeded() {
+ ShowKeyboardInternal();
+}
+
+void KeyboardController::ShowKeyboardInternal() {
if (!container_.get())
return;
@@ -350,7 +354,7 @@ void KeyboardController::OnShowImeIfNeeded() {
proxy_->ReloadKeyboardIfNeeded();
- if (keyboard_visible_)
+ if (keyboard_visible_ || proxy_->GetKeyboardWindow()->bounds().height() == 0)
return;
keyboard_visible_ = true;
@@ -370,10 +374,6 @@ void KeyboardController::OnShowImeIfNeeded() {
!container_->layer()->GetAnimator()->is_animating())
return;
- ShowKeyboard();
-}
-
-void KeyboardController::ShowKeyboard() {
ToggleTouchEventLogging(false);
ui::LayerAnimator* container_animator = container_->layer()->GetAnimator();
@@ -394,6 +394,8 @@ void KeyboardController::ShowKeyboard() {
base::Unretained(this))));
container_animator->AddObserver(animation_observer_.get());
+ proxy_->ShowKeyboardContainer(container_.get());
+
{
// Scope the following animation settings as we don't want to animate
// visibility change that triggered by a call to the base class function
@@ -406,8 +408,6 @@ void KeyboardController::ShowKeyboard() {
container_->SetTransform(gfx::Transform());
container_->layer()->SetOpacity(1.0);
}
-
- proxy_->ShowKeyboardContainer(container_.get());
}
bool KeyboardController::WillHideKeyboard() const {
diff --git a/ui/keyboard/keyboard_controller.h b/ui/keyboard/keyboard_controller.h
index 0541165b33..d62306263c 100644
--- a/ui/keyboard/keyboard_controller.h
+++ b/ui/keyboard/keyboard_controller.h
@@ -76,8 +76,9 @@ class KEYBOARD_EXPORT KeyboardController : public ui::InputMethodObserver,
void set_lock_keyboard(bool lock) { lock_keyboard_ = lock; }
- // Force the keyboard to show up if not showing and lock the keyboard.
- void ShowAndLockKeyboard();
+ // Force the keyboard to show up if not showing and lock the keyboard if
+ // |lock| is true.
+ void ShowKeyboard(bool lock);
// Sets the active keyboard controller. KeyboardController takes ownership of
// the instance. Calling ResetIntance with a new instance destroys the
@@ -118,7 +119,7 @@ class KEYBOARD_EXPORT KeyboardController : public ui::InputMethodObserver,
virtual void OnShowImeIfNeeded() OVERRIDE;
// Show virtual keyboard immediately with animation.
- void ShowKeyboard();
+ void ShowKeyboardInternal();
// Returns true if keyboard is scheduled to hide.
bool WillHideKeyboard() const;
diff --git a/ui/keyboard/keyboard_controller_proxy.cc b/ui/keyboard/keyboard_controller_proxy.cc
index acd78f89c3..92869462fb 100644
--- a/ui/keyboard/keyboard_controller_proxy.cc
+++ b/ui/keyboard/keyboard_controller_proxy.cc
@@ -54,9 +54,7 @@ class KeyboardContentsDelegate : public content::WebContentsDelegate,
int new_height = pos.height();
bounds.set_y(bounds.y() + bounds.height() - new_height);
bounds.set_height(new_height);
- proxy_->set_resizing_from_contents(true);
keyboard->SetBounds(bounds);
- proxy_->set_resizing_from_contents(false);
}
// Overridden from content::WebContentsDelegate:
@@ -81,7 +79,7 @@ class KeyboardContentsDelegate : public content::WebContentsDelegate,
namespace keyboard {
KeyboardControllerProxy::KeyboardControllerProxy()
- : default_url_(kKeyboardURL), resizing_from_contents_(false) {
+ : default_url_(kKeyboardURL) {
}
KeyboardControllerProxy::~KeyboardControllerProxy() {
diff --git a/ui/keyboard/keyboard_controller_proxy.h b/ui/keyboard/keyboard_controller_proxy.h
index f05f6f2997..0884cd91bb 100644
--- a/ui/keyboard/keyboard_controller_proxy.h
+++ b/ui/keyboard/keyboard_controller_proxy.h
@@ -52,19 +52,10 @@ class KEYBOARD_EXPORT KeyboardControllerProxy {
// with the proxy.
virtual aura::Window* GetKeyboardWindow();
- // Whether the keyboard window is resizing from its web contents.
- bool resizing_from_contents() const { return resizing_from_contents_; }
-
// Whether the keyboard window is created. The keyboard window is tied to a
// WebContent so we can just check if the WebContent is created or not.
virtual bool HasKeyboardWindow() const;
- // Sets the flag of whether the keyboard window is resizing from
- // its web contents.
- void set_resizing_from_contents(bool resizing) {
- resizing_from_contents_ = resizing;
- }
-
// Gets the InputMethod that will provide notifications about changes in the
// text input context.
virtual ui::InputMethod* GetInputMethod() = 0;
@@ -130,9 +121,6 @@ class KEYBOARD_EXPORT KeyboardControllerProxy {
scoped_ptr<content::WebContents> keyboard_contents_;
- // Whether the current keyboard window is resizing from its web content.
- bool resizing_from_contents_;
-
DISALLOW_COPY_AND_ASSIGN(KeyboardControllerProxy);
};
diff --git a/ui/keyboard/keyboard_controller_unittest.cc b/ui/keyboard/keyboard_controller_unittest.cc
index cee5581bec..4333c84a17 100644
--- a/ui/keyboard/keyboard_controller_unittest.cc
+++ b/ui/keyboard/keyboard_controller_unittest.cc
@@ -27,6 +27,7 @@
#include "ui/keyboard/keyboard_controller_observer.h"
#include "ui/keyboard/keyboard_controller_proxy.h"
#include "ui/keyboard/keyboard_switches.h"
+#include "ui/keyboard/keyboard_util.h"
namespace keyboard {
namespace {
@@ -193,8 +194,15 @@ class KeyboardControllerTest : public testing::Test {
void SetFocus(ui::TextInputClient* client) {
ui::InputMethod* input_method = proxy()->GetInputMethod();
input_method->SetFocusedTextInputClient(client);
- if (client && client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE)
+ if (client && client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) {
input_method->ShowImeIfNeeded();
+ if (proxy_->GetKeyboardWindow()->bounds().height() == 0) {
+ // Set initial bounds for test keyboard window.
+ proxy_->GetKeyboardWindow()->SetBounds(
+ KeyboardBoundsFromWindowBounds(
+ controller()->GetContainerWindow()->bounds(), 100));
+ }
+ }
}
bool WillHideKeyboard() {
@@ -214,17 +222,27 @@ class KeyboardControllerTest : public testing::Test {
TEST_F(KeyboardControllerTest, KeyboardSize) {
aura::Window* container(controller()->GetContainerWindow());
- gfx::Rect bounds(0, 0, 100, 100);
- container->SetBounds(bounds);
+ aura::Window* keyboard(proxy()->GetKeyboardWindow());
+ container->SetBounds(gfx::Rect(0, 0, 200, 100));
+
+ container->AddChild(keyboard);
+ const gfx::Rect& before_bounds = keyboard->bounds();
+ // The initial keyboard should be positioned at the bottom of container and
+ // has 0 height.
+ ASSERT_EQ(gfx::Rect(0, 100, 200, 0), before_bounds);
- const gfx::Rect& before_bounds = proxy()->GetKeyboardWindow()->bounds();
gfx::Rect new_bounds(
- before_bounds.x(), before_bounds.y(),
- before_bounds.width() / 2, before_bounds.height() / 2);
+ before_bounds.x(), before_bounds.y() - 50,
+ before_bounds.width(), 50);
+
+ keyboard->SetBounds(new_bounds);
+ ASSERT_EQ(new_bounds, keyboard->bounds());
- // The KeyboardController's LayoutManager shouldn't let this happen
- proxy()->GetKeyboardWindow()->SetBounds(new_bounds);
- ASSERT_EQ(before_bounds, proxy()->GetKeyboardWindow()->bounds());
+ // Mock a screen rotation.
+ container->SetBounds(gfx::Rect(0, 0, 100, 200));
+ // The above call should resize keyboard to new width while keeping the old
+ // height.
+ ASSERT_EQ(gfx::Rect(0, 150, 100, 50), keyboard->bounds());
}
// Tests that tapping/clicking inside the keyboard does not give it focus.
@@ -393,33 +411,6 @@ TEST_F(KeyboardControllerTest, AlwaysVisibleWhenLocked) {
EXPECT_FALSE(keyboard_container->IsVisible());
}
-TEST_F(KeyboardControllerTest, KeyboardResizingFromContents) {
- aura::Window* keyboard_container = controller()->GetContainerWindow();
- aura::Window* keyboard_window = proxy()->GetKeyboardWindow();
- keyboard_container->SetBounds(gfx::Rect(800, 600));
- keyboard_container->AddChild(keyboard_window);
-
- int original_height = keyboard_window->bounds().height();
-
- // Resizes from contents when flag is unset.
- keyboard_window->SetBounds(gfx::Rect(100, 80));
- EXPECT_EQ(original_height, keyboard_window->bounds().height());
-
- // Resizes from contents when flag is set.
- proxy()->set_resizing_from_contents(true);
- keyboard_window->SetBounds(gfx::Rect(100, 80));
- EXPECT_EQ(80, keyboard_window->bounds().height());
-
- // Resizes from container when flag is set.
- keyboard_container->SetBounds(gfx::Rect(400, 300));
- EXPECT_EQ(80, keyboard_window->bounds().height());
-
- // Resizes from container when flag is unset.
- proxy()->set_resizing_from_contents(false);
- keyboard_container->SetBounds(gfx::Rect(800, 600));
- EXPECT_EQ(original_height, keyboard_window->bounds().height());
-}
-
class KeyboardControllerAnimationTest : public KeyboardControllerTest,
public KeyboardControllerObserver {
public:
diff --git a/ui/keyboard/keyboard_layout_manager.cc b/ui/keyboard/keyboard_layout_manager.cc
index 32085415bf..d7faf0fa7a 100644
--- a/ui/keyboard/keyboard_layout_manager.cc
+++ b/ui/keyboard/keyboard_layout_manager.cc
@@ -4,6 +4,7 @@
#include "ui/keyboard/keyboard_layout_manager.h"
+#include "ui/compositor/layer_animator.h"
#include "ui/keyboard/keyboard_controller.h"
#include "ui/keyboard/keyboard_controller_proxy.h"
#include "ui/keyboard/keyboard_util.h"
@@ -12,14 +13,24 @@ namespace keyboard {
// Overridden from aura::LayoutManager
void KeyboardLayoutManager::OnWindowResized() {
- if (keyboard_ && !controller_->proxy()->resizing_from_contents())
- ResizeKeyboardToDefault(keyboard_);
+ if (keyboard_) {
+ gfx::Rect window_bounds = controller_->GetContainerWindow()->bounds();
+ // Keep the same height when window resize. It usually get called when
+ // screen rotate.
+ int height = keyboard_->bounds().height();
+ keyboard_->SetBounds(gfx::Rect(
+ window_bounds.x(),
+ window_bounds.bottom() - height,
+ window_bounds.width(),
+ height));
+ }
}
void KeyboardLayoutManager::OnWindowAddedToLayout(aura::Window* child) {
DCHECK(!keyboard_);
keyboard_ = child;
- ResizeKeyboardToDefault(keyboard_);
+ keyboard_->SetBounds(DefaultKeyboardBoundsFromWindowBounds(
+ controller_->GetContainerWindow()->bounds()));
}
void KeyboardLayoutManager::SetChildBounds(aura::Window* child,
@@ -28,16 +39,25 @@ void KeyboardLayoutManager::SetChildBounds(aura::Window* child,
// resizing from the contents (through window.resizeTo call in JS).
// The flag resizing_from_contents() is used to determine the source of the
// resize.
- if (controller_->proxy()->resizing_from_contents()) {
+ DCHECK(child == keyboard_);
+
+ ui::LayerAnimator* animator =
+ controller_->GetContainerWindow()->layer()->GetAnimator();
+ // Stops previous animation if a window resize is requested during animation.
+ if (animator->is_animating())
+ animator->StopAnimating();
+
+ gfx::Rect old_bounds = child->bounds();
+ SetChildBoundsDirect(child, requested_bounds);
+ if (old_bounds.height() == 0 && child->bounds().height() != 0) {
+ // The window height is set to 0 initially. If the height of |old_bounds| is
+ // 0 and the new bounds is not 0, it probably means window.resizeTo is
+ // called to set the window height. We should try to show keyboard again in
+ // case the show keyboard request is called before the height is set.
+ controller_->ShowKeyboard(false);
+ } else {
controller_->NotifyKeyboardBoundsChanging(requested_bounds);
- SetChildBoundsDirect(child, requested_bounds);
}
}
-void KeyboardLayoutManager::ResizeKeyboardToDefault(aura::Window* child) {
- gfx::Rect keyboard_bounds = DefaultKeyboardBoundsFromWindowBounds(
- controller_->GetContainerWindow()->bounds());
- SetChildBoundsDirect(child, keyboard_bounds);
-}
-
} // namespace keyboard
diff --git a/ui/keyboard/keyboard_layout_manager.h b/ui/keyboard/keyboard_layout_manager.h
index 52af5c9525..bc13f16c9c 100644
--- a/ui/keyboard/keyboard_layout_manager.h
+++ b/ui/keyboard/keyboard_layout_manager.h
@@ -32,8 +32,6 @@ class KeyboardLayoutManager : public aura::LayoutManager {
const gfx::Rect& requested_bounds) OVERRIDE;
private:
- void ResizeKeyboardToDefault(aura::Window* child);
-
KeyboardController* controller_;
aura::Window* keyboard_;
diff --git a/ui/keyboard/keyboard_util.cc b/ui/keyboard/keyboard_util.cc
index 7048be2e55..1e06795bdc 100644
--- a/ui/keyboard/keyboard_util.cc
+++ b/ui/keyboard/keyboard_util.cc
@@ -43,26 +43,6 @@ bool g_accessibility_keyboard_enabled = false;
base::LazyInstance<GURL> g_override_content_url = LAZY_INSTANCE_INITIALIZER;
-// The ratio between the height of the keyboard and the screen when using the
-// usability keyboard.
-const float kUsabilityKeyboardHeightRatio = 1.0f;
-
-// The default ratio between the height of the keyboard and the screen.
-const float kDefaultKeyboardHeightRatio = 0.41f;
-
-// The ratio between the height of the keyboard and the screen when using the
-// accessibility keyboard.
-const float kAccessibilityKeyboardHeightRatio = 0.3f;
-
-float GetKeyboardHeightRatio(){
- if (keyboard::IsKeyboardUsabilityExperimentEnabled()) {
- return kUsabilityKeyboardHeightRatio;
- } else if (keyboard::GetAccessibilityKeyboardEnabled()) {
- return kAccessibilityKeyboardHeightRatio;
- }
- return kDefaultKeyboardHeightRatio;
-}
-
bool g_touch_keyboard_enabled = false;
} // namespace
@@ -71,12 +51,23 @@ namespace keyboard {
gfx::Rect DefaultKeyboardBoundsFromWindowBounds(
const gfx::Rect& window_bounds) {
- const float kKeyboardHeightRatio = GetKeyboardHeightRatio();
+ // Initialize default keyboard height to 0. The keyboard window height should
+ // only be set by window.resizeTo in virtual keyboard web contents. Otherwise,
+ // the default height may conflict with the new height and causing some
+ // strange animation issues. For keyboard usability experiments, a full screen
+ // virtual keyboard window is always preferred.
int keyboard_height =
- static_cast<int>(window_bounds.height() * kKeyboardHeightRatio);
+ keyboard::IsKeyboardUsabilityExperimentEnabled() ?
+ window_bounds.height() : 0;
+
+ return KeyboardBoundsFromWindowBounds(window_bounds, keyboard_height);
+}
+
+gfx::Rect KeyboardBoundsFromWindowBounds(const gfx::Rect& window_bounds,
+ int keyboard_height) {
return gfx::Rect(
window_bounds.x(),
- window_bounds.y() + window_bounds.height() - keyboard_height,
+ window_bounds.bottom() - keyboard_height,
window_bounds.width(),
keyboard_height);
}
diff --git a/ui/keyboard/keyboard_util.h b/ui/keyboard/keyboard_util.h
index a3a1f8a9bf..4e09d96e61 100644
--- a/ui/keyboard/keyboard_util.h
+++ b/ui/keyboard/keyboard_util.h
@@ -42,6 +42,11 @@ enum KeyboardControlEvent {
KEYBOARD_EXPORT gfx::Rect DefaultKeyboardBoundsFromWindowBounds(
const gfx::Rect& window_bounds);
+// Gets the caculated keyboard bounds from |window_bounds|. The keyboard height
+// is specified by |keyboard_height|.
+KEYBOARD_EXPORT gfx::Rect KeyboardBoundsFromWindowBounds(
+ const gfx::Rect& window_bounds, int keyboard_height);
+
// Sets the state of the a11y onscreen keyboard.
KEYBOARD_EXPORT void SetAccessibilityKeyboardEnabled(bool enabled);
diff --git a/ui/keyboard/resources/constants.js b/ui/keyboard/resources/constants.js
index 96365592ca..9b017046de 100644
--- a/ui/keyboard/resources/constants.js
+++ b/ui/keyboard/resources/constants.js
@@ -59,6 +59,18 @@ var KEY_ASPECT_RATIO_PORTRAIT = 1;
var KEY_ASPECT_RATIO_LANDSCAPE = 1.46;
/**
+ * The ratio between the height and width of the compact keyboard.
+ * @type {number}
+ */
+var DEFAULT_KEYBOARD_ASPECT_RATIO = 0.3;
+
+/**
+ * The ratio between the height and width of the a11y keyboard.
+ * @type {number}
+ */
+var DEFAULT_A11Y_KEYBOARD_ASPECT_RATIO = 0.41;
+
+/**
* The default weight of a key.
* @type {number}
*/
diff --git a/ui/keyboard/resources/elements/kb-key.html b/ui/keyboard/resources/elements/kb-key.html
index 6b9103af73..4a947bed04 100644
--- a/ui/keyboard/resources/elements/kb-key.html
+++ b/ui/keyboard/resources/elements/kb-key.html
@@ -9,13 +9,13 @@
<template>
<style>
:host {
- background-color: #3b3b3e;
- border-radius: 2px;
+ background-color: #ffffff;
+ border-radius: 1px;
border-style: solid;
- border-width: 1px 0px;
- color: #ffffff;
- font-family: roboto-bold;
- font-weight: 300;
+ border-width: 0px 0px;
+ color: #666666;
+ font-family: 'Droid Sans';
+ font-weight: 100;
}
:host .key {
@@ -58,20 +58,20 @@
height: 80%;
}
+ :host .hint,
+ :host([invert]) key {
+ color: #bbbbbb;
+ }
+
:host .hint {
- color: #313131;
font-size: 70%;
position: absolute;
right: 7%;
top: 5%;
}
- :host([invert]) .key {
- color: #313131;
- }
-
:host([invert]) .hint {
- color: #ffffff;
+ color: #666666;
}
:host(.dark) {
@@ -79,26 +79,17 @@
}
:host(.active) {
- -webkit-box-shadow: inset 0px 1px #969696, inset 0px -1px #6f6f6f;
- background-image: -webkit-linear-gradient(#8b8b8b, #7d7d7d);
+ background-color: #dddddd;
background-size: cover;
- border-bottom-color: #5b5b5b;
- border-top-color: #a4a4a4;
}
:host(.dark:not(.active)) {
- -webkit-box-shadow: inset 0px 1px #313131, inset 0px -1px #202020;
- background-color: #222222;
- border-bottom-color: #1c1c1c;
- border-top-color: #4f4f4f;
+ background-color: #555555;
}
:host(:not(.dark):not(.active)) {
- -webkit-box-shadow: inset 0px 1px #6f6f6f, inset 0px -1px #565656;
- background-image: -webkit-linear-gradient(#636363, #5b5b5b);
+ background-color: #ffffff;
background-size: cover;
- border-bottom-color: #4a4a4a;
- border-top-color: #878787;
}
</style>
<div id="key" class="key">
diff --git a/ui/keyboard/resources/elements/kb-keyboard.html b/ui/keyboard/resources/elements/kb-keyboard.html
index 4d32229d47..b0b3ca6f15 100644
--- a/ui/keyboard/resources/elements/kb-keyboard.html
+++ b/ui/keyboard/resources/elements/kb-keyboard.html
@@ -15,8 +15,7 @@
<style>
:host {
-webkit-user-select: none;
- background-image: -webkit-linear-gradient(#282828, #000000);
- background-size: cover;
+ background-color: #eeeeee;
bottom: 0;
cursor: default;
left: 0;
diff --git a/ui/keyboard/resources/elements/kb-shift-key.html b/ui/keyboard/resources/elements/kb-shift-key.html
index 4deab642e1..1e1e734007 100644
--- a/ui/keyboard/resources/elements/kb-shift-key.html
+++ b/ui/keyboard/resources/elements/kb-shift-key.html
@@ -19,13 +19,9 @@
}
.shift-light {
- -webkit-box-shadow: inset 0 1px #101010, inset 0 -1px #444444;
- background-image: -webkit-linear-gradient(#101010, #000000);
- border: solid;
- border-bottom-color: #1d1d1d;
- border-top-color: #2d2d2d;
- border-width: 1px 0;
- height: 0.3em;
+ background-color: #ffffff;
+ border: none;
+ height: 0.2em;
margin: 0 auto;
position: relative;
width: 1.8em;
diff --git a/ui/keyboard/resources/images/back.svg b/ui/keyboard/resources/images/back.svg
index 33d519a7f5..61895dc4ae 100644
--- a/ui/keyboard/resources/images/back.svg
+++ b/ui/keyboard/resources/images/back.svg
@@ -24,4 +24,4 @@
d="m 0,0 -6.845,0 2.8,2.8 -1.132,1.132 -4.697,-4.699 4.688,-4.764 1.14,1.122 L -6.81,-1.6 0,-1.6 0,0 z"
inkscape:connector-curvature="0"
id="path14"
- style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></svg> \ No newline at end of file
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></svg>
diff --git a/ui/keyboard/resources/images/backspace.svg b/ui/keyboard/resources/images/backspace.svg
index 9e195abc92..eab8171e22 100644
--- a/ui/keyboard/resources/images/backspace.svg
+++ b/ui/keyboard/resources/images/backspace.svg
@@ -9,7 +9,7 @@
</sodipodi:namedview>
<g id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer">
<g id="g1722" transform="matrix(1.25,0,0,-1.25,31.657411,29.649286)">
- <path id="path1724" inkscape:connector-curvature="0" fill="#FFFFFF" d="M-0.626,0.41l-3.181,3.177l-3.176-3.18l-1.106,1.106
+ <path id="path1724" inkscape:connector-curvature="0" fill="#666666" d="M-0.626,0.41l-3.181,3.177l-3.176-3.18l-1.106,1.106
l3.179,3.181l-3.179,3.179l1.106,1.107l3.176-3.18l3.181,3.18l1.103-1.107L-2.7,4.692l3.177-3.18L-0.626,0.41z M-18.792,4.47
l6.248-6.231H6.54V10.8h-19.084L-18.792,4.47z"/>
</g>
diff --git a/ui/keyboard/resources/images/down.svg b/ui/keyboard/resources/images/down.svg
index 45f6466e6e..f83fdd0042 100644
--- a/ui/keyboard/resources/images/down.svg
+++ b/ui/keyboard/resources/images/down.svg
@@ -24,4 +24,4 @@
d="M 0,0 3.57,-3.57 7.199,0"
inkscape:connector-curvature="0"
id="path14"
- style="fill:none;stroke:#ffffff;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg> \ No newline at end of file
+ style="fill:none;stroke:#666666;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg>
diff --git a/ui/keyboard/resources/images/hide-keyboard.svg b/ui/keyboard/resources/images/hide-keyboard.svg
index 3c2d0f3dbf..55d59ebe74 100644
--- a/ui/keyboard/resources/images/hide-keyboard.svg
+++ b/ui/keyboard/resources/images/hide-keyboard.svg
@@ -4,11 +4,11 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
<symbol id="ic_x5F_keyboard_x0D_" viewBox="0 -24 24 24">
- <path fill="#FFFFFF" d="M21-5H3C1.896-5,1.01-5.896,1.01-7L1-18c0-1.104,0.896-2,2-2h18c1.104,0,2,0.896,2,2v11
+ <path fill="#666666" d="M21-5H3C1.896-5,1.01-5.896,1.01-7L1-18c0-1.104,0.896-2,2-2h18c1.104,0,2,0.896,2,2v11
C23-5.896,22.104-5,21-5z M11-8h2v-2h-2V-8z M11-11h2v-2h-2V-11z M8-8h2v-2H8V-8z M8-11h2v-2H8V-11z M7-13H5v2h2V-13z M7-10H5v2h2
V-10z M16-17H8v2h8V-17z M16-13h-2v2h2V-13z M16-10h-2v2h2V-10z M19-13h-2v2h2V-13z M19-10h-2v2h2V-10z"/>
<polygon fill="none" points="24,-24 0,-24 0,0 24,0 "/>
</symbol>
<use xlink:href="#ic_x5F_keyboard_x0D_" width="24" height="24" id="XMLID_144_" y="-24" transform="matrix(1 0 0 -1 12 10)" overflow="visible"/>
-<polygon fill="#FFFFFF" points="21,32 27,32 24,35 "/>
+<polygon fill="#666666" points="21,32 27,32 24,35 "/>
</svg>
diff --git a/ui/keyboard/resources/images/left.svg b/ui/keyboard/resources/images/left.svg
index 0d31feb576..8c2e7436dd 100644
--- a/ui/keyboard/resources/images/left.svg
+++ b/ui/keyboard/resources/images/left.svg
@@ -24,4 +24,4 @@
d="M 0,0 -3.57,-3.57 0,-7.199"
inkscape:connector-curvature="0"
id="path14"
- style="fill:none;stroke:#ffffff;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg> \ No newline at end of file
+ style="fill:none;stroke:#666666;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg>
diff --git a/ui/keyboard/resources/images/return.svg b/ui/keyboard/resources/images/return.svg
index 3d69631fc7..d83cc06f96 100644
--- a/ui/keyboard/resources/images/return.svg
+++ b/ui/keyboard/resources/images/return.svg
@@ -9,7 +9,7 @@
</sodipodi:namedview>
<g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
<g id="g1718" transform="matrix(1.25,0,0,-1.25,39.764197,19.091786)">
- <path id="path1720" inkscape:connector-curvature="0" fill="#FFFFFF" d="M0.457,0.572v-3.598h-18v6.295l-9.936-7.197l9.936-7.193
+ <path id="path1720" inkscape:connector-curvature="0" fill="#666666" d="M0.457,0.572v-3.598h-18v6.295l-9.936-7.197l9.936-7.193
v6.295h19.8v5.398H0.457z"/>
</g>
</g>
diff --git a/ui/keyboard/resources/images/right.svg b/ui/keyboard/resources/images/right.svg
index 09f2e28c72..94178420cd 100644
--- a/ui/keyboard/resources/images/right.svg
+++ b/ui/keyboard/resources/images/right.svg
@@ -24,4 +24,4 @@
d="M 0,0 3.57,3.57 0,7.199"
inkscape:connector-curvature="0"
id="path14"
- style="fill:none;stroke:#ffffff;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg> \ No newline at end of file
+ style="fill:none;stroke:#666666;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg>
diff --git a/ui/keyboard/resources/images/search.svg b/ui/keyboard/resources/images/search.svg
index 9628a3c2c9..5a5a783cd6 100644
--- a/ui/keyboard/resources/images/search.svg
+++ b/ui/keyboard/resources/images/search.svg
@@ -9,7 +9,7 @@
</sodipodi:namedview>
<g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
<g id="g1682" transform="matrix(1.25,0,0,-1.25,36.051257,32.440573)">
- <path id="path1684" inkscape:connector-curvature="0" fill="#FFFFFF" d="M0.114-0.8l-5.342,5.346h-1.102L-6.819,5.03
+ <path id="path1684" inkscape:connector-curvature="0" fill="#666666" d="M0.114-0.8l-5.342,5.346h-1.102L-6.819,5.03
c2.267,2.885,2.064,6.957-0.52,9.551c-2.802,2.799-7.329,2.799-10.138,0c-2.786-2.809-2.788-7.338,0-10.139
c2.598-2.58,6.629-2.792,9.557-0.513l0.486-0.485V2.342l5.338-5.347c0.324-0.32,1.108-0.198,1.756,0.447
C0.307-1.908,0.441-1.126,0.114-0.8 M-8.772,5.897L-8.772,5.897h-0.02V5.878c-2.006-1.991-5.24-1.987-7.244,0.008
diff --git a/ui/keyboard/resources/images/shift-filled.svg b/ui/keyboard/resources/images/shift-filled.svg
index 12cccf69a7..a6a87bba20 100644
--- a/ui/keyboard/resources/images/shift-filled.svg
+++ b/ui/keyboard/resources/images/shift-filled.svg
@@ -9,7 +9,7 @@
</sodipodi:namedview>
<g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
<g id="g1726" transform="matrix(1.25,0,0,-1.25,24.286964,10.049732)">
- <path id="path1728" inkscape:connector-curvature="0" fill="#FFFFFF" d="M-0.229-0.686l-7.02-7.051l-7.021-7.054h8.134v-6.845
+ <path id="path1728" inkscape:connector-curvature="0" fill="#666666" d="M-0.229-0.686l-7.02-7.051l-7.021-7.054h8.134v-6.845
H5.256v6.845h8.555L6.795-7.736L-0.229-0.686z"/>
</g>
</g>
diff --git a/ui/keyboard/resources/images/shift.svg b/ui/keyboard/resources/images/shift.svg
index 4f0f95fbb3..39f25d22ae 100644
--- a/ui/keyboard/resources/images/shift.svg
+++ b/ui/keyboard/resources/images/shift.svg
@@ -9,7 +9,7 @@
</sodipodi:namedview>
<g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
<g id="g1726" transform="matrix(1.25,0,0,-1.25,24.286964,10.049732)">
- <path id="path1728" inkscape:connector-curvature="0" fill="#FFFFFF" d="M-0.229-0.686l-7.02-7.051l-7.021-7.054h8.134v-6.845
+ <path id="path1728" inkscape:connector-curvature="0" fill="#666666" d="M-0.229-0.686l-7.02-7.051l-7.021-7.054h8.134v-6.845
H5.256v6.845h8.555L6.795-7.736L-0.229-0.686z M-0.229-3.873l5.428-5.45l3.198-3.216H5.256h-2.25v-2.25v-4.595h-6.891v4.595v2.25
h-2.25h-2.72l3.201,3.215L-0.229-3.873z"/>
</g>
diff --git a/ui/keyboard/resources/images/tab.svg b/ui/keyboard/resources/images/tab.svg
index 89c2f62178..cb64ebd8ba 100644
--- a/ui/keyboard/resources/images/tab.svg
+++ b/ui/keyboard/resources/images/tab.svg
@@ -9,11 +9,11 @@
</sodipodi:namedview>
<g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
<g id="g1736" transform="matrix(1.25,0,0,-1.25,38.01192,16.333282)">
- <path id="path1738" inkscape:connector-curvature="0" fill="#FFFFFF" d="M1.422-0.841h-15.969v-5.077l-8.011,5.802l8.011,5.805
+ <path id="path1738" inkscape:connector-curvature="0" fill="#666666" d="M1.422-0.841h-15.969v-5.077l-8.011,5.802l8.011,5.805
V0.611H1.422V-0.841z"/>
</g>
<g id="g1742" transform="matrix(1.25,0,0,-1.25,6.434791,29.565652)">
- <path id="path1744" inkscape:connector-curvature="0" fill="#FFFFFF" d="M1.421-0.841h15.97v5.076l8.011-5.801L17.391-7.37v5.076
+ <path id="path1744" inkscape:connector-curvature="0" fill="#666666" d="M1.421-0.841h15.97v5.076l8.011-5.801L17.391-7.37v5.076
H1.421V-0.841z"/>
</g>
</g>
diff --git a/ui/keyboard/resources/images/up.svg b/ui/keyboard/resources/images/up.svg
index 3b55bd7a08..696f92fea3 100644
--- a/ui/keyboard/resources/images/up.svg
+++ b/ui/keyboard/resources/images/up.svg
@@ -24,4 +24,4 @@
d="M 0,0 -3.57,3.57 -7.199,0"
inkscape:connector-curvature="0"
id="path14"
- style="fill:none;stroke:#ffffff;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg> \ No newline at end of file
+ style="fill:none;stroke:#666666;stroke-width:1.60000002;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /></g></g></svg>
diff --git a/ui/keyboard/resources/main.css b/ui/keyboard/resources/main.css
index 99c2c27080..b206ea4465 100644
--- a/ui/keyboard/resources/main.css
+++ b/ui/keyboard/resources/main.css
@@ -15,7 +15,7 @@
*/
kb-keyboard.ctrl-active kb-modifier-key[char=Ctrl],
kb-keyboard.alt-active kb-modifier-key[char=Alt] {
- color: lightblue;
+ background-color: #bbbbbb;
}
kb-keyboard[keyset="upper"] kb-shift-key.dark /deep/ .key {
@@ -31,74 +31,24 @@ kb-keyboard[keyset="lower"] kb-shift-key /deep/ .key{
*/
kb-keyboard.caps-locked kb-shift-key.dark /deep/
.shift-light {
- -webkit-box-shadow: 0 1px 1px rgba(213, 213, 213, 0.5),
- 0 -1px 1px rgba(213, 213, 213, 0.5);
- background-image: -webkit-linear-gradient(#d5d5d5, #d5d5d5);
- border: none;
- height: 0.2em;
-}
-kb-keyboard.caps-locked kb-shift-key.dark /deep/
- .shift-light-wrapper {
- bottom: 2px;
+ background-color: rgba(0, 0, 255, 0.5);
}
kb-keyboard.ctrl-active kb-modifier-key[char=Ctrl],
kb-keyboard.ctrl-active kb-modifier-key[char=Ctrl] {
- color: lightblue;
-}
-
-/** TODO(rsadam@): Move these rules to kb-row once we uprev to latest Polymer.*/
-kb-row:nth-child(2) kb-key:not(.dark):not(.active){
- -webkit-box-shadow: inset 0px 1px #666666, inset 0px -1px #4c4c4c;
- background-image: -webkit-linear-gradient(#5a5a5a, #515151);
- background-size: cover;
- border-bottom-color: #414141;
- border-top-color: #7f7f7f;
-}
-
-kb-row:nth-child(3) kb-key:not(.dark):not(.active){
- -webkit-box-shadow: inset 0px 1px #5d5d5d, inset 0px -1px #444444;
- background-image: -webkit-linear-gradient(#505050, #494949);
- background-size: cover;
- border-bottom-color: #3a3a3a;
- border-top-color: #787878;
-}
-
-kb-row:nth-child(n+3) kb-key:not(.dark):not(.active){
- -webkit-box-shadow: inset 0px 1px #565656, inset 0px -1px #434343;
- background-image: -webkit-linear-gradient(#484848, #474747);
- background-size: cover;
- border-bottom-color: #393939;
- border-top-color: #717171;
-}
-
-kb-row:nth-child(2) kb-key:not([invert]) /deep/ .hint {
- color: #2C2C2C;
-}
-
-kb-row:nth-child(3) kb-key:not([invert]) /deep/ .hint {
- color: #272727;
-}
-
-kb-row:nth-child(n+3) kb-key:not([invert]) /deep/ .hint {
- color: #232323;
+ color: blue;
}
+.space,
.dark {
font-size: 70%;
}
-.dark:not(.active) {
- -webkit-box-shadow: inset 0px 1px #313131, inset 0px -1px #202020;
- background-color: #222222;
- border-bottom-color: #1c1c1c;
- border-top-color: #4f4f4f;
+.dark:not(.active),
+:not(kb-altkey-set) > :not(.dark).active {
+ background-color: #dddddd;
}
-:not(kb-altkey-set) > .active {
- -webkit-box-shadow: inset 0px 1px #969696, inset 0px -1px #6f6f6f;
- background-image: -webkit-linear-gradient(#8b8b8b, #7d7d7d);
- background-size: cover;
- border-bottom-color: #5b5b5b;
- border-top-color: #a4a4a4;
+.space {
+ color: bbbbbb;
}
diff --git a/ui/keyboard/resources/main.js b/ui/keyboard/resources/main.js
index 8eb8d5bbb1..c837aed2ad 100644
--- a/ui/keyboard/resources/main.js
+++ b/ui/keyboard/resources/main.js
@@ -205,9 +205,14 @@
* @return {Array.<String, number>} The bounds of the keyboard container.
*/
function getKeyboardBounds_() {
+ var keyboard = $('keyboard');
+ var ratio = DEFAULT_KEYBOARD_ASPECT_RATIO;
+ if (keyboard.config && keyboard.config.a11ymode) {
+ ratio = DEFAULT_A11Y_KEYBOARD_ASPECT_RATIO;
+ }
return {
- "width": window.innerWidth,
- "height": window.innerHeight,
+ "width": screen.width,
+ "height": screen.height * ratio
};
}
@@ -566,8 +571,7 @@
*/
function resizeKeyboardContainer(opt_params) {
var params = opt_params ? opt_params : new AlignmentOptions();
- var bounds = getKeyboardBounds();
- if (Math.abs(bounds.height - params.height) > RESIZE_THRESHOLD) {
+ if (Math.abs(window.innerHeight - params.height) > RESIZE_THRESHOLD) {
// Cannot resize more than 50% of screen height due to crbug.com/338829.
window.resizeTo(params.width, params.height);
}
diff --git a/ui/message_center/cocoa/opaque_views.h b/ui/message_center/cocoa/opaque_views.h
new file mode 100644
index 0000000000..1a2f3b0235
--- /dev/null
+++ b/ui/message_center/cocoa/opaque_views.h
@@ -0,0 +1,36 @@
+// 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 UI_MESSAGE_CENTER_COCOA_OPAQUE_VIEWS_H_
+#define UI_MESSAGE_CENTER_COCOA_OPAQUE_VIEWS_H_
+
+#import <Cocoa/Cocoa.h>
+
+#include "base/mac/scoped_nsobject.h"
+
+// MCDropDown is the same as an NSPopupButton except that it fills its
+// background with a settable color.
+@interface MCDropDown : NSPopUpButton {
+ @private
+ base::scoped_nsobject<NSColor> backgroundColor_;
+}
+
+// Gets and sets the bubble's background color.
+- (NSColor*)backgroundColor;
+- (void)setBackgroundColor:(NSColor*)backgroundColor;
+@end
+
+// MCTextField fills its background with an opaque color. It also configures
+// the view to have a plan appearance, without bezel, border, editing, etc.
+@interface MCTextField : NSTextField {
+ @private
+ base::scoped_nsobject<NSColor> backgroundColor_;
+}
+
+// Use this method to create the text field. The color is required so it
+// can correctly subpixel antialias.
+- (id)initWithFrame:(NSRect)frameRect backgroundColor:(NSColor*)color;
+@end
+
+#endif // UI_MESSAGE_CENTER_COCOA_OPAQUE_VIEWS_H_
diff --git a/ui/message_center/cocoa/opaque_views.mm b/ui/message_center/cocoa/opaque_views.mm
new file mode 100644
index 0000000000..b6e054f519
--- /dev/null
+++ b/ui/message_center/cocoa/opaque_views.mm
@@ -0,0 +1,63 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ui/message_center/cocoa/opaque_views.h"
+
+@implementation MCDropDown
+// The view must be opaque to render subpixel antialiasing.
+- (BOOL)isOpaque {
+ return YES;
+}
+
+// The view must also fill its background to render subpixel antialiasing.
+- (void)drawRect:(NSRect)dirtyRect {
+ [backgroundColor_ set];
+ NSRectFill(dirtyRect);
+ [super drawRect:dirtyRect];
+}
+
+- (NSColor*)backgroundColor {
+ return backgroundColor_;
+}
+
+- (void)setBackgroundColor:(NSColor*)backgroundColor {
+ backgroundColor_.reset([backgroundColor retain]);
+}
+@end
+
+@implementation MCTextField
+- (id)initWithFrame:(NSRect)frameRect backgroundColor:(NSColor*)color {
+ self = [self initWithFrame:frameRect];
+ if (self) {
+ [self setBackgroundColor:color];
+ backgroundColor_.reset([color retain]);
+ }
+ return self;
+}
+
+- (id)initWithFrame:(NSRect)frameRect {
+ self = [super initWithFrame:frameRect];
+ if (self) {
+ [self setAutoresizingMask:NSViewMinYMargin];
+ [self setBezeled:NO];
+ [self setBordered:NO];
+ [self setEditable:NO];
+ [self setSelectable:NO];
+ [self setDrawsBackground:YES];
+ }
+ return self;
+}
+
+// The view must be opaque to render subpixel antialiasing.
+- (BOOL)isOpaque {
+ return YES;
+}
+
+// The view must also fill its background to render subpixel antialiasing.
+- (void)drawRect:(NSRect)dirtyRect {
+ [backgroundColor_ set];
+ NSRectFill(dirtyRect);
+ [super drawRect:dirtyRect];
+}
+@end
diff --git a/ui/message_center/cocoa/settings_controller.h b/ui/message_center/cocoa/settings_controller.h
index 522e7e7f60..9869206732 100644
--- a/ui/message_center/cocoa/settings_controller.h
+++ b/ui/message_center/cocoa/settings_controller.h
@@ -9,6 +9,7 @@
#import "base/mac/scoped_nsobject.h"
#include "base/memory/scoped_ptr.h"
+#import "ui/message_center/cocoa/opaque_views.h"
#import "ui/message_center/cocoa/settings_entry_view.h"
#include "ui/message_center/message_center_export.h"
#include "ui/message_center/notifier_settings.h"
@@ -53,7 +54,7 @@ MESSAGE_CENTER_EXPORT
base::scoped_nsobject<NSTextField> detailsText_;
// The profile switcher.
- base::scoped_nsobject<NSPopUpButton> groupDropDownButton_;
+ base::scoped_nsobject<MCDropDown> groupDropDownButton_;
// Container for all the checkboxes.
base::scoped_nsobject<NSScrollView> scrollView_;
diff --git a/ui/message_center/cocoa/settings_controller.mm b/ui/message_center/cocoa/settings_controller.mm
index 1f8e204517..0bf9d5af08 100644
--- a/ui/message_center/cocoa/settings_controller.mm
+++ b/ui/message_center/cocoa/settings_controller.mm
@@ -13,6 +13,7 @@
#include "grit/ui_strings.h"
#include "skia/ext/skia_utils_mac.h"
#include "ui/base/l10n/l10n_util.h"
+#import "ui/message_center/cocoa/opaque_views.h"
#import "ui/message_center/cocoa/settings_entry_view.h"
#import "ui/message_center/cocoa/tray_view_controller.h"
#include "ui/message_center/message_center_style.h"
@@ -104,12 +105,11 @@ void NotifierSettingsObserverMac::NotifierGroupChanged() {
}
- (NSTextField*)newLabelWithFrame:(NSRect)frame {
- NSTextField* label = [[NSTextField alloc] initWithFrame:frame];
- [label setDrawsBackground:NO];
- [label setBezeled:NO];
- [label setEditable:NO];
- [label setSelectable:NO];
- [label setAutoresizingMask:NSViewMinYMargin];
+ NSColor* color = gfx::SkColorToCalibratedNSColor(
+ message_center::kMessageCenterBackgroundColor);
+ MCTextField* label =
+ [[MCTextField alloc] initWithFrame:frame backgroundColor:color];
+
return label;
}
@@ -141,7 +141,6 @@ void NotifierSettingsObserverMac::NotifierGroupChanged() {
NSWidth(fullFrame),
NSHeight(fullFrame));
settingsText_.reset([self newLabelWithFrame:headerFrame]);
- [settingsText_ setAutoresizingMask:NSViewMinYMargin];
[settingsText_ setTextColor:
gfx::SkColorToCalibratedNSColor(message_center::kRegularTextColor)];
[settingsText_
@@ -161,7 +160,6 @@ void NotifierSettingsObserverMac::NotifierGroupChanged() {
NSWidth(fullFrame),
NSHeight(fullFrame));
detailsText_.reset([self newLabelWithFrame:subheaderFrame]);
- [detailsText_ setAutoresizingMask:NSViewMinYMargin];
[detailsText_ setTextColor:
gfx::SkColorToCalibratedNSColor(message_center::kDimTextColor)];
[detailsText_
@@ -186,8 +184,10 @@ void NotifierSettingsObserverMac::NotifierGroupChanged() {
NSWidth(fullFrame),
NSHeight(fullFrame));
groupDropDownButton_.reset(
- [[NSPopUpButton alloc] initWithFrame:dropDownButtonFrame
- pullsDown:YES]);
+ [[MCDropDown alloc] initWithFrame:dropDownButtonFrame pullsDown:YES]);
+ [groupDropDownButton_
+ setBackgroundColor:gfx::SkColorToCalibratedNSColor(
+ message_center::kMessageCenterBackgroundColor)];
[groupDropDownButton_ setAction:@selector(notifierGroupSelectionChanged:)];
[groupDropDownButton_ setTarget:self];
// Add a dummy item for pull-down.
diff --git a/ui/message_center/cocoa/settings_entry_view.mm b/ui/message_center/cocoa/settings_entry_view.mm
index 0607247f87..ab73d98c74 100644
--- a/ui/message_center/cocoa/settings_entry_view.mm
+++ b/ui/message_center/cocoa/settings_entry_view.mm
@@ -56,6 +56,23 @@ const int kCorrectedIconTextPadding =
const int kCorrectedEntryRightPadding =
kInternalHorizontalSpacing - kIntrinsicLearnMorePadding;
+////////////////////////////////////////////////////////////////////////////////
+
+@interface MCSettingsButton : NSButton
+@end
+
+@implementation MCSettingsButton
+// drawRect: needs to fill the button with a background, otherwise we don't get
+// subpixel antialiasing.
+- (void)drawRect:(NSRect)dirtyRect {
+ NSColor* color = gfx::SkColorToCalibratedNSColor(
+ message_center::kMessageCenterBackgroundColor);
+ [color set];
+ NSRectFill(dirtyRect);
+ [super drawRect:dirtyRect];
+}
+@end
+
@interface MCSettingsButtonCell : NSButtonCell {
// A checkbox's regular image is the checkmark image. This additional image
// is used for the favicon or app icon shown next to the checkmark.
@@ -65,6 +82,10 @@ const int kCorrectedEntryRightPadding =
@end
@implementation MCSettingsButtonCell
+- (BOOL)isOpaque {
+ return YES;
+}
+
- (void)setExtraImage:(NSImage*)extraImage {
extraImage_.reset([extraImage retain]);
}
@@ -133,7 +154,6 @@ const int kCorrectedEntryRightPadding =
@end
@implementation MCSettingsEntryView
-
- (id)initWithController:(MCSettingsController*)controller
notifier:(message_center::Notifier*)notifier
frame:(NSRect)frame
@@ -218,7 +238,7 @@ const int kCorrectedEntryRightPadding =
}
if (!checkbox_.get()) {
- checkbox_.reset([[NSButton alloc] initWithFrame:checkboxFrame]);
+ checkbox_.reset([[MCSettingsButton alloc] initWithFrame:checkboxFrame]);
[self addSubview:checkbox_];
} else {
[checkbox_ setFrame:checkboxFrame];
diff --git a/ui/message_center/cocoa/tray_view_controller.mm b/ui/message_center/cocoa/tray_view_controller.mm
index 5344268fed..2458457185 100644
--- a/ui/message_center/cocoa/tray_view_controller.mm
+++ b/ui/message_center/cocoa/tray_view_controller.mm
@@ -14,6 +14,7 @@
#import "ui/base/cocoa/hover_image_button.h"
#include "ui/base/l10n/l10n_util_mac.h"
#include "ui/base/resource/resource_bundle.h"
+#import "ui/message_center/cocoa/opaque_views.h"
#import "ui/message_center/cocoa/notification_controller.h"
#import "ui/message_center/cocoa/settings_controller.h"
#include "ui/message_center/message_center.h"
@@ -398,19 +399,12 @@ const CGFloat kTrayBottomMargin = 75;
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
NSView* view = [self view];
- auto configureLabel = ^(NSTextField* textField) {
- [textField setAutoresizingMask:NSViewMinYMargin];
- [textField setBezeled:NO];
- [textField setBordered:NO];
- [textField setDrawsBackground:NO];
- [textField setEditable:NO];
- [textField setSelectable:NO];
- };
-
// Create the "Notifications" label at the top of the tray.
NSFont* font = [NSFont labelFontOfSize:message_center::kTitleFontSize];
- title_.reset([[NSTextField alloc] initWithFrame:NSZeroRect]);
- configureLabel(title_);
+ NSColor* color = gfx::SkColorToCalibratedNSColor(
+ message_center::kMessageCenterBackgroundColor);
+ title_.reset(
+ [[MCTextField alloc] initWithFrame:NSZeroRect backgroundColor:color]);
[title_ setFont:font];
[title_ setStringValue:
@@ -541,8 +535,8 @@ const CGFloat kTrayBottomMargin = 75;
// Create the description field for the empty message center. Initially it is
// invisible.
- emptyDescription_.reset([[NSTextField alloc] initWithFrame:NSZeroRect]);
- configureLabel(emptyDescription_);
+ emptyDescription_.reset(
+ [[MCTextField alloc] initWithFrame:NSZeroRect backgroundColor:color]);
NSFont* smallFont =
[NSFont labelFontOfSize:message_center::kEmptyCenterFontSize];
diff --git a/ui/message_center/message_center.gyp b/ui/message_center/message_center.gyp
index 8fc29a6209..9db4e5a7e2 100644
--- a/ui/message_center/message_center.gyp
+++ b/ui/message_center/message_center.gyp
@@ -28,6 +28,8 @@
'sources': [
'cocoa/notification_controller.h',
'cocoa/notification_controller.mm',
+ 'cocoa/opaque_views.h',
+ 'cocoa/opaque_views.mm',
'cocoa/popup_collection.h',
'cocoa/popup_collection.mm',
'cocoa/popup_controller.h',
diff --git a/ui/message_center/message_center_impl.cc b/ui/message_center/message_center_impl.cc
index b56e76e710..14cbe7b967 100644
--- a/ui/message_center/message_center_impl.cc
+++ b/ui/message_center/message_center_impl.cc
@@ -637,15 +637,16 @@ void MessageCenterImpl::RemoveNotification(const std::string& id,
if (!HasNotification(id))
return;
- scoped_refptr<NotificationDelegate> delegate =
- notification_list_->GetNotificationDelegate(id);
- if (delegate.get())
- delegate->Close(by_user);
-
// In many cases |id| is a reference to an existing notification instance
// but the instance can be destructed in RemoveNotification(). Hence
// copies the id explicitly here.
std::string copied_id(id);
+
+ scoped_refptr<NotificationDelegate> delegate =
+ notification_list_->GetNotificationDelegate(copied_id);
+ if (delegate.get())
+ delegate->Close(by_user);
+
notification_list_->RemoveNotification(copied_id);
notification_cache_.Rebuild(
notification_list_->GetVisibleNotifications(blockers_));
diff --git a/ui/native_theme/common_theme.cc b/ui/native_theme/common_theme.cc
index 0e6b76bcc0..49d59c8e1d 100644
--- a/ui/native_theme/common_theme.cc
+++ b/ui/native_theme/common_theme.cc
@@ -32,6 +32,8 @@ const SkColor kEnabledMenuItemForegroundColor = SK_ColorBLACK;
const SkColor kDisabledMenuItemForegroundColor = SkColorSetRGB(161, 161, 146);
const SkColor kHoverMenuItemBackgroundColor =
SkColorSetARGB(204, 255, 255, 255);
+// Button:
+const SkColor kButtonHoverBackgroundColor = SkColorSetRGB(0xEA, 0xEA, 0xEA);
} // namespace
@@ -79,6 +81,10 @@ bool CommonThemeGetSystemColor(NativeTheme::ColorId color_id, SkColor* color) {
case NativeTheme::kColorId_ButtonDisabledColor:
*color = kDisabledMenuItemForegroundColor;
break;
+ // Button
+ case NativeTheme::kColorId_ButtonHoverBackgroundColor:
+ *color = kButtonHoverBackgroundColor;
+ break;
default:
return false;
}
diff --git a/ui/native_theme/fallback_theme.cc b/ui/native_theme/fallback_theme.cc
index ffb15fd662..ab6fc27aae 100644
--- a/ui/native_theme/fallback_theme.cc
+++ b/ui/native_theme/fallback_theme.cc
@@ -36,6 +36,8 @@ SkColor FallbackTheme::GetSystemColor(ColorId color_id) const {
static const SkColor kButtonDisabledColor = SkColorSetRGB(0x99, 0x99, 0x99);
static const SkColor kButtonHighlightColor = SkColorSetRGB(0, 0, 0);
static const SkColor kButtonHoverColor = kButtonEnabledColor;
+ static const SkColor kButtonHoverBackgroundColor =
+ SkColorSetRGB(0xEA, 0xEA, 0xEA);
// MenuItem:
static const SkColor kEnabledMenuItemForegroundColor = kButtonEnabledColor;
static const SkColor kDisabledMenuItemForegroundColor = kButtonDisabledColor;
@@ -135,6 +137,8 @@ SkColor FallbackTheme::GetSystemColor(ColorId color_id) const {
return kButtonHighlightColor;
case kColorId_ButtonHoverColor:
return kButtonHoverColor;
+ case kColorId_ButtonHoverBackgroundColor:
+ return kButtonHoverBackgroundColor;
// MenuItem
case kColorId_EnabledMenuItemForegroundColor:
diff --git a/ui/native_theme/native_theme.h b/ui/native_theme/native_theme.h
index 67af252d7b..aab923a933 100644
--- a/ui/native_theme/native_theme.h
+++ b/ui/native_theme/native_theme.h
@@ -240,6 +240,7 @@ class NATIVE_THEME_EXPORT NativeTheme {
kColorId_ButtonDisabledColor,
kColorId_ButtonHighlightColor,
kColorId_ButtonHoverColor,
+ kColorId_ButtonHoverBackgroundColor,
// MenuItem
kColorId_EnabledMenuItemForegroundColor,
kColorId_DisabledMenuItemForegroundColor,
diff --git a/ui/native_theme/native_theme.target.darwin-arm.mk b/ui/native_theme/native_theme.target.darwin-arm.mk
index 1882cbf93c..c15f7c8fbf 100644
--- a/ui/native_theme/native_theme.target.darwin-arm.mk
+++ b/ui/native_theme/native_theme.target.darwin-arm.mk
@@ -99,12 +99,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -221,12 +224,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -300,7 +306,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/native_theme/native_theme.target.darwin-mips.mk b/ui/native_theme/native_theme.target.darwin-mips.mk
index 377630299f..f6a88a5599 100644
--- a/ui/native_theme/native_theme.target.darwin-mips.mk
+++ b/ui/native_theme/native_theme.target.darwin-mips.mk
@@ -98,12 +98,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -219,12 +222,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/native_theme/native_theme.target.darwin-x86.mk b/ui/native_theme/native_theme.target.darwin-x86.mk
index 44e2198c2f..d255548c6b 100644
--- a/ui/native_theme/native_theme.target.darwin-x86.mk
+++ b/ui/native_theme/native_theme.target.darwin-x86.mk
@@ -100,12 +100,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -221,12 +224,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/native_theme/native_theme.target.darwin-x86_64.mk b/ui/native_theme/native_theme.target.darwin-x86_64.mk
index f11a32e407..2151037253 100644
--- a/ui/native_theme/native_theme.target.darwin-x86_64.mk
+++ b/ui/native_theme/native_theme.target.darwin-x86_64.mk
@@ -100,12 +100,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -222,12 +225,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -298,7 +304,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/native_theme/native_theme.target.linux-arm.mk b/ui/native_theme/native_theme.target.linux-arm.mk
index 1882cbf93c..c15f7c8fbf 100644
--- a/ui/native_theme/native_theme.target.linux-arm.mk
+++ b/ui/native_theme/native_theme.target.linux-arm.mk
@@ -99,12 +99,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -221,12 +224,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -300,7 +306,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/native_theme/native_theme.target.linux-mips.mk b/ui/native_theme/native_theme.target.linux-mips.mk
index 377630299f..f6a88a5599 100644
--- a/ui/native_theme/native_theme.target.linux-mips.mk
+++ b/ui/native_theme/native_theme.target.linux-mips.mk
@@ -98,12 +98,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -219,12 +222,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/native_theme/native_theme.target.linux-x86.mk b/ui/native_theme/native_theme.target.linux-x86.mk
index 44e2198c2f..d255548c6b 100644
--- a/ui/native_theme/native_theme.target.linux-x86.mk
+++ b/ui/native_theme/native_theme.target.linux-x86.mk
@@ -100,12 +100,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -221,12 +224,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -296,7 +302,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/native_theme/native_theme.target.linux-x86_64.mk b/ui/native_theme/native_theme.target.linux-x86_64.mk
index f11a32e407..2151037253 100644
--- a/ui/native_theme/native_theme.target.linux-x86_64.mk
+++ b/ui/native_theme/native_theme.target.linux-x86_64.mk
@@ -100,12 +100,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -222,12 +225,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -298,7 +304,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/native_theme/native_theme_win.cc b/ui/native_theme/native_theme_win.cc
index a09be6c30e..55c9f486a3 100644
--- a/ui/native_theme/native_theme_win.cc
+++ b/ui/native_theme/native_theme_win.cc
@@ -50,6 +50,7 @@ const SkColor kUnfocusedBorderColor = SkColorSetRGB(0xd9, 0xd9, 0xd9);
const SkColor kButtonBackgroundColor = SkColorSetRGB(0xde, 0xde, 0xde);
const SkColor kButtonHighlightColor = SkColorSetARGB(200, 255, 255, 255);
const SkColor kButtonHoverColor = SkColorSetRGB(6, 45, 117);
+const SkColor kButtonHoverBackgroundColor = SkColorSetRGB(0xEA, 0xEA, 0xEA);
// MenuItem:
const SkColor kEnabledMenuItemForegroundColor = SkColorSetRGB(6, 45, 117);
const SkColor kDisabledMenuItemForegroundColor = SkColorSetRGB(161, 161, 146);
@@ -532,6 +533,8 @@ SkColor NativeThemeWin::GetSystemColor(ColorId color_id) const {
return kButtonHighlightColor;
case kColorId_ButtonHoverColor:
return kButtonHoverColor;
+ case kColorId_ButtonHoverBackgroundColor:
+ return kButtonHoverBackgroundColor;
// MenuItem
case kColorId_EnabledMenuItemForegroundColor:
diff --git a/ui/ozone/ozone.gyp b/ui/ozone/ozone.gyp
index 0dfb9c75c2..8ccb0d7272 100644
--- a/ui/ozone/ozone.gyp
+++ b/ui/ozone/ozone.gyp
@@ -41,10 +41,30 @@
'ozone_platform.h',
'ozone_switches.cc',
'ozone_switches.h',
+ 'platform/dri/chromeos/display_mode_dri.cc',
+ 'platform/dri/chromeos/display_mode_dri.h',
+ 'platform/dri/chromeos/display_snapshot_dri.cc',
+ 'platform/dri/chromeos/display_snapshot_dri.h',
+ 'platform/dri/chromeos/native_display_delegate_dri.cc',
+ 'platform/dri/chromeos/native_display_delegate_dri.h',
'platform/dri/ozone_platform_dri.cc',
'platform/dri/ozone_platform_dri.h',
'platform/dri/cursor_factory_evdev_dri.cc',
'platform/dri/cursor_factory_evdev_dri.h',
+ 'platform/dri/dri_buffer.cc',
+ 'platform/dri/dri_buffer.h',
+ 'platform/dri/dri_surface.cc',
+ 'platform/dri/dri_surface.h',
+ 'platform/dri/dri_surface_factory.cc',
+ 'platform/dri/dri_surface_factory.h',
+ 'platform/dri/dri_util.cc',
+ 'platform/dri/dri_util.h',
+ 'platform/dri/dri_vsync_provider.cc',
+ 'platform/dri/dri_vsync_provider.h',
+ 'platform/dri/dri_wrapper.cc',
+ 'platform/dri/dri_wrapper.h',
+ 'platform/dri/hardware_display_controller.cc',
+ 'platform/dri/hardware_display_controller.h',
'platform/test/ozone_platform_test.cc',
'platform/test/ozone_platform_test.h',
'<@(external_ozone_platform_files)',
@@ -80,7 +100,11 @@
'ozone_platforms': [
'dri'
]
- }
+ },
+ 'dependencies': [
+ '../../build/linux/system.gyp:dridrm',
+ '../../ui/display/display.gyp:display_util',
+ ],
}, { # ozone_platform_dri==0
'sources/': [
['exclude', '^platform/dri/'],
diff --git a/ui/ozone/ozone_platform.cc b/ui/ozone/ozone_platform.cc
index feb36baea2..e8199b2ce9 100644
--- a/ui/ozone/ozone_platform.cc
+++ b/ui/ozone/ozone_platform.cc
@@ -6,6 +6,9 @@
#include "base/debug/trace_event.h"
#include "base/logging.h"
#include "ui/base/cursor/ozone/cursor_factory_ozone.h"
+#include "ui/events/ozone/event_factory_ozone.h"
+#include "ui/gfx/ozone/surface_factory_ozone.h"
+#include "ui/ozone/ime/input_method_context_factory_ozone.h"
#include "ui/ozone/ozone_platform.h"
#include "ui/ozone/ozone_platform_list.h"
#include "ui/ozone/ozone_switches.h"
diff --git a/ui/ozone/ozone_platform.h b/ui/ozone/ozone_platform.h
index e87f422050..536ff0ed8e 100644
--- a/ui/ozone/ozone_platform.h
+++ b/ui/ozone/ozone_platform.h
@@ -6,14 +6,17 @@
#define UI_OZONE_OZONE_PLATFORM_H_
#include "base/memory/scoped_ptr.h"
-#include "ui/events/ozone/event_factory_ozone.h"
-#include "ui/gfx/ozone/surface_factory_ozone.h"
-#include "ui/ozone/ime/input_method_context_factory_ozone.h"
#include "ui/ozone/ozone_export.h"
+namespace gfx {
+class SurfaceFactoryOzone;
+}
+
namespace ui {
class CursorFactoryOzone;
+class EventFactoryOzone;
+class InputMethodContextFactoryOzone;
class NativeDisplayDelegate;
// Base class for Ozone platform implementations.
diff --git a/ui/ozone/ozone_unittests.gypi b/ui/ozone/ozone_unittests.gypi
new file mode 100644
index 0000000000..b9d8819393
--- /dev/null
+++ b/ui/ozone/ozone_unittests.gypi
@@ -0,0 +1,23 @@
+# 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.
+
+{
+ 'sources': [
+ 'platform/dri/hardware_display_controller_unittest.cc',
+ 'platform/dri/dri_surface_factory_unittest.cc',
+ 'platform/dri/dri_surface_unittest.cc',
+ ],
+ 'conditions': [
+ ['ozone_platform_dri == 1', {
+ 'dependencies': [
+ '../build/linux/system.gyp:dridrm',
+ '../ui/ozone/ozone.gyp:ozone',
+ ],
+ }, {
+ 'sources/': [
+ ['exclude', '^platform/dri/'],
+ ],
+ }],
+ ],
+}
diff --git a/ui/ozone/platform/caca/caca_surface_factory.cc b/ui/ozone/platform/caca/caca_surface_factory.cc
index 13b8a8c01e..1786831cb9 100644
--- a/ui/ozone/platform/caca/caca_surface_factory.cc
+++ b/ui/ozone/platform/caca/caca_surface_factory.cc
@@ -23,6 +23,8 @@ class CacaSurface : public gfx::SurfaceOzoneCanvas {
CacaSurface(CacaConnection* connection);
virtual ~CacaSurface();
+ bool Initialize();
+
// gfx::SurfaceOzoneCanvas overrides:
virtual skia::RefPtr<SkCanvas> GetCanvas() OVERRIDE;
virtual bool ResizeCanvas(const gfx::Size& viewport_size) OVERRIDE;
@@ -46,7 +48,7 @@ CacaSurface::~CacaSurface() {
caca_free_dither(dither_);
}
-bool CacaSurface::InitializeCanvas() {
+bool CacaSurface::Initialize() {
SkImageInfo info = SkImageInfo::Make(connection_->bitmap_size().width(),
connection_->bitmap_size().height(),
kPMColor_SkColorType,
@@ -140,7 +142,9 @@ scoped_ptr<gfx::SurfaceOzoneCanvas> CacaSurfaceFactory::CreateCanvasForWidget(
CHECK_EQ(INITIALIZED, state_);
CHECK_EQ(kDefaultWidgetHandle, widget);
- return make_scoped_ptr<gfx::SurfaceOzoneCanvas>(new CacaSurface(connection_));
+ scoped_ptr<CacaSurface> canvas(new CacaSurface(connection_));
+ CHECK(canvas->Initialize());
+ return canvas.PassAs<gfx::SurfaceOzoneCanvas>();
}
} // namespace ui
diff --git a/ui/ozone/platform/caca/caca_surface_factory.h b/ui/ozone/platform/caca/caca_surface_factory.h
index 80fd34f7f2..c3db5fda5f 100644
--- a/ui/ozone/platform/caca/caca_surface_factory.h
+++ b/ui/ozone/platform/caca/caca_surface_factory.h
@@ -10,6 +10,10 @@
#include "base/memory/scoped_ptr.h"
#include "ui/gfx/ozone/surface_factory_ozone.h"
+namespace gfx {
+class SurfaceOzone;
+}
+
namespace ui {
class CacaConnection;
@@ -26,7 +30,7 @@ class CacaSurfaceFactory : public gfx::SurfaceFactoryOzone {
virtual bool LoadEGLGLES2Bindings(
AddGLLibraryCallback add_gl_library,
SetGLGetProcAddressProcCallback set_gl_get_proc_address) OVERRIDE;
- virtual scoped_ptr<gfx::SurfaceOzone> CreateSurfaceForWidget(
+ virtual scoped_ptr<gfx::SurfaceOzoneCanvas> CreateCanvasForWidget(
gfx::AcceleratedWidget widget) OVERRIDE;
private:
diff --git a/ui/ozone/platform/caca/ozone_platform_caca.cc b/ui/ozone/platform/caca/ozone_platform_caca.cc
index 6a35c6b75f..a5a6b02ae2 100644
--- a/ui/ozone/platform/caca/ozone_platform_caca.cc
+++ b/ui/ozone/platform/caca/ozone_platform_caca.cc
@@ -4,8 +4,12 @@
#include "ui/ozone/platform/caca/ozone_platform_caca.h"
+#include "ui/base/cursor/ozone/cursor_factory_ozone.h"
+#include "ui/ozone/ime/input_method_context_factory_ozone.h"
#include "ui/ozone/ozone_platform.h"
#include "ui/ozone/platform/caca/caca_connection.h"
+#include "ui/ozone/platform/caca/caca_event_factory.h"
+#include "ui/ozone/platform/caca/caca_surface_factory.h"
#if defined(OS_CHROMEOS)
#include "ui/ozone/common/chromeos/native_display_delegate_ozone.h"
@@ -13,37 +17,49 @@
namespace ui {
-OzonePlatformCaca::OzonePlatformCaca()
- : connection_(),
- surface_factory_ozone_(&connection_),
- event_factory_ozone_(&connection_) {}
+namespace {
-OzonePlatformCaca::~OzonePlatformCaca() {}
+class OzonePlatformCaca : public OzonePlatform {
+ public:
+ OzonePlatformCaca()
+ : surface_factory_ozone_(&connection_),
+ event_factory_ozone_(&connection_) {}
+ virtual ~OzonePlatformCaca() {}
-gfx::SurfaceFactoryOzone* OzonePlatformCaca::GetSurfaceFactoryOzone() {
- return &surface_factory_ozone_;
-}
+ // OzonePlatform:
+ virtual gfx::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE {
+ return &surface_factory_ozone_;
+ }
+ virtual EventFactoryOzone* GetEventFactoryOzone() OVERRIDE {
+ return &event_factory_ozone_;
+ }
+ virtual InputMethodContextFactoryOzone* GetInputMethodContextFactoryOzone()
+ OVERRIDE {
+ return &input_method_context_factory_ozone_;
+ }
+ virtual CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE {
+ return &cursor_factory_ozone_;
+ }
-ui::EventFactoryOzone* OzonePlatformCaca::GetEventFactoryOzone() {
- return &event_factory_ozone_;
-}
+#if defined(OS_CHROMEOS)
+ virtual scoped_ptr<NativeDisplayDelegate> CreateNativeDisplayDelegate()
+ OVERRIDE {
+ return scoped_ptr<NativeDisplayDelegate>(new NativeDisplayDelegateOzone());
+ }
+#endif
-ui::InputMethodContextFactoryOzone*
-OzonePlatformCaca::GetInputMethodContextFactoryOzone() {
- return &input_method_context_factory_ozone_;
-}
+ private:
+ CacaConnection connection_;
+ CacaSurfaceFactory surface_factory_ozone_;
+ CacaEventFactory event_factory_ozone_;
+ // This creates a minimal input context.
+ InputMethodContextFactoryOzone input_method_context_factory_ozone_;
+ CursorFactoryOzone cursor_factory_ozone_;
-ui::CursorFactoryOzone* OzonePlatformCaca::GetCursorFactoryOzone() {
- return &cursor_factory_ozone_;
-}
+ DISALLOW_COPY_AND_ASSIGN(OzonePlatformCaca);
+};
-#if defined(OS_CHROMEOS)
-scoped_ptr<ui::NativeDisplayDelegate>
-OzonePlatformCaca::CreateNativeDisplayDelegate() {
- return scoped_ptr<ui::NativeDisplayDelegate>(
- new NativeDisplayDelegateOzone());
-}
-#endif
+} // namespace
OzonePlatform* CreateOzonePlatformCaca() { return new OzonePlatformCaca; }
diff --git a/ui/ozone/platform/caca/ozone_platform_caca.h b/ui/ozone/platform/caca/ozone_platform_caca.h
index f25b947e2a..bf1f735208 100644
--- a/ui/ozone/platform/caca/ozone_platform_caca.h
+++ b/ui/ozone/platform/caca/ozone_platform_caca.h
@@ -5,45 +5,12 @@
#ifndef UI_OZONE_PLATFORM_CACA_OZONE_PLATFORM_CACA_H_
#define UI_OZONE_PLATFORM_CACA_OZONE_PLATFORM_CACA_H_
-#include "ui/base/cursor/ozone/cursor_factory_ozone.h"
-#include "ui/ozone/ozone_export.h"
-#include "ui/ozone/ozone_platform.h"
-#include "ui/ozone/platform/caca/caca_connection.h"
-#include "ui/ozone/platform/caca/caca_event_factory.h"
-#include "ui/ozone/platform/caca/caca_surface_factory.h"
-
namespace ui {
-class CacaConnection;
-
-class OzonePlatformCaca : public OzonePlatform {
- public:
- OzonePlatformCaca();
- virtual ~OzonePlatformCaca();
-
- virtual gfx::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE;
- virtual ui::EventFactoryOzone* GetEventFactoryOzone() OVERRIDE;
- virtual ui::InputMethodContextFactoryOzone*
- GetInputMethodContextFactoryOzone() OVERRIDE;
- virtual ui::CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE;
-#if defined(OS_CHROMEOS)
- virtual scoped_ptr<ui::NativeDisplayDelegate>
- CreateNativeDisplayDelegate() OVERRIDE;
-#endif
-
- private:
- ui::CacaConnection connection_;
- ui::CacaSurfaceFactory surface_factory_ozone_;
- ui::CacaEventFactory event_factory_ozone_;
- // This creates a minimal input context.
- ui::InputMethodContextFactoryOzone input_method_context_factory_ozone_;
- ui::CursorFactoryOzone cursor_factory_ozone_;
-
- DISALLOW_COPY_AND_ASSIGN(OzonePlatformCaca);
-};
+class OzonePlatform;
// Constructor hook for use in ozone_platform_list.cc
-OZONE_EXPORT OzonePlatform* CreateOzonePlatformCaca();
+OzonePlatform* CreateOzonePlatformCaca();
} // namespace ui
diff --git a/ui/ozone/platform/dri/DEPS b/ui/ozone/platform/dri/DEPS
new file mode 100644
index 0000000000..ee54c22bef
--- /dev/null
+++ b/ui/ozone/platform/dri/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+ "+skia/ext",
+ "+third_party/skia",
+]
diff --git a/ui/ozone/platform/dri/chromeos/DEPS b/ui/ozone/platform/dri/chromeos/DEPS
new file mode 100644
index 0000000000..0ab14717d9
--- /dev/null
+++ b/ui/ozone/platform/dri/chromeos/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+ "+ui/display/util",
+]
diff --git a/ui/ozone/platform/dri/chromeos/display_mode_dri.cc b/ui/ozone/platform/dri/chromeos/display_mode_dri.cc
new file mode 100644
index 0000000000..707cb91b7c
--- /dev/null
+++ b/ui/ozone/platform/dri/chromeos/display_mode_dri.cc
@@ -0,0 +1,17 @@
+// 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 "ui/ozone/platform/dri/chromeos/display_mode_dri.h"
+
+namespace ui {
+
+DisplayModeDri::DisplayModeDri(const drmModeModeInfo& mode)
+ : DisplayMode(gfx::Size(mode.hdisplay, mode.vdisplay),
+ mode.flags & DRM_MODE_FLAG_INTERLACE,
+ mode.vrefresh),
+ mode_info_(mode) {}
+
+DisplayModeDri::~DisplayModeDri() {}
+
+} // namespace ui
diff --git a/ui/ozone/platform/dri/chromeos/display_mode_dri.h b/ui/ozone/platform/dri/chromeos/display_mode_dri.h
new file mode 100644
index 0000000000..ab50df28d7
--- /dev/null
+++ b/ui/ozone/platform/dri/chromeos/display_mode_dri.h
@@ -0,0 +1,33 @@
+// 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 UI_OZONE_PLATFORM_DRI_CHROMEOS_DISPLAY_MODE_DRI_H_
+#define UI_OZONE_PLATFORM_DRI_CHROMEOS_DISPLAY_MODE_DRI_H_
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <xf86drmMode.h>
+
+#include "ui/display/types/chromeos/display_mode.h"
+
+namespace ui {
+
+class DisplayModeDri : public DisplayMode {
+ public:
+ DisplayModeDri(const drmModeModeInfo& mode);
+ virtual ~DisplayModeDri();
+
+ // Native details about this mode. Only used internally in the DRI
+ // implementation.
+ drmModeModeInfo mode_info() const { return mode_info_; }
+
+ private:
+ drmModeModeInfo mode_info_;
+
+ DISALLOW_COPY_AND_ASSIGN(DisplayModeDri);
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_DRI_CHROMEOS_DISPLAY_MODE_DRI_H_
diff --git a/ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc b/ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc
new file mode 100644
index 0000000000..df9f4c65d1
--- /dev/null
+++ b/ui/ozone/platform/dri/chromeos/display_snapshot_dri.cc
@@ -0,0 +1,142 @@
+// 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 "ui/ozone/platform/dri/chromeos/display_snapshot_dri.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <xf86drmMode.h>
+
+#include "base/format_macros.h"
+#include "base/logging.h"
+#include "base/strings/stringprintf.h"
+#include "ui/display/util/edid_parser.h"
+#include "ui/ozone/platform/dri/chromeos/display_mode_dri.h"
+#include "ui/ozone/platform/dri/dri_wrapper.h"
+
+namespace ui {
+
+namespace {
+
+DisplayConnectionType GetDisplayType(drmModeConnector* connector) {
+ switch (connector->connector_type) {
+ case DRM_MODE_CONNECTOR_VGA:
+ return DISPLAY_CONNECTION_TYPE_VGA;
+ case DRM_MODE_CONNECTOR_DVII:
+ case DRM_MODE_CONNECTOR_DVID:
+ case DRM_MODE_CONNECTOR_DVIA:
+ return DISPLAY_CONNECTION_TYPE_DVI;
+ case DRM_MODE_CONNECTOR_LVDS:
+ case DRM_MODE_CONNECTOR_eDP:
+ return DISPLAY_CONNECTION_TYPE_INTERNAL;
+ case DRM_MODE_CONNECTOR_DisplayPort:
+ return DISPLAY_CONNECTION_TYPE_DISPLAYPORT;
+ case DRM_MODE_CONNECTOR_HDMIA:
+ case DRM_MODE_CONNECTOR_HDMIB:
+ return DISPLAY_CONNECTION_TYPE_HDMI;
+ default:
+ return DISPLAY_CONNECTION_TYPE_UNKNOWN;
+ }
+}
+
+bool SameMode(const drmModeModeInfo& lhs, const drmModeModeInfo& rhs) {
+ return lhs.clock == rhs.clock &&
+ lhs.hdisplay == rhs.vdisplay &&
+ lhs.vrefresh == rhs.vrefresh &&
+ lhs.hsync_start == rhs.hsync_start &&
+ lhs.hsync_end == rhs.hsync_end &&
+ lhs.htotal == rhs.htotal &&
+ lhs.hskew == rhs.hskew &&
+ lhs.vsync_start == rhs.vsync_start &&
+ lhs.vsync_end == rhs.vsync_end &&
+ lhs.vtotal == rhs.vtotal &&
+ lhs.vscan == rhs.vscan &&
+ lhs.flags == rhs.flags &&
+ strcmp(lhs.name, rhs.name) == 0;
+}
+
+bool IsAspectPreserving(DriWrapper* drm, drmModeConnector* connector) {
+ drmModePropertyRes* property = drm->GetProperty(connector, "scaling mode");
+ if (property) {
+ for (int j = 0; j < property->count_enums; ++j) {
+ if (property->enums[j].value ==
+ connector->prop_values[property->prop_id] &&
+ strcmp(property->enums[j].name, "Full aspect") == 0) {
+ drm->FreeProperty(property);
+ return true;
+ }
+ }
+
+ drm->FreeProperty(property);
+ }
+
+ return false;
+}
+
+} // namespace
+
+DisplaySnapshotDri::DisplaySnapshotDri(
+ DriWrapper* drm,
+ drmModeConnector* connector,
+ drmModeCrtc* crtc,
+ uint32_t index)
+ : DisplaySnapshot(index,
+ false,
+ gfx::Point(crtc->x, crtc->y),
+ gfx::Size(connector->mmWidth, connector->mmHeight),
+ GetDisplayType(connector),
+ IsAspectPreserving(drm, connector),
+ false,
+ std::string(),
+ std::vector<const DisplayMode*>(),
+ NULL,
+ NULL),
+ connector_(connector->connector_id),
+ crtc_(crtc->crtc_id),
+ dpms_property_(drm->GetProperty(connector, "DPMS")) {
+ drmModePropertyBlobRes* edid_blob = drm->GetPropertyBlob(connector, "EDID");
+
+ if (edid_blob) {
+ std::vector<uint8_t> edid(
+ static_cast<uint8_t*>(edid_blob->data),
+ static_cast<uint8_t*>(edid_blob->data) + edid_blob->length);
+
+ has_proper_display_id_ = GetDisplayIdFromEDID(edid, index, &display_id_);
+ ParseOutputDeviceData(edid, NULL, &display_name_);
+ ParseOutputOverscanFlag(edid, &overscan_flag_);
+
+ drm->FreePropertyBlob(edid_blob);
+ } else {
+ VLOG(1) << "Failed to get EDID blob for connector "
+ << connector->connector_id;
+ }
+
+ for (int i = 0; i < connector->count_modes; ++i) {
+ drmModeModeInfo& mode = connector->modes[i];
+ modes_.push_back(new DisplayModeDri(mode));
+
+ if (crtc->mode_valid && SameMode(crtc->mode, mode))
+ current_mode_ = modes_.back();
+
+ if (mode.type & DRM_MODE_TYPE_PREFERRED)
+ native_mode_ = modes_.back();
+ }
+}
+
+DisplaySnapshotDri::~DisplaySnapshotDri() {
+ if (dpms_property_)
+ drmModeFreeProperty(dpms_property_);
+}
+
+std::string DisplaySnapshotDri::ToString() const {
+ return base::StringPrintf(
+ "[type=%d, connector=%" PRIu32 ", crtc=%" PRIu32 ", mode=%s, dim=%s]",
+ type_,
+ connector_,
+ crtc_,
+ current_mode_ ? current_mode_->ToString().c_str() : "NULL",
+ physical_size_.ToString().c_str());
+}
+
+} // namespace ui
diff --git a/ui/ozone/platform/dri/chromeos/display_snapshot_dri.h b/ui/ozone/platform/dri/chromeos/display_snapshot_dri.h
new file mode 100644
index 0000000000..1f69af47ed
--- /dev/null
+++ b/ui/ozone/platform/dri/chromeos/display_snapshot_dri.h
@@ -0,0 +1,47 @@
+// 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 UI_OZONE_PLATFORM_DRI_CHROMEOS_DISPLAY_SNAPSHOT_DRI_H_
+#define UI_OZONE_PLATFORM_DRI_CHROMEOS_DISPLAY_SNAPSHOT_DRI_H_
+
+#include "ui/display/types/chromeos/display_snapshot.h"
+
+typedef struct _drmModeConnector drmModeConnector;
+typedef struct _drmModeCrtc drmModeCrtc;
+typedef struct _drmModeProperty drmModePropertyRes;
+
+namespace ui {
+
+class DriWrapper;
+
+class DisplaySnapshotDri : public DisplaySnapshot {
+ public:
+ DisplaySnapshotDri(DriWrapper* drm,
+ drmModeConnector* connector,
+ drmModeCrtc* crtc,
+ uint32_t index);
+ virtual ~DisplaySnapshotDri();
+
+ // Native properties of a display used by the DRI implementation in
+ // configuring this display.
+ uint32_t connector() const { return connector_; }
+ uint32_t crtc() const { return crtc_; }
+ drmModePropertyRes* dpms_property() const { return dpms_property_; }
+
+ // DisplaySnapshot overrides:
+ virtual std::string ToString() const OVERRIDE;
+
+ private:
+ uint32_t connector_;
+ uint32_t crtc_;
+ drmModePropertyRes* dpms_property_;
+ std::string name_;
+ bool overscan_flag_;
+
+ DISALLOW_COPY_AND_ASSIGN(DisplaySnapshotDri);
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_DRI_CHROMEOS_DISPLAY_SNAPSHOT_DRI_H_
diff --git a/ui/ozone/platform/dri/chromeos/native_display_delegate_dri.cc b/ui/ozone/platform/dri/chromeos/native_display_delegate_dri.cc
new file mode 100644
index 0000000000..cb73a96444
--- /dev/null
+++ b/ui/ozone/platform/dri/chromeos/native_display_delegate_dri.cc
@@ -0,0 +1,157 @@
+// 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 "ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h"
+
+#include "ui/ozone/platform/dri/chromeos/display_mode_dri.h"
+#include "ui/ozone/platform/dri/chromeos/display_snapshot_dri.h"
+#include "ui/ozone/platform/dri/dri_surface_factory.h"
+#include "ui/ozone/platform/dri/dri_util.h"
+#include "ui/ozone/platform/dri/dri_wrapper.h"
+
+namespace ui {
+
+namespace {
+const size_t kMaxDisplayCount = 2;
+} // namespace
+
+NativeDisplayDelegateDri::NativeDisplayDelegateDri(
+ DriSurfaceFactory* surface_factory)
+ : surface_factory_(surface_factory) {}
+
+NativeDisplayDelegateDri::~NativeDisplayDelegateDri() {}
+
+void NativeDisplayDelegateDri::Initialize() {
+ gfx::SurfaceFactoryOzone::HardwareState state =
+ surface_factory_->InitializeHardware();
+
+ CHECK_EQ(gfx::SurfaceFactoryOzone::INITIALIZED, state)
+ << "Failed to initialize hardware";
+}
+
+void NativeDisplayDelegateDri::GrabServer() {}
+
+void NativeDisplayDelegateDri::UngrabServer() {}
+
+void NativeDisplayDelegateDri::SyncWithServer() {}
+
+void NativeDisplayDelegateDri::SetBackgroundColor(uint32_t color_argb) {
+ NOTIMPLEMENTED();
+}
+
+void NativeDisplayDelegateDri::ForceDPMSOn() {
+ for (size_t i = 0; i < cached_displays_.size(); ++i) {
+ DisplaySnapshotDri* dri_output = cached_displays_[i];
+ if (dri_output->dpms_property())
+ surface_factory_->drm()->SetProperty(
+ dri_output->connector(),
+ dri_output->dpms_property()->prop_id,
+ DRM_MODE_DPMS_ON);
+ }
+}
+
+std::vector<DisplaySnapshot*> NativeDisplayDelegateDri::GetDisplays() {
+ cached_displays_.clear();
+ cached_modes_.clear();
+
+ drmModeRes* resources = drmModeGetResources(
+ surface_factory_->drm()->get_fd());
+ DCHECK(resources) << "Failed to get DRM resources";
+ ScopedVector<HardwareDisplayControllerInfo> displays =
+ GetAvailableDisplayControllerInfos(
+ surface_factory_->drm()->get_fd(),
+ resources);
+ for (size_t i = 0;
+ i < displays.size() && cached_displays_.size() < kMaxDisplayCount; ++i) {
+ DisplaySnapshotDri* display = new DisplaySnapshotDri(
+ surface_factory_->drm(),
+ displays[i]->connector(),
+ displays[i]->crtc(),
+ i);
+ cached_displays_.push_back(display);
+ // Modes can be shared between different displays, so we need to keep track
+ // of them independently for cleanup.
+ cached_modes_.insert(cached_modes_.end(),
+ display->modes().begin(),
+ display->modes().end());
+ }
+
+ drmModeFreeResources(resources);
+
+ std::vector<DisplaySnapshot*> generic_displays(cached_displays_.begin(),
+ cached_displays_.end());
+ return generic_displays;
+}
+
+void NativeDisplayDelegateDri::AddMode(const DisplaySnapshot& output,
+ const DisplayMode* mode) {}
+
+bool NativeDisplayDelegateDri::Configure(const DisplaySnapshot& output,
+ const DisplayMode* mode,
+ const gfx::Point& origin) {
+ const DisplaySnapshotDri& dri_output =
+ static_cast<const DisplaySnapshotDri&>(output);
+
+ VLOG(1) << "DRM configuring: crtc=" << dri_output.crtc()
+ << " connector=" << dri_output.connector()
+ << " origin=" << origin.ToString()
+ << " size=" << mode->size().ToString();
+
+ if (mode) {
+ if (!surface_factory_->CreateHardwareDisplayController(
+ dri_output.connector(),
+ dri_output.crtc(),
+ static_cast<const DisplayModeDri*>(mode)->mode_info())) {
+ VLOG(1) << "Failed to configure: crtc=" << dri_output.crtc()
+ << " connector=" << dri_output.connector();
+ return false;
+ }
+ } else {
+ if (!surface_factory_->DisableHardwareDisplayController(
+ dri_output.crtc())) {
+ VLOG(1) << "Failed to disable crtc=" << dri_output.crtc();
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void NativeDisplayDelegateDri::CreateFrameBuffer(const gfx::Size& size) {}
+
+bool NativeDisplayDelegateDri::GetHDCPState(const DisplaySnapshot& output,
+ HDCPState* state) {
+ NOTIMPLEMENTED();
+ return false;
+}
+
+bool NativeDisplayDelegateDri::SetHDCPState(const DisplaySnapshot& output,
+ HDCPState state) {
+ NOTIMPLEMENTED();
+ return false;
+}
+
+std::vector<ui::ColorCalibrationProfile>
+NativeDisplayDelegateDri::GetAvailableColorCalibrationProfiles(
+ const ui::DisplaySnapshot& output) {
+ NOTIMPLEMENTED();
+ return std::vector<ui::ColorCalibrationProfile>();
+}
+
+bool NativeDisplayDelegateDri::SetColorCalibrationProfile(
+ const ui::DisplaySnapshot& output,
+ ui::ColorCalibrationProfile new_profile) {
+ NOTIMPLEMENTED();
+ return false;
+}
+
+void NativeDisplayDelegateDri::AddObserver(NativeDisplayObserver* observer) {
+ observers_.AddObserver(observer);
+}
+
+void NativeDisplayDelegateDri::RemoveObserver(NativeDisplayObserver* observer) {
+ observers_.RemoveObserver(observer);
+}
+
+} // namespace ui
diff --git a/ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h b/ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h
new file mode 100644
index 0000000000..db5b5eb2b7
--- /dev/null
+++ b/ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h
@@ -0,0 +1,60 @@
+// 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 UI_OZONE_PLATFORM_DRI_CHROMEOS_NATIVE_DISPLAY_DELEGATE_DRI_H_
+#define UI_OZONE_PLATFORM_DRI_CHROMEOS_NATIVE_DISPLAY_DELEGATE_DRI_H_
+
+#include "base/memory/scoped_vector.h"
+#include "base/observer_list.h"
+#include "ui/display/types/chromeos/native_display_delegate.h"
+
+namespace ui {
+
+class DisplaySnapshotDri;
+class DriSurfaceFactory;
+
+class NativeDisplayDelegateDri : public NativeDisplayDelegate {
+ public:
+ NativeDisplayDelegateDri(DriSurfaceFactory* surface_factory);
+ virtual ~NativeDisplayDelegateDri();
+
+ // NativeDisplayDelegate overrides:
+ virtual void Initialize() OVERRIDE;
+ virtual void GrabServer() OVERRIDE;
+ virtual void UngrabServer() OVERRIDE;
+ virtual void SyncWithServer() OVERRIDE;
+ virtual void SetBackgroundColor(uint32_t color_argb) OVERRIDE;
+ virtual void ForceDPMSOn() OVERRIDE;
+ virtual std::vector<DisplaySnapshot*> GetDisplays() OVERRIDE;
+ virtual void AddMode(const DisplaySnapshot& output,
+ const DisplayMode* mode) OVERRIDE;
+ virtual bool Configure(const DisplaySnapshot& output,
+ const DisplayMode* mode,
+ const gfx::Point& origin) OVERRIDE;
+ virtual void CreateFrameBuffer(const gfx::Size& size) OVERRIDE;
+ virtual bool GetHDCPState(const DisplaySnapshot& output,
+ HDCPState* state) OVERRIDE;
+ virtual bool SetHDCPState(const DisplaySnapshot& output,
+ HDCPState state) OVERRIDE;
+ virtual std::vector<ui::ColorCalibrationProfile>
+ GetAvailableColorCalibrationProfiles(
+ const ui::DisplaySnapshot& output) OVERRIDE;
+ virtual bool SetColorCalibrationProfile(
+ const ui::DisplaySnapshot& output,
+ ui::ColorCalibrationProfile new_profile) OVERRIDE;
+ virtual void AddObserver(NativeDisplayObserver* observer) OVERRIDE;
+ virtual void RemoveObserver(NativeDisplayObserver* observer) OVERRIDE;
+
+ private:
+ DriSurfaceFactory* surface_factory_; // Not owned.
+ ScopedVector<const DisplayMode> cached_modes_;
+ ScopedVector<DisplaySnapshotDri> cached_displays_;
+ ObserverList<NativeDisplayObserver> observers_;
+
+ DISALLOW_COPY_AND_ASSIGN(NativeDisplayDelegateDri);
+};
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_DRI_CHROMEOS_NATIVE_DISPLAY_DELEGATE_DRI_H_
diff --git a/ui/ozone/platform/dri/cursor_factory_evdev_dri.cc b/ui/ozone/platform/dri/cursor_factory_evdev_dri.cc
index fd073caf03..46b26db8aa 100644
--- a/ui/ozone/platform/dri/cursor_factory_evdev_dri.cc
+++ b/ui/ozone/platform/dri/cursor_factory_evdev_dri.cc
@@ -5,13 +5,15 @@
#include "ui/ozone/platform/dri/cursor_factory_evdev_dri.h"
#include "ui/gfx/geometry/point_conversions.h"
-#include "ui/gfx/ozone/dri/dri_surface_factory.h"
+#include "ui/ozone/platform/dri/dri_surface_factory.h"
namespace ui {
-CursorFactoryEvdevDri::CursorFactoryEvdevDri(gfx::DriSurfaceFactory* dri)
+CursorFactoryEvdevDri::CursorFactoryEvdevDri(DriSurfaceFactory* dri)
: dri_(dri) {
- cursor_window_ = dri_->GetAcceleratedWidget();
+ // TODO(dnicoara) Assume the first widget since at this point there are no
+ // widgets initialized.
+ cursor_window_ = DriSurfaceFactory::kDefaultWidgetHandle;
cursor_bounds_ = gfx::RectF(0, 0, 2560, 1700); // TODO(spang): Argh!
cursor_location_ =
gfx::PointF(cursor_bounds_.width() / 2, cursor_bounds_.height() / 2);
@@ -19,7 +21,7 @@ CursorFactoryEvdevDri::CursorFactoryEvdevDri(gfx::DriSurfaceFactory* dri)
// The DRI cursor is invisible unless explicitly set. Therefore, set the
// pointer cursor on initialization.
// TODO(spang): Move this to DRI window initialization.
- SetCursor(dri->GetAcceleratedWidget(), GetDefaultCursor(kCursorPointer));
+ SetCursor(cursor_window_, GetDefaultCursor(kCursorPointer));
}
CursorFactoryEvdevDri::~CursorFactoryEvdevDri() {}
diff --git a/ui/ozone/platform/dri/cursor_factory_evdev_dri.h b/ui/ozone/platform/dri/cursor_factory_evdev_dri.h
index b7a50dbbad..b1a1a7d12c 100644
--- a/ui/ozone/platform/dri/cursor_factory_evdev_dri.h
+++ b/ui/ozone/platform/dri/cursor_factory_evdev_dri.h
@@ -12,7 +12,7 @@
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/native_widget_types.h"
-namespace gfx {
+namespace ui {
class DriSurfaceFactory;
}
@@ -21,7 +21,7 @@ namespace ui {
class CursorFactoryEvdevDri : public BitmapCursorFactoryOzone,
public CursorDelegateEvdev {
public:
- CursorFactoryEvdevDri(gfx::DriSurfaceFactory* dri);
+ CursorFactoryEvdevDri(DriSurfaceFactory* dri);
virtual ~CursorFactoryEvdevDri();
// BitmapCursorFactoryOzone:
@@ -41,7 +41,7 @@ class CursorFactoryEvdevDri : public BitmapCursorFactoryOzone,
gfx::Point bitmap_location();
// The DRI implementation for setting the hardware cursor.
- gfx::DriSurfaceFactory* dri_;
+ DriSurfaceFactory* dri_;
// The current cursor bitmap.
scoped_refptr<BitmapCursorOzone> cursor_;
diff --git a/ui/gfx/ozone/dri/dri_buffer.cc b/ui/ozone/platform/dri/dri_buffer.cc
index ce487a4c7c..11b40038ef 100644
--- a/ui/gfx/ozone/dri/dri_buffer.cc
+++ b/ui/ozone/platform/dri/dri_buffer.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ui/gfx/ozone/dri/dri_buffer.h"
+#include "ui/ozone/platform/dri/dri_buffer.h"
#include <errno.h>
#include <sys/mman.h>
@@ -11,9 +11,9 @@
#include "base/logging.h"
#include "third_party/skia/include/core/SkCanvas.h"
-#include "ui/gfx/ozone/dri/dri_wrapper.h"
+#include "ui/ozone/platform/dri/dri_wrapper.h"
-namespace gfx {
+namespace ui {
namespace {
@@ -121,4 +121,4 @@ uint8_t DriBuffer::GetColorDepth() const {
}
}
-} // namespace gfx
+} // namespace ui
diff --git a/ui/gfx/ozone/dri/dri_buffer.h b/ui/ozone/platform/dri/dri_buffer.h
index ccf6b8874e..4624cadde5 100644
--- a/ui/gfx/ozone/dri/dri_buffer.h
+++ b/ui/ozone/platform/dri/dri_buffer.h
@@ -2,24 +2,24 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef UI_GFX_OZONE_DRI_DRI_BUFFER_H_
-#define UI_GFX_OZONE_DRI_DRI_BUFFER_H_
+#ifndef UI_OZONE_PLATFORM_DRI_DRI_BUFFER_H_
+#define UI_OZONE_PLATFORM_DRI_DRI_BUFFER_H_
#include "base/macros.h"
#include "skia/ext/refptr.h"
#include "third_party/skia/include/core/SkSurface.h"
-#include "ui/gfx/gfx_export.h"
+#include "ui/ozone/ozone_export.h"
class SkCanvas;
-namespace gfx {
+namespace ui {
class DriWrapper;
// Wrapper for a DRM allocated buffer. Keeps track of the native properties of
// the buffer and wraps the pixel memory into a SkSurface which can be used to
// draw into using Skia.
-class GFX_EXPORT DriBuffer {
+class OZONE_EXPORT DriBuffer {
public:
DriBuffer(DriWrapper* dri);
virtual ~DriBuffer();
@@ -59,6 +59,6 @@ class GFX_EXPORT DriBuffer {
DISALLOW_COPY_AND_ASSIGN(DriBuffer);
};
-} // namespace gfx
+} // namespace ui
-#endif // UI_GFX_OZONE_DRI_DRI_BUFFER_H_
+#endif // UI_OZONE_PLATFORM_DRI_DRI_BUFFER_H_
diff --git a/ui/gfx/ozone/dri/dri_surface.cc b/ui/ozone/platform/dri/dri_surface.cc
index d6568f5c47..77852b2655 100644
--- a/ui/gfx/ozone/dri/dri_surface.cc
+++ b/ui/ozone/platform/dri/dri_surface.cc
@@ -1,8 +1,8 @@
-// Copyright 2013 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.
-#include "ui/gfx/ozone/dri/dri_surface.h"
+#include "ui/ozone/platform/dri/dri_surface.h"
#include <errno.h>
#include <sys/mman.h>
@@ -12,11 +12,11 @@
#include "base/logging.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/ozone/dri/dri_buffer.h"
-#include "ui/gfx/ozone/dri/dri_wrapper.h"
#include "ui/gfx/skia_util.h"
+#include "ui/ozone/platform/dri/dri_buffer.h"
+#include "ui/ozone/platform/dri/dri_wrapper.h"
-namespace gfx {
+namespace ui {
namespace {
@@ -91,7 +91,7 @@ void DriSurface::SwapBuffers() {
SkIRect device_damage;
frontbuffer()->canvas()->getClipDeviceBounds(&device_damage);
- CopyRect(backbuffer(), frontbuffer(), SkIRectToRect(device_damage));
+ CopyRect(backbuffer(), frontbuffer(), gfx::SkIRectToRect(device_damage));
}
SkCanvas* DriSurface::GetDrawableForWidget() {
@@ -101,4 +101,4 @@ SkCanvas* DriSurface::GetDrawableForWidget() {
DriBuffer* DriSurface::CreateBuffer() { return new DriBuffer(dri_); }
-} // namespace gfx
+} // namespace ui
diff --git a/ui/gfx/ozone/dri/dri_surface.h b/ui/ozone/platform/dri/dri_surface.h
index 62d4832ab2..a85c858b00 100644
--- a/ui/gfx/ozone/dri/dri_surface.h
+++ b/ui/ozone/platform/dri/dri_surface.h
@@ -1,19 +1,19 @@
-// Copyright 2013 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.
-#ifndef UI_GFX_OZONE_DRI_DRI_SURFACE_H_
-#define UI_GFX_OZONE_DRI_DRI_SURFACE_H_
+#ifndef UI_OZONE_PLATFORM_DRI_DRI_SURFACE_H_
+#define UI_OZONE_PLATFORM_DRI_DRI_SURFACE_H_
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/gfx_export.h"
#include "ui/gfx/skia_util.h"
+#include "ui/ozone/ozone_export.h"
class SkCanvas;
-namespace gfx {
+namespace ui {
class DriBuffer;
class DriWrapper;
@@ -117,7 +117,7 @@ class DriWrapper;
// to the backbuffer.
//
// At this point we're back to step 1 and can start a new draw iteration.
-class GFX_EXPORT DriSurface {
+class OZONE_EXPORT DriSurface {
public:
DriSurface(DriWrapper* dri, const gfx::Size& size);
@@ -168,6 +168,6 @@ class GFX_EXPORT DriSurface {
DISALLOW_COPY_AND_ASSIGN(DriSurface);
};
-} // namespace gfx
+} // namespace ui
-#endif // UI_GFX_OZONE_DRI_DRI_SURFACE_H_
+#endif // UI_OZONE_PLATFORM_DRI_DRI_SURFACE_H_
diff --git a/ui/gfx/ozone/dri/dri_surface_factory.cc b/ui/ozone/platform/dri/dri_surface_factory.cc
index 51725c3cc6..1a14d41f77 100644
--- a/ui/gfx/ozone/dri/dri_surface_factory.cc
+++ b/ui/ozone/platform/dri/dri_surface_factory.cc
@@ -1,31 +1,30 @@
-// Copyright 2013 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.
-#include "ui/gfx/ozone/dri/dri_surface_factory.h"
+#include "ui/ozone/platform/dri/dri_surface_factory.h"
#include <drm.h>
#include <errno.h>
#include <xf86drm.h>
+#include "base/debug/trace_event.h"
#include "base/message_loop/message_loop.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkDevice.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/ozone/dri/dri_surface.h"
-#include "ui/gfx/ozone/dri/dri_vsync_provider.h"
-#include "ui/gfx/ozone/dri/dri_wrapper.h"
-#include "ui/gfx/ozone/dri/hardware_display_controller.h"
#include "ui/gfx/ozone/surface_ozone_canvas.h"
+#include "ui/ozone/platform/dri/dri_surface.h"
+#include "ui/ozone/platform/dri/dri_util.h"
+#include "ui/ozone/platform/dri/dri_vsync_provider.h"
+#include "ui/ozone/platform/dri/dri_wrapper.h"
+#include "ui/ozone/platform/dri/hardware_display_controller.h"
-namespace gfx {
+namespace ui {
namespace {
const char kDefaultGraphicsCardPath[] = "/dev/dri/card0";
-const char kDPMSProperty[] = "DPMS";
-
-const gfx::AcceleratedWidget kDefaultWidgetHandle = 1;
// TODO(dnicoara) Read the cursor plane size from the hardware.
const gfx::Size kCursorSize(64, 64);
@@ -45,60 +44,11 @@ void HandlePageFlipEvent(int fd,
unsigned int seconds,
unsigned int useconds,
void* controller) {
+ TRACE_EVENT0("dri", "HandlePageFlipEvent");
static_cast<HardwareDisplayController*>(controller)
->OnPageFlipEvent(frame, seconds, useconds);
}
-uint32_t GetDriProperty(int fd, drmModeConnector* connector, const char* name) {
- for (int i = 0; i < connector->count_props; ++i) {
- drmModePropertyPtr property = drmModeGetProperty(fd, connector->props[i]);
- if (!property)
- continue;
-
- if (strcmp(property->name, name) == 0) {
- uint32_t id = property->prop_id;
- drmModeFreeProperty(property);
- return id;
- }
-
- drmModeFreeProperty(property);
- }
- return 0;
-}
-
-uint32_t GetCrtc(int fd, drmModeRes* resources, drmModeConnector* connector) {
- // If the connector already has an encoder try to re-use.
- if (connector->encoder_id) {
- drmModeEncoder* encoder = drmModeGetEncoder(fd, connector->encoder_id);
- if (encoder) {
- if (encoder->crtc_id) {
- uint32_t crtc = encoder->crtc_id;
- drmModeFreeEncoder(encoder);
- return crtc;
- }
- drmModeFreeEncoder(encoder);
- }
- }
-
- // Try to find an encoder for the connector.
- for (int i = 0; i < connector->count_encoders; ++i) {
- drmModeEncoder* encoder = drmModeGetEncoder(fd, connector->encoders[i]);
- if (!encoder)
- continue;
-
- for (int j = 0; j < resources->count_crtcs; ++j) {
- // Check if the encoder is compatible with this CRTC
- if (!(encoder->possible_crtcs & (1 << j)))
- continue;
-
- drmModeFreeEncoder(encoder);
- return resources->crtcs[j];
- }
- }
-
- return 0;
-}
-
void UpdateCursorImage(DriSurface* cursor, const SkBitmap& image) {
SkRect damage;
image.getBounds(&damage);
@@ -122,13 +72,13 @@ void UpdateCursorImage(DriSurface* cursor, const SkBitmap& image) {
// the compositor merely owns this proxy object.
//
// TODO(spang): Should the compositor own any bits of the DriSurface?
-class DriSurfaceAdapter : public SurfaceOzoneCanvas {
+class DriSurfaceAdapter : public gfx::SurfaceOzoneCanvas {
public:
DriSurfaceAdapter(gfx::AcceleratedWidget w, DriSurfaceFactory* dri)
: widget_(w), dri_(dri) {}
virtual ~DriSurfaceAdapter() {}
- // SurfaceOzoneCanvas overrides:
+ // gfx::SurfaceOzoneCanvas overrides:
virtual skia::RefPtr<SkCanvas> GetCanvas() OVERRIDE {
return skia::SharePtr(dri_->GetCanvasForWidget(widget_));
}
@@ -150,10 +100,14 @@ class DriSurfaceAdapter : public SurfaceOzoneCanvas {
} // namespace
+// static
+const gfx::AcceleratedWidget DriSurfaceFactory::kDefaultWidgetHandle = 1;
+
DriSurfaceFactory::DriSurfaceFactory()
: drm_(),
state_(UNINITIALIZED),
- controller_() {
+ controllers_(),
+ allocated_widgets_(0) {
}
DriSurfaceFactory::~DriSurfaceFactory() {
@@ -161,9 +115,10 @@ DriSurfaceFactory::~DriSurfaceFactory() {
ShutdownHardware();
}
-SurfaceFactoryOzone::HardwareState
+gfx::SurfaceFactoryOzone::HardwareState
DriSurfaceFactory::InitializeHardware() {
- CHECK(state_ == UNINITIALIZED);
+ if (state_ != UNINITIALIZED)
+ return state_;
// TODO(dnicoara): Short-cut right now. What we want is to look at all the
// graphics devices available and select the primary one.
@@ -189,7 +144,7 @@ DriSurfaceFactory::InitializeHardware() {
void DriSurfaceFactory::ShutdownHardware() {
CHECK(state_ == INITIALIZED);
- controller_.reset();
+ controllers_.clear();
drm_.reset();
state_ = UNINITIALIZED;
@@ -198,57 +153,26 @@ void DriSurfaceFactory::ShutdownHardware() {
gfx::AcceleratedWidget DriSurfaceFactory::GetAcceleratedWidget() {
CHECK(state_ != FAILED);
- // TODO(dnicoara) When there's more information on which display we want,
- // then we can return the widget associated with the display.
- // For now just assume we have 1 display device and return it.
- if (!controller_.get())
- controller_.reset(new HardwareDisplayController());
-
- // TODO(dnicoara) We only have 1 display for now, so only 1 AcceleratedWidget.
- // When we'll support multiple displays this needs to be changed to return a
- // different handle for every display.
- return kDefaultWidgetHandle;
+ // We're not using 0 since other code assumes that a 0 AcceleratedWidget is an
+ // invalid widget.
+ return ++allocated_widgets_;
}
-scoped_ptr<SurfaceOzoneCanvas> DriSurfaceFactory::CreateCanvasForWidget(
+scoped_ptr<gfx::SurfaceOzoneCanvas> DriSurfaceFactory::CreateCanvasForWidget(
gfx::AcceleratedWidget w) {
CHECK(state_ == INITIALIZED);
- // TODO(dnicoara) Once we can handle multiple displays this needs to be
- // changed.
- CHECK(w == kDefaultWidgetHandle);
-
- CHECK(controller_->get_state() ==
- HardwareDisplayController::UNASSOCIATED);
-
- // Until now the controller is just a stub. Initializing it will link it to a
- // hardware display.
- if (!InitializeControllerForPrimaryDisplay(drm_.get(), controller_.get())) {
- LOG(ERROR) << "Failed to initialize controller";
- return scoped_ptr<SurfaceOzoneCanvas>();
- }
-
- // Create a surface suitable for the current controller.
- scoped_ptr<DriSurface> surface(CreateSurface(
- Size(controller_->get_mode().hdisplay,
- controller_->get_mode().vdisplay)));
-
- if (!surface->Initialize()) {
- LOG(ERROR) << "Failed to initialize surface";
- return scoped_ptr<SurfaceOzoneCanvas>();
- }
-
- // Bind the surface to the controller. This will register the backing buffers
- // with the hardware CRTC such that we can show the buffers. The controller
- // takes ownership of the surface.
- if (!controller_->BindSurfaceToController(surface.Pass())) {
- LOG(ERROR) << "Failed to bind surface to controller";
- return scoped_ptr<SurfaceOzoneCanvas>();
+ // When running with content_shell, a default Display gets created. But we
+ // can't just create a surface without a backing native display. This forces
+ // initialization of a display.
+ if (controllers_.size() == 0 && !InitializePrimaryDisplay()) {
+ LOG(ERROR) << "Failed forced initialization of primary display";
+ return scoped_ptr<gfx::SurfaceOzoneCanvas>();
}
// Initial cursor set.
- ResetCursor();
+ ResetCursor(w);
- return make_scoped_ptr<SurfaceOzoneCanvas>(new DriSurfaceAdapter(w, this));
+ return scoped_ptr<gfx::SurfaceOzoneCanvas>(new DriSurfaceAdapter(w, this));
}
bool DriSurfaceFactory::LoadEGLGLES2Bindings(
@@ -258,16 +182,14 @@ bool DriSurfaceFactory::LoadEGLGLES2Bindings(
}
bool DriSurfaceFactory::SchedulePageFlip(gfx::AcceleratedWidget w) {
+ TRACE_EVENT0("dri", "DriSurfaceFactory::SchedulePageFlip");
+
CHECK(state_ == INITIALIZED);
// TODO(dnicoara) Change this CHECK once we're running with the threaded
// compositor.
CHECK(base::MessageLoopForUI::IsCurrent());
- // TODO(dnicoara) Once we can handle multiple displays this needs to be
- // changed.
- CHECK(w == kDefaultWidgetHandle);
-
- if (!controller_->SchedulePageFlip())
+ if (!GetControllerForWidget(w)->SchedulePageFlip())
return false;
// Only wait for the page flip event to finish if it was properly scheduled.
@@ -292,14 +214,44 @@ bool DriSurfaceFactory::SchedulePageFlip(gfx::AcceleratedWidget w) {
SkCanvas* DriSurfaceFactory::GetCanvasForWidget(
gfx::AcceleratedWidget w) {
CHECK(state_ == INITIALIZED);
- CHECK_EQ(kDefaultWidgetHandle, w);
- return controller_->get_surface()->GetDrawableForWidget();
+ return GetControllerForWidget(w)->get_surface()->GetDrawableForWidget();
}
scoped_ptr<gfx::VSyncProvider> DriSurfaceFactory::CreateVSyncProvider(
gfx::AcceleratedWidget w) {
CHECK(state_ == INITIALIZED);
- return scoped_ptr<VSyncProvider>(new DriVSyncProvider(controller_.get()));
+ return scoped_ptr<gfx::VSyncProvider>(new DriVSyncProvider(
+ GetControllerForWidget(w)));
+}
+
+bool DriSurfaceFactory::CreateHardwareDisplayController(
+ uint32_t connector, uint32_t crtc, const drmModeModeInfo& mode) {
+ scoped_ptr<HardwareDisplayController> controller(
+ new HardwareDisplayController(drm_.get(), connector, crtc, mode));
+
+ // Create a surface suitable for the current controller.
+ scoped_ptr<DriSurface> surface(CreateSurface(
+ gfx::Size(mode.hdisplay, mode.vdisplay)));
+
+ if (!surface->Initialize()) {
+ LOG(ERROR) << "Failed to initialize surface";
+ return false;
+ }
+
+ // Bind the surface to the controller. This will register the backing buffers
+ // with the hardware CRTC such that we can show the buffers and performs the
+ // initial modeset. The controller takes ownership of the surface.
+ if (!controller->BindSurfaceToController(surface.Pass())) {
+ LOG(ERROR) << "Failed to bind surface to controller";
+ return false;
+ }
+
+ controllers_.push_back(controller.release());
+ return true;
+}
+
+bool DriSurfaceFactory::DisableHardwareDisplayController(uint32_t crtc) {
+ return drm_->DisableCrtc(crtc);
}
void DriSurfaceFactory::SetHardwareCursor(gfx::AcceleratedWidget window,
@@ -311,7 +263,7 @@ void DriSurfaceFactory::SetHardwareCursor(gfx::AcceleratedWidget window,
if (state_ != INITIALIZED)
return;
- ResetCursor();
+ ResetCursor(window);
}
void DriSurfaceFactory::MoveHardwareCursor(gfx::AcceleratedWidget window,
@@ -321,7 +273,7 @@ void DriSurfaceFactory::MoveHardwareCursor(gfx::AcceleratedWidget window,
if (state_ != INITIALIZED)
return;
- controller_->MoveCursor(location);
+ GetControllerForWidget(window)->MoveCursor(location);
}
void DriSurfaceFactory::UnsetHardwareCursor(gfx::AcceleratedWidget window) {
@@ -330,7 +282,7 @@ void DriSurfaceFactory::UnsetHardwareCursor(gfx::AcceleratedWidget window) {
if (state_ != INITIALIZED)
return;
- ResetCursor();
+ ResetCursor(window);
}
////////////////////////////////////////////////////////////////////////////////
@@ -344,56 +296,33 @@ DriWrapper* DriSurfaceFactory::CreateWrapper() {
return new DriWrapper(kDefaultGraphicsCardPath);
}
-bool DriSurfaceFactory::InitializeControllerForPrimaryDisplay(
- DriWrapper* drm,
- HardwareDisplayController* controller) {
- CHECK(state_ == SurfaceFactoryOzone::INITIALIZED);
-
- drmModeRes* resources = drmModeGetResources(drm->get_fd());
+bool DriSurfaceFactory::InitializePrimaryDisplay() {
+ drmModeRes* resources = drmModeGetResources(drm_->get_fd());
+ DCHECK(resources) << "Failed to get DRM resources";
+ ScopedVector<HardwareDisplayControllerInfo> displays =
+ GetAvailableDisplayControllerInfos(drm_->get_fd(), resources);
+ drmModeFreeResources(resources);
- // Search for an active connector.
- for (int i = 0; i < resources->count_connectors; ++i) {
- drmModeConnector* connector = drmModeGetConnector(
- drm->get_fd(),
- resources->connectors[i]);
-
- if (!connector)
- continue;
-
- if (connector->connection != DRM_MODE_CONNECTED ||
- connector->count_modes == 0) {
- drmModeFreeConnector(connector);
- continue;
- }
-
- uint32_t crtc = GetCrtc(drm->get_fd(), resources, connector);
-
- if (!crtc)
- continue;
-
- uint32_t dpms_property_id = GetDriProperty(drm->get_fd(),
- connector,
- kDPMSProperty);
-
- // TODO(dnicoara) Select one mode for now. In the future we may need to
- // save all the modes and allow the user to choose a specific mode. Or
- // even some fullscreen applications may need to change the mode.
- controller->SetControllerInfo(
- drm,
- connector->connector_id,
- crtc,
- dpms_property_id,
- connector->modes[0]);
-
- drmModeFreeConnector(connector);
-
- return true;
- }
+ if (displays.size() == 0)
+ return false;
- return false;
+ drmModePropertyRes* dpms = drm_->GetProperty(displays[0]->connector(),
+ "DPMS");
+ if (dpms)
+ drm_->SetProperty(displays[0]->connector()->connector_id,
+ dpms->prop_id,
+ DRM_MODE_DPMS_ON);
+
+ CreateHardwareDisplayController(
+ displays[0]->connector()->connector_id,
+ displays[0]->crtc()->crtc_id,
+ displays[0]->connector()->modes[0]);
+ return true;
}
void DriSurfaceFactory::WaitForPageFlipEvent(int fd) {
+ TRACE_EVENT0("dri", "WaitForPageFlipEvent");
+
drmEventContext drm_event;
drm_event.version = DRM_EVENT_CONTEXT_VERSION;
drm_event.page_flip_handler = HandlePageFlipEvent;
@@ -403,19 +332,26 @@ void DriSurfaceFactory::WaitForPageFlipEvent(int fd) {
drmHandleEvent(fd, &drm_event);
}
-void DriSurfaceFactory::ResetCursor() {
+void DriSurfaceFactory::ResetCursor(gfx::AcceleratedWidget w) {
if (!cursor_bitmap_.empty()) {
// Draw new cursor into backbuffer.
UpdateCursorImage(cursor_surface_.get(), cursor_bitmap_);
// Reset location & buffer.
- controller_->MoveCursor(cursor_location_);
- controller_->SetCursor(cursor_surface_.get());
+ GetControllerForWidget(w)->MoveCursor(cursor_location_);
+ GetControllerForWidget(w)->SetCursor(cursor_surface_.get());
} else {
// No cursor set.
- controller_->UnsetCursor();
+ GetControllerForWidget(w)->UnsetCursor();
}
}
+HardwareDisplayController* DriSurfaceFactory::GetControllerForWidget(
+ gfx::AcceleratedWidget w) {
+ CHECK_GE(w, 1);
+ CHECK_LE(static_cast<size_t>(w), controllers_.size());
+
+ return controllers_[w - 1];
+}
-} // namespace gfx
+} // namespace ui
diff --git a/ui/gfx/ozone/dri/dri_surface_factory.h b/ui/ozone/platform/dri/dri_surface_factory.h
index 993dc0744e..2a358711d8 100644
--- a/ui/gfx/ozone/dri/dri_surface_factory.h
+++ b/ui/ozone/platform/dri/dri_surface_factory.h
@@ -1,35 +1,45 @@
-// Copyright 2013 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.
-#ifndef UI_GFX_OZONE_DRI_DRI_SURFACE_FACTORY_H_
-#define UI_GFX_OZONE_DRI_DRI_SURFACE_FACTORY_H_
+#ifndef UI_OZONE_PLATFORM_DRI_DRI_SURFACE_FACTORY_H_
+#define UI_OZONE_PLATFORM_DRI_DRI_SURFACE_FACTORY_H_
#include "base/memory/scoped_ptr.h"
+#include "base/memory/scoped_vector.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/ozone/surface_factory_ozone.h"
+#include "ui/ozone/ozone_export.h"
+
+typedef struct _drmModeModeInfo drmModeModeInfo;
namespace gfx {
+class SurfaceOzoneCanvas;
+}
+
+namespace ui {
class DriSurface;
class DriWrapper;
class HardwareDisplayController;
-class SurfaceOzoneCanvas;
// SurfaceFactoryOzone implementation on top of DRM/KMS using dumb buffers.
// This implementation is used in conjunction with the software rendering
// path.
-class GFX_EXPORT DriSurfaceFactory : public SurfaceFactoryOzone {
+class OZONE_EXPORT DriSurfaceFactory : public gfx::SurfaceFactoryOzone {
public:
+ static const gfx::AcceleratedWidget kDefaultWidgetHandle;
+
DriSurfaceFactory();
virtual ~DriSurfaceFactory();
+ // SurfaceFactoryOzone overrides:
virtual HardwareState InitializeHardware() OVERRIDE;
virtual void ShutdownHardware() OVERRIDE;
virtual gfx::AcceleratedWidget GetAcceleratedWidget() OVERRIDE;
- virtual scoped_ptr<SurfaceOzoneCanvas> CreateCanvasForWidget(
+ virtual scoped_ptr<gfx::SurfaceOzoneCanvas> CreateCanvasForWidget(
gfx::AcceleratedWidget w) OVERRIDE;
virtual bool LoadEGLGLES2Bindings(
@@ -43,22 +53,35 @@ class GFX_EXPORT DriSurfaceFactory : public SurfaceFactoryOzone {
virtual scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider(
gfx::AcceleratedWidget w);
- void SetHardwareCursor(AcceleratedWidget window,
+ void SetHardwareCursor(gfx::AcceleratedWidget window,
const SkBitmap& image,
const gfx::Point& location);
- void MoveHardwareCursor(AcceleratedWidget window, const gfx::Point& location);
+ void MoveHardwareCursor(gfx::AcceleratedWidget window,
+ const gfx::Point& location);
- void UnsetHardwareCursor(AcceleratedWidget window);
+ void UnsetHardwareCursor(gfx::AcceleratedWidget window);
+
+ // Called to initialize a new display. The display is then added to
+ // |controllers_|. When GetAcceleratedWidget() is called it will get the next
+ // available display from |controllers_|.
+ bool CreateHardwareDisplayController(uint32_t connector,
+ uint32_t crtc,
+ const drmModeModeInfo& mode);
+
+ bool DisableHardwareDisplayController(uint32_t crtc);
+
+ DriWrapper* drm() const { return drm_.get(); }
private:
virtual DriSurface* CreateSurface(const gfx::Size& size);
virtual DriWrapper* CreateWrapper();
- virtual bool InitializeControllerForPrimaryDisplay(
- DriWrapper* drm,
- HardwareDisplayController* controller);
+ // On non CrOS builds there is no display configurator to look-up available
+ // displays and initialize the HDCs. In such cases this is called internally
+ // to initialize a display.
+ virtual bool InitializePrimaryDisplay();
// Blocks until a DRM event is read.
// TODO(dnicoara) Remove once we can safely move DRM event processing in the
@@ -67,14 +90,19 @@ class GFX_EXPORT DriSurfaceFactory : public SurfaceFactoryOzone {
virtual void WaitForPageFlipEvent(int fd);
// Draw the last set cursor & update the cursor plane.
- void ResetCursor();
+ void ResetCursor(gfx::AcceleratedWidget w);
+
+ // Returns the controller in |controllers_| associated with |w|.
+ HardwareDisplayController* GetControllerForWidget(
+ gfx::AcceleratedWidget w);
scoped_ptr<DriWrapper> drm_;
HardwareState state_;
- // Active output.
- scoped_ptr<HardwareDisplayController> controller_;
+ // Active outputs.
+ ScopedVector<HardwareDisplayController> controllers_;
+ int allocated_widgets_;
scoped_ptr<DriSurface> cursor_surface_;
@@ -84,6 +112,6 @@ class GFX_EXPORT DriSurfaceFactory : public SurfaceFactoryOzone {
DISALLOW_COPY_AND_ASSIGN(DriSurfaceFactory);
};
-} // namespace gfx
+} // namespace ui
-#endif // UI_GFX_OZONE_DRI_DRI_SURFACE_FACTORY_H_
+#endif // UI_OZONE_PLATFORM_DRI_DRI_SURFACE_FACTORY_H_
diff --git a/ui/gfx/ozone/dri/dri_surface_factory_unittest.cc b/ui/ozone/platform/dri/dri_surface_factory_unittest.cc
index 446fdb970b..ff1c088076 100644
--- a/ui/gfx/ozone/dri/dri_surface_factory_unittest.cc
+++ b/ui/ozone/platform/dri/dri_surface_factory_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2013 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.
@@ -9,13 +9,13 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
-#include "ui/gfx/ozone/dri/dri_buffer.h"
-#include "ui/gfx/ozone/dri/dri_surface.h"
-#include "ui/gfx/ozone/dri/dri_surface_factory.h"
-#include "ui/gfx/ozone/dri/dri_wrapper.h"
-#include "ui/gfx/ozone/dri/hardware_display_controller.h"
#include "ui/gfx/ozone/surface_factory_ozone.h"
#include "ui/gfx/ozone/surface_ozone_canvas.h"
+#include "ui/ozone/platform/dri/dri_buffer.h"
+#include "ui/ozone/platform/dri/dri_surface.h"
+#include "ui/ozone/platform/dri/dri_surface_factory.h"
+#include "ui/ozone/platform/dri/dri_wrapper.h"
+#include "ui/ozone/platform/dri/hardware_display_controller.h"
namespace {
@@ -31,16 +31,14 @@ const uint32_t kConnectorId = 1;
// Mock CRTC ID.
const uint32_t kCrtcId = 1;
-const uint32_t kDPMSPropertyId = 1;
-
const gfx::AcceleratedWidget kDefaultWidgetHandle = 1;
// The real DriWrapper makes actual DRM calls which we can't use in unit tests.
-class MockDriWrapper : public gfx::DriWrapper {
+class MockDriWrapper : public ui::DriWrapper {
public:
MockDriWrapper(int fd) : DriWrapper(""),
- add_framebuffer_expectation_(true),
- page_flip_expectation_(true) {
+ add_framebuffer_expectation_(true),
+ page_flip_expectation_(true) {
fd_ = fd;
}
@@ -79,14 +77,25 @@ class MockDriWrapper : public gfx::DriWrapper {
virtual bool PageFlip(uint32_t crtc_id,
uint32_t framebuffer,
void* data) OVERRIDE {
- static_cast<gfx::HardwareDisplayController*>(data)->get_surface()
+ static_cast<ui::HardwareDisplayController*>(data)->get_surface()
->SwapBuffers();
return page_flip_expectation_;
}
- virtual bool ConnectorSetProperty(uint32_t connector_id,
- uint32_t property_id,
- uint64_t value) OVERRIDE { return true; }
+ virtual bool SetProperty(uint32_t connector_id,
+ uint32_t property_id,
+ uint64_t value) OVERRIDE { return true; }
+
+ virtual void FreeProperty(drmModePropertyRes* prop) OVERRIDE { delete prop; }
+
+ virtual drmModePropertyBlobRes* GetPropertyBlob(drmModeConnector* connector,
+ const char* name) OVERRIDE {
+ return new drmModePropertyBlobRes;
+ }
+
+ virtual void FreePropertyBlob(drmModePropertyBlobRes* blob) OVERRIDE {
+ delete blob;
+ }
virtual bool SetCursor(uint32_t crtc_id,
uint32_t handle,
@@ -112,9 +121,9 @@ class MockDriWrapper : public gfx::DriWrapper {
DISALLOW_COPY_AND_ASSIGN(MockDriWrapper);
};
-class MockDriBuffer : public gfx::DriBuffer {
+class MockDriBuffer : public ui::DriBuffer {
public:
- MockDriBuffer(gfx::DriWrapper* dri) : DriBuffer(dri) {}
+ MockDriBuffer(ui::DriWrapper* dri) : DriBuffer(dri) {}
virtual ~MockDriBuffer() {
surface_.clear();
}
@@ -130,23 +139,23 @@ class MockDriBuffer : public gfx::DriBuffer {
DISALLOW_COPY_AND_ASSIGN(MockDriBuffer);
};
-class MockDriSurface : public gfx::DriSurface {
+class MockDriSurface : public ui::DriSurface {
public:
- MockDriSurface(gfx::DriWrapper* dri, const gfx::Size& size)
+ MockDriSurface(ui::DriWrapper* dri, const gfx::Size& size)
: DriSurface(dri, size), dri_(dri) {}
virtual ~MockDriSurface() {}
const std::vector<MockDriBuffer*>& bitmaps() const { return bitmaps_; }
private:
- virtual gfx::DriBuffer* CreateBuffer() OVERRIDE {
+ virtual ui::DriBuffer* CreateBuffer() OVERRIDE {
MockDriBuffer* bitmap = new MockDriBuffer(dri_);
bitmaps_.push_back(bitmap);
return bitmap;
}
- gfx::DriWrapper* dri_; // Not owned.
+ ui::DriWrapper* dri_; // Not owned.
std::vector<MockDriBuffer*> bitmaps_; // Not owned.
DISALLOW_COPY_AND_ASSIGN(MockDriSurface);
@@ -156,8 +165,7 @@ class MockDriSurface : public gfx::DriSurface {
// backend to allocate and display our buffers. Thus, we replace these
// resources with stubs. For DRM calls, we simply use stubs that do nothing and
// for buffers we use the default SkBitmap allocator.
-class MockDriSurfaceFactory
- : public gfx::DriSurfaceFactory {
+class MockDriSurfaceFactory : public ui::DriSurfaceFactory {
public:
MockDriSurfaceFactory()
: DriSurfaceFactory(),
@@ -181,13 +189,13 @@ class MockDriSurfaceFactory
const std::vector<MockDriSurface*>& get_surfaces() const { return surfaces_; }
private:
- virtual gfx::DriSurface* CreateSurface(const gfx::Size& size) OVERRIDE {
+ virtual ui::DriSurface* CreateSurface(const gfx::Size& size) OVERRIDE {
MockDriSurface* surface = new MockDriSurface(mock_drm_, size);
surfaces_.push_back(surface);
return surface;
}
- virtual gfx::DriWrapper* CreateWrapper() OVERRIDE {
+ virtual ui::DriWrapper* CreateWrapper() OVERRIDE {
if (drm_wrapper_expectation_)
mock_drm_ = new MockDriWrapper(kFd);
else
@@ -198,16 +206,10 @@ class MockDriSurfaceFactory
// Normally we'd use DRM to figure out the controller configuration. But we
// can't use DRM in unit tests, so we just create a fake configuration.
- virtual bool InitializeControllerForPrimaryDisplay(
- gfx::DriWrapper* drm,
- gfx::HardwareDisplayController* controller) OVERRIDE {
+ virtual bool InitializePrimaryDisplay() OVERRIDE {
if (initialize_controller_expectation_) {
- controller->SetControllerInfo(drm,
- kConnectorId,
- kCrtcId,
- kDPMSPropertyId,
- kDefaultMode);
- return true;
+ return CreateHardwareDisplayController(
+ kConnectorId, kCrtcId, kDefaultMode);
} else {
return false;
}
diff --git a/ui/gfx/ozone/dri/dri_surface_unittest.cc b/ui/ozone/platform/dri/dri_surface_unittest.cc
index 4ddadb5c4b..ed7393a81a 100644
--- a/ui/gfx/ozone/dri/dri_surface_unittest.cc
+++ b/ui/ozone/platform/dri/dri_surface_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2013 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.
@@ -6,9 +6,9 @@
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkDevice.h"
-#include "ui/gfx/ozone/dri/dri_buffer.h"
-#include "ui/gfx/ozone/dri/dri_surface.h"
-#include "ui/gfx/ozone/dri/hardware_display_controller.h"
+#include "ui/ozone/platform/dri/dri_buffer.h"
+#include "ui/ozone/platform/dri/dri_surface.h"
+#include "ui/ozone/platform/dri/hardware_display_controller.h"
namespace {
@@ -25,10 +25,7 @@ const uint32_t kConnectorId = 1;
// Mock CRTC ID.
const uint32_t kCrtcId = 1;
-// Mock DPMS property ID.
-const uint32_t kDPMSPropertyId = 1;
-
-class MockDriWrapper : public gfx::DriWrapper {
+class MockDriWrapper : public ui::DriWrapper {
public:
MockDriWrapper() : DriWrapper(""), id_(1) { fd_ = kFd; }
virtual ~MockDriWrapper() { fd_ = -1; }
@@ -57,18 +54,26 @@ class MockDriWrapper : public gfx::DriWrapper {
void* data) OVERRIDE {
return true;
}
- virtual bool ConnectorSetProperty(uint32_t connector_id,
- uint32_t property_id,
- uint64_t value) OVERRIDE { return true; }
+ virtual bool SetProperty(uint32_t connector_id,
+ uint32_t property_id,
+ uint64_t value) OVERRIDE { return true; }
+ virtual void FreeProperty(drmModePropertyRes* prop) OVERRIDE { delete prop; }
+ virtual drmModePropertyBlobRes* GetPropertyBlob(drmModeConnector* connector,
+ const char* name) OVERRIDE {
+ return new drmModePropertyBlobRes;
+ }
+ virtual void FreePropertyBlob(drmModePropertyBlobRes* blob) OVERRIDE {
+ delete blob;
+ }
private:
int id_;
DISALLOW_COPY_AND_ASSIGN(MockDriWrapper);
};
-class MockDriBuffer : public gfx::DriBuffer {
+class MockDriBuffer : public ui::DriBuffer {
public:
- MockDriBuffer(gfx::DriWrapper* dri, bool initialize_expectation)
+ MockDriBuffer(ui::DriWrapper* dri, bool initialize_expectation)
: DriBuffer(dri), initialize_expectation_(initialize_expectation) {}
virtual ~MockDriBuffer() {
surface_.clear();
@@ -90,9 +95,9 @@ class MockDriBuffer : public gfx::DriBuffer {
DISALLOW_COPY_AND_ASSIGN(MockDriBuffer);
};
-class MockDriSurface : public gfx::DriSurface {
+class MockDriSurface : public ui::DriSurface {
public:
- MockDriSurface(gfx::DriWrapper* dri, const gfx::Size& size)
+ MockDriSurface(ui::DriWrapper* dri, const gfx::Size& size)
: DriSurface(dri, size), dri_(dri), initialize_expectation_(true) {}
virtual ~MockDriSurface() {}
@@ -101,11 +106,11 @@ class MockDriSurface : public gfx::DriSurface {
}
private:
- virtual gfx::DriBuffer* CreateBuffer() OVERRIDE {
+ virtual ui::DriBuffer* CreateBuffer() OVERRIDE {
return new MockDriBuffer(dri_, initialize_expectation_);
}
- gfx::DriWrapper* dri_;
+ ui::DriWrapper* dri_;
bool initialize_expectation_;
DISALLOW_COPY_AND_ASSIGN(MockDriSurface);
@@ -122,7 +127,7 @@ class DriSurfaceTest : public testing::Test {
protected:
scoped_ptr<MockDriWrapper> drm_;
- scoped_ptr<gfx::HardwareDisplayController> controller_;
+ scoped_ptr<ui::HardwareDisplayController> controller_;
scoped_ptr<MockDriSurface> surface_;
private:
@@ -131,9 +136,8 @@ class DriSurfaceTest : public testing::Test {
void DriSurfaceTest::SetUp() {
drm_.reset(new MockDriWrapper());
- controller_.reset(new gfx::HardwareDisplayController());
- controller_->SetControllerInfo(
- drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
+ controller_.reset(new ui::HardwareDisplayController(
+ drm_.get(), kConnectorId, kCrtcId, kDefaultMode));
surface_.reset(new MockDriSurface(drm_.get(),
gfx::Size(kDefaultMode.hdisplay,
@@ -157,8 +161,7 @@ TEST_F(DriSurfaceTest, SuccessfulInitialization) {
TEST_F(DriSurfaceTest, CheckFBIDOnSwap) {
EXPECT_TRUE(surface_->Initialize());
- controller_->BindSurfaceToController(
- surface_.PassAs<gfx::DriSurface>());
+ controller_->BindSurfaceToController(surface_.PassAs<ui::DriSurface>());
// Check that the framebuffer ID is correct.
EXPECT_EQ(2u, controller_->get_surface()->GetFramebufferId());
diff --git a/ui/ozone/platform/dri/dri_util.cc b/ui/ozone/platform/dri/dri_util.cc
new file mode 100644
index 0000000000..cb7cdf7f15
--- /dev/null
+++ b/ui/ozone/platform/dri/dri_util.cc
@@ -0,0 +1,108 @@
+// 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 "ui/ozone/platform/dri/dri_util.h"
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <xf86drmMode.h>
+
+namespace ui {
+
+namespace {
+
+bool IsCrtcInUse(uint32_t crtc,
+ const ScopedVector<HardwareDisplayControllerInfo>& displays) {
+ for (size_t i = 0; i < displays.size(); ++i) {
+ if (crtc == displays[i]->crtc()->crtc_id)
+ return true;
+ }
+
+ return false;
+}
+
+uint32_t GetCrtc(int fd,
+ drmModeConnector* connector,
+ drmModeRes* resources,
+ const ScopedVector<HardwareDisplayControllerInfo>& displays) {
+ // If the connector already has an encoder try to re-use.
+ if (connector->encoder_id) {
+ drmModeEncoder* encoder = drmModeGetEncoder(fd, connector->encoder_id);
+ if (encoder) {
+ if (encoder->crtc_id && !IsCrtcInUse(encoder->crtc_id, displays)) {
+ uint32_t crtc = encoder->crtc_id;
+ drmModeFreeEncoder(encoder);
+ return crtc;
+ }
+ drmModeFreeEncoder(encoder);
+ }
+ }
+
+ // Try to find an encoder for the connector.
+ for (int i = 0; i < connector->count_encoders; ++i) {
+ drmModeEncoder* encoder = drmModeGetEncoder(fd, connector->encoders[i]);
+ if (!encoder)
+ continue;
+
+ for (int j = 0; j < resources->count_crtcs; ++j) {
+ // Check if the encoder is compatible with this CRTC
+ if (!(encoder->possible_crtcs & (1 << j)) ||
+ IsCrtcInUse(resources->crtcs[j], displays)) {
+ continue;
+ }
+
+ drmModeFreeEncoder(encoder);
+ return resources->crtcs[j];
+ }
+
+ drmModeFreeEncoder(encoder);
+ }
+
+ return 0;
+}
+
+} // namespace
+
+HardwareDisplayControllerInfo::HardwareDisplayControllerInfo(
+ drmModeConnector* connector,
+ drmModeCrtc* crtc)
+ : connector_(connector),
+ crtc_(crtc) {}
+
+HardwareDisplayControllerInfo::~HardwareDisplayControllerInfo() {
+ drmModeFreeConnector(connector_);
+ drmModeFreeCrtc(crtc_);
+}
+
+ScopedVector<HardwareDisplayControllerInfo>
+GetAvailableDisplayControllerInfos(int fd, drmModeRes* resources) {
+ ScopedVector<HardwareDisplayControllerInfo> displays;
+
+ for (int i = 0; i < resources->count_connectors; ++i) {
+ drmModeConnector* connector = drmModeGetConnector(
+ fd, resources->connectors[i]);
+
+ if (!connector)
+ continue;
+
+ if (connector->connection != DRM_MODE_CONNECTED ||
+ connector->count_modes == 0) {
+ drmModeFreeConnector(connector);
+ continue;
+ }
+
+ uint32_t crtc_id = GetCrtc(fd, connector, resources, displays);
+ if (!crtc_id) {
+ drmModeFreeConnector(connector);
+ continue;
+ }
+
+ drmModeCrtc* crtc = drmModeGetCrtc(fd, crtc_id);
+ displays.push_back(new HardwareDisplayControllerInfo(connector, crtc));
+ }
+
+ return displays.Pass();
+}
+
+} // namespace ui
diff --git a/ui/ozone/platform/dri/dri_util.h b/ui/ozone/platform/dri/dri_util.h
new file mode 100644
index 0000000000..f2d72b4aeb
--- /dev/null
+++ b/ui/ozone/platform/dri/dri_util.h
@@ -0,0 +1,41 @@
+// 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 UI_OZONE_PLATFORM_DRI_DRI_UTIL_H_
+#define UI_OZONE_PLATFORM_DRI_DRI_UTIL_H_
+
+#include "base/macros.h"
+#include "base/memory/scoped_vector.h"
+
+typedef struct _drmModeConnector drmModeConnector;
+typedef struct _drmModeCrtc drmModeCrtc;
+typedef struct _drmModeRes drmModeRes;
+
+namespace ui {
+
+// Representation of the information required to initialize and configure a
+// native display.
+class HardwareDisplayControllerInfo {
+ public:
+ HardwareDisplayControllerInfo(drmModeConnector* connector, drmModeCrtc* crtc);
+ ~HardwareDisplayControllerInfo();
+
+ drmModeConnector* connector() const { return connector_; }
+ drmModeCrtc* crtc() const { return crtc_; }
+
+ private:
+ drmModeConnector* connector_;
+ drmModeCrtc* crtc_;
+
+ DISALLOW_COPY_AND_ASSIGN(HardwareDisplayControllerInfo);
+};
+
+// Looks-up and parses the native display configurations returning all available
+// displays.
+ScopedVector<HardwareDisplayControllerInfo>
+GetAvailableDisplayControllerInfos(int fd, drmModeRes* resources);
+
+} // namespace ui
+
+#endif // UI_OZONE_PLATFORM_DRI_DRI_UTIL_H_
diff --git a/ui/gfx/ozone/dri/dri_vsync_provider.cc b/ui/ozone/platform/dri/dri_vsync_provider.cc
index b5717e686f..9c617629c6 100644
--- a/ui/gfx/ozone/dri/dri_vsync_provider.cc
+++ b/ui/ozone/platform/dri/dri_vsync_provider.cc
@@ -1,13 +1,13 @@
-// Copyright 2013 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.
-#include "ui/gfx/ozone/dri/dri_vsync_provider.h"
+#include "ui/ozone/platform/dri/dri_vsync_provider.h"
#include "base/time/time.h"
-#include "ui/gfx/ozone/dri/hardware_display_controller.h"
+#include "ui/ozone/platform/dri/hardware_display_controller.h"
-namespace gfx {
+namespace ui {
DriVSyncProvider::DriVSyncProvider(HardwareDisplayController* controller)
: controller_(controller) {}
@@ -29,4 +29,4 @@ void DriVSyncProvider::GetVSyncParameters(const UpdateVSyncCallback& callback) {
callback.Run(timebase, interval);
}
-} // namespace gfx
+} // namespace ui
diff --git a/ui/gfx/ozone/dri/dri_vsync_provider.h b/ui/ozone/platform/dri/dri_vsync_provider.h
index b6cb6047eb..f031a8edce 100644
--- a/ui/gfx/ozone/dri/dri_vsync_provider.h
+++ b/ui/ozone/platform/dri/dri_vsync_provider.h
@@ -1,17 +1,17 @@
-// Copyright 2013 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.
-#ifndef UI_GFX_OZONE_IMPL_DRI_VSYNC_PROVIDER_H_
-#define UI_GFX_OZONE_IMPL_DRI_VSYNC_PROVIDER_H_
+#ifndef UI_OZONE_PLATFORM_IMPL_DRI_VSYNC_PROVIDER_H_
+#define UI_OZONE_PLATFORM_IMPL_DRI_VSYNC_PROVIDER_H_
#include "ui/gfx/vsync_provider.h"
-namespace gfx {
+namespace ui {
class HardwareDisplayController;
-class DriVSyncProvider : public VSyncProvider {
+class DriVSyncProvider : public gfx::VSyncProvider {
public:
DriVSyncProvider(HardwareDisplayController* controller);
virtual ~DriVSyncProvider();
@@ -24,6 +24,6 @@ class DriVSyncProvider : public VSyncProvider {
DISALLOW_COPY_AND_ASSIGN(DriVSyncProvider);
};
-} // namespace gfx
+} // namespace ui
-#endif // UI_GFX_OZONE_IMPL_DRI_VSYNC_PROVIDER_H_
+#endif // UI_OZONE_PLATFORM_IMPL_DRI_VSYNC_PROVIDER_H_
diff --git a/ui/gfx/ozone/dri/dri_wrapper.cc b/ui/ozone/platform/dri/dri_wrapper.cc
index 7eec1a7222..38524de426 100644
--- a/ui/gfx/ozone/dri/dri_wrapper.cc
+++ b/ui/ozone/platform/dri/dri_wrapper.cc
@@ -1,8 +1,8 @@
-// Copyright 2013 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.
-#include "ui/gfx/ozone/dri/dri_wrapper.h"
+#include "ui/ozone/platform/dri/dri_wrapper.h"
#include <fcntl.h>
#include <unistd.h>
@@ -10,7 +10,7 @@
#include "base/logging.h"
-namespace gfx {
+namespace ui {
DriWrapper::DriWrapper(const char* device_path) {
fd_ = open(device_path, O_RDWR | O_CLOEXEC);
@@ -31,9 +31,9 @@ void DriWrapper::FreeCrtc(drmModeCrtc* crtc) {
}
bool DriWrapper::SetCrtc(uint32_t crtc_id,
- uint32_t framebuffer,
- uint32_t* connectors,
- drmModeModeInfo* mode) {
+ uint32_t framebuffer,
+ uint32_t* connectors,
+ drmModeModeInfo* mode) {
CHECK(fd_ >= 0);
return !drmModeSetCrtc(fd_, crtc_id, framebuffer, 0, 0, connectors, 1, mode);
}
@@ -50,6 +50,11 @@ bool DriWrapper::SetCrtc(drmModeCrtc* crtc, uint32_t* connectors) {
&crtc->mode);
}
+bool DriWrapper::DisableCrtc(uint32_t crtc_id) {
+ CHECK(fd_ >= 0);
+ return !drmModeSetCrtc(fd_, crtc_id, 0, 0, 0, NULL, 0, NULL);
+}
+
bool DriWrapper::AddFramebuffer(const drmModeModeInfo& mode,
uint8_t depth,
uint8_t bpp,
@@ -83,13 +88,59 @@ bool DriWrapper::PageFlip(uint32_t crtc_id,
data);
}
-bool DriWrapper::ConnectorSetProperty(uint32_t connector_id,
- uint32_t property_id,
- uint64_t value) {
+drmModePropertyRes* DriWrapper::GetProperty(drmModeConnector* connector,
+ const char* name) {
+ for (int i = 0; i < connector->count_props; ++i) {
+ drmModePropertyRes* property = drmModeGetProperty(fd_, connector->props[i]);
+ if (!property)
+ continue;
+
+ if (strcmp(property->name, name) == 0)
+ return property;
+
+ drmModeFreeProperty(property);
+ }
+
+ return NULL;
+}
+
+bool DriWrapper::SetProperty(uint32_t connector_id,
+ uint32_t property_id,
+ uint64_t value) {
CHECK(fd_ >= 0);
return !drmModeConnectorSetProperty(fd_, connector_id, property_id, value);
}
+void DriWrapper::FreeProperty(drmModePropertyRes* prop) {
+ drmModeFreeProperty(prop);
+}
+
+drmModePropertyBlobRes* DriWrapper::GetPropertyBlob(drmModeConnector* connector,
+ const char* name) {
+ CHECK(fd_ >= 0);
+ for (int i = 0; i < connector->count_props; ++i) {
+ drmModePropertyRes* property = drmModeGetProperty(fd_, connector->props[i]);
+ if (!property)
+ continue;
+
+ if (strcmp(property->name, name) == 0 &&
+ property->flags & DRM_MODE_PROP_BLOB) {
+ drmModePropertyBlobRes* blob =
+ drmModeGetPropertyBlob(fd_, connector->prop_values[i]);
+ drmModeFreeProperty(property);
+ return blob;
+ }
+
+ drmModeFreeProperty(property);
+ }
+
+ return NULL;
+}
+
+void DriWrapper::FreePropertyBlob(drmModePropertyBlobRes* blob) {
+ drmModeFreePropertyBlob(blob);
+}
+
bool DriWrapper::SetCursor(uint32_t crtc_id,
uint32_t handle,
uint32_t width,
@@ -103,4 +154,4 @@ bool DriWrapper::MoveCursor(uint32_t crtc_id, int x, int y) {
return !drmModeMoveCursor(fd_, crtc_id, x, y);
}
-} // namespace gfx
+} // namespace ui
diff --git a/ui/gfx/ozone/dri/dri_wrapper.h b/ui/ozone/platform/dri/dri_wrapper.h
index f81eb214b7..a14489d324 100644
--- a/ui/gfx/ozone/dri/dri_wrapper.h
+++ b/ui/ozone/platform/dri/dri_wrapper.h
@@ -1,24 +1,27 @@
-// Copyright 2013 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.
-#ifndef UI_GFX_OZONE_DRI_DRI_WRAPPER_H_
-#define UI_GFX_OZONE_DRI_DRI_WRAPPER_H_
+#ifndef UI_OZONE_PLATFORM_DRI_DRI_WRAPPER_H_
+#define UI_OZONE_PLATFORM_DRI_DRI_WRAPPER_H_
#include <stdint.h>
#include "base/basictypes.h"
-#include "ui/gfx/gfx_export.h"
+#include "ui/ozone/ozone_export.h"
+typedef struct _drmModeConnector drmModeConnector;
typedef struct _drmModeCrtc drmModeCrtc;
typedef struct _drmModeModeInfo drmModeModeInfo;
+typedef struct _drmModeProperty drmModePropertyRes;
+typedef struct _drmModePropertyBlob drmModePropertyBlobRes;
-namespace gfx {
+namespace ui {
// Wraps DRM calls into a nice interface. Used to provide different
// implementations of the DRM calls. For the actual implementation the DRM API
// would be called. In unit tests this interface would be stubbed.
-class GFX_EXPORT DriWrapper {
+class OZONE_EXPORT DriWrapper {
public:
DriWrapper(const char* device_path);
virtual ~DriWrapper();
@@ -45,6 +48,8 @@ class GFX_EXPORT DriWrapper {
// its original configuration.
virtual bool SetCrtc(drmModeCrtc* crtc, uint32_t* connectors);
+ virtual bool DisableCrtc(uint32_t crtc_id);
+
// Register a buffer with the CRTC. On successful registration, the CRTC will
// assign a framebuffer ID to |framebuffer|.
virtual bool AddFramebuffer(const drmModeModeInfo& mode,
@@ -64,11 +69,32 @@ class GFX_EXPORT DriWrapper {
// will receive when processing the pageflip event.
virtual bool PageFlip(uint32_t crtc_id, uint32_t framebuffer, void* data);
+ // Returns the property with name |name| associated with |connector|. Returns
+ // NULL if property not found. If the returned value is valid, it must be
+ // released using FreeProperty().
+ virtual drmModePropertyRes* GetProperty(drmModeConnector* connector,
+ const char* name);
+
// Sets the value of property with ID |property_id| to |value|. The property
// is applied to the connector with ID |connector_id|.
- virtual bool ConnectorSetProperty(uint32_t connector_id,
- uint32_t property_id,
- uint64_t value);
+ virtual bool SetProperty(uint32_t connector_id,
+ uint32_t property_id,
+ uint64_t value);
+
+ // Frees |prop| and any resources it allocated when it was created. |prop|
+ // must be a valid object.
+ virtual void FreeProperty(drmModePropertyRes* prop);
+
+ // Return a binary blob associated with |connector|. The binary blob is
+ // associated with the property with name |name|. Return NULL if the property
+ // could not be found or if the property does not have a binary blob. If valid
+ // the returned object must be freed using FreePropertyBlob().
+ virtual drmModePropertyBlobRes* GetPropertyBlob(drmModeConnector* connector,
+ const char* name);
+
+ // Frees |blob| and any resources allocated when it was created. |blob| must
+ // be a valid object.
+ virtual void FreePropertyBlob(drmModePropertyBlobRes* blob);
// Set the cursor to be displayed in CRTC |crtc_id|. (width, height) is the
// cursor size pointed by |handle|.
@@ -92,6 +118,6 @@ class GFX_EXPORT DriWrapper {
DISALLOW_COPY_AND_ASSIGN(DriWrapper);
};
-} // namespace gfx
+} // namespace ui
-#endif // UI_GFX_OZONE_DRI_DRI_WRAPPER_H_
+#endif // UI_OZONE_PLATFORM_DRI_DRI_WRAPPER_H_
diff --git a/ui/gfx/ozone/dri/hardware_display_controller.cc b/ui/ozone/platform/dri/hardware_display_controller.cc
index e676bef50e..ae9c41065e 100644
--- a/ui/gfx/ozone/dri/hardware_display_controller.cc
+++ b/ui/ozone/platform/dri/hardware_display_controller.cc
@@ -1,61 +1,40 @@
-// Copyright 2013 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.
-#include "ui/gfx/ozone/dri/hardware_display_controller.h"
+#include "ui/ozone/platform/dri/hardware_display_controller.h"
#include <errno.h>
#include <string.h>
#include "base/basictypes.h"
+#include "base/debug/trace_event.h"
#include "base/logging.h"
#include "base/time/time.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/ozone/dri/dri_buffer.h"
-#include "ui/gfx/ozone/dri/dri_surface.h"
-#include "ui/gfx/ozone/dri/dri_wrapper.h"
-
-namespace gfx {
-
-HardwareDisplayController::HardwareDisplayController()
- : drm_(NULL),
- connector_id_(0),
- crtc_id_(0),
- mode_(),
- saved_crtc_(NULL),
- state_(UNASSOCIATED),
- surface_(),
- time_of_last_flip_(0) {}
+#include "ui/ozone/platform/dri/dri_buffer.h"
+#include "ui/ozone/platform/dri/dri_surface.h"
+#include "ui/ozone/platform/dri/dri_wrapper.h"
+
+namespace ui {
-void HardwareDisplayController::SetControllerInfo(
+HardwareDisplayController::HardwareDisplayController(
DriWrapper* drm,
uint32_t connector_id,
uint32_t crtc_id,
- uint32_t dpms_property_id,
- drmModeModeInfo mode) {
- drm_ = drm;
- connector_id_ = connector_id;
- crtc_id_ = crtc_id;
- dpms_property_id_ = dpms_property_id;
- mode_ = mode;
- saved_crtc_ = drm_->GetCrtc(crtc_id_);
- state_ = UNINITIALIZED;
-}
+ drmModeModeInfo mode)
+ : drm_(drm),
+ connector_id_(connector_id),
+ crtc_id_(crtc_id),
+ mode_(mode),
+ surface_(),
+ time_of_last_flip_(0) {}
HardwareDisplayController::~HardwareDisplayController() {
- if (state_ == UNASSOCIATED)
- return;
-
// Reset the cursor.
UnsetCursor();
- if (saved_crtc_) {
- if (!drm_->SetCrtc(saved_crtc_, &connector_id_))
- DLOG(ERROR) << "Failed to restore CRTC state: " << strerror(errno);
- drm_->FreeCrtc(saved_crtc_);
- }
-
if (surface_.get()) {
// Unregister the buffers.
for (size_t i = 0; i < arraysize(surface_->bitmaps_); ++i) {
@@ -68,8 +47,7 @@ HardwareDisplayController::~HardwareDisplayController() {
bool
HardwareDisplayController::BindSurfaceToController(
scoped_ptr<DriSurface> surface) {
- CHECK(state_ == UNINITIALIZED);
-
+ CHECK(surface);
// Register the buffers.
for (size_t i = 0; i < arraysize(surface->bitmaps_); ++i) {
uint32_t fb_id;
@@ -81,43 +59,31 @@ HardwareDisplayController::BindSurfaceToController(
surface->bitmaps_[i]->handle(),
&fb_id)) {
DLOG(ERROR) << "Failed to register framebuffer: " << strerror(errno);
- state_ = FAILED;
return false;
}
surface->bitmaps_[i]->set_framebuffer(fb_id);
}
+ if (!drm_->SetCrtc(crtc_id_,
+ surface->GetFramebufferId(),
+ &connector_id_,
+ &mode_)) {
+ LOG(ERROR) << "Failed to modeset: crtc=" << crtc_id_ << " connector="
+ << connector_id_ << " framebuffer_id="
+ << surface->GetFramebufferId();
+ return false;
+ }
+
surface_.reset(surface.release());
- state_ = SURFACE_INITIALIZED;
return true;
}
bool HardwareDisplayController::SchedulePageFlip() {
- CHECK(state_ == SURFACE_INITIALIZED || state_ == INITIALIZED);
-
- if (state_ == SURFACE_INITIALIZED) {
- // Perform the initial modeset.
- if (!drm_->SetCrtc(crtc_id_,
- surface_->GetFramebufferId(),
- &connector_id_,
- &mode_)) {
- DLOG(ERROR) << "Cannot set CRTC: " << strerror(errno);
- state_ = FAILED;
- return false;
- } else {
- state_ = INITIALIZED;
- }
-
- if (dpms_property_id_)
- drm_->ConnectorSetProperty(connector_id_,
- dpms_property_id_,
- DRM_MODE_DPMS_ON);
- }
+ CHECK(surface_);
if (!drm_->PageFlip(crtc_id_,
surface_->GetFramebufferId(),
this)) {
- state_ = FAILED;
LOG(ERROR) << "Cannot page flip: " << strerror(errno);
return false;
}
@@ -136,7 +102,6 @@ void HardwareDisplayController::OnPageFlipEvent(unsigned int frame,
}
bool HardwareDisplayController::SetCursor(DriSurface* surface) {
- CHECK(state_ != UNASSOCIATED);
bool ret = drm_->SetCursor(crtc_id_,
surface->GetHandle(),
surface->size().width(),
@@ -146,13 +111,11 @@ bool HardwareDisplayController::SetCursor(DriSurface* surface) {
}
bool HardwareDisplayController::UnsetCursor() {
- CHECK(state_ != UNASSOCIATED);
return drm_->SetCursor(crtc_id_, 0, 0, 0);
}
bool HardwareDisplayController::MoveCursor(const gfx::Point& location) {
- CHECK(state_ != UNASSOCIATED);
return drm_->MoveCursor(crtc_id_, location.x(), location.y());
}
-} // namespace gfx
+} // namespace ui
diff --git a/ui/gfx/ozone/dri/hardware_display_controller.h b/ui/ozone/platform/dri/hardware_display_controller.h
index 46861a1e42..af7dd866f9 100644
--- a/ui/gfx/ozone/dri/hardware_display_controller.h
+++ b/ui/ozone/platform/dri/hardware_display_controller.h
@@ -1,9 +1,9 @@
-// Copyright 2013 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.
-#ifndef UI_GFX_OZONE_DRI_HARDWARE_DISPLAY_CONTROLLER_H_
-#define UI_GFX_OZONE_DRI_HARDWARE_DISPLAY_CONTROLLER_H_
+#ifndef UI_OZONE_PLATFORM_DRI_HARDWARE_DISPLAY_CONTROLLER_H_
+#define UI_OZONE_PLATFORM_DRI_HARDWARE_DISPLAY_CONTROLLER_H_
#include <stddef.h>
#include <stdint.h>
@@ -12,13 +12,16 @@
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
-#include "ui/gfx/gfx_export.h"
-#include "ui/gfx/ozone/dri/dri_wrapper.h"
+#include "ui/ozone/ozone_export.h"
+#include "ui/ozone/platform/dri/dri_wrapper.h"
namespace gfx {
+class Point;
+}
+
+namespace ui {
class DriSurface;
-class Point;
// The HDCOz will handle modesettings and scannout operations for hardware
// devices.
@@ -77,44 +80,15 @@ class Point;
//
// TODO(dnicoara) Need to have a way to detect events (such as monitor
// connected or disconnected).
-class GFX_EXPORT HardwareDisplayController {
+class OZONE_EXPORT HardwareDisplayController {
public:
- // Controller states. The state transitions will happen from top to bottom.
- enum State {
- // When we allocate a HDCO as a stub. At this point there is no connector
- // and CRTC associated with this device.
- UNASSOCIATED,
-
- // When |SetControllerInfo| is called and the HDCO has the information of
- // the hardware it will control. At this point it knows everything it needs
- // to control the hardware but doesn't have a surface.
- UNINITIALIZED,
-
- // A surface is associated with the HDCO. This means that the controller can
- // potentially display the backing surface to the display. Though the
- // surface framebuffer still needs to be registered with the CRTC.
- SURFACE_INITIALIZED,
-
- // The CRTC now knows about the surface attributes.
- INITIALIZED,
-
- // Error state if any of the initialization steps fail.
- FAILED,
- };
-
- HardwareDisplayController();
+ HardwareDisplayController(DriWrapper* drm,
+ uint32_t connector_id,
+ uint32_t crtc_id,
+ drmModeModeInfo mode);
~HardwareDisplayController();
- // Set the hardware configuration for this HDCO. Once this is set, the HDCO is
- // responsible for keeping track of the connector and CRTC and cleaning up
- // when it is destroyed.
- void SetControllerInfo(DriWrapper* drm,
- uint32_t connector_id,
- uint32_t crtc_id,
- uint32_t dpms_property_id,
- drmModeModeInfo mode);
-
// Associate the HDCO with a surface implementation and initialize it.
bool BindSurfaceToController(scoped_ptr<DriSurface> surface);
@@ -154,8 +128,6 @@ class GFX_EXPORT HardwareDisplayController {
// Moves the hardware cursor to |location|.
bool MoveCursor(const gfx::Point& location);
- State get_state() const { return state_; };
-
int get_fd() const { return drm_->get_fd(); };
const drmModeModeInfo& get_mode() const { return mode_; };
@@ -176,17 +148,9 @@ class GFX_EXPORT HardwareDisplayController {
uint32_t crtc_id_;
- uint32_t dpms_property_id_;
-
// TODO(dnicoara) Need to store all the modes.
drmModeModeInfo mode_;
- // Saved CRTC state from before we used it. Need it to restore state once we
- // are finished using this device.
- drmModeCrtc* saved_crtc_;
-
- State state_;
-
scoped_ptr<DriSurface> surface_;
uint64_t time_of_last_flip_;
@@ -194,6 +158,6 @@ class GFX_EXPORT HardwareDisplayController {
DISALLOW_COPY_AND_ASSIGN(HardwareDisplayController);
};
-} // namespace gfx
+} // namespace ui
-#endif // UI_GFX_OZONE_DRI_HARDWARE_DISPLAY_CONTROLLER_H_
+#endif // UI_OZONE_PLATFORM_DRI_HARDWARE_DISPLAY_CONTROLLER_H_
diff --git a/ui/gfx/ozone/dri/hardware_display_controller_unittest.cc b/ui/ozone/platform/dri/hardware_display_controller_unittest.cc
index da0e7b4984..1beb85b69a 100644
--- a/ui/gfx/ozone/dri/hardware_display_controller_unittest.cc
+++ b/ui/ozone/platform/dri/hardware_display_controller_unittest.cc
@@ -1,13 +1,13 @@
-// Copyright 2013 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.
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkCanvas.h"
-#include "ui/gfx/ozone/dri/dri_buffer.h"
-#include "ui/gfx/ozone/dri/dri_surface.h"
-#include "ui/gfx/ozone/dri/dri_wrapper.h"
-#include "ui/gfx/ozone/dri/hardware_display_controller.h"
+#include "ui/ozone/platform/dri/dri_buffer.h"
+#include "ui/ozone/platform/dri/dri_surface.h"
+#include "ui/ozone/platform/dri/dri_wrapper.h"
+#include "ui/ozone/platform/dri/hardware_display_controller.h"
namespace {
@@ -26,10 +26,8 @@ const uint32_t kConnectorId = 1;
// Mock CRTC ID.
const uint32_t kCrtcId = 1;
-const uint32_t kDPMSPropertyId = 1;
-
// The real DriWrapper makes actual DRM calls which we can't use in unit tests.
-class MockDriWrapper : public gfx::DriWrapper {
+class MockDriWrapper : public ui::DriWrapper {
public:
MockDriWrapper(int fd) : DriWrapper(""),
get_crtc_call_count_(0),
@@ -88,9 +86,20 @@ class MockDriWrapper : public gfx::DriWrapper {
return page_flip_expectation_;
}
- virtual bool ConnectorSetProperty(uint32_t connector_id,
- uint32_t property_id,
- uint64_t value) OVERRIDE { return true; }
+ virtual bool SetProperty(uint32_t connector_id,
+ uint32_t property_id,
+ uint64_t value) OVERRIDE { return true; }
+
+ virtual void FreeProperty(drmModePropertyRes* prop) OVERRIDE { delete prop; }
+
+ virtual drmModePropertyBlobRes* GetPropertyBlob(drmModeConnector* connector,
+ const char* name) OVERRIDE {
+ return new drmModePropertyBlobRes;
+ }
+
+ virtual void FreePropertyBlob(drmModePropertyBlobRes* blob) OVERRIDE {
+ delete blob;
+ }
virtual bool SetCursor(uint32_t crtc_id,
uint32_t handle,
@@ -147,9 +156,9 @@ class MockDriWrapper : public gfx::DriWrapper {
DISALLOW_COPY_AND_ASSIGN(MockDriWrapper);
};
-class MockDriBuffer : public gfx::DriBuffer {
+class MockDriBuffer : public ui::DriBuffer {
public:
- MockDriBuffer(gfx::DriWrapper* dri) : DriBuffer(dri) {}
+ MockDriBuffer(ui::DriWrapper* dri) : DriBuffer(dri) {}
virtual ~MockDriBuffer() {
surface_.clear();
}
@@ -165,18 +174,18 @@ class MockDriBuffer : public gfx::DriBuffer {
DISALLOW_COPY_AND_ASSIGN(MockDriBuffer);
};
-class MockDriSurface : public gfx::DriSurface {
+class MockDriSurface : public ui::DriSurface {
public:
- MockDriSurface(gfx::DriWrapper* dri, const gfx::Size& size)
+ MockDriSurface(ui::DriWrapper* dri, const gfx::Size& size)
: DriSurface(dri, size), dri_(dri) {}
virtual ~MockDriSurface() {}
private:
- virtual gfx::DriBuffer* CreateBuffer() OVERRIDE {
+ virtual ui::DriBuffer* CreateBuffer() OVERRIDE {
return new MockDriBuffer(dri_);
}
- gfx::DriWrapper* dri_;
+ ui::DriWrapper* dri_;
DISALLOW_COPY_AND_ASSIGN(MockDriSurface);
};
@@ -191,7 +200,7 @@ class HardwareDisplayControllerTest : public testing::Test {
virtual void SetUp() OVERRIDE;
virtual void TearDown() OVERRIDE;
protected:
- scoped_ptr<gfx::HardwareDisplayController> controller_;
+ scoped_ptr<ui::HardwareDisplayController> controller_;
scoped_ptr<MockDriWrapper> drm_;
private:
@@ -199,8 +208,9 @@ class HardwareDisplayControllerTest : public testing::Test {
};
void HardwareDisplayControllerTest::SetUp() {
- controller_.reset(new gfx::HardwareDisplayController());
drm_.reset(new MockDriWrapper(kFd));
+ controller_.reset(new ui::HardwareDisplayController(
+ drm_.get(), kConnectorId, kCrtcId, kDefaultMode));
}
void HardwareDisplayControllerTest::TearDown() {
@@ -208,115 +218,72 @@ void HardwareDisplayControllerTest::TearDown() {
drm_.reset();
}
-TEST_F(HardwareDisplayControllerTest, CheckInitialState) {
- EXPECT_EQ(gfx::HardwareDisplayController::UNASSOCIATED,
- controller_->get_state());
-}
-
-TEST_F(HardwareDisplayControllerTest,
- CheckStateAfterControllerIsInitialized) {
- controller_->SetControllerInfo(
- drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
-
- EXPECT_EQ(1, drm_->get_get_crtc_call_count());
- EXPECT_EQ(gfx::HardwareDisplayController::UNINITIALIZED,
- controller_->get_state());
-}
-
TEST_F(HardwareDisplayControllerTest, CheckStateAfterSurfaceIsBound) {
- controller_->SetControllerInfo(
- drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
- scoped_ptr<gfx::DriSurface> surface(
+ scoped_ptr<ui::DriSurface> surface(
new MockDriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize());
EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass()));
EXPECT_EQ(2, drm_->get_add_framebuffer_call_count());
- EXPECT_EQ(gfx::HardwareDisplayController::SURFACE_INITIALIZED,
- controller_->get_state());
+ EXPECT_TRUE(controller_->get_surface() != NULL);
}
TEST_F(HardwareDisplayControllerTest, CheckStateIfBindingFails) {
drm_->set_add_framebuffer_expectation(false);
- controller_->SetControllerInfo(
- drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
- scoped_ptr<gfx::DriSurface> surface(
+ scoped_ptr<ui::DriSurface> surface(
new MockDriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize());
EXPECT_FALSE(controller_->BindSurfaceToController(surface.Pass()));
EXPECT_EQ(1, drm_->get_add_framebuffer_call_count());
- EXPECT_EQ(gfx::HardwareDisplayController::FAILED,
- controller_->get_state());
+ EXPECT_EQ(NULL, controller_->get_surface());
}
TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) {
- controller_->SetControllerInfo(
- drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
- scoped_ptr<gfx::DriSurface> surface(
+ scoped_ptr<ui::DriSurface> surface(
new MockDriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize());
EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass()));
- controller_->SchedulePageFlip();
-
- EXPECT_EQ(gfx::HardwareDisplayController::INITIALIZED,
- controller_->get_state());
+ EXPECT_TRUE(controller_->SchedulePageFlip());
+ EXPECT_TRUE(controller_->get_surface() != NULL);
}
TEST_F(HardwareDisplayControllerTest, CheckStateIfModesetFails) {
drm_->set_set_crtc_expectation(false);
- controller_->SetControllerInfo(
- drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
- scoped_ptr<gfx::DriSurface> surface(
+ scoped_ptr<ui::DriSurface> surface(
new MockDriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize());
- EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass()));
-
- controller_->SchedulePageFlip();
-
- EXPECT_EQ(gfx::HardwareDisplayController::FAILED,
- controller_->get_state());
+ EXPECT_FALSE(controller_->BindSurfaceToController(surface.Pass()));
+ EXPECT_EQ(NULL, controller_->get_surface());
}
TEST_F(HardwareDisplayControllerTest, CheckStateIfPageFlipFails) {
drm_->set_page_flip_expectation(false);
- controller_->SetControllerInfo(
- drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
- scoped_ptr<gfx::DriSurface> surface(
+ scoped_ptr<ui::DriSurface> surface(
new MockDriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize());
EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass()));
-
- controller_->SchedulePageFlip();
-
- EXPECT_EQ(gfx::HardwareDisplayController::FAILED,
- controller_->get_state());
+ EXPECT_FALSE(controller_->SchedulePageFlip());
}
TEST_F(HardwareDisplayControllerTest, CheckProperDestruction) {
- controller_->SetControllerInfo(
- drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
- scoped_ptr<gfx::DriSurface> surface(
+ scoped_ptr<ui::DriSurface> surface(
new MockDriSurface(drm_.get(), kDefaultModeSize));
EXPECT_TRUE(surface->Initialize());
EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass()));
-
- EXPECT_EQ(gfx::HardwareDisplayController::SURFACE_INITIALIZED,
- controller_->get_state());
+ EXPECT_TRUE(controller_->get_surface() != NULL);
controller_.reset();
EXPECT_EQ(2, drm_->get_remove_framebuffer_call_count());
- EXPECT_EQ(1, drm_->get_restore_crtc_call_count());
- EXPECT_EQ(1, drm_->get_free_crtc_call_count());
}
diff --git a/ui/ozone/platform/dri/ozone_platform_dri.cc b/ui/ozone/platform/dri/ozone_platform_dri.cc
index 8175a1d01c..bd0561f999 100644
--- a/ui/ozone/platform/dri/ozone_platform_dri.cc
+++ b/ui/ozone/platform/dri/ozone_platform_dri.cc
@@ -5,44 +5,64 @@
#include "ui/ozone/platform/dri/ozone_platform_dri.h"
#include "ui/events/ozone/evdev/cursor_delegate_evdev.h"
+#include "ui/events/ozone/evdev/event_factory_evdev.h"
+#include "ui/ozone/ime/input_method_context_factory_ozone.h"
#include "ui/ozone/ozone_platform.h"
+#include "ui/ozone/platform/dri/cursor_factory_evdev_dri.h"
+#include "ui/ozone/platform/dri/dri_surface_factory.h"
#if defined(OS_CHROMEOS)
-#include "ui/ozone/common/chromeos/native_display_delegate_ozone.h"
+#include "ui/ozone/platform/dri/chromeos/native_display_delegate_dri.h"
#endif
namespace ui {
-OzonePlatformDri::OzonePlatformDri()
- : cursor_factory_ozone_(&surface_factory_ozone_),
- event_factory_ozone_(&cursor_factory_ozone_) {}
+namespace {
-OzonePlatformDri::~OzonePlatformDri() {}
+// OzonePlatform for Linux DRI (Direct Rendering Infrastructure)
+//
+// This platform is Linux without any display server (no X, wayland, or
+// anything). This means chrome alone owns the display and input devices.
+class OzonePlatformDri : public OzonePlatform {
+ public:
+ OzonePlatformDri()
+ : cursor_factory_ozone_(&surface_factory_ozone_),
+ event_factory_ozone_(&cursor_factory_ozone_) {}
+ virtual ~OzonePlatformDri() {}
-gfx::SurfaceFactoryOzone* OzonePlatformDri::GetSurfaceFactoryOzone() {
- return &surface_factory_ozone_;
-}
-
-ui::EventFactoryOzone* OzonePlatformDri::GetEventFactoryOzone() {
- return &event_factory_ozone_;
-}
+ // OzonePlatform:
+ virtual gfx::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE {
+ return &surface_factory_ozone_;
+ }
+ virtual ui::EventFactoryOzone* GetEventFactoryOzone() OVERRIDE {
+ return &event_factory_ozone_;
+ }
+ virtual ui::InputMethodContextFactoryOzone*
+ GetInputMethodContextFactoryOzone() OVERRIDE {
+ return &input_method_context_factory_ozone_;
+ }
+ virtual ui::CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE {
+ return &cursor_factory_ozone_;
+ }
+#if defined(OS_CHROMEOS)
+ virtual scoped_ptr<ui::NativeDisplayDelegate> CreateNativeDisplayDelegate()
+ OVERRIDE {
+ return scoped_ptr<ui::NativeDisplayDelegate>(
+ new NativeDisplayDelegateDri(&surface_factory_ozone_));
+ }
+#endif
-ui::InputMethodContextFactoryOzone*
-OzonePlatformDri::GetInputMethodContextFactoryOzone() {
- return &input_method_context_factory_ozone_;
-}
+ private:
+ ui::DriSurfaceFactory surface_factory_ozone_;
+ ui::CursorFactoryEvdevDri cursor_factory_ozone_;
+ ui::EventFactoryEvdev event_factory_ozone_;
+ // This creates a minimal input context.
+ ui::InputMethodContextFactoryOzone input_method_context_factory_ozone_;
-ui::CursorFactoryOzone* OzonePlatformDri::GetCursorFactoryOzone() {
- return &cursor_factory_ozone_;
-}
+ DISALLOW_COPY_AND_ASSIGN(OzonePlatformDri);
+};
-#if defined(OS_CHROMEOS)
-scoped_ptr<ui::NativeDisplayDelegate>
-OzonePlatformDri::CreateNativeDisplayDelegate() {
- return scoped_ptr<ui::NativeDisplayDelegate>(
- new NativeDisplayDelegateOzone());
-}
-#endif
+} // namespace
OzonePlatform* CreateOzonePlatformDri() { return new OzonePlatformDri; }
diff --git a/ui/ozone/platform/dri/ozone_platform_dri.h b/ui/ozone/platform/dri/ozone_platform_dri.h
index dff706b385..a63a0541dd 100644
--- a/ui/ozone/platform/dri/ozone_platform_dri.h
+++ b/ui/ozone/platform/dri/ozone_platform_dri.h
@@ -5,41 +5,9 @@
#ifndef UI_OZONE_PLATFORM_DRI_OZONE_PLATFORM_DRI_H_
#define UI_OZONE_PLATFORM_DRI_OZONE_PLATFORM_DRI_H_
-#include "ui/events/ozone/evdev/event_factory_evdev.h"
-#include "ui/gfx/ozone/dri/dri_surface_factory.h"
-#include "ui/ozone/ozone_platform.h"
-#include "ui/ozone/platform/dri/cursor_factory_evdev_dri.h"
-
namespace ui {
-// OzonePlatform for Linux DRI (Direct Rendering Infrastructure)
-//
-// This platform is Linux without any display server (no X, wayland, or
-// anything). This means chrome alone owns the display and input devices.
-class OzonePlatformDri : public OzonePlatform {
- public:
- OzonePlatformDri();
- virtual ~OzonePlatformDri();
-
- virtual gfx::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE;
- virtual ui::EventFactoryOzone* GetEventFactoryOzone() OVERRIDE;
- virtual ui::InputMethodContextFactoryOzone*
- GetInputMethodContextFactoryOzone() OVERRIDE;
- virtual ui::CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE;
-#if defined(OS_CHROMEOS)
- virtual scoped_ptr<ui::NativeDisplayDelegate>
- CreateNativeDisplayDelegate() OVERRIDE;
-#endif
-
- private:
- gfx::DriSurfaceFactory surface_factory_ozone_;
- ui::CursorFactoryEvdevDri cursor_factory_ozone_;
- ui::EventFactoryEvdev event_factory_ozone_;
- // This creates a minimal input context.
- ui::InputMethodContextFactoryOzone input_method_context_factory_ozone_;
-
- DISALLOW_COPY_AND_ASSIGN(OzonePlatformDri);
-};
+class OzonePlatform;
// Constructor hook for use in ozone_platform_list.cc
OzonePlatform* CreateOzonePlatformDri();
diff --git a/ui/ozone/platform/test/ozone_platform_test.cc b/ui/ozone/platform/test/ozone_platform_test.cc
index 2a848954c4..da94ba4b3f 100644
--- a/ui/ozone/platform/test/ozone_platform_test.cc
+++ b/ui/ozone/platform/test/ozone_platform_test.cc
@@ -6,6 +6,10 @@
#include "base/command_line.h"
#include "base/files/file_path.h"
+#include "ui/base/cursor/ozone/cursor_factory_ozone.h"
+#include "ui/events/ozone/evdev/event_factory_evdev.h"
+#include "ui/gfx/ozone/impl/file_surface_factory.h"
+#include "ui/ozone/ime/input_method_context_factory_ozone.h"
#include "ui/ozone/ozone_platform.h"
#include "ui/ozone/ozone_switches.h"
@@ -15,36 +19,50 @@
namespace ui {
-OzonePlatformTest::OzonePlatformTest(const base::FilePath& dump_file)
- : surface_factory_ozone_(dump_file) {}
+namespace {
-OzonePlatformTest::~OzonePlatformTest() {}
+// OzonePlatform for testing
+//
+// This platform dumps images to a file for testing purposes.
+class OzonePlatformTest : public OzonePlatform {
+ public:
+ OzonePlatformTest(const base::FilePath& dump_file)
+ : surface_factory_ozone_(dump_file) {}
+ virtual ~OzonePlatformTest() {}
-gfx::SurfaceFactoryOzone* OzonePlatformTest::GetSurfaceFactoryOzone() {
- return &surface_factory_ozone_;
-}
+ // OzonePlatform:
+ virtual gfx::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE {
+ return &surface_factory_ozone_;
+ }
+ virtual ui::EventFactoryOzone* GetEventFactoryOzone() OVERRIDE {
+ return &event_factory_ozone_;
+ }
+ virtual ui::InputMethodContextFactoryOzone*
+ GetInputMethodContextFactoryOzone() OVERRIDE {
+ return &input_method_context_factory_ozone_;
+ }
+ virtual ui::CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE {
+ return &cursor_factory_ozone_;
+ }
-ui::EventFactoryOzone* OzonePlatformTest::GetEventFactoryOzone() {
- return &event_factory_ozone_;
-}
+#if defined(OS_CHROMEOS)
+ virtual scoped_ptr<ui::NativeDisplayDelegate> CreateNativeDisplayDelegate()
+ OVERRIDE {
+ return scoped_ptr<ui::NativeDisplayDelegate>(
+ new NativeDisplayDelegateOzone());
+ }
+#endif
-ui::InputMethodContextFactoryOzone*
-OzonePlatformTest::GetInputMethodContextFactoryOzone() {
- return &input_method_context_factory_ozone_;
-}
+ private:
+ gfx::FileSurfaceFactory surface_factory_ozone_;
+ ui::EventFactoryEvdev event_factory_ozone_;
+ ui::InputMethodContextFactoryOzone input_method_context_factory_ozone_;
+ ui::CursorFactoryOzone cursor_factory_ozone_;
-ui::CursorFactoryOzone* OzonePlatformTest::GetCursorFactoryOzone() {
- return &cursor_factory_ozone_;
-}
+ DISALLOW_COPY_AND_ASSIGN(OzonePlatformTest);
+};
-#if defined(OS_CHROMEOS)
-scoped_ptr<ui::NativeDisplayDelegate>
-OzonePlatformTest::CreateNativeDisplayDelegate() {
- return scoped_ptr<ui::NativeDisplayDelegate>(
- new NativeDisplayDelegateOzone());
- return scoped_ptr<ui::NativeDisplayDelegate>();
-}
-#endif
+} // namespace
OzonePlatform* CreateOzonePlatformTest() {
CommandLine* cmd = CommandLine::ForCurrentProcess();
diff --git a/ui/ozone/platform/test/ozone_platform_test.h b/ui/ozone/platform/test/ozone_platform_test.h
index 1f6a9648d2..fb25fd69f5 100644
--- a/ui/ozone/platform/test/ozone_platform_test.h
+++ b/ui/ozone/platform/test/ozone_platform_test.h
@@ -5,40 +5,9 @@
#ifndef UI_OZONE_PLATFORM_TEST_OZONE_PLATFORM_TEST_H_
#define UI_OZONE_PLATFORM_TEST_OZONE_PLATFORM_TEST_H_
-#include "base/files/file_path.h"
-#include "ui/base/cursor/ozone/cursor_factory_ozone.h"
-#include "ui/events/ozone/evdev/event_factory_evdev.h"
-#include "ui/gfx/ozone/impl/file_surface_factory.h"
-#include "ui/ozone/ozone_platform.h"
-
namespace ui {
-// OzonePlatform for testing
-//
-// This platform dumps images to a file for testing purposes.
-class OzonePlatformTest : public OzonePlatform {
- public:
- OzonePlatformTest(const base::FilePath& dump_file);
- virtual ~OzonePlatformTest();
-
- virtual gfx::SurfaceFactoryOzone* GetSurfaceFactoryOzone() OVERRIDE;
- virtual ui::EventFactoryOzone* GetEventFactoryOzone() OVERRIDE;
- virtual ui::InputMethodContextFactoryOzone*
- GetInputMethodContextFactoryOzone() OVERRIDE;
- virtual ui::CursorFactoryOzone* GetCursorFactoryOzone() OVERRIDE;
-#if defined(OS_CHROMEOS)
- virtual scoped_ptr<ui::NativeDisplayDelegate>
- CreateNativeDisplayDelegate() OVERRIDE;
-#endif
-
- private:
- gfx::FileSurfaceFactory surface_factory_ozone_;
- ui::EventFactoryEvdev event_factory_ozone_;
- ui::InputMethodContextFactoryOzone input_method_context_factory_ozone_;
- ui::CursorFactoryOzone cursor_factory_ozone_;
-
- DISALLOW_COPY_AND_ASSIGN(OzonePlatformTest);
-};
+class OzonePlatform;
// Constructor hook for use in ozone_platform_list.cc
OzonePlatform* CreateOzonePlatformTest();
diff --git a/ui/resources/BUILD.gn b/ui/resources/BUILD.gn
new file mode 100644
index 0000000000..30e62bae31
--- /dev/null
+++ b/ui/resources/BUILD.gn
@@ -0,0 +1,10 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//tools/grit/grit_rule.gni")
+
+grit("resources") {
+ output_name = "ui_resources"
+ source = "ui_resources.grd"
+}
diff --git a/ui/resources/ui_resources.grd b/ui/resources/ui_resources.grd
index 260f05cda2..6cd4ed9809 100644
--- a/ui/resources/ui_resources.grd
+++ b/ui/resources/ui_resources.grd
@@ -259,7 +259,7 @@
<structure type="chrome_scaled_image" name="IDR_COMBOBOX_BUTTON_F_H_TOP_RIGHT" file="common/combobox_button_top_right_focused_hover.png" />
<structure type="chrome_scaled_image" name="IDR_COMBOBOX_BUTTON_F_P_TOP_RIGHT" file="common/combobox_button_top_right_focused_pressed.png" />
</if>
- <if expr="toolkit_uses_gtk or toolkit_views">
+ <if expr="toolkit_views">
<structure type="chrome_scaled_image" name="IDR_CONTENT_BOTTOM_CENTER" file="content_bottom_center.png" />
<structure type="chrome_scaled_image" name="IDR_CONTENT_BOTTOM_LEFT_CORNER" file="content_bottom_left_corner.png" />
<structure type="chrome_scaled_image" name="IDR_CONTENT_BOTTOM_RIGHT_CORNER" file="content_bottom_right_corner.png" />
@@ -484,7 +484,7 @@
<structure type="chrome_scaled_image" name="IDR_SCROLLBAR_THUMB_BASE_PRESSED_TOP_LEFT" file="common/aura_scrollbar_thumb_base_pressed_top_left.png" />
<structure type="chrome_scaled_image" name="IDR_SCROLLBAR_THUMB_BASE_PRESSED_TOP_RIGHT" file="common/aura_scrollbar_thumb_base_pressed_top_right.png" />
</if>
- <if expr="toolkit_uses_gtk or toolkit_views">
+ <if expr="toolkit_views">
<structure type="chrome_scaled_image" name="IDR_TEXTBUTTON_HOVER_BOTTOM" file="common/textbutton_hover_bottom.png" />
<structure type="chrome_scaled_image" name="IDR_TEXTBUTTON_HOVER_BOTTOM_LEFT" file="common/textbutton_hover_bottom_left.png" />
<structure type="chrome_scaled_image" name="IDR_TEXTBUTTON_HOVER_BOTTOM_RIGHT" file="common/textbutton_hover_bottom_right.png" />
@@ -524,7 +524,7 @@
<structure type="chrome_scaled_image" name="IDR_TRAY_EMPTY" file="mac/notification_tray_empty.png"/>
<structure type="chrome_scaled_image" name="IDR_TRAY_EMPTY_PRESSED" file="mac/notification_tray_empty_pressed.png"/>
</if>
- <if expr="toolkit_uses_gtk or toolkit_views">
+ <if expr="toolkit_views">
<structure type="chrome_scaled_image" name="IDR_WINDOW_BOTTOM_CENTER" file="common/window_bottom_center.png" />
<structure type="chrome_scaled_image" name="IDR_WINDOW_BOTTOM_LEFT_CORNER" file="common/window_bottom_left_corner.png" />
<structure type="chrome_scaled_image" name="IDR_WINDOW_BOTTOM_RIGHT_CORNER" file="common/window_bottom_right_corner.png" />
diff --git a/ui/shell_dialogs/shell_dialogs.target.darwin-arm.mk b/ui/shell_dialogs/shell_dialogs.target.darwin-arm.mk
index 6f799209e8..3fc1b31fb1 100644
--- a/ui/shell_dialogs/shell_dialogs.target.darwin-arm.mk
+++ b/ui/shell_dialogs/shell_dialogs.target.darwin-arm.mk
@@ -102,12 +102,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -226,12 +229,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -307,7 +313,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/shell_dialogs/shell_dialogs.target.darwin-mips.mk b/ui/shell_dialogs/shell_dialogs.target.darwin-mips.mk
index fbc9133e14..1f9c4088e8 100644
--- a/ui/shell_dialogs/shell_dialogs.target.darwin-mips.mk
+++ b/ui/shell_dialogs/shell_dialogs.target.darwin-mips.mk
@@ -101,12 +101,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -224,12 +227,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -303,7 +309,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/shell_dialogs/shell_dialogs.target.darwin-x86.mk b/ui/shell_dialogs/shell_dialogs.target.darwin-x86.mk
index fa6bfaf19f..bcd87f697b 100644
--- a/ui/shell_dialogs/shell_dialogs.target.darwin-x86.mk
+++ b/ui/shell_dialogs/shell_dialogs.target.darwin-x86.mk
@@ -103,12 +103,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -226,12 +229,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -303,7 +309,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/shell_dialogs/shell_dialogs.target.darwin-x86_64.mk b/ui/shell_dialogs/shell_dialogs.target.darwin-x86_64.mk
index 61d7198cb4..38e6267607 100644
--- a/ui/shell_dialogs/shell_dialogs.target.darwin-x86_64.mk
+++ b/ui/shell_dialogs/shell_dialogs.target.darwin-x86_64.mk
@@ -103,12 +103,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -227,12 +230,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -305,7 +311,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/shell_dialogs/shell_dialogs.target.linux-arm.mk b/ui/shell_dialogs/shell_dialogs.target.linux-arm.mk
index 6f799209e8..3fc1b31fb1 100644
--- a/ui/shell_dialogs/shell_dialogs.target.linux-arm.mk
+++ b/ui/shell_dialogs/shell_dialogs.target.linux-arm.mk
@@ -102,12 +102,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -226,12 +229,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -307,7 +313,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/shell_dialogs/shell_dialogs.target.linux-mips.mk b/ui/shell_dialogs/shell_dialogs.target.linux-mips.mk
index fbc9133e14..1f9c4088e8 100644
--- a/ui/shell_dialogs/shell_dialogs.target.linux-mips.mk
+++ b/ui/shell_dialogs/shell_dialogs.target.linux-mips.mk
@@ -101,12 +101,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -224,12 +227,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -303,7 +309,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/shell_dialogs/shell_dialogs.target.linux-x86.mk b/ui/shell_dialogs/shell_dialogs.target.linux-x86.mk
index fa6bfaf19f..bcd87f697b 100644
--- a/ui/shell_dialogs/shell_dialogs.target.linux-x86.mk
+++ b/ui/shell_dialogs/shell_dialogs.target.linux-x86.mk
@@ -103,12 +103,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -226,12 +229,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -303,7 +309,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/shell_dialogs/shell_dialogs.target.linux-x86_64.mk b/ui/shell_dialogs/shell_dialogs.target.linux-x86_64.mk
index 61d7198cb4..38e6267607 100644
--- a/ui/shell_dialogs/shell_dialogs.target.linux-x86_64.mk
+++ b/ui/shell_dialogs/shell_dialogs.target.linux-x86_64.mk
@@ -103,12 +103,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -227,12 +230,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -305,7 +311,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/snapshot/snapshot.target.darwin-arm.mk b/ui/snapshot/snapshot.target.darwin-arm.mk
index 6d81bf21ba..df5313cab2 100644
--- a/ui/snapshot/snapshot.target.darwin-arm.mk
+++ b/ui/snapshot/snapshot.target.darwin-arm.mk
@@ -93,12 +93,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -215,12 +218,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -294,7 +300,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/snapshot/snapshot.target.darwin-mips.mk b/ui/snapshot/snapshot.target.darwin-mips.mk
index add41c0286..6b0bd0d097 100644
--- a/ui/snapshot/snapshot.target.darwin-mips.mk
+++ b/ui/snapshot/snapshot.target.darwin-mips.mk
@@ -92,12 +92,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -213,12 +216,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/snapshot/snapshot.target.darwin-x86.mk b/ui/snapshot/snapshot.target.darwin-x86.mk
index 4febd0e378..18528de2ec 100644
--- a/ui/snapshot/snapshot.target.darwin-x86.mk
+++ b/ui/snapshot/snapshot.target.darwin-x86.mk
@@ -94,12 +94,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -215,12 +218,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/snapshot/snapshot.target.darwin-x86_64.mk b/ui/snapshot/snapshot.target.darwin-x86_64.mk
index 427add6bc8..098730a08f 100644
--- a/ui/snapshot/snapshot.target.darwin-x86_64.mk
+++ b/ui/snapshot/snapshot.target.darwin-x86_64.mk
@@ -94,12 +94,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -216,12 +219,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -292,7 +298,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/snapshot/snapshot.target.linux-arm.mk b/ui/snapshot/snapshot.target.linux-arm.mk
index 6d81bf21ba..df5313cab2 100644
--- a/ui/snapshot/snapshot.target.linux-arm.mk
+++ b/ui/snapshot/snapshot.target.linux-arm.mk
@@ -93,12 +93,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -215,12 +218,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -294,7 +300,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/snapshot/snapshot.target.linux-mips.mk b/ui/snapshot/snapshot.target.linux-mips.mk
index add41c0286..6b0bd0d097 100644
--- a/ui/snapshot/snapshot.target.linux-mips.mk
+++ b/ui/snapshot/snapshot.target.linux-mips.mk
@@ -92,12 +92,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -213,12 +216,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/snapshot/snapshot.target.linux-x86.mk b/ui/snapshot/snapshot.target.linux-x86.mk
index 4febd0e378..18528de2ec 100644
--- a/ui/snapshot/snapshot.target.linux-x86.mk
+++ b/ui/snapshot/snapshot.target.linux-x86.mk
@@ -94,12 +94,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -215,12 +218,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
'-DUSE_OPENSSL_CERTS=1' \
@@ -290,7 +296,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/snapshot/snapshot.target.linux-x86_64.mk b/ui/snapshot/snapshot.target.linux-x86_64.mk
index 427add6bc8..098730a08f 100644
--- a/ui/snapshot/snapshot.target.linux-x86_64.mk
+++ b/ui/snapshot/snapshot.target.linux-x86_64.mk
@@ -94,12 +94,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -216,12 +219,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DUSE_OPENSSL=1' \
@@ -292,7 +298,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/surface/surface.target.darwin-arm.mk b/ui/surface/surface.target.darwin-arm.mk
index f8c16b3125..5e7eb7f601 100644
--- a/ui/surface/surface.target.darwin-arm.mk
+++ b/ui/surface/surface.target.darwin-arm.mk
@@ -45,7 +45,6 @@ MY_CFLAGS_Debug := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-fno-tree-sra \
-fuse-ld=gold \
-Wno-psabi \
@@ -97,12 +96,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
@@ -173,7 +175,6 @@ MY_CFLAGS_Release := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-fno-tree-sra \
-fuse-ld=gold \
-Wno-psabi \
@@ -225,12 +226,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
@@ -308,7 +312,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/surface/surface.target.darwin-mips.mk b/ui/surface/surface.target.darwin-mips.mk
index fa800ab1c0..12ee7d8171 100644
--- a/ui/surface/surface.target.darwin-mips.mk
+++ b/ui/surface/surface.target.darwin-mips.mk
@@ -45,7 +45,6 @@ MY_CFLAGS_Debug := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-EL \
-mhard-float \
-ffunction-sections \
@@ -96,12 +95,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
@@ -172,7 +174,6 @@ MY_CFLAGS_Release := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-EL \
-mhard-float \
-ffunction-sections \
@@ -223,12 +224,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
@@ -304,7 +308,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/surface/surface.target.darwin-x86.mk b/ui/surface/surface.target.darwin-x86.mk
index cb2b06d8a9..4cceb1433d 100644
--- a/ui/surface/surface.target.darwin-x86.mk
+++ b/ui/surface/surface.target.darwin-x86.mk
@@ -44,7 +44,6 @@ MY_CFLAGS_Debug := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-msse2 \
-mfpmath=sse \
-mmmx \
@@ -98,12 +97,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DUSE_OPENSSL=1' \
@@ -171,7 +173,6 @@ MY_CFLAGS_Release := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-msse2 \
-mfpmath=sse \
-mmmx \
@@ -225,12 +226,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DUSE_OPENSSL=1' \
@@ -304,7 +308,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/surface/surface.target.darwin-x86_64.mk b/ui/surface/surface.target.darwin-x86_64.mk
index f6317b5302..0f7186a898 100644
--- a/ui/surface/surface.target.darwin-x86_64.mk
+++ b/ui/surface/surface.target.darwin-x86_64.mk
@@ -46,7 +46,6 @@ MY_CFLAGS_Debug := \
-pipe \
-fPIC \
-Wno-unused-local-typedefs \
- -Wno-unknown-pragmas \
-m64 \
-march=x86-64 \
-fuse-ld=gold \
@@ -98,12 +97,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
@@ -174,7 +176,6 @@ MY_CFLAGS_Release := \
-pipe \
-fPIC \
-Wno-unused-local-typedefs \
- -Wno-unknown-pragmas \
-m64 \
-march=x86-64 \
-fuse-ld=gold \
@@ -226,12 +227,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
@@ -306,7 +310,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/surface/surface.target.linux-arm.mk b/ui/surface/surface.target.linux-arm.mk
index f8c16b3125..5e7eb7f601 100644
--- a/ui/surface/surface.target.linux-arm.mk
+++ b/ui/surface/surface.target.linux-arm.mk
@@ -45,7 +45,6 @@ MY_CFLAGS_Debug := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-fno-tree-sra \
-fuse-ld=gold \
-Wno-psabi \
@@ -97,12 +96,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
@@ -173,7 +175,6 @@ MY_CFLAGS_Release := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-fno-tree-sra \
-fuse-ld=gold \
-Wno-psabi \
@@ -225,12 +226,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
@@ -308,7 +312,6 @@ LOCAL_LDFLAGS_Debug := \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
-Wl,--icf=safe \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/surface/surface.target.linux-mips.mk b/ui/surface/surface.target.linux-mips.mk
index fa800ab1c0..12ee7d8171 100644
--- a/ui/surface/surface.target.linux-mips.mk
+++ b/ui/surface/surface.target.linux-mips.mk
@@ -45,7 +45,6 @@ MY_CFLAGS_Debug := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-EL \
-mhard-float \
-ffunction-sections \
@@ -96,12 +95,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
@@ -172,7 +174,6 @@ MY_CFLAGS_Release := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-EL \
-mhard-float \
-ffunction-sections \
@@ -223,12 +224,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
@@ -304,7 +308,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/surface/surface.target.linux-x86.mk b/ui/surface/surface.target.linux-x86.mk
index cb2b06d8a9..4cceb1433d 100644
--- a/ui/surface/surface.target.linux-x86.mk
+++ b/ui/surface/surface.target.linux-x86.mk
@@ -44,7 +44,6 @@ MY_CFLAGS_Debug := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-msse2 \
-mfpmath=sse \
-mmmx \
@@ -98,12 +97,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DUSE_OPENSSL=1' \
@@ -171,7 +173,6 @@ MY_CFLAGS_Release := \
-fvisibility=hidden \
-pipe \
-fPIC \
- -Wno-unknown-pragmas \
-msse2 \
-mfpmath=sse \
-mmmx \
@@ -225,12 +226,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
'-DUSE_OPENSSL=1' \
@@ -304,7 +308,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/surface/surface.target.linux-x86_64.mk b/ui/surface/surface.target.linux-x86_64.mk
index f6317b5302..0f7186a898 100644
--- a/ui/surface/surface.target.linux-x86_64.mk
+++ b/ui/surface/surface.target.linux-x86_64.mk
@@ -46,7 +46,6 @@ MY_CFLAGS_Debug := \
-pipe \
-fPIC \
-Wno-unused-local-typedefs \
- -Wno-unknown-pragmas \
-m64 \
-march=x86-64 \
-fuse-ld=gold \
@@ -98,12 +97,15 @@ MY_DEFS_Debug := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
@@ -174,7 +176,6 @@ MY_CFLAGS_Release := \
-pipe \
-fPIC \
-Wno-unused-local-typedefs \
- -Wno-unknown-pragmas \
-m64 \
-march=x86-64 \
-fuse-ld=gold \
@@ -226,12 +227,15 @@ MY_DEFS_Release := \
'-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \
'-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \
'-DSK_SUPPORT_LEGACY_PICTURE_CAN_RECORD' \
+ '-DSK_SUPPORT_DEPRECATED_RECORD_FLAGS' \
+ '-DSK_SUPPORT_LEGACY_DERIVED_PICTURE_CLASSES' \
'-DSK_SUPPORT_LEGACY_N32_NAME' \
+ '-DSK_SUPPORT_LEGACY_PROCXFERMODE' \
+ '-DSK_SUPPORT_LEGACY_PICTURE_HEADERS' \
'-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \
'-DSK_BUILD_FOR_ANDROID' \
'-DSK_USE_POSIX_THREADS' \
'-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \
- '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \
'-DPOSIX_AVOID_MMAP' \
'-DU_USING_ICU_NAMESPACE=0' \
'-DMESA_EGL_NO_X11_HEADERS' \
@@ -306,7 +310,6 @@ LOCAL_LDFLAGS_Debug := \
-nostdlib \
-Wl,--no-undefined \
-Wl,--exclude-libs=ALL \
- -Wl,--gc-sections \
-Wl,--warn-shared-textrel \
-Wl,-O1 \
-Wl,--as-needed
diff --git a/ui/ui_unittests.gyp b/ui/ui_unittests.gyp
index 5b57002577..cfea34789f 100644
--- a/ui/ui_unittests.gyp
+++ b/ui/ui_unittests.gyp
@@ -8,54 +8,6 @@
},
'targets': [
{
- 'target_name': 'ui_test_support',
- 'dependencies': [
- '../base/base.gyp:base',
- '../skia/skia.gyp:skia',
- '../testing/gtest.gyp:gtest',
- 'gfx/gfx.gyp:gfx',
- 'gfx/gfx.gyp:gfx_geometry',
- ],
- 'sources': [
- 'base/test/ui_controls.h',
- 'base/test/ui_controls_aura.cc',
- 'base/test/ui_controls_internal_win.cc',
- 'base/test/ui_controls_internal_win.h',
- 'base/test/ui_controls_mac.mm',
- 'base/test/ui_controls_win.cc',
- ],
- 'include_dirs': [
- '../',
- ],
- 'conditions': [
- ['OS!="ios"', {
- 'type': 'static_library',
- 'includes': [ 'base/ime/ime_test_support.gypi' ],
- }, { # OS=="ios"
- # None of the sources in this target are built on iOS, resulting in
- # link errors when building targets that depend on this target
- # because the static library isn't found. If this target is changed
- # to have sources that are built on iOS, the target should be changed
- # to be of type static_library on all platforms.
- 'type': 'none',
- # The cocoa files don't apply to iOS.
- 'sources/': [['exclude', 'cocoa']],
- }],
- ['chromeos==1', {
- 'dependencies': [
- '../chromeos/chromeos.gyp:chromeos_test_support_without_gmock',
- '../skia/skia.gyp:skia',
- ],
- }],
- ['use_aura==1', {
- 'sources!': [
- 'base/test/ui_controls_mac.mm',
- 'base/test/ui_controls_win.cc',
- ],
- }],
- ],
- },
- {
'target_name': 'ui_unittests',
'type': '<(gtest_target_type)',
'dependencies': [
@@ -69,11 +21,11 @@
'../url/url.gyp:url_lib',
'base/strings/ui_strings.gyp:ui_strings',
'base/ui_base.gyp:ui_base',
+ 'base/ui_base.gyp:ui_base_test_support',
'events/events.gyp:events_base',
'gfx/gfx.gyp:gfx_test_support',
'resources/ui_resources.gyp:ui_resources',
'resources/ui_resources.gyp:ui_test_pak',
- 'ui_test_support',
],
# iOS uses a small subset of ui. common_sources are the only files that
# are built on iOS.
@@ -135,9 +87,6 @@
'gfx/font_list_unittest.cc',
'gfx/image/image_mac_unittest.mm',
'gfx/image/image_util_unittest.cc',
- 'gfx/ozone/dri/hardware_display_controller_unittest.cc',
- 'gfx/ozone/dri/dri_surface_factory_unittest.cc',
- 'gfx/ozone/dri/dri_surface_unittest.cc',
'gfx/platform_font_mac_unittest.mm',
'gfx/render_text_unittest.cc',
'gfx/sequential_id_generator_unittest.cc',
@@ -146,6 +95,7 @@
],
'includes': [
'display/display_unittests.gypi',
+ 'ozone/ozone_unittests.gypi',
],
'include_dirs': [
'../',
@@ -239,14 +189,6 @@
'../tools/xdisplaycheck/xdisplaycheck.gyp:xdisplaycheck',
],
}],
- ['toolkit_uses_gtk == 1', {
- 'sources': [
- 'base/dragdrop/gtk_dnd_util_unittest.cc',
- ],
- 'dependencies': [
- '../build/linux/system.gyp:gtk',
- ],
- }],
['OS=="android" or OS=="ios"', {
'sources!': [
'gfx/render_text_unittest.cc',
@@ -285,11 +227,6 @@
'gfx/screen_unittest.cc',
],
}],
- ['use_ozone==1', {
- 'dependencies': [
- '<(DEPTH)/build/linux/system.gyp:dridrm',
- ],
- }],
['use_ozone==1 and use_pango==0', {
'sources!': [
'gfx/text_elider_unittest.cc',
@@ -300,6 +237,9 @@
],
}],
['chromeos==1', {
+ 'dependencies': [
+ '../chromeos/chromeos.gyp:chromeos',
+ ],
'sources!': [
'base/dragdrop/os_exchange_data_provider_aurax11_unittest.cc',
],
@@ -343,7 +283,6 @@
],
'variables': {
'test_suite_name': 'ui_unittests',
- 'input_shlib_path': '<(SHARED_LIB_DIR)/<(SHARED_LIB_PREFIX)ui_unittests<(SHARED_LIB_SUFFIX)',
},
'includes': [ '../build/apk_test.gypi' ],
},
diff --git a/ui/views/accessibility/ax_tree_source_views.cc b/ui/views/accessibility/ax_tree_source_views.cc
index 27f880215f..80c1125b62 100644
--- a/ui/views/accessibility/ax_tree_source_views.cc
+++ b/ui/views/accessibility/ax_tree_source_views.cc
@@ -4,6 +4,8 @@
#include "ui/views/accessibility/ax_tree_source_views.h"
+#include <vector>
+
#include "base/strings/utf_string_conversions.h"
#include "ui/accessibility/ax_view_state.h"
#include "ui/views/widget/widget.h"
@@ -13,7 +15,7 @@ namespace views {
// A simple store associating each |View| with a unique id.
class AXViewStore {
public:
- AXViewStore() : view_id_(0) {};
+ AXViewStore() : view_id_(0) {}
int32 GetOrStoreView(View* view) {
int32 current_id = RetrieveId(view);
@@ -63,15 +65,18 @@ class AXViewStore {
std::map<View*, int32> view_to_id_;
};
-AXTreeSourceViews::AXTreeSourceViews(Widget* root) :
- view_store_(new AXViewStore()),
- root_(root) {
+AXTreeSourceViews::AXTreeSourceViews(Widget* root)
+ : view_store_(new AXViewStore()),
+ root_(root) {
root->AddObserver(this);
+ root->AddRemovalsObserver(this);
}
AXTreeSourceViews::~AXTreeSourceViews() {
- if (root_)
+ if (root_) {
root_->RemoveObserver(this);
+ root_->RemoveRemovalsObserver(this);
+ }
}
View* AXTreeSourceViews::GetRoot() const {
@@ -148,4 +153,4 @@ void AXTreeSourceViews::OnWidgetDestroyed(Widget* widget) {
root_ = NULL;
}
-} // namespace views
+} // namespace views
diff --git a/ui/views/accessibility/ax_tree_source_views_unittest.cc b/ui/views/accessibility/ax_tree_source_views_unittest.cc
index 9472faf495..7b46bfe588 100644
--- a/ui/views/accessibility/ax_tree_source_views_unittest.cc
+++ b/ui/views/accessibility/ax_tree_source_views_unittest.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <vector>
+
#include "base/memory/scoped_ptr.h"
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -68,9 +70,7 @@ TEST_F(AXTreeSourceViewsTest, SimpleAccessers) {
TEST_F(AXTreeSourceViewsTest, SimpleSerialization) {
AXTreeSourceViews ax_tree(widget_.get());
- ui::AXTreeSource<View*>* ax_source =
- static_cast<ui::AXTreeSource<View*>* >(&ax_tree);
- ui::AXTreeSerializer<View*> ax_serializer(ax_source);
+ ui::AXTreeSerializer<View*> ax_serializer(&ax_tree);
ui::AXTreeUpdate out_update;
ax_serializer.SerializeChanges(ax_tree.GetRoot(), &out_update);
ASSERT_EQ(3U, out_update.nodes.size());
@@ -82,4 +82,4 @@ TEST_F(AXTreeSourceViewsTest, SimpleSerialization) {
out_update.nodes[2].ToString());
}
-} // namespace views
+} // namespace views
diff --git a/ui/views/bubble/bubble_delegate.h b/ui/views/bubble/bubble_delegate.h
index 0142889e11..8bfd4a2b2b 100644
--- a/ui/views/bubble/bubble_delegate.h
+++ b/ui/views/bubble/bubble_delegate.h
@@ -184,9 +184,6 @@ class VIEWS_EXPORT BubbleDelegateView : public WidgetDelegateView,
// Insets applied to the |anchor_view_| bounds.
gfx::Insets anchor_view_insets_;
- // The widget hosting the border for this bubble (non-Aura Windows only).
- Widget* border_widget_;
-
// If true, the bubble does not take focus on display; default is false.
bool use_focusless_;
diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc
index cadd40bdbe..717d2e08a4 100644
--- a/ui/views/controls/label.cc
+++ b/ui/views/controls/label.cc
@@ -323,7 +323,7 @@ void Label::PaintText(gfx::Canvas* canvas,
int flags) {
gfx::ShadowValues shadows;
if (has_shadow_)
- shadows.push_back(gfx::ShadowValue(shadow_offset_, 0,
+ shadows.push_back(gfx::ShadowValue(shadow_offset_, shadow_blur_,
enabled() ? enabled_shadow_color_ : disabled_shadow_color_));
canvas->DrawStringRectWithShadows(text, font_list_,
enabled() ? actual_enabled_color_ : actual_disabled_color_,
@@ -398,6 +398,7 @@ void Label::Init(const base::string16& text, const gfx::FontList& font_list) {
disabled_shadow_color_ = 0;
shadow_offset_.SetPoint(1, 1);
has_shadow_ = false;
+ shadow_blur_ = 0;
cached_heights_.resize(kCachedSizeLimit);
ResetCachedSize();
diff --git a/ui/views/controls/label.h b/ui/views/controls/label.h
index 0964b036c5..17251f3528 100644
--- a/ui/views/controls/label.h
+++ b/ui/views/controls/label.h
@@ -94,6 +94,9 @@ class VIEWS_EXPORT Label : public View {
// Sets the drop shadow's offset from the text.
void SetShadowOffset(int x, int y);
+ // Sets the shadow blur. Default is zero.
+ void set_shadow_blur(double shadow_blur) { shadow_blur_ = shadow_blur; }
+
// Disables shadows.
void ClearEmbellishing();
@@ -267,6 +270,8 @@ class VIEWS_EXPORT Label : public View {
bool auto_color_readability_;
mutable gfx::Size text_size_;
mutable bool text_size_valid_;
+ // Indicates the level of shadow blurring. Default is zero.
+ double shadow_blur_;
int line_height_;
bool is_multi_line_;
bool is_obscured_;
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc
index 1861724d21..a63448d679 100644
--- a/ui/views/controls/menu/menu_controller.cc
+++ b/ui/views/controls/menu/menu_controller.cc
@@ -13,18 +13,21 @@
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
+#include "ui/aura/client/screen_position_client.h"
#include "ui/aura/env.h"
#include "ui/aura/window.h"
#include "ui/aura/window_event_dispatcher.h"
+#include "ui/aura/window_tree_host.h"
#include "ui/base/dragdrop/drag_utils.h"
#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/base/l10n/l10n_util.h"
-#include "ui/events/event_constants.h"
+#include "ui/events/event.h"
#include "ui/events/event_utils.h"
#include "ui/events/platform/platform_event_source.h"
#include "ui/events/platform/scoped_event_dispatcher.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/native_widget_types.h"
+#include "ui/gfx/point.h"
#include "ui/gfx/screen.h"
#include "ui/gfx/vector2d.h"
#include "ui/native_theme/native_theme.h"
@@ -35,9 +38,9 @@
#include "ui/views/controls/menu/menu_scroll_view_container.h"
#include "ui/views/controls/menu/submenu_view.h"
#include "ui/views/drag_utils.h"
-#include "ui/views/event_utils.h"
#include "ui/views/focus/view_storage.h"
#include "ui/views/mouse_constants.h"
+#include "ui/views/view.h"
#include "ui/views/view_constants.h"
#include "ui/views/views_delegate.h"
#include "ui/views/widget/root_view.h"
@@ -56,6 +59,7 @@
#include "ui/views/controls/menu/menu_event_dispatcher_linux.h"
#endif
+using aura::client::ScreenPositionClient;
using base::Time;
using base::TimeDelta;
using ui::OSExchangeData;
@@ -973,14 +977,7 @@ void MenuController::SetSelectionOnPointerDown(SubmenuView* source,
#if defined(OS_WIN)
// We're going to close and we own the mouse capture. We need to repost the
// mouse down, otherwise the window the user clicked on won't get the event.
- if (!state_.item) {
- // We some times get an event after closing all the menus. Ignore it. Make
- // sure the menu is in fact not visible. If the menu is visible, then
- // we're in a bad state where we think the menu isn't visibile but it is.
- DCHECK(!source->GetWidget()->IsVisible());
- } else {
- RepostEvent(source, event);
- }
+ RepostEvent(source, event);
#endif
// And close.
@@ -2145,52 +2142,106 @@ bool MenuController::SelectByChar(base::char16 character) {
void MenuController::RepostEvent(SubmenuView* source,
const ui::LocatedEvent& event) {
+ if (!event.IsMouseEvent()) {
+ // TODO(rbyers): Gesture event repost is tricky to get right
+ // crbug.com/170987.
+ DCHECK(event.IsGestureEvent());
+ return;
+ }
+
+#if defined(OS_WIN)
+ if (!state_.item) {
+ // We some times get an event after closing all the menus. Ignore it. Make
+ // sure the menu is in fact not visible. If the menu is visible, then
+ // we're in a bad state where we think the menu isn't visibile but it is.
+ DCHECK(!source->GetWidget()->IsVisible());
+ return;
+ }
+
+ state_.item->GetRootMenuItem()->GetSubmenu()->ReleaseCapture();
+#endif
+
gfx::Point screen_loc(event.location());
View::ConvertPointToScreen(source->GetScrollViewContainer(), &screen_loc);
-
gfx::NativeView native_view = source->GetWidget()->GetNativeView();
+ if (!native_view)
+ return;
+
gfx::Screen* screen = gfx::Screen::GetScreenFor(native_view);
gfx::NativeWindow window = screen->GetWindowAtScreenPoint(screen_loc);
- // On Windows, it is ok for window to be NULL. Please refer to the
- // RepostLocatedEvent function for more information.
#if defined(OS_WIN)
- // Release the capture.
- SubmenuView* submenu = state_.item->GetRootMenuItem()->GetSubmenu();
- submenu->ReleaseCapture();
-
- gfx::NativeView view = submenu->GetWidget()->GetNativeView();
- if (view && window) {
- DWORD view_tid = GetWindowThreadProcessId(HWNDForNativeView(view), NULL);
- if (view_tid != GetWindowThreadProcessId(HWNDForNativeView(window), NULL)) {
+ // PostMessage() to metro windows isn't allowed (access will be denied). Don't
+ // try to repost with Win32 if the window under the mouse press is in metro.
+ if (!ViewsDelegate::views_delegate ||
+ !ViewsDelegate::views_delegate->IsWindowInMetro(window)) {
+ HWND target_window = window ? HWNDForNativeWindow(window) :
+ WindowFromPoint(screen_loc.ToPOINT());
+ HWND source_window = HWNDForNativeView(native_view);
+ if (!target_window || !source_window ||
+ GetWindowThreadProcessId(source_window, NULL) !=
+ GetWindowThreadProcessId(target_window, NULL)) {
// Even though we have mouse capture, windows generates a mouse event if
// the other window is in a separate thread. Only repost an event if
- // |view| was created on the same thread, else the target window can get
- // double events leading to bad behavior.
+ // |target_window| and |source_window| were created on the same thread,
+ // else double events can occur and lead to bad behavior.
return;
}
+
+ // Determine whether the click was in the client area or not.
+ // NOTE: WM_NCHITTEST coordinates are relative to the screen.
+ LPARAM coords = MAKELPARAM(screen_loc.x(), screen_loc.y());
+ LRESULT nc_hit_result = SendMessage(target_window, WM_NCHITTEST, 0, coords);
+ const bool client_area = nc_hit_result == HTCLIENT;
+
+ // TODO(sky): this isn't right. The event to generate should correspond with
+ // the event we just got. MouseEvent only tells us what is down, which may
+ // differ. Need to add ability to get changed button from MouseEvent.
+ int event_type;
+ int flags = event.flags();
+ if (flags & ui::EF_LEFT_MOUSE_BUTTON) {
+ event_type = client_area ? WM_LBUTTONDOWN : WM_NCLBUTTONDOWN;
+ } else if (flags & ui::EF_MIDDLE_MOUSE_BUTTON) {
+ event_type = client_area ? WM_MBUTTONDOWN : WM_NCMBUTTONDOWN;
+ } else if (flags & ui::EF_RIGHT_MOUSE_BUTTON) {
+ event_type = client_area ? WM_RBUTTONDOWN : WM_NCRBUTTONDOWN;
+ } else {
+ NOTREACHED();
+ return;
+ }
+
+ int window_x = screen_loc.x();
+ int window_y = screen_loc.y();
+ if (client_area) {
+ POINT pt = { window_x, window_y };
+ ScreenToClient(target_window, &pt);
+ window_x = pt.x;
+ window_y = pt.y;
+ }
+
+ WPARAM target = client_area ? event.native_event().wParam : nc_hit_result;
+ LPARAM window_coords = MAKELPARAM(window_x, window_y);
+ PostMessage(target_window, event_type, target, window_coords);
+ return;
}
-#else
+#endif
+ // Non-Windows Aura or |window| is in metro mode.
if (!window)
return;
-#endif
- scoped_ptr<ui::LocatedEvent> clone;
- if (event.IsMouseEvent()) {
- clone.reset(new ui::MouseEvent(static_cast<const ui::MouseEvent&>(event)));
- } else if (event.IsGestureEvent()) {
- // TODO(rbyers): Gesture event repost is tricky to get right
- // crbug.com/170987.
+ aura::Window* root = window->GetRootWindow();
+ ScreenPositionClient* spc = aura::client::GetScreenPositionClient(root);
+ if (!spc)
return;
- } else {
- NOTREACHED();
- return;
- }
- clone->set_location(screen_loc);
- RepostLocatedEvent(window, *clone);
-}
+ gfx::Point root_loc(screen_loc);
+ spc->ConvertPointFromScreen(root, &root_loc);
+ ui::MouseEvent clone(static_cast<const ui::MouseEvent&>(event));
+ clone.set_location(root_loc);
+ clone.set_root_location(root_loc);
+ root->GetHost()->dispatcher()->RepostEvent(clone);
+}
void MenuController::SetDropMenuItem(
MenuItemView* new_target,
diff --git a/ui/views/controls/menu/menu_message_pump_dispatcher_linux.cc b/ui/views/controls/menu/menu_message_pump_dispatcher_linux.cc
deleted file mode 100644
index 0172f8b33d..0000000000
--- a/ui/views/controls/menu/menu_message_pump_dispatcher_linux.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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 "ui/views/controls/menu/menu_message_pump_dispatcher.h"
-
-#include "ui/events/event_utils.h"
-#include "ui/events/keycodes/keyboard_code_conversion.h"
-#include "ui/events/keycodes/keyboard_codes.h"
-#include "ui/views/controls/menu/menu_controller.h"
-
-namespace views {
-namespace internal {
-
-uint32_t MenuMessagePumpDispatcher::Dispatch(const base::NativeEvent& event) {
- if (menu_controller_->exit_type() == MenuController::EXIT_ALL ||
- menu_controller_->exit_type() == MenuController::EXIT_DESTROYED)
- return (POST_DISPATCH_QUIT_LOOP | POST_DISPATCH_PERFORM_DEFAULT);
-
- switch (ui::EventTypeFromNative(event)) {
- case ui::ET_KEY_PRESSED: {
- if (!menu_controller_->OnKeyDown(ui::KeyboardCodeFromNative(event)))
- return POST_DISPATCH_QUIT_LOOP;
-
- // Do not check mnemonics if the Alt or Ctrl modifiers are pressed.
- int flags = ui::EventFlagsFromNative(event);
- if ((flags & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)) == 0) {
- char c = ui::GetCharacterFromKeyCode(ui::KeyboardCodeFromNative(event),
- flags);
- if (menu_controller_->SelectByChar(c))
- return POST_DISPATCH_QUIT_LOOP;
- }
- return POST_DISPATCH_NONE;
- }
- case ui::ET_KEY_RELEASED:
- return POST_DISPATCH_NONE;
- default:
- break;
- }
-
- return POST_DISPATCH_PERFORM_DEFAULT |
- (menu_controller_->exit_type() == MenuController::EXIT_NONE
- ? POST_DISPATCH_NONE
- : POST_DISPATCH_QUIT_LOOP);
-}
-
-} // namespace internal
-} // namespace views
diff --git a/ui/views/controls/tree/tree_view.cc b/ui/views/controls/tree/tree_view.cc
index bf75a65ac3..d5a3911026 100644
--- a/ui/views/controls/tree/tree_view.cc
+++ b/ui/views/controls/tree/tree_view.cc
@@ -79,7 +79,6 @@ TreeView::TreeView()
editable_(true),
controller_(NULL),
root_shown_(true),
- has_custom_icons_(false),
row_height_(font_list_.GetHeight() + kTextVerticalPadding * 2) {
SetFocusable(true);
closed_icon_ = *ui::ResourceBundle::GetSharedInstance().GetImageNamed(
diff --git a/ui/views/controls/tree/tree_view.h b/ui/views/controls/tree/tree_view.h
index 097700a7c4..24780fc051 100644
--- a/ui/views/controls/tree/tree_view.h
+++ b/ui/views/controls/tree/tree_view.h
@@ -374,9 +374,6 @@ class VIEWS_EXPORT TreeView : public ui::TreeModelObserver,
// Whether or not the root is shown in the tree.
bool root_shown_;
- // Did the model return a non-empty set of icons from GetIcons?
- bool has_custom_icons_;
-
// Cached preferred size.
gfx::Size preferred_size_;
diff --git a/ui/views/controls/webview/web_dialog_view.cc b/ui/views/controls/webview/web_dialog_view.cc
index a1f41c1b32..688892c3ae 100644
--- a/ui/views/controls/webview/web_dialog_view.cc
+++ b/ui/views/controls/webview/web_dialog_view.cc
@@ -42,7 +42,6 @@ WebDialogView::WebDialogView(
WebContentsHandler* handler)
: ClientView(NULL, NULL),
WebDialogWebContentsDelegate(context, handler),
- initialized_(false),
delegate_(delegate),
web_view_(new views::WebView(context)),
is_attempting_close_dialog_(false),
diff --git a/ui/views/controls/webview/web_dialog_view.h b/ui/views/controls/webview/web_dialog_view.h
index 902aa3269b..b138abd49b 100644
--- a/ui/views/controls/webview/web_dialog_view.h
+++ b/ui/views/controls/webview/web_dialog_view.h
@@ -122,11 +122,6 @@ class WEBVIEW_EXPORT WebDialogView : public views::ClientView,
// Initializes the contents of the dialog.
void InitDialog();
- // Whether the view is initialized. That is, dialog accelerators is registered
- // and FreezeUpdates property is set to prevent WM from showing the window
- // until the property is removed.
- bool initialized_;
-
// This view is a delegate to the HTML content since it needs to get notified
// about when the dialog is closing. For all other actions (besides dialog
// closing) we delegate to the creator of this view, which we keep track of
diff --git a/ui/views/event_utils.h b/ui/views/event_utils.h
deleted file mode 100644
index 03bf65b9fa..0000000000
--- a/ui/views/event_utils.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2013 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 UI_VIEWS_EVENT_UTILS_H_
-#define UI_VIEWS_EVENT_UTILS_H_
-
-#include "ui/gfx/native_widget_types.h"
-#include "ui/views/views_export.h"
-
-namespace ui {
-class LocatedEvent;
-}
-
-namespace views {
-
-// Reposts a located event natively. Returns false when |event| could not be
-// reposted. |event| should be in screen coordinates. |window| is the target
-// window that the event will be forwarded to. Only some events are supported.
-// On Windows |window| can be NULL, in which case the event is forwarded to
-// the HWND at the current location if it is on the same thread.
-VIEWS_EXPORT bool RepostLocatedEvent(gfx::NativeWindow window,
- const ui::LocatedEvent& event);
-
-#if defined(OS_WIN)
-// Reposts a located event to the HWND passed in.
-VIEWS_EXPORT bool RepostLocatedEventWin(HWND window,
- const ui::LocatedEvent& event);
-#endif
-
-} // namespace views
-
-#endif // UI_VIEWS_EVENT_UTILS_H_
diff --git a/ui/views/event_utils_aura.cc b/ui/views/event_utils_aura.cc
deleted file mode 100644
index 5e93e8e557..0000000000
--- a/ui/views/event_utils_aura.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/views/event_utils.h"
-
-#include "base/logging.h"
-#include "base/memory/scoped_ptr.h"
-#include "ui/aura/client/screen_position_client.h"
-#include "ui/aura/window_event_dispatcher.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/events/event.h"
-#include "ui/gfx/point.h"
-#include "ui/views/views_delegate.h"
-
-using aura::client::ScreenPositionClient;
-
-namespace views {
-
-bool RepostLocatedEvent(gfx::NativeWindow window,
- const ui::LocatedEvent& event) {
-#if defined(OS_WIN)
- // On Windows, if the |window| parameter is NULL, then we attempt to repost
- // the event to the window at the current location, if it is on the current
- // thread.
- HWND target_window = NULL;
- if (!window) {
- target_window = ::WindowFromPoint(event.location().ToPOINT());
- if (::GetWindowThreadProcessId(target_window, NULL) !=
- ::GetCurrentThreadId())
- return false;
- } else {
- if (ViewsDelegate::views_delegate &&
- !ViewsDelegate::views_delegate->IsWindowInMetro(window))
- target_window = window->GetHost()->GetAcceleratedWidget();
- }
- return RepostLocatedEventWin(target_window, event);
-#else
- if (!window)
- return false;
-
- aura::Window* root_window = window->GetRootWindow();
-
- gfx::Point root_loc(event.location());
- ScreenPositionClient* spc =
- aura::client::GetScreenPositionClient(root_window);
- if (!spc)
- return false;
-
- spc->ConvertPointFromScreen(root_window, &root_loc);
-
- scoped_ptr<ui::LocatedEvent> relocated;
- if (!event.IsMouseEvent()) {
- // TODO(rbyers): Gesture event repost is tricky to get right
- // crbug.com/170987.
- DCHECK(event.IsGestureEvent());
- return false;
- }
-
- const ui::MouseEvent& orig = static_cast<const ui::MouseEvent&>(event);
- relocated.reset(new ui::MouseEvent(orig));
- relocated->set_location(root_loc);
- relocated->set_root_location(root_loc);
-
- root_window->GetHost()->dispatcher()->RepostEvent(*relocated);
- return true;
-#endif
-}
-
-} // namespace views
diff --git a/ui/views/event_utils_win.cc b/ui/views/event_utils_win.cc
deleted file mode 100644
index 78cb9df791..0000000000
--- a/ui/views/event_utils_win.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/views/event_utils.h"
-
-#include <windowsx.h>
-
-#include "base/logging.h"
-#include "ui/events/event.h"
-#include "ui/events/event_constants.h"
-#include "ui/gfx/point.h"
-
-namespace views {
-
-bool RepostLocatedEventWin(HWND window,
- const ui::LocatedEvent& event) {
- if (!window)
- return false;
-
- // Determine whether the click was in the client area or not.
- // NOTE: WM_NCHITTEST coordinates are relative to the screen.
- const gfx::Point screen_loc = event.location();
- LRESULT nc_hit_result = SendMessage(window, WM_NCHITTEST, 0,
- MAKELPARAM(screen_loc.x(),
- screen_loc.y()));
- const bool in_client_area = nc_hit_result == HTCLIENT;
-
- // TODO(sky): this isn't right. The event to generate should correspond with
- // the event we just got. MouseEvent only tells us what is down, which may
- // differ. Need to add ability to get changed button from MouseEvent.
- int event_type;
- int flags = event.flags();
- if (flags & ui::EF_LEFT_MOUSE_BUTTON) {
- event_type = in_client_area ? WM_LBUTTONDOWN : WM_NCLBUTTONDOWN;
- } else if (flags & ui::EF_MIDDLE_MOUSE_BUTTON) {
- event_type = in_client_area ? WM_MBUTTONDOWN : WM_NCMBUTTONDOWN;
- } else if (flags & ui::EF_RIGHT_MOUSE_BUTTON) {
- event_type = in_client_area ? WM_RBUTTONDOWN : WM_NCRBUTTONDOWN;
- } else {
- NOTREACHED();
- return false;
- }
-
- int window_x = screen_loc.x();
- int window_y = screen_loc.y();
- if (in_client_area) {
- POINT pt = {window_x, window_y};
- ScreenToClient(window, &pt);
- window_x = pt.x;
- window_y = pt.y;
- }
-
- WPARAM target = in_client_area ? event.native_event().wParam : nc_hit_result;
- PostMessage(window, event_type, target, MAKELPARAM(window_x, window_y));
- return true;
-}
-
-} // namespace views
diff --git a/ui/views/layout/grid_layout.cc b/ui/views/layout/grid_layout.cc
index 9466c5160d..e28a1b7235 100644
--- a/ui/views/layout/grid_layout.cc
+++ b/ui/views/layout/grid_layout.cc
@@ -162,7 +162,6 @@ class Column : public LayoutElement {
GridLayout::SizeType size_type,
int fixed_width,
int min_width,
- size_t index,
bool is_padding)
: LayoutElement(resize_percent),
h_align_(h_align),
@@ -171,7 +170,6 @@ class Column : public LayoutElement {
same_size_column_(-1),
fixed_width_(fixed_width),
min_width_(min_width),
- index_(index),
is_padding_(is_padding),
master_column_(NULL) {}
@@ -201,9 +199,6 @@ class Column : public LayoutElement {
const int fixed_width_;
const int min_width_;
- // Index of this column in the ColumnSet.
- const size_t index_;
-
const bool is_padding_;
// If multiple columns have their sizes linked, one is the
@@ -264,10 +259,8 @@ void Column::AdjustSize(int size) {
class Row : public LayoutElement {
public:
- Row(bool fixed_height, int height, float resize_percent,
- ColumnSet* column_set)
+ Row(int height, float resize_percent, ColumnSet* column_set)
: LayoutElement(resize_percent),
- fixed_height_(fixed_height),
height_(height),
column_set_(column_set),
max_ascent_(0),
@@ -301,7 +294,6 @@ class Row : public LayoutElement {
}
private:
- const bool fixed_height_;
const int height_;
// The column set used for this row; null for padding rows.
ColumnSet* column_set_;
@@ -422,8 +414,7 @@ void ColumnSet::AddColumn(GridLayout::Alignment h_align,
int min_width,
bool is_padding) {
Column* column = new Column(h_align, v_align, resize_percent, size_type,
- fixed_width, min_width, columns_.size(),
- is_padding);
+ fixed_width, min_width, is_padding);
columns_.push_back(column);
}
@@ -718,11 +709,11 @@ void GridLayout::StartRowWithPadding(float vertical_resize, int column_set_id,
void GridLayout::StartRow(float vertical_resize, int column_set_id) {
ColumnSet* column_set = GetColumnSet(column_set_id);
DCHECK(column_set);
- AddRow(new Row(false, 0, vertical_resize, column_set));
+ AddRow(new Row(0, vertical_resize, column_set));
}
void GridLayout::AddPaddingRow(float vertical_resize, int pixel_count) {
- AddRow(new Row(true, pixel_count, vertical_resize, NULL));
+ AddRow(new Row(pixel_count, vertical_resize, NULL));
}
void GridLayout::SkipColumns(int col_count) {
diff --git a/ui/views/metrics_aura.cc b/ui/views/metrics_aura.cc
index 03aa832f01..046baa892c 100644
--- a/ui/views/metrics_aura.cc
+++ b/ui/views/metrics_aura.cc
@@ -11,7 +11,6 @@
namespace {
// Default double click interval in milliseconds.
-// Same as what gtk uses.
const int kDefaultDoubleClickInterval = 500;
} // namespace
diff --git a/ui/views/test/test_views_delegate.cc b/ui/views/test/test_views_delegate.cc
index 47c1d66cae..d68eb3fa5c 100644
--- a/ui/views/test/test_views_delegate.cc
+++ b/ui/views/test/test_views_delegate.cc
@@ -4,15 +4,8 @@
#include "ui/views/test/test_views_delegate.h"
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "content/public/test/web_contents_tester.h"
#include "ui/wm/core/wm_state.h"
-#if !defined(OS_CHROMEOS)
-#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
-#include "ui/views/widget/native_widget_aura.h"
-#endif
namespace views {
@@ -31,50 +24,14 @@ void TestViewsDelegate::SetUseTransparentWindows(bool transparent) {
use_transparent_windows_ = transparent;
}
-void TestViewsDelegate::SaveWindowPlacement(const Widget* window,
- const std::string& window_name,
- const gfx::Rect& bounds,
- ui::WindowShowState show_state) {
-}
-
-bool TestViewsDelegate::GetSavedWindowPlacement(
- const Widget* window,
- const std::string& window_name,
- gfx::Rect* bounds,
- ui:: WindowShowState* show_state) const {
- return false;
-}
-
-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-gfx::ImageSkia* TestViewsDelegate::GetDefaultWindowIcon() const {
- return NULL;
-}
-#endif
-
-NonClientFrameView* TestViewsDelegate::CreateDefaultNonClientFrameView(
- Widget* widget) {
- return NULL;
-}
-
-content::WebContents* TestViewsDelegate::CreateWebContents(
- content::BrowserContext* browser_context,
- content::SiteInstance* site_instance) {
- return NULL;
-}
-
void TestViewsDelegate::OnBeforeWidgetInit(
Widget::InitParams* params,
internal::NativeWidgetDelegate* delegate) {
if (params->opacity == Widget::InitParams::INFER_OPACITY) {
- if (use_transparent_windows_)
- params->opacity = Widget::InitParams::TRANSLUCENT_WINDOW;
- else
- params->opacity = Widget::InitParams::OPAQUE_WINDOW;
+ params->opacity = use_transparent_windows_ ?
+ Widget::InitParams::TRANSLUCENT_WINDOW :
+ Widget::InitParams::OPAQUE_WINDOW;
}
}
-base::TimeDelta TestViewsDelegate::GetDefaultTextfieldObscuredRevealDuration() {
- return base::TimeDelta();
-}
-
} // namespace views
diff --git a/ui/views/test/test_views_delegate.h b/ui/views/test/test_views_delegate.h
index 3642160c16..52f11a0d14 100644
--- a/ui/views/test/test_views_delegate.h
+++ b/ui/views/test/test_views_delegate.h
@@ -5,24 +5,14 @@
#ifndef UI_VIEWS_TEST_TEST_VIEWS_DELEGATE_H_
#define UI_VIEWS_TEST_TEST_VIEWS_DELEGATE_H_
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
-#include "build/build_config.h"
-#include "ui/accessibility/ax_enums.h"
#include "ui/views/views_delegate.h"
-namespace ui {
-class Clipboard;
-}
-
namespace wm {
class WMState;
}
namespace views {
-class View;
-class Widget;
class TestViewsDelegate : public ViewsDelegate {
public:
@@ -31,51 +21,13 @@ class TestViewsDelegate : public ViewsDelegate {
void SetUseTransparentWindows(bool transparent);
- // Overridden from ViewsDelegate:
- virtual void SaveWindowPlacement(const Widget* window,
- const std::string& window_name,
- const gfx::Rect& bounds,
- ui::WindowShowState show_state) OVERRIDE;
- virtual bool GetSavedWindowPlacement(
- const Widget* window,
- const std::string& window_name,
- gfx::Rect* bounds,
- ui::WindowShowState* show_state) const OVERRIDE;
-
- virtual void NotifyAccessibilityEvent(
- View* view, ui::AXEvent event_type) OVERRIDE {}
-
- virtual void NotifyMenuItemFocused(const base::string16& menu_name,
- const base::string16& menu_item_name,
- int item_index,
- int item_count,
- bool has_submenu) OVERRIDE {}
-#if defined(OS_WIN)
- virtual HICON GetDefaultWindowIcon() const OVERRIDE {
- return NULL;
- }
-
- virtual bool IsWindowInMetro(gfx::NativeWindow window) const {
- return false;
- }
-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
- virtual gfx::ImageSkia* GetDefaultWindowIcon() const OVERRIDE;
-#endif
- virtual NonClientFrameView* CreateDefaultNonClientFrameView(
- Widget* widget) OVERRIDE;
- virtual void AddRef() OVERRIDE {}
- virtual void ReleaseRef() OVERRIDE {}
- virtual content::WebContents* CreateWebContents(
- content::BrowserContext* browser_context,
- content::SiteInstance* site_instance) OVERRIDE;
+ // ViewsDelegate:
virtual void OnBeforeWidgetInit(
Widget::InitParams* params,
internal::NativeWidgetDelegate* delegate) OVERRIDE;
- virtual base::TimeDelta GetDefaultTextfieldObscuredRevealDuration() OVERRIDE;
private:
bool use_transparent_windows_;
-
scoped_ptr<wm::WMState> wm_state_;
DISALLOW_COPY_AND_ASSIGN(TestViewsDelegate);
diff --git a/ui/views/view.cc b/ui/views/view.cc
index 763714ed83..43b7ba964d 100644
--- a/ui/views/view.cc
+++ b/ui/views/view.cc
@@ -2148,6 +2148,15 @@ bool View::ProcessMousePressed(const ui::MouseEvent& event) {
context_menu_controller_ : 0;
View::DragInfo* drag_info = GetDragInfo();
+ // TODO(sky): for debugging 360238.
+ int storage_id = 0;
+ if (event.IsOnlyRightMouseButton() && context_menu_controller &&
+ kContextMenuOnMousePress && HitTestPoint(event.location())) {
+ ViewStorage* view_storage = ViewStorage::GetInstance();
+ storage_id = view_storage->CreateStorageID();
+ view_storage->StoreView(storage_id, this);
+ }
+
const bool enabled = enabled_;
const bool result = OnMousePressed(event);
@@ -2160,6 +2169,8 @@ bool View::ProcessMousePressed(const ui::MouseEvent& event) {
// from mouse pressed.
gfx::Point location(event.location());
if (HitTestPoint(location)) {
+ if (storage_id != 0)
+ CHECK_EQ(this, ViewStorage::GetInstance()->RetrieveView(storage_id));
ConvertPointToScreen(this, &location);
ShowContextMenu(location, ui::MENU_SOURCE_MOUSE);
return true;
diff --git a/ui/views/view_aura.cc b/ui/views/view_aura.cc
index 006f1da284..ce60963de1 100644
--- a/ui/views/view_aura.cc
+++ b/ui/views/view_aura.cc
@@ -7,11 +7,9 @@
namespace {
// Default horizontal drag threshold in pixels.
-// Same as what gtk uses.
const int kDefaultHorizontalDragThreshold = 8;
// Default vertical drag threshold in pixels.
-// Same as what gtk uses.
const int kDefaultVerticalDragThreshold = 8;
} // namespace
diff --git a/ui/views/views.gyp b/ui/views/views.gyp
index 4f5e4e44ed..f553d25d3e 100644
--- a/ui/views/views.gyp
+++ b/ui/views/views.gyp
@@ -29,7 +29,7 @@
'../gfx/gfx.gyp:gfx_geometry',
'../native_theme/native_theme.gyp:native_theme',
'../resources/ui_resources.gyp:ui_resources',
- '../wm/wm.gyp:wm_core',
+ '../wm/wm.gyp:wm',
],
'export_dependent_settings': [
'../accessibility/accessibility.gyp:ax_gen',
@@ -232,9 +232,6 @@
'drag_controller.h',
'drag_utils.cc',
'drag_utils.h',
- 'event_utils.h',
- 'event_utils_aura.cc',
- 'event_utils_win.cc',
'focus/external_focus_tracker.cc',
'focus/external_focus_tracker.h',
'focus/focus_manager.cc',
@@ -389,8 +386,6 @@
'widget/widget_removals_observer.h',
'widget/window_reorderer.cc',
'widget/window_reorderer.h',
- 'win/appbar.cc',
- 'win/appbar.h',
'win/fullscreen_handler.cc',
'win/fullscreen_handler.h',
'win/hwnd_message_handler.cc',
@@ -436,7 +431,7 @@
}],
['chromeos==0 and use_x11==1', {
'dependencies': [
- '../display/display.gyp:display',
+ '../display/display.gyp:display_util',
],
}],
['OS=="linux" and chromeos==0', {
@@ -516,7 +511,7 @@
'../events/events.gyp:events',
'../gfx/gfx.gyp:gfx',
'../gfx/gfx.gyp:gfx_geometry',
- '../wm/wm.gyp:wm_core',
+ '../wm/wm.gyp:wm',
'views',
],
'include_dirs': [
@@ -572,6 +567,7 @@
'../aura/aura.gyp:aura_test_support',
'../base/strings/ui_strings.gyp:ui_strings',
'../base/ui_base.gyp:ui_base',
+ '../base/ui_base.gyp:ui_base_test_support',
'../compositor/compositor.gyp:compositor',
'../compositor/compositor.gyp:compositor_test_support',
'../events/events.gyp:events',
@@ -579,8 +575,7 @@
'../gfx/gfx.gyp:gfx_geometry',
'../resources/ui_resources.gyp:ui_resources',
'../resources/ui_resources.gyp:ui_test_pak',
- '../ui_unittests.gyp:ui_test_support',
- '../wm/wm.gyp:wm_core',
+ '../wm/wm.gyp:wm',
'views',
'views_test_support',
],
diff --git a/ui/views/views_delegate.cc b/ui/views/views_delegate.cc
index 6552dd786e..d7bd03173d 100644
--- a/ui/views/views_delegate.cc
+++ b/ui/views/views_delegate.cc
@@ -17,8 +17,75 @@ ViewsDelegate::~ViewsDelegate() {
ui::TouchSelectionControllerFactory::SetInstance(NULL);
}
+void ViewsDelegate::SaveWindowPlacement(const Widget* widget,
+ const std::string& window_name,
+ const gfx::Rect& bounds,
+ ui::WindowShowState show_state) {
+}
+
+bool ViewsDelegate::GetSavedWindowPlacement(
+ const Widget* widget,
+ const std::string& window_name,
+ gfx::Rect* bounds,
+ ui::WindowShowState* show_state) const {
+ return false;
+}
+
+void ViewsDelegate::NotifyAccessibilityEvent(View* view,
+ ui::AXEvent event_type) {
+}
+
+void ViewsDelegate::NotifyMenuItemFocused(const base::string16& menu_name,
+ const base::string16& menu_item_name,
+ int item_index,
+ int item_count,
+ bool has_submenu) {
+}
+
+#if defined(OS_WIN)
+HICON ViewsDelegate::GetDefaultWindowIcon() const {
+ return NULL;
+}
+
+bool ViewsDelegate::IsWindowInMetro(gfx::NativeWindow window) const {
+ return false;
+}
+#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
+gfx::ImageSkia* ViewsDelegate::GetDefaultWindowIcon() const {
+ return NULL;
+}
+#endif
+
+NonClientFrameView* ViewsDelegate::CreateDefaultNonClientFrameView(
+ Widget* widget) {
+ return NULL;
+}
+
+void ViewsDelegate::AddRef() {
+}
+
+void ViewsDelegate::ReleaseRef() {
+}
+
+content::WebContents* ViewsDelegate::CreateWebContents(
+ content::BrowserContext* browser_context,
+ content::SiteInstance* site_instance) {
+ return NULL;
+}
+
+base::TimeDelta ViewsDelegate::GetDefaultTextfieldObscuredRevealDuration() {
+ return base::TimeDelta();
+}
+
bool ViewsDelegate::WindowManagerProvidesTitleBar(bool maximized) {
return false;
}
+#if defined(OS_WIN)
+int ViewsDelegate::GetAppbarAutohideEdges(HMONITOR monitor,
+ const base::Closure& callback) {
+ return EDGE_BOTTOM;
+}
+#endif
+
} // namespace views
diff --git a/ui/views/views_delegate.h b/ui/views/views_delegate.h
index 4201dbb61d..8be8a0d584 100644
--- a/ui/views/views_delegate.h
+++ b/ui/views/views_delegate.h
@@ -52,11 +52,16 @@ class NativeWidgetDelegate;
// implementation.
class VIEWS_EXPORT ViewsDelegate {
public:
- // The active ViewsDelegate used by the views system.
- static ViewsDelegate* views_delegate;
+#if defined(OS_WIN)
+ enum AppbarAutohideEdge {
+ EDGE_TOP = 1 << 0,
+ EDGE_LEFT = 1 << 1,
+ EDGE_BOTTOM = 1 << 2,
+ EDGE_RIGHT = 1 << 3,
+ };
+#endif
ViewsDelegate();
-
virtual ~ViewsDelegate();
// Saves the position, size and "show" state for the window with the
@@ -64,19 +69,16 @@ class VIEWS_EXPORT ViewsDelegate {
virtual void SaveWindowPlacement(const Widget* widget,
const std::string& window_name,
const gfx::Rect& bounds,
- ui::WindowShowState show_state) = 0;
+ ui::WindowShowState show_state);
// Retrieves the saved position and size and "show" state for the window with
// the specified name.
- virtual bool GetSavedWindowPlacement(
- const Widget* widget,
- const std::string& window_name,
- gfx::Rect* bounds,
- ui::WindowShowState* show_state) const = 0;
+ virtual bool GetSavedWindowPlacement(const Widget* widget,
+ const std::string& window_name,
+ gfx::Rect* bounds,
+ ui::WindowShowState* show_state) const;
- virtual void NotifyAccessibilityEvent(
- View* view,
- ui::AXEvent event_type) = 0;
+ virtual void NotifyAccessibilityEvent(View* view, ui::AXEvent event_type);
// For accessibility, notify the delegate that a menu item was focused
// so that alternate feedback (speech / magnified text) can be provided.
@@ -84,40 +86,39 @@ class VIEWS_EXPORT ViewsDelegate {
const base::string16& menu_item_name,
int item_index,
int item_count,
- bool has_submenu) = 0;
+ bool has_submenu);
#if defined(OS_WIN)
// Retrieves the default window icon to use for windows if none is specified.
- virtual HICON GetDefaultWindowIcon() const = 0;
+ virtual HICON GetDefaultWindowIcon() const;
// Returns true if the window passed in is in the Windows 8 metro
// environment.
- virtual bool IsWindowInMetro(gfx::NativeWindow window) const = 0;
+ virtual bool IsWindowInMetro(gfx::NativeWindow window) const;
#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
- virtual gfx::ImageSkia* GetDefaultWindowIcon() const = 0;
+ virtual gfx::ImageSkia* GetDefaultWindowIcon() const;
#endif
// Creates a default NonClientFrameView to be used for windows that don't
// specify their own. If this function returns NULL, the
// views::CustomFrameView type will be used.
- virtual NonClientFrameView* CreateDefaultNonClientFrameView(
- Widget* widget) = 0;
+ virtual NonClientFrameView* CreateDefaultNonClientFrameView(Widget* widget);
// AddRef/ReleaseRef are invoked while a menu is visible. They are used to
// ensure we don't attempt to exit while a menu is showing.
- virtual void AddRef() = 0;
- virtual void ReleaseRef() = 0;
+ virtual void AddRef();
+ virtual void ReleaseRef();
// Creates a web contents. This will return NULL unless overriden.
virtual content::WebContents* CreateWebContents(
content::BrowserContext* browser_context,
- content::SiteInstance* site_instance) = 0;
+ content::SiteInstance* site_instance);
// Gives the platform a chance to modify the properties of a Widget.
virtual void OnBeforeWidgetInit(Widget::InitParams* params,
internal::NativeWidgetDelegate* delegate) = 0;
// Returns the default obscured text reveal duration.
- virtual base::TimeDelta GetDefaultTextfieldObscuredRevealDuration() = 0;
+ virtual base::TimeDelta GetDefaultTextfieldObscuredRevealDuration();
// Returns true if the operating system's window manager will always provide a
// title bar with caption buttons (ignoring the setting to
@@ -125,8 +126,24 @@ class VIEWS_EXPORT ViewsDelegate {
// maximized windows; otherwise to restored windows.
virtual bool WindowManagerProvidesTitleBar(bool maximized);
+#if defined(OS_WIN)
+ // Starts a query for the appbar autohide edges of the specified monitor and
+ // returns the current value. If the query finds the edges have changed from
+ // the current value, |callback| is subsequently invoked. If the edges have
+ // not changed, |callback| is never run.
+ //
+ // The return value is a bitmask of AppbarAutohideEdge.
+ virtual int GetAppbarAutohideEdges(HMONITOR monitor,
+ const base::Closure& callback);
+#endif
+
+ // The active ViewsDelegate used by the views system.
+ static ViewsDelegate* views_delegate;
+
private:
scoped_ptr<ViewsTouchSelectionControllerFactory> views_tsc_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(ViewsDelegate);
};
} // namespace views
diff --git a/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc b/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
index 9dc300b263..f07140a6d1 100644
--- a/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
+++ b/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc
@@ -9,7 +9,6 @@
#include "base/event_types.h"
#include "base/lazy_instance.h"
#include "base/message_loop/message_loop.h"
-#include "base/message_loop/message_pump_dispatcher.h"
#include "ui/aura/window.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/clipboard/clipboard.h"
@@ -621,12 +620,12 @@ void DesktopDragDropClientAuraX11::OnXdndDrop(
void DesktopDragDropClientAuraX11::OnSelectionNotify(
const XSelectionEvent& xselection) {
- if (!target_current_context_) {
- NOTIMPLEMENTED();
- return;
- }
+ if (target_current_context_)
+ target_current_context_->OnSelectionNotify(xselection);
- target_current_context_->OnSelectionNotify(xselection);
+ // ICCCM requires us to delete the property passed into SelectionNotify.
+ if (xselection.property != None)
+ XDeleteProperty(xdisplay_, xwindow_, xselection.property);
}
int DesktopDragDropClientAuraX11::StartDragAndDrop(
diff --git a/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc b/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc
index ec898fbc18..187aa6e612 100644
--- a/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc
+++ b/ui/views/widget/desktop_aura/desktop_native_cursor_manager.cc
@@ -40,7 +40,8 @@ void DesktopNativeCursorManager::SetDisplay(
const gfx::Display& display,
wm::NativeCursorManagerDelegate* delegate) {
cursor_loader_->UnloadAll();
- cursor_loader_->set_display(display);
+ cursor_loader_->set_rotation(display.rotation());
+ cursor_loader_->set_scale(display.device_scale_factor());
if (cursor_loader_updater_.get())
cursor_loader_updater_->OnDisplayUpdated(display, cursor_loader_.get());
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
index 12aec9272d..914c1d24a8 100644
--- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
+++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
@@ -437,9 +437,8 @@ void DesktopNativeWidgetAura::InitNativeWidget(
// handed way of accomplishing focus.
// No event filter for aura::Env. Create CompoundEvnetFilter per
// WindowEventDispatcher.
- root_window_event_filter_ = new wm::CompoundEventFilter;
- // Pass ownership of the filter to the root_window.
- host_->window()->SetEventFilter(root_window_event_filter_);
+ root_window_event_filter_.reset(new wm::CompoundEventFilter);
+ host_->window()->AddPreTargetHandler(root_window_event_filter_.get());
// The host's dispatcher must be added to |native_cursor_manager_| before
// OnNativeWidgetCreated() is called.
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
index 85a0a3a28e..8735ac0773 100644
--- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
+++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.h
@@ -83,7 +83,7 @@ class VIEWS_EXPORT DesktopNativeWidgetAura
return input_method_event_filter_.get();
}
wm::CompoundEventFilter* root_window_event_filter() {
- return root_window_event_filter_;
+ return root_window_event_filter_.get();
}
aura::WindowTreeHost* host() {
return host_.get();
@@ -280,7 +280,7 @@ class VIEWS_EXPORT DesktopNativeWidgetAura
scoped_ptr<FocusManagerEventHandler> focus_manager_event_handler_;
// Toplevel event filter which dispatches to other event filters.
- wm::CompoundEventFilter* root_window_event_filter_;
+ scoped_ptr<wm::CompoundEventFilter> root_window_event_filter_;
scoped_ptr<wm::InputMethodEventFilter> input_method_event_filter_;
diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11.cc b/ui/views/widget/desktop_aura/desktop_screen_x11.cc
index 0e6858bd08..99ca833d9a 100644
--- a/ui/views/widget/desktop_aura/desktop_screen_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_screen_x11.cc
@@ -16,8 +16,8 @@
#include "ui/aura/window_event_dispatcher.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/layout.h"
-#include "ui/display/display_util.h"
-#include "ui/display/x11/edid_parser_x11.h"
+#include "ui/display/util/display_util.h"
+#include "ui/display/util/x11/edid_parser_x11.h"
#include "ui/events/platform/platform_event_source.h"
#include "ui/gfx/display.h"
#include "ui/gfx/display_observer.h"
@@ -141,7 +141,9 @@ DesktopScreenX11::DesktopScreenX11()
ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
XRRSelectInput(xdisplay_,
x_root_window_,
- RRScreenChangeNotifyMask | RROutputChangeNotifyMask);
+ RRScreenChangeNotifyMask |
+ RROutputChangeNotifyMask |
+ RRCrtcChangeNotifyMask);
displays_ = BuildDisplaysFromXRandRInfo();
} else {
diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc b/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc
index d0c0a8631c..b0f4c81939 100644
--- a/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc
+++ b/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc
@@ -8,9 +8,12 @@
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/aura/client/aura_constants.h"
+#include "ui/aura/test/event_generator.h"
#include "ui/aura/window.h"
#include "ui/aura/window_event_dispatcher.h"
#include "ui/aura/window_tree_host.h"
+#include "ui/base/hit_test.h"
#include "ui/base/x/x11_util.h"
#include "ui/events/platform/platform_event_dispatcher.h"
#include "ui/events/platform/platform_event_source.h"
@@ -21,6 +24,34 @@
#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h"
+namespace {
+
+// Class which allows for the designation of non-client component targets of
+// hit tests.
+class TestDesktopNativeWidgetAura : public views::DesktopNativeWidgetAura {
+ public:
+ explicit TestDesktopNativeWidgetAura(
+ views::internal::NativeWidgetDelegate* delegate)
+ : views::DesktopNativeWidgetAura(delegate) {}
+ virtual ~TestDesktopNativeWidgetAura() {}
+
+ void set_window_component(int window_component) {
+ window_component_ = window_component;
+ }
+
+ // DesktopNativeWidgetAura:
+ virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE {
+ return window_component_;
+ }
+
+ private:
+ int window_component_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestDesktopNativeWidgetAura);
+};
+
+} // namespace
+
namespace views {
const int64 kFirstDisplay = 5321829;
@@ -125,12 +156,18 @@ class DesktopScreenX11Test : public views::ViewsTestBase,
removed_display_.clear();
}
- Widget* BuildTopLevelDesktopWidget(const gfx::Rect& bounds) {
+ Widget* BuildTopLevelDesktopWidget(const gfx::Rect& bounds,
+ bool use_test_native_widget) {
Widget* toplevel = new Widget;
Widget::InitParams toplevel_params =
CreateParams(Widget::InitParams::TYPE_WINDOW);
- toplevel_params.native_widget =
- new views::DesktopNativeWidgetAura(toplevel);
+ if (use_test_native_widget) {
+ toplevel_params.native_widget =
+ new TestDesktopNativeWidgetAura(toplevel);
+ } else {
+ toplevel_params.native_widget =
+ new views::DesktopNativeWidgetAura(toplevel);
+ }
toplevel_params.bounds = bounds;
toplevel_params.remove_standard_frame = true;
toplevel->Init(toplevel_params);
@@ -275,10 +312,12 @@ TEST_F(DesktopScreenX11Test, GetPrimaryDisplay) {
}
TEST_F(DesktopScreenX11Test, GetWindowAtScreenPoint) {
- Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(110, 110, 10, 10));
- Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(150, 150, 10, 10));
+ Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(110, 110, 10, 10),
+ false);
+ Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(150, 150, 10, 10),
+ false);
Widget* window_three =
- BuildTopLevelDesktopWidget(gfx::Rect(115, 115, 20, 20));
+ BuildTopLevelDesktopWidget(gfx::Rect(115, 115, 20, 20), false);
window_three->Show();
window_two->Show();
@@ -317,8 +356,10 @@ TEST_F(DesktopScreenX11Test, GetDisplayNearestWindow) {
gfx::Rect(640, 0, 1024, 768)));
screen()->ProcessDisplayChange(displays);
- Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(10, 10, 10, 10));
- Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(650, 50, 10, 10));
+ Widget* window_one = BuildTopLevelDesktopWidget(gfx::Rect(10, 10, 10, 10),
+ false);
+ Widget* window_two = BuildTopLevelDesktopWidget(gfx::Rect(650, 50, 10, 10),
+ false);
EXPECT_EQ(
kFirstDisplay,
@@ -331,4 +372,87 @@ TEST_F(DesktopScreenX11Test, GetDisplayNearestWindow) {
window_two->CloseNow();
}
+// Tests that the window is maximized in response to a double click event.
+TEST_F(DesktopScreenX11Test, DoubleClickHeaderMaximizes) {
+ Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true);
+ widget->Show();
+ TestDesktopNativeWidgetAura* native_widget =
+ static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget());
+ native_widget->set_window_component(HTCAPTION);
+
+ aura::Window* window = widget->GetNativeWindow();
+ window->SetProperty(aura::client::kCanMaximizeKey, true);
+
+ // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized
+ DesktopWindowTreeHost* rwh =
+ DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()->
+ GetAcceleratedWidget());
+
+ aura::test::EventGenerator generator(window);
+ generator.ClickLeftButton();
+ generator.DoubleClickLeftButton();
+ RunPendingMessages();
+ EXPECT_TRUE(rwh->IsMaximized());
+
+ widget->CloseNow();
+}
+
+// Tests that the window does not maximize in response to a double click event,
+// if the first click was to a different target component than that of the
+// second click.
+TEST_F(DesktopScreenX11Test, DoubleClickTwoDifferentTargetsDoesntMaximizes) {
+ Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true);
+ widget->Show();
+ TestDesktopNativeWidgetAura* native_widget =
+ static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget());
+
+ aura::Window* window = widget->GetNativeWindow();
+ window->SetProperty(aura::client::kCanMaximizeKey, true);
+
+ // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized
+ DesktopWindowTreeHost* rwh =
+ DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()->
+ GetAcceleratedWidget());
+
+ aura::test::EventGenerator generator(window);
+ native_widget->set_window_component(HTCLIENT);
+ generator.ClickLeftButton();
+ native_widget->set_window_component(HTCAPTION);
+ generator.DoubleClickLeftButton();
+ RunPendingMessages();
+ EXPECT_FALSE(rwh->IsMaximized());
+
+ widget->CloseNow();
+}
+
+// Tests that the window does not maximize in response to a double click event,
+// if the double click was interrupted by a right click.
+TEST_F(DesktopScreenX11Test, RightClickDuringDoubleClickDoesntMaximize) {
+ Widget* widget = BuildTopLevelDesktopWidget(gfx::Rect(0, 0, 100, 100), true);
+ widget->Show();
+ TestDesktopNativeWidgetAura* native_widget =
+ static_cast<TestDesktopNativeWidgetAura*>(widget->native_widget());
+
+ aura::Window* window = widget->GetNativeWindow();
+ window->SetProperty(aura::client::kCanMaximizeKey, true);
+
+ // Cast to superclass as DesktopWindowTreeHostX11 hide IsMaximized
+ DesktopWindowTreeHost* rwh = static_cast<DesktopWindowTreeHost*>(
+ DesktopWindowTreeHostX11::GetHostForXID(window->GetHost()->
+ GetAcceleratedWidget()));
+
+ aura::test::EventGenerator generator(window);
+ native_widget->set_window_component(HTCLIENT);
+ generator.ClickLeftButton();
+ native_widget->set_window_component(HTCAPTION);
+ generator.PressRightButton();
+ generator.ReleaseRightButton();
+ EXPECT_FALSE(rwh->IsMaximized());
+ generator.DoubleClickLeftButton();
+ RunPendingMessages();
+ EXPECT_FALSE(rwh->IsMaximized());
+
+ widget->CloseNow();
+}
+
} // namespace views
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
index 221d1843af..efd24b6b76 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
@@ -34,6 +34,7 @@
#include "ui/gfx/insets.h"
#include "ui/gfx/path.h"
#include "ui/gfx/path_x11.h"
+#include "ui/gfx/screen.h"
#include "ui/native_theme/native_theme.h"
#include "ui/views/corewm/tooltip_aura.h"
#include "ui/views/ime/input_method.h"
@@ -342,8 +343,9 @@ void DesktopWindowTreeHostX11::ShowWindowWithState(
void DesktopWindowTreeHostX11::ShowMaximizedWithBounds(
const gfx::Rect& restored_bounds) {
- restored_bounds_ = restored_bounds;
ShowWindowWithState(ui::SHOW_STATE_MAXIMIZED);
+ // Enforce |restored_bounds_| since calling Maximize() could have reset it.
+ restored_bounds_ = restored_bounds;
}
bool DesktopWindowTreeHostX11::IsVisible() const {
@@ -484,9 +486,9 @@ bool DesktopWindowTreeHostX11::IsActive() const {
}
void DesktopWindowTreeHostX11::Maximize() {
- // When we're the process requesting the maximizing, we can accurately keep
- // track of our restored bounds instead of relying on the heuristics that are
- // in the PropertyNotify and ConfigureNotify handlers.
+ // When we are in the process of requesting to maximize a window, we can
+ // accurately keep track of our restored bounds instead of relying on the
+ // heuristics that are in the PropertyNotify and ConfigureNotify handlers.
restored_bounds_ = bounds_;
SetWMSpecState(true,
@@ -614,10 +616,27 @@ NonClientFrameView* DesktopWindowTreeHostX11::CreateNonClientFrameView() {
}
void DesktopWindowTreeHostX11::SetFullscreen(bool fullscreen) {
+ if (is_fullscreen_ == fullscreen)
+ return;
is_fullscreen_ = fullscreen;
SetWMSpecState(fullscreen,
atom_cache_.GetAtom("_NET_WM_STATE_FULLSCREEN"),
None);
+ // Try to guess the size we will have after the switch to/from fullscreen:
+ // - (may) avoid transient states
+ // - works around Flash content which expects to have the size updated
+ // synchronously.
+ // See https://crbug.com/361408
+ if (fullscreen) {
+ restored_bounds_ = bounds_;
+ const gfx::Display display =
+ gfx::Screen::GetScreenFor(NULL)->GetDisplayNearestWindow(window());
+ bounds_ = display.bounds();
+ } else {
+ bounds_ = restored_bounds_;
+ }
+ OnHostMoved(bounds_.origin());
+ OnHostResized(bounds_.size());
}
bool DesktopWindowTreeHostX11::IsFullscreen() const {
@@ -1316,8 +1335,6 @@ uint32_t DesktopWindowTreeHostX11::DispatchEvent(
switch (xev->type) {
case EnterNotify:
case LeaveNotify: {
- if (!g_current_capture)
- X11DesktopHandler::get()->ProcessXEvent(xev);
ui::MouseEvent mouse_event(xev);
DispatchMouseEvent(&mouse_event);
break;
@@ -1365,6 +1382,7 @@ uint32_t DesktopWindowTreeHostX11::DispatchEvent(
if (xev->xfocus.mode != NotifyGrab) {
ReleaseCapture();
OnHostLostWindowCapture();
+ X11DesktopHandler::get()->ProcessXEvent(xev);
} else {
dispatcher()->OnHostLostMouseGrab();
}
diff --git a/ui/views/widget/desktop_aura/x11_desktop_handler.cc b/ui/views/widget/desktop_aura/x11_desktop_handler.cc
index 170b5f790c..0d764e4f87 100644
--- a/ui/views/widget/desktop_aura/x11_desktop_handler.cc
+++ b/ui/views/widget/desktop_aura/x11_desktop_handler.cc
@@ -104,21 +104,14 @@ bool X11DesktopHandler::IsActiveWindow(::Window window) const {
void X11DesktopHandler::ProcessXEvent(XEvent* event) {
switch (event->type) {
- case EnterNotify:
- if (event->xcrossing.focus == True &&
- current_window_ != event->xcrossing.window)
- OnActiveWindowChanged(event->xcrossing.window);
- break;
- case LeaveNotify:
- if (event->xcrossing.focus == False &&
- current_window_ == event->xcrossing.window)
- OnActiveWindowChanged(None);
- break;
case FocusIn:
- if (event->xfocus.mode == NotifyNormal &&
- current_window_ != event->xfocus.window)
+ if (current_window_ != event->xfocus.window)
OnActiveWindowChanged(event->xfocus.window);
break;
+ case FocusOut:
+ if (current_window_ == event->xfocus.window)
+ OnActiveWindowChanged(None);
+ break;
default:
NOTREACHED();
}
diff --git a/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc b/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc
index 250b9de849..e465174db8 100644
--- a/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc
+++ b/ui/views/widget/desktop_aura/x11_whole_screen_move_loop.cc
@@ -131,6 +131,8 @@ uint32_t X11WholeScreenMoveLoop::DispatchEvent(const ui::PlatformEvent& event) {
bool X11WholeScreenMoveLoop::RunMoveLoop(aura::Window* source,
gfx::NativeCursor cursor) {
+ DCHECK(!in_move_loop_); // Can only handle one nested loop at a time.
+
// Start a capture on the host, so that it continues to receive events during
// the drag. This may be second time we are capturing the mouse events - the
// first being when a mouse is first pressed. That first capture needs to be
@@ -140,23 +142,21 @@ bool X11WholeScreenMoveLoop::RunMoveLoop(aura::Window* source,
{
ScopedCapturer capturer(source->GetHost());
- DCHECK(!in_move_loop_); // Can only handle one nested loop at a time.
- in_move_loop_ = true;
-
- XDisplay* display = gfx::GetXDisplay();
-
- grab_input_window_ = CreateDragInputWindow(display);
- if (!drag_image_.isNull() && CheckIfIconValid())
- CreateDragImageWindow();
- ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
+ grab_input_window_ = CreateDragInputWindow(gfx::GetXDisplay());
// Releasing ScopedCapturer ensures that any other instance of
// X11ScopedCapture will not prematurely release grab that will be acquired
// below.
}
// TODO(varkha): Consider integrating GrabPointerAndKeyboard with
// ScopedCapturer to avoid possibility of logically keeping multiple grabs.
- if (!GrabPointerAndKeyboard(cursor))
+ if (!GrabPointerAndKeyboard(cursor)) {
+ XDestroyWindow(gfx::GetXDisplay(), grab_input_window_);
return false;
+ }
+
+ ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
+ if (!drag_image_.isNull() && CheckIfIconValid())
+ CreateDragImageWindow();
// We are handling a mouse drag outside of the aura::RootWindow system. We
// must manually make aura think that the mouse button is pressed so that we
@@ -167,6 +167,7 @@ bool X11WholeScreenMoveLoop::RunMoveLoop(aura::Window* source,
should_reset_mouse_flags_ = true;
}
+ in_move_loop_ = true;
canceled_ = false;
base::MessageLoopForUI* loop = base::MessageLoopForUI::current();
base::MessageLoop::ScopedNestableTaskAllower allow_nested(loop);
diff --git a/ui/views/widget/desktop_aura/x11_window_event_filter.cc b/ui/views/widget/desktop_aura/x11_window_event_filter.cc
index d6fbfc0fbd..887bb979e0 100644
--- a/ui/views/widget/desktop_aura/x11_window_event_filter.cc
+++ b/ui/views/widget/desktop_aura/x11_window_event_filter.cc
@@ -68,7 +68,8 @@ X11WindowEventFilter::X11WindowEventFilter(
x_root_window_(DefaultRootWindow(xdisplay_)),
atom_cache_(xdisplay_, kAtomsToCache),
window_tree_host_(window_tree_host),
- is_active_(false) {
+ is_active_(false),
+ click_component_(HTNOWHERE) {
}
X11WindowEventFilter::~X11WindowEventFilter() {
@@ -102,8 +103,13 @@ void X11WindowEventFilter::OnMouseEvent(ui::MouseEvent* event) {
if (!target->delegate())
return;
+ int previous_click_component = HTNOWHERE;
int component =
target->delegate()->GetNonClientComponent(event->location());
+ if (event->IsLeftMouseButton()) {
+ previous_click_component = click_component_;
+ click_component_ = component;
+ }
if (component == HTCLIENT)
return;
@@ -134,15 +140,18 @@ void X11WindowEventFilter::OnMouseEvent(ui::MouseEvent* event) {
}
// Left button case.
- if (event->flags() & ui::EF_IS_DOUBLE_CLICK &&
- component == HTCAPTION &&
- target->GetProperty(aura::client::kCanMaximizeKey)) {
- // Our event is a double click in the caption area in a window that can be
- // maximized. We are responsible for dispatching this as a minimize/
- // maximize on X11 (Windows converts this to min/max events for us).
- ToggleMaximizedState();
- event->SetHandled();
- return;
+ if (event->flags() & ui::EF_IS_DOUBLE_CLICK) {
+ click_component_ = HTNOWHERE;
+ if (component == HTCAPTION &&
+ target->GetProperty(aura::client::kCanMaximizeKey) &&
+ previous_click_component == component) {
+ // Our event is a double click in the caption area in a window that can be
+ // maximized. We are responsible for dispatching this as a minimize/
+ // maximize on X11 (Windows converts this to min/max events for us).
+ ToggleMaximizedState();
+ event->SetHandled();
+ return;
+ }
}
// Get the |x_root_window_| location out of the native event.
diff --git a/ui/views/widget/desktop_aura/x11_window_event_filter.h b/ui/views/widget/desktop_aura/x11_window_event_filter.h
index 47bc69fc91..5c7e72229b 100644
--- a/ui/views/widget/desktop_aura/x11_window_event_filter.h
+++ b/ui/views/widget/desktop_aura/x11_window_event_filter.h
@@ -60,6 +60,13 @@ class VIEWS_EXPORT X11WindowEventFilter : public ui::EventHandler {
// True if |xwindow_| is the current _NET_ACTIVE_WINDOW.
bool is_active_;
+ // The non-client component for the target of a MouseEvent. Mouse events can
+ // be destructive to the window tree, which can cause the component of a
+ // ui::EF_IS_DOUBLE_CLICK event to no longer be the same as that of the
+ // initial click. Acting on a double click should only occur for matching
+ // components.
+ int click_component_;
+
DISALLOW_COPY_AND_ASSIGN(X11WindowEventFilter);
};
diff --git a/ui/views/widget/monitor_win.cc b/ui/views/widget/monitor_win.cc
index 2c6d830447..1220671beb 100644
--- a/ui/views/widget/monitor_win.cc
+++ b/ui/views/widget/monitor_win.cc
@@ -4,10 +4,9 @@
#include "ui/views/widget/monitor_win.h"
-#include <shellapi.h>
+#include <windows.h>
#include "base/logging.h"
-#include "base/win/win_util.h"
#include "ui/gfx/rect.h"
namespace views {
@@ -16,8 +15,7 @@ gfx::Rect GetMonitorBoundsForRect(const gfx::Rect& rect) {
RECT p_rect = rect.ToRECT();
HMONITOR monitor = MonitorFromRect(&p_rect, MONITOR_DEFAULTTONEAREST);
if (monitor) {
- MONITORINFO mi = {0};
- mi.cbSize = sizeof(mi);
+ MONITORINFO mi = { sizeof(MONITORINFO) };
GetMonitorInfo(monitor, &mi);
return gfx::Rect(mi.rcWork);
}
@@ -25,15 +23,4 @@ gfx::Rect GetMonitorBoundsForRect(const gfx::Rect& rect) {
return gfx::Rect();
}
-HWND GetTopmostAutoHideTaskbarForEdge(UINT edge, HMONITOR monitor) {
- // NOTE: this may be invoked on a background thread.
- APPBARDATA taskbar_data = { sizeof(APPBARDATA), NULL, 0, edge };
- HWND taskbar = reinterpret_cast<HWND>(SHAppBarMessage(ABM_GETAUTOHIDEBAR,
- &taskbar_data));
- return (::IsWindow(taskbar) && (monitor != NULL) &&
- (MonitorFromWindow(taskbar, MONITOR_DEFAULTTONULL) == monitor) &&
- (GetWindowLong(taskbar, GWL_EXSTYLE) & WS_EX_TOPMOST)) ?
- taskbar : NULL;
-}
-
} // namespace views
diff --git a/ui/views/widget/monitor_win.h b/ui/views/widget/monitor_win.h
index 87bdc4e00c..ef4d3dde61 100644
--- a/ui/views/widget/monitor_win.h
+++ b/ui/views/widget/monitor_win.h
@@ -5,8 +5,6 @@
#ifndef UI_VIEWS_WIDGET_MONITOR_WIN_H_
#define UI_VIEWS_WIDGET_MONITOR_WIN_H_
-#include <windows.h>
-
#include "ui/views/views_export.h"
namespace gfx {
@@ -19,14 +17,6 @@ namespace views {
// intersection with the specified rectangle.
VIEWS_EXPORT gfx::Rect GetMonitorBoundsForRect(const gfx::Rect& rect);
-// Returns the always-on-top auto-hiding taskbar for edge |edge| (one of
-// ABE_LEFT, TOP, RIGHT, or BOTTOM) of monitor |monitor|. NULL is returned
-// if nothing is found.
-//
-// WARNING: this function spawns a nested message loop. Use Appbar instead if
-// possible.
-VIEWS_EXPORT HWND GetTopmostAutoHideTaskbarForEdge(UINT edge, HMONITOR monitor);
-
} // namespace views
#endif // UI_VIEWS_WIDGET_MONITOR_WIN_H_
diff --git a/ui/views/win/appbar.cc b/ui/views/win/appbar.cc
deleted file mode 100644
index 92151d4775..0000000000
--- a/ui/views/win/appbar.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/views/win/appbar.h"
-
-#include <shellapi.h>
-
-#include "base/auto_reset.h"
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/threading/worker_pool.h"
-#include "base/win/scoped_com_initializer.h"
-#include "ui/views/widget/monitor_win.h"
-
-namespace views {
-
-namespace {
-
-void GetEdgesOnWorkerThread(HMONITOR monitor, int* edge) {
- base::win::ScopedCOMInitializer com_initializer;
- *edge = 0;
- if (GetTopmostAutoHideTaskbarForEdge(ABE_LEFT, monitor))
- *edge = Appbar::EDGE_LEFT;
- if (GetTopmostAutoHideTaskbarForEdge(ABE_TOP, monitor))
- *edge = Appbar::EDGE_TOP;
- if (GetTopmostAutoHideTaskbarForEdge(ABE_RIGHT, monitor))
- *edge = Appbar::EDGE_RIGHT;
- if (GetTopmostAutoHideTaskbarForEdge(ABE_BOTTOM, monitor))
- *edge = Appbar::EDGE_BOTTOM;
-}
-
-}
-
-// static
-Appbar* Appbar::instance() {
- static Appbar* appbar = NULL;
- if (!appbar)
- appbar = new Appbar();
- return appbar;
-}
-
-int Appbar::GetAutohideEdges(HMONITOR monitor, const base::Closure& callback) {
- // Initialize the map with EDGE_BOTTOM. This is important, as if we return an
- // initial value of 0 (no auto-hide edges) then we'll go fullscreen and
- // windows will automatically remove WS_EX_TOPMOST from the appbar resulting
- // in us thinking there is no auto-hide edges. By returning at least one edge
- // we don't initially go fullscreen until we figure out the real auto-hide
- // edges.
- if (edge_map_.find(monitor) == edge_map_.end())
- edge_map_[monitor] = Appbar::EDGE_BOTTOM;
- if (!in_callback_) {
- int* edge = new int;
- base::WorkerPool::PostTaskAndReply(
- FROM_HERE,
- base::Bind(&GetEdgesOnWorkerThread,
- monitor,
- base::Unretained(edge)),
- base::Bind(&Appbar::OnGotEdges,
- weak_factory_.GetWeakPtr(),
- callback,
- monitor,
- edge_map_[monitor],
- base::Owned(edge)),
- false);
- }
- return edge_map_[monitor];
-}
-
-Appbar::Appbar() : weak_factory_(this), in_callback_(false) {
-}
-
-Appbar::~Appbar() {
-}
-
-void Appbar::OnGotEdges(const base::Closure& callback,
- HMONITOR monitor,
- int returned_edges,
- int* edges) {
- edge_map_[monitor] = *edges;
- if (returned_edges == *edges)
- return;
-
- base::AutoReset<bool> in_callback_setter(&in_callback_, true);
- callback.Run();
-}
-
-} // namespace views
diff --git a/ui/views/win/appbar.h b/ui/views/win/appbar.h
deleted file mode 100644
index 4c24c19254..0000000000
--- a/ui/views/win/appbar.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2013 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 UI_VIEWS_WIN_APPBAR_H_
-#define UI_VIEWS_WIN_APPBAR_H_
-
-#include <map>
-
-#include <windows.h>
-
-#include "base/basictypes.h"
-#include "base/callback_forward.h"
-#include "base/memory/weak_ptr.h"
-
-namespace views {
-
-// Appbar provides an API to query for the edges of the monitor that have an
-// autohide bar.
-// NOTE: querying is done on a separate thread as it spawns a nested message
-// loop. The nested message loop is particularly problematic here as it's
-// possible for the nested message loop to run during window creation and
-// startup time (WM_NCCALCSIZE is called at creation time).
-class Appbar {
- public:
- enum Edge {
- EDGE_TOP = 1 << 0,
- EDGE_LEFT = 1 << 1,
- EDGE_BOTTOM = 1 << 2,
- EDGE_RIGHT = 1 << 3,
- };
-
- // Returns the singleton instance.
- static Appbar* instance();
-
- // Starts a query for the autohide edges of the specified monitor and returns
- // the current value. If the edges have changed |callback| is subsequently
- // invoked. If the edges have not changed |callback| is never run.
- //
- // Return value is a bitmask of Edges.
- int GetAutohideEdges(HMONITOR monitor, const base::Closure& callback);
-
- private:
- typedef std::map<HMONITOR, int> EdgeMap;
-
- Appbar();
- ~Appbar();
-
- // Callback on main thread with the edges. |returned_edges| is the value that
- // was returned from the call to GetAutohideEdges() that initiated the lookup.
- void OnGotEdges(const base::Closure& callback,
- HMONITOR monitor,
- int returned_edges,
- int* edges);
-
- EdgeMap edge_map_;
-
- base::WeakPtrFactory<Appbar> weak_factory_;
-
- // If true we're in the process of notifying a callback. When true we do not
- // start a new query.
- bool in_callback_;
-
- DISALLOW_COPY_AND_ASSIGN(Appbar);
-};
-
-} // namespace views
-
-#endif // UI_VIEWS_WIN_APPBAR_H_
-
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
index a647d207b2..e2c9a132da 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -38,7 +38,6 @@
#include "ui/views/views_delegate.h"
#include "ui/views/widget/monitor_win.h"
#include "ui/views/widget/widget_hwnd_utils.h"
-#include "ui/views/win/appbar.h"
#include "ui/views/win/fullscreen_handler.h"
#include "ui/views/win/hwnd_message_handler_delegate.h"
#include "ui/views/win/scoped_fullscreen_visibility.h"
@@ -971,10 +970,12 @@ LRESULT HWNDMessageHandler::HandleNcHitTestMessage(unsigned int message,
int HWNDMessageHandler::GetAppbarAutohideEdges(HMONITOR monitor) {
autohide_factory_.InvalidateWeakPtrs();
- return Appbar::instance()->GetAutohideEdges(
- monitor,
- base::Bind(&HWNDMessageHandler::OnAppbarAutohideEdgesChanged,
- autohide_factory_.GetWeakPtr()));
+ return ViewsDelegate::views_delegate ?
+ ViewsDelegate::views_delegate->GetAppbarAutohideEdges(
+ monitor,
+ base::Bind(&HWNDMessageHandler::OnAppbarAutohideEdgesChanged,
+ autohide_factory_.GetWeakPtr())) :
+ ViewsDelegate::EDGE_BOTTOM;
}
void HWNDMessageHandler::OnAppbarAutohideEdgesChanged() {
@@ -1089,7 +1090,8 @@ bool HWNDMessageHandler::GetClientAreaInsets(gfx::Insets* insets) const {
if (IsMaximized()) {
// Windows automatically adds a standard width border to all sides when a
// window is maximized.
- int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME);
+ int border_thickness =
+ GetSystemMetrics(SM_CXSIZEFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
if (remove_standard_frame_)
border_thickness -= 1;
*insets = gfx::Insets(
@@ -1667,9 +1669,9 @@ LRESULT HWNDMessageHandler::OnNCCalcSize(BOOL mode, LPARAM l_param) {
}
}
const int autohide_edges = GetAppbarAutohideEdges(monitor);
- if (autohide_edges & Appbar::EDGE_LEFT)
+ if (autohide_edges & ViewsDelegate::EDGE_LEFT)
client_rect->left += kAutoHideTaskbarThicknessPx;
- if (autohide_edges & Appbar::EDGE_TOP) {
+ if (autohide_edges & ViewsDelegate::EDGE_TOP) {
if (!delegate_->IsUsingCustomFrame()) {
// Tricky bit. Due to a bug in DwmDefWindowProc()'s handling of
// WM_NCHITTEST, having any nonclient area atop the window causes the
@@ -1685,9 +1687,9 @@ LRESULT HWNDMessageHandler::OnNCCalcSize(BOOL mode, LPARAM l_param) {
client_rect->top += kAutoHideTaskbarThicknessPx;
}
}
- if (autohide_edges & Appbar::EDGE_RIGHT)
+ if (autohide_edges & ViewsDelegate::EDGE_RIGHT)
client_rect->right -= kAutoHideTaskbarThicknessPx;
- if (autohide_edges & Appbar::EDGE_BOTTOM)
+ if (autohide_edges & ViewsDelegate::EDGE_BOTTOM)
client_rect->bottom -= kAutoHideTaskbarThicknessPx;
// We cannot return WVR_REDRAW when there is nonclient area, or Windows
@@ -1757,8 +1759,10 @@ LRESULT HWNDMessageHandler::OnNCHitTest(const gfx::Point& point) {
// the vertical scrollar down arrow would be drawn.
// We check if the hittest coordinates lie in this region and if yes
// we return HTCLIENT.
- int border_width = ::GetSystemMetrics(SM_CXSIZEFRAME);
- int border_height = ::GetSystemMetrics(SM_CYSIZEFRAME);
+ int border_width = ::GetSystemMetrics(SM_CXSIZEFRAME) +
+ GetSystemMetrics(SM_CXPADDEDBORDER);
+ int border_height = ::GetSystemMetrics(SM_CYSIZEFRAME) +
+ GetSystemMetrics(SM_CXPADDEDBORDER);
int scroll_width = ::GetSystemMetrics(SM_CXVSCROLL);
int scroll_height = ::GetSystemMetrics(SM_CYVSCROLL);
RECT window_rect;
@@ -2221,7 +2225,8 @@ void HWNDMessageHandler::OnWindowPosChanging(WINDOWPOS* window_pos) {
new_window_rect = monitor_rect;
} else if (IsMaximized()) {
new_window_rect = work_area;
- int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME);
+ int border_thickness = GetSystemMetrics(SM_CXSIZEFRAME) +
+ GetSystemMetrics(SM_CXPADDEDBORDER);
new_window_rect.Inset(-border_thickness, -border_thickness);
} else {
new_window_rect = gfx::Rect(window_rect);
diff --git a/ui/views/win/hwnd_message_handler.h b/ui/views/win/hwnd_message_handler.h
index 9b29b1df71..f4fc19a220 100644
--- a/ui/views/win/hwnd_message_handler.h
+++ b/ui/views/win/hwnd_message_handler.h
@@ -229,11 +229,13 @@ class VIEWS_EXPORT HWNDMessageHandler :
WPARAM w_param,
LPARAM l_param) OVERRIDE;
- // Returns the auto-hide edges of the appbar. See Appbar::GetAutohideEdges()
- // for details. If the edges change OnAppbarAutohideEdgesChanged() is called.
+ // Returns the auto-hide edges of the appbar. See
+ // ViewsDelegate::GetAppbarAutohideEdges() for details. If the edges change,
+ // OnAppbarAutohideEdgesChanged() is called.
int GetAppbarAutohideEdges(HMONITOR monitor);
- // Callback if the autohide edges have changed. See Appbar for details.
+ // Callback if the autohide edges have changed. See
+ // ViewsDelegate::GetAppbarAutohideEdges() for details.
void OnAppbarAutohideEdgesChanged();
// Can be called after the delegate has had the opportunity to set focus and
diff --git a/ui/webui/resources/js/cr/ui/list.js b/ui/webui/resources/js/cr/ui/list.js
index 1dc38b6dc2..3f1d1a84f3 100644
--- a/ui/webui/resources/js/cr/ui/list.js
+++ b/ui/webui/resources/js/cr/ui/list.js
@@ -631,6 +631,7 @@ cr.define('cr.ui', function() {
}
}
this.cachedItems_ = newCachedItems;
+ this.pinnedItem_ = null;
var newCachedItemHeights = {};
for (var index in this.cachedItemHeights_) {
diff --git a/ui/wm/core/base_focus_rules.h b/ui/wm/core/base_focus_rules.h
index 7195dad1e7..07dfb65fbc 100644
--- a/ui/wm/core/base_focus_rules.h
+++ b/ui/wm/core/base_focus_rules.h
@@ -13,7 +13,7 @@ namespace wm {
// A set of basic focus and activation rules. Specializations should most likely
// subclass this and call up to these methods rather than reimplementing them.
-class WM_CORE_EXPORT BaseFocusRules : public FocusRules {
+class WM_EXPORT BaseFocusRules : public FocusRules {
protected:
BaseFocusRules();
virtual ~BaseFocusRules();
diff --git a/ui/wm/core/capture_controller.h b/ui/wm/core/capture_controller.h
index a368b63cca..d8028183e2 100644
--- a/ui/wm/core/capture_controller.h
+++ b/ui/wm/core/capture_controller.h
@@ -11,12 +11,12 @@
#include "base/compiler_specific.h"
#include "ui/aura/client/capture_client.h"
#include "ui/aura/window_observer.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace wm {
// Internal CaptureClient implementation. See ScopedCaptureClient for details.
-class WM_CORE_EXPORT CaptureController : public aura::client::CaptureClient {
+class WM_EXPORT CaptureController : public aura::client::CaptureClient {
public:
// Adds |root| to the list of RootWindows notified when capture changes.
void Attach(aura::Window* root);
@@ -53,7 +53,7 @@ class WM_CORE_EXPORT CaptureController : public aura::client::CaptureClient {
// ScopedCaptureClient is responsible for creating a CaptureClient for a
// RootWindow. Specifically it creates a single CaptureController that is shared
// among all ScopedCaptureClients and adds the RootWindow to it.
-class WM_CORE_EXPORT ScopedCaptureClient : public aura::WindowObserver {
+class WM_EXPORT ScopedCaptureClient : public aura::WindowObserver {
public:
explicit ScopedCaptureClient(aura::Window* root);
virtual ~ScopedCaptureClient();
diff --git a/ui/wm/core/compound_event_filter.cc b/ui/wm/core/compound_event_filter.cc
index 21270e3561..d1f652c02f 100644
--- a/ui/wm/core/compound_event_filter.cc
+++ b/ui/wm/core/compound_event_filter.cc
@@ -30,8 +30,7 @@ namespace {
bool ShouldHideCursorOnTouch(const ui::TouchEvent& event) {
#if defined(OS_WIN)
return true;
-#endif // defind(OS_WIN)
-#if defined(OS_CHROMEOS)
+#elif defined(OS_CHROMEOS)
#if defined(USE_X11)
int device_id = event.source_device_id();
if (device_id >= 0 &&
diff --git a/ui/wm/core/compound_event_filter.h b/ui/wm/core/compound_event_filter.h
index 4b726730f6..ab4fdf83d0 100644
--- a/ui/wm/core/compound_event_filter.h
+++ b/ui/wm/core/compound_event_filter.h
@@ -10,7 +10,7 @@
#include "ui/events/event.h"
#include "ui/events/event_handler.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace aura {
class CursorManager;
@@ -37,7 +37,7 @@ namespace wm {
// consumed by any of those filters. If an event is consumed by a filter, the
// rest of the filter(s) and CompoundEventFilter will not see the consumed
// event.
-class WM_CORE_EXPORT CompoundEventFilter : public ui::EventHandler {
+class WM_EXPORT CompoundEventFilter : public ui::EventHandler {
public:
CompoundEventFilter();
virtual ~CompoundEventFilter();
diff --git a/ui/wm/core/cursor_manager.h b/ui/wm/core/cursor_manager.h
index 0fe25f76ca..f60ef14174 100644
--- a/ui/wm/core/cursor_manager.h
+++ b/ui/wm/core/cursor_manager.h
@@ -14,7 +14,7 @@
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/point.h"
#include "ui/wm/core/native_cursor_manager_delegate.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace gfx {
class Display;
@@ -36,8 +36,8 @@ class NativeCursorManager;
// requests to queue any further changes until a later time. It sends changes
// to the NativeCursorManager, which communicates back to us when these changes
// were made through the NativeCursorManagerDelegate interface.
-class WM_CORE_EXPORT CursorManager : public aura::client::CursorClient,
- public NativeCursorManagerDelegate {
+class WM_EXPORT CursorManager : public aura::client::CursorClient,
+ public NativeCursorManagerDelegate {
public:
explicit CursorManager(scoped_ptr<NativeCursorManager> delegate);
virtual ~CursorManager();
diff --git a/ui/wm/core/easy_resize_window_targeter.h b/ui/wm/core/easy_resize_window_targeter.h
index fae6d4680c..90b0848fc0 100644
--- a/ui/wm/core/easy_resize_window_targeter.h
+++ b/ui/wm/core/easy_resize_window_targeter.h
@@ -7,13 +7,13 @@
#include "ui/aura/window_targeter.h"
#include "ui/gfx/geometry/insets.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace wm {
// An EventTargeter for a container window that uses a slightly larger
// hit-target region for easier resize.
-class WM_CORE_EXPORT EasyResizeWindowTargeter : public aura::WindowTargeter {
+class WM_EXPORT EasyResizeWindowTargeter : public aura::WindowTargeter {
public:
// |container| window is the owner of this targeter.
EasyResizeWindowTargeter(aura::Window* container,
diff --git a/ui/wm/core/focus_controller.h b/ui/wm/core/focus_controller.h
index fecdd2e329..3366ea0c18 100644
--- a/ui/wm/core/focus_controller.h
+++ b/ui/wm/core/focus_controller.h
@@ -12,8 +12,8 @@
#include "ui/aura/client/focus_client.h"
#include "ui/aura/window_observer.h"
#include "ui/events/event_handler.h"
-#include "ui/wm/core/wm_core_export.h"
#include "ui/wm/public/activation_client.h"
+#include "ui/wm/wm_export.h"
namespace wm {
@@ -34,10 +34,10 @@ class FocusRules;
// . Window disposition changes (implemented here in aura::WindowObserver).
// (The FocusController registers itself as an observer of the active and
// focused windows).
-class WM_CORE_EXPORT FocusController : public aura::client::ActivationClient,
- public aura::client::FocusClient,
- public ui::EventHandler,
- public aura::WindowObserver {
+class WM_EXPORT FocusController : public aura::client::ActivationClient,
+ public aura::client::FocusClient,
+ public ui::EventHandler,
+ public aura::WindowObserver {
public:
// |rules| cannot be NULL.
explicit FocusController(FocusRules* rules);
diff --git a/ui/wm/core/focus_rules.h b/ui/wm/core/focus_rules.h
index 79ffd74422..cb9a4ddbd8 100644
--- a/ui/wm/core/focus_rules.h
+++ b/ui/wm/core/focus_rules.h
@@ -5,7 +5,7 @@
#ifndef UI_WM_CORE_FOCUS_RULES_H_
#define UI_WM_CORE_FOCUS_RULES_H_
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace aura {
class Window;
@@ -15,7 +15,7 @@ namespace wm {
// Implemented by an object that establishes the rules about what can be
// focused or activated.
-class WM_CORE_EXPORT FocusRules {
+class WM_EXPORT FocusRules {
public:
virtual ~FocusRules() {}
diff --git a/ui/wm/core/image_grid.h b/ui/wm/core/image_grid.h
index 49ac642987..bee1e46745 100644
--- a/ui/wm/core/image_grid.h
+++ b/ui/wm/core/image_grid.h
@@ -12,7 +12,7 @@
#include "ui/compositor/layer_delegate.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/size.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace gfx {
class Image;
@@ -56,10 +56,10 @@ namespace wm {
// | xXX|
// ...
//
-class WM_CORE_EXPORT ImageGrid {
+class WM_EXPORT ImageGrid {
public:
// Helper class for use by tests.
- class WM_CORE_EXPORT TestAPI {
+ class WM_EXPORT TestAPI {
public:
TestAPI(ImageGrid* grid) : grid_(grid) {}
diff --git a/ui/wm/core/input_method_event_filter.h b/ui/wm/core/input_method_event_filter.h
index 17a6a0e814..c4033d1268 100644
--- a/ui/wm/core/input_method_event_filter.h
+++ b/ui/wm/core/input_method_event_filter.h
@@ -11,7 +11,7 @@
#include "ui/base/ime/input_method_delegate.h"
#include "ui/events/event_handler.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace ui {
class EventProcessor;
@@ -22,7 +22,7 @@ namespace wm {
// An event filter that forwards a KeyEvent to a system IME, and dispatches a
// TranslatedKeyEvent to the root window as needed.
-class WM_CORE_EXPORT InputMethodEventFilter
+class WM_EXPORT InputMethodEventFilter
: public ui::EventHandler,
public ui::internal::InputMethodDelegate {
public:
diff --git a/ui/wm/core/input_method_event_filter_unittest.cc b/ui/wm/core/input_method_event_filter_unittest.cc
index 038ec00993..6fc1b393fb 100644
--- a/ui/wm/core/input_method_event_filter_unittest.cc
+++ b/ui/wm/core/input_method_event_filter_unittest.cc
@@ -27,35 +27,36 @@ namespace wm {
typedef aura::test::AuraTestBase InputMethodEventFilterTest;
TEST_F(InputMethodEventFilterTest, TestInputMethodProperty) {
- CompoundEventFilter* root_filter = new CompoundEventFilter;
- root_window()->SetEventFilter(root_filter);
+ CompoundEventFilter root_filter;
+ root_window()->AddPreTargetHandler(&root_filter);
InputMethodEventFilter input_method_event_filter(
host()->GetAcceleratedWidget());
- root_filter->AddHandler(&input_method_event_filter);
+ root_filter.AddHandler(&input_method_event_filter);
// Tests if InputMethodEventFilter adds a window property on its
// construction.
EXPECT_TRUE(root_window()->GetProperty(
aura::client::kRootWindowInputMethodKey));
- root_filter->RemoveHandler(&input_method_event_filter);
+ root_filter.RemoveHandler(&input_method_event_filter);
+ root_window()->RemovePreTargetHandler(&root_filter);
}
// Tests if InputMethodEventFilter dispatches a ui::ET_TRANSLATED_KEY_* event to
// the root window.
TEST_F(InputMethodEventFilterTest, TestInputMethodKeyEventPropagation) {
- CompoundEventFilter* root_filter = new CompoundEventFilter;
- root_window()->SetEventFilter(root_filter);
+ CompoundEventFilter root_filter;
+ root_window()->AddPreTargetHandler(&root_filter);
// Add the InputMethodEventFilter before the TestEventFilter.
InputMethodEventFilter input_method_event_filter(
host()->GetAcceleratedWidget());
- root_filter->AddHandler(&input_method_event_filter);
+ root_filter.AddHandler(&input_method_event_filter);
// Add TestEventFilter to the RootWindow.
ui::test::TestEventHandler test_filter;
- root_filter->AddHandler(&test_filter);
+ root_filter.AddHandler(&test_filter);
// We need an active window. Otherwise, the root window will not forward a key
// event to event filters.
@@ -79,11 +80,12 @@ TEST_F(InputMethodEventFilterTest, TestInputMethodKeyEventPropagation) {
generator.ReleaseKey(ui::VKEY_SPACE, 0);
EXPECT_EQ(2, test_filter.num_key_events());
- root_filter->RemoveHandler(&input_method_event_filter);
- root_filter->RemoveHandler(&test_filter);
+ root_filter.RemoveHandler(&input_method_event_filter);
+ root_filter.RemoveHandler(&test_filter);
// Reset window before |test_delegate| gets deleted.
window.reset();
+ root_window()->RemovePreTargetHandler(&root_filter);
}
} // namespace wm
diff --git a/ui/wm/core/masked_window_targeter.h b/ui/wm/core/masked_window_targeter.h
index 846021a6ba..46cf4d272d 100644
--- a/ui/wm/core/masked_window_targeter.h
+++ b/ui/wm/core/masked_window_targeter.h
@@ -6,7 +6,7 @@
#define UI_WM_CORE_MASKED_WINDOW_TARGETER_H_
#include "ui/aura/window_targeter.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace gfx {
class Path;
@@ -14,7 +14,7 @@ class Path;
namespace wm {
-class WM_CORE_EXPORT MaskedWindowTargeter : public aura::WindowTargeter {
+class WM_EXPORT MaskedWindowTargeter : public aura::WindowTargeter {
public:
explicit MaskedWindowTargeter(aura::Window* masked_window);
virtual ~MaskedWindowTargeter();
diff --git a/ui/wm/core/native_cursor_manager.h b/ui/wm/core/native_cursor_manager.h
index 669772889b..c1da74d569 100644
--- a/ui/wm/core/native_cursor_manager.h
+++ b/ui/wm/core/native_cursor_manager.h
@@ -7,7 +7,7 @@
#include "base/strings/string16.h"
#include "ui/wm/core/native_cursor_manager_delegate.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace gfx {
class Display;
@@ -19,7 +19,7 @@ namespace wm {
// requested changes to cursor state. When requested, implementer should tell
// the CursorManager of any actual state changes performed through the
// delegate.
-class WM_CORE_EXPORT NativeCursorManager {
+class WM_EXPORT NativeCursorManager {
public:
virtual ~NativeCursorManager() {}
diff --git a/ui/wm/core/native_cursor_manager_delegate.h b/ui/wm/core/native_cursor_manager_delegate.h
index aad982561a..1393b2cd4b 100644
--- a/ui/wm/core/native_cursor_manager_delegate.h
+++ b/ui/wm/core/native_cursor_manager_delegate.h
@@ -7,14 +7,14 @@
#include "ui/base/cursor/cursor.h"
#include "ui/gfx/native_widget_types.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace wm {
// The non-public interface that CursorManager exposes to its users. This
// gives accessors to all the current state, and mutators to all the current
// state.
-class WM_CORE_EXPORT NativeCursorManagerDelegate {
+class WM_EXPORT NativeCursorManagerDelegate {
public:
virtual ~NativeCursorManagerDelegate() {}
diff --git a/ui/wm/core/shadow.h b/ui/wm/core/shadow.h
index fa42976858..c153ecf158 100644
--- a/ui/wm/core/shadow.h
+++ b/ui/wm/core/shadow.h
@@ -9,7 +9,7 @@
#include "base/memory/scoped_ptr.h"
#include "ui/compositor/layer_animation_observer.h"
#include "ui/gfx/rect.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace ui {
class Layer;
@@ -20,7 +20,7 @@ namespace wm {
class ImageGrid;
// Simple class that draws a drop shadow around content at given bounds.
-class WM_CORE_EXPORT Shadow : public ui::ImplicitAnimationObserver {
+class WM_EXPORT Shadow : public ui::ImplicitAnimationObserver {
public:
enum Style {
// Active windows have more opaque shadows, shifted down to make the window
diff --git a/ui/wm/core/shadow_controller.h b/ui/wm/core/shadow_controller.h
index 47aa7435dc..c84689453f 100644
--- a/ui/wm/core/shadow_controller.h
+++ b/ui/wm/core/shadow_controller.h
@@ -10,8 +10,8 @@
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
-#include "ui/wm/core/wm_core_export.h"
#include "ui/wm/public/activation_change_observer.h"
+#include "ui/wm/wm_export.h"
namespace aura {
class Window;
@@ -31,10 +31,10 @@ class Shadow;
// shadows as needed. ShadowController itself is light weight and per
// ActivationClient. ShadowController delegates to its implementation class,
// which observes all window creation.
-class WM_CORE_EXPORT ShadowController :
+class WM_EXPORT ShadowController :
public aura::client::ActivationChangeObserver {
public:
- class WM_CORE_EXPORT TestApi {
+ class WM_EXPORT TestApi {
public:
explicit TestApi(ShadowController* controller) : controller_(controller) {}
~TestApi() {}
diff --git a/ui/wm/core/shadow_types.h b/ui/wm/core/shadow_types.h
index 49c92fd88d..1198a43b16 100644
--- a/ui/wm/core/shadow_types.h
+++ b/ui/wm/core/shadow_types.h
@@ -6,7 +6,7 @@
#define UI_WM_CORE_SHADOW_TYPES_H_
#include "ui/aura/window.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace aura {
class Window;
@@ -22,8 +22,8 @@ enum ShadowType {
SHADOW_TYPE_RECTANGULAR,
};
-WM_CORE_EXPORT void SetShadowType(aura::Window* window, ShadowType shadow_type);
-WM_CORE_EXPORT ShadowType GetShadowType(aura::Window* window);
+WM_EXPORT void SetShadowType(aura::Window* window, ShadowType shadow_type);
+WM_EXPORT ShadowType GetShadowType(aura::Window* window);
// A property key describing the drop shadow that should be displayed under the
// window. If unset, no shadow is displayed.
diff --git a/ui/wm/core/transient_window_controller.h b/ui/wm/core/transient_window_controller.h
index 125cd28f80..8638824ae3 100644
--- a/ui/wm/core/transient_window_controller.h
+++ b/ui/wm/core/transient_window_controller.h
@@ -5,14 +5,14 @@
#ifndef UI_WM_CORE_TRANSIENT_WINDOW_CONTROLLER_H_
#define UI_WM_CORE_TRANSIENT_WINDOW_CONTROLLER_H_
-#include "ui/wm/core/wm_core_export.h"
#include "ui/wm/public/transient_window_client.h"
+#include "ui/wm/wm_export.h"
namespace wm {
// TransientWindowClient implementation. Uses TransientWindowManager to handle
// tracking transient per window.
-class WM_CORE_EXPORT TransientWindowController
+class WM_EXPORT TransientWindowController
: public aura::client::TransientWindowClient {
public:
TransientWindowController();
diff --git a/ui/wm/core/transient_window_manager.h b/ui/wm/core/transient_window_manager.h
index 350bb1a294..7d37679f92 100644
--- a/ui/wm/core/transient_window_manager.h
+++ b/ui/wm/core/transient_window_manager.h
@@ -9,7 +9,7 @@
#include "base/observer_list.h"
#include "ui/aura/window_observer.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace wm {
@@ -26,7 +26,7 @@ class TransientWindowObserver;
// Transient windows are typically used for popups and menus.
// TODO(sky): when we nuke TransientWindowClient rename this to
// TransientWindowController.
-class WM_CORE_EXPORT TransientWindowManager : public aura::WindowObserver {
+class WM_EXPORT TransientWindowManager : public aura::WindowObserver {
public:
typedef std::vector<aura::Window*> Windows;
diff --git a/ui/wm/core/transient_window_observer.h b/ui/wm/core/transient_window_observer.h
index 6a7a2e2ffe..aff5af5e2e 100644
--- a/ui/wm/core/transient_window_observer.h
+++ b/ui/wm/core/transient_window_observer.h
@@ -5,7 +5,7 @@
#ifndef UI_WM_CORE_TRANSIENT_WINDOW_OBSERVER_H_
#define UI_WM_CORE_TRANSIENT_WINDOW_OBSERVER_H_
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace aura {
class Window;
@@ -13,7 +13,7 @@ class Window;
namespace wm {
-class WM_CORE_EXPORT TransientWindowObserver {
+class WM_EXPORT TransientWindowObserver {
public:
// Called when a transient child is added to |window|.
virtual void OnTransientChildAdded(aura::Window* window,
diff --git a/ui/wm/core/transient_window_stacking_client.h b/ui/wm/core/transient_window_stacking_client.h
index 5641a2241c..4ab4aea174 100644
--- a/ui/wm/core/transient_window_stacking_client.h
+++ b/ui/wm/core/transient_window_stacking_client.h
@@ -6,13 +6,13 @@
#define UI_WM_CORE_TRANSIENT_WINDOW_STACKING_CLIENT_H_
#include "ui/aura/client/window_stacking_client.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace wm {
class TransientWindowManager;
-class WM_CORE_EXPORT TransientWindowStackingClient
+class WM_EXPORT TransientWindowStackingClient
: public aura::client::WindowStackingClient {
public:
TransientWindowStackingClient();
diff --git a/ui/wm/core/user_activity_detector.h b/ui/wm/core/user_activity_detector.h
index 6a94db146c..851f07ac32 100644
--- a/ui/wm/core/user_activity_detector.h
+++ b/ui/wm/core/user_activity_detector.h
@@ -10,14 +10,14 @@
#include "base/observer_list.h"
#include "base/time/time.h"
#include "ui/events/event_handler.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace wm {
class UserActivityObserver;
// Watches for input events and notifies observers that the user is active.
-class WM_CORE_EXPORT UserActivityDetector : public ui::EventHandler {
+class WM_EXPORT UserActivityDetector : public ui::EventHandler {
public:
// Minimum amount of time between notifications to observers.
static const int kNotifyIntervalMs;
diff --git a/ui/wm/core/user_activity_observer.h b/ui/wm/core/user_activity_observer.h
index 2c3b8877c8..0fb35a61f0 100644
--- a/ui/wm/core/user_activity_observer.h
+++ b/ui/wm/core/user_activity_observer.h
@@ -6,7 +6,7 @@
#define UI_WM_CORE_USER_ACTIVITY_OBSERVER_H_
#include "base/basictypes.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace ui {
class Event;
@@ -16,7 +16,7 @@ namespace wm {
// Interface for classes that want to be notified about user activity.
// Implementations should register themselves with UserActivityDetector.
-class WM_CORE_EXPORT UserActivityObserver {
+class WM_EXPORT UserActivityObserver {
public:
// Invoked periodically while the user is active (i.e. generating input
// events). |event| is the event that triggered the notification; it may
diff --git a/ui/wm/core/visibility_controller.h b/ui/wm/core/visibility_controller.h
index 912e9748fd..47ae9910c7 100644
--- a/ui/wm/core/visibility_controller.h
+++ b/ui/wm/core/visibility_controller.h
@@ -8,11 +8,11 @@
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "ui/aura/client/visibility_client.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace wm {
-class WM_CORE_EXPORT VisibilityController
+class WM_EXPORT VisibilityController
: public aura::client::VisibilityClient {
public:
VisibilityController();
@@ -47,7 +47,7 @@ class WM_CORE_EXPORT VisibilityController
// // previous state.
// }
//
-class WM_CORE_EXPORT SuspendChildWindowVisibilityAnimations {
+class WM_EXPORT SuspendChildWindowVisibilityAnimations {
public:
// Suspend visibility animations of child windows.
explicit SuspendChildWindowVisibilityAnimations(aura::Window* window);
@@ -66,7 +66,7 @@ class WM_CORE_EXPORT SuspendChildWindowVisibilityAnimations {
};
// Tells |window| to animate visibility changes to its children.
-void WM_CORE_EXPORT SetChildWindowVisibilityChangesAnimated(
+void WM_EXPORT SetChildWindowVisibilityChangesAnimated(
aura::Window* window);
} // namespace wm
diff --git a/ui/wm/core/window_animations.cc b/ui/wm/core/window_animations.cc
index 42439e37ea..bea416f8dd 100644
--- a/ui/wm/core/window_animations.cc
+++ b/ui/wm/core/window_animations.cc
@@ -41,7 +41,7 @@ DECLARE_WINDOW_PROPERTY_TYPE(int)
DECLARE_WINDOW_PROPERTY_TYPE(wm::WindowVisibilityAnimationType)
DECLARE_WINDOW_PROPERTY_TYPE(wm::WindowVisibilityAnimationTransition)
DECLARE_WINDOW_PROPERTY_TYPE(float)
-DECLARE_EXPORTED_WINDOW_PROPERTY_TYPE(WM_CORE_EXPORT, bool)
+DECLARE_EXPORTED_WINDOW_PROPERTY_TYPE(WM_EXPORT, bool)
namespace wm {
namespace {
diff --git a/ui/wm/core/window_animations.h b/ui/wm/core/window_animations.h
index b2ab4defb6..1c55d4990e 100644
--- a/ui/wm/core/window_animations.h
+++ b/ui/wm/core/window_animations.h
@@ -8,7 +8,7 @@
#include <vector>
#include "ui/compositor/scoped_layer_animation_settings.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace aura {
class Window;
@@ -58,26 +58,25 @@ enum WindowVisibilityAnimationTransition {
// These two methods use int for type rather than WindowVisibilityAnimationType
// since downstream libraries can extend the set of animations.
-WM_CORE_EXPORT void SetWindowVisibilityAnimationType(aura::Window* window,
- int type);
-WM_CORE_EXPORT int GetWindowVisibilityAnimationType(aura::Window* window);
+WM_EXPORT void SetWindowVisibilityAnimationType(aura::Window* window, int type);
+WM_EXPORT int GetWindowVisibilityAnimationType(aura::Window* window);
-WM_CORE_EXPORT void SetWindowVisibilityAnimationTransition(
+WM_EXPORT void SetWindowVisibilityAnimationTransition(
aura::Window* window,
WindowVisibilityAnimationTransition transition);
-WM_CORE_EXPORT bool HasWindowVisibilityAnimationTransition(
+WM_EXPORT bool HasWindowVisibilityAnimationTransition(
aura::Window* window,
WindowVisibilityAnimationTransition transition);
-WM_CORE_EXPORT void SetWindowVisibilityAnimationDuration(
+WM_EXPORT void SetWindowVisibilityAnimationDuration(
aura::Window* window,
const base::TimeDelta& duration);
-WM_CORE_EXPORT base::TimeDelta GetWindowVisibilityAnimationDuration(
+WM_EXPORT base::TimeDelta GetWindowVisibilityAnimationDuration(
const aura::Window& window);
-WM_CORE_EXPORT void SetWindowVisibilityAnimationVerticalPosition(
+WM_EXPORT void SetWindowVisibilityAnimationVerticalPosition(
aura::Window* window,
float position);
@@ -86,7 +85,7 @@ class HidingWindowAnimationObserver;
// Use this to ensure that the hiding animation is visible even after
// the window is deleted or deactivated, instead of using
// ui::ScopedLayerAnimationSettings directly.
-class WM_CORE_EXPORT ScopedHidingAnimationSettings {
+class WM_EXPORT ScopedHidingAnimationSettings {
public:
explicit ScopedHidingAnimationSettings(aura::Window* window);
~ScopedHidingAnimationSettings();
@@ -104,15 +103,14 @@ class WM_CORE_EXPORT ScopedHidingAnimationSettings {
};
// Returns false if the |window| didn't animate.
-WM_CORE_EXPORT bool AnimateOnChildWindowVisibilityChanged(aura::Window* window,
- bool visible);
-WM_CORE_EXPORT bool AnimateWindow(aura::Window* window,
- WindowAnimationType type);
+WM_EXPORT bool AnimateOnChildWindowVisibilityChanged(aura::Window* window,
+ bool visible);
+WM_EXPORT bool AnimateWindow(aura::Window* window, WindowAnimationType type);
// Returns true if window animations are disabled for |window|. Window
// animations are enabled by default. If |window| is NULL, this just checks
// if the global flag disabling window animations is present.
-WM_CORE_EXPORT bool WindowAnimationsDisabled(aura::Window* window);
+WM_EXPORT bool WindowAnimationsDisabled(aura::Window* window);
} // namespace wm
diff --git a/ui/wm/core/window_modality_controller.h b/ui/wm/core/window_modality_controller.h
index d098d57fdc..4d52c2190b 100644
--- a/ui/wm/core/window_modality_controller.h
+++ b/ui/wm/core/window_modality_controller.h
@@ -11,7 +11,7 @@
#include "ui/aura/env_observer.h"
#include "ui/aura/window_observer.h"
#include "ui/events/event_handler.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace ui {
class EventTarget;
@@ -21,18 +21,18 @@ class LocatedEvent;
namespace wm {
// Sets the modal parent for the child.
-WM_CORE_EXPORT void SetModalParent(aura::Window* child, aura::Window* parent);
+WM_EXPORT void SetModalParent(aura::Window* child, aura::Window* parent);
// Returns the modal transient child of |window|, or NULL if |window| does not
// have any modal transient children.
-WM_CORE_EXPORT aura::Window* GetModalTransient(aura::Window* window);
+WM_EXPORT aura::Window* GetModalTransient(aura::Window* window);
// WindowModalityController is an event filter that consumes events sent to
// windows that are the transient parents of window-modal windows. This filter
// must be added to the CompoundEventFilter so that activation works properly.
-class WM_CORE_EXPORT WindowModalityController : public ui::EventHandler,
- public aura::EnvObserver,
- public aura::WindowObserver {
+class WM_EXPORT WindowModalityController : public ui::EventHandler,
+ public aura::EnvObserver,
+ public aura::WindowObserver {
public:
explicit WindowModalityController(ui::EventTarget* event_target);
virtual ~WindowModalityController();
diff --git a/ui/wm/core/window_util.h b/ui/wm/core/window_util.h
index 81989f9706..78f2ffbf11 100644
--- a/ui/wm/core/window_util.h
+++ b/ui/wm/core/window_util.h
@@ -10,7 +10,7 @@
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace aura {
class Window;
@@ -24,18 +24,18 @@ class LayerTreeOwner;
namespace wm {
-WM_CORE_EXPORT void ActivateWindow(aura::Window* window);
-WM_CORE_EXPORT void DeactivateWindow(aura::Window* window);
-WM_CORE_EXPORT bool IsActiveWindow(aura::Window* window);
-WM_CORE_EXPORT bool CanActivateWindow(aura::Window* window);
+WM_EXPORT void ActivateWindow(aura::Window* window);
+WM_EXPORT void DeactivateWindow(aura::Window* window);
+WM_EXPORT bool IsActiveWindow(aura::Window* window);
+WM_EXPORT bool CanActivateWindow(aura::Window* window);
// Retrieves the activatable window for |window|. The ActivationClient makes
// this determination.
-WM_CORE_EXPORT aura::Window* GetActivatableWindow(aura::Window* window);
+WM_EXPORT aura::Window* GetActivatableWindow(aura::Window* window);
// Retrieves the toplevel window for |window|. The ActivationClient makes this
// determination.
-WM_CORE_EXPORT aura::Window* GetToplevelWindow(aura::Window* window);
+WM_EXPORT aura::Window* GetToplevelWindow(aura::Window* window);
// Returns the existing Layer for |root| (and all its descendants) and creates
// a new layer for |root| and all its descendants. This is intended for
@@ -43,26 +43,24 @@ WM_CORE_EXPORT aura::Window* GetToplevelWindow(aura::Window* window);
//
// As a result of this |root| has freshly created layers, meaning the layers
// have not yet been painted to.
-WM_CORE_EXPORT scoped_ptr<ui::LayerTreeOwner> RecreateLayers(
+WM_EXPORT scoped_ptr<ui::LayerTreeOwner> RecreateLayers(
ui::LayerOwner* root);
// Convenience functions that get the TransientWindowManager for the window and
// redirect appropriately. These are preferable to calling functions on
// TransientWindowManager as they handle the appropriate NULL checks.
-WM_CORE_EXPORT aura::Window* GetTransientParent(aura::Window* window);
-WM_CORE_EXPORT const aura::Window* GetTransientParent(
+WM_EXPORT aura::Window* GetTransientParent(aura::Window* window);
+WM_EXPORT const aura::Window* GetTransientParent(
const aura::Window* window);
-WM_CORE_EXPORT const std::vector<aura::Window*>& GetTransientChildren(
+WM_EXPORT const std::vector<aura::Window*>& GetTransientChildren(
const aura::Window* window);
-WM_CORE_EXPORT void AddTransientChild(aura::Window* parent,
- aura::Window* child);
-WM_CORE_EXPORT void RemoveTransientChild(aura::Window* parent,
- aura::Window* child);
+WM_EXPORT void AddTransientChild(aura::Window* parent, aura::Window* child);
+WM_EXPORT void RemoveTransientChild(aura::Window* parent, aura::Window* child);
// Returns true if |window| has |ancestor| as a transient ancestor. A transient
// ancestor is found by following the transient parent chain of the window.
-WM_CORE_EXPORT bool HasTransientAncestor(const aura::Window* window,
- const aura::Window* ancestor);
+WM_EXPORT bool HasTransientAncestor(const aura::Window* window,
+ const aura::Window* ancestor);
} // namespace wm
diff --git a/ui/wm/core/wm_core_export.h b/ui/wm/core/wm_core_export.h
deleted file mode 100644
index 2056ccc568..0000000000
--- a/ui/wm/core/wm_core_export.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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 UI_WM_CORE_WM_CORE_EXPORT_H_
-#define UI_WM_CORE_WM_CORE_EXPORT_H_
-
-// Defines WM_CORE_EXPORT so that functionality implemented by the Views module
-// can be exported to consumers.
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(WM_CORE_IMPLEMENTATION)
-#define WM_CORE_EXPORT __declspec(dllexport)
-#else
-#define WM_CORE_EXPORT __declspec(dllimport)
-#endif // defined(WM_CORE_IMPLEMENTATION)
-
-#else // defined(WIN32)
-#if defined(WM_CORE_IMPLEMENTATION)
-#define WM_CORE_EXPORT __attribute__((visibility("default")))
-#else
-#define WM_CORE_EXPORT
-#endif
-#endif
-
-#else // defined(COMPONENT_BUILD)
-#define WM_CORE_EXPORT
-#endif
-
-#endif // UI_WM_CORE_WM_CORE_EXPORT_H_
diff --git a/ui/wm/core/wm_core_switches.h b/ui/wm/core/wm_core_switches.h
index dd480256ee..05658d6abb 100644
--- a/ui/wm/core/wm_core_switches.h
+++ b/ui/wm/core/wm_core_switches.h
@@ -6,7 +6,7 @@
#define UI_WM_CORE_WM_CORE_SWITCHES_H_
#include "build/build_config.h"
-#include "ui/wm/core/wm_core_export.h"
+#include "ui/wm/wm_export.h"
namespace wm {
namespace switches {
@@ -16,7 +16,7 @@ namespace switches {
// see chromeos::LoginUtil::GetOffTheRecordCommandLine().)
// Please keep alphabetized.
-WM_CORE_EXPORT extern const char kWindowAnimationsDisabled[];
+WM_EXPORT extern const char kWindowAnimationsDisabled[];
} // namespace switches
} // namespace wm
diff --git a/ui/wm/core/wm_state.cc b/ui/wm/core/wm_state.cc
index 991940e732..6d58086339 100644
--- a/ui/wm/core/wm_state.cc
+++ b/ui/wm/core/wm_state.cc
@@ -15,8 +15,6 @@ WMState::WMState()
transient_window_client_(new TransientWindowController) {
aura::client::SetWindowStackingClient(window_stacking_client_.get());
aura::client::SetTransientWindowClient(transient_window_client_.get());
- if (!ui::PlatformEventSource::GetInstance())
- event_source_ = ui::PlatformEventSource::CreateDefault();
}
WMState::~WMState() {
diff --git a/ui/wm/core/wm_state.h b/ui/wm/core/wm_state.h
index dff17a69ec..289c9dac5b 100644
--- a/ui/wm/core/wm_state.h
+++ b/ui/wm/core/wm_state.h
@@ -6,11 +6,7 @@
#define UI_WM_CORE_WM_STATE_H_
#include "base/memory/scoped_ptr.h"
-#include "ui/wm/core/wm_core_export.h"
-
-namespace ui {
-class PlatformEventSource;
-}
+#include "ui/wm/wm_export.h"
namespace wm {
@@ -18,7 +14,7 @@ class TransientWindowController;
class TransientWindowStackingClient;
// Installs state needed by the window manager.
-class WM_CORE_EXPORT WMState {
+class WM_EXPORT WMState {
public:
WMState();
~WMState();
@@ -27,7 +23,6 @@ class WM_CORE_EXPORT WMState {
private:
scoped_ptr<TransientWindowStackingClient> window_stacking_client_;
scoped_ptr<TransientWindowController> transient_window_client_;
- scoped_ptr<ui::PlatformEventSource> event_source_;
DISALLOW_COPY_AND_ASSIGN(WMState);
};
diff --git a/ui/wm/test/wm_test_helper.cc b/ui/wm/test/wm_test_helper.cc
index dddb7af1c7..1982be5c6d 100644
--- a/ui/wm/test/wm_test_helper.cc
+++ b/ui/wm/test/wm_test_helper.cc
@@ -9,7 +9,6 @@
#include "ui/aura/env.h"
#include "ui/aura/test/test_focus_client.h"
#include "ui/aura/window.h"
-#include "ui/events/platform/platform_event_source.h"
#include "ui/wm/core/compound_event_filter.h"
#include "ui/wm/core/input_method_event_filter.h"
@@ -17,7 +16,6 @@ namespace wm {
WMTestHelper::WMTestHelper(const gfx::Size& default_window_size) {
aura::Env::CreateInstance();
- event_source_ = ui::PlatformEventSource::CreateDefault();
host_.reset(aura::WindowTreeHost::Create(gfx::Rect(default_window_size)));
host_->InitHost();
aura::client::SetWindowTreeClient(host_->window(), this);
@@ -25,9 +23,8 @@ WMTestHelper::WMTestHelper(const gfx::Size& default_window_size) {
focus_client_.reset(new aura::test::TestFocusClient);
aura::client::SetFocusClient(host_->window(), focus_client_.get());
- root_window_event_filter_ = new wm::CompoundEventFilter;
- // Pass ownership of the filter to the root_window.
- host_->window()->SetEventFilter(root_window_event_filter_);
+ root_window_event_filter_.reset(new wm::CompoundEventFilter);
+ host_->window()->AddPreTargetHandler(root_window_event_filter_.get());
input_method_filter_.reset(new wm::InputMethodEventFilter(
host_->GetAcceleratedWidget()));
diff --git a/ui/wm/test/wm_test_helper.h b/ui/wm/test/wm_test_helper.h
index 1bde9f33f7..1a3dd0964a 100644
--- a/ui/wm/test/wm_test_helper.h
+++ b/ui/wm/test/wm_test_helper.h
@@ -25,10 +25,6 @@ class Rect;
class Size;
}
-namespace ui {
-class PlatformEventSource;
-}
-
namespace wm {
class CompoundEventFilter;
@@ -52,14 +48,11 @@ class WMTestHelper : public aura::client::WindowTreeClient {
private:
scoped_ptr<aura::WindowTreeHost> host_;
- // Owned by the root Window.
- wm::CompoundEventFilter* root_window_event_filter_;
-
+ scoped_ptr<wm::CompoundEventFilter> root_window_event_filter_;
scoped_ptr<aura::client::DefaultCaptureClient> capture_client_;
scoped_ptr<wm::InputMethodEventFilter> input_method_filter_;
scoped_ptr<aura::client::DefaultActivationClient> activation_client_;
scoped_ptr<aura::client::FocusClient> focus_client_;
- scoped_ptr<ui::PlatformEventSource> event_source_;
DISALLOW_COPY_AND_ASSIGN(WMTestHelper);
};
diff --git a/ui/wm/wm.gyp b/ui/wm/wm.gyp
index 5d124b1cef..17ceaa361a 100644
--- a/ui/wm/wm.gyp
+++ b/ui/wm/wm.gyp
@@ -8,19 +8,7 @@
},
'targets': [
{
- 'target_name': 'wm_public',
- 'type': 'static_library',
- 'dependencies': [
- '../../skia/skia.gyp:skia',
- '../aura/aura.gyp:aura',
- '../gfx/gfx.gyp:gfx_geometry',
- ],
- 'sources': [
- 'public/window_types.h',
- ],
- },
- {
- 'target_name': 'wm_core',
+ 'target_name': 'wm',
'type': '<(component)',
'dependencies': [
'../../base/base.gyp:base',
@@ -35,7 +23,7 @@
'../base/ui_base.gyp:ui_base',
],
'defines': [
- 'WM_CORE_IMPLEMENTATION',
+ 'WM_IMPLEMENTATION',
],
'sources': [
'core/base_focus_rules.cc',
@@ -83,11 +71,12 @@
'core/window_modality_controller.h',
'core/window_util.cc',
'core/window_util.h',
- 'core/wm_core_export.h',
'core/wm_core_switches.cc',
'core/wm_core_switches.h',
'core/wm_state.cc',
'core/wm_state.h',
+ 'public/window_types.h',
+ 'wm_export.h',
],
},
{
@@ -105,7 +94,7 @@
],
},
{
- 'target_name': 'wm_core_unittests',
+ 'target_name': 'wm_unittests',
'type': 'executable',
'dependencies': [
'../../base/base.gyp:base',
@@ -120,7 +109,7 @@
'../gfx/gfx.gyp:gfx_geometry',
'../gfx/gfx.gyp:gfx',
'../base/ui_base.gyp:ui_base',
- 'wm_core',
+ 'wm',
'wm_test_support',
],
'sources': [
diff --git a/ui/wm/wm_export.h b/ui/wm/wm_export.h
new file mode 100644
index 0000000000..461d6934ad
--- /dev/null
+++ b/ui/wm/wm_export.h
@@ -0,0 +1,32 @@
+// 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 UI_WM_WM_EXPORT_H_
+#define UI_WM_WM_EXPORT_H_
+
+// Defines WM_EXPORT so that functionality implemented by the WM module
+// can be exported to consumers.
+
+#if defined(COMPONENT_BUILD)
+#if defined(WIN32)
+
+#if defined(WM_IMPLEMENTATION)
+#define WM_EXPORT __declspec(dllexport)
+#else
+#define WM_EXPORT __declspec(dllimport)
+#endif // defined(WM_IMPLEMENTATION)
+
+#else // defined(WIN32)
+#if defined(WM_IMPLEMENTATION)
+#define WM_EXPORT __attribute__((visibility("default")))
+#else
+#define WM_EXPORT
+#endif
+#endif
+
+#else // defined(COMPONENT_BUILD)
+#define WM_EXPORT
+#endif
+
+#endif // UI_WM_WM_EXPORT_H_