summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chromium/AUTHORS5
-rw-r--r--chromium/DEPS16
-rw-r--r--chromium/WATCHLISTS3
-rw-r--r--chromium/android_webview/android_webview.gyp15
-rw-r--r--chromium/ash/ash.gyp12
-rw-r--r--chromium/ash/ash_switches.cc13
-rw-r--r--chromium/ash/ash_switches.h6
-rw-r--r--chromium/ash/display/display_controller.cc61
-rw-r--r--chromium/ash/display/display_controller.h6
-rw-r--r--chromium/ash/display/display_controller_unittest.cc37
-rw-r--r--chromium/ash/display/display_info.cc15
-rw-r--r--chromium/ash/display/display_info.h8
-rw-r--r--chromium/ash/display/display_info_unittest.cc8
-rw-r--r--chromium/ash/display/display_manager.cc102
-rw-r--r--chromium/ash/display/display_manager.h8
-rw-r--r--chromium/ash/display/display_manager_unittest.cc57
-rw-r--r--chromium/ash/display/mouse_cursor_event_filter.cc7
-rw-r--r--chromium/ash/display/mouse_cursor_event_filter_unittest.cc4
-rw-r--r--chromium/ash/display/resolution_notification_controller_unittest.cc53
-rw-r--r--chromium/ash/display/screen_position_controller.cc4
-rw-r--r--chromium/ash/display/screen_position_controller_unittest.cc8
-rw-r--r--chromium/ash/extended_desktop_unittest.cc8
-rw-r--r--chromium/ash/keyboard_controller_proxy_stub.cc34
-rw-r--r--chromium/ash/keyboard_controller_proxy_stub.h33
-rw-r--r--chromium/ash/launcher/launcher_button.cc6
-rw-r--r--chromium/ash/launcher/launcher_view.cc8
-rw-r--r--chromium/ash/resources/ash_resources.grd9
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_bottom.pngbin0 -> 94 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_bottom_left.pngbin0 -> 144 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_bottom_right.pngbin0 -> 152 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_center.pngbin0 -> 74 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_left.pngbin0 -> 91 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_right.pngbin0 -> 92 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_top.pngbin0 -> 94 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_top_left.pngbin0 -> 128 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_top_right.pngbin0 -> 138 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom.pngbin88 -> 89 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom_left.pngbin125 -> 131 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom_right.pngbin135 -> 141 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_center.pngbin74 -> 74 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_left.pngbin86 -> 85 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_right.pngbin89 -> 86 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top.pngbin92 -> 87 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top_left.pngbin118 -> 119 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top_right.pngbin117 -> 125 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom.pngbin88 -> 88 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom_left.pngbin125 -> 103 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom_right.pngbin135 -> 105 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_center.pngbin74 -> 74 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_left.pngbin86 -> 84 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_right.pngbin89 -> 83 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top.pngbin92 -> 87 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top_left.pngbin118 -> 103 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top_right.pngbin125 -> 105 bytes
-rw-r--r--chromium/ash/resources/default_100_percent/cros/status/status_managed_mode_user.pngbin336 -> 3095 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_bottom.pngbin0 -> 111 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_bottom_left.pngbin0 -> 241 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_bottom_right.pngbin0 -> 236 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_center.pngbin0 -> 76 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_left.pngbin0 -> 100 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_right.pngbin0 -> 103 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_top.pngbin0 -> 101 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_top_left.pngbin0 -> 197 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_top_right.pngbin0 -> 212 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom.pngbin104 -> 99 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom_left.pngbin250 -> 181 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom_right.pngbin247 -> 190 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_center.pngbin91 -> 76 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_left.pngbin112 -> 90 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_right.pngbin121 -> 93 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top.pngbin102 -> 90 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top_left.pngbin212 -> 159 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top_right.pngbin236 -> 162 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom.pngbin104 -> 91 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom_left.pngbin240 -> 123 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom_right.pngbin241 -> 125 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_center.pngbin91 -> 76 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_left.pngbin116 -> 88 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_right.pngbin125 -> 88 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top.pngbin99 -> 90 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top_left.pngbin201 -> 130 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top_right.pngbin228 -> 127 bytes
-rw-r--r--chromium/ash/resources/default_200_percent/cros/status/status_managed_mode_user.pngbin668 -> 3432 bytes
-rw-r--r--chromium/ash/root_window_controller.cc46
-rw-r--r--chromium/ash/root_window_controller.h7
-rw-r--r--chromium/ash/root_window_controller_unittest.cc79
-rw-r--r--chromium/ash/shelf/shelf_layout_manager.cc144
-rw-r--r--chromium/ash/shelf/shelf_layout_manager.h20
-rw-r--r--chromium/ash/shelf/shelf_layout_manager_unittest.cc146
-rw-r--r--chromium/ash/shelf/shelf_widget.cc42
-rw-r--r--chromium/ash/shelf/shelf_widget.h8
-rw-r--r--chromium/ash/shell.cc4
-rw-r--r--chromium/ash/shell/shell_delegate_impl.cc33
-rw-r--r--chromium/ash/shell_window_ids.h39
-rw-r--r--chromium/ash/strings/ash_strings_am.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_ar.xtb105
-rw-r--r--chromium/ash/strings/ash_strings_bg.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_bn.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_ca.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_cs.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_da.xtb41
-rw-r--r--chromium/ash/strings/ash_strings_de.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_el.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_en-GB.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_es-419.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_es.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_et.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_fa.xtb101
-rw-r--r--chromium/ash/strings/ash_strings_fi.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_fil.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_fr.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_gu.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_hi.xtb49
-rw-r--r--chromium/ash/strings/ash_strings_hr.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_hu.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_id.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_it.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_iw.xtb123
-rw-r--r--chromium/ash/strings/ash_strings_ja.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_kn.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_ko.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_lt.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_lv.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_ml.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_mr.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_ms.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_nl.xtb55
-rw-r--r--chromium/ash/strings/ash_strings_no.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_pl.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_pt-BR.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_pt-PT.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_ro.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_ru.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_sk.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_sl.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_sr.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_sv.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_sw.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_ta.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_te.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_th.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_tr.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_uk.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_vi.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_zh-CN.xtb37
-rw-r--r--chromium/ash/strings/ash_strings_zh-TW.xtb37
-rw-r--r--chromium/ash/system/chromeos/network/network_connect.cc36
-rw-r--r--chromium/ash/system/chromeos/network/network_connect.h2
-rw-r--r--chromium/ash/system/chromeos/network/network_icon.cc5
-rw-r--r--chromium/ash/system/chromeos/network/network_state_notifier.cc8
-rw-r--r--chromium/ash/system/chromeos/network/network_state_notifier_unittest.cc5
-rw-r--r--chromium/ash/system/chromeos/network/sms_observer.h26
-rw-r--r--chromium/ash/system/chromeos/network/tray_sms.cc47
-rw-r--r--chromium/ash/system/chromeos/network/tray_sms.h11
-rw-r--r--chromium/ash/system/chromeos/settings/tray_settings.cc3
-rw-r--r--chromium/ash/system/logout_button/logout_button_tray.cc158
-rw-r--r--chromium/ash/system/logout_button/logout_button_tray.h62
-rw-r--r--chromium/ash/system/logout_button/tray_logout_button.cc168
-rw-r--r--chromium/ash/system/logout_button/tray_logout_button.h44
-rw-r--r--chromium/ash/system/status_area_widget.cc16
-rw-r--r--chromium/ash/system/status_area_widget.h5
-rw-r--r--chromium/ash/system/tray/system_tray.cc2
-rw-r--r--chromium/ash/system/tray/system_tray.h1
-rw-r--r--chromium/ash/system/tray/system_tray_delegate.h13
-rw-r--r--chromium/ash/system/tray/system_tray_notifier.cc13
-rw-r--r--chromium/ash/system/tray/system_tray_notifier.h7
-rw-r--r--chromium/ash/system/tray/test_system_tray_delegate.cc13
-rw-r--r--chromium/ash/system/tray/test_system_tray_delegate.h5
-rw-r--r--chromium/ash/system/tray/tray_background_view.h3
-rw-r--r--chromium/ash/system/tray/tray_constants.cc9
-rw-r--r--chromium/ash/system/tray/tray_constants.h4
-rw-r--r--chromium/ash/system/tray/tray_image_item.cc22
-rw-r--r--chromium/ash/system/tray/tray_image_item.h3
-rw-r--r--chromium/ash/system/user/tray_user.cc29
-rw-r--r--chromium/ash/system/web_notification/web_notification_tray.cc75
-rw-r--r--chromium/ash/system/web_notification/web_notification_tray.h1
-rw-r--r--chromium/ash/system/web_notification/web_notification_tray_unittest.cc119
-rw-r--r--chromium/ash/wm/boot_splash_screen.cc (renamed from chromium/ash/wm/boot_splash_screen_chromeos.cc)9
-rw-r--r--chromium/ash/wm/boot_splash_screen.h (renamed from chromium/ash/wm/boot_splash_screen_chromeos.h)8
-rw-r--r--chromium/ash/wm/dock/docked_window_layout_manager.cc350
-rw-r--r--chromium/ash/wm/dock/docked_window_layout_manager.h57
-rw-r--r--chromium/ash/wm/dock/docked_window_layout_manager_unittest.cc91
-rw-r--r--chromium/ash/wm/dock/docked_window_resizer.cc220
-rw-r--r--chromium/ash/wm/dock/docked_window_resizer.h25
-rw-r--r--chromium/ash/wm/dock/docked_window_resizer_unittest.cc56
-rw-r--r--chromium/ash/wm/event_client_impl.cc43
-rw-r--r--chromium/ash/wm/frame_painter.h2
-rw-r--r--chromium/ash/wm/frame_painter_unittest.cc58
-rw-r--r--chromium/ash/wm/panels/panel_layout_manager_unittest.cc2
-rw-r--r--chromium/ash/wm/status_area_layout_manager.cc2
-rw-r--r--chromium/ash/wm/window_animations.cc3
-rw-r--r--chromium/ash/wm/window_resizer.cc23
-rw-r--r--chromium/ash/wm/window_selector.cc8
-rw-r--r--chromium/ash/wm/window_selector.h2
-rw-r--r--chromium/ash/wm/window_util.cc22
-rw-r--r--chromium/ash/wm/window_util.h12
-rw-r--r--chromium/ash/wm/workspace/phantom_window_controller.cc92
-rw-r--r--chromium/ash/wm/workspace/phantom_window_controller.h41
-rw-r--r--chromium/ash/wm/workspace/workspace_layout_manager.cc34
-rw-r--r--chromium/ash/wm/workspace/workspace_layout_manager_unittest.cc9
-rw-r--r--chromium/ash/wm/workspace/workspace_window_resizer.cc26
-rw-r--r--chromium/ash/wm/workspace/workspace_window_resizer.h5
-rw-r--r--chromium/ash/wm/workspace/workspace_window_resizer_unittest.cc173
-rw-r--r--chromium/ash/wm/workspace_controller.cc2
-rw-r--r--chromium/ash/wm/workspace_controller_unittest.cc8
-rw-r--r--chromium/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java11
-rw-r--r--chromium/base/base.gypi7
-rw-r--r--chromium/base/debug/crash_logging.h5
-rw-r--r--chromium/base/debug/trace_event_unittest.cc2
-rw-r--r--chromium/base/file_util_unittest.cc235
-rw-r--r--chromium/base/files/file_enumerator_win.cc6
-rw-r--r--chromium/base/os_compat_android.cc3
-rw-r--r--chromium/base/posix/file_descriptor_shuffle.h2
-rw-r--r--chromium/base/synchronization/lock_impl_posix.cc17
-rw-r--r--chromium/base/time/time_posix.cc51
-rw-r--r--chromium/base/time/time_unittest.cc24
-rw-r--r--chromium/base/values.cc2
-rw-r--r--chromium/base/values.h2
-rw-r--r--chromium/base/win/scoped_handle.h2
-rw-r--r--chromium/build/all.gyp4
-rw-r--r--chromium/build/all_android.gyp4
-rw-r--r--chromium/build/common.gypi29
-rw-r--r--chromium/build/java.gypi48
-rw-r--r--chromium/build/java_apk.gypi5
-rw-r--r--chromium/build/linux/unbundle/openssl.gyp25
-rwxr-xr-xchromium/build/linux/unbundle/replace_gyp_files.py1
-rw-r--r--chromium/build/shim_headers.gypi7
-rw-r--r--chromium/build/util/LASTCHANGE2
-rw-r--r--chromium/build/util/LASTCHANGE.blink2
-rw-r--r--chromium/cc/cc.gyp4
-rw-r--r--chromium/cc/cc_tests.gyp4
-rw-r--r--chromium/cc/debug/test_context_provider.cc107
-rw-r--r--chromium/cc/debug/test_context_provider.h58
-rw-r--r--chromium/cc/debug/test_web_graphics_context_3d.cc654
-rw-r--r--chromium/cc/debug/test_web_graphics_context_3d.h293
-rw-r--r--chromium/cc/layers/delegated_renderer_layer_impl_unittest.cc2
-rw-r--r--chromium/cc/layers/picture_layer_impl.cc33
-rw-r--r--chromium/cc/layers/scrollbar_layer.cc254
-rw-r--r--chromium/cc/layers/scrollbar_layer.h39
-rw-r--r--chromium/cc/layers/scrollbar_layer_impl.cc38
-rw-r--r--chromium/cc/layers/scrollbar_layer_impl.h15
-rw-r--r--chromium/cc/layers/scrollbar_layer_unittest.cc124
-rw-r--r--chromium/cc/layers/texture_layer.cc1
-rw-r--r--chromium/cc/layers/texture_layer_unittest.cc2
-rw-r--r--chromium/cc/output/gl_renderer.cc4
-rw-r--r--chromium/cc/output/gl_renderer_unittest.cc2
-rw-r--r--chromium/cc/output/output_surface.cc6
-rw-r--r--chromium/cc/output/output_surface.h2
-rw-r--r--chromium/cc/output/output_surface_unittest.cc73
-rw-r--r--chromium/cc/output/software_renderer.cc34
-rw-r--r--chromium/cc/resources/prioritized_tile_set.cc45
-rw-r--r--chromium/cc/resources/prioritized_tile_set.h18
-rw-r--r--chromium/cc/resources/prioritized_tile_set_unittest.cc329
-rw-r--r--chromium/cc/resources/resource_pool.cc43
-rw-r--r--chromium/cc/resources/resource_pool.h22
-rw-r--r--chromium/cc/resources/resource_provider_unittest.cc2
-rw-r--r--chromium/cc/resources/resource_update_controller_unittest.cc2
-rw-r--r--chromium/cc/resources/tile_manager.cc32
-rw-r--r--chromium/cc/resources/tile_manager.h1
-rw-r--r--chromium/cc/resources/video_resource_updater_unittest.cc2
-rw-r--r--chromium/cc/scheduler/delay_based_time_source.cc97
-rw-r--r--chromium/cc/scheduler/delay_based_time_source.h11
-rw-r--r--chromium/cc/scheduler/delay_based_time_source_unittest.cc133
-rw-r--r--chromium/cc/scheduler/frame_rate_controller.cc15
-rw-r--r--chromium/cc/scheduler/frame_rate_controller.h11
-rw-r--r--chromium/cc/scheduler/texture_uploader_unittest.cc2
-rw-r--r--chromium/cc/scheduler/time_source.h7
-rw-r--r--chromium/cc/trees/layer_tree_host_impl.cc11
-rw-r--r--chromium/cc/trees/layer_tree_host_impl_unittest.cc2
-rw-r--r--chromium/cc/trees/layer_tree_host_unittest.cc75
-rw-r--r--chromium/cc/trees/layer_tree_host_unittest_context.cc12
-rw-r--r--chromium/chrome/chrome_browser.gypi6
-rw-r--r--chromium/chrome/chrome_browser_chromeos.gypi7
-rw-r--r--chromium/chrome/chrome_browser_extensions.gypi2
-rw-r--r--chromium/chrome/chrome_browser_ui.gypi28
-rw-r--r--chromium/chrome/chrome_common.gypi15
-rw-r--r--chromium/chrome/chrome_renderer.gypi1
-rw-r--r--chromium/chrome/chrome_tests.gypi10
-rw-r--r--chromium/chrome/chrome_tests_unit.gypi8
-rw-r--r--chromium/chrome/common/extensions/api/api.gyp1
-rw-r--r--chromium/chrome/installer/mini_installer.gyp8
-rw-r--r--chromium/chrome/test/data/nacl/nacl_test_data.gyp1
-rw-r--r--chromium/chromeos/chromeos.gyp3
-rw-r--r--chromium/components/OWNERS17
-rw-r--r--chromium/components/autofill/core/common/autofill_messages.h7
-rw-r--r--chromium/components/components.gyp2
-rw-r--r--chromium/components/components_tests.gypi14
-rw-r--r--chromium/components/components_unittests.isolate3
-rw-r--r--chromium/components/json_schema.gypi25
-rw-r--r--chromium/components/json_schema/DEPS3
-rw-r--r--chromium/components/json_schema/OWNERS5
-rw-r--r--chromium/components/json_schema/README6
-rw-r--r--chromium/components/json_schema/json_schema_constants.cc38
-rw-r--r--chromium/components/json_schema/json_schema_constants.h42
-rw-r--r--chromium/components/json_schema/json_schema_validator.cc727
-rw-r--r--chromium/components/json_schema/json_schema_validator.h235
-rw-r--r--chromium/components/json_schema/json_schema_validator_unittest.cc129
-rw-r--r--chromium/components/json_schema/json_schema_validator_unittest_base.cc730
-rw-r--r--chromium/components/json_schema/json_schema_validator_unittest_base.h63
-rw-r--r--chromium/components/nacl/common/nacl_cmd_line.cc1
-rw-r--r--chromium/components/nacl/common/nacl_switches.cc3
-rw-r--r--chromium/components/nacl/common/nacl_switches.h1
-rw-r--r--chromium/components/nacl/loader/nacl_main.cc22
-rw-r--r--chromium/components/nacl/loader/nacl_main_platform_delegate.h20
-rw-r--r--chromium/components/nacl/loader/nacl_main_platform_delegate_linux.cc22
-rw-r--r--chromium/components/nacl/loader/nacl_main_platform_delegate_mac.mm58
-rw-r--r--chromium/components/nacl/loader/nacl_main_platform_delegate_win.cc65
-rw-r--r--chromium/components/policy.gypi41
-rw-r--r--chromium/components/policy/OWNERS6
-rw-r--r--chromium/components/policy/core/common/policy_schema.cc244
-rw-r--r--chromium/components/policy/core/common/policy_schema.h70
-rw-r--r--chromium/components/policy/core/common/policy_schema_unittest.cc193
-rw-r--r--chromium/components/policy/policy_export.h29
-rw-r--r--chromium/content/browser/accessibility/browser_accessibility_manager_android.cc9
-rw-r--r--chromium/content/browser/android/content_view_core_impl.cc60
-rw-r--r--chromium/content/browser/android/content_view_core_impl.h3
-rw-r--r--chromium/content/browser/android/in_process/synchronous_compositor_impl.cc7
-rw-r--r--chromium/content/browser/android/web_contents_observer_android.cc20
-rw-r--r--chromium/content/browser/aura/gpu_process_transport_factory.cc6
-rw-r--r--chromium/content/browser/aura/gpu_process_transport_factory.h14
-rw-r--r--chromium/content/browser/aura/software_output_device_win.cc9
-rw-r--r--chromium/content/browser/aura/software_output_device_win.h1
-rw-r--r--chromium/content/browser/browser_plugin/browser_plugin_guest.cc28
-rw-r--r--chromium/content/browser/browser_plugin/browser_plugin_guest.h6
-rw-r--r--chromium/content/browser/browser_plugin/browser_plugin_host_browsertest.cc130
-rw-r--r--chromium/content/browser/browser_thread_impl.h1
-rw-r--r--chromium/content/browser/child_process_security_policy_impl.cc1
-rw-r--r--chromium/content/browser/device_orientation/device_orientation_browsertest.cc2
-rw-r--r--chromium/content/browser/devtools/devtools_protocol.cc5
-rw-r--r--chromium/content/browser/devtools/devtools_protocol.h2
-rw-r--r--chromium/content/browser/devtools/devtools_protocol_constants.cc28
-rw-r--r--chromium/content/browser/devtools/devtools_protocol_constants.h25
-rw-r--r--chromium/content/browser/devtools/render_view_devtools_agent_host.cc7
-rw-r--r--chromium/content/browser/devtools/render_view_devtools_agent_host.h1
-rw-r--r--chromium/content/browser/devtools/renderer_overrides_handler.cc131
-rw-r--r--chromium/content/browser/devtools/renderer_overrides_handler.h7
-rw-r--r--chromium/content/browser/dom_storage/dom_storage_browsertest.cc3
-rw-r--r--chromium/content/browser/dom_storage/dom_storage_host.cc24
-rw-r--r--chromium/content/browser/dom_storage/dom_storage_namespace.h2
-rw-r--r--chromium/content/browser/dom_storage/session_storage_database.cc2
-rw-r--r--chromium/content/browser/dom_storage/session_storage_database_unittest.cc1
-rw-r--r--chromium/content/browser/download/download_browsertest.cc40
-rw-r--r--chromium/content/browser/download/download_file_unittest.cc1
-rw-r--r--chromium/content/browser/download/download_manager_impl_unittest.cc3
-rw-r--r--chromium/content/browser/download/download_resource_handler.cc3
-rw-r--r--chromium/content/browser/download/download_resource_handler.h1
-rw-r--r--chromium/content/browser/download/file_metadata_unittest_linux.cc3
-rw-r--r--chromium/content/browser/download/save_package.cc4
-rw-r--r--chromium/content/browser/download/save_package_unittest.cc2
-rw-r--r--chromium/content/browser/fileapi/file_system_browsertest.cc3
-rw-r--r--chromium/content/browser/fileapi/fileapi_message_filter.cc5
-rw-r--r--chromium/content/browser/geolocation/core_location_data_provider_mac.h54
-rw-r--r--chromium/content/browser/geolocation/core_location_data_provider_mac.mm256
-rw-r--r--chromium/content/browser/geolocation/core_location_provider_mac.h40
-rw-r--r--chromium/content/browser/geolocation/core_location_provider_mac.mm68
-rw-r--r--chromium/content/browser/geolocation/geolocation_provider_impl.h7
-rw-r--r--chromium/content/browser/geolocation/location_arbitrator_impl.cc2
-rw-r--r--chromium/content/browser/gpu/gpu_data_manager_impl_private.cc13
-rw-r--r--chromium/content/browser/indexed_db/indexed_db_browsertest.cc3
-rw-r--r--chromium/content/browser/indexed_db/indexed_db_internals_ui.cc5
-rw-r--r--chromium/content/browser/indexed_db/indexed_db_leveldb_coding.cc62
-rw-r--r--chromium/content/browser/indexed_db/indexed_db_leveldb_coding.h4
-rw-r--r--chromium/content/browser/media/webrtc_browsertest.cc8
-rw-r--r--chromium/content/browser/media/webrtc_internals_browsertest.cc9
-rw-r--r--chromium/content/browser/mime_registry_message_filter.cc7
-rw-r--r--chromium/content/browser/mime_registry_message_filter.h3
-rw-r--r--chromium/content/browser/quota_dispatcher_host.cc42
-rw-r--r--chromium/content/browser/quota_dispatcher_host.h2
-rw-r--r--chromium/content/browser/renderer_host/clipboard_message_filter.cc20
-rw-r--r--chromium/content/browser/renderer_host/compositor_impl_android.cc5
-rw-r--r--chromium/content/browser/renderer_host/image_transport_factory_android.cc5
-rw-r--r--chromium/content/browser/renderer_host/input/immediate_input_router.cc20
-rw-r--r--chromium/content/browser/renderer_host/input/immediate_input_router.h9
-rw-r--r--chromium/content/browser/renderer_host/input/immediate_input_router_unittest.cc97
-rw-r--r--chromium/content/browser/renderer_host/input/touch_event_queue.cc7
-rw-r--r--chromium/content/browser/renderer_host/input/touch_event_queue.h9
-rw-r--r--chromium/content/browser/renderer_host/input/web_input_event_builders_win.cc10
-rw-r--r--chromium/content/browser/renderer_host/media/desktop_capture_device.cc246
-rw-r--r--chromium/content/browser/renderer_host/media/desktop_capture_device_unittest.cc88
-rw-r--r--chromium/content/browser/renderer_host/p2p/OWNERS3
-rw-r--r--chromium/content/browser/renderer_host/p2p/socket_host_tcp.cc10
-rw-r--r--chromium/content/browser/renderer_host/pepper/pepper_tcp_socket.cc8
-rw-r--r--chromium/content/browser/renderer_host/render_message_filter.cc1
-rw-r--r--chromium/content/browser/renderer_host/render_process_host_impl.cc1
-rw-r--r--chromium/content/browser/renderer_host/render_view_host_manager_browsertest.cc42
-rw-r--r--chromium/content/browser/renderer_host/render_widget_host_browsertest.cc8
-rw-r--r--chromium/content/browser/renderer_host/render_widget_host_view_aura.cc26
-rw-r--r--chromium/content/browser/renderer_host/render_widget_host_view_guest.cc12
-rw-r--r--chromium/content/browser/renderer_host/ui_events_helper.cc5
-rw-r--r--chromium/content/browser/session_history_browsertest.cc2
-rw-r--r--chromium/content/browser/speech/speech_recognition_browsertest.cc2
-rw-r--r--chromium/content/browser/streams/stream.cc3
-rw-r--r--chromium/content/browser/streams/stream_unittest.cc51
-rw-r--r--chromium/content/browser/streams/stream_url_request_job.cc44
-rw-r--r--chromium/content/browser/web_contents/navigation_controller_impl.cc7
-rw-r--r--chromium/content/browser/web_contents/navigation_controller_impl.h7
-rw-r--r--chromium/content/browser/web_contents/navigation_controller_impl_unittest.cc6
-rw-r--r--chromium/content/browser/web_contents/touch_editable_impl_aura.cc39
-rw-r--r--chromium/content/browser/web_contents/touch_editable_impl_aura.h11
-rw-r--r--chromium/content/browser/web_contents/web_contents_drag_win.cc2
-rw-r--r--chromium/content/browser/web_contents/web_contents_impl.cc73
-rw-r--r--chromium/content/browser/web_contents/web_contents_impl.h7
-rw-r--r--chromium/content/browser/web_contents/web_contents_impl_browsertest.cc27
-rw-r--r--chromium/content/browser/web_contents/web_contents_view_aura.cc6
-rw-r--r--chromium/content/browser/web_contents/web_drag_source_mac.mm86
-rw-r--r--chromium/content/child/fileapi/webfilesystem_impl.cc88
-rw-r--r--chromium/content/child/fileapi/webfilesystem_impl.h26
-rw-r--r--chromium/content/child/fileapi/webfilewriter_impl.h4
-rw-r--r--chromium/content/child/runtime_features.cc3
-rw-r--r--chromium/content/common/browser_plugin/browser_plugin_constants.cc4
-rw-r--r--chromium/content/common/browser_plugin/browser_plugin_constants.h7
-rw-r--r--chromium/content/common/gpu/DEPS1
-rw-r--r--chromium/content/common/gpu/client/gpu_channel_host.cc16
-rw-r--r--chromium/content/common/gpu/client/gpu_channel_host.h5
-rw-r--r--chromium/content/common/gpu/client/gpu_video_decode_accelerator_host.cc16
-rw-r--r--chromium/content/common/gpu/client/gpu_video_encode_accelerator_host.cc217
-rw-r--r--chromium/content/common/gpu/client/gpu_video_encode_accelerator_host.h111
-rw-r--r--chromium/content/common/gpu/gpu_channel.cc28
-rw-r--r--chromium/content/common/gpu/gpu_channel.h9
-rw-r--r--chromium/content/common/gpu/gpu_messages.h73
-rw-r--r--chromium/content/common/gpu/media/gpu_video_encode_accelerator.cc232
-rw-r--r--chromium/content/common/gpu/media/gpu_video_encode_accelerator.h98
-rw-r--r--chromium/content/common/gpu/media/vaapi_h264_decoder.cc4
-rw-r--r--chromium/content/common/handle_enumerator_win.cc2
-rw-r--r--chromium/content/common/media/media_stream_options.cc1
-rw-r--r--chromium/content/common/media/media_stream_options.h1
-rw-r--r--chromium/content/common/mime_registry_messages.h3
-rw-r--r--chromium/content/common/plugin_list.cc23
-rw-r--r--chromium/content/common/plugin_list.h5
-rw-r--r--chromium/content/common/sandbox_init_win.cc2
-rw-r--r--chromium/content/common/view_messages.h3
-rw-r--r--chromium/content/content_browser.gypi4
-rw-r--r--chromium/content/content_child.gypi2
-rw-r--r--chromium/content/content_common.gypi4
-rw-r--r--chromium/content/content_renderer.gypi11
-rw-r--r--chromium/content/content_shell.gypi2
-rw-r--r--chromium/content/content_tests.gypi7
-rw-r--r--chromium/content/public/android/java/res/values-v17/styles.xml17
-rw-r--r--chromium/content/public/android/java/res/values/attrs.xml13
-rw-r--r--chromium/content/public/android/java/resource_map/org/chromium/content/R.java12
-rw-r--r--chromium/content/public/android/java/src/org/chromium/content/browser/ContentView.java9
-rw-r--r--chromium/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java131
-rw-r--r--chromium/content/public/android/java/src/org/chromium/content/browser/ContentViewGestureHandler.java57
-rw-r--r--chromium/content/public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java7
-rw-r--r--chromium/content/public/android/java/src/org/chromium/content/browser/SelectActionModeCallback.java15
-rw-r--r--chromium/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java2
-rw-r--r--chromium/content/public/android/java/src/org/chromium/content/browser/input/HandleView.java15
-rw-r--r--chromium/content/public/android/java/src/org/chromium/content/browser/input/MonthPicker.java8
-rw-r--r--chromium/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDialog.java22
-rw-r--r--chromium/content/public/android/java/src/org/chromium/content/browser/input/TwoFieldDatePicker.java10
-rw-r--r--chromium/content/public/android/java/src/org/chromium/content/browser/input/WeekPicker.java14
-rw-r--r--chromium/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java116
-rw-r--r--chromium/content/public/android/javatests/src/org/chromium/content/browser/ContentViewScrollingTest.java11
-rw-r--r--chromium/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java13
-rw-r--r--chromium/content/public/android/javatests/src/org/chromium/content/browser/input/InsertionHandleTest.java8
-rw-r--r--chromium/content/public/browser/android/synchronous_compositor_client.h3
-rw-r--r--chromium/content/public/browser/browser_plugin_guest_delegate.h5
-rw-r--r--chromium/content/public/browser/content_browser_client.cc1
-rw-r--r--chromium/content/public/browser/content_browser_client.h1
-rw-r--r--chromium/content/public/browser/web_contents_delegate.cc14
-rw-r--r--chromium/content/public/browser/web_contents_delegate.h10
-rw-r--r--chromium/content/public/common/common_param_traits_macros.h4
-rw-r--r--chromium/content/public/common/content_switches.cc12
-rw-r--r--chromium/content/public/common/content_switches.h3
-rw-r--r--chromium/content/public/common/renderer_preferences.h3
-rw-r--r--chromium/content/renderer/accessibility/renderer_accessibility_complete.cc15
-rw-r--r--chromium/content/renderer/accessibility/renderer_accessibility_complete.h6
-rw-r--r--chromium/content/renderer/browser_plugin/browser_plugin.cc40
-rw-r--r--chromium/content/renderer/browser_plugin/browser_plugin.h8
-rw-r--r--chromium/content/renderer/browser_plugin/browser_plugin_bindings.cc38
-rw-r--r--chromium/content/renderer/browser_plugin/browser_plugin_browsertest.cc7
-rw-r--r--chromium/content/renderer/browser_plugin/mock_browser_plugin.h1
-rw-r--r--chromium/content/renderer/gpu/gpu_benchmarking_extension.cc1
-rw-r--r--chromium/content/renderer/media/android/media_source_delegate.cc116
-rw-r--r--chromium/content/renderer/media/android/media_source_delegate.h2
-rw-r--r--chromium/content/renderer/media/media_stream_dependency_factory.cc28
-rw-r--r--chromium/content/renderer/media/media_stream_impl.cc5
-rw-r--r--chromium/content/renderer/media/peer_connection_tracker.cc12
-rw-r--r--chromium/content/renderer/media/renderer_gpu_video_decoder_factories.cc (renamed from chromium/content/renderer/media/renderer_gpu_video_accelerator_factories.cc)244
-rw-r--r--chromium/content/renderer/media/renderer_gpu_video_decoder_factories.h (renamed from chromium/content/renderer/media/renderer_gpu_video_accelerator_factories.h)73
-rw-r--r--chromium/content/renderer/media/rtc_video_decoder.cc12
-rw-r--r--chromium/content/renderer/media/rtc_video_decoder.h8
-rw-r--r--chromium/content/renderer/media/rtc_video_decoder_factory.cc7
-rw-r--r--chromium/content/renderer/media/rtc_video_decoder_factory.h10
-rw-r--r--chromium/content/renderer/media/rtc_video_decoder_unittest.cc10
-rw-r--r--chromium/content/renderer/media/rtc_video_encoder.cc658
-rw-r--r--chromium/content/renderer/media/rtc_video_encoder.h104
-rw-r--r--chromium/content/renderer/media/rtc_video_encoder_factory.cc110
-rw-r--r--chromium/content/renderer/media/rtc_video_encoder_factory.h48
-rw-r--r--chromium/content/renderer/media/webmediaplayer_impl.cc2
-rw-r--r--chromium/content/renderer/media/webmediaplayer_impl.h6
-rw-r--r--chromium/content/renderer/media/webmediaplayer_params.cc4
-rw-r--r--chromium/content/renderer/media/webmediaplayer_params.h9
-rw-r--r--chromium/content/renderer/media/webrtc_audio_device_impl.cc4
-rw-r--r--chromium/content/renderer/media/webrtc_local_audio_track.cc6
-rw-r--r--chromium/content/renderer/media/webrtc_local_audio_track_unittest.cc12
-rw-r--r--chromium/content/renderer/pepper/pepper_in_process_router.cc26
-rw-r--r--chromium/content/renderer/pepper/pepper_in_process_router.h1
-rw-r--r--chromium/content/renderer/pepper/pepper_url_loader_host.cc3
-rw-r--r--chromium/content/renderer/pepper/url_request_info_util.cc1
-rw-r--r--chromium/content/renderer/render_frame_impl.cc11
-rw-r--r--chromium/content/renderer/render_frame_impl.h8
-rw-r--r--chromium/content/renderer/render_thread_impl.cc16
-rw-r--r--chromium/content/renderer/render_thread_impl.h8
-rw-r--r--chromium/content/renderer/render_view_browsertest.cc5
-rw-r--r--chromium/content/renderer/render_view_impl.cc19
-rw-r--r--chromium/content/renderer/render_view_impl.h4
-rw-r--r--chromium/content/renderer/renderer_main.cc2
-rw-r--r--chromium/content/renderer/renderer_webkitplatformsupport_impl.cc26
-rw-r--r--chromium/content/renderer/rendering_benchmark.cc12
-rw-r--r--chromium/content/renderer/rendering_benchmark.h39
-rw-r--r--chromium/content/shell/shell.cc2
-rw-r--r--chromium/content/worker/worker_webkitplatformsupport_impl.cc18
-rw-r--r--chromium/content/worker/worker_webkitplatformsupport_impl.h2
-rw-r--r--chromium/content/zygote/zygote_linux.cc6
-rw-r--r--chromium/extensions/common/manifest_constants.cc151
-rw-r--r--chromium/extensions/common/manifest_constants.h157
-rw-r--r--chromium/extensions/common/matcher/regex_set_matcher.cc1
-rwxr-xr-xchromium/gpu/command_buffer/build_gles2_cmd_buffer.py14
-rw-r--r--chromium/gpu/command_buffer/service/feature_info.cc7
-rw-r--r--chromium/gpu/command_buffer/service/framebuffer_manager.cc7
-rw-r--r--chromium/gpu/command_buffer/service/framebuffer_manager.h9
-rw-r--r--chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc433
-rw-r--r--chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h14
-rw-r--r--chromium/gpu/command_buffer/service/texture_manager.cc234
-rw-r--r--chromium/gpu/command_buffer/service/texture_manager.h81
-rw-r--r--chromium/gpu/config/gpu_driver_bug_list_json.cc13
-rw-r--r--chromium/gpu/config/gpu_driver_bug_workaround_type.h2
-rw-r--r--chromium/ipc/ipc_message.cc2
-rw-r--r--chromium/jingle/glue/chrome_async_socket.cc10
-rw-r--r--chromium/jingle/glue/chrome_async_socket_unittest.cc8
-rw-r--r--chromium/jingle/glue/fake_ssl_client_socket.cc4
-rw-r--r--chromium/jingle/glue/fake_ssl_client_socket.h3
-rw-r--r--chromium/jingle/glue/fake_ssl_client_socket_unittest.cc7
-rw-r--r--chromium/jingle/glue/resolving_client_socket_factory.h7
-rw-r--r--chromium/jingle/glue/xmpp_client_socket_factory.cc26
-rw-r--r--chromium/jingle/glue/xmpp_client_socket_factory.h6
-rw-r--r--chromium/jingle/notifier/listener/push_notifications_subscribe_task.cc4
-rw-r--r--chromium/media/audio/android/audio_manager_android.cc9
-rw-r--r--chromium/media/audio/clockless_audio_sink.cc107
-rw-r--r--chromium/media/audio/clockless_audio_sink.h55
-rw-r--r--chromium/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java21
-rw-r--r--chromium/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java338
-rw-r--r--chromium/media/base/android/java/src/org/chromium/media/VideoCapture.java8
-rw-r--r--chromium/media/base/android/media_codec_bridge.cc30
-rw-r--r--chromium/media/base/android/media_codec_bridge.h4
-rw-r--r--chromium/media/base/android/media_drm_bridge.cc91
-rw-r--r--chromium/media/base/android/media_drm_bridge.h29
-rw-r--r--chromium/media/base/android/media_jni_registrar.cc3
-rw-r--r--chromium/media/base/android/media_source_player.cc15
-rw-r--r--chromium/media/base/run_all_unittests.cc3
-rw-r--r--chromium/media/ffmpeg/ffmpeg_regression_tests.cc4
-rw-r--r--chromium/media/filters/ffmpeg_audio_decoder.cc7
-rw-r--r--chromium/media/filters/gpu_video_decoder.cc9
-rw-r--r--chromium/media/filters/gpu_video_decoder.h6
-rw-r--r--chromium/media/filters/gpu_video_decoder_factories.cc (renamed from chromium/media/video/video_encode_accelerator.cc)4
-rw-r--r--chromium/media/filters/gpu_video_decoder_factories.h (renamed from chromium/media/filters/gpu_video_accelerator_factories.h)26
-rw-r--r--chromium/media/filters/mock_gpu_video_accelerator_factories.cc28
-rw-r--r--chromium/media/filters/mock_gpu_video_decoder_factories.cc (renamed from chromium/media/filters/gpu_video_accelerator_factories.cc)6
-rw-r--r--chromium/media/filters/mock_gpu_video_decoder_factories.h (renamed from chromium/media/filters/mock_gpu_video_accelerator_factories.h)33
-rw-r--r--chromium/media/filters/pipeline_integration_test.cc33
-rw-r--r--chromium/media/filters/pipeline_integration_test_base.cc61
-rw-r--r--chromium/media/filters/pipeline_integration_test_base.h19
-rw-r--r--chromium/media/filters/stream_parser_factory.cc4
-rw-r--r--chromium/media/media.gyp35
-rw-r--r--chromium/media/tools/shader_bench/shader_bench.cc14
-rw-r--r--chromium/media/video/capture/win/filter_base_win.cc2
-rw-r--r--chromium/media/video/capture/win/pin_base_win.cc2
-rw-r--r--chromium/media/video/video_encode_accelerator.h145
-rw-r--r--chromium/media/webm/webm_cluster_parser.cc4
-rw-r--r--chromium/net/OWNERS1
-rw-r--r--chromium/net/android/java/src/org/chromium/net/AndroidKeyStore.java19
-rw-r--r--chromium/net/android/keystore_openssl.cc79
-rw-r--r--chromium/net/base/mime_util.cc9
-rw-r--r--chromium/net/base/net_log_event_type_list.h52
-rw-r--r--chromium/net/cert/x509_cert_types.h8
-rw-r--r--chromium/net/cert/x509_cert_types_unittest.cc108
-rw-r--r--chromium/net/disk_cache/backend_unittest.cc2
-rw-r--r--chromium/net/disk_cache/entry_unittest.cc1
-rw-r--r--chromium/net/disk_cache/simple/simple_entry_impl.cc2
-rw-r--r--chromium/net/disk_cache/simple/simple_index_file.cc114
-rw-r--r--chromium/net/disk_cache/simple/simple_index_file.h15
-rw-r--r--chromium/net/disk_cache/simple/simple_index_file_posix.cc52
-rw-r--r--chromium/net/disk_cache/simple/simple_index_file_win.cc33
-rw-r--r--chromium/net/disk_cache/simple/simple_util.cc2
-rw-r--r--chromium/net/disk_cache/simple/simple_util.h3
-rw-r--r--chromium/net/dns/address_sorter_posix_unittest.cc16
-rw-r--r--chromium/net/dns/dns_session_unittest.cc24
-rw-r--r--chromium/net/dns/dns_socket_pool.cc4
-rw-r--r--chromium/net/dns/dns_transaction_unittest.cc14
-rw-r--r--chromium/net/dns/host_resolver_impl.cc50
-rw-r--r--chromium/net/ftp/ftp_network_transaction.cc8
-rw-r--r--chromium/net/http/http_basic_stream.cc4
-rw-r--r--chromium/net/http/http_basic_stream.h2
-rw-r--r--chromium/net/http/http_cache_transaction.cc14
-rw-r--r--chromium/net/http/http_cache_unittest.cc76
-rw-r--r--chromium/net/http/http_network_transaction.cc6
-rw-r--r--chromium/net/http/http_network_transaction_unittest.cc300
-rw-r--r--chromium/net/http/http_pipelined_host_forced.cc7
-rw-r--r--chromium/net/http/http_pipelined_stream.cc5
-rw-r--r--chromium/net/http/http_pipelined_stream.h2
-rw-r--r--chromium/net/http/http_proxy_client_socket_pool.cc25
-rw-r--r--chromium/net/http/http_proxy_client_socket_pool.h4
-rw-r--r--chromium/net/http/http_response_body_drainer_unittest.cc2
-rw-r--r--chromium/net/http/http_stream_base.h3
-rw-r--r--chromium/net/http/http_stream_factory.h3
-rw-r--r--chromium/net/http/http_stream_factory_impl.h7
-rw-r--r--chromium/net/http/http_stream_factory_impl_job.cc9
-rw-r--r--chromium/net/http/http_stream_factory_impl_job.h3
-rw-r--r--chromium/net/http/http_stream_factory_impl_request.cc9
-rw-r--r--chromium/net/http/http_stream_factory_impl_request.h1
-rw-r--r--chromium/net/http/http_stream_factory_impl_request_unittest.cc98
-rw-r--r--chromium/net/http/http_stream_factory_impl_unittest.cc2
-rw-r--r--chromium/net/http/http_stream_parser_unittest.cc4
-rw-r--r--chromium/net/http/mock_http_cache.cc22
-rw-r--r--chromium/net/http/mock_http_cache.h8
-rw-r--r--chromium/net/http/proxy_connect_redirect_http_stream.cc4
-rw-r--r--chromium/net/http/proxy_connect_redirect_http_stream.h4
-rw-r--r--chromium/net/net.gyp8
-rw-r--r--chromium/net/quic/quic_client_session.cc15
-rw-r--r--chromium/net/quic/quic_client_session.h7
-rw-r--r--chromium/net/quic/quic_client_session_test.cc6
-rw-r--r--chromium/net/quic/quic_connection.cc4
-rw-r--r--chromium/net/quic/quic_connection.h6
-rw-r--r--chromium/net/quic/quic_connection_logger.cc85
-rw-r--r--chromium/net/quic/quic_connection_logger.h11
-rw-r--r--chromium/net/quic/quic_crypto_client_stream.cc2
-rw-r--r--chromium/net/quic/quic_crypto_server_stream.cc2
-rw-r--r--chromium/net/quic/quic_crypto_stream.cc6
-rw-r--r--chromium/net/quic/quic_crypto_stream.h3
-rw-r--r--chromium/net/quic/quic_http_stream.cc4
-rw-r--r--chromium/net/quic/quic_http_stream.h1
-rw-r--r--chromium/net/quic/quic_http_stream_test.cc10
-rw-r--r--chromium/net/quic/quic_session.cc8
-rw-r--r--chromium/net/quic/quic_session.h8
-rw-r--r--chromium/net/quic/quic_stream_factory.cc8
-rw-r--r--chromium/net/socket/buffered_write_stream_socket.cc4
-rw-r--r--chromium/net/socket/buffered_write_stream_socket.h6
-rw-r--r--chromium/net/socket/buffered_write_stream_socket_unittest.cc7
-rw-r--r--chromium/net/socket/client_socket_factory.cc44
-rw-r--r--chromium/net/socket/client_socket_factory.h16
-rw-r--r--chromium/net/socket/client_socket_handle.cc10
-rw-r--r--chromium/net/socket/client_socket_handle.h6
-rw-r--r--chromium/net/socket/client_socket_pool.h3
-rw-r--r--chromium/net/socket/client_socket_pool_base.cc87
-rw-r--r--chromium/net/socket/client_socket_pool_base.h44
-rw-r--r--chromium/net/socket/client_socket_pool_base_unittest.cc49
-rw-r--r--chromium/net/socket/nss_ssl_util.cc5
-rw-r--r--chromium/net/socket/socket_test_util.cc100
-rw-r--r--chromium/net/socket/socket_test_util.h26
-rw-r--r--chromium/net/socket/socks5_client_socket.cc22
-rw-r--r--chromium/net/socket/socks5_client_socket.h9
-rw-r--r--chromium/net/socket/socks5_client_socket_unittest.cc69
-rw-r--r--chromium/net/socket/socks_client_socket.cc25
-rw-r--r--chromium/net/socket/socks_client_socket.h10
-rw-r--r--chromium/net/socket/socks_client_socket_pool.cc28
-rw-r--r--chromium/net/socket/socks_client_socket_pool.h4
-rw-r--r--chromium/net/socket/socks_client_socket_unittest.cc95
-rw-r--r--chromium/net/socket/ssl_client_socket_nss.cc11
-rw-r--r--chromium/net/socket/ssl_client_socket_nss.h2
-rw-r--r--chromium/net/socket/ssl_client_socket_openssl.cc6
-rw-r--r--chromium/net/socket/ssl_client_socket_openssl.h2
-rw-r--r--chromium/net/socket/ssl_client_socket_openssl_unittest.cc14
-rw-r--r--chromium/net/socket/ssl_client_socket_pool.cc25
-rw-r--r--chromium/net/socket/ssl_client_socket_pool.h4
-rw-r--r--chromium/net/socket/ssl_client_socket_unittest.cc1200
-rw-r--r--chromium/net/socket/ssl_server_socket.h5
-rw-r--r--chromium/net/socket/ssl_server_socket_nss.cc11
-rw-r--r--chromium/net/socket/ssl_server_socket_nss.h2
-rw-r--r--chromium/net/socket/ssl_server_socket_openssl.cc12
-rw-r--r--chromium/net/socket/ssl_server_socket_unittest.cc16
-rw-r--r--chromium/net/socket/transport_client_socket_pool.cc33
-rw-r--r--chromium/net/socket/transport_client_socket_pool.h4
-rw-r--r--chromium/net/socket/transport_client_socket_pool_unittest.cc42
-rw-r--r--chromium/net/socket/transport_client_socket_unittest.cc4
-rw-r--r--chromium/net/socket_stream/socket_stream.cc89
-rw-r--r--chromium/net/socket_stream/socket_stream.h4
-rw-r--r--chromium/net/spdy/spdy_credential_builder_unittest.cc5
-rw-r--r--chromium/net/spdy/spdy_http_stream.cc5
-rw-r--r--chromium/net/spdy/spdy_http_stream.h1
-rw-r--r--chromium/net/spdy/spdy_http_stream_unittest.cc2
-rw-r--r--chromium/net/spdy/spdy_network_transaction_unittest.cc63
-rw-r--r--chromium/net/spdy/spdy_stream.cc2
-rw-r--r--chromium/net/spdy/spdy_test_util_common.cc4
-rw-r--r--chromium/net/ssl/server_bound_cert_service.cc201
-rw-r--r--chromium/net/ssl/server_bound_cert_service.h48
-rw-r--r--chromium/net/ssl/server_bound_cert_service_unittest.cc289
-rw-r--r--chromium/net/ssl/ssl_config_service.cc2
-rw-r--r--chromium/net/third_party/nss/README.chromium13
-rw-r--r--chromium/net/third_party/nss/patches/aesgcm.patch1179
-rw-r--r--chromium/net/third_party/nss/patches/aesgcmchromium.patch117
-rwxr-xr-xchromium/net/third_party/nss/patches/applypatches.sh4
-rw-r--r--chromium/net/third_party/nss/patches/tls12backuphash.patch220
-rw-r--r--chromium/net/third_party/nss/ssl/dtlscon.c7
-rw-r--r--chromium/net/third_party/nss/ssl/ssl3con.c884
-rw-r--r--chromium/net/third_party/nss/ssl/ssl3ecc.c4
-rw-r--r--chromium/net/third_party/nss/ssl/sslenum.c8
-rw-r--r--chromium/net/third_party/nss/ssl/sslimpl.h56
-rw-r--r--chromium/net/third_party/nss/ssl/sslinfo.c10
-rw-r--r--chromium/net/third_party/nss/ssl/sslproto.h9
-rw-r--r--chromium/net/third_party/nss/ssl/sslsock.c4
-rw-r--r--chromium/net/third_party/nss/ssl/sslt.h5
-rw-r--r--chromium/ppapi/native_client/src/trusted/plugin/json_manifest.cc19
-rwxr-xr-xchromium/ppapi/native_client/tools/browser_tester/browser_tester.py6
-rwxr-xr-xchromium/ppapi/native_client/tools/browser_tester/browsertester/browserlauncher.py14
-rw-r--r--chromium/ppapi/proxy/plugin_resource_tracker.cc1
-rw-r--r--chromium/ppapi/shared_impl/id_assignment.h2
-rw-r--r--chromium/ppapi/shared_impl/resource_tracker.cc45
-rw-r--r--chromium/ppapi/shared_impl/resource_tracker.h13
-rw-r--r--chromium/printing/image_android.cc (renamed from chromium/components/policy/stub_to_remove.cc)11
-rw-r--r--chromium/printing/image_linux.cc2
-rw-r--r--chromium/printing/metafile.h6
-rw-r--r--chromium/printing/pdf_metafile_skia.cc2
-rw-r--r--chromium/printing/pdf_metafile_skia.h4
-rw-r--r--chromium/printing/printed_document.cc4
-rw-r--r--chromium/printing/printing.gyp6
-rw-r--r--chromium/printing/printing_context_android.h68
-rw-r--r--chromium/remoting/remoting.gyp40
-rw-r--r--chromium/sandbox/win/sandbox_poc/pocdll/fs.cc2
-rw-r--r--chromium/sandbox/win/src/handle_policy.cc2
-rw-r--r--chromium/skia/ext/opacity_draw_filter.cc27
-rw-r--r--chromium/skia/ext/opacity_draw_filter.h33
-rw-r--r--chromium/skia/skia_chrome.gypi4
-rw-r--r--chromium/skia/skia_library.gypi2
-rw-r--r--chromium/skia/skia_system.gypi7
-rw-r--r--chromium/sync/android/java/src/org/chromium/sync/signin/ChromeSigninController.java29
-rw-r--r--chromium/sync/engine/net/server_connection_manager.cc6
-rw-r--r--chromium/sync/engine/syncer_proto_util.cc19
-rw-r--r--chromium/sync/engine/syncer_proto_util.h5
-rw-r--r--chromium/sync/engine/syncer_proto_util_unittest.cc14
-rw-r--r--chromium/sync/internal_api/public/engine/model_safe_worker.cc32
-rw-r--r--chromium/sync/internal_api/public/engine/model_safe_worker.h1
-rw-r--r--chromium/third_party/WebKit/Source/bindings/OWNERS1
-rw-r--r--chromium/third_party/WebKit/Source/bindings/scripts/IDLAttributes.txt1
-rw-r--r--chromium/third_party/WebKit/Source/bindings/scripts/deprecated_code_generator_v8.pm38
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp24
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.h7
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/ScriptProfiler.cpp7
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/ScriptProfiler.h1
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/ScriptSourceCode.h4
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/V8ErrorHandler.cpp14
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/V8ErrorHandler.h5
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/V8Initializer.cpp26
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/V8ScriptRunner.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/WorkerScriptController.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/WorkerScriptController.h1
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/custom/V8WorkerGlobalScopeCustom.cpp20
-rw-r--r--chromium/third_party/WebKit/Source/bindings/v8/custom/V8XMLHttpRequestCustom.cpp10
-rw-r--r--chromium/third_party/WebKit/Source/core/animation/AnimatableTransform.cpp54
-rw-r--r--chromium/third_party/WebKit/Source/core/animation/AnimatableValue.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/animation/DocumentTimeline.cpp24
-rw-r--r--chromium/third_party/WebKit/Source/core/animation/DocumentTimeline.h5
-rw-r--r--chromium/third_party/WebKit/Source/core/animation/DocumentTimelineTest.cpp62
-rw-r--r--chromium/third_party/WebKit/Source/core/animation/Player.cpp1
-rw-r--r--chromium/third_party/WebKit/Source/core/animation/PlayerTest.cpp1
-rw-r--r--chromium/third_party/WebKit/Source/core/animation/css/CSSAnimatableValueFactory.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/animation/css/CSSAnimations.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/core.gyp61
-rw-r--r--chromium/third_party/WebKit/Source/core/core.gypi121
-rw-r--r--chromium/third_party/WebKit/Source/core/core_derived_sources.gyp2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSArrayFunctionValue.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSCanvasValue.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp51
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSCursorImageValue.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSFilterValue.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSFontSelector.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSFontSelector.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSGradientValue.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSImageSetValue.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSImageValue.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSImageValue.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSInitialValue.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSKeyframeRule.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSKeyframeRule.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSKeyframesRule.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSLineBoxContainValue.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSParser-in.cpp42
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSParser.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSProperty.cpp9
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSProperty.h58
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSPropertyNames.in9
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSShaderValue.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/css/CSSShorthands.in1
-rw-r--r--chromium/third_party/WebKit/Source/core/css/MediaQueryEvaluator.cpp16
-rw-r--r--chromium/third_party/WebKit/Source/core/css/StyleInvalidationAnalysis.cpp28
-rw-r--r--chromium/third_party/WebKit/Source/core/css/StylePropertyShorthandCustom.cpp39
-rw-r--r--chromium/third_party/WebKit/Source/core/css/StyleRuleImport.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/css/StyleRuleImport.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/css/StyleSheetContents.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp120
-rw-r--r--chromium/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.h3
-rw-r--r--chromium/third_party/WebKit/Source/core/css/resolver/StyleBuilderCustom.cpp9
-rw-r--r--chromium/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp33
-rw-r--r--chromium/third_party/WebKit/Source/core/css/resolver/StyleResolver.h14
-rw-r--r--chromium/third_party/WebKit/Source/core/css/resolver/StyleResourceLoader.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/Clipboard.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/Clipboard.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/ContainerNode.cpp5
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/CustomElement.cpp5
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/CustomElementException.cpp99
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/CustomElementException.h68
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/CustomElementObserver.cpp62
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/CustomElementObserver.h64
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/CustomElementRegistry.cpp26
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/CustomElementUpgradeCandidateMap.cpp44
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/CustomElementUpgradeCandidateMap.h16
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/DataTransferItemList.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/DataTransferItemList.idl12
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/Document.cpp128
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/Document.h22
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/Document.idl16
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.cpp217
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.h24
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/DocumentType.idl6
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/Element.cpp26
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/Element.h1
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/Element.idl10
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/Node.cpp46
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/Node.h3
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/Node.idl10
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/PendingScript.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/PendingScript.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp12
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/ProcessingInstruction.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/ScriptLoader.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/ScriptLoader.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/ScriptRunner.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/ScriptRunner.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.cpp132
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.h55
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/StyleElement.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/StyleSheetCollection.cpp210
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/StyleSheetCollection.h34
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/shadow/ContentDistributor.cpp14
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.cpp42
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.cpp3
-rw-r--r--chromium/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.h11
-rw-r--r--chromium/third_party/WebKit/Source/core/editing/Editor.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/features.gypi2
-rw-r--r--chromium/third_party/WebKit/Source/core/history/BackForwardClient.h10
-rw-r--r--chromium/third_party/WebKit/Source/core/history/BackForwardController.cpp75
-rw-r--r--chromium/third_party/WebKit/Source/core/history/BackForwardController.h21
-rw-r--r--chromium/third_party/WebKit/Source/core/history/HistoryItem.cpp12
-rw-r--r--chromium/third_party/WebKit/Source/core/history/HistoryItem.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/html/BaseMultipleFieldsDateAndTimeInputType.cpp8
-rw-r--r--chromium/third_party/WebKit/Source/core/html/DOMURL.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/FormAssociatedElement.cpp3
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLCollection.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLDocument.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLElement.cpp5
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLEmbedElement.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLFieldSetElement.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLImageElement.cpp7
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLImageLoader.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLImportLoader.cpp12
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLImportLoader.h7
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLImportsController.cpp9
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLImportsController.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp10
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLLinkElement.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLNameCollection.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLObjectElement.cpp5
-rw-r--r--chromium/third_party/WebKit/Source/core/html/HTMLObjectElement.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/html/ImageDocument.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/ImageInputType.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/LinkResource.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/RadioNodeList.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/SearchInputType.cpp3
-rw-r--r--chromium/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext2D.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/canvas/WebGLRenderingContext.cpp155
-rw-r--r--chromium/third_party/WebKit/Source/core/html/canvas/WebGLRenderingContext.h41
-rw-r--r--chromium/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/parser/HTMLResourcePreloader.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/html/parser/HTMLResourcePreloader.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.cpp9
-rw-r--r--chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InjectedScriptCanvasModuleSource.js849
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InjectedScriptSource.js20
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorController.cpp9
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorController.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp19
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorFrontendHost.cpp3
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorOverlay.cpp8
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorOverlay.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp18
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.cpp3
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp8
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorState.cpp15
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/InspectorState.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/inspector/ScriptProfile.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/CrossOriginAccessControl.cpp17
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/CrossOriginAccessControl.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/CrossOriginPreflightResultCache.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/DocumentLoader.cpp17
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/DocumentLoader.h10
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/EmptyClients.h10
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/FrameLoader.cpp137
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/FrameLoader.h27
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/FrameLoaderClient.h3
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/FrameLoaderStateMachine.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/FrameLoaderTypes.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/HistoryController.cpp24
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/ImageLoader.cpp11
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/ImageLoader.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/LinkLoader.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/LinkLoader.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/MixedContentChecker.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp3
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/PingLoader.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/ResourceLoadNotifier.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourceLoadNotifier.cpp)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/ResourceLoadNotifier.h (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourceLoadNotifier.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/ResourceLoader.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp)8
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/ResourceLoader.h (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourceLoader.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/ResourceLoaderHost.h (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourceLoaderHost.h)0
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/ResourceLoaderOptions.h (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourceLoaderOptions.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/TextTrackLoader.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/TextTrackLoader.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/ThreadableLoader.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/CSSStyleSheetResource.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp)6
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/CSSStyleSheetResource.h (renamed from chromium/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/CachePolicy.h (renamed from chromium/third_party/WebKit/Source/core/fetch/CachePolicy.h)14
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/DocumentResource.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/DocumentResource.cpp)6
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/DocumentResource.h (renamed from chromium/third_party/WebKit/Source/core/fetch/DocumentResource.h)6
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/DocumentResourceReference.h (renamed from chromium/third_party/WebKit/Source/core/fetch/DocumentResourceReference.h)4
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/FetchInitiatorInfo.h (renamed from chromium/third_party/WebKit/Source/core/fetch/FetchInitiatorInfo.h)0
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/FetchInitiatorTypeNames.in (renamed from chromium/third_party/WebKit/Source/core/fetch/FetchInitiatorTypeNames.in)0
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/FetchRequest.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/FetchRequest.cpp)6
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/FetchRequest.h (renamed from chromium/third_party/WebKit/Source/core/fetch/FetchRequest.h)4
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/FontResource.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/FontResource.cpp)6
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/FontResource.h (renamed from chromium/third_party/WebKit/Source/core/fetch/FontResource.h)4
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ImageResource.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/ImageResource.cpp)12
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ImageResource.h (renamed from chromium/third_party/WebKit/Source/core/fetch/ImageResource.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ImageResourceClient.h (renamed from chromium/third_party/WebKit/Source/core/fetch/ImageResourceClient.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ImageResourceTest.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp)12
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/MemoryCache.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/MemoryCache.cpp)20
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/MemoryCache.h (renamed from chromium/third_party/WebKit/Source/core/fetch/MemoryCache.h)8
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/MemoryCacheTest.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/MemoryCacheTest.cpp)8
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/MockImageResourceClient.h (renamed from chromium/third_party/WebKit/Source/core/fetch/MockImageResourceClient.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/RawResource.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/RawResource.cpp)10
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/RawResource.h (renamed from chromium/third_party/WebKit/Source/core/fetch/RawResource.h)4
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/Resource.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/Resource.cpp)16
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/Resource.h (renamed from chromium/third_party/WebKit/Source/core/fetch/Resource.h)4
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ResourceClient.h (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourceClient.h)0
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ResourceClientWalker.h (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourceClientWalker.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ResourceFetcher.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp)26
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ResourceFetcher.h (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourceFetcher.h)12
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ResourceFetcherTest.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp)10
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ResourcePtr.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourcePtr.cpp)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ResourcePtr.h (renamed from chromium/third_party/WebKit/Source/core/fetch/ResourcePtr.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ScriptResource.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/ScriptResource.cpp)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ScriptResource.h (renamed from chromium/third_party/WebKit/Source/core/fetch/ScriptResource.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ShaderResource.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/ShaderResource.cpp)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/ShaderResource.h (renamed from chromium/third_party/WebKit/Source/core/fetch/ShaderResource.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/StyleSheetResourceClient.h (renamed from chromium/third_party/WebKit/Source/core/fetch/StyleSheetResourceClient.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/TextTrackResource.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/TextTrackResource.cpp)6
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/TextTrackResource.h (renamed from chromium/third_party/WebKit/Source/core/fetch/TextTrackResource.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/XSLStyleSheetResource.cpp (renamed from chromium/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.cpp)6
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/cache/XSLStyleSheetResource.h (renamed from chromium/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/AutoscrollController.cpp5
-rw-r--r--chromium/third_party/WebKit/Source/core/page/Chrome.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/page/ChromeClient.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/ContextMenuClient.h1
-rw-r--r--chromium/third_party/WebKit/Source/core/page/ContextMenuController.cpp11
-rw-r--r--chromium/third_party/WebKit/Source/core/page/ContextMenuController.h3
-rw-r--r--chromium/third_party/WebKit/Source/core/page/DOMWindow.cpp46
-rw-r--r--chromium/third_party/WebKit/Source/core/page/DOMWindow.h9
-rw-r--r--chromium/third_party/WebKit/Source/core/page/DOMWindowBase64.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleNotifier.cpp57
-rw-r--r--chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleNotifier.h68
-rw-r--r--chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleObserver.cpp49
-rw-r--r--chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleObserver.h48
-rw-r--r--chromium/third_party/WebKit/Source/core/page/DragController.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/page/EventHandler.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/Frame.cpp13
-rw-r--r--chromium/third_party/WebKit/Source/core/page/Frame.h1
-rw-r--r--chromium/third_party/WebKit/Source/core/page/FrameView.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/ImageBitmap.cpp32
-rw-r--r--chromium/third_party/WebKit/Source/core/page/ImageBitmap.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/ImageBitmapFactories.cpp223
-rw-r--r--chromium/third_party/WebKit/Source/core/page/ImageBitmapFactories.h65
-rw-r--r--chromium/third_party/WebKit/Source/core/page/ImageBitmapFactories.idl (renamed from chromium/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapFactories.idl)2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/ImageBitmapTest.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/Page.cpp11
-rw-r--r--chromium/third_party/WebKit/Source/core/page/Page.h10
-rw-r--r--chromium/third_party/WebKit/Source/core/page/PageSerializer.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/RuntimeEnabledFeatures.in2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/Settings.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/UseCounter.cpp15
-rw-r--r--chromium/third_party/WebKit/Source/core/page/UseCounter.h18
-rw-r--r--chromium/third_party/WebKit/Source/core/page/animation/CSSPropertyAnimation.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/animation/KeyframeAnimation.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp15
-rw-r--r--chromium/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.h10
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/AsyncFileSystem.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/DEPS2
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/LifecycleNotifier.h3
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/LifecycleObserver.h3
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/animation/CSSAnimationData.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/animation/CSSAnimationDataList.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ChromiumDataObject.cpp16
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ChromiumDataObject.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ClipboardChromium.cpp24
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ClipboardChromium.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/PasteboardChromium.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromium.cpp (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeNonMacCommon.cpp)25
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromium.h (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeNonMacCommon.h)8
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumAndroid.cpp (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeAndroid.cpp)5
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumDefault.cpp (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeAuraOrGtk.cpp)24
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumDefault.h (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeAuraOrGtk.h)8
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumOverlay.cpp (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeOverlay.cpp)20
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumOverlay.h (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeOverlay.h)6
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumWin.cpp (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeWin.cpp)37
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumWin.h (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeWin.h)8
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/graphics/GraphicsLayer.h12
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/graphics/filters/FilterOperation.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/graphics/transforms/TransformOperations.cpp8
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/graphics/transforms/TransformOperations.h1
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/mac/ScrollAnimatorMac.mm4
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMac.h (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacCommon.h)6
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMac.mm (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacCommon.mm)8
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMacNonOverlayAPI.h (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacNonOverlayAPI.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMacNonOverlayAPI.mm (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacNonOverlayAPI.mm)2
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMacOverlayAPI.h (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacOverlayAPI.h)2
-rw-r--r--chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMacOverlayAPI.mm (renamed from chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacOverlayAPI.mm)2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/FilterEffectRenderer.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/HitTestLocation.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/HitTestResult.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/PaintInfo.h8
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderBlock.cpp256
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderBlock.h153
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderBlockLineLayout.cpp44
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderBox.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderGrid.cpp3
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderImage.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderImageResource.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderImageResource.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderImageResourceStyleImage.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderLayerBacking.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderLayerFilterInfo.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderLayerFilterInfo.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderListMarker.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderObject.cpp29
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderObject.h25
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderSearchField.cpp5
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderTable.cpp7
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderTableCell.cpp15
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderTableCell.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderTableCol.cpp1
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderTableRow.cpp8
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/RenderTableSection.cpp49
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/SubtreeLayoutScope.cpp79
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/SubtreeLayoutScope.h73
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.cpp154
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.h80
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.cpp44
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInfo.cpp22
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInsideInfo.cpp14
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeOutsideInfo.cpp16
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/style/KeyframeList.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/style/KeyframeList.h8
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/style/SVGRenderStyle.cpp5
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/style/ShapeValue.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/style/StyleCustomFilterProgram.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImage.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImage.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImageSet.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImageSet.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedShader.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedShader.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/svg/ReferenceFilterBuilder.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGResourceClipper.cpp13
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGResourceClipper.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGTextPath.cpp8
-rw-r--r--chromium/third_party/WebKit/Source/core/scripts/templates/StylePropertyShorthand.h.tmpl5
-rw-r--r--chromium/third_party/WebKit/Source/core/storage/Storage.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/storage/Storage.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/storage/StorageArea.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/storage/StorageEvent.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGAnimationElement.h3
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGClipPathElement.h7
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp9
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGFEImageElement.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGFontFaceUriElement.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGFontFaceUriElement.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGImageLoader.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGTextContentElement.cpp3
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGTextContentElement.idl16
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGTextPathElement.h8
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGUseElement.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGUseElement.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/graphics/SVGImageCache.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/testing/InspectorFrontendClientLocal.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/testing/InspectorFrontendClientLocal.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/testing/Internals.cpp159
-rw-r--r--chromium/third_party/WebKit/Source/core/testing/Internals.h17
-rw-r--r--chromium/third_party/WebKit/Source/core/testing/Internals.idl2
-rw-r--r--chromium/third_party/WebKit/Source/core/testing/LayerRect.h10
-rw-r--r--chromium/third_party/WebKit/Source/core/testing/LayerRect.idl1
-rw-r--r--chromium/third_party/WebKit/Source/core/testing/LayerRectList.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/testing/LayerRectList.h3
-rw-r--r--chromium/third_party/WebKit/Source/core/testing/MallocStatistics.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/testing/MockPagePopupDriver.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/testing/TypeConversions.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/AbstractWorker.cpp8
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/AbstractWorker.h8
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/DefaultSharedWorkerRepository.h16
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/SharedWorker.cpp10
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/SharedWorkerRepository.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/Worker.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/Worker.h8
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/WorkerEventQueue.h8
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/WorkerGlobalScope.idl2
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/WorkerLoaderProxy.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/WorkerLocation.cpp3
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.h12
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/WorkerObjectProxy.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/WorkerReportingProxy.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/WorkerRunLoop.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/WorkerRunLoop.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp7
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/DOMParser.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/NativeXPathNSResolver.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/NativeXPathNSResolver.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XMLErrors.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XMLErrors.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XMLHttpRequest.cpp15
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XMLHttpRequest.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XMLHttpRequestUpload.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XMLSerializer.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XPathExpression.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XPathExpressionNode.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XPathExpressionNode.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XPathFunctions.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XPathGrammar.y2
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XPathNodeSet.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XPathParser.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XPathPredicate.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XPathUtil.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XPathUtil.h4
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XPathValue.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XPathValue.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XSLImportRule.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XSLImportRule.h6
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XSLStyleSheet.h2
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XSLTProcessor.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XSLTProcessorLibxslt.cpp21
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/XSLTUnicodeSort.cpp4
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp22
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h12
-rw-r--r--chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParserScope.h3
-rw-r--r--chromium/third_party/WebKit/Source/devtools/devtools.gyp30
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/AuditLauncherView.js30
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/CPUProfileView.js36
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/CanvasProfileView.js9
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/CodeMirrorTextEditor.js11
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/DebuggerModel.js60
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/JavaScriptSourceFrame.js236
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/KeyboardShortcut.js5
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/LayerTree.js131
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/LayerTreeModel.js278
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/Layers3DView.js173
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/LayersPanel.js73
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/LayersPanelDescriptor.js40
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/OverridesView.js45
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/ScriptsPanel.js74
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/ScriptsPanelDescriptor.js6
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/Settings.js1
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/helpScreen.css29
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/inspector.css10
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/inspector.html1
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/inspector.js4
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/layersPanel.css99
-rw-r--r--chromium/third_party/WebKit/Source/devtools/protocol.json9
-rwxr-xr-xchromium/third_party/WebKit/Source/devtools/scripts/compile_frontend.py10
-rw-r--r--chromium/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.cpp8
-rw-r--r--chromium/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.h6
-rw-r--r--chromium/third_party/WebKit/Source/modules/encoding/OWNERS2
-rw-r--r--chromium/third_party/WebKit/Source/modules/filesystem/DOMFileSystemSync.cpp6
-rw-r--r--chromium/third_party/WebKit/Source/modules/filesystem/DirectoryReaderSync.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapFactories.cpp344
-rw-r--r--chromium/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapFactories.h119
-rw-r--r--chromium/third_party/WebKit/Source/modules/imagebitmap/OWNERS2
-rw-r--r--chromium/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/modules/modules.gypi3
-rw-r--r--chromium/third_party/WebKit/Source/modules/navigatorcontentutils/NavigatorContentUtils.cpp5
-rw-r--r--chromium/third_party/WebKit/Source/web/AssociatedURLLoader.cpp1
-rw-r--r--chromium/third_party/WebKit/Source/web/AsyncFileSystemChromium.cpp31
-rw-r--r--chromium/third_party/WebKit/Source/web/AsyncFileSystemChromium.h5
-rw-r--r--chromium/third_party/WebKit/Source/web/BackForwardClientImpl.cpp55
-rw-r--r--chromium/third_party/WebKit/Source/web/BackForwardClientImpl.h14
-rw-r--r--chromium/third_party/WebKit/Source/web/ChromeClientImpl.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/web/ChromeClientImpl.h2
-rw-r--r--chromium/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp10
-rw-r--r--chromium/third_party/WebKit/Source/web/ContextMenuClientImpl.h1
-rw-r--r--chromium/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp28
-rw-r--r--chromium/third_party/WebKit/Source/web/FrameLoaderClientImpl.h3
-rw-r--r--chromium/third_party/WebKit/Source/web/PageOverlay.cpp12
-rw-r--r--chromium/third_party/WebKit/Source/web/WebCache.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/web/WebCachedURLRequest.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/web/WebDataSourceImpl.cpp7
-rw-r--r--chromium/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp10
-rw-r--r--chromium/third_party/WebKit/Source/web/WebFileSystemCallbacksImpl.cpp12
-rw-r--r--chromium/third_party/WebKit/Source/web/WebFileSystemCallbacksImpl.h7
-rw-r--r--chromium/third_party/WebKit/Source/web/WebFrameImpl.cpp7
-rw-r--r--chromium/third_party/WebKit/Source/web/WebFrameImpl.h1
-rw-r--r--chromium/third_party/WebKit/Source/web/WebHelperPluginImpl.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/web/WebPagePopupImpl.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/web/WebViewImpl.cpp22
-rw-r--r--chromium/third_party/WebKit/Source/web/WorkerAsyncFileSystemChromium.cpp194
-rw-r--r--chromium/third_party/WebKit/Source/web/WorkerAsyncFileSystemChromium.h92
-rw-r--r--chromium/third_party/WebKit/Source/web/WorkerAsyncFileWriterChromium.cpp84
-rw-r--r--chromium/third_party/WebKit/Source/web/WorkerAsyncFileWriterChromium.h (renamed from chromium/third_party/WebKit/Source/core/animation/AnimatableTransform.h)70
-rw-r--r--chromium/third_party/WebKit/Source/web/WorkerFileSystemClient.cpp2
-rw-r--r--chromium/third_party/WebKit/Source/web/WorkerFileWriterCallbacksBridge.cpp228
-rw-r--r--chromium/third_party/WebKit/Source/web/WorkerFileWriterCallbacksBridge.h165
-rw-r--r--chromium/third_party/WebKit/Source/web/web.gypi6
-rw-r--r--chromium/third_party/WebKit/Source/wtf/Assertions.cpp1
-rw-r--r--chromium/third_party/WebKit/Source/wtf/Platform.h1
-rw-r--r--chromium/third_party/WebKit/Source/wtf/text/Base64.cpp44
-rw-r--r--chromium/third_party/WebKit/Source/wtf/text/Base64.h20
-rw-r--r--chromium/third_party/WebKit/Tools/RebaselineLogServer/app.yaml9
-rw-r--r--chromium/third_party/WebKit/Tools/RebaselineLogServer/logs.html43
-rw-r--r--chromium/third_party/WebKit/Tools/RebaselineLogServer/main.py143
-rw-r--r--chromium/third_party/WebKit/Tools/RebaselineLogServer/main_unittest.py122
-rw-r--r--chromium/third_party/WebKit/Tools/RebaselineLogServer/uploadform.html25
-rw-r--r--chromium/third_party/WebKit/Tools/Scripts/webkitpy/common/net/layouttestresults.py3
-rw-r--r--chromium/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/builders.py3
-rw-r--r--chromium/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py5
-rw-r--r--chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checker.py139
-rw-r--r--chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checker_unittest.py51
-rw-r--r--chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cmake.py150
-rw-r--r--chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cmake_unittest.py90
-rw-r--r--chromium/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py127
-rw-r--r--chromium/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py21
-rw-r--r--chromium/third_party/WebKit/WATCHLISTS3
-rw-r--r--chromium/third_party/WebKit/public/platform/WebCompositorSupport.h3
-rw-r--r--chromium/third_party/WebKit/public/platform/WebFileSystem.h3
-rw-r--r--chromium/third_party/WebKit/public/platform/WebNinePatchLayer.h51
-rw-r--r--chromium/third_party/WebKit/public/web/WebFrame.h2
-rw-r--r--chromium/third_party/WebKit/public/web/WebViewClient.h7
-rw-r--r--chromium/third_party/angle_dx11/src/libEGL/libEGL.rc204
-rw-r--r--chromium/third_party/angle_dx11/src/libGLESv2/libGLESv2.rc204
-rw-r--r--chromium/third_party/cacheinvalidation/cacheinvalidation.gyp1
-rw-r--r--chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/build_constants.h2
-rw-r--r--chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/client-protocol-namespace-fix.h4
-rw-r--r--chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/repeated-field-namespace-fix.h30
-rw-r--r--chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/common/BuildConstants.java2
-rw-r--r--chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/InvalidationClientTestHelper.java47
-rw-r--r--chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/AndroidTiclManifest.java120
-rw-r--r--chromium/third_party/cros_system_api/dbus/service_constants.h4
-rw-r--r--chromium/third_party/cros_system_api/system_api.gyp11
-rw-r--r--chromium/third_party/flot/LICENSE.txt2
-rw-r--r--chromium/third_party/flot/README.chromium4
-rw-r--r--chromium/third_party/flot/excanvas.min.js1
-rw-r--r--chromium/third_party/flot/jquery.colorhelpers.min.js22
-rw-r--r--chromium/third_party/flot/jquery.flot.canvas.min.js28
-rw-r--r--chromium/third_party/flot/jquery.flot.categories.min.js44
-rw-r--r--chromium/third_party/flot/jquery.flot.crosshair.min.js60
-rw-r--r--chromium/third_party/flot/jquery.flot.errorbars.min.js63
-rw-r--r--chromium/third_party/flot/jquery.flot.fillbetween.min.js31
-rw-r--r--chromium/third_party/flot/jquery.flot.image.min.js54
-rw-r--r--chromium/third_party/flot/jquery.flot.min.js31
-rw-r--r--chromium/third_party/flot/jquery.flot.navigate.min.js87
-rw-r--r--chromium/third_party/flot/jquery.flot.pie.min.js57
-rw-r--r--chromium/third_party/flot/jquery.flot.resize.min.js20
-rw-r--r--chromium/third_party/flot/jquery.flot.selection.min.js80
-rw-r--r--chromium/third_party/flot/jquery.flot.stack.min.js37
-rw-r--r--chromium/third_party/flot/jquery.flot.symbol.min.js15
-rw-r--r--chromium/third_party/flot/jquery.flot.threshold.min.js44
-rw-r--r--chromium/third_party/flot/jquery.flot.time.min.js9
-rw-r--r--chromium/third_party/flot/jquery.min.js25
-rw-r--r--chromium/third_party/guava/guava.gyp2
-rw-r--r--chromium/third_party/guava/proguard.flags33
-rw-r--r--chromium/third_party/libusb/README.chromium1
-rw-r--r--chromium/third_party/libusb/darwin-sigfpe.patch22
-rw-r--r--chromium/third_party/libusb/src/libusb/os/darwin_usb.c10
-rw-r--r--chromium/third_party/libxml/chromium/libxml_utils.h6
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_access.sobin0 -> 13464 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_accesslog.sobin0 -> 22812 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_alias.sobin0 -> 13588 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_auth.sobin0 -> 32576 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_cgi.sobin0 -> 28760 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_cml.sobin0 -> 14260 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_compress.sobin0 -> 23480 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_dirlisting.sobin0 -> 23456 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_evasive.sobin0 -> 13404 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_evhost.sobin0 -> 13936 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_expire.sobin0 -> 18000 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_extforward.sobin0 -> 18604 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_fastcgi.sobin0 -> 56612 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_flv_streaming.sobin0 -> 14060 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_indexfile.sobin0 -> 13720 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_magnet.sobin0 -> 8628 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_mysql_vhost.sobin0 -> 12788 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_proxy.sobin0 -> 28648 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_redirect.sobin0 -> 14016 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_rewrite.sobin0 -> 18696 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_rrdtool.sobin0 -> 18380 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_scgi.sobin0 -> 43572 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_secdownload.sobin0 -> 14104 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_setenv.sobin0 -> 13672 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_simple_vhost.sobin0 -> 13996 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_ssi.sobin0 -> 34836 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_staticfile.sobin0 -> 18476 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_status.sobin0 -> 27336 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_trigger_b4_dl.sobin0 -> 13780 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_userdir.sobin0 -> 14068 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_usertrack.sobin0 -> 14124 bytes
-rwxr-xr-xchromium/third_party/lighttpd/mac/lib/mod_webdav.sobin0 -> 28692 bytes
-rw-r--r--chromium/third_party/protobuf/README.chromium4
-rw-r--r--chromium/third_party/protobuf/README.txt2
-rw-r--r--chromium/third_party/protobuf/java/pom.xml14
-rw-r--r--chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/ByteString.java14
-rw-r--r--chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/LazyField.java6
-rw-r--r--chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java1
-rw-r--r--chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java10
-rw-r--r--chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java1
-rw-r--r--chromium/third_party/protobuf/protobuf_lite.gypi1
-rw-r--r--chromium/third_party/protobuf/python/google/protobuf/pyext/python-proto2.cc6
-rwxr-xr-xchromium/third_party/protobuf/python/setup.py7
-rw-r--r--chromium/third_party/protobuf/src/Makefile.am100
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc16
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.pb.cc4
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.pb.h4
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.proto2
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/compiler/subprocess.cc10
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/descriptor.cc28
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/descriptor.h18
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/descriptor.pb.h4
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/descriptor_unittest.cc12
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/dynamic_message.cc8
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/extension_set_unittest.cc8
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/generated_message_reflection.h12
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc4
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/io/gzip_stream.h2
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/io/printer_unittest.cc4
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/io/tokenizer_unittest.cc12
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/message.h21
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/message_unittest.cc4
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/reflection_ops_unittest.cc4
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/repeated_field.h10
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc6
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/repeated_field_unittest.cc8
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops.h8
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h146
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h4
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h13
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h73
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc4
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/common.cc10
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/common.h29
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/common_unittest.cc6
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/once.h4
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/platform_macros.h6
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/stl_util-inl.h121
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/stringprintf.h12
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/type_traits.h10
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc23
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/test_util.cc80
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/testing/googletest.h5
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/text_format.cc6
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/text_format.h21
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/text_format_unittest.cc19
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/unittest.proto1
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/wire_format.h3
-rw-r--r--chromium/third_party/protobuf/src/google/protobuf/wire_format_lite_inl.h12
-rwxr-xr-xchromium/third_party/protobuf/vsprojects/extract_includes.bat2
-rw-r--r--chromium/third_party/skia/gyp/gmslides.gypi1
-rw-r--r--chromium/third_party/skia/include/core/SkCanvas.h6
-rw-r--r--chromium/third_party/skia/src/core/SkPictureRecord.cpp13
-rw-r--r--chromium/third_party/skia/src/core/SkTypefaceCache.cpp15
-rw-r--r--chromium/third_party/skia/src/core/SkTypefaceCache.h36
-rwxr-xr-xchromium/third_party/skia/src/ports/SkFontHost_win.cpp9
-rw-r--r--chromium/third_party/skia/src/ports/SkFontHost_win_dw.cpp3
-rw-r--r--chromium/tools/android/android_tools.gyp2
-rw-r--r--chromium/tools/deep_memory_profiler/policy.android.renderer.json6
-rw-r--r--chromium/tools/deep_memory_profiler/visualizer/main.css9
-rw-r--r--chromium/tools/deep_memory_profiler/visualizer/main.html17
-rw-r--r--chromium/tools/deep_memory_profiler/visualizer/main.js160
-rw-r--r--chromium/tools/gn/BUILD.gn18
-rw-r--r--chromium/tools/gn/binary_target_generator.cc36
-rw-r--r--chromium/tools/gn/binary_target_generator.h32
-rw-r--r--chromium/tools/gn/config_values_extractors.cc19
-rw-r--r--chromium/tools/gn/config_values_extractors.h3
-rw-r--r--chromium/tools/gn/copy_target_generator.cc47
-rw-r--r--chromium/tools/gn/copy_target_generator.h30
-rw-r--r--chromium/tools/gn/filesystem_utils.cc23
-rw-r--r--chromium/tools/gn/function_exec_script.cc103
-rw-r--r--chromium/tools/gn/function_read_file.cc2
-rw-r--r--chromium/tools/gn/gn.gyp18
-rw-r--r--chromium/tools/gn/group_target_generator.cc21
-rw-r--r--chromium/tools/gn/group_target_generator.h28
-rw-r--r--chromium/tools/gn/input_conversion.cc2
-rw-r--r--chromium/tools/gn/ninja_binary_target_writer.cc346
-rw-r--r--chromium/tools/gn/ninja_binary_target_writer.h39
-rw-r--r--chromium/tools/gn/ninja_build_writer.cc10
-rw-r--r--chromium/tools/gn/ninja_copy_target_writer.cc64
-rw-r--r--chromium/tools/gn/ninja_copy_target_writer.h23
-rw-r--r--chromium/tools/gn/ninja_group_target_writer.cc37
-rw-r--r--chromium/tools/gn/ninja_group_target_writer.h23
-rw-r--r--chromium/tools/gn/ninja_helper.cc7
-rw-r--r--chromium/tools/gn/ninja_script_target_writer.cc207
-rw-r--r--chromium/tools/gn/ninja_script_target_writer.h49
-rw-r--r--chromium/tools/gn/ninja_target_writer.cc587
-rw-r--r--chromium/tools/gn/ninja_target_writer.h39
-rw-r--r--chromium/tools/gn/ninja_toolchain_writer.cc8
-rw-r--r--chromium/tools/gn/scheduler.cc6
-rw-r--r--chromium/tools/gn/scheduler.h7
-rw-r--r--chromium/tools/gn/scope_per_file_provider.cc20
-rw-r--r--chromium/tools/gn/scope_per_file_provider.h6
-rw-r--r--chromium/tools/gn/script_target_generator.cc82
-rw-r--r--chromium/tools/gn/script_target_generator.h32
-rw-r--r--chromium/tools/gn/script_values.cc11
-rw-r--r--chromium/tools/gn/script_values.h41
-rw-r--r--chromium/tools/gn/secondary/BUILD.gn16
-rw-r--r--chromium/tools/gn/secondary/base/BUILD.gn1957
-rw-r--r--chromium/tools/gn/secondary/base/allocator/BUILD.gn16
-rw-r--r--chromium/tools/gn/secondary/base/third_party/dynamic_annotations/BUILD.gn18
-rw-r--r--chromium/tools/gn/secondary/base/third_party/nspr/BUILD.gn19
-rw-r--r--chromium/tools/gn/secondary/base/third_party/symbolize/BUILD.gn19
-rw-r--r--chromium/tools/gn/secondary/base/third_party/xdg_mime/BUILD.gn27
-rw-r--r--chromium/tools/gn/secondary/base/third_party/xdg_user_dirs/BUILD.gn10
-rw-r--r--chromium/tools/gn/secondary/build/config/BUILD.gn100
-rw-r--r--chromium/tools/gn/secondary/build/config/BUILDCONFIG.gn412
-rw-r--r--chromium/tools/gn/secondary/build/config/compiler/BUILD.gn199
-rw-r--r--chromium/tools/gn/secondary/build/config/linux/BUILD.gn14
-rw-r--r--chromium/tools/gn/secondary/build/config/linux/system/BUILD.gn31
-rw-r--r--chromium/tools/gn/secondary/build/config/linux/system/pkg-config.py8
-rw-r--r--chromium/tools/gn/secondary/build/config/linux/toolchain/BUILD.gn47
-rw-r--r--chromium/tools/gn/secondary/build/config/mac/BUILD.gn1
-rw-r--r--chromium/tools/gn/secondary/build/config/win/BUILD.gn368
-rw-r--r--chromium/tools/gn/secondary/ipc/BUILD.gn336
-rw-r--r--chromium/tools/gn/secondary/testing/BUILD.gn88
-rw-r--r--chromium/tools/gn/secondary/third_party/icu/BUILD.gn5
-rw-r--r--chromium/tools/gn/secondary/third_party/libevent/BUILD.gn3
-rw-r--r--chromium/tools/gn/secondary/third_party/modp_b64/BUILD.gn22
-rw-r--r--chromium/tools/gn/target.cc8
-rw-r--r--chromium/tools/gn/target.h27
-rw-r--r--chromium/tools/gn/target_generator.cc323
-rw-r--r--chromium/tools/gn/target_generator.h50
-rw-r--r--chromium/tools/gn/variables.cc76
-rw-r--r--chromium/tools/gn/variables.h4
-rw-r--r--chromium/tools/heapcheck/suppressions.txt32
-rwxr-xr-xchromium/tools/idl_parser/idl_lexer.py26
-rwxr-xr-xchromium/tools/idl_parser/idl_lexer_test.py6
-rwxr-xr-xchromium/tools/idl_parser/idl_parser.py22
-rwxr-xr-xchromium/tools/idl_parser/idl_ppapi_lexer.py24
-rwxr-xr-xchromium/tools/idl_parser/idl_ppapi_parser.py28
-rw-r--r--chromium/tools/idl_parser/test_parser/extattr_ppapi.idl91
-rw-r--r--chromium/tools/json_schema_compiler/cc_generator.py4
-rw-r--r--chromium/tools/json_schema_compiler/util.cc8
-rw-r--r--chromium/tools/lsan/suppressions.txt18
-rw-r--r--chromium/tools/metrics/histograms/histograms.xml219
-rw-r--r--chromium/tools/perf/benchmarks/page_cycler.py6
-rw-r--r--chromium/tools/perf/measurements/blink_perf.py1
-rw-r--r--chromium/tools/perf/measurements/page_cycler.py32
-rw-r--r--chromium/tools/perf/metrics/__init__.py11
-rw-r--r--chromium/tools/perf/metrics/io.py57
-rw-r--r--chromium/tools/perf/page_sets/blank_page.html (renamed from chromium/tools/perf/page_sets/blank_page/blank_page.html)0
-rw-r--r--chromium/tools/perf/page_sets/blank_page.json2
-rw-r--r--chromium/tools/telemetry/support/html_output/results-template.html4
-rw-r--r--chromium/tools/telemetry/telemetry/core/backends/webdriver/__init__.py3
-rw-r--r--chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_browser_backend.py70
-rw-r--r--chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_desktop_browser_finder.py103
-rw-r--r--chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_tab_backend.py120
-rw-r--r--chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_tab_list_backend.py47
-rw-r--r--chromium/tools/telemetry/telemetry/core/browser_finder.py4
-rw-r--r--chromium/tools/telemetry/telemetry/core/browser_options.py1
-rw-r--r--chromium/tools/telemetry/telemetry/core/chrome/android_browser_finder.py11
-rw-r--r--chromium/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py4
-rw-r--r--chromium/tools/telemetry/telemetry/core/chrome/cros_interface.py10
-rw-r--r--chromium/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py13
-rw-r--r--chromium/tools/telemetry/telemetry/core/platform/cros_platform_backend.py12
-rw-r--r--chromium/tools/telemetry/telemetry/core/platform/posix_platform_backend.py25
-rw-r--r--chromium/tools/telemetry/telemetry/core/platform/proc_util.py23
-rw-r--r--chromium/tools/telemetry/telemetry/core/platform/profiler/strace_profiler.py251
-rw-r--r--chromium/tools/telemetry/telemetry/page/actions/wait.py8
-rw-r--r--chromium/tools/telemetry/telemetry/page/cloud_storage.py13
-rw-r--r--chromium/tools/telemetry/telemetry/page/page_runner.py56
-rw-r--r--chromium/tools/telemetry/telemetry/page/page_runner_repeat.py7
-rw-r--r--chromium/tools/telemetry/telemetry/page/page_runner_unittest.py19
-rw-r--r--chromium/tools/telemetry/telemetry/page/test_expectations.py2
-rw-r--r--chromium/tools/telemetry/telemetry/unittest/system_stub.py8
-rw-r--r--chromium/tools/valgrind/gtest_exclude/ash_unittests.gtest.txt2
-rw-r--r--chromium/tools/valgrind/gtest_exclude/content_unittests.gtest_mac.txt3
-rw-r--r--chromium/tools/valgrind/gtest_exclude/unit_tests.gtest_linux.txt3
-rw-r--r--chromium/tools/valgrind/memcheck/suppressions.txt68
-rw-r--r--chromium/tools/valgrind/tsan/ignores_win32.txt3
-rw-r--r--chromium/tools/valgrind/tsan_v2/suppressions.txt4
-rw-r--r--chromium/ui/android/java/src/org/chromium/ui/gfx/SurfaceTextureBridge.java64
-rw-r--r--chromium/ui/android/java/src/org/chromium/ui/gfx/SurfaceTextureListener.java10
-rw-r--r--chromium/ui/app_list/cocoa/current_user_menu_item_view.mm9
-rw-r--r--chromium/ui/aura/bench/DEPS1
-rw-r--r--chromium/ui/aura/bench/bench_main.cc38
-rw-r--r--chromium/ui/aura/remote_root_window_host_win.cc7
-rw-r--r--chromium/ui/aura/remote_root_window_host_win.h3
-rw-r--r--chromium/ui/aura/root_window.cc9
-rw-r--r--chromium/ui/aura/root_window.h8
-rw-r--r--chromium/ui/aura/root_window_host.h9
-rw-r--r--chromium/ui/aura/root_window_host_mac.mm3
-rw-r--r--chromium/ui/aura/root_window_host_ozone.cc7
-rw-r--r--chromium/ui/aura/root_window_host_ozone.h3
-rw-r--r--chromium/ui/aura/root_window_host_win.cc7
-rw-r--r--chromium/ui/aura/root_window_host_win.h3
-rw-r--r--chromium/ui/aura/root_window_host_x11.cc49
-rw-r--r--chromium/ui/aura/root_window_host_x11.h3
-rw-r--r--chromium/ui/base/accessibility/accessible_view_state.h12
-rw-r--r--chromium/ui/base/clipboard/clipboard_android.cc5
-rw-r--r--chromium/ui/base/clipboard/clipboard_unittest.cc9
-rw-r--r--chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc7
-rw-r--r--chromium/ui/base/ime/input_method_ibus.cc10
-rw-r--r--chromium/ui/base/ime/input_method_ibus.h4
-rw-r--r--chromium/ui/base/ime/input_method_win.cc4
-rw-r--r--chromium/ui/base/resource/resource_bundle.cc2
-rw-r--r--chromium/ui/base/strings/ui_strings_am.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_ar.xtb109
-rw-r--r--chromium/ui/base/strings/ui_strings_bg.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_bn.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_ca.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_cs.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_da.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_de.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_el.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_en-GB.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_es-419.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_es.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_et.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_fa.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_fi.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_fil.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_fr.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_gu.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_hi.xtb101
-rw-r--r--chromium/ui/base/strings/ui_strings_hr.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_hu.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_id.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_it.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_iw.xtb99
-rw-r--r--chromium/ui/base/strings/ui_strings_ja.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_kn.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_ko.xtb99
-rw-r--r--chromium/ui/base/strings/ui_strings_lt.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_lv.xtb99
-rw-r--r--chromium/ui/base/strings/ui_strings_ml.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_mr.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_ms.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_nl.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_no.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_pl.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_pt-BR.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_pt-PT.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_ro.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_ru.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_sk.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_sl.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_sr.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_sv.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_sw.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_ta.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_te.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_th.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_tr.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_uk.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_vi.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_zh-CN.xtb97
-rw-r--r--chromium/ui/base/strings/ui_strings_zh-TW.xtb97
-rw-r--r--chromium/ui/base/x/x11_util.cc56
-rw-r--r--chromium/ui/base/x/x11_util.h14
-rw-r--r--chromium/ui/compositor/compositor.cc72
-rw-r--r--chromium/ui/compositor/compositor.gyp5
-rw-r--r--chromium/ui/compositor/compositor.h29
-rw-r--r--chromium/ui/compositor/context_provider_from_context_factory.cc76
-rw-r--r--chromium/ui/compositor/context_provider_from_context_factory.h45
-rw-r--r--chromium/ui/compositor/layer_animation_sequence.cc5
-rw-r--r--chromium/ui/compositor/layer_animation_sequence.h5
-rw-r--r--chromium/ui/compositor/layer_animation_sequence_unittest.cc16
-rw-r--r--chromium/ui/compositor/test_web_graphics_context_3d.cc220
-rw-r--r--chromium/ui/compositor/test_web_graphics_context_3d.h450
-rw-r--r--chromium/ui/gfx/transform.cc9
-rw-r--r--chromium/ui/gfx/transform.h5
-rw-r--r--chromium/ui/gfx/transform_unittest.cc10
-rw-r--r--chromium/ui/gl/android/gl_jni_registrar.cc3
-rw-r--r--chromium/ui/gl/android/surface_texture_bridge.cc99
-rw-r--r--chromium/ui/gl/android/surface_texture_bridge.h2
-rw-r--r--chromium/ui/gl/android/surface_texture_listener.cc13
-rw-r--r--chromium/ui/gl/android/surface_texture_listener.h13
-rw-r--r--chromium/ui/gl/gl.gyp11
-rw-r--r--chromium/ui/gl/gl_implementation_win.cc51
-rw-r--r--chromium/ui/keyboard/keyboard.gyp13
-rw-r--r--chromium/ui/keyboard/keyboard_resources.grd1
-rw-r--r--chromium/ui/keyboard/keyboard_ui_controller.cc2
-rw-r--r--chromium/ui/keyboard/keyboard_util.cc1
-rw-r--r--chromium/ui/keyboard/resources/elements/kb-key-base.html18
-rw-r--r--chromium/ui/keyboard/resources/elements/kb-key-codes.html172
-rw-r--r--chromium/ui/keyboard/resources/elements/kb-key-sequence.html14
-rw-r--r--chromium/ui/keyboard/resources/elements/kb-key.html21
-rw-r--r--chromium/ui/keyboard/resources/index.html2
-rw-r--r--chromium/ui/keyboard/resources/webui_index.html1
-rw-r--r--chromium/ui/message_center/views/message_center_button_bar.cc4
-rw-r--r--chromium/ui/message_center/views/message_center_button_bar.h2
-rw-r--r--chromium/ui/message_center/views/message_popup_collection.cc2
-rw-r--r--chromium/ui/message_center/views/message_popup_collection.h2
-rw-r--r--chromium/ui/message_center/views/message_popup_collection_unittest.cc40
-rw-r--r--chromium/ui/resources/default_100_percent/common/drag_tip_copy.pngbin1522 -> 0 bytes
-rw-r--r--chromium/ui/resources/default_100_percent/common/drag_tip_link.pngbin517 -> 0 bytes
-rw-r--r--chromium/ui/resources/default_100_percent/common/drag_tip_move.pngbin382 -> 0 bytes
-rw-r--r--chromium/ui/resources/default_100_percent/common/drag_tip_nodrop.pngbin1627 -> 0 bytes
-rw-r--r--chromium/ui/resources/default_100_percent/common/notification_clear_all_disabled.pngbin0 -> 125 bytes
-rw-r--r--chromium/ui/resources/default_100_percent/mac/notification_tray_attention.pngbin181 -> 1163 bytes
-rw-r--r--chromium/ui/resources/default_100_percent/mac/notification_tray_attention_pressed.pngbin157 -> 1123 bytes
-rw-r--r--chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_attention.pngbin273 -> 1315 bytes
-rw-r--r--chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_attention_pressed.pngbin209 -> 1183 bytes
-rw-r--r--chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_empty.pngbin214 -> 1297 bytes
-rw-r--r--chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_empty_pressed.pngbin201 -> 1200 bytes
-rw-r--r--chromium/ui/resources/default_100_percent/mac/notification_tray_empty.pngbin167 -> 1153 bytes
-rw-r--r--chromium/ui/resources/default_100_percent/mac/notification_tray_empty_pressed.pngbin157 -> 1128 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/common/drag_tip_copy.pngbin4297 -> 0 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/common/drag_tip_link.pngbin1187 -> 0 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/common/drag_tip_move.pngbin749 -> 0 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/common/drag_tip_nodrop.pngbin5134 -> 0 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/common/notification_clear_all_disabled.pngbin0 -> 165 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/mac/notification_tray_attention.pngbin299 -> 1332 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/mac/notification_tray_attention_pressed.pngbin241 -> 1262 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_attention.pngbin463 -> 1563 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_attention_pressed.pngbin361 -> 1398 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_empty.pngbin373 -> 1542 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_empty_pressed.pngbin335 -> 1401 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/mac/notification_tray_empty.pngbin253 -> 1309 bytes
-rw-r--r--chromium/ui/resources/default_200_percent/mac/notification_tray_empty_pressed.pngbin243 -> 1271 bytes
-rw-r--r--chromium/ui/resources/resource_check/resource_scale_factors.py24
-rw-r--r--chromium/ui/resources/ui_resources.grd1
-rw-r--r--chromium/ui/surface/accelerated_surface_win.cc3
-rw-r--r--chromium/ui/views/accessibility/native_view_accessibility_win.cc28
-rw-r--r--chromium/ui/views/accessibility/native_view_accessibility_win.h8
-rw-r--r--chromium/ui/views/accessibility/native_view_accessibility_win_unittest.cc65
-rw-r--r--chromium/ui/views/controls/button/blue_button.cc5
-rw-r--r--chromium/ui/views/controls/button/blue_button.h2
-rw-r--r--chromium/ui/views/controls/button/label_button.cc2
-rw-r--r--chromium/ui/views/controls/button/label_button_border.cc20
-rw-r--r--chromium/ui/views/controls/combobox/combobox.cc3
-rw-r--r--chromium/ui/views/controls/textfield/native_textfield_views.cc1
-rw-r--r--chromium/ui/views/controls/textfield/native_textfield_views_unittest.cc3
-rw-r--r--chromium/ui/views/controls/textfield/textfield.cc22
-rw-r--r--chromium/ui/views/controls/textfield/textfield.h9
-rw-r--r--chromium/ui/views/controls/tree/tree_view.cc2
-rw-r--r--chromium/ui/views/views.gyp1
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc8
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.h3
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_root_window_host_x11.cc8
-rw-r--r--chromium/ui/views/widget/desktop_aura/desktop_root_window_host_x11.h3
-rw-r--r--chromium/ui/views/win/appbar.cc8
-rw-r--r--chromium/ui/webui/resources/css/menu.css1
-rw-r--r--chromium/ui/webui/resources/js/cr/ui/list.js7
-rwxr-xr-xchromium/update_verification.py135
-rw-r--r--chromium/url/url_canon_icu.h3
-rw-r--r--chromium/url/url_canon_relative.cc5
-rw-r--r--chromium/url/url_canon_stdstring.h3
-rw-r--r--chromium/v8/ChangeLog57
-rw-r--r--chromium/v8/Makefile9
-rwxr-xr-xchromium/v8/include/v8-debug.h36
-rw-r--r--chromium/v8/include/v8-preparser.h44
-rw-r--r--chromium/v8/include/v8-profiler.h69
-rw-r--r--chromium/v8/include/v8-testing.h34
-rw-r--r--chromium/v8/include/v8.h246
-rw-r--r--chromium/v8/src/api.cc67
-rw-r--r--chromium/v8/src/arm/builtins-arm.cc20
-rw-r--r--chromium/v8/src/arm/code-stubs-arm.cc48
-rw-r--r--chromium/v8/src/arm/codegen-arm.cc4
-rw-r--r--chromium/v8/src/arm/debug-arm.cc6
-rw-r--r--chromium/v8/src/arm/full-codegen-arm.cc43
-rw-r--r--chromium/v8/src/arm/lithium-arm.cc149
-rw-r--r--chromium/v8/src/arm/lithium-arm.h106
-rw-r--r--chromium/v8/src/arm/lithium-codegen-arm.cc395
-rw-r--r--chromium/v8/src/arm/lithium-codegen-arm.h36
-rw-r--r--chromium/v8/src/arm/lithium-gap-resolver-arm.cc2
-rw-r--r--chromium/v8/src/arm/macro-assembler-arm.cc70
-rw-r--r--chromium/v8/src/arm/macro-assembler-arm.h8
-rw-r--r--chromium/v8/src/array-iterator.js7
-rw-r--r--chromium/v8/src/assert-scope.h9
-rw-r--r--chromium/v8/src/ast.cc14
-rw-r--r--chromium/v8/src/ast.h34
-rw-r--r--chromium/v8/src/atomicops_internals_tsan.h12
-rw-r--r--chromium/v8/src/bootstrapper.cc5
-rw-r--r--chromium/v8/src/builtins.h2
-rw-r--r--chromium/v8/src/code-stubs-hydrogen.cc59
-rw-r--r--chromium/v8/src/code-stubs.cc91
-rw-r--r--chromium/v8/src/code-stubs.h68
-rw-r--r--chromium/v8/src/compiler.cc39
-rw-r--r--chromium/v8/src/compiler.h23
-rw-r--r--chromium/v8/src/cpu-profiler.cc2
-rw-r--r--chromium/v8/src/cpu-profiler.h2
-rw-r--r--chromium/v8/src/d8.cc72
-rw-r--r--chromium/v8/src/d8.h2
-rw-r--r--chromium/v8/src/debug.cc8
-rw-r--r--chromium/v8/src/deoptimizer.cc352
-rw-r--r--chromium/v8/src/deoptimizer.h57
-rw-r--r--chromium/v8/src/effects.h361
-rw-r--r--chromium/v8/src/execution.cc4
-rw-r--r--chromium/v8/src/extensions/i18n/collator.cc366
-rw-r--r--chromium/v8/src/extensions/i18n/collator.h68
-rw-r--r--chromium/v8/src/extensions/i18n/collator.js11
-rw-r--r--chromium/v8/src/extensions/i18n/date-format.cc329
-rw-r--r--chromium/v8/src/extensions/i18n/date-format.h71
-rw-r--r--chromium/v8/src/extensions/i18n/date-format.js10
-rw-r--r--chromium/v8/src/extensions/i18n/i18n-extension.cc40
-rw-r--r--chromium/v8/src/extensions/i18n/i18n-utils.cc46
-rw-r--r--chromium/v8/src/extensions/i18n/i18n-utils.js11
-rw-r--r--chromium/v8/src/extensions/i18n/locale.cc251
-rw-r--r--chromium/v8/src/extensions/i18n/locale.h56
-rw-r--r--chromium/v8/src/extensions/i18n/locale.js4
-rw-r--r--chromium/v8/src/extensions/i18n/number-format.cc418
-rw-r--r--chromium/v8/src/extensions/i18n/number-format.h69
-rw-r--r--chromium/v8/src/extensions/i18n/number-format.js16
-rw-r--r--chromium/v8/src/factory.cc13
-rw-r--r--chromium/v8/src/factory.h6
-rw-r--r--chromium/v8/src/flag-definitions.h8
-rw-r--r--chromium/v8/src/full-codegen.cc16
-rw-r--r--chromium/v8/src/full-codegen.h64
-rw-r--r--chromium/v8/src/global-handles.cc64
-rw-r--r--chromium/v8/src/global-handles.h71
-rw-r--r--chromium/v8/src/harmony-array.js124
-rw-r--r--chromium/v8/src/heap-snapshot-generator.cc24
-rw-r--r--chromium/v8/src/heap-snapshot-generator.h10
-rw-r--r--chromium/v8/src/heap.cc109
-rw-r--r--chromium/v8/src/heap.h19
-rw-r--r--chromium/v8/src/hydrogen-escape-analysis.cc230
-rw-r--r--chromium/v8/src/hydrogen-escape-analysis.h35
-rw-r--r--chromium/v8/src/hydrogen-instructions.cc647
-rw-r--r--chromium/v8/src/hydrogen-instructions.h766
-rw-r--r--chromium/v8/src/hydrogen-mark-deoptimize.cc29
-rw-r--r--chromium/v8/src/hydrogen-mark-deoptimize.h12
-rw-r--r--chromium/v8/src/hydrogen-representation-changes.cc10
-rw-r--r--chromium/v8/src/hydrogen-uint32-analysis.cc6
-rw-r--r--chromium/v8/src/hydrogen.cc501
-rw-r--r--chromium/v8/src/hydrogen.h30
-rw-r--r--chromium/v8/src/i18n.cc938
-rw-r--r--chromium/v8/src/i18n.h129
-rw-r--r--chromium/v8/src/ia32/assembler-ia32.cc4
-rw-r--r--chromium/v8/src/ia32/builtins-ia32.cc20
-rw-r--r--chromium/v8/src/ia32/code-stubs-ia32.cc109
-rw-r--r--chromium/v8/src/ia32/codegen-ia32.cc4
-rw-r--r--chromium/v8/src/ia32/debug-ia32.cc2
-rw-r--r--chromium/v8/src/ia32/deoptimizer-ia32.cc2
-rw-r--r--chromium/v8/src/ia32/full-codegen-ia32.cc44
-rw-r--r--chromium/v8/src/ia32/ic-ia32.cc2
-rw-r--r--chromium/v8/src/ia32/lithium-codegen-ia32.cc449
-rw-r--r--chromium/v8/src/ia32/lithium-codegen-ia32.h29
-rw-r--r--chromium/v8/src/ia32/lithium-ia32.cc170
-rw-r--r--chromium/v8/src/ia32/lithium-ia32.h99
-rw-r--r--chromium/v8/src/ia32/macro-assembler-ia32.cc126
-rw-r--r--chromium/v8/src/ia32/macro-assembler-ia32.h21
-rw-r--r--chromium/v8/src/ia32/stub-cache-ia32.cc4
-rw-r--r--chromium/v8/src/ic.cc22
-rw-r--r--chromium/v8/src/ic.h8
-rw-r--r--chromium/v8/src/isolate.cc5
-rw-r--r--chromium/v8/src/isolate.h20
-rw-r--r--chromium/v8/src/lithium.cc4
-rw-r--r--chromium/v8/src/lithium.h48
-rw-r--r--chromium/v8/src/liveedit.cc1
-rw-r--r--chromium/v8/src/log.cc1
-rw-r--r--chromium/v8/src/mark-compact.cc8
-rw-r--r--chromium/v8/src/mark-compact.h2
-rw-r--r--chromium/v8/src/messages.js22
-rw-r--r--chromium/v8/src/mips/assembler-mips.h5
-rw-r--r--chromium/v8/src/mips/builtins-mips.cc20
-rw-r--r--chromium/v8/src/mips/code-stubs-mips.cc58
-rw-r--r--chromium/v8/src/mips/codegen-mips.cc6
-rw-r--r--chromium/v8/src/mips/debug-mips.cc7
-rw-r--r--chromium/v8/src/mips/full-codegen-mips.cc43
-rw-r--r--chromium/v8/src/mips/lithium-codegen-mips.cc285
-rw-r--r--chromium/v8/src/mips/lithium-codegen-mips.h25
-rw-r--r--chromium/v8/src/mips/lithium-gap-resolver-mips.cc2
-rw-r--r--chromium/v8/src/mips/lithium-mips.cc142
-rw-r--r--chromium/v8/src/mips/lithium-mips.h89
-rw-r--r--chromium/v8/src/mips/macro-assembler-mips.cc95
-rw-r--r--chromium/v8/src/mips/macro-assembler-mips.h26
-rw-r--r--chromium/v8/src/object-observe.js5
-rw-r--r--chromium/v8/src/objects-debug.cc9
-rw-r--r--chromium/v8/src/objects-inl.h48
-rw-r--r--chromium/v8/src/objects-printer.cc84
-rw-r--r--chromium/v8/src/objects-visiting.h2
-rw-r--r--chromium/v8/src/objects.cc53
-rw-r--r--chromium/v8/src/objects.h314
-rw-r--r--chromium/v8/src/optimizing-compiler-thread.cc82
-rw-r--r--chromium/v8/src/optimizing-compiler-thread.h11
-rw-r--r--chromium/v8/src/parser.cc14
-rw-r--r--chromium/v8/src/platform-linux.cc3
-rw-r--r--chromium/v8/src/profile-generator-inl.h2
-rw-r--r--chromium/v8/src/profile-generator.cc6
-rw-r--r--chromium/v8/src/profile-generator.h2
-rw-r--r--chromium/v8/src/runtime.cc594
-rw-r--r--chromium/v8/src/runtime.h34
-rw-r--r--chromium/v8/src/runtime.js14
-rw-r--r--chromium/v8/src/sampler.cc11
-rw-r--r--chromium/v8/src/serialize.cc1
-rw-r--r--chromium/v8/src/spaces.h5
-rw-r--r--chromium/v8/src/splay-tree-inl.h9
-rw-r--r--chromium/v8/src/splay-tree.h14
-rw-r--r--chromium/v8/src/type-info.cc12
-rw-r--r--chromium/v8/src/type-info.h1
-rw-r--r--chromium/v8/src/types.h5
-rw-r--r--chromium/v8/src/typing.cc252
-rw-r--r--chromium/v8/src/typing.h17
-rw-r--r--chromium/v8/src/v8.cc5
-rw-r--r--chromium/v8/src/v8globals.h3
-rw-r--r--chromium/v8/src/version.cc4
-rw-r--r--chromium/v8/src/x64/assembler-x64-inl.h5
-rw-r--r--chromium/v8/src/x64/assembler-x64.cc7
-rw-r--r--chromium/v8/src/x64/assembler-x64.h51
-rw-r--r--chromium/v8/src/x64/builtins-x64.cc48
-rw-r--r--chromium/v8/src/x64/code-stubs-x64.cc112
-rw-r--r--chromium/v8/src/x64/codegen-x64.cc4
-rw-r--r--chromium/v8/src/x64/debug-x64.cc7
-rw-r--r--chromium/v8/src/x64/deoptimizer-x64.cc4
-rw-r--r--chromium/v8/src/x64/full-codegen-x64.cc47
-rw-r--r--chromium/v8/src/x64/ic-x64.cc44
-rw-r--r--chromium/v8/src/x64/lithium-codegen-x64.cc396
-rw-r--r--chromium/v8/src/x64/lithium-codegen-x64.h30
-rw-r--r--chromium/v8/src/x64/lithium-x64.cc144
-rw-r--r--chromium/v8/src/x64/lithium-x64.h103
-rw-r--r--chromium/v8/src/x64/macro-assembler-x64.cc94
-rw-r--r--chromium/v8/src/x64/macro-assembler-x64.h14
-rw-r--r--chromium/v8/src/x64/regexp-macro-assembler-x64.cc2
-rw-r--r--chromium/v8/src/x64/stub-cache-x64.cc35
-rw-r--r--chromium/v8/src/zone-inl.h6
-rw-r--r--chromium/v8/src/zone.h11
-rw-r--r--chromium/v8/tools/gcmole/Makefile2
-rwxr-xr-xchromium/v8/tools/gcmole/bootstrap.sh126
-rw-r--r--chromium/v8/tools/gcmole/gcmole.lua3
-rwxr-xr-xchromium/v8/tools/grokdump.py274
-rw-r--r--chromium/v8/tools/gyp/v8.gyp14
-rwxr-xr-xchromium/v8/tools/run-tests.py8
-rw-r--r--chromium/v8/tools/testrunner/local/old_statusfile.py2
-rw-r--r--chromium/v8/tools/testrunner/local/statusfile.py7
-rw-r--r--chromium/v8/tools/testrunner/local/testsuite.py47
-rw-r--r--chromium/v8/tools/testrunner/local/verbose.py2
-rw-r--r--chromium/v8/tools/tickprocessor.js3
-rw-r--r--chromium/v8/tools/v8heapconst.py255
-rw-r--r--chromium/v8/tools/v8heapconst.py.tmpl30
-rw-r--r--chromium/webkit/browser/fileapi/file_permission_policy.cc19
-rw-r--r--chromium/webkit/browser/fileapi/file_permission_policy.h2
-rw-r--r--chromium/webkit/browser/fileapi/file_system_context.cc4
-rw-r--r--chromium/webkit/browser/fileapi/file_system_context.h8
-rw-r--r--chromium/webkit/browser/fileapi/file_system_quota_util.h5
-rw-r--r--chromium/webkit/browser/fileapi/obfuscated_file_util.cc4
-rw-r--r--chromium/webkit/browser/fileapi/sandbox_context.cc (renamed from chromium/webkit/browser/fileapi/sandbox_file_system_backend_delegate.cc)89
-rw-r--r--chromium/webkit/browser/fileapi/sandbox_context.h (renamed from chromium/webkit/browser/fileapi/sandbox_file_system_backend_delegate.h)33
-rw-r--r--chromium/webkit/browser/fileapi/sandbox_context_unittest.cc (renamed from chromium/webkit/browser/fileapi/sandbox_file_system_backend_delegate_unittest.cc)36
-rw-r--r--chromium/webkit/browser/fileapi/sandbox_directory_database.cc4
-rw-r--r--chromium/webkit/browser/fileapi/sandbox_file_system_backend.cc76
-rw-r--r--chromium/webkit/browser/fileapi/sandbox_file_system_backend.h14
-rw-r--r--chromium/webkit/browser/fileapi/sandbox_file_system_backend_unittest.cc28
-rw-r--r--chromium/webkit/browser/fileapi/sandbox_file_system_test_helper.cc10
-rw-r--r--chromium/webkit/browser/fileapi/sandbox_origin_database.cc4
-rw-r--r--chromium/webkit/browser/fileapi/sandbox_quota_observer.cc4
-rw-r--r--chromium/webkit/browser/fileapi/test_file_system_backend.cc11
-rw-r--r--chromium/webkit/common/gpu/context_provider_in_process.cc47
-rw-r--r--chromium/webkit/common/gpu/context_provider_in_process.h21
-rw-r--r--chromium/webkit/common/gpu/test_context_provider_factory.cc2
-rw-r--r--chromium/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc12
-rw-r--r--chromium/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h23
-rw-r--r--chromium/webkit/common/webpreferences.cc6
-rw-r--r--chromium/webkit/common/webpreferences.h4
-rw-r--r--chromium/webkit/glue/resources/webkit_strings_ar.xtb6
-rw-r--r--chromium/webkit/glue/resources/webkit_strings_fa.xtb6
-rw-r--r--chromium/webkit/glue/resources/webkit_strings_iw.xtb4
-rw-r--r--chromium/webkit/glue/resources/webkit_strings_nl.xtb4
-rw-r--r--chromium/webkit/glue/resources/webkit_strings_ru.xtb4
-rw-r--r--chromium/webkit/glue/simple_webmimeregistry_impl.cc8
-rw-r--r--chromium/webkit/glue/simple_webmimeregistry_impl.h2
-rw-r--r--chromium/webkit/renderer/fileapi/OWNERS1
-rw-r--r--chromium/webkit/renderer/fileapi/webfilewriter_base.cc (renamed from chromium/content/child/fileapi/webfilewriter_base.cc)34
-rw-r--r--chromium/webkit/renderer/fileapi/webfilewriter_base.h (renamed from chromium/content/child/fileapi/webfilewriter_base.h)22
-rw-r--r--chromium/webkit/renderer/fileapi/webfilewriter_base_unittest.cc (renamed from chromium/content/child/fileapi/webfilewriter_base_unittest.cc)8
-rw-r--r--chromium/webkit/renderer/webkit_storage_renderer_export.h29
-rw-r--r--chromium/webkit/renderer/webpreferences_renderer.cc7
-rw-r--r--chromium/webkit/storage_browser.gyp4
-rw-r--r--chromium/webkit/storage_renderer.gyp29
-rw-r--r--chromium/webkit/support/drt_application_mac.h23
-rw-r--r--chromium/webkit/support/drt_application_mac.mm24
-rw-r--r--chromium/webkit/support/mac/DumpRenderTreePasteboard.h46
-rw-r--r--chromium/webkit/support/mac/DumpRenderTreePasteboard.m214
-rw-r--r--chromium/webkit/support/platform_support.h22
-rw-r--r--chromium/webkit/support/platform_support_android.cc62
-rw-r--r--chromium/webkit/support/platform_support_linux.cc35
-rw-r--r--chromium/webkit/support/platform_support_mac.mm46
-rw-r--r--chromium/webkit/support/platform_support_win.cc36
-rw-r--r--chromium/webkit/support/webkit_support.cc89
-rw-r--r--chromium/webkit/support/webkit_support.gypi10
-rw-r--r--chromium/webkit/support/webkit_support.h13
-rwxr-xr-xninja/bootstrap.py6
-rwxr-xr-xninja/configure.py4
-rw-r--r--ninja/doc/manual.asciidoc6
-rw-r--r--ninja/platform_helper.py8
-rw-r--r--ninja/src/build.cc56
-rw-r--r--ninja/src/build.h7
-rw-r--r--ninja/src/build_log.cc48
-rw-r--r--ninja/src/build_log.h4
-rw-r--r--ninja/src/build_test.cc40
-rw-r--r--ninja/src/deps_log.cc57
-rw-r--r--ninja/src/graph_test.cc20
-rw-r--r--ninja/src/hash_map.h4
-rw-r--r--ninja/src/line_printer.cc6
-rw-r--r--ninja/src/manifest_parser.cc32
-rw-r--r--ninja/src/manifest_parser.h2
-rw-r--r--ninja/src/manifest_parser_test.cc124
-rw-r--r--ninja/src/ninja.cc83
-rw-r--r--ninja/src/subprocess-posix.cc6
-rw-r--r--ninja/src/subprocess_test.cc4
1934 files changed, 31265 insertions, 40019 deletions
diff --git a/chromium/AUTHORS b/chromium/AUTHORS
index c496ea27ff7..f770e739e46 100644
--- a/chromium/AUTHORS
+++ b/chromium/AUTHORS
@@ -11,7 +11,6 @@
Aaron Jacobs <samusaaron3@gmail.com>
Aaron Leventhal <aaronlevbugs@gmail.com>
Aaron Randolph <aaron.randolph@gmail.com>
-Adenilson Cavalcanti <a.cavalcanti@partner.samsung.com>
Aditya Bhargava <heuristicist@gmail.com>
Alex Gartrell <agartrell@cmu.edu>
Alex Scheele <alexscheele@gmail.com>
@@ -35,7 +34,6 @@ Bobby Powers <bobbypowers@gmail.com>
Brian G. Merrell <bgmerrell@gmail.com>
Brian Merrell, Novell Inc. <bgmerrell@gmail.com>
Bruno Calvignac <bruno@flock.com>
-Bruno de Oliveira Abinader <bruno.d@partner.samsung.com>
Bryan Donlan <bdonlan@gmail.com>
Byungwoo Lee <bw80.lee@samsung.com>
Caio Marcelo de Oliveira Filho <caio.de.oliveira.filho@intel.com>
@@ -82,7 +80,6 @@ Gajendra Singh <wxjg68@motorola.com>
Gao Chun <gaochun.dev@gmail.com>
Giuseppe Iuculano <giuseppe@iuculano.it>
Goutham Jagannatha <wrm364@motorola.com>
-Grzegorz Czajkowski <g.czajkowski@samsung.com>
Gyuyoung Kim <gyuyoung.kim@samsung.com>
Haitao Feng <haitao.feng@intel.com>
Halton Huo <halton.huo@intel.com>
@@ -110,7 +107,6 @@ Jesus Sanchez-Palencia <jesus.sanchez-palencia.fernandez.fil@intel.com>
Jin Yang <jin.a.yang@intel.com>
Jingwei Liu <kingweiliu@gmail.com>
Jinwoo Song <jinwoo7.song@samsung.com>
-Joe Knoll <joe.knoll@workday.com>
Joe Thomas <mhx348@motorola.com>
Joel Stanley <joel@jms.id.au>
Johannes Rudolph <johannes.rudolph@googlemail.com>
@@ -231,7 +227,6 @@ Sathish Kuppuswamy <sathish.kuppuswamy@intel.com>
Satoshi Matsuzaki <satoshi.matsuzaki@gmail.com>
Sean Bryant <sean@cyberwang.net>
Seo Sanghyeon <sanxiyn@gmail.com>
-Seokju Kwon <seokju.kwon@gmail.com>
Sergio Carlos Morales Angeles <carloschilazo@gmail.com>
Sergiy Byelozyorov <rryk.ua@gmail.com>
Seshadri Mahalingam <seshadri.mahalingam@gmail.com>
diff --git a/chromium/DEPS b/chromium/DEPS
index 7519139a006..59eed92160d 100644
--- a/chromium/DEPS
+++ b/chromium/DEPS
@@ -8,12 +8,12 @@ vars = {
"sourceforge_url": "http://svn.code.sf.net/p/%(repo)s/code",
"webkit_trunk": "http://src.chromium.org/blink/trunk",
"nacl_trunk": "http://src.chromium.org/native_client/trunk",
- "webkit_revision": "156113",
+ "webkit_revision": "155942",
"chromium_git": "https://chromium.googlesource.com",
"chromiumos_git": "https://chromium.googlesource.com/chromiumos",
"skia_git": "https://skia.googlesource.com",
"swig_revision": "69281",
- "nacl_revision": "12000",
+ "nacl_revision": "11988",
# After changing nacl_revision, run 'glient sync' and check native_client/DEPS
# to update other nacl_*_revision's.
"nacl_tools_revision": "11437", # native_client/DEPS: tools_rev
@@ -29,12 +29,12 @@ vars = {
"ffmpeg_hash": "894e6f715645528e815aee2dad45b59704238dcd",
"sfntly_revision": "134",
- "skia_revision": "10699",
- "skia_hash": "a5b2bf898060f0883f73a9a27db8b69bd0180440",
+ "skia_revision": "10680",
+ "skia_hash": "8f4825bfb1da69439e1e96a0c6ea04488757d95e",
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling Skia
# and V8 without interference from each other.
- "v8_revision": "16198",
+ "v8_revision": "16159",
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling WebRTC
# and V8 without interference from each other.
@@ -91,7 +91,7 @@ deps = {
"src/third_party/cacheinvalidation/src":
(Var("googlecode_url") % "google-cache-invalidation-api") +
- "/trunk/src@312",
+ "/trunk/src@309",
"src/third_party/leveldatabase/src":
(Var("googlecode_url") % "leveldb") + "/trunk@75",
@@ -152,7 +152,7 @@ deps = {
# When roll to another webgl conformance tests revision, please goto
# chrome/test/gpu and run generate_webgl_conformance_test_list.py.
"src/third_party/webgl_conformance":
- "/trunk/deps/third_party/webgl/sdk/tests@217526",
+ "/trunk/deps/third_party/webgl/sdk/tests@217097",
"src/third_party/swig/Lib":
"/trunk/deps/third_party/swig/Lib@" + Var("swig_revision"),
@@ -430,7 +430,7 @@ deps_os = {
# For Linux and Chromium OS.
"src/third_party/cros_system_api":
Var("chromiumos_git") + "/platform/system_api.git" +
- "@94831a5a958ea6029aaf0c900b5187726557aacf",
+ "@9bad33f702cd5cefb0d5603d6853b26428425081",
# Note that this is different from Android's freetype repo.
"src/third_party/freetype2/src":
diff --git a/chromium/WATCHLISTS b/chromium/WATCHLISTS
index 0fc2a55651b..b9c1b3624a1 100644
--- a/chromium/WATCHLISTS
+++ b/chromium/WATCHLISTS
@@ -156,8 +156,7 @@
},
'chromeos_attestation': {
'filepath': 'chromeos/attestation/|'\
- 'chrome/browser/chromeos/attestation/|'\
- 'chrome/browser/extensions/api/enterprise_platform_keys_private/',
+ 'chrome/browser/chromeos/attestation/',
},
'chromeos_calculator': {
'filepath': 'chrome/common/extensions/docs/examples/apps/calculator/',
diff --git a/chromium/android_webview/android_webview.gyp b/chromium/android_webview/android_webview.gyp
index 165399768b5..d687e717598 100644
--- a/chromium/android_webview/android_webview.gyp
+++ b/chromium/android_webview/android_webview.gyp
@@ -24,10 +24,17 @@
'dependencies': [
'../base/allocator/allocator.gyp:allocator', ],
}],
- ],
- 'ldflags': [
- # fix linking to hidden symbols and re-enable this (crbug.com/157326)
- '-Wl,--no-fatal-warnings'
+ [ 'android_webview_build==1 and use_system_skia==0', {
+ # When not using the system skia there are linker warnings about
+ # overriden hidden symbols which there's no easy way to eliminate;
+ # disable them. http://crbug.com/157326
+ 'ldflags': [
+ '-Wl,--no-fatal-warnings',
+ ],
+ 'ldflags!': [
+ '-Wl,--fatal-warnings',
+ ],
+ }],
],
'sources': [
'lib/main/webview_entry_point.cc',
diff --git a/chromium/ash/ash.gyp b/chromium/ash/ash.gyp
index 2fba6f3122a..7a3f1be87e8 100644
--- a/chromium/ash/ash.gyp
+++ b/chromium/ash/ash.gyp
@@ -130,8 +130,6 @@
'host/root_window_host_factory.cc',
'host/root_window_host_factory.h',
'host/root_window_host_factory_win.cc',
- 'keyboard_controller_proxy_stub.cc',
- 'keyboard_controller_proxy_stub.h',
'keyboard_overlay/keyboard_overlay_delegate.cc',
'keyboard_overlay/keyboard_overlay_delegate.h',
'keyboard_overlay/keyboard_overlay_view.cc',
@@ -209,7 +207,7 @@
'system/brightness/brightness_observer.h',
'system/brightness/brightness_control_delegate.h',
'system/brightness/tray_brightness.cc',
- 'system/brightness/tray_brightness.h',
+ 'system/brightness/tray_brightness.h',
'system/chromeos/audio/tray_audio.cc',
'system/chromeos/audio/tray_audio.h',
'system/chromeos/enterprise/enterprise_domain_observer.h',
@@ -279,8 +277,8 @@
'system/locale/locale_notification_controller.cc',
'system/locale/locale_notification_controller.h',
'system/logout_button/logout_button_observer.h',
- 'system/logout_button/logout_button_tray.cc',
- 'system/logout_button/logout_button_tray.h',
+ 'system/logout_button/tray_logout_button.cc',
+ 'system/logout_button/tray_logout_button.h',
'system/monitor/tray_monitor.cc',
'system/monitor/tray_monitor.h',
'system/session_length_limit/session_length_limit_observer.h',
@@ -384,8 +382,8 @@
'wm/ash_focus_rules.h',
'wm/base_layout_manager.cc',
'wm/base_layout_manager.h',
- 'wm/boot_splash_screen_chromeos.cc',
- 'wm/boot_splash_screen_chromeos.h',
+ 'wm/boot_splash_screen.cc',
+ 'wm/boot_splash_screen.h',
'wm/capture_controller.cc',
'wm/capture_controller.h',
'wm/coordinate_conversion.cc',
diff --git a/chromium/ash/ash_switches.cc b/chromium/ash/ash_switches.cc
index c328b59ef35..b47ba5090d4 100644
--- a/chromium/ash/ash_switches.cc
+++ b/chromium/ash/ash_switches.cc
@@ -159,10 +159,6 @@ const char kAshTouchHud[] = "ash-touch-hud";
// crbug's [244983, 244990, 244994, 245005, 245012]
const char kAshUseAlternateShelfLayout[] = "ash-use-alternate-shelf";
-// Flags explicitly show or hide the shelf alignment menu.
-const char kShowShelfAlignmentMenu[] = "show-launcher-alignment-menu";
-const char kHideShelfAlignmentMenu[] = "hide-launcher-alignment-menu";
-
// Uses the 1st display in --ash-host-window-bounds as internal display.
// This is for debugging on linux desktop.
const char kAshUseFirstDisplayAsInternal[] =
@@ -191,12 +187,7 @@ const char kForcedMaximizeMode[] = "forced-maximize-mode";
bool UseAlternateShelfLayout() {
return CommandLine::ForCurrentProcess()->
- HasSwitch(ash::switches::kAshUseAlternateShelfLayout);
-}
-
-bool ShowShelfAlignmentMenu() {
- return CommandLine::ForCurrentProcess()->
- HasSwitch(switches::kShowShelfAlignmentMenu);
+ HasSwitch(ash::switches::kAshUseAlternateShelfLayout);
}
#if defined(OS_CHROMEOS)
@@ -207,7 +198,7 @@ bool ShowAudioDeviceMenu() {
bool UseUsbChargerNotification() {
return !CommandLine::ForCurrentProcess()->
- HasSwitch(ash::switches::kAshDisableUsbChargerNotification);
+ HasSwitch(ash::switches::kAshDisableUsbChargerNotification);
}
#endif
diff --git a/chromium/ash/ash_switches.h b/chromium/ash/ash_switches.h
index df615b87f76..7e5d471339b 100644
--- a/chromium/ash/ash_switches.h
+++ b/chromium/ash/ash_switches.h
@@ -68,15 +68,9 @@ ASH_EXPORT extern const char kForceAshToDesktop[];
#endif
ASH_EXPORT extern const char kForcedMaximizeMode[];
-ASH_EXPORT extern const char kShowShelfAlignmentMenu[];
-ASH_EXPORT extern const char kHideShelfAlignmentMenu[];
-
// Returns true if the alternate shelf layout should be used.
ASH_EXPORT bool UseAlternateShelfLayout();
-// Returns true if side shelf alignment is enabled.
-ASH_EXPORT bool ShowShelfAlignmentMenu();
-
#if defined(OS_CHROMEOS)
// Returns true if new audio handler should be used.
ASH_EXPORT bool UseNewAudioHandler();
diff --git a/chromium/ash/display/display_controller.cc b/chromium/ash/display/display_controller.cc
index f0ac711e991..fce5a82ed46 100644
--- a/chromium/ash/display/display_controller.cc
+++ b/chromium/ash/display/display_controller.cc
@@ -288,14 +288,15 @@ int DisplayController::GetNumDisplays() {
}
void DisplayController::InitPrimaryDisplay() {
- const gfx::Display& primary_candidate =
+ const gfx::Display* primary_candidate =
GetDisplayManager()->GetPrimaryDisplayCandidate();
- primary_display_id = primary_candidate.id();
- AddRootWindowForDisplay(primary_candidate);
+ primary_display_id = primary_candidate->id();
+ AddRootWindowForDisplay(*primary_candidate);
}
void DisplayController::InitSecondaryDisplays() {
internal::DisplayManager* display_manager = GetDisplayManager();
+ UpdateDisplayBoundsForLayout();
for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
const gfx::Display& display = display_manager->GetDisplayAt(i);
if (primary_display_id != display.id()) {
@@ -303,6 +304,13 @@ void DisplayController::InitSecondaryDisplays() {
Shell::GetInstance()->InitRootWindowForSecondaryDisplay(root);
}
}
+ if (display_manager->GetNumDisplays() > 1) {
+ DisplayIdPair pair = GetCurrentDisplayIdPair();
+ DisplayLayout layout = GetCurrentDisplayLayout();
+ SetPrimaryDisplayId(
+ layout.primary_id == gfx::Display::kInvalidDisplayID ?
+ pair.first : layout.primary_id);
+ }
UpdateHostWindowNames();
}
@@ -379,7 +387,7 @@ void DisplayController::SetLayoutForCurrentDisplays(
if (GetDisplayManager()->GetNumDisplays() < 2)
return;
const gfx::Display& primary = GetPrimaryDisplay();
- const DisplayIdPair pair = GetDisplayManager()->GetCurrentDisplayIdPair();
+ const DisplayIdPair pair = GetCurrentDisplayIdPair();
// Invert if the primary was swapped.
DisplayLayout to_set = pair.first == primary.id() ?
layout_relative_to_primary : layout_relative_to_primary.Invert();
@@ -404,6 +412,40 @@ void DisplayController::SetLayoutForCurrentDisplays(
}
}
+DisplayLayout DisplayController::GetCurrentDisplayLayout() {
+ DCHECK_EQ(2U, GetDisplayManager()->num_connected_displays());
+ // Invert if the primary was swapped.
+ if (GetDisplayManager()->num_connected_displays() > 1) {
+ DisplayIdPair pair = GetCurrentDisplayIdPair();
+ return GetDisplayManager()->layout_store()->
+ ComputeDisplayLayoutForDisplayIdPair(pair);
+ }
+ NOTREACHED() << "DisplayLayout is requested for single display";
+ // On release build, just fallback to default instead of blowing up.
+ DisplayLayout layout =
+ GetDisplayManager()->layout_store()->default_display_layout();
+ layout.primary_id = primary_display_id;
+ return layout;
+}
+
+DisplayIdPair DisplayController::GetCurrentDisplayIdPair() const {
+ internal::DisplayManager* display_manager = GetDisplayManager();
+ const gfx::Display& primary = GetPrimaryDisplay();
+ if (display_manager->IsMirrored()) {
+ return std::make_pair(primary.id(),
+ display_manager->mirrored_display().id());
+ }
+
+ const gfx::Display& secondary = ScreenAsh::GetSecondaryDisplay();
+ if (primary.IsInternal() ||
+ GetDisplayManager()->first_display_id() == primary.id()) {
+ return std::make_pair(primary.id(), secondary.id());
+ } else {
+ // Display has been Swapped.
+ return std::make_pair(secondary.id(), primary.id());
+ }
+}
+
void DisplayController::ToggleMirrorMode() {
internal::DisplayManager* display_manager = GetDisplayManager();
if (display_manager->num_connected_displays() <= 1)
@@ -500,7 +542,7 @@ void DisplayController::SetPrimaryDisplay(
primary_display_id = new_primary_display.id();
GetDisplayManager()->layout_store()->UpdatePrimaryDisplayId(
- display_manager->GetCurrentDisplayIdPair(), primary_display_id);
+ GetCurrentDisplayIdPair(), primary_display_id);
UpdateWorkAreaOfDisplayNearestWindow(
primary_root, old_primary_display.GetWorkAreaInsets());
@@ -741,7 +783,7 @@ void DisplayController::PostDisplayConfigurationChange() {
internal::DisplayManager* display_manager = GetDisplayManager();
internal::DisplayLayoutStore* layout_store = display_manager->layout_store();
if (display_manager->num_connected_displays() > 1) {
- DisplayIdPair pair = display_manager->GetCurrentDisplayIdPair();
+ DisplayIdPair pair = GetCurrentDisplayIdPair();
layout_store->UpdateMirrorStatus(pair, display_manager->IsMirrored());
DisplayLayout layout = layout_store->GetRegisteredDisplayLayout(pair);
@@ -795,15 +837,14 @@ aura::RootWindow* DisplayController::AddRootWindowForDisplay(
}
void DisplayController::UpdateDisplayBoundsForLayout() {
- internal::DisplayManager* display_manager = GetDisplayManager();
if (Shell::GetScreen()->GetNumDisplays() < 2 ||
- display_manager->num_connected_displays() < 2) {
+ GetDisplayManager()->num_connected_displays() < 2) {
return;
}
DCHECK_EQ(2, Shell::GetScreen()->GetNumDisplays());
- const DisplayLayout layout = display_manager->GetCurrentDisplayLayout();
- display_manager->UpdateDisplayBoundsForLayoutById(
+ const DisplayLayout layout = GetCurrentDisplayLayout();
+ Shell::GetInstance()->display_manager()->UpdateDisplayBoundsForLayoutById(
layout, GetPrimaryDisplay(),
ScreenAsh::GetSecondaryDisplay().id());
}
diff --git a/chromium/ash/display/display_controller.h b/chromium/ash/display/display_controller.h
index 97620fc93b0..f67f27dfeaa 100644
--- a/chromium/ash/display/display_controller.h
+++ b/chromium/ash/display/display_controller.h
@@ -133,6 +133,12 @@ class ASH_EXPORT DisplayController : public gfx::DisplayObserver,
// the locaion of the secondary display relative to the primary.
void SetLayoutForCurrentDisplays(const DisplayLayout& layout);
+ // Returns the display layout used for current displays.
+ DisplayLayout GetCurrentDisplayLayout();
+
+ // Returns the current display pair.
+ DisplayIdPair GetCurrentDisplayIdPair() const;
+
// Checks if the mouse pointer is on one of displays, and moves to
// the center of the nearest display if it's outside of all displays.
void EnsurePointerInDisplays();
diff --git a/chromium/ash/display/display_controller_unittest.cc b/chromium/ash/display/display_controller_unittest.cc
index 7e6a0480ec0..9131468c969 100644
--- a/chromium/ash/display/display_controller_unittest.cc
+++ b/chromium/ash/display/display_controller_unittest.cc
@@ -416,6 +416,31 @@ TEST_F(DisplayControllerTest, BoundsUpdated) {
EXPECT_EQ(0, observer.CountAndReset());
}
+TEST_F(DisplayControllerTest, MirroredLayout) {
+ if (!SupportsMultipleDisplays())
+ return;
+
+ DisplayController* display_controller =
+ Shell::GetInstance()->display_controller();
+ UpdateDisplay("500x500,400x400");
+ EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored);
+ EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
+ EXPECT_EQ(
+ 2U, Shell::GetInstance()->display_manager()->num_connected_displays());
+
+ UpdateDisplay("1+0-500x500,1+0-500x500");
+ EXPECT_TRUE(display_controller->GetCurrentDisplayLayout().mirrored);
+ EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
+ EXPECT_EQ(
+ 2U, Shell::GetInstance()->display_manager()->num_connected_displays());
+
+ UpdateDisplay("500x500,500x500");
+ EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored);
+ EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
+ EXPECT_EQ(
+ 2U, Shell::GetInstance()->display_manager()->num_connected_displays());
+}
+
TEST_F(DisplayControllerTest, InvertLayout) {
EXPECT_EQ("left, 0",
DisplayLayout(DisplayLayout::RIGHT, 0).Invert().ToString());
@@ -452,8 +477,6 @@ TEST_F(DisplayControllerTest, SwapPrimary) {
DisplayController* display_controller =
Shell::GetInstance()->display_controller();
- internal::DisplayManager* display_manager =
- Shell::GetInstance()->display_manager();
UpdateDisplay("200x200,300x300");
gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
@@ -483,12 +506,12 @@ TEST_F(DisplayControllerTest, SwapPrimary) {
EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString());
EXPECT_EQ("200,0 300x252", secondary_display.work_area().ToString());
EXPECT_EQ("right, 50",
- display_manager->GetCurrentDisplayLayout().ToString());
+ display_controller->GetCurrentDisplayLayout().ToString());
// Switch primary and secondary
display_controller->SetPrimaryDisplay(secondary_display);
const DisplayLayout& inverted_layout =
- display_manager->GetCurrentDisplayLayout();
+ display_controller->GetCurrentDisplayLayout();
EXPECT_EQ("left, -50", inverted_layout.ToString());
EXPECT_EQ(secondary_display.id(),
@@ -543,8 +566,6 @@ TEST_F(DisplayControllerTest, SwapPrimaryById) {
DisplayController* display_controller =
Shell::GetInstance()->display_controller();
- internal::DisplayManager* display_manager =
- Shell::GetInstance()->display_manager();
UpdateDisplay("200x200,300x300");
gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay();
@@ -587,7 +608,7 @@ TEST_F(DisplayControllerTest, SwapPrimaryById) {
EXPECT_FALSE(secondary_root->Contains(launcher_window));
const DisplayLayout& inverted_layout =
- display_manager->GetCurrentDisplayLayout();
+ display_controller->GetCurrentDisplayLayout();
EXPECT_EQ("left, -50", inverted_layout.ToString());
@@ -613,6 +634,8 @@ TEST_F(DisplayControllerTest, SwapPrimaryById) {
EXPECT_FALSE(tracker.Contains(secondary_root));
EXPECT_TRUE(primary_root->Contains(launcher_window));
+ internal::DisplayManager* display_manager =
+ Shell::GetInstance()->display_manager();
// Adding 2nd display with the same ID. The 2nd display should become primary
// since secondary id is still stored as desirable_primary_id.
std::vector<internal::DisplayInfo> display_info_list;
diff --git a/chromium/ash/display/display_info.cc b/chromium/ash/display/display_info.cc
index 5e89a0d97f6..8f71e6d0c80 100644
--- a/chromium/ash/display/display_info.cc
+++ b/chromium/ash/display/display_info.cc
@@ -96,20 +96,6 @@ DisplayInfo DisplayInfo::CreateFromSpecWithID(const std::string& spec,
&device_scale_factor) >= 4) {
bounds_in_pixel.SetRect(x, y, width, height);
}
-
- std::vector<Resolution> resolutions;
- if (Tokenize(main_spec, "#", &parts) == 2) {
- main_spec = parts[0];
- std::string resolution_list = parts[1];
- count = Tokenize(resolution_list, "|", &parts);
- for (size_t i = 0; i < count; ++i) {
- std::string resolution = parts[i];
- int width, height;
- if (sscanf(resolution.c_str(), "%dx%d", &width, &height) == 2)
- resolutions.push_back(Resolution(gfx::Size(width, height), false));
- }
- }
-
if (id == gfx::Display::kInvalidDisplayID)
id = synthesized_display_id++;
DisplayInfo display_info(
@@ -118,7 +104,6 @@ DisplayInfo DisplayInfo::CreateFromSpecWithID(const std::string& spec,
display_info.set_rotation(rotation);
display_info.set_ui_scale(ui_scale);
display_info.SetBounds(bounds_in_pixel);
- display_info.set_resolutions(resolutions);
// To test the overscan, it creates the default 5% overscan.
if (has_overscan) {
diff --git a/chromium/ash/display/display_info.h b/chromium/ash/display/display_info.h
index 17ba5f6cfaa..899dd1541a2 100644
--- a/chromium/ash/display/display_info.h
+++ b/chromium/ash/display/display_info.h
@@ -36,8 +36,7 @@ class ASH_EXPORT DisplayInfo {
// whose size is 1440x800 at the location (100, 200) in host coordinates.
// The format is
//
- // [origin-]widthxheight[*device_scale_factor][#resolutions list]
- // [/<properties>][@ui-scale]
+ // [origin-]widthxheight[*device_scale_factor][/<properties>][@ui-scale]
//
// where [] are optional:
// - |origin| is given in x+y- format.
@@ -47,8 +46,6 @@ class ASH_EXPORT DisplayInfo {
// (to the 'r'ight) 'u' is 180 degrees ('u'pside-down) and 'l' is
// 270 degrees (to the 'l'eft).
// - ui-scale is floating value, e.g. @1.5 or @1.25.
- // - |resolution list| is the list of size that is given in
- // |width x height| separated by '|'.
//
// A couple of examples:
// "100x100"
@@ -64,9 +61,6 @@ class ASH_EXPORT DisplayInfo {
// "10+20-300x200/u@1.5"
// 300x200 window at 10,20 origin. 1x device scale factor.
// no overscan. flipped upside-down (180 degree) and 1.5 ui scale.
- // "200x100#300x200|200x100|100x100"
- // 200x100 window at 0,0 origin, with 3 possible resolutions,
- // 300x200, 200x100 and 100x100.
static DisplayInfo CreateFromSpec(const std::string& spec);
// Creates a DisplayInfo from string spec using given |id|.
diff --git a/chromium/ash/display/display_info_unittest.cc b/chromium/ash/display/display_info_unittest.cc
index 4e9768de049..d425046c89c 100644
--- a/chromium/ash/display/display_info_unittest.cc
+++ b/chromium/ash/display/display_info_unittest.cc
@@ -43,14 +43,6 @@ TEST_F(DisplayInfoTest, CreateFromSpec) {
EXPECT_EQ("10,20 300x400", info.bounds_in_pixel().ToString());
EXPECT_EQ(gfx::Display::ROTATE_270, info.rotation());
EXPECT_EQ(1.5f, info.ui_scale());
-
- info = DisplayInfo::CreateFromSpecWithID(
- "200x200#300x200|200x200|100x100", 10);
- EXPECT_EQ("0,0 200x200", info.bounds_in_pixel().ToString());
- EXPECT_EQ(3u, info.resolutions().size());
- EXPECT_EQ("300x200", info.resolutions()[0].size.ToString());
- EXPECT_EQ("200x200", info.resolutions()[1].size.ToString());
- EXPECT_EQ("100x100", info.resolutions()[2].size.ToString());
}
} // namespace internal
diff --git a/chromium/ash/display/display_manager.cc b/chromium/ash/display/display_manager.cc
index 8953fc8ab93..5943f99b189 100644
--- a/chromium/ash/display/display_manager.cc
+++ b/chromium/ash/display/display_manager.cc
@@ -72,14 +72,6 @@ struct DisplayInfoSortFunctor {
}
};
-struct ResolutionMatcher {
- ResolutionMatcher(const gfx::Size& size) : size(size) {}
- bool operator()(const Resolution& resolution) {
- return resolution.size == size;
- }
- gfx::Size size;
-};
-
struct ScaleComparator {
ScaleComparator(float s) : scale(s) {}
@@ -95,12 +87,6 @@ gfx::Display& GetInvalidDisplay() {
return *invalid_display;
}
-void MaybeInitInternalDisplay(int64 id) {
- CommandLine* command_line = CommandLine::ForCurrentProcess();
- if (command_line->HasSwitch(switches::kAshUseFirstDisplayAsInternal))
- gfx::Display::SetInternalDisplayId(id);
-}
-
// Scoped objects used to either create or close the mirror window
// at specific timing.
class MirrorWindowCreator {
@@ -215,8 +201,9 @@ void DisplayManager::InitFromCommandLine() {
iter != parts.end(); ++iter) {
info_list.push_back(DisplayInfo::CreateFromSpec(*iter));
}
- if (info_list.size())
- MaybeInitInternalDisplay(info_list[0].id());
+ CommandLine* command_line = CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(switches::kAshUseFirstDisplayAsInternal))
+ gfx::Display::SetInternalDisplayId(info_list[0].id());
OnNativeDisplaysChanged(info_list);
}
@@ -249,38 +236,6 @@ bool DisplayManager::IsInternalDisplayId(int64 id) const {
return gfx::Display::InternalDisplayId() == id;
}
-DisplayLayout DisplayManager::GetCurrentDisplayLayout() {
- DCHECK_EQ(2U, num_connected_displays());
- // Invert if the primary was swapped.
- if (num_connected_displays() > 1) {
- DisplayIdPair pair = GetCurrentDisplayIdPair();
- return layout_store_->ComputeDisplayLayoutForDisplayIdPair(pair);
- }
- NOTREACHED() << "DisplayLayout is requested for single display";
- // On release build, just fallback to default instead of blowing up.
- DisplayLayout layout =
- layout_store_->default_display_layout();
- layout.primary_id = displays_[0].id();
- return layout;
-}
-
-DisplayIdPair DisplayManager::GetCurrentDisplayIdPair() const {
- if (IsMirrored()) {
- int64 mirrored_id = mirrored_display().id();
- return displays_[0].id() == mirrored_id ?
- std::make_pair(displays_[1].id(), mirrored_id) :
- std::make_pair(displays_[0].id(), mirrored_id);
- } else {
- int64 id_at_zero = displays_[0].id();
- if (id_at_zero == gfx::Display::InternalDisplayId() ||
- id_at_zero == first_display_id()) {
- return std::make_pair(id_at_zero, displays_[1].id());
- } else {
- return std::make_pair(displays_[1].id(), id_at_zero);
- }
- }
-}
-
const gfx::Display& DisplayManager::GetDisplayForId(int64 id) const {
gfx::Display* display =
const_cast<DisplayManager*>(this)->FindDisplayForId(id);
@@ -371,23 +326,7 @@ void DisplayManager::SetDisplayResolution(int64 display_id,
DCHECK_NE(gfx::Display::InternalDisplayId(), display_id);
if (gfx::Display::InternalDisplayId() == display_id)
return;
- const DisplayInfo& display_info = GetDisplayInfo(display_id);
- const std::vector<Resolution>& resolutions = display_info.resolutions();
- DCHECK_NE(0u, resolutions.size());
- std::vector<Resolution>::const_iterator iter =
- std::find_if(resolutions.begin(),
- resolutions.end(),
- ResolutionMatcher(resolution));
- if (iter == resolutions.end()) {
- LOG(WARNING) << "Unsupported resolution was requested:"
- << resolution.ToString();
- return;
- } else if (iter == resolutions.begin()) {
- // The best resolution was set, so forget it.
- resolutions_.erase(display_id);
- } else {
- resolutions_[display_id] = resolution;
- }
+ resolutions_[display_id] = resolution;
#if defined(OS_CHROMEOS) && defined(USE_X11)
if (base::chromeos::IsRunningOnChromeOS())
Shell::GetInstance()->output_configurator()->ScheduleConfigureOutputs();
@@ -456,7 +395,6 @@ void DisplayManager::OnNativeDisplaysChanged(
if (displays_.empty()) {
std::vector<DisplayInfo> init_displays;
init_displays.push_back(DisplayInfo::CreateFromSpec(std::string()));
- MaybeInitInternalDisplay(init_displays[0].id());
OnNativeDisplaysChanged(init_displays);
} else {
// Otherwise don't update the displays when all displays are disconnected.
@@ -704,13 +642,28 @@ const gfx::Display& DisplayManager::GetDisplayAt(size_t index) const {
return displays_[index];
}
-const gfx::Display& DisplayManager::GetPrimaryDisplayCandidate() const {
- if (GetNumDisplays() == 1) {
- return displays_[0];
+const gfx::Display* DisplayManager::GetPrimaryDisplayCandidate() const {
+ const gfx::Display* primary_candidate = &displays_[0];
+#if defined(OS_CHROMEOS)
+ if (base::chromeos::IsRunningOnChromeOS()) {
+ // On ChromeOS device, root windows are stacked vertically, and
+ // default primary is the one on top.
+ int count = GetNumDisplays();
+ int y = GetDisplayInfo(primary_candidate->id()).bounds_in_pixel().y();
+ for (int i = 1; i < count; ++i) {
+ const gfx::Display* display = &displays_[i];
+ const DisplayInfo& display_info = GetDisplayInfo(display->id());
+ if (display->IsInternal()) {
+ primary_candidate = display;
+ break;
+ } else if (display_info.bounds_in_pixel().y() < y) {
+ primary_candidate = display;
+ y = display_info.bounds_in_pixel().y();
+ }
+ }
}
- DisplayLayout layout = layout_store_->GetRegisteredDisplayLayout(
- GetCurrentDisplayIdPair());
- return GetDisplayForId(layout.primary_id);
+#endif
+ return primary_candidate;
}
size_t DisplayManager::GetNumDisplays() const {
@@ -780,7 +733,7 @@ void DisplayManager::SetMirrorMode(bool mirrored) {
void DisplayManager::AddRemoveDisplay() {
DCHECK(!displays_.empty());
std::vector<DisplayInfo> new_display_info_list;
- const DisplayInfo& first_display = GetDisplayInfo(displays_[0].id());
+ DisplayInfo first_display = GetDisplayInfo(displays_[0].id());
new_display_info_list.push_back(first_display);
// Add if there is only one display connected.
if (num_connected_displays() == 1) {
@@ -899,9 +852,6 @@ bool DisplayManager::UpdateSecondaryDisplayBoundsForLayout(
primary_index = 1;
secondary_index = 0;
}
- // This function may be called before the secondary display is
- // registered. The bounds is empty in that case and will
- // return true.
gfx::Rect bounds =
GetDisplayForId(displays->at(secondary_index).id()).bounds();
UpdateDisplayBoundsForLayout(
diff --git a/chromium/ash/display/display_manager.h b/chromium/ash/display/display_manager.h
index f7554a79705..24303e1909b 100644
--- a/chromium/ash/display/display_manager.h
+++ b/chromium/ash/display/display_manager.h
@@ -107,12 +107,6 @@ class ASH_EXPORT DisplayManager
bool IsInternalDisplayId(int64 id) const;
- // Returns the display layout used for current displays.
- DisplayLayout GetCurrentDisplayLayout();
-
- // Returns the current display pair.
- DisplayIdPair GetCurrentDisplayIdPair() const;
-
// Returns display for given |id|;
const gfx::Display& GetDisplayForId(int64 id) const;
@@ -176,7 +170,7 @@ class ASH_EXPORT DisplayManager
// no longer considered "primary".
const gfx::Display& GetDisplayAt(size_t index) const;
- const gfx::Display& GetPrimaryDisplayCandidate() const;
+ const gfx::Display* GetPrimaryDisplayCandidate() const;
// Returns the logical number of displays. This returns 1
// when displays are mirrored.
diff --git a/chromium/ash/display/display_manager_unittest.cc b/chromium/ash/display/display_manager_unittest.cc
index f7b6d1ded4f..33ca06e70d2 100644
--- a/chromium/ash/display/display_manager_unittest.cc
+++ b/chromium/ash/display/display_manager_unittest.cc
@@ -717,42 +717,6 @@ TEST_F(DisplayManagerTest, NativeDisplaysChangedAfterPrimaryChange) {
EXPECT_EQ("0,0 100x100", GetDisplayForId(10).bounds().ToString());
}
-TEST_F(DisplayManagerTest, DontRememberBestResolution) {
- int display_id = 1000;
- DisplayInfo native_display_info =
- CreateDisplayInfo(display_id, gfx::Rect(0, 0, 1000, 500));
- std::vector<Resolution> resolutions;
- resolutions.push_back(Resolution(gfx::Size(1000, 500), false));
- resolutions.push_back(Resolution(gfx::Size(800, 300), false));
- resolutions.push_back(Resolution(gfx::Size(400, 500), false));
-
- native_display_info.set_resolutions(resolutions);
-
- std::vector<DisplayInfo> display_info_list;
- display_info_list.push_back(native_display_info);
- display_manager()->OnNativeDisplaysChanged(display_info_list);
-
- gfx::Size selected;
- EXPECT_FALSE(display_manager()->GetSelectedResolutionForDisplayId(
- display_id, &selected));
-
- // Unsupported resolution.
- display_manager()->SetDisplayResolution(display_id, gfx::Size(800, 4000));
- EXPECT_FALSE(display_manager()->GetSelectedResolutionForDisplayId(
- display_id, &selected));
-
- // Supported resolution.
- display_manager()->SetDisplayResolution(display_id, gfx::Size(800, 300));
- EXPECT_TRUE(display_manager()->GetSelectedResolutionForDisplayId(
- display_id, &selected));
- EXPECT_EQ("800x300", selected.ToString());
-
- // Best resolution.
- display_manager()->SetDisplayResolution(display_id, gfx::Size(1000, 500));
- EXPECT_FALSE(display_manager()->GetSelectedResolutionForDisplayId(
- display_id, &selected));
-}
-
TEST_F(DisplayManagerTest, Rotate) {
if (!SupportsMultipleDisplays())
return;
@@ -1027,26 +991,5 @@ TEST_F(DisplayManagerTest, SoftwareMirroring) {
Shell::GetScreen()->RemoveObserver(&display_observer);
}
-TEST_F(DisplayManagerTest, MirroredLayout) {
- if (!SupportsMultipleDisplays())
- return;
-
- DisplayManager* display_manager = Shell::GetInstance()->display_manager();
- UpdateDisplay("500x500,400x400");
- EXPECT_FALSE(display_manager->GetCurrentDisplayLayout().mirrored);
- EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
- EXPECT_EQ(2U, display_manager->num_connected_displays());
-
- UpdateDisplay("1+0-500x500,1+0-500x500");
- EXPECT_TRUE(display_manager->GetCurrentDisplayLayout().mirrored);
- EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
- EXPECT_EQ(2U, display_manager->num_connected_displays());
-
- UpdateDisplay("500x500,500x500");
- EXPECT_FALSE(display_manager->GetCurrentDisplayLayout().mirrored);
- EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays());
- EXPECT_EQ(2U, display_manager->num_connected_displays());
-}
-
} // namespace internal
} // namespace ash
diff --git a/chromium/ash/display/mouse_cursor_event_filter.cc b/chromium/ash/display/mouse_cursor_event_filter.cc
index f3c3a746d47..419ea783207 100644
--- a/chromium/ash/display/mouse_cursor_event_filter.cc
+++ b/chromium/ash/display/mouse_cursor_event_filter.cc
@@ -5,7 +5,6 @@
#include "ash/display/mouse_cursor_event_filter.h"
#include "ash/display/display_controller.h"
-#include "ash/display/display_manager.h"
#include "ash/display/mirror_window_controller.h"
#include "ash/display/shared_display_edge_indicator.h"
#include "ash/screen_ash.h"
@@ -58,7 +57,7 @@ void MouseCursorEventFilter::ShowSharedEdgeIndicator(
drag_source_root_ = from;
DisplayLayout::Position position = Shell::GetInstance()->
- display_manager()->GetCurrentDisplayLayout().position;
+ display_controller()->GetCurrentDisplayLayout().position;
if (position == DisplayLayout::TOP || position == DisplayLayout::BOTTOM)
UpdateHorizontalIndicatorWindowBounds();
else
@@ -159,7 +158,7 @@ void MouseCursorEventFilter::UpdateHorizontalIndicatorWindowBounds() {
Shell::GetScreen()->GetPrimaryDisplay().bounds();
const gfx::Rect secondary_bounds = ScreenAsh::GetSecondaryDisplay().bounds();
DisplayLayout::Position position = Shell::GetInstance()->
- display_manager()->GetCurrentDisplayLayout().position;
+ display_controller()->GetCurrentDisplayLayout().position;
src_indicator_bounds_.set_x(
std::max(primary_bounds.x(), secondary_bounds.x()));
@@ -188,7 +187,7 @@ void MouseCursorEventFilter::UpdateVerticalIndicatorWindowBounds() {
Shell::GetScreen()->GetPrimaryDisplay().bounds();
const gfx::Rect secondary_bounds = ScreenAsh::GetSecondaryDisplay().bounds();
DisplayLayout::Position position = Shell::GetInstance()->
- display_manager()->GetCurrentDisplayLayout().position;
+ display_controller()->GetCurrentDisplayLayout().position;
int upper_shared_y = std::max(primary_bounds.y(), secondary_bounds.y());
int lower_shared_y = std::min(primary_bounds.bottom(),
diff --git a/chromium/ash/display/mouse_cursor_event_filter_unittest.cc b/chromium/ash/display/mouse_cursor_event_filter_unittest.cc
index e4c1f554ed8..db4c5dc1c70 100644
--- a/chromium/ash/display/mouse_cursor_event_filter_unittest.cc
+++ b/chromium/ash/display/mouse_cursor_event_filter_unittest.cc
@@ -108,7 +108,7 @@ TEST_F(MouseCursorEventFilterTest, WarpMouseDifferentSizeDisplays) {
Shell::GetInstance()->mouse_cursor_filter();
ASSERT_EQ(
DisplayLayout::RIGHT,
- Shell::GetInstance()->display_manager()->
+ Shell::GetInstance()->display_controller()->
GetCurrentDisplayLayout().position);
Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
@@ -143,7 +143,7 @@ TEST_F(MouseCursorEventFilterTest, WarpMouseDifferentScaleDisplays) {
Shell::GetInstance()->mouse_cursor_filter();
ASSERT_EQ(
DisplayLayout::RIGHT,
- Shell::GetInstance()->display_manager()->
+ Shell::GetInstance()->display_controller()->
GetCurrentDisplayLayout().position);
Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
diff --git a/chromium/ash/display/resolution_notification_controller_unittest.cc b/chromium/ash/display/resolution_notification_controller_unittest.cc
index 036cce0d85c..3a479f98fd3 100644
--- a/chromium/ash/display/resolution_notification_controller_unittest.cc
+++ b/chromium/ash/display/resolution_notification_controller_unittest.cc
@@ -43,18 +43,16 @@ class ResolutionNotificationControllerTest : public ash::test::AshTestBase {
// OnConfigurationChanged event won't be emitted in the test environment,
// so invoke UpdateDisplay() to emit that event explicitly.
- std::vector<DisplayInfo> info_list;
+ std::string display_spec;
for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
+ if (i > 0)
+ display_spec.append(",");
int64 id = display_manager->GetDisplayAt(i).id();
- DisplayInfo info = display_manager->GetDisplayInfo(id);
- if (display.id() == id) {
- gfx::Rect bounds = info.bounds_in_pixel();
- bounds.set_size(new_resolution);
- info.SetBounds(bounds);
- }
- info_list.push_back(info);
+ gfx::Size size = (display.id() == id) ?
+ new_resolution : display_manager->GetDisplayInfo(id).size_in_pixel();
+ display_spec.append(size.ToString());
}
- display_manager->OnNativeDisplaysChanged(info_list);
+ UpdateDisplay(display_spec);
RunAllPendingInMessageLoop();
}
@@ -106,7 +104,7 @@ TEST_F(ResolutionNotificationControllerTest, Basic) {
if (!SupportsMultipleDisplays())
return;
- UpdateDisplay("300x300#300x300|200x200,250x250#250x250|200x200");
+ UpdateDisplay("100x100,150x150");
int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id();
ash::internal::DisplayManager* display_manager =
ash::Shell::GetInstance()->display_manager();
@@ -123,20 +121,21 @@ TEST_F(ResolutionNotificationControllerTest, Basic) {
display_manager->GetSelectedResolutionForDisplayId(id2, &resolution));
EXPECT_EQ("200x200", resolution.ToString());
- // Click the revert button, which reverts to the best resolution.
+ // Click the revert button, which reverts the resolution.
ClickOnNotificationButton(0);
RunAllPendingInMessageLoop();
EXPECT_FALSE(IsNotificationVisible());
EXPECT_EQ(0, accept_count());
- EXPECT_FALSE(
+ EXPECT_TRUE(
display_manager->GetSelectedResolutionForDisplayId(id2, &resolution));
+ EXPECT_EQ("150x150", resolution.ToString());
}
TEST_F(ResolutionNotificationControllerTest, ClickMeansAccept) {
if (!SupportsMultipleDisplays())
return;
- UpdateDisplay("300x300#300x300|200x200,250x250#250x250|200x200");
+ UpdateDisplay("100x100,150x150");
int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id();
ash::internal::DisplayManager* display_manager =
ash::Shell::GetInstance()->display_manager();
@@ -170,7 +169,7 @@ TEST_F(ResolutionNotificationControllerTest, AcceptButton) {
ash::internal::DisplayManager* display_manager =
ash::Shell::GetInstance()->display_manager();
- UpdateDisplay("300x300#300x300|200x200");
+ UpdateDisplay("100x100");
const gfx::Display& display = ash::Shell::GetScreen()->GetPrimaryDisplay();
SetDisplayResolutionAndNotify(display, gfx::Size(200, 200));
EXPECT_TRUE(IsNotificationVisible());
@@ -187,7 +186,7 @@ TEST_F(ResolutionNotificationControllerTest, AcceptButton) {
EXPECT_EQ("200x200", resolution.ToString());
// In that case the second button is revert.
- UpdateDisplay("300x300#300x300|200x200");
+ UpdateDisplay("100x100");
SetDisplayResolutionAndNotify(display, gfx::Size(200, 200));
EXPECT_TRUE(IsNotificationVisible());
@@ -195,8 +194,9 @@ TEST_F(ResolutionNotificationControllerTest, AcceptButton) {
ClickOnNotificationButton(1);
EXPECT_FALSE(IsNotificationVisible());
EXPECT_EQ(1, accept_count());
- EXPECT_FALSE(display_manager->GetSelectedResolutionForDisplayId(
+ EXPECT_TRUE(display_manager->GetSelectedResolutionForDisplayId(
display.id(), &resolution));
+ EXPECT_EQ("100x100", resolution.ToString());
}
TEST_F(ResolutionNotificationControllerTest, Close) {
@@ -232,7 +232,7 @@ TEST_F(ResolutionNotificationControllerTest, Timeout) {
if (!SupportsMultipleDisplays())
return;
- UpdateDisplay("300x300#300x300|200x200");
+ UpdateDisplay("100x100");
const gfx::Display& display = ash::Shell::GetScreen()->GetPrimaryDisplay();
SetDisplayResolutionAndNotify(display, gfx::Size(200, 200));
@@ -247,38 +247,39 @@ TEST_F(ResolutionNotificationControllerTest, Timeout) {
gfx::Size resolution;
ash::internal::DisplayManager* display_manager =
ash::Shell::GetInstance()->display_manager();
- EXPECT_FALSE(display_manager->GetSelectedResolutionForDisplayId(
+ EXPECT_TRUE(display_manager->GetSelectedResolutionForDisplayId(
display.id(), &resolution));
+ EXPECT_EQ("100x100", resolution.ToString());
}
TEST_F(ResolutionNotificationControllerTest, DisplayDisconnected) {
if (!SupportsMultipleDisplays())
return;
- UpdateDisplay("300x300#300x300|200x200,200x200#250x250|200x200|100x100");
+ UpdateDisplay("100x100,150x150");
int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id();
ash::internal::DisplayManager* display_manager =
ash::Shell::GetInstance()->display_manager();
SetDisplayResolutionAndNotify(
- ScreenAsh::GetSecondaryDisplay(), gfx::Size(100, 100));
+ ScreenAsh::GetSecondaryDisplay(), gfx::Size(200, 200));
ASSERT_TRUE(IsNotificationVisible());
// Disconnects the secondary display and verifies it doesn't cause crashes.
- UpdateDisplay("300x300#300x300|200x200");
+ UpdateDisplay("100x100");
RunAllPendingInMessageLoop();
EXPECT_FALSE(IsNotificationVisible());
EXPECT_EQ(0, accept_count());
gfx::Size resolution;
EXPECT_TRUE(
display_manager->GetSelectedResolutionForDisplayId(id2, &resolution));
- EXPECT_EQ("200x200", resolution.ToString());
+ EXPECT_EQ("150x150", resolution.ToString());
}
TEST_F(ResolutionNotificationControllerTest, MultipleResolutionChange) {
if (!SupportsMultipleDisplays())
return;
- UpdateDisplay("300x300#300x300|200x200,250x250#250x250|200x200");
+ UpdateDisplay("100x100,150x150");
int64 id2 = ash::ScreenAsh::GetSecondaryDisplay().id();
ash::internal::DisplayManager* display_manager =
ash::Shell::GetInstance()->display_manager();
@@ -296,8 +297,9 @@ TEST_F(ResolutionNotificationControllerTest, MultipleResolutionChange) {
// visible.
SetDisplayResolutionAndNotify(
ScreenAsh::GetSecondaryDisplay(), gfx::Size(250, 250));
- EXPECT_FALSE(
+ EXPECT_TRUE(
display_manager->GetSelectedResolutionForDisplayId(id2, &resolution));
+ EXPECT_EQ("250x250", resolution.ToString());
// Then, click the revert button. Although |old_resolution| for the second
// SetDisplayResolutionAndNotify is 200x200, it should revert to the original
@@ -306,8 +308,9 @@ TEST_F(ResolutionNotificationControllerTest, MultipleResolutionChange) {
RunAllPendingInMessageLoop();
EXPECT_FALSE(IsNotificationVisible());
EXPECT_EQ(0, accept_count());
- EXPECT_FALSE(
+ EXPECT_TRUE(
display_manager->GetSelectedResolutionForDisplayId(id2, &resolution));
+ EXPECT_EQ("150x150", resolution.ToString());
}
} // namespace internal
diff --git a/chromium/ash/display/screen_position_controller.cc b/chromium/ash/display/screen_position_controller.cc
index 8c37efeebe4..03033b4135d 100644
--- a/chromium/ash/display/screen_position_controller.cc
+++ b/chromium/ash/display/screen_position_controller.cc
@@ -170,6 +170,10 @@ void ScreenPositionController::SetBounds(aura::Window* window,
aura::Window* dst_container = NULL;
if (dst_root != window->GetRootWindow()) {
int container_id = window->parent()->id();
+ // Dragging a docked window to another root window should show it floating
+ // rather than docked in another screen's dock.
+ if (container_id == kShellWindowId_DockedContainer)
+ container_id = kShellWindowId_DefaultContainer;
// All containers that uses screen coordinates must have valid window ids.
DCHECK_GE(container_id, 0);
// Don't move modal background.
diff --git a/chromium/ash/display/screen_position_controller_unittest.cc b/chromium/ash/display/screen_position_controller_unittest.cc
index 260590ac5d3..3b62f52b27b 100644
--- a/chromium/ash/display/screen_position_controller_unittest.cc
+++ b/chromium/ash/display/screen_position_controller_unittest.cc
@@ -34,11 +34,11 @@ namespace test {
namespace {
void SetSecondaryDisplayLayout(DisplayLayout::Position position) {
- DisplayLayout layout =
- Shell::GetInstance()->display_manager()->GetCurrentDisplayLayout();
+ DisplayController* display_controller =
+ Shell::GetInstance()->display_controller();
+ DisplayLayout layout = display_controller->GetCurrentDisplayLayout();
layout.position = position;
- Shell::GetInstance()->display_controller()->
- SetLayoutForCurrentDisplays(layout);
+ display_controller->SetLayoutForCurrentDisplays(layout);
}
internal::ScreenPositionController* GetScreenPositionController() {
diff --git a/chromium/ash/extended_desktop_unittest.cc b/chromium/ash/extended_desktop_unittest.cc
index d36e8240893..36161e046d0 100644
--- a/chromium/ash/extended_desktop_unittest.cc
+++ b/chromium/ash/extended_desktop_unittest.cc
@@ -36,11 +36,11 @@ namespace ash {
namespace {
void SetSecondaryDisplayLayout(DisplayLayout::Position position) {
- DisplayLayout layout =
- Shell::GetInstance()->display_manager()->GetCurrentDisplayLayout();
+ DisplayController* display_controller =
+ Shell::GetInstance()->display_controller();
+ DisplayLayout layout = display_controller->GetCurrentDisplayLayout();
layout.position = position;
- Shell::GetInstance()->display_controller()->
- SetLayoutForCurrentDisplays(layout);
+ display_controller->SetLayoutForCurrentDisplays(layout);
}
internal::DisplayManager* GetDisplayManager() {
diff --git a/chromium/ash/keyboard_controller_proxy_stub.cc b/chromium/ash/keyboard_controller_proxy_stub.cc
deleted file mode 100644
index caaa3dd8a2e..00000000000
--- a/chromium/ash/keyboard_controller_proxy_stub.cc
+++ /dev/null
@@ -1,34 +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 "ash/keyboard_controller_proxy_stub.h"
-
-#include "ash/shell.h"
-#include "ui/views/corewm/input_method_event_filter.h"
-
-using namespace content;
-
-namespace ash {
-
-KeyboardControllerProxyStub::KeyboardControllerProxyStub() {
-}
-
-KeyboardControllerProxyStub::~KeyboardControllerProxyStub() {
-}
-
-BrowserContext* KeyboardControllerProxyStub::GetBrowserContext() {
- return Shell::GetInstance()->browser_context();
-}
-
-ui::InputMethod* KeyboardControllerProxyStub::GetInputMethod() {
- return Shell::GetInstance()->input_method_filter()->input_method();
-}
-
-void KeyboardControllerProxyStub::RequestAudioInput(
- WebContents* web_contents,
- const MediaStreamRequest& request,
- const MediaResponseCallback& callback) {
-}
-
-} // namespace ash
diff --git a/chromium/ash/keyboard_controller_proxy_stub.h b/chromium/ash/keyboard_controller_proxy_stub.h
deleted file mode 100644
index 25310d71601..00000000000
--- a/chromium/ash/keyboard_controller_proxy_stub.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 ASH_KEYBOARD_CONTROLLER_PROXY_STUB_H_
-#define ASH_KEYBOARD_CONTROLLER_PROXY_STUB_H_
-
-#include "ash/ash_export.h"
-#include "ui/keyboard/keyboard_controller_proxy.h"
-
-namespace ash {
-
-// Stub implementation of KeyboardControllerProxy
-class ASH_EXPORT KeyboardControllerProxyStub
- : public keyboard::KeyboardControllerProxy {
- public:
- KeyboardControllerProxyStub();
- virtual ~KeyboardControllerProxyStub();
-
- private:
- // Overridden from keyboard::KeyboardControllerProxy:
- virtual content::BrowserContext* GetBrowserContext() OVERRIDE;
- virtual ui::InputMethod* GetInputMethod() OVERRIDE;
- virtual void RequestAudioInput(content::WebContents* web_contents,
- const content::MediaStreamRequest& request,
- const content::MediaResponseCallback& callback) OVERRIDE;
-
- DISALLOW_COPY_AND_ASSIGN(KeyboardControllerProxyStub);
-};
-
-} // namespace ash
-
-#endif // ASH_KEYBOARD_CONTROLLER_PROXY_STUB_H_
diff --git a/chromium/ash/launcher/launcher_button.cc b/chromium/ash/launcher/launcher_button.cc
index 26677aef06a..2859d98c361 100644
--- a/chromium/ash/launcher/launcher_button.cc
+++ b/chromium/ash/launcher/launcher_button.cc
@@ -439,12 +439,6 @@ void LauncherButton::Layout() {
icon_width,
icon_height));
- // Icon size has been incorrect when running
- // PanelLayoutManagerTest.PanelAlignmentSecondDisplay on valgrind bot, see
- // http://crbug.com/234854.
- DCHECK_LE(icon_width, kIconSize);
- DCHECK_LE(icon_height, kIconSize);
-
bar_->SetBarBoundsRect(button_bounds);
UpdateState();
diff --git a/chromium/ash/launcher/launcher_view.cc b/chromium/ash/launcher/launcher_view.cc
index 1ec3e9461eb..82f75bed49e 100644
--- a/chromium/ash/launcher/launcher_view.cc
+++ b/chromium/ash/launcher/launcher_view.cc
@@ -1521,11 +1521,6 @@ void LauncherView::ButtonPressed(views::Button* sender,
case TYPE_TABBED:
case TYPE_APP_PANEL:
delegate_->ItemSelected(model_->items()[view_index], event);
- // Don't show the menu when the user creates a new browser using ctrl
- // click.
- if (model_->items()[view_index].type != TYPE_BROWSER_SHORTCUT ||
- !(event.flags() & ui::EF_CONTROL_DOWN))
- ShowListMenuForView(model_->items()[view_index], sender, event);
break;
case TYPE_APP_LIST:
@@ -1535,6 +1530,9 @@ void LauncherView::ButtonPressed(views::Button* sender,
break;
}
}
+
+ if (model_->items()[view_index].type != TYPE_APP_LIST)
+ ShowListMenuForView(model_->items()[view_index], sender, event);
}
bool LauncherView::ShowListMenuForView(const LauncherItem& item,
diff --git a/chromium/ash/resources/ash_resources.grd b/chromium/ash/resources/ash_resources.grd
index 991c895a8d0..166fe5f7fb4 100644
--- a/chromium/ash/resources/ash_resources.grd
+++ b/chromium/ash/resources/ash_resources.grd
@@ -113,6 +113,15 @@
<structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_GUEST_ICON" file="cros/status/status_guest_icon.png" />
<structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_GUEST_ICON_LARGE" file="common/alt_launcher/status_guest_icon.png" />
+ <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_BOTTOM" file="cros/status/status_logout_button_hover_bottom.png" />
+ <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_BOTTOM_LEFT" file="cros/status/status_logout_button_hover_bottom_left.png" />
+ <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_BOTTOM_RIGHT" file="cros/status/status_logout_button_hover_bottom_right.png" />
+ <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_CENTER" file="cros/status/status_logout_button_hover_center.png" />
+ <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_LEFT" file="cros/status/status_logout_button_hover_left.png" />
+ <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_RIGHT" file="cros/status/status_logout_button_hover_right.png" />
+ <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_TOP" file="cros/status/status_logout_button_hover_top.png" />
+ <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_TOP_LEFT" file="cros/status/status_logout_button_hover_top_left.png" />
+ <structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_TOP_RIGHT" file="cros/status/status_logout_button_hover_top_right.png" />
<structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_BOTTOM" file="cros/status/status_logout_button_pushed_bottom.png" />
<structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_BOTTOM_LEFT" file="cros/status/status_logout_button_pushed_bottom_left.png" />
<structure type="chrome_scaled_image" name="IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_BOTTOM_RIGHT" file="cros/status/status_logout_button_pushed_bottom_right.png" />
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_bottom.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_bottom.png
new file mode 100644
index 00000000000..4bfbaeb55d3
--- /dev/null
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_bottom.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_bottom_left.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_bottom_left.png
new file mode 100644
index 00000000000..5a96fee74f6
--- /dev/null
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_bottom_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_bottom_right.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_bottom_right.png
new file mode 100644
index 00000000000..a5ddc1c7237
--- /dev/null
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_bottom_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_center.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_center.png
new file mode 100644
index 00000000000..18ef4f8bb84
--- /dev/null
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_center.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_left.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_left.png
new file mode 100644
index 00000000000..d806c99e202
--- /dev/null
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_right.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_right.png
new file mode 100644
index 00000000000..2baa507df09
--- /dev/null
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_top.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_top.png
new file mode 100644
index 00000000000..2752a48b452
--- /dev/null
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_top.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_top_left.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_top_left.png
new file mode 100644
index 00000000000..71d450df94a
--- /dev/null
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_top_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_top_right.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_top_right.png
new file mode 100644
index 00000000000..3270b26e38a
--- /dev/null
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_hover_top_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom.png
index 48a9b785df4..76c31f3da51 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom_left.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom_left.png
index ed08895c1dc..64dd932a5b3 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom_left.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom_right.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom_right.png
index 5c411664aba..4ece433cd11 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom_right.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_bottom_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_center.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_center.png
index 674a2caf3ed..18ef4f8bb84 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_center.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_center.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_left.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_left.png
index 0ca8c152c87..5decc7d040f 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_left.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_right.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_right.png
index 107f25ee038..22b08962394 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_right.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top.png
index 0c882a30355..8100431a445 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top_left.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top_left.png
index a2885849256..acd66413134 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top_left.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top_right.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top_right.png
index ac7c0dffecc..63e7c5180b7 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top_right.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_normal_top_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom.png
index 07b1a81db81..cb40232c22f 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom_left.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom_left.png
index a0c58bbca50..59664ce57c8 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom_left.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom_right.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom_right.png
index f20a29d47e6..b6a2d429033 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom_right.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_bottom_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_center.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_center.png
index 948a9225cbc..95e1357234b 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_center.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_center.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_left.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_left.png
index e896e8105e6..6ff819e654d 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_left.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_right.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_right.png
index 47e1e4ba51f..c1e9dda476f 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_right.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top.png
index 6e304f22192..f2b8fc513a4 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top_left.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top_left.png
index aecbe19888c..7aa3057f727 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top_left.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top_right.png b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top_right.png
index 535677029ef..6d610d5150b 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top_right.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_logout_button_pushed_top_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_100_percent/cros/status/status_managed_mode_user.png b/chromium/ash/resources/default_100_percent/cros/status/status_managed_mode_user.png
index 51104172bbd..684702b6242 100644
--- a/chromium/ash/resources/default_100_percent/cros/status/status_managed_mode_user.png
+++ b/chromium/ash/resources/default_100_percent/cros/status/status_managed_mode_user.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_bottom.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_bottom.png
new file mode 100644
index 00000000000..d15cb08743a
--- /dev/null
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_bottom.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_bottom_left.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_bottom_left.png
new file mode 100644
index 00000000000..40de4bb4838
--- /dev/null
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_bottom_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_bottom_right.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_bottom_right.png
new file mode 100644
index 00000000000..216bffd3734
--- /dev/null
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_bottom_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_center.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_center.png
new file mode 100644
index 00000000000..eb3f2c83973
--- /dev/null
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_center.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_left.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_left.png
new file mode 100644
index 00000000000..bc35d9dc9c0
--- /dev/null
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_right.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_right.png
new file mode 100644
index 00000000000..55ae12825f8
--- /dev/null
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_top.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_top.png
new file mode 100644
index 00000000000..a4b48b2e5dd
--- /dev/null
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_top.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_top_left.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_top_left.png
new file mode 100644
index 00000000000..8d3823c18aa
--- /dev/null
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_top_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_top_right.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_top_right.png
new file mode 100644
index 00000000000..b73cd7e0640
--- /dev/null
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_hover_top_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom.png
index 679ebe905cd..a6a2e668849 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom_left.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom_left.png
index 7b615e65c83..47768bcdf8f 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom_left.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom_right.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom_right.png
index 149b4a9c5dd..3cd5993e361 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom_right.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_bottom_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_center.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_center.png
index 436c2ac18a1..eb3f2c83973 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_center.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_center.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_left.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_left.png
index c58ee946b2e..dbc95d67135 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_left.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_right.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_right.png
index 5f7d6500ff8..0dc53850876 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_right.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top.png
index cc114446f6a..6b9e0865411 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top_left.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top_left.png
index 05dfa2f90cd..3d9ff7fb1fa 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top_left.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top_right.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top_right.png
index bf15dcdec00..6f263c28bb4 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top_right.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_normal_top_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom.png
index 0e23e565c4c..211e85791c7 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom_left.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom_left.png
index 79f2792aa6b..615d7ca5bf8 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom_left.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom_right.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom_right.png
index d6aa1a4f511..e9a05e16fb5 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom_right.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_bottom_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_center.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_center.png
index 41a39c92caf..22b0846c757 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_center.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_center.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_left.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_left.png
index 1617280c4f7..6c22eee78ef 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_left.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_right.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_right.png
index c5a5730fdfa..315bd16343b 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_right.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top.png
index b340b1bc287..e46313972a6 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top_left.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top_left.png
index 787ef70d361..3dede73f9f9 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top_left.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top_left.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top_right.png b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top_right.png
index 5d5f6349fa6..3d9e5d9adb2 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top_right.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_logout_button_pushed_top_right.png
Binary files differ
diff --git a/chromium/ash/resources/default_200_percent/cros/status/status_managed_mode_user.png b/chromium/ash/resources/default_200_percent/cros/status/status_managed_mode_user.png
index b0b522db0a2..02eb311e8b8 100644
--- a/chromium/ash/resources/default_200_percent/cros/status/status_managed_mode_user.png
+++ b/chromium/ash/resources/default_200_percent/cros/status/status_managed_mode_user.png
Binary files differ
diff --git a/chromium/ash/root_window_controller.cc b/chromium/ash/root_window_controller.cc
index dd237436cff..e0c631ebf11 100644
--- a/chromium/ash/root_window_controller.cc
+++ b/chromium/ash/root_window_controller.cc
@@ -4,6 +4,7 @@
#include "ash/root_window_controller.h"
+#include <queue>
#include <vector>
#include "ash/ash_constants.h"
@@ -27,6 +28,7 @@
#include "ash/touch/touch_observer_hud.h"
#include "ash/wm/always_on_top_controller.h"
#include "ash/wm/base_layout_manager.h"
+#include "ash/wm/boot_splash_screen.h"
#include "ash/wm/dock/docked_window_layout_manager.h"
#include "ash/wm/panels/panel_layout_manager.h"
#include "ash/wm/panels/panel_window_event_handler.h"
@@ -44,11 +46,13 @@
#include "base/command_line.h"
#include "base/time/time.h"
#include "ui/aura/client/aura_constants.h"
+#include "ui/aura/client/drag_drop_client.h"
#include "ui/aura/client/tooltip_client.h"
#include "ui/aura/root_window.h"
#include "ui/aura/window.h"
#include "ui/aura/window_delegate.h"
#include "ui/aura/window_observer.h"
+#include "ui/aura/window_tracker.h"
#include "ui/base/hit_test.h"
#include "ui/base/models/menu_model.h"
#include "ui/gfx/screen.h"
@@ -59,20 +63,14 @@
#include "ui/views/view_model.h"
#include "ui/views/view_model_utils.h"
-#if defined(OS_CHROMEOS)
-#include "ash/wm/boot_splash_screen_chromeos.h"
-#endif
-
namespace ash {
namespace {
-#if defined(OS_CHROMEOS)
// Duration for the animation that hides the boot splash screen, in
// milliseconds. This should be short enough in relation to
// wm/window_animation.cc's brightness/grayscale fade animation that the login
// background image animation isn't hidden by the splash screen animation.
const int kBootSplashScreenHideDurationMs = 500;
-#endif
// Creates a new window for use as a container.
aura::Window* CreateContainer(int window_id,
@@ -261,12 +259,17 @@ void RootWindowController::Shutdown() {
wallpaper_controller_.reset();
animating_wallpaper_controller_.reset();
- CloseChildWindows();
+ // Change the active root window before closing child windows. If any child
+ // being removed triggers a relayout of the shelf it will try to build a
+ // window list adding windows from the active root window's containers which
+ // may have already gone away.
if (Shell::GetActiveRootWindow() == root_window_) {
Shell::GetInstance()->set_active_root_window(
Shell::GetPrimaryRootWindow() == root_window_.get() ?
NULL : Shell::GetPrimaryRootWindow());
}
+
+ CloseChildWindows();
SetRootWindowController(root_window_.get(), NULL);
screen_dimmer_.reset();
workspace_controller_.reset();
@@ -350,7 +353,6 @@ void RootWindowController::UpdateAfterLoginStatusChange(
}
void RootWindowController::HandleInitialDesktopBackgroundAnimationStarted() {
-#if defined(OS_CHROMEOS)
if (CommandLine::ForCurrentProcess()->HasSwitch(
switches::kAshAnimateFromBootSplashScreen) &&
boot_splash_screen_.get()) {
@@ -359,15 +361,12 @@ void RootWindowController::HandleInitialDesktopBackgroundAnimationStarted() {
boot_splash_screen_->StartHideAnimation(
base::TimeDelta::FromMilliseconds(kBootSplashScreenHideDurationMs));
}
-#endif
}
void RootWindowController::OnWallpaperAnimationFinished(views::Widget* widget) {
// Make sure the wallpaper is visible.
system_background_->SetColor(SK_ColorBLACK);
-#if defined(OS_CHROMEOS)
boot_splash_screen_.reset();
-#endif
Shell::GetInstance()->user_wallpaper_delegate()->
OnWallpaperAnimationFinished();
@@ -404,6 +403,8 @@ void RootWindowController::CloseChildWindows() {
docked_layout_manager_ = NULL;
}
+ aura::client::SetDragDropClient(root_window_.get(), NULL);
+
// TODO(harrym): Remove when Status Area Widget is a child view.
shelf_->ShutdownStatusAreaWidget();
@@ -417,10 +418,26 @@ void RootWindowController::CloseChildWindows() {
workspace_controller_.reset();
aura::client::SetTooltipClient(root_window_.get(), NULL);
- while (!root_window_->children().empty()) {
- aura::Window* child = root_window_->children()[0];
- delete child;
+ // Remove all toplevel windows first.
+ std::queue<aura::Window*> non_toplevel_windows;
+ non_toplevel_windows.push(root_window_.get());
+ while (!non_toplevel_windows.empty()) {
+ aura::Window* non_toplevel_window = non_toplevel_windows.front();
+ non_toplevel_windows.pop();
+ aura::WindowTracker toplevel_windows;
+ for (size_t i = 0; i < non_toplevel_window->children().size(); ++i) {
+ aura::Window* child = non_toplevel_window->children()[i];
+ if (child->delegate())
+ toplevel_windows.Add(child);
+ else
+ non_toplevel_windows.push(child);
+ }
+ while (!toplevel_windows.windows().empty())
+ delete *toplevel_windows.windows().begin();
}
+ // And then remove the containers.
+ while (!root_window_->children().empty())
+ delete root_window_->children()[0];
shelf_.reset(NULL);
}
@@ -496,7 +513,6 @@ void RootWindowController::InitKeyboard() {
aura::Window* keyboard_container =
keyboard_controller_->GetContainerWindow();
- keyboard_container->set_id(kShellWindowId_VirtualKeyboardContainer);
parent->AddChild(keyboard_container);
keyboard_container->SetBounds(parent->bounds());
}
diff --git a/chromium/ash/root_window_controller.h b/chromium/ash/root_window_controller.h
index 140a7d26c17..bbf29ce1e34 100644
--- a/chromium/ash/root_window_controller.h
+++ b/chromium/ash/root_window_controller.h
@@ -50,6 +50,7 @@ namespace internal {
class AlwaysOnTopController;
class AnimatingDesktopController;
+class BootSplashScreen;
class DesktopBackgroundWidgetController;
class DockedWindowLayoutManager;
class PanelLayoutManager;
@@ -63,10 +64,6 @@ class TouchHudDebug;
class TouchHudProjection;
class WorkspaceController;
-#if defined(USE_X11)
-class BootSplashScreen;
-#endif
-
// This class maintains the per root window state for ash. This class
// owns the root window and other dependent objects that should be
// deleted upon the deletion of the root window. The RootWindowController
@@ -258,9 +255,7 @@ class ASH_EXPORT RootWindowController : public ShellObserver {
PanelLayoutManager* panel_layout_manager_;
scoped_ptr<SystemBackgroundController> system_background_;
-#if defined(USE_X11)
scoped_ptr<BootSplashScreen> boot_splash_screen_;
-#endif
scoped_ptr<ScreenDimmer> screen_dimmer_;
scoped_ptr<WorkspaceController> workspace_controller_;
diff --git a/chromium/ash/root_window_controller_unittest.cc b/chromium/ash/root_window_controller_unittest.cc
index b4c16e35f2a..0d40125b90f 100644
--- a/chromium/ash/root_window_controller_unittest.cc
+++ b/chromium/ash/root_window_controller_unittest.cc
@@ -13,7 +13,6 @@
#include "ash/wm/system_modal_container_layout_manager.h"
#include "ash/wm/window_properties.h"
#include "ash/wm/window_util.h"
-#include "base/command_line.h"
#include "ui/aura/client/focus_change_observer.h"
#include "ui/aura/client/focus_client.h"
#include "ui/aura/env.h"
@@ -23,7 +22,6 @@
#include "ui/aura/test/test_windows.h"
#include "ui/aura/window.h"
#include "ui/aura/window_tracker.h"
-#include "ui/keyboard/keyboard_switches.h"
#include "ui/views/controls/menu/menu_controller.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h"
@@ -82,36 +80,6 @@ class DeleteOnBlurDelegate : public aura::test::TestWindowDelegate,
DISALLOW_COPY_AND_ASSIGN(DeleteOnBlurDelegate);
};
-class ClickTestWindow : public views::WidgetDelegateView {
- public:
- ClickTestWindow() : mouse_presses_(0) {}
- virtual ~ClickTestWindow() {}
-
- // Overridden from views::WidgetDelegate:
- virtual views::View* GetContentsView() OVERRIDE {
- return this;
- }
-
- aura::Window* CreateTestWindowWithParent(aura::Window* parent) {
- DCHECK(parent);
- views::Widget* widget = Widget::CreateWindowWithParent(this, parent);
- return widget->GetNativeView();
- }
-
- // Overridden from views::View:
- virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE {
- mouse_presses_++;
- return false;
- }
-
- int mouse_presses() const { return mouse_presses_; }
-
- private:
- int mouse_presses_;
-
- DISALLOW_COPY_AND_ASSIGN(ClickTestWindow);
-};
-
} // namespace
namespace test {
@@ -524,52 +492,5 @@ TEST_F(NoSessionRootWindowControllerTest, Event) {
gfx::Point(size.width() - 1, size.height() - 1)));
}
-class VirtualKeyboardRootWindowControllerTest : public test::AshTestBase {
- public:
- VirtualKeyboardRootWindowControllerTest() {};
- virtual ~VirtualKeyboardRootWindowControllerTest() {};
-
- virtual void SetUp() OVERRIDE {
- CommandLine::ForCurrentProcess()->AppendSwitch(
- keyboard::switches::kEnableVirtualKeyboard);
- test::AshTestBase::SetUp();
- }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(VirtualKeyboardRootWindowControllerTest);
-};
-
-// Test for http://crbug.com/263599. Virtual keyboard should be able to receive
-// events at blocked user session.
-TEST_F(VirtualKeyboardRootWindowControllerTest,
- ClickVirtualKeyboardInBlockedWindow) {
- aura::RootWindow* root_window = ash::Shell::GetPrimaryRootWindow();
- aura::Window* keyboard_container = Shell::GetContainer(root_window,
- internal::kShellWindowId_VirtualKeyboardContainer);
- ASSERT_TRUE(keyboard_container);
- keyboard_container->Show();
-
- ClickTestWindow* main_delegate = new ClickTestWindow();
- scoped_ptr<aura::Window> keyboard_window(
- main_delegate->CreateTestWindowWithParent(keyboard_container));
- keyboard_container->layout_manager()->OnWindowResized();
- keyboard_window->Show();
- aura::test::EventGenerator event_generator(root_window,
- keyboard_window.get());
- event_generator.ClickLeftButton();
- int expected_mouse_presses = 1;
- EXPECT_EQ(expected_mouse_presses, main_delegate->mouse_presses());
-
- for (int block_reason = FIRST_BLOCK_REASON;
- block_reason < NUMBER_OF_BLOCK_REASONS;
- ++block_reason) {
- BlockUserSession(static_cast<UserSessionBlockReason>(block_reason));
- event_generator.ClickLeftButton();
- expected_mouse_presses++;
- EXPECT_EQ(expected_mouse_presses, main_delegate->mouse_presses());
- UnblockUserSession();
- }
-}
-
} // namespace test
} // namespace ash
diff --git a/chromium/ash/shelf/shelf_layout_manager.cc b/chromium/ash/shelf/shelf_layout_manager.cc
index a507da648a8..e392cc27417 100644
--- a/chromium/ash/shelf/shelf_layout_manager.cc
+++ b/chromium/ash/shelf/shelf_layout_manager.cc
@@ -197,7 +197,7 @@ class ShelfLayoutManager::UpdateShelfObserver
ShelfLayoutManager::ShelfLayoutManager(ShelfWidget* shelf)
: root_window_(shelf->GetNativeView()->GetRootWindow()),
- updating_bounds_(false),
+ in_layout_(false),
auto_hide_behavior_(SHELF_AUTO_HIDE_BEHAVIOR_NEVER),
alignment_(SHELF_ALIGNMENT_BOTTOM),
shelf_(shelf),
@@ -272,20 +272,34 @@ gfx::Rect ShelfLayoutManager::GetIdealBounds() {
}
void ShelfLayoutManager::LayoutShelf() {
+ base::AutoReset<bool> auto_reset_in_layout(&in_layout_, true);
+ StopAnimating();
TargetBounds target_bounds;
CalculateTargetBounds(state_, &target_bounds);
- UpdateBoundsAndOpacity(target_bounds, false, NULL);
-
- if (shelf_->launcher()) {
- // This is not part of UpdateBoundsAndOpacity() because
- // SetLauncherViewBounds() sets the bounds immediately and does not animate.
- // The height of the LauncherView for a horizontal shelf and the width of
- // the LauncherView for a vertical shelf are set when |shelf_|'s bounds
- // are changed via UpdateBoundsAndOpacity(). This sets the origin and the
- // dimension in the other direction.
+ GetLayer(shelf_)->SetOpacity(target_bounds.opacity);
+ shelf_->SetWidgetBounds(
+ ScreenAsh::ConvertRectToScreen(
+ shelf_->GetNativeView()->parent(),
+ target_bounds.shelf_bounds_in_root));
+ if (shelf_->launcher())
shelf_->launcher()->SetLauncherViewBounds(
target_bounds.launcher_bounds_in_shelf);
- }
+ GetLayer(shelf_->status_area_widget())->SetOpacity(
+ target_bounds.status_opacity);
+ // TODO(harrym): Once status area widget is a child view of shelf
+ // this can be simplified.
+ gfx::Rect status_bounds = target_bounds.status_bounds_in_shelf;
+ status_bounds.set_x(status_bounds.x() +
+ target_bounds.shelf_bounds_in_root.x());
+ status_bounds.set_y(status_bounds.y() +
+ target_bounds.shelf_bounds_in_root.y());
+ shelf_->status_area_widget()->SetBounds(
+ ScreenAsh::ConvertRectToScreen(
+ shelf_->status_area_widget()->GetNativeView()->parent(),
+ status_bounds));
+ Shell::GetInstance()->SetDisplayWorkAreaInsets(
+ root_window_, target_bounds.work_area_insets);
+ UpdateHitTestBounds();
}
ShelfVisibilityState ShelfLayoutManager::CalculateShelfVisibility() {
@@ -467,12 +481,17 @@ void ShelfLayoutManager::CompleteGestureDrag(const ui::GestureEvent& gesture) {
else
UpdateVisibilityState();
gesture_drag_status_ = GESTURE_DRAG_NONE;
+ LayoutShelf();
}
void ShelfLayoutManager::CancelGestureDrag() {
- gesture_drag_status_ = GESTURE_DRAG_CANCEL_IN_PROGRESS;
- UpdateVisibilityState();
gesture_drag_status_ = GESTURE_DRAG_NONE;
+ ui::ScopedLayerAnimationSettings
+ launcher_settings(GetLayer(shelf_)->GetAnimator()),
+ status_settings(GetLayer(shelf_->status_area_widget())->GetAnimator());
+ LayoutShelf();
+ UpdateVisibilityState();
+ UpdateShelfBackground(BackgroundAnimator::CHANGE_ANIMATE);
}
////////////////////////////////////////////////////////////////////////////////
@@ -500,7 +519,7 @@ void ShelfLayoutManager::SetChildBounds(aura::Window* child,
SetChildBoundsDirect(child, requested_bounds);
// We may contain other widgets (such as frame maximize bubble) but they don't
// effect the layout in anyway.
- if (!updating_bounds_ &&
+ if (!in_layout_ &&
((shelf_->GetNativeView() == child) ||
(shelf_->status_area_widget()->GetNativeView() == child))) {
LayoutShelf();
@@ -557,13 +576,7 @@ void ShelfLayoutManager::SetState(ShelfVisibilityState visibility_state) {
state.window_state = workspace_controller_ ?
workspace_controller_->GetWindowState() : WORKSPACE_WINDOW_STATE_DEFAULT;
- // Force an update because gesture drags affect the shelf bounds and we
- // should animate back to the normal bounds at the end of a gesture.
- bool force_update =
- (gesture_drag_status_ == GESTURE_DRAG_CANCEL_IN_PROGRESS ||
- gesture_drag_status_ == GESTURE_DRAG_COMPLETE_IN_PROGRESS);
-
- if (!force_update && state_.Equals(state))
+ if (state_.Equals(state))
return; // Nothing changed.
FOR_EACH_OBSERVER(ShelfLayoutManagerObserver, observers_,
@@ -582,6 +595,26 @@ void ShelfLayoutManager::SetState(ShelfVisibilityState visibility_state) {
State old_state = state_;
state_ = state;
+ TargetBounds target_bounds;
+ CalculateTargetBounds(state_, &target_bounds);
+
+ ui::ScopedLayerAnimationSettings launcher_animation_setter(
+ GetLayer(shelf_)->GetAnimator());
+ launcher_animation_setter.SetTransitionDuration(
+ base::TimeDelta::FromMilliseconds(kCrossFadeDurationMS));
+ launcher_animation_setter.SetTweenType(ui::Tween::EASE_OUT);
+ launcher_animation_setter.SetPreemptionStrategy(
+ ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
+ GetLayer(shelf_)->SetBounds(
+ target_bounds.shelf_bounds_in_root);
+ GetLayer(shelf_)->SetOpacity(target_bounds.opacity);
+ ui::ScopedLayerAnimationSettings status_animation_setter(
+ GetLayer(shelf_->status_area_widget())->GetAnimator());
+ status_animation_setter.SetTransitionDuration(
+ base::TimeDelta::FromMilliseconds(kCrossFadeDurationMS));
+ status_animation_setter.SetTweenType(ui::Tween::EASE_OUT);
+ status_animation_setter.SetPreemptionStrategy(
+ ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
BackgroundAnimator::ChangeType change_type =
BackgroundAnimator::CHANGE_ANIMATE;
@@ -611,6 +644,7 @@ void ShelfLayoutManager::SetState(ShelfVisibilityState visibility_state) {
update_shelf_observer_->Detach();
// UpdateShelfBackground deletes itself when the animation is done.
update_shelf_observer_ = new UpdateShelfObserver(this);
+ status_animation_setter.AddObserver(update_shelf_observer_);
} else {
UpdateShelfBackground(change_type);
}
@@ -619,10 +653,18 @@ void ShelfLayoutManager::SetState(ShelfVisibilityState visibility_state) {
state.visibility_state == SHELF_VISIBLE &&
state.window_state == WORKSPACE_WINDOW_STATE_MAXIMIZED);
- TargetBounds target_bounds;
- CalculateTargetBounds(state_, &target_bounds);
- UpdateBoundsAndOpacity(target_bounds, true,
- delay_background_change ? update_shelf_observer_ : NULL);
+ ui::Layer* layer = GetLayer(shelf_->status_area_widget());
+ // TODO(harrym): Remove when status_area is view (crbug.com/180422).
+ gfx::Rect status_bounds = target_bounds.status_bounds_in_shelf;
+ status_bounds.set_x(status_bounds.x() +
+ target_bounds.shelf_bounds_in_root.x());
+ status_bounds.set_y(status_bounds.y() +
+ target_bounds.shelf_bounds_in_root.y());
+ layer->SetBounds(status_bounds);
+ layer->SetOpacity(target_bounds.status_opacity);
+ Shell::GetInstance()->SetDisplayWorkAreaInsets(
+ root_window_, target_bounds.work_area_insets);
+ UpdateHitTestBounds();
// OnAutoHideStateChanged Should be emitted when:
// - firstly state changed to auto-hide from other state
@@ -635,58 +677,6 @@ void ShelfLayoutManager::SetState(ShelfVisibilityState visibility_state) {
}
}
-void ShelfLayoutManager::UpdateBoundsAndOpacity(
- const TargetBounds& target_bounds,
- bool animate,
- ui::ImplicitAnimationObserver* observer) {
- base::AutoReset<bool> auto_reset_updating_bounds(&updating_bounds_, true);
-
- ui::ScopedLayerAnimationSettings launcher_animation_setter(
- GetLayer(shelf_)->GetAnimator());
- ui::ScopedLayerAnimationSettings status_animation_setter(
- GetLayer(shelf_->status_area_widget())->GetAnimator());
- if (animate) {
- launcher_animation_setter.SetTransitionDuration(
- base::TimeDelta::FromMilliseconds(kCrossFadeDurationMS));
- launcher_animation_setter.SetTweenType(ui::Tween::EASE_OUT);
- launcher_animation_setter.SetPreemptionStrategy(
- ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
- status_animation_setter.SetTransitionDuration(
- base::TimeDelta::FromMilliseconds(kCrossFadeDurationMS));
- status_animation_setter.SetTweenType(ui::Tween::EASE_OUT);
- status_animation_setter.SetPreemptionStrategy(
- ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
- } else {
- StopAnimating();
- launcher_animation_setter.SetTransitionDuration(base::TimeDelta());
- status_animation_setter.SetTransitionDuration(base::TimeDelta());
- }
- if (observer)
- status_animation_setter.AddObserver(observer);
-
- GetLayer(shelf_)->SetOpacity(target_bounds.opacity);
- shelf_->SetBounds(ScreenAsh::ConvertRectToScreen(
- shelf_->GetNativeView()->parent(),
- target_bounds.shelf_bounds_in_root));
-
- GetLayer(shelf_->status_area_widget())->SetOpacity(
- target_bounds.status_opacity);
- // TODO(harrym): Once status area widget is a child view of shelf
- // this can be simplified.
- gfx::Rect status_bounds = target_bounds.status_bounds_in_shelf;
- status_bounds.set_x(status_bounds.x() +
- target_bounds.shelf_bounds_in_root.x());
- status_bounds.set_y(status_bounds.y() +
- target_bounds.shelf_bounds_in_root.y());
- shelf_->status_area_widget()->SetBounds(
- ScreenAsh::ConvertRectToScreen(
- shelf_->status_area_widget()->GetNativeView()->parent(),
- status_bounds));
- Shell::GetInstance()->SetDisplayWorkAreaInsets(
- root_window_, target_bounds.work_area_insets);
- UpdateHitTestBounds();
-}
-
void ShelfLayoutManager::StopAnimating() {
GetLayer(shelf_)->GetAnimator()->StopAnimating();
GetLayer(shelf_->status_area_widget())->GetAnimator()->StopAnimating();
diff --git a/chromium/ash/shelf/shelf_layout_manager.h b/chromium/ash/shelf/shelf_layout_manager.h
index 56d7032f3db..467fe1a7424 100644
--- a/chromium/ash/shelf/shelf_layout_manager.h
+++ b/chromium/ash/shelf/shelf_layout_manager.h
@@ -33,15 +33,12 @@ class RootWindow;
namespace ui {
class GestureEvent;
-class ImplicitAnimationObserver;
}
namespace ash {
class ScreenAsh;
class ShelfLayoutManagerObserver;
class ShelfWidget;
-FORWARD_DECLARE_TEST(WebNotificationTrayTest, PopupAndFullscreen);
-
namespace internal {
class PanelLayoutManagerTest;
@@ -101,7 +98,7 @@ class ASH_EXPORT ShelfLayoutManager :
workspace_controller_ = controller;
}
- bool updating_bounds() const { return updating_bounds_; }
+ bool in_layout() const { return in_layout_; }
// Clears internal data for shutdown process.
void PrepareForShutdown();
@@ -214,7 +211,6 @@ class ASH_EXPORT ShelfLayoutManager :
friend class ash::ScreenAsh;
friend class PanelLayoutManagerTest;
friend class ShelfLayoutManagerTest;
- FRIEND_TEST_ALL_PREFIXES(ash::WebNotificationTrayTest, PopupAndFullscreen);
struct TargetBounds {
TargetBounds();
@@ -255,13 +251,6 @@ class ASH_EXPORT ShelfLayoutManager :
// Sets the visibility of the shelf to |state|.
void SetState(ShelfVisibilityState visibility_state);
- // Updates the bounds and opacity of the launcher and status widgets.
- // If |observer| is specified, it will be called back when the animations, if
- // any, are complete.
- void UpdateBoundsAndOpacity(const TargetBounds& target_bounds,
- bool animate,
- ui::ImplicitAnimationObserver* observer);
-
// Stops any animations and progresses them to the end.
void StopAnimating();
@@ -330,9 +319,9 @@ class ASH_EXPORT ShelfLayoutManager :
// deleted too.
aura::RootWindow* root_window_;
- // True when inside UpdateBoundsAndOpacity() method. Used to prevent calling
- // UpdateBoundsAndOpacity() again from SetChildBounds().
- bool updating_bounds_;
+ // True when inside LayoutShelf method. Used to prevent calling LayoutShelf
+ // again from SetChildBounds().
+ bool in_layout_;
// See description above setter.
ShelfAutoHideBehavior auto_hide_behavior_;
@@ -371,7 +360,6 @@ class ASH_EXPORT ShelfLayoutManager :
enum GestureDragStatus {
GESTURE_DRAG_NONE,
GESTURE_DRAG_IN_PROGRESS,
- GESTURE_DRAG_CANCEL_IN_PROGRESS,
GESTURE_DRAG_COMPLETE_IN_PROGRESS
};
GestureDragStatus gesture_drag_status_;
diff --git a/chromium/ash/shelf/shelf_layout_manager_unittest.cc b/chromium/ash/shelf/shelf_layout_manager_unittest.cc
index e44fe347a68..e62bcec4f37 100644
--- a/chromium/ash/shelf/shelf_layout_manager_unittest.cc
+++ b/chromium/ash/shelf/shelf_layout_manager_unittest.cc
@@ -70,66 +70,6 @@ SystemTray* GetSystemTray() {
return Shell::GetPrimaryRootWindowController()->GetSystemTray();
}
-// Class which waits till the shelf finishes animating to the target size and
-// counts the number of animation steps.
-class ShelfAnimationWaiter : views::WidgetObserver {
- public:
- explicit ShelfAnimationWaiter(const gfx::Rect& target_bounds)
- : target_bounds_(target_bounds),
- animation_steps_(0),
- done_waiting_(false) {
- GetShelfWidget()->AddObserver(this);
- }
-
- virtual ~ShelfAnimationWaiter() {
- GetShelfWidget()->RemoveObserver(this);
- }
-
- // Wait till the shelf finishes animating to its expected bounds.
- void WaitTillDoneAnimating() {
- if (IsDoneAnimating())
- done_waiting_ = true;
- else
- base::MessageLoop::current()->Run();
- }
-
- // Returns true if the animation has completed and it was valid.
- bool WasValidAnimation() const {
- return done_waiting_ && animation_steps_ > 0;
- }
-
- private:
- // Returns true if shelf has finished animating to the target size.
- bool IsDoneAnimating() const {
- ShelfLayoutManager* layout_manager = GetShelfLayoutManager();
- gfx::Rect current_bounds = GetShelfWidget()->GetWindowBoundsInScreen();
- int size = layout_manager->PrimaryAxisValue(current_bounds.height(),
- current_bounds.width());
- int desired_size = layout_manager->PrimaryAxisValue(target_bounds_.height(),
- target_bounds_.width());
- return (size == desired_size);
- }
-
- // views::WidgetObserver override.
- virtual void OnWidgetBoundsChanged(views::Widget* widget,
- const gfx::Rect& new_bounds) OVERRIDE {
- if (done_waiting_)
- return;
-
- ++animation_steps_;
- if (IsDoneAnimating()) {
- done_waiting_ = true;
- base::MessageLoop::current()->Quit();
- }
- }
-
- gfx::Rect target_bounds_;
- int animation_steps_;
- bool done_waiting_;
-
- DISALLOW_COPY_AND_ASSIGN(ShelfAnimationWaiter);
-};
-
class ShelfDragCallback {
public:
ShelfDragCallback(const gfx::Rect& not_visible, const gfx::Rect& visible)
@@ -1489,7 +1429,7 @@ TEST_F(ShelfLayoutManagerTest, WindowVisibilityDisablesAutoHide) {
window1->Minimize();
EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
- // both minimized => disable auto hide
+ // both minimzed => disable auto hide
window2->Minimize();
EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
@@ -1504,84 +1444,14 @@ TEST_F(ShelfLayoutManagerTest, WindowVisibilityDisablesAutoHide) {
EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
}
-// Test that the shelf animates back to its normal position upon a user
-// completing a gesture drag.
-TEST_F(ShelfLayoutManagerTest, ShelfAnimatesWhenGestureComplete) {
- if (!SupportsHostWindowResize())
- return;
-
- // Test the shelf animates back to its original visible bounds when it is
- // dragged when there are no visible windows.
- ShelfLayoutManager* shelf = GetShelfLayoutManager();
- shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
- EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
- EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
- gfx::Rect visible_bounds = GetShelfWidget()->GetWindowBoundsInScreen();
- {
- // Enable animations so that we can make sure that they occur.
- ui::ScopedAnimationDurationScaleMode regular_animations(
- ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
-
- aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
- gfx::Rect shelf_bounds_in_screen =
- GetShelfWidget()->GetWindowBoundsInScreen();
- gfx::Point start(shelf_bounds_in_screen.CenterPoint());
- gfx::Point end(start.x(), shelf_bounds_in_screen.bottom());
- generator.GestureScrollSequence(start, end,
- base::TimeDelta::FromMilliseconds(10), 1);
- EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
- EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
-
- ShelfAnimationWaiter waiter(visible_bounds);
- // Wait till the animation completes and check that it occurred.
- waiter.WaitTillDoneAnimating();
- EXPECT_TRUE(waiter.WasValidAnimation());
- }
-
- // Create a visible window so auto-hide behavior is enforced.
- CreateTestWidget();
-
- // Get the bounds of the shelf when it is hidden.
- EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
- EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
- gfx::Rect auto_hidden_bounds = GetShelfWidget()->GetWindowBoundsInScreen();
-
- {
- // Enable the animations so that we can make sure they do occur.
- ui::ScopedAnimationDurationScaleMode regular_animations(
- ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
-
- gfx::Point start =
- GetShelfWidget()->GetWindowBoundsInScreen().CenterPoint();
- gfx::Point end(start.x(), start.y() - 100);
- aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
-
- // Test that the shelf animates to the visible bounds after a swipe up on
- // the auto hidden shelf.
- generator.GestureScrollSequence(start, end,
- base::TimeDelta::FromMilliseconds(10), 1);
- EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
- ShelfAnimationWaiter waiter1(visible_bounds);
- waiter1.WaitTillDoneAnimating();
- EXPECT_TRUE(waiter1.WasValidAnimation());
-
- // Test that the shelf animates to the auto hidden bounds after a swipe up
- // on the visible shelf.
- EXPECT_EQ(SHELF_VISIBLE, shelf->visibility_state());
- generator.GestureScrollSequence(start, end,
- base::TimeDelta::FromMilliseconds(10), 1);
- EXPECT_EQ(SHELF_AUTO_HIDE, shelf->visibility_state());
- EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
- ShelfAnimationWaiter waiter2(auto_hidden_bounds);
- waiter2.WaitTillDoneAnimating();
- EXPECT_TRUE(waiter2.WasValidAnimation());
- }
-}
-
-TEST_F(ShelfLayoutManagerTest, GestureRevealsTrayBubble) {
- if (!SupportsHostWindowResize())
- return;
+#if defined(OS_WIN)
+// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
+#define MAYBE_GestureRevealsTrayBubble DISABLED_GestureRevealsTrayBubble
+#else
+#define MAYBE_GestureRevealsTrayBubble GestureRevealsTrayBubble
+#endif
+TEST_F(ShelfLayoutManagerTest, MAYBE_GestureRevealsTrayBubble) {
ShelfLayoutManager* shelf = GetShelfLayoutManager();
shelf->LayoutShelf();
diff --git a/chromium/ash/shelf/shelf_widget.cc b/chromium/ash/shelf/shelf_widget.cc
index 8c7733ff2d6..d16f876bcd3 100644
--- a/chromium/ash/shelf/shelf_widget.cc
+++ b/chromium/ash/shelf/shelf_widget.cc
@@ -4,7 +4,6 @@
#include "ash/shelf/shelf_widget.h"
-#include "ash/ash_switches.h"
#include "ash/focus_cycler.h"
#include "ash/launcher/launcher_delegate.h"
#include "ash/launcher/launcher_model.h"
@@ -16,7 +15,6 @@
#include "ash/shelf/shelf_widget.h"
#include "ash/shell.h"
#include "ash/shell_window_ids.h"
-#include "ash/system/tray/test_system_tray_delegate.h"
#include "ash/wm/property_util.h"
#include "ash/wm/status_area_layout_manager.h"
#include "ash/wm/window_properties.h"
@@ -256,6 +254,9 @@ class ShelfWidget::DelegateView : public views::WidgetDelegate,
void SetDimmed(bool dimmed);
bool GetDimmed() const;
+ // Set the bounds of the widget.
+ void SetWidgetBounds(const gfx::Rect bounds);
+
void SetParentLayer(ui::Layer* layer);
// views::View overrides:
@@ -358,6 +359,11 @@ bool ShelfWidget::DelegateView::GetDimmed() const {
return dimmer_.get() && dimmer_->IsVisible();
}
+void ShelfWidget::DelegateView::SetWidgetBounds(const gfx::Rect bounds) {
+ if (dimmer_)
+ dimmer_->SetBounds(bounds);
+}
+
void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) {
layer->Add(&opaque_background_);
ReorderLayers();
@@ -424,8 +430,6 @@ void ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) {
void ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) {
opaque_background_.SetBounds(GetLocalBounds());
- if (dimmer_)
- dimmer_->SetBounds(GetBoundsInScreen());
}
void ShelfWidget::DelegateView::ForceUndimming(bool force) {
@@ -524,31 +528,6 @@ ShelfBackgroundType ShelfWidget::GetBackgroundType() const {
return SHELF_BACKGROUND_DEFAULT;
}
-// static
-bool ShelfWidget::ShelfAlignmentAllowed() {
- if (!ash::switches::ShowShelfAlignmentMenu())
- return false;
- user::LoginStatus login_status =
- Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus();
-
- switch (login_status) {
- case user::LOGGED_IN_USER:
- case user::LOGGED_IN_OWNER:
- return true;
- case user::LOGGED_IN_LOCKED:
- case user::LOGGED_IN_PUBLIC:
- case user::LOGGED_IN_LOCALLY_MANAGED:
- case user::LOGGED_IN_GUEST:
- case user::LOGGED_IN_RETAIL_MODE:
- case user::LOGGED_IN_KIOSK_APP:
- case user::LOGGED_IN_NONE:
- return false;
- }
-
- DCHECK(false);
- return false;
-}
-
ShelfAlignment ShelfWidget::GetAlignment() const {
return shelf_layout_manager_->GetAlignment();
}
@@ -623,6 +602,11 @@ void ShelfWidget::ShutdownStatusAreaWidget() {
status_area_widget_ = NULL;
}
+void ShelfWidget::SetWidgetBounds(const gfx::Rect& rect) {
+ Widget::SetBounds(rect);
+ delegate_view_->SetWidgetBounds(rect);
+}
+
void ShelfWidget::ForceUndimming(bool force) {
delegate_view_->ForceUndimming(force);
}
diff --git a/chromium/ash/shelf/shelf_widget.h b/chromium/ash/shelf/shelf_widget.h
index c7adb742555..392264ab4c2 100644
--- a/chromium/ash/shelf/shelf_widget.h
+++ b/chromium/ash/shelf/shelf_widget.h
@@ -34,11 +34,6 @@ class ASH_EXPORT ShelfWidget : public views::Widget,
internal::WorkspaceController* workspace_controller);
virtual ~ShelfWidget();
- // Returns if shelf alignment option is enabled, and the user is able
- // to adjust the alignment (guest and supervised mode users cannot for
- // example).
- static bool ShelfAlignmentAllowed();
-
void SetAlignment(ShelfAlignment alignmnet);
ShelfAlignment GetAlignment() const;
@@ -79,6 +74,9 @@ class ASH_EXPORT ShelfWidget : public views::Widget,
// TODO(harrym): Remove when Status Area Widget is a child view.
void ShutdownStatusAreaWidget();
+ // Set the bounds of the widget and the dim shelf overlay.
+ void SetWidgetBounds(const gfx::Rect& rect);
+
// Force the shelf to be presented in an undimmed state.
void ForceUndimming(bool force);
diff --git a/chromium/ash/shell.cc b/chromium/ash/shell.cc
index 996c817213c..57e73c56bb0 100644
--- a/chromium/ash/shell.cc
+++ b/chromium/ash/shell.cc
@@ -283,6 +283,9 @@ Shell::~Shell() {
locale_notification_controller_.reset();
+ // Drag-and-drop must be canceled prior to close all windows.
+ drag_drop_controller_.reset();
+
// Destroy all child windows including widgets.
display_controller_->CloseChildWindows();
@@ -293,7 +296,6 @@ Shell::~Shell() {
// These need a valid Shell instance to clean up properly, so explicitly
// delete them before invalidating the instance.
// Alphabetical. TODO(oshima): sort.
- drag_drop_controller_.reset();
magnification_controller_.reset();
partial_magnification_controller_.reset();
resize_shadow_controller_.reset();
diff --git a/chromium/ash/shell/shell_delegate_impl.cc b/chromium/ash/shell/shell_delegate_impl.cc
index 471f5acbb50..20d0a7f65f6 100644
--- a/chromium/ash/shell/shell_delegate_impl.cc
+++ b/chromium/ash/shell/shell_delegate_impl.cc
@@ -8,7 +8,6 @@
#include "ash/caps_lock_delegate_stub.h"
#include "ash/host/root_window_host_factory.h"
-#include "ash/keyboard_controller_proxy_stub.h"
#include "ash/session_state_delegate.h"
#include "ash/session_state_delegate_stub.h"
#include "ash/shell/context_menu.h"
@@ -19,9 +18,39 @@
#include "ash/wm/window_util.h"
#include "base/message_loop/message_loop.h"
#include "ui/aura/window.h"
+#include "ui/keyboard/keyboard_controller_proxy.h"
#include "ui/views/corewm/input_method_event_filter.h"
namespace ash {
+
+namespace {
+
+class DummyKeyboardControllerProxy : public keyboard::KeyboardControllerProxy {
+ public:
+ DummyKeyboardControllerProxy() {}
+ virtual ~DummyKeyboardControllerProxy() {}
+
+ private:
+ // Overridden from keyboard::KeyboardControllerProxy:
+ virtual content::BrowserContext* GetBrowserContext() OVERRIDE {
+ return Shell::GetInstance()->browser_context();
+ }
+
+ virtual ui::InputMethod* GetInputMethod() OVERRIDE {
+ return Shell::GetInstance()->input_method_filter()->input_method();
+ }
+
+ virtual void RequestAudioInput(content::WebContents* web_contents,
+ const content::MediaStreamRequest& request,
+ const content::MediaResponseCallback& callback) OVERRIDE {
+ return;
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(DummyKeyboardControllerProxy);
+};
+
+} // namespace
+
namespace shell {
ShellDelegateImpl::ShellDelegateImpl()
@@ -99,7 +128,7 @@ void ShellDelegateImpl::ShowKeyboardOverlay() {
keyboard::KeyboardControllerProxy*
ShellDelegateImpl::CreateKeyboardControllerProxy() {
- return new KeyboardControllerProxyStub();
+ return new DummyKeyboardControllerProxy();
}
void ShellDelegateImpl::ShowTaskManager() {
diff --git a/chromium/ash/shell_window_ids.h b/chromium/ash/shell_window_ids.h
index 1c1c396cbbc..406f417f4cf 100644
--- a/chromium/ash/shell_window_ids.h
+++ b/chromium/ash/shell_window_ids.h
@@ -36,68 +36,65 @@ const int kShellWindowId_UnparentedControlContainer = 3;
// The desktop background window.
const int kShellWindowId_DesktopBackgroundContainer = 4;
-// The virtual keyboard container.
-const int kShellWindowId_VirtualKeyboardContainer = 5;
-
// TODO(sky): rename kShellWindowId_DefaultContainer.
// The container for standard top-level windows.
-const int kShellWindowId_DefaultContainer = 6;
+const int kShellWindowId_DefaultContainer = 5;
// The container for top-level windows with the 'always-on-top' flag set.
-const int kShellWindowId_AlwaysOnTopContainer = 7;
+const int kShellWindowId_AlwaysOnTopContainer = 6;
// The container for windows docked to either side of the desktop.
-const int kShellWindowId_DockedContainer = 8;
+const int kShellWindowId_DockedContainer = 7;
// The container for panel windows.
-const int kShellWindowId_PanelContainer = 9;
+const int kShellWindowId_PanelContainer = 8;
// The container for the shelf.
-const int kShellWindowId_ShelfContainer = 10;
+const int kShellWindowId_ShelfContainer = 9;
// The container for the app list.
-const int kShellWindowId_AppListContainer = 11;
+const int kShellWindowId_AppListContainer = 10;
// The container for user-specific modal windows.
-const int kShellWindowId_SystemModalContainer = 12;
+const int kShellWindowId_SystemModalContainer = 11;
// The container for input method components such like candidate windows. They
// are almost panels but have no activations/focus, and they should appear over
// the AppList and SystemModal dialogs.
-const int kShellWindowId_InputMethodContainer = 13;
+const int kShellWindowId_InputMethodContainer = 12;
// The container for the lock screen background.
-const int kShellWindowId_LockScreenBackgroundContainer = 14;
+const int kShellWindowId_LockScreenBackgroundContainer = 13;
// The container for the lock screen.
-const int kShellWindowId_LockScreenContainer = 15;
+const int kShellWindowId_LockScreenContainer = 14;
// The container for the lock screen modal windows.
-const int kShellWindowId_LockSystemModalContainer = 16;
+const int kShellWindowId_LockSystemModalContainer = 15;
// The container for the status area.
-const int kShellWindowId_StatusContainer = 17;
+const int kShellWindowId_StatusContainer = 16;
// The container for menus.
-const int kShellWindowId_MenuContainer = 18;
+const int kShellWindowId_MenuContainer = 17;
// The container for drag/drop images and tooltips.
-const int kShellWindowId_DragImageAndTooltipContainer = 19;
+const int kShellWindowId_DragImageAndTooltipContainer = 18;
// The container for bubbles briefly overlaid onscreen to show settings changes
// (volume, brightness, etc.).
-const int kShellWindowId_SettingBubbleContainer = 20;
+const int kShellWindowId_SettingBubbleContainer = 19;
// The container for special components overlaid onscreen, such as the
// region selector for partial screenshots.
-const int kShellWindowId_OverlayContainer = 21;
+const int kShellWindowId_OverlayContainer = 20;
// ID of the window created by PhantomWindowController or DragWindowController.
-const int kShellWindowId_PhantomWindow = 22;
+const int kShellWindowId_PhantomWindow = 21;
// The topmost container, used for power off animation.
-const int kShellWindowId_PowerButtonAnimationContainer = 23;
+const int kShellWindowId_PowerButtonAnimationContainer = 22;
} // namespace internal
diff --git a/chromium/ash/strings/ash_strings_am.xtb b/chromium/ash/strings/ash_strings_am.xtb
index b0c6c3803be..13c5bb4bde9 100644
--- a/chromium/ash/strings/ash_strings_am.xtb
+++ b/chromium/ash/strings/ash_strings_am.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="am">
<translation id="3595596368722241419">ባትሪ ሙሉ ነው</translation>
-<translation id="5250713215130379958">አስጀማሪን ራስ-ደብቅ</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> እና <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">የመተላለፊያ ሁኔታ</translation>
<translation id="30155388420722288">የትርፍ ፍሰት አዝራር</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">ብሉቱዝ ነቅቷል</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> ወደ <ph name="ROTATION"/> ዞሯል</translation>
<translation id="9074739597929991885">ብሉቱዝ</translation>
<translation id="2268130516524549846">ብሉቱዝ ተሰናክሏል</translation>
+<translation id="7165320105431587207">አውታረ መረቡን ማዋቀር አልተሳካም</translation>
<translation id="3775358506042162758">በአንድ ጊዜ ብዙ መግባት ላይ እስከ ሶስት መለያዎች ድረስ ብቻ ነው ሊኖርዎ የሚችለው።</translation>
<translation id="370649949373421643">Wi-Fi ያንቁ</translation>
<translation id="3626281679859535460">ብሩህነት</translation>
+<translation id="595202126637698455">አፈጻጸም መከታተያ ነቅቷል</translation>
<translation id="8054466585765276473">የባትሪ ጊዜን በማስላት ላይ።</translation>
<translation id="7982789257301363584">አውታረ መረብ</translation>
<translation id="5565793151875479467">ተኪ...</translation>
<translation id="938582441709398163">የቁልፍ ሰሌዳ ተደራቢ</translation>
<translation id="4387004326333427325">የማረጋገጫ ምስክር ወረቀት በርቀት ተቀባይነት አላገኘም</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> ጥራት ወደ <ph name="RESOLUTION"/> ተለውጧል</translation>
<translation id="6943836128787782965">ኤች ቲ ቲ ፒ ማግኘት አልተሳካም</translation>
<translation id="2297568595583585744">የሁኔታ መሳቢያ</translation>
<translation id="1661867754829461514">ፒን ይጎድላል</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">አነስተኛ ኃይል ያለው ባትሪ መሙያ</translation>
<translation id="3846575436967432996">ምንም የአውታረ መረብ መረጃ አይገኝም</translation>
<translation id="3026237328237090306">የተንቀሳቃሽ ስልክ ውሂብ ያዋቅሩ</translation>
+<translation id="5871632337994001636">መሳሪያዎችን ያስተዳድሩ...</translation>
<translation id="785750925697875037">የተንቀሳቃሽ መለያ ይመልከቱ</translation>
<translation id="153454903766751181">ተንቀሳቃሽ ሞደምን በማስጀመር ላይ...</translation>
<translation id="4628814525959230255">የማያ ገጽዎ ቁጥጥር በHangouts በኩል ለ<ph name="HELPER_NAME"/> በማጋራት ላይ።</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> ዞሯል</translation>
<translation id="7864539943188674973">ብሉቱዝን ያሰናክሉ</translation>
<translation id="939252827960237676">ቅጽበታዊ ገጽ እይታን ማስቀመጥ አልተቻለም</translation>
<translation id="3126069444801937830">ለማዘመን ዳግም ያስጀምሩ</translation>
<translation id="2268813581635650749">ሁሉንም ዘግተህ ውጣ</translation>
<translation id="735745346212279324">የቪ ፒ ኤን ግንኙነት ተቋርጧል</translation>
<translation id="7320906967354320621">ስራ ፈት</translation>
-<translation id="6303423059719347535">ባትሪ <ph name="PERCENTAGE"/>% ሙሉ ነው</translation>
<translation id="15373452373711364">ትልቅ የመዳፊት ጠቋሚ</translation>
-<translation id="2778346081696727092">በተሰጠው የተጠቃሚ ስም ወይም ይለፍ ቃል ማረጋገጥ አልተቻለም</translation>
<translation id="3294437725009624529">እንግዳ</translation>
<translation id="8190698733819146287">ቋንቋዎችን እና ግብአቶችን አብጅ...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">የመደርደሪያ አቀማመጥ</translation>
<translation id="2903907270192926896">ግብዓት</translation>
<translation id="8676770494376880701">አነስተኛ ኃይል ያለው ባትሪ መሙያ ተገናኝቷል</translation>
<translation id="7170041865419449892">ከክልል ውጪ</translation>
<translation id="4804818685124855865">ግንኙነት አቋርጥ</translation>
<translation id="2544853746127077729">የማረጋገጫ ምስክር ወረቀት በአውታረ መረቡ ተቀባይነት አላገኘም</translation>
<translation id="5222676887888702881">ዘግተህ ውጣ</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">ውቅር</translation>
<translation id="1272079795634619415">አቁም</translation>
<translation id="4957722034734105353">ተጨማሪ ለመረዳት...</translation>
<translation id="2964193600955408481">Wi-Fiን አሰናክል</translation>
-<translation id="811680302244032017">መሣሪያ ያክሉ...</translation>
<translation id="4279490309300973883">በማንጸባረቅ ላይ</translation>
+<translation id="7973962044839454485">PPP ማረጋገጫ በተሳሳተ የተጠቃሚ ስም ወይም የይለፍ ቃል ምክንያት አልተሳካም</translation>
<translation id="2509468283778169019">CAPS LOCK በርቷል</translation>
<translation id="3892641579809465218">የውስጥ ማሳያ</translation>
<translation id="7823564328645135659">ቅንብሮችዎ ከተመሳሰሉ በኋላ ቋንቋው ከ«<ph name="FROM_LOCALE"/> ወደ «<ph name="TO_LOCALE"/>» ተቀይሯል።</translation>
<translation id="3368922792935385530">ተያይዟል</translation>
<translation id="8340999562596018839">የተነገረ ግብረ መልስ</translation>
<translation id="8654520615680304441">Wi-Fi አብራ...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">የግቤት ስልትዎ ወደ <ph name="INPUT_METHOD_ID"/> ተቀይሯል።
ለመቀየር Shift + Alt ይጫኑ።</translation>
<translation id="2562916301614567480">የግል አውታረ መረብ</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% ይቀራል</translation>
<translation id="9089416786594320554">የግቤት ስልቶች</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">መደርደሪያ</translation>
<translation id="2614835198358683673">የእርስዎ Chromebook በርቶ ሳለ ባትሪ ላይሞላ ይችላል። ዋናውን ባትሪ መሙያ መጠቀሙን ያስቡበት።</translation>
<translation id="1895658205118569222">አጥፋ</translation>
<translation id="4430019312045809116">ድምፅ</translation>
+<translation id="8681498213689260554">ለማዘመን ዳግም ያስጀምሩና በሃይል ይጠቡ</translation>
<translation id="4442424173763614572">የዲ ኤን ኤስ ፍለጋ አልተሳካም</translation>
-<translation id="6356500677799115505">ባትሪ ሙሉ እና ኃይል እየሞላ ነው።</translation>
<translation id="7874779702599364982">የድምጸ ተያያዥ ሞደም አውታረ መረቦችን በመፈለግ ላይ...</translation>
<translation id="583281660410589416">ያልታወቀ</translation>
<translation id="1383876407941801731">ፍለጋ</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">የአውታረ መረብ መረጃ</translation>
<translation id="1621499497873603021">ባትሪ ባዶ እስኪሆን ድረስ የቀረው ጊዜ፣ <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">ከእንግዳ ውጣ</translation>
-<translation id="4471417012762451363">ባትሪ <ph name="PERCENTAGE"/>% ሙሉ እና ኃይል እየሞላ ነው</translation>
<translation id="8308637677604853869">ቀዳሚ ምናሌ</translation>
<translation id="4666297444214622512">ወደ ሌላ መለያ መግባት አይቻልም።</translation>
<translation id="1346748346194534595">ቀኝ</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">ያልታወቀ የአውታረ መረብ ስህተት</translation>
<translation id="1467432559032391204">ግራ</translation>
<translation id="5543001071567407895">ኤስ ኤም ኤስ</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/>ን በማግበር ላይ</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">አስፋ</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">አነስተኛ ኃይል ወዳለው ባትሪ መሙያ ተሰክቷል። የባትሪ መሙላት አስተማማኝ ላይሆን ይችላል።</translation>
<translation id="3784455785234192852">ቆልፍ</translation>
<translation id="2805756323405976993">መተግበሪያዎች</translation>
-<translation id="8871072142849158571">የ<ph name="DISPLAY_NAME"/> መጠን ወደ <ph name="RESOLUTION"/> ተቀይሯል</translation>
<translation id="1512064327686280138">የማግበር አለመሳካት</translation>
<translation id="5097002363526479830">ከአውታረ መረብ «<ph name="NAME"/>» ጋር መገናኘት አልተሳካም፦ <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi ጠፍቷል።</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">ልጣፍ አዘጋጅ...</translation>
<translation id="8678698760965522072">የመስመር ላይ ሁኔታ</translation>
<translation id="2532589005999780174">ባለከፍተኛ ንፅፅር ሁነታ</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>፣ <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">ውስጣዊ ስህተት</translation>
<translation id="3019353588588144572">ባትሪ ሙሉ ኃይል እስኪኖረው ድረስ የሚቀረው ጊዜ፣ <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">የማያ ገጽ ማጉያ</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">ከክፍለ-ጊዜ ውጣ</translation>
<translation id="8454013096329229812">Wi-Fi በርቷል።</translation>
<translation id="4872237917498892622">Alt+Search ወይም Shift</translation>
+<translation id="9201131092683066720">ባትሪው <ph name="PERCENTAGE"/>% ሙሉ ነው።</translation>
<translation id="2983818520079887040">ቅንብሮች ...</translation>
+<translation id="1195412055398077112">ትርፍ ቅኝት</translation>
<translation id="1717216362413677834">የመትከያ ሁነታ</translation>
+<translation id="112308213915226829">መደርደሪያን በራስ ሰር ደብቅ</translation>
<translation id="8927026611342028580">መገናኘት ተጠይቋል</translation>
<translation id="8300849813060516376">OTASP አልተሳካም</translation>
<translation id="2792498699870441125">Alt+Search</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> ፋይል/ፋይሎችን በማመሳሰል ላይ</translation>
+<translation id="5958529069007801266">ክትትል የሚደረግበት ተጠቃሚ</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK ጠፍቷል</translation>
<translation id="6248847161401822652">ለመተው Control Shift Qን ሁለት ጊዜ ይጫኑ።</translation>
+<translation id="6785414152754474415">ባትሪው <ph name="PERCENTAGE"/>% ሙሉ ሆኖ በተጨማሪም ኃይል እየሞላ ነው።</translation>
<translation id="6267036997247669271"><ph name="NAME"/>፦ በማግበር ላይ...</translation>
+<translation id="4895488851634969361">ባትሪው ሙሉ ነው።</translation>
<translation id="1391854757121130358">የተንቀሳቃሽ ስልክ ውሂብ ገደብዎን ጨርሰው ሊሆን ይችላል።</translation>
-<translation id="5413208160176941586">በአካባቢው የሚተዳደር ተጠቃሚ</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>፦ <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">የአስጀማሪው ቦታ</translation>
+<translation id="5947494881799873997">አድህር</translation>
<translation id="7593891976182323525">Search ወይም Shift</translation>
<translation id="7649070708921625228">እገዛ</translation>
<translation id="3050422059534974565">CAPS LOCK በርቷል።
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">መጥፎ የይለፍ ሐረግ</translation>
<translation id="6165508094623778733">ተጨማሪ ለመረዳት</translation>
<translation id="9046895021617826162">ማገናኘት አልተሳካም</translation>
+<translation id="7168224885072002358">በ<ph name="TIMEOUT_SECONDS"/> ውስጥ ወደ ቀድሞው ጥራት በመመለስ ላይ</translation>
<translation id="973896785707726617">ይህ ክፍለ ጊዜ በ<ph name="SESSION_TIME_REMAINING"/> ጊዜ ውስጥ ያልቃል። በራስ-ሰር እንዲወጡ ይደረጋሉ።</translation>
<translation id="8372369524088641025">መጥፎ የWEP ቁልፍ</translation>
<translation id="6636709850131805001">ያልታወቀ ሁኔታ</translation>
<translation id="3573179567135747900">ወደ «<ph name="FROM_LOCALE"/>» መልሰህ ቀይር (ዳግም ማስጀመር ይፈልጋል)</translation>
<translation id="8103386449138765447">የኤስ ኤም ኤስ መልዕክቶች፦ <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">የGoogle Drive ቅንብሮች...</translation>
-<translation id="1510238584712386396">ማስጀመሪያ</translation>
<translation id="7209101170223508707">CAPS LOCK በርቷል።
ለመሰረዝ Alt+Search ወይም Shift ይጫኑ።</translation>
<translation id="8940956008527784070">ባትሪ ዝቅተኛ ነው (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">ይቀበሉ</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> ቀርቷል</translation>
<translation id="520760366042891468">የማያ ገጽዎን ቁጥጥር በHangouts በኩል በማጋራት ላይ።</translation>
<translation id="8000066093800657092">ምንም አውታረ መረብ የለም</translation>
<translation id="4015692727874266537">ሌላ መለያ ያስገቡ...</translation>
<translation id="5941711191222866238">አሳንስ</translation>
<translation id="6911468394164995108">ሌላ ይቀላቀሉ...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>፦ <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">ሙሉ እስኪሆን ድረስ <ph name="HOUR"/>ሰ <ph name="MINUTE"/>ደ</translation>
<translation id="6359806961507272919">ኤስ ኤም ኤስ ከ<ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">ድምጸ ተያያዥ ሞደም</translation>
diff --git a/chromium/ash/strings/ash_strings_ar.xtb b/chromium/ash/strings/ash_strings_ar.xtb
index 7be62a6e682..db45e7dafc7 100644
--- a/chromium/ash/strings/ash_strings_ar.xtb
+++ b/chromium/ash/strings/ash_strings_ar.xtb
@@ -2,23 +2,27 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ar">
<translation id="3595596368722241419">البطارية ممتلئة</translation>
-<translation id="5250713215130379958">إخفاء المشغل تلقائيًا</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> و<ph name="MINUTE"/></translation>
<translation id="7880025619322806991">حالة المدخل</translation>
<translation id="30155388420722288">زر التدفق</translation>
+<translation id="8673028979667498656">270 درجة</translation>
<translation id="5571066253365925590">تم تمكين البلوتوث</translation>
+<translation id="6310121235600822547">تم تدوير <ph name="DISPLAY_NAME"/> إلى <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">بلوتوث</translation>
<translation id="2268130516524549846">تم تعطيل البلوتوث</translation>
+<translation id="7165320105431587207">أخفقت تهيئة الشبكة</translation>
<translation id="3775358506042162758">يُمكنك تسجيل الدخول المتعدد باستخدام ثلاثة حسابات كحد أقصى.</translation>
-<translation id="370649949373421643">تمكين Wi-Fi</translation>
+<translation id="370649949373421643">‏تمكين Wi-Fi</translation>
<translation id="3626281679859535460">السطوع</translation>
+<translation id="595202126637698455">تم تمكين تتبع مستوى الأداء</translation>
<translation id="8054466585765276473">يجري حساب وقت البطارية.</translation>
<translation id="7982789257301363584">الشبكة</translation>
<translation id="5565793151875479467">الخادم الوكيل...</translation>
<translation id="938582441709398163">تراكب لوحة المفاتيح</translation>
<translation id="4387004326333427325">تم رفض شهادة المصادقة عن بُعد</translation>
<translation id="6979158407327259162">Google Drive</translation>
-<translation id="6943836128787782965">أخفق الحصول على HTTP</translation>
+<translation id="3683428399328702079">تم تغيير درجة دقة <ph name="DISPLAY_NAME"/> إلى <ph name="RESOLUTION"/></translation>
+<translation id="6943836128787782965">‏أخفق الحصول على HTTP</translation>
<translation id="2297568595583585744">علبة الحالة</translation>
<translation id="1661867754829461514">رقم التعريف الشخصي غير موجود</translation>
<translation id="4508225577814909926"><ph name="NAME"/>: جارٍ الاتصال...</translation>
@@ -26,48 +30,50 @@
<translation id="2946640296642327832">تمكين البلوتوث</translation>
<translation id="6459472438155181876">تمديد الشاشة إلى <ph name="DISPLAY_NAME"/></translation>
<translation id="8206859287963243715">خلوي</translation>
-<translation id="6596816719288285829">عنوان IP</translation>
+<translation id="6596816719288285829">‏عنوان IP</translation>
<translation id="4508265954913339219">أخفقت عملية التنشيط</translation>
<translation id="3621712662352432595">إعدادات الصوت</translation>
-<translation id="1812696562331527143">تم تغيير أسلوب الإدخال إلى <ph name="INPUT_METHOD_ID"/>*(<ph name="BEGIN_LINK"/>جهة خارجية<ph name="END_LINK"/>).
+<translation id="1812696562331527143">‏تم تغيير أسلوب الإدخال إلى <ph name="INPUT_METHOD_ID"/>*(<ph name="BEGIN_LINK"/>جهة خارجية<ph name="END_LINK"/>).
اضغط على Shift + Alt للتبديل.</translation>
<translation id="2127372758936585790">شاحن منخفض الطاقة</translation>
<translation id="3846575436967432996">لا توجد معلومات متاحة حول الشبكة</translation>
<translation id="3026237328237090306">إعداد بيانات الجوال</translation>
+<translation id="5871632337994001636">إدارة الأجهزة...</translation>
<translation id="785750925697875037">عرض حساب الجوال</translation>
<translation id="153454903766751181">جارٍ تهيئة المودم الخلوي...</translation>
-<translation id="4628814525959230255">مشاركة التحكم في الشاشة مع <ph name="HELPER_NAME"/> عبر Hangouts.</translation>
-<translation id="8343941333792395995">تمّ تدوير <ph name="DISPLAY_NAME"/></translation>
+<translation id="4628814525959230255">‏مشاركة التحكم في الشاشة مع <ph name="HELPER_NAME"/> عبر Hangouts.</translation>
<translation id="7864539943188674973">تعطيل البلوتوث</translation>
<translation id="939252827960237676">أخفق حفظ لقطة الشاشة</translation>
<translation id="3126069444801937830">إعادة التشغيل للتحديث</translation>
<translation id="2268813581635650749">خروج الجميع</translation>
<translation id="735745346212279324">تم قطع اتصال الشبكة الظاهرية الخاصة</translation>
<translation id="7320906967354320621">في وضع الخمول</translation>
-<translation id="6303423059719347535">اكتمل شحن <ph name="PERCENTAGE"/>% من البطارية</translation>
<translation id="15373452373711364">مؤشر الماوس الكبير</translation>
-<translation id="2778346081696727092">أخفقت المصادقة باستخدام اسم المستخدم أو كلمة المرور المقدمين</translation>
<translation id="3294437725009624529">ضيف</translation>
<translation id="8190698733819146287">تخصيص اللغات والإدخال...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">وضع الرف</translation>
<translation id="2903907270192926896">الإرسال</translation>
<translation id="8676770494376880701">تمّ توصيل شاحن منخفض الطاقة</translation>
<translation id="7170041865419449892">خارج النطاق</translation>
<translation id="4804818685124855865">قطع الاتصال</translation>
<translation id="2544853746127077729">تمّ رفض شهادة المصادقة بواسطة الشبكة</translation>
<translation id="5222676887888702881">الخروج</translation>
+<translation id="2391579633712104609">180 درجة</translation>
<translation id="2688477613306174402">تهيئة</translation>
<translation id="1272079795634619415">إيقاف</translation>
<translation id="4957722034734105353">مزيد من المعلومات...</translation>
-<translation id="2964193600955408481">تعطيل Wi-Fi</translation>
-<translation id="811680302244032017">إضافة جهاز...</translation>
+<translation id="2964193600955408481">‏تعطيل Wi-Fi</translation>
<translation id="4279490309300973883">النسخ المطابق</translation>
-<translation id="2509468283778169019">مفتاح CAPS LOCK قيد التشغيل</translation>
+<translation id="7973962044839454485">‏أخفقت مصادقة PPP نظرًا لوجود خطأ في اسم المستخدم أو كلمة المرور</translation>
+<translation id="2509468283778169019">‏مفتاح CAPS LOCK قيد التشغيل</translation>
<translation id="3892641579809465218">العرض الداخلي</translation>
<translation id="7823564328645135659">تم تغيير اللغة من &quot;<ph name="FROM_LOCALE"/>&quot; إلى &quot;<ph name="TO_LOCALE"/>&quot; بعد مزامنة إعداداتك.</translation>
<translation id="3368922792935385530">متصل</translation>
<translation id="8340999562596018839">التعليقات المنطوقة</translation>
-<translation id="8654520615680304441">تشغيل شبكة Wi-Fi...</translation>
-<translation id="5825747213122829519">تم تغيير أسلوب الإدخال إلى <ph name="INPUT_METHOD_ID"/>.
+<translation id="8654520615680304441">‏تشغيل شبكة Wi-Fi...</translation>
+<translation id="8828714802988429505">90 درجة</translation>
+<translation id="5825747213122829519">‏تم تغيير أسلوب الإدخال إلى <ph name="INPUT_METHOD_ID"/>.
اضغط على Shift + Alt للتبديل.</translation>
<translation id="2562916301614567480">الشبكة الخاصة</translation>
<translation id="6549021752953852991">لا تتوفر شبكة خلوية</translation>
@@ -77,17 +83,18 @@
<translation id="3742055079367172538">تم التقاط لقطة الشاشة</translation>
<translation id="8878886163241303700">توسيع الشاشة</translation>
<translation id="5271016907025319479">لم تتم تهيئة الشبكة الظاهرية الخاصة.</translation>
-<translation id="372094107052732682">للإنهاء، اضغط على Ctrl+Shift+Q مرتين.</translation>
+<translation id="372094107052732682">‏للإنهاء، اضغط على Ctrl+Shift+Q مرتين.</translation>
<translation id="6803622936009808957">تعذر إجراء النسخ المطابق للعروض نظرًا لعدم العثور على درجات دقة متوافقة. تم الدخول إلى سطح المكتب الممتد بدلاً من ذلك.</translation>
<translation id="1480041086352807611">الوضع التجريبي</translation>
<translation id="3626637461649818317">باقٍ <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">أساليب الإدخال</translation>
<translation id="6247708409970142803">%<ph name="PERCENTAGE"/></translation>
-<translation id="2614835198358683673">قد لا يستجيب جهاز Chromebook لعملية الشحن وهو قيد التشغيل. مع مراعاة استخدام الشاحن المخصص للجهاز.</translation>
+<translation id="2825619548187458965">الرف</translation>
+<translation id="2614835198358683673">‏قد لا يستجيب جهاز Chromebook لعملية الشحن وهو قيد التشغيل. مع مراعاة استخدام الشاحن المخصص للجهاز.</translation>
<translation id="1895658205118569222">إيقاف التشغيل</translation>
<translation id="4430019312045809116">مستوى الصوت</translation>
+<translation id="8681498213689260554">‏إعادة التشغيل وإجراء Powerwash للتحديث</translation>
<translation id="4442424173763614572">أخفق البحث في نظام أسماء النطاقات</translation>
-<translation id="6356500677799115505">البطارية مملوءة ويتم شحنها.</translation>
<translation id="7874779702599364982">جارٍ البحث عن شبكات للهاتف الجوال...</translation>
<translation id="583281660410589416">غير محدّد</translation>
<translation id="1383876407941801731">البحث</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">معلومات الشبكة</translation>
<translation id="1621499497873603021">الوقت المتبقي حتى تصبح البطارية فارغة <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">إنهاء جلسة الضيف</translation>
-<translation id="4471417012762451363">اكتمل شحن <ph name="PERCENTAGE"/>% من البطارية ويتم شحنها</translation>
<translation id="8308637677604853869">القائمة السابقة</translation>
<translation id="4666297444214622512">يتعذّر تسجيل الدخول إلى حساب آخر.</translation>
<translation id="1346748346194534595">يمين</translation>
@@ -106,16 +112,17 @@
<translation id="8428213095426709021">الإعدادات</translation>
<translation id="2372145515558759244">جارٍ مزامنة التطبيقات...</translation>
<translation id="7256405249507348194">خطأ غير معروف: <ph name="DESC"/></translation>
-<translation id="7925247922861151263">أخفق فحص AAA</translation>
+<translation id="7925247922861151263">‏أخفق فحص AAA</translation>
<translation id="8456362689280298700">حتى الاكتمال: <ph name="HOUR"/>:<ph name="MINUTE"/> ‏</translation>
-<translation id="5787281376604286451">تم تمكين التعليقات المنطوقة.
+<translation id="5787281376604286451">‏تم تمكين التعليقات المنطوقة.
يمكنك الضغط على Ctrl+Alt+Z لتعطيلها.</translation>
<translation id="4479639480957787382">إيثرنت</translation>
<translation id="6312403991423642364">خطأ غير معروف</translation>
<translation id="1467432559032391204">اليسار</translation>
-<translation id="5543001071567407895">الرسائل القصيرة SMS</translation>
+<translation id="5543001071567407895">‏الرسائل القصيرة SMS</translation>
+<translation id="1957803754585243749">0 درجة</translation>
<translation id="2354174487190027830">تنشيط <ph name="NAME"/></translation>
-<translation id="8814190375133053267">لاسلكي، Wi-Fi</translation>
+<translation id="8814190375133053267">‏لاسلكي، Wi-Fi</translation>
<translation id="1398853756734560583">تكبير</translation>
<translation id="2692809339924654275"><ph name="BLUETOOTH"/>: جارٍ التوصيل...</translation>
<translation id="252373100621549798">شاشة عرض غير معروفة</translation>
@@ -123,14 +130,14 @@
<translation id="2727977024730340865">تمّ توصيل شاحن منخفض الطاقة. لذا قد لا تكون عملية شحن البطارية جديرة بالثقة.</translation>
<translation id="3784455785234192852">قفل</translation>
<translation id="2805756323405976993">تطبيقات</translation>
-<translation id="8871072142849158571">تمّ تغيير حجم <ph name="DISPLAY_NAME"/> إلى <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">إخفاق في عملية التنشيط</translation>
<translation id="5097002363526479830">أخفق الاتصال بشبكة &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
-<translation id="1850504506766569011">تم إيقاف تشغيل Wi-Fi.</translation>
+<translation id="1850504506766569011">‏تم إيقاف تشغيل Wi-Fi.</translation>
<translation id="8132793192354020517">تم الاتصال بالموقع <ph name="NAME"/></translation>
<translation id="7052914147756339792">تعيين خلفية...</translation>
<translation id="8678698760965522072">الحالة متصل</translation>
<translation id="2532589005999780174">وضع التباين العالي</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>، <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">خطأ داخلي</translation>
<translation id="3019353588588144572">الوقت المتبقي حتى يتم شحن البطارية بالكامل <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">مكبّر الشاشة</translation>
@@ -144,55 +151,61 @@
<translation id="4032485810211612751"><ph name="HOURS"/>:<ph name="MINUTES"/>:<ph name="SECONDS"/></translation>
<translation id="225680501294068881">جارٍ البحث عن أجهزة...</translation>
<translation id="5597451508971090205"><ph name="SHORT_WEEKDAY"/>، <ph name="DATE"/></translation>
-<translation id="4448844063988177157">جارِ البحث عن شبكات Wi-Fi...</translation>
+<translation id="4448844063988177157">‏جارِ البحث عن شبكات Wi-Fi...</translation>
<translation id="8401662262483418323">أخفق الاتصال بـ &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/> رسالة الخادم: <ph name="SERVER_MSG"/></translation>
<translation id="2475982808118771221">حدث خطأ</translation>
-<translation id="7229570126336867161">يلزم توفر EVDO</translation>
+<translation id="7229570126336867161">‏يلزم توفر EVDO</translation>
<translation id="2999742336789313416"><ph name="DISPLAY_NAME"/> هي جلسة عامة يديرها <ph name="DOMAIN"/></translation>
<translation id="7029814467594812963">إنهاء الجلسة</translation>
-<translation id="8454013096329229812">تم تشغيل Wi-Fi.</translation>
-<translation id="4872237917498892622">Alt+مفتاح البحث أو Shift</translation>
+<translation id="8454013096329229812">‏تم تشغيل Wi-Fi.</translation>
+<translation id="4872237917498892622">‏Alt+مفتاح البحث أو Shift</translation>
+<translation id="9201131092683066720">اكتمل شحن <ph name="PERCENTAGE"/>% من البطارية.</translation>
<translation id="2983818520079887040">الإعدادات...</translation>
+<translation id="1195412055398077112">الخروج عن إطار الشاشة</translation>
<translation id="1717216362413677834">وضع الإرساء</translation>
+<translation id="112308213915226829">الإخفاء التلقائي للرف</translation>
<translation id="8927026611342028580">الاتصال مطلوب</translation>
-<translation id="8300849813060516376">أخفقت OTASP</translation>
-<translation id="2792498699870441125">Alt+مفتاح البحث</translation>
+<translation id="8300849813060516376">‏أخفقت OTASP</translation>
+<translation id="2792498699870441125">‏Alt+مفتاح البحث</translation>
<translation id="8660803626959853127">جارٍ مزامنة <ph name="COUNT"/> من الملفات</translation>
-<translation id="3709443003275901162">‎9+‎‏</translation>
-<translation id="639644700271529076">مفتاح CAPS LOCK قيد الإيقاف</translation>
-<translation id="6248847161401822652">للإنهاء، اضغط على Control Shift Q مرتين.</translation>
+<translation id="5958529069007801266">مستخدم يخضع للإدارة</translation>
+<translation id="3709443003275901162">‏‎9+‎‏</translation>
+<translation id="639644700271529076">‏مفتاح CAPS LOCK قيد الإيقاف</translation>
+<translation id="6248847161401822652">‏للإنهاء، اضغط على Control Shift Q مرتين.</translation>
+<translation id="6785414152754474415">اكتمل شحن <ph name="PERCENTAGE"/>% من البطارية ويجري شحنها.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: جارٍ التنشيط...</translation>
+<translation id="4895488851634969361">البطارية مملوءة.</translation>
<translation id="1391854757121130358">ربما تكون قد استخدمت حصة بيانات الجوال المخصصة لك.</translation>
-<translation id="5413208160176941586">حساب مستخدم يخضع لإدارة محلية</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">موضع المشغل</translation>
-<translation id="7593891976182323525">مفتاح البحث أو Shift</translation>
+<translation id="5947494881799873997">التراجع عن الإجراء</translation>
+<translation id="7593891976182323525">‏مفتاح البحث أو Shift</translation>
<translation id="7649070708921625228">مساعدة</translation>
-<translation id="3050422059534974565">المفتاح CAPS LOCK في وضع التشغيل، اضغط على مفتاح البحث أو المفتاح Shift لإلغاء التشغيل.</translation>
+<translation id="3050422059534974565">‏المفتاح CAPS LOCK في وضع التشغيل، اضغط على مفتاح البحث أو المفتاح Shift لإلغاء التشغيل.</translation>
<translation id="397105322502079400">جارٍ الحساب...</translation>
<translation id="158849752021629804">يلزم توفر الشبكة الرئيسية</translation>
<translation id="6857811139397017780">تنشيط <ph name="NETWORKSERVICE"/></translation>
-<translation id="5864471791310927901">أخفق بحث DHCP</translation>
+<translation id="5864471791310927901">‏أخفق بحث DHCP</translation>
<translation id="5812035014844949013">الاستماع</translation>
<translation id="6692173217867674490">عبارة مرور غير صالحة</translation>
<translation id="6165508094623778733">مزيد من المعلومات</translation>
<translation id="9046895021617826162">أخفق الاتصال</translation>
+<translation id="7168224885072002358">سيتم الرجوع إلى درجة الدقة القديمة في غضون <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">ستنتهي هذه الجلسة في <ph name="SESSION_TIME_REMAINING"/>. سيتم الخروج تلقائيًا.</translation>
-<translation id="8372369524088641025">مفتاح WEP غير صالح</translation>
+<translation id="8372369524088641025">‏مفتاح WEP غير صالح</translation>
<translation id="6636709850131805001">حالة غير معروفة</translation>
<translation id="3573179567135747900">التغيير مرة أخرى إلى &quot;<ph name="FROM_LOCALE"/>&quot; (يتطلب إعادة التشغيل)</translation>
-<translation id="8103386449138765447">الرسائل القصيرة SMS: <ph name="MESSAGE_COUNT"/></translation>
-<translation id="5045002648206642691">إعدادات Google Drive...</translation>
-<translation id="1510238584712386396">المشغّل</translation>
-<translation id="7209101170223508707">المفتاح CAPS LOCK في وضع التشغيل. اضغط على Alt+مفتاح البحث، أو اضغط على المفتاح Shift لإلغاء التشغيل.</translation>
+<translation id="8103386449138765447">‏الرسائل القصيرة SMS: <ph name="MESSAGE_COUNT"/></translation>
+<translation id="5045002648206642691">‏إعدادات Google Drive...</translation>
+<translation id="7209101170223508707">‏المفتاح CAPS LOCK في وضع التشغيل. اضغط على Alt+مفتاح البحث، أو اضغط على المفتاح Shift لإلغاء التشغيل.</translation>
<translation id="8940956008527784070">طاقة البطارية منخفضة (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">قبول</translation>
<translation id="5102001756192215136">الوقت المتبقي: <ph name="HOUR"/>:<ph name="MINUTE"/> ‏</translation>
-<translation id="520760366042891468">مشاركة التحكم في الشاشة عبر Hangouts.</translation>
+<translation id="520760366042891468">‏مشاركة التحكم في الشاشة عبر Hangouts.</translation>
<translation id="8000066093800657092">لا شبكة</translation>
<translation id="4015692727874266537">تسجيل الدخول لحساب آخر...</translation>
<translation id="5941711191222866238">تصغير</translation>
<translation id="6911468394164995108">الانضمام إلى شبكة أخرى...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>س <ph name="MINUTE"/>د حتى الاكتمال</translation>
-<translation id="6359806961507272919">رسالة قصيرة SMS من الهاتف رقم <ph name="PHONE_NUMBER"/></translation>
+<translation id="6359806961507272919">‏رسالة قصيرة SMS من الهاتف رقم <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">شركة اتصالات</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ash/strings/ash_strings_bg.xtb b/chromium/ash/strings/ash_strings_bg.xtb
index b7c4b204a5a..24aef8cddac 100644
--- a/chromium/ash/strings/ash_strings_bg.xtb
+++ b/chromium/ash/strings/ash_strings_bg.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="bg">
<translation id="3595596368722241419">Батерията е заредена</translation>
-<translation id="5250713215130379958">Автоматично скриване на стартовия панел</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> и <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Състояние на портала</translation>
<translation id="30155388420722288">Бутон „Препълване“</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth е активиран</translation>
+<translation id="6310121235600822547">Завъртяхте „<ph name="DISPLAY_NAME"/>“ на <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth е деактивиран</translation>
+<translation id="7165320105431587207">Конфигурирането на мрежата не бе успешно</translation>
<translation id="3775358506042162758">В централизирания вход можете да имате най-много три профила.</translation>
<translation id="370649949373421643">Активиране на Wi-Fi</translation>
<translation id="3626281679859535460">Яркост</translation>
+<translation id="595202126637698455">Проследяването на ефективността е активирано</translation>
<translation id="8054466585765276473">Издръжливостта на батерията се изчислява.</translation>
<translation id="7982789257301363584">Мрежа</translation>
<translation id="5565793151875479467">Прокси сървър...</translation>
<translation id="938582441709398163">Наслагване върху клавиатурата</translation>
<translation id="4387004326333427325">Сертификатът за удостоверяване бе отхвърлен отдалечено</translation>
<translation id="6979158407327259162">Google Диск</translation>
+<translation id="3683428399328702079">Променихте разделителната способност на „<ph name="DISPLAY_NAME"/>“ на <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Получаването на HTTP не бе успешно</translation>
<translation id="2297568595583585744">Област на състоянието</translation>
<translation id="1661867754829461514">Липсва PIN</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">Зарядно устройство с малка мощност</translation>
<translation id="3846575436967432996">Не е налице информация за мрежата</translation>
<translation id="3026237328237090306">Настройка на мобилните данни</translation>
+<translation id="5871632337994001636">Управление на устройствата...</translation>
<translation id="785750925697875037">Преглед на мобилния профил</translation>
<translation id="153454903766751181">Клетъчният модем се подготвя за работа...</translation>
<translation id="4628814525959230255">Контролът върху екрана ви се споделя с/ъс <ph name="HELPER_NAME"/> чрез Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> бе завъртян</translation>
<translation id="7864539943188674973">Деактивиране на Bluetooth</translation>
<translation id="939252827960237676">Запазването на екранната снимка не бе успешно</translation>
<translation id="3126069444801937830">Рестартирайте, за да актуализирате</translation>
<translation id="2268813581635650749">Изход за всички</translation>
<translation id="735745346212279324">Връзката с виртуалната частна мрежа (VPN) е прекъсната</translation>
<translation id="7320906967354320621">Неактивна</translation>
-<translation id="6303423059719347535">Батерията е <ph name="PERCENTAGE"/>% пълна</translation>
<translation id="15373452373711364">Голям курсор на мишката</translation>
-<translation id="2778346081696727092">Удостоверяването с предоставеното потребителско име или парола не бе успешно</translation>
<translation id="3294437725009624529">Гост</translation>
<translation id="8190698733819146287">Персонализиране на езиците и въвеждането...</translation>
+<translation id="1279938420744323401">„<ph name="DISPLAY_NAME"/>“ (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Позиция на лавицата</translation>
<translation id="2903907270192926896">ВХОД</translation>
<translation id="8676770494376880701">Свързано е зарядно устройство с малка мощност</translation>
<translation id="7170041865419449892">Извън обхват</translation>
<translation id="4804818685124855865">Изключване</translation>
<translation id="2544853746127077729">Сертификатът за удостоверяване бе отхвърлен от мрежата</translation>
<translation id="5222676887888702881">Изход</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Конфигурация</translation>
<translation id="1272079795634619415">Стоп</translation>
<translation id="4957722034734105353">Научете повече...</translation>
<translation id="2964193600955408481">Деактивиране на Wi-Fi</translation>
-<translation id="811680302244032017">Добавяне на устройство...</translation>
<translation id="4279490309300973883">Дублиране</translation>
+<translation id="7973962044839454485">Удостоверяването през PPP не бе успешно поради неправилно потребителско име или парола</translation>
<translation id="2509468283778169019">„CAPS LOCK“ е включен</translation>
<translation id="3892641579809465218">Показване на вътрешна информация</translation>
<translation id="7823564328645135659">Езикът се промени от „<ph name="FROM_LOCALE"/>“ на „<ph name="TO_LOCALE"/>“ след синхронизирането на настройките ви.</translation>
<translation id="3368922792935385530">Установена е връзка</translation>
<translation id="8340999562596018839">Обратна връзка с говор</translation>
<translation id="8654520615680304441">Включване на Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Методът ви на въвеждане се промени на <ph name="INPUT_METHOD_ID"/>.
Натиснете „Shift + Alt“, за да превключите.</translation>
<translation id="2562916301614567480">Частна мрежа</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317">Остава/т <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">Методи за въвеждане</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Лавица</translation>
<translation id="2614835198358683673">Възможно е вашият Chromebook да не се зарежда, докато е включен. Помислете за използване на официалното зарядно устройство.</translation>
<translation id="1895658205118569222">Изключване</translation>
<translation id="4430019312045809116">Звук</translation>
+<translation id="8681498213689260554">Рестартирайте и извършете Powerwash, за да актуализирате</translation>
<translation id="4442424173763614572">Търсенето в DNS не бе успешно</translation>
-<translation id="6356500677799115505">Батерията е пълна и се зарежда.</translation>
<translation id="7874779702599364982">Търсят се мобилни мрежи...</translation>
<translation id="583281660410589416">Неизвестно</translation>
<translation id="1383876407941801731">Търсене</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">Информация за мрежата</translation>
<translation id="1621499497873603021">Оставащо време до изразходването на батерията: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Изход от сесията като гост</translation>
-<translation id="4471417012762451363">Батерията е <ph name="PERCENTAGE"/>% пълна и се зарежда</translation>
<translation id="8308637677604853869">Предишно меню</translation>
<translation id="4666297444214622512">Не може да влезете в друг профил.</translation>
<translation id="1346748346194534595">Надясно</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">Неизвестна мрежова грешка</translation>
<translation id="1467432559032391204">Наляво</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">„<ph name="NAME"/>“ се активира</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Увеличаване</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">Използва се зарядно устройство с малка мощност. Зареждането на батерията може да не е надеждно.</translation>
<translation id="3784455785234192852">Заключване</translation>
<translation id="2805756323405976993">Приложения</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> бе преоразмерен на <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Неуспех при активирането</translation>
<translation id="5097002363526479830">Свързването с мрежата „<ph name="NAME"/>“ не бе успешно: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi е изключен.</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">Задаване на тапет...</translation>
<translation id="8678698760965522072">Състояние: Онлайн</translation>
<translation id="2532589005999780174">Режим на висок контраст</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Вътрешна грешка</translation>
<translation id="3019353588588144572">Оставащо време до пълното зареждане на батерията: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Екранна лупа</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">Изход от сесията</translation>
<translation id="8454013096329229812">Wi-Fi е включен.</translation>
<translation id="4872237917498892622">„Alt + търсене“ или „Shift“</translation>
+<translation id="9201131092683066720">Батерията е <ph name="PERCENTAGE"/>% пълна.</translation>
<translation id="2983818520079887040">Настройки...</translation>
+<translation id="1195412055398077112">допълнителна област</translation>
<translation id="1717216362413677834">Режим на работа с докинг станция</translation>
+<translation id="112308213915226829">Автоматично скриване на лавицата</translation>
<translation id="8927026611342028580">Заявено е свързване</translation>
<translation id="8300849813060516376">Безжичното осигуряване на услуга не бе успешно</translation>
<translation id="2792498699870441125">Alt + търсене</translation>
<translation id="8660803626959853127">Синхронизира/т се <ph name="COUNT"/> файл/а</translation>
+<translation id="5958529069007801266">Контролиран потребител</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">„CAPS LOCK“ е изключен</translation>
<translation id="6248847161401822652">За изход натиснете два пъти Ctrl+Shift+Q.</translation>
+<translation id="6785414152754474415">Батерията е <ph name="PERCENTAGE"/>% пълна и се зарежда.</translation>
<translation id="6267036997247669271">„<ph name="NAME"/>“: Активира се...</translation>
+<translation id="4895488851634969361">Батерията е пълна.</translation>
<translation id="1391854757121130358">Може да сте изразходили отпуснатите ви мобилни данни.</translation>
-<translation id="5413208160176941586">Локално управляван потребител</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Позиция на стартовия панел</translation>
+<translation id="5947494881799873997">Възстановяване</translation>
<translation id="7593891976182323525">„търсене“ или „Shift“</translation>
<translation id="7649070708921625228">Помощ</translation>
<translation id="3050422059534974565">„CAPS LOCK“ е включен.
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">Паролата е неправилна</translation>
<translation id="6165508094623778733">Научете повече</translation>
<translation id="9046895021617826162">Свързването не бе успешно</translation>
+<translation id="7168224885072002358">Старата разделителна способност ще се възстанови след <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Тази сесия ще приключи след <ph name="SESSION_TIME_REMAINING"/>. Ще излезете автоматично от нея.</translation>
<translation id="8372369524088641025">Ключът за WEP е неправилен</translation>
<translation id="6636709850131805001">Неразпознато състояние</translation>
<translation id="3573179567135747900">Връщане към „<ph name="FROM_LOCALE"/>“ (изисква рестартиране)</translation>
<translation id="8103386449138765447">SMS съобщения: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Настройки за Google Диск...</translation>
-<translation id="1510238584712386396">Стартов панел</translation>
<translation id="7209101170223508707">„CAPS LOCK“ е включен.
Натиснете „Alt + търсене“ или „Shift“, за да анулирате.</translation>
<translation id="8940956008527784070">Батерията е изтощена (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Приемам</translation>
<translation id="5102001756192215136">Остава/т <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Контролът върху екрана ви се споделя чрез Hangouts.</translation>
<translation id="8000066093800657092">Няма мрежа</translation>
<translation id="4015692727874266537">Вход в друг профил...</translation>
<translation id="5941711191222866238">Намаляване</translation>
<translation id="6911468394164995108">Присъединяване другаде...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> ч <ph name="MINUTE"/> м до пълно зареждане</translation>
<translation id="6359806961507272919">SMS от <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Оператор</translation>
diff --git a/chromium/ash/strings/ash_strings_bn.xtb b/chromium/ash/strings/ash_strings_bn.xtb
index 44496f3ec74..fde6ff9b1c5 100644
--- a/chromium/ash/strings/ash_strings_bn.xtb
+++ b/chromium/ash/strings/ash_strings_bn.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="bn">
<translation id="3595596368722241419">ব্যাটারি পুরো চার্জ</translation>
-<translation id="5250713215130379958">লঞ্চার স্বয়ংক্রিয়ভাবে লুকান</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> এবং <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">পোর্টাল স্থিতি</translation>
<translation id="30155388420722288">ওভারফ্লো বোতাম</translation>
+<translation id="8673028979667498656">২৭০°</translation>
<translation id="5571066253365925590">ব্লুটুথ সক্ষমিত</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> <ph name="ROTATION"/> আবর্তিত হয়েছে</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">ব্লুটুথ অক্ষমিত</translation>
+<translation id="7165320105431587207">নেটওয়ার্ক কনফিগার করা যায়নি</translation>
<translation id="3775358506042162758">একাধিক সাইন ইনে আপনার কেবলমাত্র তিনটি অ্যাকাউন্ট থাকতে পারে৷</translation>
<translation id="370649949373421643">Wi-fi সক্ষম করুন</translation>
<translation id="3626281679859535460">উজ্জ্বলতা</translation>
+<translation id="595202126637698455">কার্য-সম্পাদনা ট্রেস করা সক্ষম রয়েছে</translation>
<translation id="8054466585765276473">ব্যাটারি সময় গণনা করা হচ্ছে।</translation>
<translation id="7982789257301363584">নেটওয়ার্ক</translation>
<translation id="5565793151875479467">প্রক্সি...</translation>
<translation id="938582441709398163">কীবোর্ড ওভারলে</translation>
<translation id="4387004326333427325">দূরবর্তী অবস্থান থেকে প্রমাণীকরণ শংসাপত্র প্রত্যাখ্যান করা হয়েছে</translation>
<translation id="6979158407327259162">Google ড্রাইভ</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> এর রেসুলিউশান বদল করে <ph name="RESOLUTION"/> করা হয়েছে</translation>
<translation id="6943836128787782965">HTTP ব্যর্থ হয়েছে</translation>
<translation id="2297568595583585744">স্থিতি ট্রে</translation>
<translation id="1661867754829461514">PIN হারিয়েছে</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">নিম্ন শক্তির চার্জার</translation>
<translation id="3846575436967432996">কোনো নেটওয়ার্ক সংক্রান্ত তথ্য উপলব্ধ নেই</translation>
<translation id="3026237328237090306">মোবাইল ডেটা সেটআপ করুন</translation>
+<translation id="5871632337994001636">ডিভাইসগুলি পরিচালন করুন...</translation>
<translation id="785750925697875037">মোবাইল অ্যাকাউন্ট দেখুন</translation>
<translation id="153454903766751181">সেলুলার মোডেম আরম্ভ করা হচ্ছে...</translation>
<translation id="4628814525959230255">Hangouts এর মাধ্যমে <ph name="HELPER_NAME"/> এর সঙ্গে আপনার স্ক্রীন নিয়ন্ত্রণ ভাগ করা হচ্ছে৷</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> ঘোরানো হয়েছে</translation>
<translation id="7864539943188674973">ব্লুটুথ অক্ষম করুন</translation>
<translation id="939252827960237676">স্ক্রীনশট সংরক্ষণ করতে ব্যর্থ হয়েছে</translation>
<translation id="3126069444801937830">আপডেট করার জন্য পুনরারম্ভ করুন</translation>
<translation id="2268813581635650749">সবগুলি সাইন আউট করুন</translation>
<translation id="735745346212279324">VPN সংযোগ বিচ্ছিন্ন করা হয়েছে</translation>
<translation id="7320906967354320621">নিষ্ক্রিয়</translation>
-<translation id="6303423059719347535">ব্যাটারি <ph name="PERCENTAGE"/>% পরিপূর্ণ</translation>
<translation id="15373452373711364">বড় মাউস কার্সার</translation>
-<translation id="2778346081696727092">সরবরাহ করা ব্যবহারকারীর নাম বা পাসওয়ার্ড সহ প্রমাণীকরণ ব্যর্থ</translation>
<translation id="3294437725009624529">অতিথি</translation>
<translation id="8190698733819146287">ভাষা এবং ইনপুট কাস্টমাইজ করুন...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">শেল্ফ অবস্থান</translation>
<translation id="2903907270192926896">ইনপুট</translation>
<translation id="8676770494376880701">নিম্ন শক্তির চার্জার সংযুক্ত করা হয়েছে</translation>
<translation id="7170041865419449892">সীমার বাইরে</translation>
<translation id="4804818685124855865">সংযোগ বিচ্ছিন্ন</translation>
<translation id="2544853746127077729">নেটওয়ার্কের দ্বারা প্রমাণীকরণ শংসাপত্র প্রত্যাখ্যান করা হয়েছে</translation>
<translation id="5222676887888702881">সাইন আউট</translation>
+<translation id="2391579633712104609">১৮০°</translation>
<translation id="2688477613306174402">কনফিগারেশন</translation>
<translation id="1272079795634619415">বন্ধ</translation>
<translation id="4957722034734105353">আরো জানুন...</translation>
<translation id="2964193600955408481">Wi-Fi অক্ষম করুন</translation>
-<translation id="811680302244032017">ডিভাইস জুড়ুন...</translation>
<translation id="4279490309300973883">অনুকরণ করা হচ্ছে</translation>
+<translation id="7973962044839454485">একটি ভুল ব্যবহারকারী নাম বা পাসওয়ার্ডের কারণে PPP প্রমাণীকরণ ব্যর্থ হয়েছে৷</translation>
<translation id="2509468283778169019">CAPS LOCK চালু</translation>
<translation id="3892641579809465218">অভ্যন্তরীণ প্রদর্শন</translation>
<translation id="7823564328645135659">আপনার সেটিংস সিঙ্ক করার পরে ভাষা &quot;<ph name="FROM_LOCALE"/>&quot; থেকে &quot;<ph name="TO_LOCALE"/>&quot; এ পরিবর্তন করা হয়েছে৷</translation>
<translation id="3368922792935385530">সংযুক্ত</translation>
<translation id="8340999562596018839">কথ্য প্রতিক্রিয়া</translation>
<translation id="8654520615680304441">Wi-Fi চালু করুন...</translation>
+<translation id="8828714802988429505">৯০°</translation>
<translation id="5825747213122829519">আপনার ইনপুট পদ্ধতি <ph name="INPUT_METHOD_ID"/> এ পরিবর্তিত হয়েছে৷
স্যুইচ করতে Shift + Alt টিপুন৷</translation>
<translation id="2562916301614567480">ব্যক্তিগত নেটওয়ার্ক</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% বাকি আছে</translation>
<translation id="9089416786594320554">ইনপুট পদ্ধতিসমূহ</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">শেল্ফ</translation>
<translation id="2614835198358683673">চালু থাকার সময় আপনার Chromebook চার্জ নাও হতে পারে৷ এটির নিজস্ব চার্জার ব্যবহার করার কথা বিবেচনা করুন৷</translation>
<translation id="1895658205118569222">শাটডাউন</translation>
<translation id="4430019312045809116">ভলিউম</translation>
+<translation id="8681498213689260554">আপডেট করার জন্য আবার শুরু করুন এবং পাওয়ারওয়াশ করুন</translation>
<translation id="4442424173763614572">DNS খোঁজ ব্যর্থ হয়েছে</translation>
-<translation id="6356500677799115505">ব্যাটারি পরিপূর্ণ এবং চার্জ হচ্ছে৷</translation>
<translation id="7874779702599364982">সেলুলার নেটওয়ার্কগুলির জন্য অনুসন্ধান করছে...</translation>
<translation id="583281660410589416">অজানা</translation>
<translation id="1383876407941801731">অনুসন্ধান</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">নেটওয়ার্ক তথ্য</translation>
<translation id="1621499497873603021">ব্যাটারি শেষ হতে <ph name="TIME_LEFT"/> সময় বাকি আছে</translation>
<translation id="5980301590375426705">অতিথি থেকে প্রস্থান</translation>
-<translation id="4471417012762451363">ব্যাটারি <ph name="PERCENTAGE"/>% পরিপূর্ণ এবং চার্জ হচ্ছে</translation>
<translation id="8308637677604853869">পূর্ববর্তী মেনু</translation>
<translation id="4666297444214622512">অন্য একটি অ্যাকাউন্টে সাইন ইন করতে পারবেন না৷</translation>
<translation id="1346748346194534595">ডান</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">অজানা নেটওয়ার্ক ত্রুটি</translation>
<translation id="1467432559032391204">বাম</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">০°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> সক্রিয় করা হচ্ছে</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">বড় করুন</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">একটি নিম্ন শক্তির চার্জার প্লাগইন করা হয়েছে৷ বিশ্বস্ত ব্যাটারি চার্জ নাও হতে পারে৷</translation>
<translation id="3784455785234192852">লক করুন</translation>
<translation id="2805756323405976993">Apps</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> এর আকার পরিবর্তন করে <ph name="RESOLUTION"/> করা হয়েছে</translation>
<translation id="1512064327686280138">সক্রিয়করণে ব্যর্থতা</translation>
<translation id="5097002363526479830">নেটওয়ার্কের সাথে সংযোগ করতে ব্যর্থ '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi বন্ধ আছে৷</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">ওয়ালপেপার সেট করুন...</translation>
<translation id="8678698760965522072">অনলাইন স্থিতি</translation>
<translation id="2532589005999780174">উচ্চ কনট্রাস্ট মোড</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">অভ্যন্তরীণ ত্রুটি</translation>
<translation id="3019353588588144572">ব্যাটারি পরিপূর্ণ চার্জ হতে, <ph name="TIME_REMAINING"/> সময় বাকি আছে</translation>
<translation id="3473479545200714844">স্ক্রীন ম্যাগনিফায়ার</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">সেশন থেকে প্রস্থান</translation>
<translation id="8454013096329229812">Wi-Fi চালু আছে৷</translation>
<translation id="4872237917498892622">Alt+Search অথবা Shift</translation>
+<translation id="9201131092683066720">ব্যাটারি <ph name="PERCENTAGE"/>% পূর্ণ৷</translation>
<translation id="2983818520079887040">সেটিংস...</translation>
+<translation id="1195412055398077112">ওভারস্ক্যান</translation>
<translation id="1717216362413677834">ডক মোড</translation>
+<translation id="112308213915226829">শেল্ফ স্বয়ংক্রিয়ভাবে লুকান</translation>
<translation id="8927026611342028580">সংযুক্ত করার অনুরোধ করা হয়েছে</translation>
<translation id="8300849813060516376">OTASP ব্যর্থ</translation>
<translation id="2792498699870441125">Alt+Search</translation>
<translation id="8660803626959853127"><ph name="COUNT"/>টি ফাইল (গুলি) সিঙ্ক হচ্ছে</translation>
+<translation id="5958529069007801266">তত্ত্বাবধানে থাকা ব্যবহারকারী</translation>
<translation id="3709443003275901162">৯+</translation>
<translation id="639644700271529076">CAPS LOCK বন্ধ আছে</translation>
<translation id="6248847161401822652">প্রস্থান করার জন্য দুবার Control Shift Q টিপুন৷</translation>
+<translation id="6785414152754474415">ব্যাটারি <ph name="PERCENTAGE"/>% পূর্ণ এবং চার্জ হচ্ছে৷</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: সক্রিয় করা হচ্ছে...</translation>
+<translation id="4895488851634969361">ব্যাটারি পূর্ণ৷</translation>
<translation id="1391854757121130358">আপনি হয়তো আপনার মোবাইল ডেটা অ্যালাউন্স ব্যবহার করেছেন৷</translation>
-<translation id="5413208160176941586">স্থানীয়ভাবে পরিচালিত ব্যবহারকারী</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">লঞ্চার অবস্থান</translation>
+<translation id="5947494881799873997">ফেরান</translation>
<translation id="7593891976182323525">Search অথবা Shift</translation>
<translation id="7649070708921625228">সহায়তা</translation>
<translation id="3050422059534974565">CAPS LOCK চালু আছে৷
@@ -179,22 +190,24 @@ Search অথবা বাতিল করতে Shift টিপুন৷</trans
<translation id="6692173217867674490">খারাপ পাসফ্রেজ</translation>
<translation id="6165508094623778733">আরো জানুন</translation>
<translation id="9046895021617826162">সংযোগ ব্যর্থ হয়েছে</translation>
+<translation id="7168224885072002358"><ph name="TIMEOUT_SECONDS"/> এ পুরানো রেসুলিউশানে ফেরানো হচ্ছে</translation>
<translation id="973896785707726617">এই সেশনটি <ph name="SESSION_TIME_REMAINING"/> এর মধ্যে সমাপ্ত হবে৷ আপনি স্বয়ংক্রিয়ভাবে সাইন আউট হয়ে যাবেন৷</translation>
<translation id="8372369524088641025">খারাপ WEP কী</translation>
<translation id="6636709850131805001">অস্বীকৃত স্থিতি</translation>
<translation id="3573179567135747900">&quot;<ph name="FROM_LOCALE"/>&quot; তে ফেরান (পুনর্সূচনা প্রয়োজন)</translation>
<translation id="8103386449138765447">SMS বার্তা: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google ড্রাইভ সেটিংস ...</translation>
-<translation id="1510238584712386396">লঞ্চার</translation>
<translation id="7209101170223508707">CAPS LOCK চালু আছে৷
Alt+Search অথবা বাতিল করতে Shift টিপুন৷</translation>
<translation id="8940956008527784070">(<ph name="PERCENTAGE"/>%) কম ব্যাটারি</translation>
+<translation id="4918086044614829423">স্বীকার</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> বাকি</translation>
<translation id="520760366042891468">Hangouts এর মাধ্যমে আপনার স্ক্রীন নিয়ন্ত্রণ ভাগ করা হচ্ছে৷</translation>
<translation id="8000066093800657092">কোনও নেটওয়ার্ক নেই</translation>
<translation id="4015692727874266537">অন্য একটি অ্যাকাউন্টে সাইন ইন করুন...</translation>
<translation id="5941711191222866238">ছোট করুন</translation>
<translation id="6911468394164995108">অন্যান্য যোগদান ...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>ঘন্টা <ph name="MINUTE"/> মিনিট পর্যন্ত পূর্ণ</translation>
<translation id="6359806961507272919"><ph name="PHONE_NUMBER"/>-এর থেকে SMS...</translation>
<translation id="1244147615850840081">কেরিয়ার</translation>
diff --git a/chromium/ash/strings/ash_strings_ca.xtb b/chromium/ash/strings/ash_strings_ca.xtb
index 325713c2dff..f7e60ca8d53 100644
--- a/chromium/ash/strings/ash_strings_ca.xtb
+++ b/chromium/ash/strings/ash_strings_ca.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ca">
<translation id="3595596368722241419">Bateria carregada.</translation>
-<translation id="5250713215130379958">Oculta automàticament la barra d'execució ràpida</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> i <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Estat del portal</translation>
<translation id="30155388420722288">Botó de desbordament</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">S'ha activat el Bluetooth</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> s'ha canviat a <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">S'ha desactivat el Bluetooth</translation>
+<translation id="7165320105431587207">No s'ha pogut configurar la xarxa</translation>
<translation id="3775358506042162758">Només podeu tenir tres comptes com a màxim en un inici de sessió múltiple.</translation>
<translation id="370649949373421643">Activa la Wi-Fi</translation>
<translation id="3626281679859535460">Brillantor</translation>
+<translation id="595202126637698455">Seguiment del rendiment activat</translation>
<translation id="8054466585765276473">S'està calculant el temps de la bateria.</translation>
<translation id="7982789257301363584">Xarxa</translation>
<translation id="5565793151875479467">Servidor intermediari...</translation>
<translation id="938582441709398163">Superposició de teclat</translation>
<translation id="4387004326333427325">S'ha rebutjat el certificat d'autenticació de manera remota</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">La resolució de <ph name="DISPLAY_NAME"/> ha canviat a <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">La sol·licitud HTTP ha fallat</translation>
<translation id="2297568595583585744">Safata d'estat</translation>
<translation id="1661867754829461514">Falta el PIN</translation>
@@ -34,39 +38,41 @@ Premeu Maj+Alt per canviar-lo.</translation>
<translation id="2127372758936585790">Carregador de baix consum</translation>
<translation id="3846575436967432996">No hi ha informació de xarxa disponible</translation>
<translation id="3026237328237090306">Configura les dades mòbils</translation>
+<translation id="5871632337994001636">Gestiona els dispositius...</translation>
<translation id="785750925697875037">Mostra el compte mòbil</translation>
<translation id="153454903766751181">S'està inicialitzant el mòdem mòbil...</translation>
<translation id="4628814525959230255">Comparteix el control de la pantalla amb <ph name="HELPER_NAME"/> mitjançant Hangouts.</translation>
-<translation id="8343941333792395995">S'ha girat <ph name="DISPLAY_NAME"/></translation>
<translation id="7864539943188674973">Desactiva el Bluetooth</translation>
<translation id="939252827960237676">S'ha produït un error en desar la captura de pantalla.</translation>
<translation id="3126069444801937830">Reinicia per actualitzar</translation>
<translation id="2268813581635650749">Tanca la sessió de tots els usuaris</translation>
<translation id="735745346212279324">VPN desconnectada</translation>
<translation id="7320906967354320621">Inactiu</translation>
-<translation id="6303423059719347535">La bateria està carregada fins al <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">Cursor del ratolí gran</translation>
-<translation id="2778346081696727092">No s'ha pogut autenticar amb el nom d'usuari o amb la contrasenya que heu proporcionat</translation>
<translation id="3294437725009624529">Convidat</translation>
<translation id="8190698733819146287">Personalitza els idiomes i l'entrada...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Posició del prestatge</translation>
<translation id="2903907270192926896">ENTRADA</translation>
<translation id="8676770494376880701">S'ha connectat un carregador de baix consum</translation>
<translation id="7170041865419449892">Fora de l'interval</translation>
<translation id="4804818685124855865">Desconnecta</translation>
<translation id="2544853746127077729">La xarxa ha rebutjat el certificat d'autenticació</translation>
<translation id="5222676887888702881">Tanca la sessió</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Configuració</translation>
<translation id="1272079795634619415">Atura</translation>
<translation id="4957722034734105353">Més informació...</translation>
<translation id="2964193600955408481">Desactiva la Wi-Fi</translation>
-<translation id="811680302244032017">Afegeix un dispositiu...</translation>
<translation id="4279490309300973883">S'està creant una rèplica</translation>
+<translation id="7973962044839454485">L'autenticació de PPA ha fallat perquè el nom d'usuari o la contrasenya no eren correctes</translation>
<translation id="2509468283778169019">BLOQ MAJ està activat.</translation>
<translation id="3892641579809465218">Pantalla interna</translation>
<translation id="7823564328645135659">L'idioma ha canviat de &quot;<ph name="FROM_LOCALE"/>&quot; a &quot;<ph name="TO_LOCALE"/>&quot; després de sincronitzar la vostra configuració.</translation>
<translation id="3368922792935385530">Connectat</translation>
<translation id="8340999562596018839">Comentaris de veu</translation>
<translation id="8654520615680304441">Activa la Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">El mètode d'entrada ha canviat a <ph name="INPUT_METHOD_ID"/>.
Premeu Maj+Alt per canviar-lo.</translation>
<translation id="2562916301614567480">Xarxa privada</translation>
@@ -83,11 +89,12 @@ Premeu Maj+Alt per canviar-lo.</translation>
<translation id="3626637461649818317">Queda un <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">Mètodes d'introducció</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Prestatge</translation>
<translation id="2614835198358683673">És possible que el vostre Chromebook no es carregui mentre estigui encès. Proveu de fer servir un carregador oficial.</translation>
<translation id="1895658205118569222">Aturada</translation>
<translation id="4430019312045809116">Volum</translation>
+<translation id="8681498213689260554">Reinicieu i feu un Powerwash per actualitzar</translation>
<translation id="4442424173763614572">La cerca de DNS ha fallat</translation>
-<translation id="6356500677799115505">La bateria és plena i s'està carregant.</translation>
<translation id="7874779702599364982">S'estan cercant xarxes mòbils...</translation>
<translation id="583281660410589416">Desconegut</translation>
<translation id="1383876407941801731">Cerca</translation>
@@ -96,7 +103,6 @@ Premeu Maj+Alt per canviar-lo.</translation>
<translation id="2204305834655267233">Informació de la xarxa</translation>
<translation id="1621499497873603021">Temps que queda fins que no s'esgoti la bateria: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Surt de la sessió de convidat</translation>
-<translation id="4471417012762451363">La bateria està carregada fins al <ph name="PERCENTAGE"/>% i s'està carregant</translation>
<translation id="8308637677604853869">Menú anterior</translation>
<translation id="4666297444214622512">No podeu iniciar la sessió en un altre compte.</translation>
<translation id="1346748346194534595">A la dreta</translation>
@@ -114,6 +120,7 @@ Premeu Ctrl+Alt+Z per desactivar-los.</translation>
<translation id="6312403991423642364">Error de xarxa desconegut</translation>
<translation id="1467432559032391204">A l'esquerra</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">S'està activant <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maximitza</translation>
@@ -123,7 +130,6 @@ Premeu Ctrl+Alt+Z per desactivar-los.</translation>
<translation id="2727977024730340865">S'ha connectat a un carregador de baix consum. És possible que la càrrega de la bateria no sigui fiable.</translation>
<translation id="3784455785234192852">Bloqueja</translation>
<translation id="2805756323405976993">Aplicacions</translation>
-<translation id="8871072142849158571">S'ha canviat la resolució de <ph name="DISPLAY_NAME"/> a <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Error d'activació</translation>
<translation id="5097002363526479830">S'ha produït un error en connectar amb la xarxa &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">La Wi-Fi està desactivada.</translation>
@@ -131,6 +137,7 @@ Premeu Ctrl+Alt+Z per desactivar-los.</translation>
<translation id="7052914147756339792">Defineix l'empaperat...</translation>
<translation id="8678698760965522072">Estat en línia</translation>
<translation id="2532589005999780174">Mode de contrast elevat</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Error intern</translation>
<translation id="3019353588588144572">Temps restant fins que la bateria no estigui totalment carregada: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Augment de pantalla</translation>
@@ -153,20 +160,24 @@ Missatge del servidor: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Tanca la sessió</translation>
<translation id="8454013096329229812">La Wi-Fi està activada.</translation>
<translation id="4872237917498892622">Alt+Cerca o Maj</translation>
+<translation id="9201131092683066720">La bateria està carregada fins al <ph name="PERCENTAGE"/>%.</translation>
<translation id="2983818520079887040">Configuració...</translation>
+<translation id="1195412055398077112">sobreescaneig</translation>
<translation id="1717216362413677834">Mode connectat</translation>
+<translation id="112308213915226829">Amaga el prestatge automàticament</translation>
<translation id="8927026611342028580">S'ha sol·licitat la connexió</translation>
<translation id="8300849813060516376">Error d'OTASP</translation>
<translation id="2792498699870441125">Alt+Cerca</translation>
<translation id="8660803626959853127">Fitxers que s'estan sincronitzant: <ph name="COUNT"/></translation>
+<translation id="5958529069007801266">Usuari supervisat</translation>
<translation id="3709443003275901162">Més de 9</translation>
<translation id="639644700271529076">Bloq Maj està desactivat</translation>
<translation id="6248847161401822652">Premeu Control+Maj+Q dues vegades per sortir.</translation>
+<translation id="6785414152754474415">La bateria està carregada fins al <ph name="PERCENTAGE"/>% i s'està carregant.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: s'està activant...</translation>
+<translation id="4895488851634969361">La bateria està carregada.</translation>
<translation id="1391854757121130358">Pot ser que hàgiu esgotat les dades mòbils.</translation>
-<translation id="5413208160176941586">Usuari gestionat localment</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Posició de la barra d'execució ràpida</translation>
+<translation id="5947494881799873997">Reverteix</translation>
<translation id="7593891976182323525">Cerca o Maj</translation>
<translation id="7649070708921625228">Ajuda</translation>
<translation id="3050422059534974565">Bloq Maj està activat.
@@ -179,22 +190,24 @@ Premeu Cerca o Maj per cancel·lar.</translation>
<translation id="6692173217867674490">Contrasenya no vàlida</translation>
<translation id="6165508094623778733">Més informació</translation>
<translation id="9046895021617826162">S'ha produït un error en la connexió</translation>
+<translation id="7168224885072002358">Es revertirà a la resolució anterior d'aquí a <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">La sessió finalitzarà d'aquí a <ph name="SESSION_TIME_REMAINING"/>. Es tancarà la sessió automàticament.</translation>
<translation id="8372369524088641025">Clau WEP no vàlida</translation>
<translation id="6636709850131805001">Estat no reconegut</translation>
<translation id="3573179567135747900">Torna a canviar a &quot;<ph name="FROM_LOCALE"/>&quot; (requereix reiniciar)</translation>
<translation id="8103386449138765447">Missatges SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Configuració de Google Drive...</translation>
-<translation id="1510238584712386396">Menú d'aplicacions</translation>
<translation id="7209101170223508707">Bloq Maj està activat.
Premeu Alt+Cerca o Maj per cancel·lar.</translation>
<translation id="8940956008527784070">Bateria baixa (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Accepta</translation>
<translation id="5102001756192215136">Temps d'autonomia: <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Compartiu el control de la pantalla mitjançant Hangouts.</translation>
<translation id="8000066093800657092">No hi ha xarxa</translation>
<translation id="4015692727874266537">Inicia la sessió amb un altre compte...</translation>
<translation id="5941711191222866238">Minimitza</translation>
<translation id="6911468394164995108">Uneix-te a una altra...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">Falten <ph name="HOUR"/> h <ph name="MINUTE"/> min fins que estigui carregada completament</translation>
<translation id="6359806961507272919">SMS de <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operador</translation>
diff --git a/chromium/ash/strings/ash_strings_cs.xtb b/chromium/ash/strings/ash_strings_cs.xtb
index cc7cafc6f7f..d5f2e98a3ae 100644
--- a/chromium/ash/strings/ash_strings_cs.xtb
+++ b/chromium/ash/strings/ash_strings_cs.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="cs">
<translation id="3595596368722241419">Baterie je nabitá</translation>
-<translation id="5250713215130379958">Automaticky skrýt spouštěč</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> a <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Stav portálu</translation>
<translation id="30155388420722288">Tlačítko přetečení</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Rozhraní Bluetooth aktivováno</translation>
+<translation id="6310121235600822547">Displej <ph name="DISPLAY_NAME"/> byl otočen o <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Rozhraní Bluetooth deaktivováno</translation>
+<translation id="7165320105431587207">Konfigurace sítě se nezdařila</translation>
<translation id="3775358506042162758">V rámci vícenásobného přihlášení lze používat maximálně tři účty.</translation>
<translation id="370649949373421643">Povolit Wi-Fi</translation>
<translation id="3626281679859535460">Jas</translation>
+<translation id="595202126637698455">Sledování výkonu aktivováno</translation>
<translation id="8054466585765276473">Výpočet doby výdrže baterie.</translation>
<translation id="7982789257301363584">Síť</translation>
<translation id="5565793151875479467">Server proxy...</translation>
<translation id="938582441709398163">Překryvná klávesnice</translation>
<translation id="4387004326333427325">Ověřovací certifikát byl vzdáleně odmítnut</translation>
<translation id="6979158407327259162">Disk Google</translation>
+<translation id="3683428399328702079">Rozlišení displeje <ph name="DISPLAY_NAME"/> bylo změněno na <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Příkaz GET protokolu HTTP se nezdařil.</translation>
<translation id="2297568595583585744">Stavový panel</translation>
<translation id="1661867754829461514">Chybí kód PIN</translation>
@@ -33,39 +37,41 @@
<translation id="2127372758936585790">Nabíječka má příliš nízký výkon</translation>
<translation id="3846575436967432996">Informace o síti nejsou k dispozici</translation>
<translation id="3026237328237090306">Nastavení mobilního datového připojení</translation>
+<translation id="5871632337994001636">Spravovat zařízení...</translation>
<translation id="785750925697875037">Zobrazit mobilní účet</translation>
<translation id="153454903766751181">Inicializace mobilního modemu...</translation>
<translation id="4628814525959230255">Sdílíte ovládání obrazovky s uživatelem <ph name="HELPER_NAME"/> (prostřednictvím služby Hangouts).</translation>
-<translation id="8343941333792395995">Displej <ph name="DISPLAY_NAME"/> byl pootočen</translation>
<translation id="7864539943188674973">Vypnout Bluetooth</translation>
<translation id="939252827960237676">Uložení snímku obrazovky se nezdařilo</translation>
<translation id="3126069444801937830">Restartovat a aktualizovat</translation>
<translation id="2268813581635650749">Odhlásit vše</translation>
<translation id="735745346212279324">Síť VPN je odpojena</translation>
<translation id="7320906967354320621">Nečinnost</translation>
-<translation id="6303423059719347535">Baterie je nabitá na <ph name="PERCENTAGE"/> %</translation>
<translation id="15373452373711364">Velký kurzor myši</translation>
-<translation id="2778346081696727092">Ověření prostřednictvím uvedeného uživatelského jména nebo hesla se nepodařilo.</translation>
<translation id="3294437725009624529">Host</translation>
<translation id="8190698733819146287">Personalizovat jazyky a zadávání...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Pozice na poličce</translation>
<translation id="2903907270192926896">VSTUP</translation>
<translation id="8676770494376880701">Byla připojena nabíječka s nízkým napětím</translation>
<translation id="7170041865419449892">Mimo dosah</translation>
<translation id="4804818685124855865">Odpojit</translation>
<translation id="2544853746127077729">Ověřovací certifikát byl sítí odmítnut</translation>
<translation id="5222676887888702881">Odhlásit se</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfigurace</translation>
<translation id="1272079795634619415">Zastavit</translation>
<translation id="4957722034734105353">Další informace...</translation>
<translation id="2964193600955408481">Vypnout Wi-Fi</translation>
-<translation id="811680302244032017">Přidat zařízení...</translation>
<translation id="4279490309300973883">Zrcadlení</translation>
+<translation id="7973962044839454485">Ověření PPP se nezdařilo kvůli nesprávnému uživatelskému jménu nebo heslu</translation>
<translation id="2509468283778169019">CAPS LOCK je zapnutý</translation>
<translation id="3892641579809465218">Interní displej</translation>
<translation id="7823564328645135659">Jazyk prohlížeče Chrome se po synchronizaci nastavení změnil z jazyka <ph name="FROM_LOCALE"/> na jazyk <ph name="TO_LOCALE"/>.</translation>
<translation id="3368922792935385530">Připojeno</translation>
<translation id="8340999562596018839">Hlasová odezva</translation>
<translation id="8654520615680304441">Zapnout Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Metoda zadávání se změnila na metodu <ph name="INPUT_METHOD_ID"/>. Přepnout ji můžete stisknutím klávesové zkratky Shift + Alt.</translation>
<translation id="2562916301614567480">Soukromá síť</translation>
<translation id="6549021752953852991">Není k dispozici žádná mobilní síť.</translation>
@@ -81,11 +87,12 @@
<translation id="3626637461649818317">Zbývá <ph name="PERCENTAGE"/> %</translation>
<translation id="9089416786594320554">Metody zadávání dat</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/> %</translation>
+<translation id="2825619548187458965">Polička</translation>
<translation id="2614835198358683673">Když bude Chromebook zapnutý, možná se nebude nabíjet. Doporučujeme použít oficiální nabíječku.</translation>
<translation id="1895658205118569222">Vypnout počítač</translation>
<translation id="4430019312045809116">Hlasitost</translation>
+<translation id="8681498213689260554">Restartovat a aktualizovat pomocí funkce Powerwash</translation>
<translation id="4442424173763614572">Nepodařilo se nalézt server DNS.</translation>
-<translation id="6356500677799115505">Baterie je plně nabitá a nabíjí se.</translation>
<translation id="7874779702599364982">Vyhledávání mobilních sítí...</translation>
<translation id="583281660410589416">Neznámý</translation>
<translation id="1383876407941801731">Vyhledávání</translation>
@@ -94,7 +101,6 @@
<translation id="2204305834655267233">Informace o síti</translation>
<translation id="1621499497873603021">Čas zbývající do vybití baterie: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Odhlásit hosta</translation>
-<translation id="4471417012762451363">Baterie je nabitá na <ph name="PERCENTAGE"/> % a nabíjí se</translation>
<translation id="8308637677604853869">Předchozí nabídka</translation>
<translation id="4666297444214622512">Nelze se přihlásit k jinému účtu.</translation>
<translation id="1346748346194534595">Doprava</translation>
@@ -112,6 +118,7 @@ Stiskem kláves Ctrl+Alt+Z ji deaktivujete.</translation>
<translation id="6312403991423642364">Neznámá chyba sítě</translation>
<translation id="1467432559032391204">Doleva</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Aktivace sítě <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maximalizovat</translation>
@@ -121,7 +128,6 @@ Stiskem kláves Ctrl+Alt+Z ji deaktivujete.</translation>
<translation id="2727977024730340865">Byla připojena nabíječka s nízkým výkonem. Nabíjení baterie nemusí probíhat spolehlivě.</translation>
<translation id="3784455785234192852">Uzamknout</translation>
<translation id="2805756323405976993">Aplikace</translation>
-<translation id="8871072142849158571">Rozlišení displeje <ph name="DISPLAY_NAME"/> bylo změněno na <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Aktivace se nezdařila</translation>
<translation id="5097002363526479830">Připojení k síti <ph name="NAME"/> se nezdařilo: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Připojení Wi-Fi je vypnuto.</translation>
@@ -129,6 +135,7 @@ Stiskem kláves Ctrl+Alt+Z ji deaktivujete.</translation>
<translation id="7052914147756339792">Nastavení tapety...</translation>
<translation id="8678698760965522072">Stav online</translation>
<translation id="2532589005999780174">Režim vysokého kontrastu</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Interní chyba</translation>
<translation id="3019353588588144572">Čas zbývající do úplného nabití baterie: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Lupa obrazovky</translation>
@@ -151,20 +158,24 @@ Zpráva serveru: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Ukončit relaci</translation>
<translation id="8454013096329229812">Připojení Wi-Fi je zapnuto.</translation>
<translation id="4872237917498892622">Alt + Vyhledávání nebo Shift</translation>
+<translation id="9201131092683066720">Baterie je nabita na <ph name="PERCENTAGE"/> %.</translation>
<translation id="2983818520079887040">Nastavení...</translation>
+<translation id="1195412055398077112">přesah obrazu</translation>
<translation id="1717216362413677834">Režim doku</translation>
+<translation id="112308213915226829">Automaticky skrývat poličku</translation>
<translation id="8927026611342028580">Je vyžadováno připojení</translation>
<translation id="8300849813060516376">Selhání OTASP</translation>
<translation id="2792498699870441125">Alt + Vyhledávání</translation>
<translation id="8660803626959853127">Synchronizace souborů (<ph name="COUNT"/>)</translation>
+<translation id="5958529069007801266">Uživatel pod dohledem</translation>
<translation id="3709443003275901162">&gt;9</translation>
<translation id="639644700271529076">CAPS LOCK je vypnutý</translation>
<translation id="6248847161401822652">Práci ukončíte dvojitým stisknutím kombinace kláves Ctrl+Shift+Q.</translation>
+<translation id="6785414152754474415">Baterie je nabita na <ph name="PERCENTAGE"/> % a nabíjí se.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Probíhá aktivace...</translation>
+<translation id="4895488851634969361">Baterie je plně nabita.</translation>
<translation id="1391854757121130358">Pravděpodobně jste vyčerpali povolený objem mobilních datových přenosů.</translation>
-<translation id="5413208160176941586">Místně spravovaný uživatel</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Pozice spouštěče</translation>
+<translation id="5947494881799873997">Vrátit zpět</translation>
<translation id="7593891976182323525">Vyhledávání nebo Shift</translation>
<translation id="7649070708921625228">Nápověda</translation>
<translation id="3050422059534974565">CAPS LOCK je zapnutý. Vypnete jej stisknutím klávesy Vyhledávání nebo Shift.</translation>
@@ -176,22 +187,24 @@ Zpráva serveru: <ph name="SERVER_MSG"/></translation>
<translation id="6692173217867674490">Chybné přístupové heslo</translation>
<translation id="6165508094623778733">Další informace</translation>
<translation id="9046895021617826162">Připojení selhalo</translation>
+<translation id="7168224885072002358">Původní rozlišení bude obnoveno za <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Relace bude ukončena za <ph name="SESSION_TIME_REMAINING"/>. Poté budete automaticky odhlášeni.</translation>
<translation id="8372369524088641025">Chybný klíč WEP</translation>
<translation id="6636709850131805001">Neznámý stav</translation>
<translation id="3573179567135747900">Změnit zpět na jazyk <ph name="FROM_LOCALE"/> (vyžaduje restart)</translation>
<translation id="8103386449138765447">Zprávy SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Nastavení Disku Google...</translation>
-<translation id="1510238584712386396">Spouštěč</translation>
<translation id="7209101170223508707">CAPS LOCK je zapnutý.
Vypnete jej stisknutím kombinace kláves Alt + Vyhledávání nebo Shift.</translation>
<translation id="8940956008527784070">Slabá baterie (<ph name="PERCENTAGE"/> %)</translation>
+<translation id="4918086044614829423">Přijmout</translation>
<translation id="5102001756192215136">Zbývá: <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Sdílíte ovládání obrazovky (prostřednictvím služby Hangouts).</translation>
<translation id="8000066093800657092">Žádná síť</translation>
<translation id="4015692727874266537">Přihlásit jiný účet...</translation>
<translation id="5941711191222866238">Minimalizovat</translation>
<translation id="6911468394164995108">Připojit k jiné...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> h <ph name="MINUTE"/> min do nabití</translation>
<translation id="6359806961507272919">SMS z čísla <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operátor</translation>
diff --git a/chromium/ash/strings/ash_strings_da.xtb b/chromium/ash/strings/ash_strings_da.xtb
index 5b25908a370..fdb185e5c30 100644
--- a/chromium/ash/strings/ash_strings_da.xtb
+++ b/chromium/ash/strings/ash_strings_da.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="da">
<translation id="3595596368722241419">Batteri fuldt</translation>
-<translation id="5250713215130379958">Skjul automatisk applikationslisten</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> og <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Tilstand for portal</translation>
<translation id="30155388420722288">Knappen Overflow</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth er aktiveret</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> er roteret til <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth er deaktiveret</translation>
+<translation id="7165320105431587207">Netværket kunne ikke konfigureres</translation>
<translation id="3775358506042162758">Du kan kun have op til tre konti i samlet login fra flere konti.</translation>
<translation id="370649949373421643">Aktivér Wi-Fi</translation>
<translation id="3626281679859535460">Lysstyrke</translation>
+<translation id="595202126637698455">Sporing af ydelsen er aktiveret</translation>
<translation id="8054466585765276473">Beregner batteritid.</translation>
<translation id="7982789257301363584">Netværk</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Tastaturoverlejring</translation>
<translation id="4387004326333427325">Godkendelsescertifikatet blev afvist eksternt</translation>
<translation id="6979158407327259162">Google Drev</translation>
+<translation id="3683428399328702079">Opløsningen for <ph name="DISPLAY_NAME"/> er ændret til <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Det lykkedes ikke at hente HTTP</translation>
<translation id="2297568595583585744">Statusbakke</translation>
<translation id="1661867754829461514">Pinkode mangler</translation>
@@ -34,39 +38,41 @@ Tryk på Shift+Alt for at ændre den.</translation>
<translation id="2127372758936585790">Oplader ved lav kraft</translation>
<translation id="3846575436967432996">Der er ingen tilgængelige netværksoplysninger</translation>
<translation id="3026237328237090306">Konfigurer mobildata</translation>
+<translation id="5871632337994001636">Administrer enheder...</translation>
<translation id="785750925697875037">Vis mobilkonto</translation>
<translation id="153454903766751181">Initialiserer mobilmodem...</translation>
<translation id="4628814525959230255">Deler kontrollen over din skærm med <ph name="HELPER_NAME"/> via Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> er roteret</translation>
<translation id="7864539943188674973">Deaktiver Bluetooth</translation>
<translation id="939252827960237676">Skærmbilledet kunne ikke gemmes</translation>
<translation id="3126069444801937830">Genstart for at opdatere</translation>
<translation id="2268813581635650749">Log alle ud</translation>
<translation id="735745346212279324">VPN afbrudt</translation>
<translation id="7320906967354320621">Ikke aktiv</translation>
-<translation id="6303423059719347535">Batteriet er <ph name="PERCENTAGE"/> % fuldt</translation>
<translation id="15373452373711364">Stor musemarkør</translation>
-<translation id="2778346081696727092">Der kunne ikke godkendes med det angivne brugernavn eller adgangskoden</translation>
<translation id="3294437725009624529">Gæst</translation>
<translation id="8190698733819146287">Tilpas sprog og indtastning...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Hyldeplacering</translation>
<translation id="2903907270192926896">INPUT</translation>
<translation id="8676770494376880701">Oplader med lav kraft er tilsluttet</translation>
<translation id="7170041865419449892">Intet signal</translation>
<translation id="4804818685124855865">Afbryd</translation>
<translation id="2544853746127077729">Godkendelsescertifikatet blev afvist af netværk</translation>
<translation id="5222676887888702881">Log ud</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfiguration</translation>
<translation id="1272079795634619415">Stop</translation>
<translation id="4957722034734105353">Flere oplysninger...</translation>
<translation id="2964193600955408481">Deaktiver Wi-Fi</translation>
-<translation id="811680302244032017">Tilføj enhed...</translation>
<translation id="4279490309300973883">Spejling</translation>
+<translation id="7973962044839454485">PPP-godkendelsen mislykkedes på grund af forkert brugernavn eller adgangskode</translation>
<translation id="2509468283778169019">CAPS LOCK er slået til</translation>
<translation id="3892641579809465218">Internt display</translation>
<translation id="7823564328645135659">Sproget er blevet ændret fra &quot;<ph name="FROM_LOCALE"/>&quot; til &quot;<ph name="TO_LOCALE"/>&quot;, efter at du har synkroniseret dine indstillinger.</translation>
<translation id="3368922792935385530">Tilsluttet</translation>
<translation id="8340999562596018839">Talefeedback</translation>
<translation id="8654520615680304441">Slå Wi-Fi til...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Din inputmetode er ændret til <ph name="INPUT_METHOD_ID"/>.
Tryk på Shift+Alt for at ændre den.</translation>
<translation id="2562916301614567480">Privat netværk</translation>
@@ -83,11 +89,12 @@ Tryk på Shift+Alt for at ændre den.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/> % tilbage</translation>
<translation id="9089416786594320554">Indtastningsmetoder</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/> %</translation>
+<translation id="2825619548187458965">Hylde</translation>
<translation id="2614835198358683673">Din Chromebook oplades muligvis ikke, når den er tændt. Anvend eventuelt den officielle oplader.</translation>
<translation id="1895658205118569222">Nedlukning</translation>
<translation id="4430019312045809116">Lydstyrke</translation>
+<translation id="8681498213689260554">Genstart, og udfør PowerWash for at opdatere</translation>
<translation id="4442424173763614572">DNS-opslag mislykkedes</translation>
-<translation id="6356500677799115505">Batteriet er fuldt opladet og oplader.</translation>
<translation id="7874779702599364982">Søger efter mobilnetværk...</translation>
<translation id="583281660410589416">Ukendt</translation>
<translation id="1383876407941801731">Søgning</translation>
@@ -96,7 +103,6 @@ Tryk på Shift+Alt for at ændre den.</translation>
<translation id="2204305834655267233">Netværksoplysninger</translation>
<translation id="1621499497873603021">Tid tilbage, indtil batteriet er tomt, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Afslut gæstesession</translation>
-<translation id="4471417012762451363">Batteriet er <ph name="PERCENTAGE"/> % fuldt og oplader</translation>
<translation id="8308637677604853869">Forrige menu</translation>
<translation id="4666297444214622512">Kan ikke logge ind på en anden konto.</translation>
<translation id="1346748346194534595">Højre</translation>
@@ -113,7 +119,8 @@ Tryk på Ctrl+Alt+Z for at deaktivere dette.</translation>
<translation id="4479639480957787382">Ethernet</translation>
<translation id="6312403991423642364">Ukendt netværksfejl</translation>
<translation id="1467432559032391204">Venstre</translation>
-<translation id="5543001071567407895">SMS</translation>
+<translation id="5543001071567407895">sms</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Aktiverer <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maksimer</translation>
@@ -123,7 +130,6 @@ Tryk på Ctrl+Alt+Z for at deaktivere dette.</translation>
<translation id="2727977024730340865">Tilsluttet en oplader med lav kraft. Batteriopladningen er muligvis ikke pålidelig.</translation>
<translation id="3784455785234192852">Lås</translation>
<translation id="2805756323405976993">Applikationer</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> er blevet ændret til <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Aktiveringsfejl:</translation>
<translation id="5097002363526479830">Der kunne ikke oprettes forbindelse til netværket &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi er slået fra.</translation>
@@ -131,6 +137,7 @@ Tryk på Ctrl+Alt+Z for at deaktivere dette.</translation>
<translation id="7052914147756339792">Angiv baggrundsbillede...</translation>
<translation id="8678698760965522072">Onlinetilstand</translation>
<translation id="2532589005999780174">Tilstanden Høj kontrast</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Intern fejl</translation>
<translation id="3019353588588144572">Resterende tid, indtil batteriet er fuldt opladet, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Skærmforstørrer</translation>
@@ -153,20 +160,24 @@ Servermeddelelse: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Afslut session</translation>
<translation id="8454013096329229812">Wi-Fi er slået til.</translation>
<translation id="4872237917498892622">Alt+Søg eller Skift</translation>
+<translation id="9201131092683066720">Batteriet er <ph name="PERCENTAGE"/> % opladet.</translation>
<translation id="2983818520079887040">Indstillinger...</translation>
+<translation id="1195412055398077112">overscan</translation>
<translation id="1717216362413677834">Docktilstand</translation>
+<translation id="112308213915226829">Skjul hylde automatisk</translation>
<translation id="8927026611342028580">Der er anmodet om forbindelse</translation>
<translation id="8300849813060516376">OTASP mislykkedes</translation>
<translation id="2792498699870441125">Alt+Søg</translation>
<translation id="8660803626959853127">Synkroniserer <ph name="COUNT"/> fil(er)</translation>
+<translation id="5958529069007801266">Overvåget bruger</translation>
<translation id="3709443003275901162">9 eller flere</translation>
<translation id="639644700271529076">CAPS LOCK er deaktiveret</translation>
<translation id="6248847161401822652">Tryk på Ctrl+Shift+Q to gange for at afslutte.</translation>
+<translation id="6785414152754474415">Batteriet er <ph name="PERCENTAGE"/> % opladet og oplades nu.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Aktiverer...</translation>
+<translation id="4895488851634969361">Batteriet er helt opladet.</translation>
<translation id="1391854757121130358">Du har muligvis nået din mobildatagrænse.</translation>
-<translation id="5413208160176941586">Lokalt administreret bruger</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Applikationslistens placering</translation>
+<translation id="5947494881799873997">Fortryd</translation>
<translation id="7593891976182323525">Søg eller skift</translation>
<translation id="7649070708921625228">Hjælp</translation>
<translation id="3050422059534974565">CAPS LOCK er slået til.
@@ -179,22 +190,24 @@ Tryk på Søg eller Skift for at annullere.</translation>
<translation id="6692173217867674490">Ugyldig adgangssætning</translation>
<translation id="6165508094623778733">Flere oplysninger</translation>
<translation id="9046895021617826162">Forbindelsen mislykkedes</translation>
+<translation id="7168224885072002358">Fortryder og vender tilbage til den gamle opløsning om <ph name="TIMEOUT_SECONDS"/> sekunder.</translation>
<translation id="973896785707726617">Denne session afsluttes om <ph name="SESSION_TIME_REMAINING"/>. Du logges automatisk ud.</translation>
<translation id="8372369524088641025">Ugyldig WEP-nøgle</translation>
<translation id="6636709850131805001">Tilstanden genkendes ikke</translation>
<translation id="3573179567135747900">Skift tilbage til &quot;<ph name="FROM_LOCALE"/>&quot; (kræver genstart)</translation>
-<translation id="8103386449138765447">SMS-beskeder: <ph name="MESSAGE_COUNT"/></translation>
+<translation id="8103386449138765447">sms-beskeder: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google Drev-indstillinger...</translation>
-<translation id="1510238584712386396">Applikationsliste</translation>
<translation id="7209101170223508707">CAPS LOCK er slået til.
Tryk på Alt+Søg eller Skift for at annullere.</translation>
<translation id="8940956008527784070">Batteriniveauet er lavt (<ph name="PERCENTAGE"/> %)</translation>
+<translation id="4918086044614829423">Accepter</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> tilbage</translation>
<translation id="520760366042891468">Deler kontrollen over din skærm via Hangouts.</translation>
<translation id="8000066093800657092">Intet netværk</translation>
<translation id="4015692727874266537">Log ind på en anden konto...</translation>
<translation id="5941711191222866238">Minimer</translation>
<translation id="6911468394164995108">Find andre... </translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> t <ph name="MINUTE"/> m, indtil det er fuldt opladet</translation>
<translation id="6359806961507272919">Sms fra <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Mobilselskab</translation>
diff --git a/chromium/ash/strings/ash_strings_de.xtb b/chromium/ash/strings/ash_strings_de.xtb
index aed761ffbb5..b3c6f1b2f0f 100644
--- a/chromium/ash/strings/ash_strings_de.xtb
+++ b/chromium/ash/strings/ash_strings_de.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="de">
<translation id="3595596368722241419">Akku voll</translation>
-<translation id="5250713215130379958">Übersicht automatisch ausblenden</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> und <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Portal-Status</translation>
<translation id="30155388420722288">Überlaufschaltfläche</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth aktiviert</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> wurde zu <ph name="ROTATION"/> gedreht.</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth deaktiviert</translation>
+<translation id="7165320105431587207">Fehler beim Konfigurieren des Netzwerks</translation>
<translation id="3775358506042162758">Bei der Mehrfachanmeldung sind maximal drei Konten zulässig.</translation>
<translation id="370649949373421643">WLAN aktivieren</translation>
<translation id="3626281679859535460">Helligkeit</translation>
+<translation id="595202126637698455">Leistungsnachverfolgung aktiviert</translation>
<translation id="8054466585765276473">Akku-Laufzeit wird berechnet.</translation>
<translation id="7982789257301363584">Netzwerk</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Tastatur-Overlay</translation>
<translation id="4387004326333427325">Remoteablehnung des Authentifizierungszertifikats</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">Auflösung von <ph name="DISPLAY_NAME"/> wurde zu <ph name="RESOLUTION"/> geändert.</translation>
<translation id="6943836128787782965">HTTP-Abruf fehlgeschlagen</translation>
<translation id="2297568595583585744">Statusleiste</translation>
<translation id="1661867754829461514">PIN fehlt</translation>
@@ -34,39 +38,41 @@ Drücken Sie zum Wechseln Umschalt+Alt.</translation>
<translation id="2127372758936585790">Schwachstrom-Ladegerät</translation>
<translation id="3846575436967432996">Keine Netzwerkinformationen verfügbar</translation>
<translation id="3026237328237090306">Mobilfunk einrichten</translation>
+<translation id="5871632337994001636">Geräte verwalten...</translation>
<translation id="785750925697875037">Mobiles Konto aufrufen</translation>
<translation id="153454903766751181">Mobilfunkmodem wird initialisiert...</translation>
<translation id="4628814525959230255">Bildschirmfreigabe für <ph name="HELPER_NAME"/> über Hangouts</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> wurde gedreht.</translation>
<translation id="7864539943188674973">Bluetooth deaktivieren</translation>
<translation id="939252827960237676">Screenshot konnte nicht gespeichert werden.</translation>
<translation id="3126069444801937830">Zum Aktualisieren neu starten</translation>
<translation id="2268813581635650749">Alle abmelden</translation>
<translation id="735745346212279324">VPN-Verbindung getrennt</translation>
<translation id="7320906967354320621">Inaktiv</translation>
-<translation id="6303423059719347535">Akku ist zu <ph name="PERCENTAGE"/> % geladen.</translation>
<translation id="15373452373711364">Großer Cursor</translation>
-<translation id="2778346081696727092">Fehler beim Authentifizieren mit dem angegebenen Nutzernamen oder Passwort</translation>
<translation id="3294437725009624529">Gast</translation>
<translation id="8190698733819146287">Sprache und Eingabe anpassen...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Ablageposition</translation>
<translation id="2903907270192926896">Eingang</translation>
<translation id="8676770494376880701">Schwachstrom-Ladegerät angeschlossen</translation>
<translation id="7170041865419449892">Außerhalb des Bereichs</translation>
<translation id="4804818685124855865">Verbindung trennen</translation>
<translation id="2544853746127077729">Ablehnung des Authentifizierungszertifikats durch das Netzwerk</translation>
<translation id="5222676887888702881">Abmelden</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfiguration</translation>
<translation id="1272079795634619415">Stopp</translation>
<translation id="4957722034734105353">Weitere Informationen...</translation>
<translation id="2964193600955408481">WLAN deaktivieren</translation>
-<translation id="811680302244032017">Gerät hinzufügen...</translation>
<translation id="4279490309300973883">Spiegelung</translation>
+<translation id="7973962044839454485">Fehler bei PPP-Authentifizierung aufgrund eines falschen Nutzernamens oder Passworts</translation>
<translation id="2509468283778169019">Feststelltaste An</translation>
<translation id="3892641579809465218">Interne Anzeige</translation>
<translation id="7823564328645135659">Nach der Synchronisierung Ihrer Einstellungen wurde die Sprache von &quot;<ph name="FROM_LOCALE"/>&quot; in &quot;<ph name="TO_LOCALE"/>&quot; geändert.</translation>
<translation id="3368922792935385530">Verbunden</translation>
<translation id="8340999562596018839">Gesprochenes Feedback</translation>
<translation id="8654520615680304441">WLAN aktivieren...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Ihre Eingabemethode hat sich in <ph name="INPUT_METHOD_ID"/> geändert.
Drücken Sie zum Wechseln Umschalt+Alt.</translation>
<translation id="2562916301614567480">Privates Netzwerk</translation>
@@ -83,11 +89,12 @@ Drücken Sie zum Wechseln Umschalt+Alt.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/> % verbleibend</translation>
<translation id="9089416786594320554">Eingabemethoden</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/> %</translation>
+<translation id="2825619548187458965">Ablage</translation>
<translation id="2614835198358683673">Ihr Chromebook kann möglicherweise nicht geladen werden, während es eingeschaltet ist. Wir empfehlen die Verwendung des Originalladegeräts.</translation>
<translation id="1895658205118569222">Herunterfahren</translation>
<translation id="4430019312045809116">Lautstärke</translation>
+<translation id="8681498213689260554">Zum Aktualisieren Neustart und Powerwash durchführen</translation>
<translation id="4442424173763614572">DNS-Suche fehlgeschlagen</translation>
-<translation id="6356500677799115505">Akku ist vollständig geladen und wird noch geladen.</translation>
<translation id="7874779702599364982">Suche nach Mobilfunknetzen läuft...</translation>
<translation id="583281660410589416">Unbekannt</translation>
<translation id="1383876407941801731">Suche</translation>
@@ -96,7 +103,6 @@ Drücken Sie zum Wechseln Umschalt+Alt.</translation>
<translation id="2204305834655267233">Netzwerkinformationen</translation>
<translation id="1621499497873603021">Verbleibende Akku-Laufzeit: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Gastsitzung beenden</translation>
-<translation id="4471417012762451363">Akku ist zu <ph name="PERCENTAGE"/> % geladen und wird geladen.</translation>
<translation id="8308637677604853869">Vorheriges Menü</translation>
<translation id="4666297444214622512">Anmeldung in weiterem Konto nicht möglich</translation>
<translation id="1346748346194534595">Nach rechts</translation>
@@ -114,6 +120,7 @@ Zum Deaktivieren Strg+Alt+Z drücken</translation>
<translation id="6312403991423642364">Unbekannter Netzwerkfehler</translation>
<translation id="1467432559032391204">Nach links</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> wird aktiviert</translation>
<translation id="8814190375133053267">WLAN</translation>
<translation id="1398853756734560583">Vergrößern</translation>
@@ -123,7 +130,6 @@ Zum Deaktivieren Strg+Alt+Z drücken</translation>
<translation id="2727977024730340865">Das Gerät ist an ein Schwachstrom-Ladegerät angeschlossen. Möglicherweise kann der Akku nicht zuverlässig aufgeladen werden.</translation>
<translation id="3784455785234192852">Sperren</translation>
<translation id="2805756323405976993">Apps</translation>
-<translation id="8871072142849158571">Die Größe von <ph name="DISPLAY_NAME"/> wurde auf <ph name="RESOLUTION"/> angepasst.</translation>
<translation id="1512064327686280138">Aktivierungsfehler</translation>
<translation id="5097002363526479830">Fehler beim Herstellen einer Verbindung mit dem Netzwerk &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">WLAN ist deaktiviert.</translation>
@@ -131,6 +137,7 @@ Zum Deaktivieren Strg+Alt+Z drücken</translation>
<translation id="7052914147756339792">Hintergrund festlegen</translation>
<translation id="8678698760965522072">Online-Status</translation>
<translation id="2532589005999780174">Modus mit hohem Kontrast</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Interner Fehler</translation>
<translation id="3019353588588144572">Verbleibende Zeit, bis der Akku vollständig geladen ist: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Lupe</translation>
@@ -153,20 +160,24 @@ Servernachricht: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Sitzung beenden</translation>
<translation id="8454013096329229812">WLAN ist aktiviert.</translation>
<translation id="4872237917498892622">Alt+Such- oder Umschalttaste</translation>
+<translation id="9201131092683066720">Akku ist zu <ph name="PERCENTAGE"/> % geladen.</translation>
<translation id="2983818520079887040">Einstellungen...</translation>
+<translation id="1195412055398077112">Overscan</translation>
<translation id="1717216362413677834">Dock-Modus</translation>
+<translation id="112308213915226829">Ablage automatisch ausblenden</translation>
<translation id="8927026611342028580">Verbindung angefordert</translation>
<translation id="8300849813060516376">OTASP fehlgeschlagen</translation>
<translation id="2792498699870441125">Alt+Suchtaste</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> Datei(en) wird bzw. werden synchronisiert.</translation>
+<translation id="5958529069007801266">Betreuter Nutzer</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">Feststelltaste Aus</translation>
<translation id="6248847161401822652">Drücken Sie zum Beenden zweimal Steuerung-Shift-Q.</translation>
+<translation id="6785414152754474415">Akku ist zu <ph name="PERCENTAGE"/> % geladen und wird geladen.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Wird aktiviert...</translation>
+<translation id="4895488851634969361">Akku ist vollständig geladen.</translation>
<translation id="1391854757121130358">Sie haben möglicherweise Ihr mobiles Datenvolumen aufgebraucht.</translation>
-<translation id="5413208160176941586">Lokal verwalteter Nutzer</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Position der Übersicht</translation>
+<translation id="5947494881799873997">Rückgängig machen</translation>
<translation id="7593891976182323525">Such- oder Umschalttaste</translation>
<translation id="7649070708921625228">Hilfe</translation>
<translation id="3050422059534974565">Die Feststelltaste ist aktiviert.
@@ -179,22 +190,24 @@ Drücken Sie die Such- oder die Umschalttaste, um die Aktivierung aufzuheben.</t
<translation id="6692173217867674490">Ungültige Passphrase</translation>
<translation id="6165508094623778733">Weitere Informationen</translation>
<translation id="9046895021617826162">Verbindungsaufbau fehlgeschlagen</translation>
+<translation id="7168224885072002358">Alte Auflösung wird in <ph name="TIMEOUT_SECONDS"/> wiederhergestellt.</translation>
<translation id="973896785707726617">Die Sitzung wird in <ph name="SESSION_TIME_REMAINING"/> beendet. Sie werden dann automatisch abgemeldet.</translation>
<translation id="8372369524088641025">Ungültiger WEP-Schlüssel</translation>
<translation id="6636709850131805001">Unbekannter Status</translation>
<translation id="3573179567135747900">Zurücksetzen auf &quot;<ph name="FROM_LOCALE"/>&quot; (Neustart erforderlich)</translation>
<translation id="8103386449138765447">SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google Drive-Einstellungen...</translation>
-<translation id="1510238584712386396">Übersicht</translation>
<translation id="7209101170223508707">Die Feststelltaste ist aktiviert.
Drücken Sie Alt+Such- oder Umschalttaste, um die Aktivierung aufzuheben.</translation>
<translation id="8940956008527784070">Niedriger Akkustand (<ph name="PERCENTAGE"/> %)</translation>
+<translation id="4918086044614829423">Annehmen</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> verbleiben</translation>
<translation id="520760366042891468">Bildschirmfreigabe über Hangouts</translation>
<translation id="8000066093800657092">Nicht verbunden</translation>
<translation id="4015692727874266537">Anderes Konto anmelden...</translation>
<translation id="5941711191222866238">Verkleinern</translation>
<translation id="6911468394164995108">Andere Netzwerke...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">In <ph name="HOUR"/> Std. <ph name="MINUTE"/> Min. vollständig aufgeladen</translation>
<translation id="6359806961507272919">SMS von <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Mobilfunkanbieter</translation>
diff --git a/chromium/ash/strings/ash_strings_el.xtb b/chromium/ash/strings/ash_strings_el.xtb
index b088fb0ee51..a37b5bf5254 100644
--- a/chromium/ash/strings/ash_strings_el.xtb
+++ b/chromium/ash/strings/ash_strings_el.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="el">
<translation id="3595596368722241419">Μπαταρία πλήρης</translation>
-<translation id="5250713215130379958">Αυτόματη απόκρυψη της λειτουργίας εκκίνησης</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> και <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Κατάσταση πύλης</translation>
<translation id="30155388420722288">Κουμπί επιπρόσθετης ροής</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Το Bluetooth έχει ενεργοποιηθεί</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> περιστράφηκε σε <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Το Bluetooth έχει απενεργοποιηθεί</translation>
+<translation id="7165320105431587207">Αποτυχία διαμόρφωσης δικτύου</translation>
<translation id="3775358506042162758">Μπορείτε να συνδέεστε ταυτόχρονα με έως και τρεις λογαριασμούς.</translation>
<translation id="370649949373421643">Ενεργοποίηση Wi-Fi</translation>
<translation id="3626281679859535460">Φωτεινότητα</translation>
+<translation id="595202126637698455">Η παρακολούθηση απόδοσης έχει ενεργοποιηθεί</translation>
<translation id="8054466585765276473">Υπολογισμός χρόνου μπαταρίας που απομένει.</translation>
<translation id="7982789257301363584">Δίκτυο</translation>
<translation id="5565793151875479467">Διακομιστής μεσολάβησης...</translation>
<translation id="938582441709398163">Επικάλυψη πληκτρολογίου</translation>
<translation id="4387004326333427325">Το πιστοποιητικό ελέγχου ταυτότητας απορρίφθηκε απομακρυσμένα</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">Η ανάλυση <ph name="DISPLAY_NAME"/> άλλαξε σε <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Η λήψη HTTP απέτυχε</translation>
<translation id="2297568595583585744">Δίσκος κατάστασης</translation>
<translation id="1661867754829461514">Απουσιάζει το PIN </translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">Χαμηλή ισχύς φορτιστή</translation>
<translation id="3846575436967432996">Δεν υπάρχουν διαθέσιμες πληροφορίες δικτύου</translation>
<translation id="3026237328237090306">Ρύθμιση δεδομένων κινητής τηλεφωνίας</translation>
+<translation id="5871632337994001636">Διαχείριση συσκευών…</translation>
<translation id="785750925697875037">Προβολή λογαριασμού κινητής τηλεφωνίας</translation>
<translation id="153454903766751181">Εκκίνηση μόντεμ δικτύου κινητής τηλεφωνίας…</translation>
<translation id="4628814525959230255">Μοιράζεστε τον έλεγχο της οθόνης σας με το χρήστη <ph name="HELPER_NAME"/> μέσω του Hangouts.</translation>
-<translation id="8343941333792395995">Η οθόνη <ph name="DISPLAY_NAME"/> έχει περιστραφεί</translation>
<translation id="7864539943188674973">Απενεργοποίηση Bluetooth</translation>
<translation id="939252827960237676">Αποτυχία αποθήκευσης στιγμιότυπου οθόνης</translation>
<translation id="3126069444801937830">Επανεκκίνηση για ενημέρωση</translation>
<translation id="2268813581635650749">Αποσύνδεση όλων</translation>
<translation id="735745346212279324">Το VPN αποσυνδέθηκε</translation>
<translation id="7320906967354320621">Αδρανές</translation>
-<translation id="6303423059719347535">Η μπαταρία είναι πλήρης <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">Μεγάλος δείκτης ποντικιού</translation>
-<translation id="2778346081696727092">Δεν είναι δυνατός ο έλεγχος ταυτότητας με το όνομα χρήστη ή τον κωδικό πρόσβασης που παρέχεται</translation>
<translation id="3294437725009624529">Επισκέπτης</translation>
<translation id="8190698733819146287">Προσαρμογή γλωσσών και εισόδου...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Θέση ραφιού</translation>
<translation id="2903907270192926896">ΕΙΣΟΔΟΣ</translation>
<translation id="8676770494376880701">Ο συνδεδεμένος φορτιστής παρέχει χαμηλή ισχύ</translation>
<translation id="7170041865419449892">Εκτός εύρους τιμών</translation>
<translation id="4804818685124855865">Αποσύνδεση</translation>
<translation id="2544853746127077729">Το πιστοποιητικό ελέγχου ταυτότητας απορρίφθηκε από το δίκτυο</translation>
<translation id="5222676887888702881">Έξοδος</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Διαμόρφωση</translation>
<translation id="1272079795634619415">Διακοπή</translation>
<translation id="4957722034734105353">Μάθετε περισσότερα…</translation>
<translation id="2964193600955408481">Απενεργοποίηση Wi-Fi</translation>
-<translation id="811680302244032017">Προσθήκη συσκευής…</translation>
<translation id="4279490309300973883">Κατοπτρισμός</translation>
+<translation id="7973962044839454485">Αποτυχία ελέγχου ταυτότητας PPP λόγω εσφαλμένου ονόματος χρήστη ή κωδικού πρόσβασης</translation>
<translation id="2509468283778169019">Το CAPS LOCK είναι ενεργοποιημένο</translation>
<translation id="3892641579809465218">Εσωτερική οθόνη</translation>
<translation id="7823564328645135659">Η γλώσσα του άλλαξε από &quot;<ph name="FROM_LOCALE"/>&quot; σε &quot;<ph name="TO_LOCALE"/>&quot; μετά τον συγχρονισμό των ρυθμίσεών σας.</translation>
<translation id="3368922792935385530">Σε σύνδεση</translation>
<translation id="8340999562596018839">Προφορικά σχόλια</translation>
<translation id="8654520615680304441">Ενεργοποίηση Wi-Fi…</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Η μέθοδος εισαγωγής σας έχει αλλάξει σε <ph name="INPUT_METHOD_ID"/>.
Πατήστε Shift + Alt για εναλλαγή.</translation>
<translation id="2562916301614567480">Ιδιωτικό δίκτυο</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317">Υπολείπεται <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">Μέθοδοι εισαγωγής</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Ράφι</translation>
<translation id="2614835198358683673">Το Chromebook ενδέχεται να μη φορτίζει ενώ είναι ενεργοποιημένο. Χρησιμοποιήστε τον αυθεντικό φορτιστή.</translation>
<translation id="1895658205118569222">Τερματισμός λειτουργίας</translation>
<translation id="4430019312045809116">Ένταση</translation>
+<translation id="8681498213689260554">Επανεκκίνηση και Powerwash για ενημέρωση</translation>
<translation id="4442424173763614572">Η αναζήτηση DNS απέτυχε</translation>
-<translation id="6356500677799115505">Η μπαταρία είναι πλήρης και φορτίζει.</translation>
<translation id="7874779702599364982">Αναζήτηση για δίκτυα κινητής τηλεφωνίας…</translation>
<translation id="583281660410589416">Άγνωστο</translation>
<translation id="1383876407941801731">Αναζήτηση</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">Πληροφορίες δικτύου</translation>
<translation id="1621499497873603021">Χρόνος που απομένει μέχρι να αδειάσει η μπαταρία, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Έξοδος επισκέπτη</translation>
-<translation id="4471417012762451363">Η μπαταρία είναι πλήρης <ph name="PERCENTAGE"/>% και φορτίζει</translation>
<translation id="8308637677604853869">Προηγούμενο μενού</translation>
<translation id="4666297444214622512">Δεν είναι δυνατή η σύνδεση σε άλλο λογαριασμό.</translation>
<translation id="1346748346194534595">Δεξιά</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">Άγνωστο σφάλμα δικτύου</translation>
<translation id="1467432559032391204">Αριστερά</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Ενεργοποίηση <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Μεγιστοποίηση</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">Σύνδεση με φορτιστή χαμηλής ισχύος. Η φόρτιση της μπαταρίας ενδέχεται να μη γίνεται με αξιόπιστο τρόπο.</translation>
<translation id="3784455785234192852">Κλείδωμα</translation>
<translation id="2805756323405976993">Εφαρμογές</translation>
-<translation id="8871072142849158571">Η ανάλυση της οθόνης <ph name="DISPLAY_NAME"/> έχει αλλάξει σε <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Αποτυχία ενεργοποίησης</translation>
<translation id="5097002363526479830">Δεν ήταν δυνατή η σύνδεση στο δίκτυο '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Το Wi-Fi έχει απενεργοποιηθεί.</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">Ορισμός ταπετσαρίας...</translation>
<translation id="8678698760965522072">Κατάσταση &quot;Σε σύνδεση&quot;</translation>
<translation id="2532589005999780174">Λειτουργία υψηλής αντίθεσης</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Εσωτερικό σφάλμα</translation>
<translation id="3019353588588144572">Χρόνος που απομένει μέχρι να φορτιστεί πλήρως η μπαταρία, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Μεγεθυντής οθόνης</translation>
@@ -152,20 +159,24 @@
<translation id="7029814467594812963">Έξοδος από συνεδρία</translation>
<translation id="8454013096329229812">Το Wi-Fi έχει ενεργοποιηθεί.</translation>
<translation id="4872237917498892622">Alt+Search ή Shift</translation>
+<translation id="9201131092683066720">Η μπαταρία είναι πλήρης <ph name="PERCENTAGE"/>%.</translation>
<translation id="2983818520079887040">Ρυθμίσεις...</translation>
+<translation id="1195412055398077112">υπερσάρωση</translation>
<translation id="1717216362413677834">Λειτουργία Dock</translation>
+<translation id="112308213915226829">Αυτόματη απόκρυψη ραφιού</translation>
<translation id="8927026611342028580">Έχει υποβληθεί αίτημα σύνδεσης</translation>
<translation id="8300849813060516376">Αποτυχία OTASP</translation>
<translation id="2792498699870441125">Alt+Search</translation>
<translation id="8660803626959853127">Συγχρονισμός <ph name="COUNT"/> αρχείων</translation>
+<translation id="5958529069007801266">Εποπτευόμενος χρήστης</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">Το CAPS LOCK είναι απενεργοποιημένο</translation>
<translation id="6248847161401822652">Πατήστε Control Shift Q δύο φορές για έξοδο.</translation>
+<translation id="6785414152754474415">Η μπαταρία είναι πλήρης <ph name="PERCENTAGE"/>% και φορτίζει.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Ενεργοποίηση…</translation>
+<translation id="4895488851634969361">Η μπαταρία είναι πλήρης.</translation>
<translation id="1391854757121130358">Ενδέχεται να έχετε χρησιμοποιήσει το πρόγραμμά δεδομένων της κινητής τηλεφωνίας σας.</translation>
-<translation id="5413208160176941586">Χρήστης τοπικής διαχείρισης</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Θέση λειτουργίας εκκίνησης</translation>
+<translation id="5947494881799873997">Επαναφορά</translation>
<translation id="7593891976182323525">Search ή Shift</translation>
<translation id="7649070708921625228">Βοήθεια</translation>
<translation id="3050422059534974565">Το πλήκτρο CAPS LOCK έχει ενεργοποιηθεί.
@@ -178,22 +189,24 @@
<translation id="6692173217867674490">Εσφαλμένη κωδική φράση</translation>
<translation id="6165508094623778733">Μάθετε περισσότερα</translation>
<translation id="9046895021617826162">Η σύνδεση απέτυχε</translation>
+<translation id="7168224885072002358">Επαναφορά στην προηγούμενη ανάλυση σε <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Αυτή η περίοδος σύνδεσης θα λήξει αυτόματα σε <ph name="SESSION_TIME_REMAINING"/>. Θα αποσυνδεθείτε αυτόματα.</translation>
<translation id="8372369524088641025">Εσφαλμένο κλειδί WEP</translation>
<translation id="6636709850131805001">Μη αναγνωρίσιμη κατάσταση</translation>
<translation id="3573179567135747900">Αλλάξτε το πάλι σε &quot;<ph name="FROM_LOCALE"/>&quot; (απαιτείται επανεκκίνηση)</translation>
<translation id="8103386449138765447">Μηνύματα SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Ρυθμίσεις Google Drive...</translation>
-<translation id="1510238584712386396">Λειτουργία εκκίνησης</translation>
<translation id="7209101170223508707">Το πλήκτρο CAPS LOCK έχει ενεργοποιηθεί.
Πατήστε Alt+Search ή Shift για ακύρωση.</translation>
<translation id="8940956008527784070">Χαμηλή στάθμη μπαταρίας (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Αποδοχή</translation>
<translation id="5102001756192215136">Απομένουν <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Γίνεται κοινή χρήση της οθόνης σας μέσω Hangouts.</translation>
<translation id="8000066093800657092">Κανένα δίκτυο</translation>
<translation id="4015692727874266537">Σύνδεση σε άλλο λογαριασμό…</translation>
<translation id="5941711191222866238">Ελαχιστοποίηση</translation>
<translation id="6911468394164995108">Συμμετοχή σε άλλο…</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>ω <ph name="MINUTE"/>λ μέχρι να ολοκληρωθεί η φόρτιση</translation>
<translation id="6359806961507272919">SMS από <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Εταιρεία κινητής τηλεφωνίας</translation>
diff --git a/chromium/ash/strings/ash_strings_en-GB.xtb b/chromium/ash/strings/ash_strings_en-GB.xtb
index c0e1ded60ce..d873968f172 100644
--- a/chromium/ash/strings/ash_strings_en-GB.xtb
+++ b/chromium/ash/strings/ash_strings_en-GB.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="en-GB">
<translation id="3595596368722241419">Battery full</translation>
-<translation id="5250713215130379958">Auto-hide launcher</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> and <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Portal state</translation>
<translation id="30155388420722288">Overflow Button</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth enabled</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> was rotated to <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth disabled</translation>
+<translation id="7165320105431587207">Failed to configure network</translation>
<translation id="3775358506042162758">You can only have up to three accounts in multiple sign-in.</translation>
<translation id="370649949373421643">Enable Wi-Fi</translation>
<translation id="3626281679859535460">Brightness</translation>
+<translation id="595202126637698455">Performance tracing enabled</translation>
<translation id="8054466585765276473">Calculating battery time.</translation>
<translation id="7982789257301363584">Network</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Keyboard Overlay</translation>
<translation id="4387004326333427325">Authentication certificate rejected remotely</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> resolution was changed to <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP get failed</translation>
<translation id="2297568595583585744">Status tray</translation>
<translation id="1661867754829461514">PIN missing</translation>
@@ -34,39 +38,41 @@ Press Shift + Alt to switch.</translation>
<translation id="2127372758936585790">Low-power charger</translation>
<translation id="3846575436967432996">No network information available</translation>
<translation id="3026237328237090306">Set up mobile data</translation>
+<translation id="5871632337994001636">Manage devices...</translation>
<translation id="785750925697875037">View mobile account</translation>
<translation id="153454903766751181">Initialising mobile modem...</translation>
<translation id="4628814525959230255">Sharing control of your screen with <ph name="HELPER_NAME"/> via Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> has been rotated</translation>
<translation id="7864539943188674973">Disable Bluetooth</translation>
<translation id="939252827960237676">Failed to save screenshot</translation>
<translation id="3126069444801937830">Restart to update</translation>
<translation id="2268813581635650749">Sign out all</translation>
<translation id="735745346212279324">VPN disconnected</translation>
<translation id="7320906967354320621">Idle</translation>
-<translation id="6303423059719347535">Battery is <ph name="PERCENTAGE"/>% full</translation>
<translation id="15373452373711364">Large mouse cursor</translation>
-<translation id="2778346081696727092">Failed to authenticate with the provided username or password</translation>
<translation id="3294437725009624529">Guest</translation>
<translation id="8190698733819146287">Customise languages and input...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Shelf position</translation>
<translation id="2903907270192926896">INPUT</translation>
<translation id="8676770494376880701">Low-power charger connected</translation>
<translation id="7170041865419449892">Out of range</translation>
<translation id="4804818685124855865">Disconnect</translation>
<translation id="2544853746127077729">Authentication certificate rejected by network</translation>
<translation id="5222676887888702881">Sign out</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Configuration</translation>
<translation id="1272079795634619415">Stop</translation>
<translation id="4957722034734105353">Learn more...</translation>
<translation id="2964193600955408481">Disable Wi-Fi</translation>
-<translation id="811680302244032017">Add device ...</translation>
<translation id="4279490309300973883">Mirroring</translation>
+<translation id="7973962044839454485">PPP authentication failed due to an incorrect username or password</translation>
<translation id="2509468283778169019">CAPS LOCK is on</translation>
<translation id="3892641579809465218">Internal Display</translation>
<translation id="7823564328645135659">The language has changed from &quot;<ph name="FROM_LOCALE"/>&quot; to &quot;<ph name="TO_LOCALE"/>&quot; after syncing your settings.</translation>
<translation id="3368922792935385530">Connected</translation>
<translation id="8340999562596018839">Spoken feedback</translation>
<translation id="8654520615680304441">Turn Wi-Fi on...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Your input method has changed to <ph name="INPUT_METHOD_ID"/>.
Press Shift + Alt to switch.</translation>
<translation id="2562916301614567480">Private Network</translation>
@@ -83,11 +89,12 @@ Press Shift + Alt to switch.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% remaining</translation>
<translation id="9089416786594320554">Input methods</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Shelf</translation>
<translation id="2614835198358683673">Your Chromebook may not charge while it is turned on. Consider using the official charger.</translation>
<translation id="1895658205118569222">Shutdown</translation>
<translation id="4430019312045809116">volume</translation>
+<translation id="8681498213689260554">Restart and Powerwash to update</translation>
<translation id="4442424173763614572">DNS lookup failed</translation>
-<translation id="6356500677799115505">Battery is full and charging.</translation>
<translation id="7874779702599364982">Searching for cellular networks...</translation>
<translation id="583281660410589416">Unknown</translation>
<translation id="1383876407941801731">Search</translation>
@@ -96,7 +103,6 @@ Press Shift + Alt to switch.</translation>
<translation id="2204305834655267233">Network Info</translation>
<translation id="1621499497873603021">Time left until battery is empty, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Exit guest</translation>
-<translation id="4471417012762451363">Battery is <ph name="PERCENTAGE"/>% full and charging</translation>
<translation id="8308637677604853869">Previous menu</translation>
<translation id="4666297444214622512">Can't sign into another account.</translation>
<translation id="1346748346194534595">Right</translation>
@@ -114,6 +120,7 @@ Press Ctrl+Alt+Z to disable.</translation>
<translation id="6312403991423642364">Unknown network error</translation>
<translation id="1467432559032391204">Left</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Activating <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maximise</translation>
@@ -123,7 +130,6 @@ Press Ctrl+Alt+Z to disable.</translation>
<translation id="2727977024730340865">Plugged in to a low-power charger. Battery charging may not be reliable.</translation>
<translation id="3784455785234192852">Lock</translation>
<translation id="2805756323405976993">Apps</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> has been resized to <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Activation failure</translation>
<translation id="5097002363526479830">Failed to connect to the network '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi is turned off.</translation>
@@ -131,6 +137,7 @@ Press Ctrl+Alt+Z to disable.</translation>
<translation id="7052914147756339792">Set wallpaper...</translation>
<translation id="8678698760965522072">Online state</translation>
<translation id="2532589005999780174">High contrast mode</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Internal error</translation>
<translation id="3019353588588144572">Time remaining until battery is fully charged, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Screen magnifier</translation>
@@ -153,20 +160,24 @@ Server message: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Exit session</translation>
<translation id="8454013096329229812">Wi-Fi is turned on.</translation>
<translation id="4872237917498892622">Alt+Search or Shift</translation>
+<translation id="9201131092683066720">Battery is <ph name="PERCENTAGE"/>% full.</translation>
<translation id="2983818520079887040">Settings...</translation>
+<translation id="1195412055398077112">overscan</translation>
<translation id="1717216362413677834">Dock mode</translation>
+<translation id="112308213915226829">Autohide shelf</translation>
<translation id="8927026611342028580">Connect Requested</translation>
<translation id="8300849813060516376">OTASP failed</translation>
<translation id="2792498699870441125">Alt+Search</translation>
<translation id="8660803626959853127">Syncing <ph name="COUNT"/> file(s)</translation>
+<translation id="5958529069007801266">Supervised user</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK is off</translation>
<translation id="6248847161401822652">Press Control Shift Q twice to exit.</translation>
+<translation id="6785414152754474415">Battery is <ph name="PERCENTAGE"/>% full and charging.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Activating...</translation>
+<translation id="4895488851634969361">Battery is full.</translation>
<translation id="1391854757121130358">You may have used up your mobile data allowance.</translation>
-<translation id="5413208160176941586">Locally managed user</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Launcher position</translation>
+<translation id="5947494881799873997">Revert</translation>
<translation id="7593891976182323525">Search or Shift</translation>
<translation id="7649070708921625228">Help</translation>
<translation id="3050422059534974565">CAPS LOCK is on.
@@ -179,22 +190,24 @@ Press Search or Shift to cancel.</translation>
<translation id="6692173217867674490">Bad passphrase</translation>
<translation id="6165508094623778733">Learn more</translation>
<translation id="9046895021617826162">Connection failed</translation>
+<translation id="7168224885072002358">Reverting to old resolution in <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">This session will end in <ph name="SESSION_TIME_REMAINING"/>. You will be automatically signed out.</translation>
<translation id="8372369524088641025">Bad WEP key</translation>
<translation id="6636709850131805001">Unrecognised state</translation>
<translation id="3573179567135747900">Change back to &quot;<ph name="FROM_LOCALE"/>&quot; (requires restart)</translation>
<translation id="8103386449138765447">SMS messages: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google Drive settings</translation>
-<translation id="1510238584712386396">Launcher</translation>
<translation id="7209101170223508707">CAPS LOCK is on.
Press Alt+Search or Shift to cancel.</translation>
<translation id="8940956008527784070">Battery low (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Accept</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> left</translation>
<translation id="520760366042891468">Sharing control of your screen via Hangouts.</translation>
<translation id="8000066093800657092">No network</translation>
<translation id="4015692727874266537">Sign in another account...</translation>
<translation id="5941711191222866238">Minimise</translation>
<translation id="6911468394164995108">Join other ...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>h <ph name="MINUTE"/>m until full</translation>
<translation id="6359806961507272919">SMS from <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operator</translation>
diff --git a/chromium/ash/strings/ash_strings_es-419.xtb b/chromium/ash/strings/ash_strings_es-419.xtb
index b752b8e297c..5a285041447 100644
--- a/chromium/ash/strings/ash_strings_es-419.xtb
+++ b/chromium/ash/strings/ash_strings_es-419.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="es-419">
<translation id="3595596368722241419">Batería completa</translation>
-<translation id="5250713215130379958">Ocultar automáticamente la barra de aplicaciones</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> y <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Estado de portal</translation>
<translation id="30155388420722288">Botón de desbordamiento</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth activado</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> se giró a <ph name="ROTATION"/>.</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth desactivado</translation>
+<translation id="7165320105431587207">Error al configurar la red</translation>
<translation id="3775358506042162758">Solo puedes tener un máximo de tres cuentas en un acceso múltiple.</translation>
<translation id="370649949373421643">Habilitar Wi-Fi</translation>
<translation id="3626281679859535460">Brillo</translation>
+<translation id="595202126637698455">Seguimiento de rendimiento habilitado</translation>
<translation id="8054466585765276473">Calculando duración de la batería...</translation>
<translation id="7982789257301363584">Red</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Superposición del teclado</translation>
<translation id="4387004326333427325">Certificado de autenticación rechazado de forma remota</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">La resolución de <ph name="DISPLAY_NAME"/> se cambió por <ph name="RESOLUTION"/>.</translation>
<translation id="6943836128787782965">Error al obtener HTTP</translation>
<translation id="2297568595583585744">Bandeja de estado</translation>
<translation id="1661867754829461514">Falta el número de PIN </translation>
@@ -34,39 +38,41 @@ Para cambiarlo, presiona Shift + Alt.</translation>
<translation id="2127372758936585790">Cargador de baja potencia</translation>
<translation id="3846575436967432996">No hay información de red disponible.</translation>
<translation id="3026237328237090306">Configurar datos de dispositivos móviles</translation>
+<translation id="5871632337994001636">Administrar dispositivos…</translation>
<translation id="785750925697875037">Ver cuenta móvil</translation>
<translation id="153454903766751181">Iniciando módem celular...</translation>
<translation id="4628814525959230255">Compartir el control de la pantalla con <ph name="HELPER_NAME"/> a través de Hangouts</translation>
-<translation id="8343941333792395995">Se rotó <ph name="DISPLAY_NAME"/>.</translation>
<translation id="7864539943188674973">Desactivar Bluetooth</translation>
<translation id="939252827960237676">No se pudo guardar la captura de pantalla.</translation>
<translation id="3126069444801937830">Reinicia para actualizar.</translation>
<translation id="2268813581635650749">Salir de todo</translation>
<translation id="735745346212279324">VPN desconectada</translation>
<translation id="7320906967354320621">Inactivo</translation>
-<translation id="6303423059719347535"><ph name="PERCENTAGE"/>% de batería</translation>
<translation id="15373452373711364">Cursor del mouse grande</translation>
-<translation id="2778346081696727092">Error al autenticar con el nombre de usuario o la contraseña proporcionados.</translation>
<translation id="3294437725009624529">Invitado</translation>
<translation id="8190698733819146287">Personalizar idiomas y la entrada de datos</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Posición de la biblioteca</translation>
<translation id="2903907270192926896">ENTRADA</translation>
<translation id="8676770494376880701">Cargador de baja potencia conectado</translation>
<translation id="7170041865419449892">Fuera de alcance</translation>
<translation id="4804818685124855865">Desconectar</translation>
<translation id="2544853746127077729">Certificado de autenticación rechazado por la red</translation>
<translation id="5222676887888702881">Salir</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Configuración</translation>
<translation id="1272079795634619415">Interrumpir</translation>
<translation id="4957722034734105353">Más información...</translation>
<translation id="2964193600955408481">Desactivar Wi-Fi</translation>
-<translation id="811680302244032017">Agregar dispositivo...</translation>
<translation id="4279490309300973883">Duplicando</translation>
+<translation id="7973962044839454485">Falló la autenticación de PPP debido a un nombre de usuario o una contraseña incorrectos.</translation>
<translation id="2509468283778169019">BLOQ MAYÚS está activado.</translation>
<translation id="3892641579809465218">Pantalla interna</translation>
<translation id="7823564328645135659">Después de sincronizar tu configuración, el idioma se cambió de &quot;<ph name="FROM_LOCALE"/>&quot; a &quot;<ph name="TO_LOCALE"/>&quot;.</translation>
<translation id="3368922792935385530">Conectado</translation>
<translation id="8340999562596018839">Comentarios por voz</translation>
<translation id="8654520615680304441">Encender Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Tu método de introducción cambió a <ph name="INPUT_METHOD_ID"/>.
Para cambiarlo, presiona Shift + Alt.</translation>
<translation id="2562916301614567480">Red privada</translation>
@@ -83,11 +89,12 @@ Para cambiarlo, presiona Shift + Alt.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% restante</translation>
<translation id="9089416786594320554">Métodos de entrada</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Biblioteca</translation>
<translation id="2614835198358683673">Es posible que tu Chromebook no se cargue mientras esté encendida. Te recomendamos que utilices el cargador oficial.</translation>
<translation id="1895658205118569222">Cierre</translation>
<translation id="4430019312045809116">Volumen</translation>
+<translation id="8681498213689260554">Reiniciar y aplicar Powerwash para actualizar</translation>
<translation id="4442424173763614572">Error al buscar DNS</translation>
-<translation id="6356500677799115505">Batería completa y cargando</translation>
<translation id="7874779702599364982">Buscando redes para celulares...</translation>
<translation id="583281660410589416">Desconocido</translation>
<translation id="1383876407941801731">Buscar</translation>
@@ -96,7 +103,6 @@ Para cambiarlo, presiona Shift + Alt.</translation>
<translation id="2204305834655267233">Información de red</translation>
<translation id="1621499497873603021">Tiempo restante hasta que se agote la batería: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Salir de la sesión de invitado</translation>
-<translation id="4471417012762451363"><ph name="PERCENTAGE"/>% de batería y cargando</translation>
<translation id="8308637677604853869">Menú anterior</translation>
<translation id="4666297444214622512">No puedes acceder a otra cuenta.</translation>
<translation id="1346748346194534595">Derecha</translation>
@@ -114,6 +120,7 @@ Para inhabilitar esta opción, presiona Ctrl+Alt+Z.</translation>
<translation id="6312403991423642364">Error de red desconocido</translation>
<translation id="1467432559032391204">Izquierda</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Activación de <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maximizar</translation>
@@ -123,7 +130,6 @@ Para inhabilitar esta opción, presiona Ctrl+Alt+Z.</translation>
<translation id="2727977024730340865">Conexión a un cargador de baja potencia. Es posible que la carga de la batería no sea confiable.</translation>
<translation id="3784455785234192852">Bloquear</translation>
<translation id="2805756323405976993">Aplicaciones</translation>
-<translation id="8871072142849158571">Se cambió la resolución de <ph name="DISPLAY_NAME"/> a <ph name="RESOLUTION"/>.</translation>
<translation id="1512064327686280138">Fallo en la activación</translation>
<translation id="5097002363526479830">Error al conectar a la red &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi desactivada</translation>
@@ -131,6 +137,7 @@ Para inhabilitar esta opción, presiona Ctrl+Alt+Z.</translation>
<translation id="7052914147756339792">Establecer fondo de pantalla...</translation>
<translation id="8678698760965522072">Estado en línea</translation>
<translation id="2532589005999780174">Modo de contraste alto</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Error interno</translation>
<translation id="3019353588588144572">Tiempo restante hasta que la batería esté completamente cargada: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Lupa</translation>
@@ -153,20 +160,24 @@ Mensaje del servidor: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Salir de la sesión</translation>
<translation id="8454013096329229812">Wi-Fi activada</translation>
<translation id="4872237917498892622">Alt+tecla de búsqueda o Mayús</translation>
+<translation id="9201131092683066720">La batería tiene un <ph name="PERCENTAGE"/> % de carga.</translation>
<translation id="2983818520079887040">Configuración...</translation>
+<translation id="1195412055398077112">desajuste de dimensiones</translation>
<translation id="1717216362413677834">Modo de conector</translation>
+<translation id="112308213915226829">Ocultar la biblioteca automáticamente</translation>
<translation id="8927026611342028580">Conexión solicitada</translation>
<translation id="8300849813060516376">OTASP falló</translation>
<translation id="2792498699870441125">Alt+tecla de búsqueda</translation>
<translation id="8660803626959853127">Sincronizando <ph name="COUNT"/> archivo(s)</translation>
+<translation id="5958529069007801266">Usuario supervisado</translation>
<translation id="3709443003275901162">Más de 9</translation>
<translation id="639644700271529076">El bloqueo de mayúsculas está desactivado.</translation>
<translation id="6248847161401822652">Presiona Control+Mayús+Q dos veces para salir.</translation>
+<translation id="6785414152754474415">La batería tiene un <ph name="PERCENTAGE"/> % de carga y se está cargando.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Activando...</translation>
+<translation id="4895488851634969361">La batería está completa.</translation>
<translation id="1391854757121130358">Es posible que hayas agotado tu cuota de datos móviles.</translation>
-<translation id="5413208160176941586">Usuario administrado de forma local</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Posición del selector</translation>
+<translation id="5947494881799873997">Revertir</translation>
<translation id="7593891976182323525">Tecla de búsqueda o Mayús</translation>
<translation id="7649070708921625228">Ayuda</translation>
<translation id="3050422059534974565">El BLOQUEO DE MAYÚSCULAS está activado.
@@ -179,22 +190,24 @@ Presiona Mayús o la tecla de búsqueda para cancelar la operación.</translatio
<translation id="6692173217867674490">Frase de contraseña no válida</translation>
<translation id="6165508094623778733">Más información</translation>
<translation id="9046895021617826162">No se pudo conectar</translation>
+<translation id="7168224885072002358">Se revertirá a la resolución anterior en <ph name="TIMEOUT_SECONDS"/>.</translation>
<translation id="973896785707726617">Esta sesión finalizará en <ph name="SESSION_TIME_REMAINING"/>. Saldrás automáticamente.</translation>
<translation id="8372369524088641025">Clave de WEP no válida</translation>
<translation id="6636709850131805001">Estado no reconocido</translation>
<translation id="3573179567135747900">Volver a &quot;<ph name="FROM_LOCALE"/>&quot; (debes reiniciar).</translation>
<translation id="8103386449138765447">Mensajes SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Configuración de Google Drive...</translation>
-<translation id="1510238584712386396">Selector</translation>
<translation id="7209101170223508707">El BLOQUEO DE MAYÚSCULAS está activado.
Presiona Alt y la tecla de búsqueda o Mayús para cancelar la operación.</translation>
<translation id="8940956008527784070">Batería baja (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Aceptar</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> restante</translation>
<translation id="520760366042891468">Compartir el control de la pantalla a través de Hangouts</translation>
<translation id="8000066093800657092">Sin red</translation>
<translation id="4015692727874266537">Acceder a otra cuenta</translation>
<translation id="5941711191222866238">Minimizar</translation>
<translation id="6911468394164995108">Conectarte a otra red...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>h <ph name="MINUTE"/>min para completar la carga</translation>
<translation id="6359806961507272919">SMS de <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Proveedor de servicio celular</translation>
diff --git a/chromium/ash/strings/ash_strings_es.xtb b/chromium/ash/strings/ash_strings_es.xtb
index d3cc029c9b8..e69bab48c06 100644
--- a/chromium/ash/strings/ash_strings_es.xtb
+++ b/chromium/ash/strings/ash_strings_es.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="es">
<translation id="3595596368722241419">Batería al máximo</translation>
-<translation id="5250713215130379958">Ocultar automáticamente la barra de aplicaciones</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> y <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Conectado vía portal</translation>
<translation id="30155388420722288">Botón de flujo excesivo</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth habilitado</translation>
+<translation id="6310121235600822547">Se ha modificado la rotación de <ph name="DISPLAY_NAME"/> a <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth inhabilitado</translation>
+<translation id="7165320105431587207">Error al configurar la red</translation>
<translation id="3775358506042162758">Solo puedes utilizar un máximo de tres cuentas en el inicio de sesión múltiple.</translation>
<translation id="370649949373421643">Habilitar Wi-Fi</translation>
<translation id="3626281679859535460">Brillo</translation>
+<translation id="595202126637698455">Se ha habilitado el control del rendimiento</translation>
<translation id="8054466585765276473">Calculando duración de la batería...</translation>
<translation id="7982789257301363584">Red</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Superposición de teclado</translation>
<translation id="4387004326333427325">Certificado de autenticación rechazado de forma remota</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">Se ha modificado la resolución de <ph name="DISPLAY_NAME"/> a <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Error al obtener HTTP</translation>
<translation id="2297568595583585744">Bandeja de estado</translation>
<translation id="1661867754829461514">Falta el PIN.</translation>
@@ -34,39 +38,41 @@ Para cambiarlo, pulsa Mayús + Alt.</translation>
<translation id="2127372758936585790">Cargador de baja potencia</translation>
<translation id="3846575436967432996">No hay información de red disponible.</translation>
<translation id="3026237328237090306">Configurar datos móviles</translation>
+<translation id="5871632337994001636">Administrar dispositivos...</translation>
<translation id="785750925697875037">Ver cuenta móvil</translation>
<translation id="153454903766751181">Iniciando módem móvil...</translation>
<translation id="4628814525959230255">Comparte el control de tu pantalla con <ph name="HELPER_NAME"/> a través de Hangouts.</translation>
-<translation id="8343941333792395995">Se ha girado <ph name="DISPLAY_NAME"/></translation>
<translation id="7864539943188674973">Inhabilitar Bluetooth</translation>
<translation id="939252827960237676">Error al guardar captura de pantalla</translation>
<translation id="3126069444801937830">Reinicia el sistema para actualizarlo.</translation>
<translation id="2268813581635650749">Cerrar todas las sesiones</translation>
<translation id="735745346212279324">VPN desconectada</translation>
<translation id="7320906967354320621">Inactiva</translation>
-<translation id="6303423059719347535"><ph name="PERCENTAGE"/>% de batería</translation>
<translation id="15373452373711364">Cursor del ratón grande</translation>
-<translation id="2778346081696727092">Se ha producido un error al autenticar la contraseña o el nombre de usuario proporcionados.</translation>
<translation id="3294437725009624529">Invitado</translation>
<translation id="8190698733819146287">Personalizar idiomas...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Posición de la estantería</translation>
<translation id="2903907270192926896">ENTRADA</translation>
<translation id="8676770494376880701">Cargador de baja potencia conectado</translation>
<translation id="7170041865419449892">Fuera del alcance</translation>
<translation id="4804818685124855865">Desvincular</translation>
<translation id="2544853746127077729">Certificado de autenticación rechazado por la red</translation>
<translation id="5222676887888702881">Cerrar sesión</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Configuración</translation>
<translation id="1272079795634619415">Interrumpir</translation>
<translation id="4957722034734105353">Más información...</translation>
<translation id="2964193600955408481">Inhabilitar Wi-Fi</translation>
-<translation id="811680302244032017">Añadir dispositivo...</translation>
<translation id="4279490309300973883">Duplicando</translation>
+<translation id="7973962044839454485">Se ha producido un error en la autenticación de PPP porque la contraseña o el nombre de usuario son incorrectos</translation>
<translation id="2509468283778169019">Bloqueo de mayúsculas activado</translation>
<translation id="3892641579809465218">Pantalla interna</translation>
<translation id="7823564328645135659">El idioma ha cambiado de &quot;<ph name="FROM_LOCALE"/>&quot; a &quot;<ph name="TO_LOCALE"/>&quot; después de sincronizar tu configuración.</translation>
<translation id="3368922792935385530">Con conexión</translation>
<translation id="8340999562596018839">Mensajes de voz</translation>
<translation id="8654520615680304441">Activar Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Tu método de entrada ha cambiado a <ph name="INPUT_METHOD_ID"/>.
Para cambiarlo, pulsa Mayús + Alt.</translation>
<translation id="2562916301614567480">Red privada</translation>
@@ -83,11 +89,12 @@ Para cambiarlo, pulsa Mayús + Alt.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% restante</translation>
<translation id="9089416786594320554">Métodos de entrada</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Estantería</translation>
<translation id="2614835198358683673">Es posible que tu Chromebook no se cargue mientras esté activado. Te recomendamos que utilices el cargador oficial.</translation>
<translation id="1895658205118569222">Cierre del navegador</translation>
<translation id="4430019312045809116">Volumen</translation>
+<translation id="8681498213689260554">Reinicia y aplica la función de Powerwash para actualizar el sistema</translation>
<translation id="4442424173763614572">Error al buscar DNS</translation>
-<translation id="6356500677799115505">Batería completa y cargándose</translation>
<translation id="7874779702599364982">Buscando redes móviles...</translation>
<translation id="583281660410589416">Desconocido</translation>
<translation id="1383876407941801731">Búsqueda</translation>
@@ -96,7 +103,6 @@ Para cambiarlo, pulsa Mayús + Alt.</translation>
<translation id="2204305834655267233">Información de red</translation>
<translation id="1621499497873603021">Tiempo restante hasta que se agote la batería: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Salir de la sesión de invitado</translation>
-<translation id="4471417012762451363"><ph name="PERCENTAGE"/>% de batería y cargándose</translation>
<translation id="8308637677604853869">Menú anterior</translation>
<translation id="4666297444214622512">No puedo iniciar sesión con otra cuenta.</translation>
<translation id="1346748346194534595">Derecha</translation>
@@ -114,6 +120,7 @@ Para inhabilitar esta opción, pulsa Ctrl+Alt+Z.</translation>
<translation id="6312403991423642364">Error desconocido de red</translation>
<translation id="1467432559032391204">Izquierda</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Activación de <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maximizar</translation>
@@ -123,7 +130,6 @@ Para inhabilitar esta opción, pulsa Ctrl+Alt+Z.</translation>
<translation id="2727977024730340865">Conectado a un cargador de baja potencia. Es posible que la carga de la batería no sea fiable.</translation>
<translation id="3784455785234192852">Bloquear</translation>
<translation id="2805756323405976993">Aplicaciones</translation>
-<translation id="8871072142849158571">Se ha cambiado la resolución de <ph name="DISPLAY_NAME"/> a <ph name="RESOLUTION"/>.</translation>
<translation id="1512064327686280138">Error de activación</translation>
<translation id="5097002363526479830">Error al establecer conexión con la red &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">La conexión Wi-Fi está desactivada.</translation>
@@ -131,6 +137,7 @@ Para inhabilitar esta opción, pulsa Ctrl+Alt+Z.</translation>
<translation id="7052914147756339792">Establecer fondo de pantalla...</translation>
<translation id="8678698760965522072">Estado online</translation>
<translation id="2532589005999780174">Modo de contraste alto</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Error interno</translation>
<translation id="3019353588588144572">Tiempo restante hasta que se cargue la batería por completo: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Lupa</translation>
@@ -153,20 +160,24 @@ Mensaje del servidor: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Cerrar sesión</translation>
<translation id="8454013096329229812">La conexión Wi-Fi está activada.</translation>
<translation id="4872237917498892622">Alt+tecla de búsqueda o Mayús</translation>
+<translation id="9201131092683066720">La batería está al <ph name="PERCENTAGE"/>%.</translation>
<translation id="2983818520079887040">Configuración...</translation>
+<translation id="1195412055398077112">reajustar</translation>
<translation id="1717216362413677834">Modo de conector</translation>
+<translation id="112308213915226829">Ocultar automáticamente estantería</translation>
<translation id="8927026611342028580">Conexión solicitada</translation>
<translation id="8300849813060516376">Error de OTASP</translation>
<translation id="2792498699870441125">Alt+tecla de búsqueda</translation>
<translation id="8660803626959853127">Sincronizando <ph name="COUNT"/> archivo(s)</translation>
+<translation id="5958529069007801266">Usuario supervisado</translation>
<translation id="3709443003275901162">+9</translation>
<translation id="639644700271529076">Bloqueo de mayúsculas desactivado</translation>
<translation id="6248847161401822652">Pulsa Ctrl+Mayús+Q dos veces para salir.</translation>
+<translation id="6785414152754474415">La batería se está cargando y está al <ph name="PERCENTAGE"/>%.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Activando...</translation>
+<translation id="4895488851634969361">La batería está llena.</translation>
<translation id="1391854757121130358">Es posible que hayas agotado los datos de tu plan de datos móviles.</translation>
-<translation id="5413208160176941586">Usuario administrado de forma local</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Posición de la barra de aplicaciones</translation>
+<translation id="5947494881799873997">Deshacer</translation>
<translation id="7593891976182323525">Tecla de búsqueda o Mayús</translation>
<translation id="7649070708921625228">Ayuda</translation>
<translation id="3050422059534974565">El BLOQUEO DE MAYÚSCULAS está activado.
@@ -179,22 +190,24 @@ Pulsa Mayús o la tecla de búsqueda para cancelar la operación.</translation>
<translation id="6692173217867674490">Frase de contraseña incorrecta</translation>
<translation id="6165508094623778733">Más información</translation>
<translation id="9046895021617826162">Error de conexión</translation>
+<translation id="7168224885072002358">Restableciendo la resolución anterior en <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Esta sesión finalizará en <ph name="SESSION_TIME_REMAINING"/>. La sesión se cerrará automáticamente.</translation>
<translation id="8372369524088641025">Clave WEP incorrecta</translation>
<translation id="6636709850131805001">Estado desconocido</translation>
<translation id="3573179567135747900">Cambiar de nuevo por &quot;<ph name="FROM_LOCALE"/>&quot; (requiere reiniciar)</translation>
<translation id="8103386449138765447">Mensajes SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Configuración de Google Drive...</translation>
-<translation id="1510238584712386396">Menú de aplicaciones</translation>
<translation id="7209101170223508707">El BLOQUEO DE MAYÚSCULAS está activado.
Pulsa Alt y la tecla de búsqueda o Mayús para cancelar la operación.</translation>
<translation id="8940956008527784070">Poca batería (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Aceptar</translation>
<translation id="5102001756192215136">Queda para <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Comparte el control de tu pantalla a través de Hangouts.</translation>
<translation id="8000066093800657092">Ninguna red</translation>
<translation id="4015692727874266537">Inicia sesión con otra cuenta...</translation>
<translation id="5941711191222866238">Minimizar</translation>
<translation id="6911468394164995108">Conectarse a otra red...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> h y <ph name="MINUTE"/> min para completar la carga</translation>
<translation id="6359806961507272919">SMS de <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operador</translation>
diff --git a/chromium/ash/strings/ash_strings_et.xtb b/chromium/ash/strings/ash_strings_et.xtb
index 67871d1640a..6588f0e92c0 100644
--- a/chromium/ash/strings/ash_strings_et.xtb
+++ b/chromium/ash/strings/ash_strings_et.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="et">
<translation id="3595596368722241419">Aku on täis</translation>
-<translation id="5250713215130379958">Peida käiviti automaatselt</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> ja <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Portaali olek</translation>
<translation id="30155388420722288">Ülevoolunupp</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth on lubatud</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> vahetati valikule <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth on keelatud</translation>
+<translation id="7165320105431587207">Võrgu seadistamine ebaõnnestus</translation>
<translation id="3775358506042162758">Saate korraga sisse logida kuni kolmele kontole.</translation>
<translation id="370649949373421643">Luba WiFi</translation>
<translation id="3626281679859535460">Eredus</translation>
+<translation id="595202126637698455">Toimivuse jälgimine on lubatud</translation>
<translation id="8054466585765276473">Aku tööaja arvutamine.</translation>
<translation id="7982789257301363584">Võrk</translation>
<translation id="5565793151875479467">Puhverserver ...</translation>
<translation id="938582441709398163">Klaviatuuri ülekate</translation>
<translation id="4387004326333427325">Autentimissertifikaat lükati kaugühenduse kaudu tagasi</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">Ekraani <ph name="DISPLAY_NAME"/> eraldusvõimeks määrati <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP hankimine nurjus</translation>
<translation id="2297568595583585744">Olekusalv</translation>
<translation id="1661867754829461514">PIN-kood puudub</translation>
@@ -34,39 +38,41 @@ Selle muutmiseks vajutage klahve Tõstuklahv + Alt.</translation>
<translation id="2127372758936585790">Väikese energiakuluga laadija</translation>
<translation id="3846575436967432996">Võrguteave ei ole saadaval</translation>
<translation id="3026237328237090306">Seadista mobiilne andmeside</translation>
+<translation id="5871632337994001636">Seadmete haldamine ...</translation>
<translation id="785750925697875037">Kuva mobiilikonto</translation>
<translation id="153454903766751181">Mobiilimodemi lähtestamine ...</translation>
<translation id="4628814525959230255">Teie ekraani juhtimist jagatakse Hangoutsi kaudu kasutajaga <ph name="HELPER_NAME"/>.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> on pööratud</translation>
<translation id="7864539943188674973">Keela Bluetooth</translation>
<translation id="939252827960237676">Ekraanipilti ei õnnestunud salvestada</translation>
<translation id="3126069444801937830">Taaskäivitage värskendamiseks</translation>
<translation id="2268813581635650749">Logi kõik kasutajad välja</translation>
<translation id="735745346212279324">VPN-i ühendus on katkestatud</translation>
<translation id="7320906967354320621">Tegevusetu</translation>
-<translation id="6303423059719347535">Aku on <ph name="PERCENTAGE"/>% täis</translation>
<translation id="15373452373711364">Suur hiirekursor</translation>
-<translation id="2778346081696727092">Autentimine esitatud kasutajanime või parooliga ebaõnnestus</translation>
<translation id="3294437725009624529">Külaline</translation>
<translation id="8190698733819146287">Keelte ja sisendi kohandamine...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Riiuli positsioon</translation>
<translation id="2903907270192926896">SISEND</translation>
<translation id="8676770494376880701">Väikese energiakuluga laadija on ühendatud</translation>
<translation id="7170041865419449892">Vahemikust väljas</translation>
<translation id="4804818685124855865">Katkesta ühendus</translation>
<translation id="2544853746127077729">Võrk lükkas autentimissertifikaadi tagasi</translation>
<translation id="5222676887888702881">Logi välja</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfigureerimine</translation>
<translation id="1272079795634619415">Peata</translation>
<translation id="4957722034734105353">Lisateave ...</translation>
<translation id="2964193600955408481">Keela WiFi</translation>
-<translation id="811680302244032017">Lisa seade ...</translation>
<translation id="4279490309300973883">Peegeldamine</translation>
+<translation id="7973962044839454485">PPP autentimine ebaõnnestus vale kasutajanime või parooli tõttu</translation>
<translation id="2509468283778169019">SUURTÄHELUKK on sisse lülitatud</translation>
<translation id="3892641579809465218">Sisemine kuva</translation>
<translation id="7823564328645135659">Pärast seadete sünkroonimist asendati <ph name="FROM_LOCALE"/> keel <ph name="TO_LOCALE"/> keelega.</translation>
<translation id="3368922792935385530">Ühendatud</translation>
<translation id="8340999562596018839">Suuline tagasiside</translation>
<translation id="8654520615680304441">Lülita WiFi sisse ...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Teie sisestusmeetod on nüüd <ph name="INPUT_METHOD_ID"/>.
Selle muutmiseks vajutage klahve Tõstuklahv + Alt.</translation>
<translation id="2562916301614567480">Privaatvõrk</translation>
@@ -83,11 +89,12 @@ Selle muutmiseks vajutage klahve Tõstuklahv + Alt.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% on jäänud</translation>
<translation id="9089416786594320554">Sisestusviisid</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Riiul</translation>
<translation id="2614835198358683673">Teie Chromebooki ei pruugita laadida, kui see on sisse lülitatud. Kaaluge ametliku laadija kasutamist.</translation>
<translation id="1895658205118569222">Sulgemine</translation>
<translation id="4430019312045809116">Helitugevus</translation>
+<translation id="8681498213689260554">Värskendamiseks tuleb arvuti taaskäivitada ja teha Powerwash</translation>
<translation id="4442424173763614572">DNS-i otsing nurjus</translation>
-<translation id="6356500677799115505">Aku on täis ja seda laetakse.</translation>
<translation id="7874779702599364982">Mobiilsidevõrkude otsimine ...</translation>
<translation id="583281660410589416">Tundmatu</translation>
<translation id="1383876407941801731">Otsing</translation>
@@ -96,7 +103,6 @@ Selle muutmiseks vajutage klahve Tõstuklahv + Alt.</translation>
<translation id="2204305834655267233">Võrguteave</translation>
<translation id="1621499497873603021">Aku tühjenemiseni on aega <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Välju külastajaseansist</translation>
-<translation id="4471417012762451363">Aku on <ph name="PERCENTAGE"/>% täis ja seda laetakse</translation>
<translation id="8308637677604853869">Eelmine menüü</translation>
<translation id="4666297444214622512">Teisele kontole ei saa sisse logida.</translation>
<translation id="1346748346194534595">Paremale</translation>
@@ -114,6 +120,7 @@ Keelamiseks vajutage klahvikombinatsiooni Ctrl+Alt+Z.</translation>
<translation id="6312403991423642364">Tundmatu võrguviga</translation>
<translation id="1467432559032391204">Vasakule</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Võrgu <ph name="NAME"/> aktiveerimine</translation>
<translation id="8814190375133053267">WiFi</translation>
<translation id="1398853756734560583">Maksimeeri</translation>
@@ -123,7 +130,6 @@ Keelamiseks vajutage klahvikombinatsiooni Ctrl+Alt+Z.</translation>
<translation id="2727977024730340865">Ühendatud väikese energiakuluga laadijaga. Aku laadimine võib olla ebastabiilne.</translation>
<translation id="3784455785234192852">Lukusta</translation>
<translation id="2805756323405976993">Rakendused</translation>
-<translation id="8871072142849158571">Kuva <ph name="DISPLAY_NAME"/> eraldusvõimeks valiti <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Aktiveerimise tõrge</translation>
<translation id="5097002363526479830">Võrguga „<ph name="NAME"/>” ühenduse loomine ebaõnnestus: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">WiFi on välja lülitatud.</translation>
@@ -131,6 +137,7 @@ Keelamiseks vajutage klahvikombinatsiooni Ctrl+Alt+Z.</translation>
<translation id="7052914147756339792">Määra taustapilt ...</translation>
<translation id="8678698760965522072">Võrguühenduse olek</translation>
<translation id="2532589005999780174">Suure kontrastsusega režiim</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Sisemine viga</translation>
<translation id="3019353588588144572">Aku täitumiseni on aega <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Ekraanisuurendi</translation>
@@ -153,20 +160,24 @@ Serveri teade: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Välju seansist</translation>
<translation id="8454013096329229812">WiFi on sisse lülitatud.</translation>
<translation id="4872237917498892622">Alt + otsinguklahv või tõstuklahv</translation>
+<translation id="9201131092683066720">Aku on <ph name="PERCENTAGE"/>% täis.</translation>
<translation id="2983818520079887040">Seaded...</translation>
+<translation id="1195412055398077112">liighälvitus</translation>
<translation id="1717216362413677834">Dokirežiim</translation>
+<translation id="112308213915226829">Riiuli automaatne peitmine</translation>
<translation id="8927026611342028580">Ühenduse taotlus</translation>
<translation id="8300849813060516376">OTASP nurjus</translation>
<translation id="2792498699870441125">Alt + otsinguklahv</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> faili sünkroonimine</translation>
+<translation id="5958529069007801266">Valvatav kasutaja</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">SUURTÄHELUKK on välja lülitatud</translation>
<translation id="6248847161401822652">Väljumiseks vajutage kaks korda klahvikombinatsiooni Ctrl + tõstuklahv + Q.</translation>
+<translation id="6785414152754474415">Aku on <ph name="PERCENTAGE"/>% täis ja seda laetakse.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: aktiveerimine ...</translation>
+<translation id="4895488851634969361">Aku on täis.</translation>
<translation id="1391854757121130358">Tundub, et olete oma mobiilse andmesidemahu ära kasutanud.</translation>
-<translation id="5413208160176941586">Kohalikult hallatud kasutaja</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Käiviti positsioon</translation>
+<translation id="5947494881799873997">Ennista</translation>
<translation id="7593891976182323525">Otsinguklahv või tõstuklahv</translation>
<translation id="7649070708921625228">Abi</translation>
<translation id="3050422059534974565">SUURTÄHELUKK on sisse lülitatud.
@@ -179,22 +190,24 @@ Tühistamiseks vajutage otsinguklahvi või tõstuklahvi</translation>
<translation id="6692173217867674490">Halb parool</translation>
<translation id="6165508094623778733">Lisateave</translation>
<translation id="9046895021617826162">Ühendamine nurjus</translation>
+<translation id="7168224885072002358">Ekraan ennistatakse vanale eraldusvõimele <ph name="TIMEOUT_SECONDS"/> pärast</translation>
<translation id="973896785707726617">Selle seansi lõpuni on jäänud <ph name="SESSION_TIME_REMAINING"/>. Teid logitakse automaatselt välja.</translation>
<translation id="8372369524088641025">Halb WEP-võti</translation>
<translation id="6636709850131805001">Tundmatu olek</translation>
<translation id="3573179567135747900">Muuda tagasi seadele <ph name="FROM_LOCALE"/> (nõuab taaskäivitust)</translation>
<translation id="8103386449138765447">SMS-id: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google Drive'i seaded ...</translation>
-<translation id="1510238584712386396">Käivitaja</translation>
<translation id="7209101170223508707">SUURTÄHELUKK on sisse lülitatud.
Tühistamiseks vajutage klahvikombinatsiooni Alt + otsinguklahv või tõstuklahv</translation>
<translation id="8940956008527784070">Aku tühjeneb (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Nõustu</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> alles</translation>
<translation id="520760366042891468">Teie ekraani juhtimist jagatakse Hangoutsi kaudu.</translation>
<translation id="8000066093800657092">Võrku pole</translation>
<translation id="4015692727874266537">Logige sisse teise kontoga ...</translation>
<translation id="5941711191222866238">Minimeeri</translation>
<translation id="6911468394164995108">Liitu muu võrguga ...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> h <ph name="MINUTE"/> min aku täitumiseni</translation>
<translation id="6359806961507272919">SMS numbrilt <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Mobiilioperaator</translation>
diff --git a/chromium/ash/strings/ash_strings_fa.xtb b/chromium/ash/strings/ash_strings_fa.xtb
index 9639c888882..0707e7b6fb0 100644
--- a/chromium/ash/strings/ash_strings_fa.xtb
+++ b/chromium/ash/strings/ash_strings_fa.xtb
@@ -2,23 +2,27 @@
<!DOCTYPE translationbundle>
<translationbundle lang="fa">
<translation id="3595596368722241419">باتری پر است</translation>
-<translation id="5250713215130379958">مخفی کردن خودکار راه انداز</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> و <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">وضعیت سایت</translation>
<translation id="30155388420722288">دکمه سرریز</translation>
+<translation id="8673028979667498656">‎۲۷۰°‎</translation>
<translation id="5571066253365925590">بلوتوث فعال شد</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> به <ph name="ROTATION"/> چرخانده شد</translation>
<translation id="9074739597929991885">بلوتوث</translation>
<translation id="2268130516524549846">بلوتوث غیرفعال است</translation>
+<translation id="7165320105431587207">پیکربندی شبکه انجام نشد</translation>
<translation id="3775358506042162758">در ورود چندگانه به سیستم حداکثر می‌توانید از سه حساب استفاده کنید.</translation>
-<translation id="370649949373421643">فعال کردن Wi-Fi</translation>
+<translation id="370649949373421643">‏فعال کردن Wi-Fi</translation>
<translation id="3626281679859535460">روشنایی</translation>
+<translation id="595202126637698455">ردیابی عملکرد فعال شد</translation>
<translation id="8054466585765276473">درحال محاسبه زمان شارژ باتری.</translation>
<translation id="7982789257301363584">شبکه</translation>
<translation id="5565793151875479467">پراکسی...</translation>
<translation id="938582441709398163">هم پوشانی صفحه‌کلید</translation>
<translation id="4387004326333427325">گواهینامه تأیید اعتبار، از راه دور، رد شد</translation>
<translation id="6979158407327259162">Google Drive</translation>
-<translation id="6943836128787782965">HTTP با خطا مواجه شد</translation>
+<translation id="3683428399328702079">وضوح <ph name="DISPLAY_NAME"/> به <ph name="RESOLUTION"/> تغییر یافت</translation>
+<translation id="6943836128787782965">‏HTTP با خطا مواجه شد</translation>
<translation id="2297568595583585744">سینی وضعیت</translation>
<translation id="1661867754829461514">پین جا افتاده</translation>
<translation id="4508225577814909926"><ph name="NAME"/>: در حال اتصال...</translation>
@@ -26,47 +30,49 @@
<translation id="2946640296642327832">فعال کردن بلوتوث</translation>
<translation id="6459472438155181876">گسترش صفحه به <ph name="DISPLAY_NAME"/></translation>
<translation id="8206859287963243715">سلولی</translation>
-<translation id="6596816719288285829">آدرس IP</translation>
+<translation id="6596816719288285829">‏آدرس IP</translation>
<translation id="4508265954913339219">فعالسازی انجام نشد</translation>
<translation id="3621712662352432595">تنظیمات صوتی</translation>
-<translation id="1812696562331527143">روش ورودی شما به <ph name="INPUT_METHOD_ID"/>*(<ph name="BEGIN_LINK"/>شخص ثالث<ph name="END_LINK"/>) تغییر یافت. Shift + Alt را برای تعویض فشار دهید.</translation>
+<translation id="1812696562331527143">‏روش ورودی شما به <ph name="INPUT_METHOD_ID"/>*(<ph name="BEGIN_LINK"/>شخص ثالث<ph name="END_LINK"/>) تغییر یافت. Shift + Alt را برای تعویض فشار دهید.</translation>
<translation id="2127372758936585790">شارژر برق ضعیف</translation>
<translation id="3846575436967432996">اطلاعات شبکه در دسترس نیست</translation>
<translation id="3026237328237090306">تنظیم اطلاعات تلفن همراه</translation>
+<translation id="5871632337994001636">مدیریت دستگاه‌ها...</translation>
<translation id="785750925697875037">مشاهده حساب تلفن همراه</translation>
<translation id="153454903766751181">در حال راه‌اندازی مودم سلولی...</translation>
-<translation id="4628814525959230255">اشتراک‌گذاری کنترل صفحه نمایش‌تان با <ph name="HELPER_NAME"/> از طریق Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> چرخانده شده است</translation>
+<translation id="4628814525959230255">‏اشتراک‌گذاری کنترل صفحه نمایش‌تان با <ph name="HELPER_NAME"/> از طریق Hangouts.</translation>
<translation id="7864539943188674973">غیرفعال کردن بلوتوث</translation>
<translation id="939252827960237676">عکس از صفحه نمایش ذخیره نشد</translation>
<translation id="3126069444801937830">راه‌اندازی مجدد برای به‌روزرسانی</translation>
<translation id="2268813581635650749">خروج همه از سیستم</translation>
-<translation id="735745346212279324">VPN قطع شد</translation>
+<translation id="735745346212279324">‏VPN قطع شد</translation>
<translation id="7320906967354320621">بدون فعالیت</translation>
-<translation id="6303423059719347535">باتری <ph name="PERCENTAGE"/> درصد پر است</translation>
<translation id="15373452373711364">نشانگر موشواره بزرگ</translation>
-<translation id="2778346081696727092">تأیید اعتبار با نام کاربری و گذرواژه ارائه شده انجام نشد</translation>
<translation id="3294437725009624529">مهمان</translation>
<translation id="8190698733819146287">سفارشی کردن زبان‌ها و ورودی...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">موقعیت قفسه</translation>
<translation id="2903907270192926896">ورودی</translation>
<translation id="8676770494376880701">شارژر برق متصل شده ضعیف است</translation>
<translation id="7170041865419449892">خارج از محدوده</translation>
<translation id="4804818685124855865">قطع اتصال</translation>
<translation id="2544853746127077729">گواهینامه تأیید اعتبار توسط شبکه رد شد</translation>
<translation id="5222676887888702881">خروج از سیستم</translation>
+<translation id="2391579633712104609">۱۸۰°</translation>
<translation id="2688477613306174402">پیکربندی</translation>
<translation id="1272079795634619415">توقف</translation>
<translation id="4957722034734105353">اطلاعات بیشتر...</translation>
-<translation id="2964193600955408481">غیرفعال کردن Wi-Fi</translation>
-<translation id="811680302244032017">افزودن دستگاه…</translation>
+<translation id="2964193600955408481">‏غیرفعال کردن Wi-Fi</translation>
<translation id="4279490309300973883">بازتاب می‌شود</translation>
-<translation id="2509468283778169019">CAPS LOCK روشن است</translation>
+<translation id="7973962044839454485">‏احراز هویت PPP به دلیل نام کاربری یا گذرواژه نادرست انجام نشد</translation>
+<translation id="2509468283778169019">‏CAPS LOCK روشن است</translation>
<translation id="3892641579809465218">صفحه نمایش داخلی</translation>
<translation id="7823564328645135659">بعد از همگام‌سازی تنظیمات شما، زبان از «<ph name="FROM_LOCALE"/>» به «<ph name="TO_LOCALE"/>» تغییر کرد.</translation>
<translation id="3368922792935385530">متصل</translation>
<translation id="8340999562596018839">بازخورد گفتاری</translation>
-<translation id="8654520615680304441">روشن کردن Wi-Fi در...</translation>
-<translation id="5825747213122829519">روش ورودی شما به <ph name="INPUT_METHOD_ID"/> تغییر یافت. Shift + Alt را برای تعویض فشار دهید.</translation>
+<translation id="8654520615680304441">‏روشن کردن Wi-Fi در...</translation>
+<translation id="8828714802988429505">۹۰°</translation>
+<translation id="5825747213122829519">‏روش ورودی شما به <ph name="INPUT_METHOD_ID"/> تغییر یافت. Shift + Alt را برای تعویض فشار دهید.</translation>
<translation id="2562916301614567480">شبکه خصوصی</translation>
<translation id="6549021752953852991">هیچ شبکه سلولی دردسترس نیست</translation>
<translation id="4379753398862151997">نمایشگر عزیز، ما برای هم ساخته نشده‌ایم. (این نمایشگر پشتیبانی نمی‌شود)</translation>
@@ -74,18 +80,19 @@
<translation id="3087734570205094154">پایین</translation>
<translation id="3742055079367172538">عکس از صفحه نمایش گرفته شد</translation>
<translation id="8878886163241303700">صفحه گسترش یافته است</translation>
-<translation id="5271016907025319479">VPN پیکربندی نشده است.</translation>
-<translation id="372094107052732682">برای خروج Ctrl+Shift+Q را دو بار فشار دهید.</translation>
+<translation id="5271016907025319479">‏VPN پیکربندی نشده است.</translation>
+<translation id="372094107052732682">‏برای خروج Ctrl+Shift+Q را دو بار فشار دهید.</translation>
<translation id="6803622936009808957">نمایش یک تصویر واحد در چند صفحه نمایش ممکن نیست زیرا وضوح تصویر پشتیبانی شده‌ای وجود ندارد. بجای آن حالت نمایش دسک‌تاپ چند بخشی استفاده می‌شود.</translation>
<translation id="1480041086352807611">حالت نمایش</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>٪ باقیمانده</translation>
<translation id="9089416786594320554">روش‌های ورودی</translation>
<translation id="6247708409970142803">%<ph name="PERCENTAGE"/></translation>
-<translation id="2614835198358683673">وقتی Chromebook روشن است ممکن است شارژ نشود. از شارژر مخصوص دستگاه استفاده کنید.</translation>
+<translation id="2825619548187458965">قفسه</translation>
+<translation id="2614835198358683673">‏وقتی Chromebook روشن است ممکن است شارژ نشود. از شارژر مخصوص دستگاه استفاده کنید.</translation>
<translation id="1895658205118569222">بسته شدن</translation>
<translation id="4430019312045809116">میزان صدا</translation>
-<translation id="4442424173763614572">جستجوی DNS انجام نشد</translation>
-<translation id="6356500677799115505">باتری پر است و شارژ می‌شود.</translation>
+<translation id="8681498213689260554">‏راه‌اندازی مجدد و Powerwash برای به‌روزرسانی</translation>
+<translation id="4442424173763614572">‏جستجوی DNS انجام نشد</translation>
<translation id="7874779702599364982">جستجو برای شبکه‌های تلفن همراه ...</translation>
<translation id="583281660410589416">ناشناخته</translation>
<translation id="1383876407941801731">جستجو</translation>
@@ -94,7 +101,6 @@
<translation id="2204305834655267233">اطلاعات شبکه</translation>
<translation id="1621499497873603021">زمان باقیمانده تا خالی‌شدن شارژ باتری، <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">خروج از مهمان</translation>
-<translation id="4471417012762451363">باتری <ph name="PERCENTAGE"/> درصد پر است و شارژ می‌شود</translation>
<translation id="8308637677604853869">منوی قبلی</translation>
<translation id="4666297444214622512">ورود به حساب دیگر ممکن نیست.</translation>
<translation id="1346748346194534595">راست</translation>
@@ -104,14 +110,15 @@
<translation id="8428213095426709021">تنظیمات</translation>
<translation id="2372145515558759244">در حال همگام‌سازی برنامه‌ها…</translation>
<translation id="7256405249507348194">خطای نامشخص: <ph name="DESC"/></translation>
-<translation id="7925247922861151263">بررسی AAA انجام نشد</translation>
+<translation id="7925247922861151263">‏بررسی AAA انجام نشد</translation>
<translation id="8456362689280298700"><ph name="HOUR"/>:<ph name="MINUTE"/> تا پر شود</translation>
-<translation id="5787281376604286451">بازخورد گفتاری فعال است.
+<translation id="5787281376604286451">‏بازخورد گفتاری فعال است.
Ctrl+Alt+Z را فشار دید تا غیرفعال شود.</translation>
<translation id="4479639480957787382">اترنت</translation>
<translation id="6312403991423642364">خطای شبکه ناشناخته</translation>
<translation id="1467432559032391204">چپ</translation>
<translation id="5543001071567407895">پیامک</translation>
+<translation id="1957803754585243749">۰ درجه</translation>
<translation id="2354174487190027830">فعال‌سازی <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">بزرگ کردن</translation>
@@ -121,14 +128,14 @@ Ctrl+Alt+Z را فشار دید تا غیرفعال شود.</translation>
<translation id="2727977024730340865">باتری به شارژر برق ضعیف متصل است. شارژ باتری ممکن است قابل اطمینان نباشد.</translation>
<translation id="3784455785234192852">قفل</translation>
<translation id="2805756323405976993">برنامه‌ها</translation>
-<translation id="8871072142849158571">اندازه <ph name="DISPLAY_NAME"/> به <ph name="RESOLUTION"/> تغییر داده شد</translation>
<translation id="1512064327686280138">نقص در فعالسازی</translation>
<translation id="5097002363526479830">اتصال ناموفق به شبکه &quot;<ph name="NAME"/>&quot;:<ph name="DETAILS"/></translation>
-<translation id="1850504506766569011">Wi-Fi خاموش است.</translation>
+<translation id="1850504506766569011">‏Wi-Fi خاموش است.</translation>
<translation id="8132793192354020517">متصل به <ph name="NAME"/></translation>
<translation id="7052914147756339792">تنظیم کاغذدیواری...</translation>
<translation id="8678698760965522072">حالت آنلاین</translation>
<translation id="2532589005999780174">حالت کنتراست بالا</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>، <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">خطای داخلی</translation>
<translation id="3019353588588144572">زمان باقی مانده تا شارژ کامل باتری، <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">ذره‌بین صفحه</translation>
@@ -142,57 +149,63 @@ Ctrl+Alt+Z را فشار دید تا غیرفعال شود.</translation>
<translation id="4032485810211612751"><ph name="HOURS"/>:<ph name="MINUTES"/>:<ph name="SECONDS"/></translation>
<translation id="225680501294068881">درحال جستجو برای دستگاه‌ها...</translation>
<translation id="5597451508971090205"><ph name="SHORT_WEEKDAY"/>، <ph name="DATE"/></translation>
-<translation id="4448844063988177157">در حال جستجوی شبکه‌های Wi-Fi...</translation>
+<translation id="4448844063988177157">‏در حال جستجوی شبکه‌های Wi-Fi...</translation>
<translation id="8401662262483418323">اتصال به «<ph name="NAME"/>» ناموفق بود: <ph name="DETAILS"/>
پیام سرور: <ph name="SERVER_MSG"/></translation>
<translation id="2475982808118771221">یک خطا روی داد</translation>
-<translation id="7229570126336867161">EVDO مورد نیاز است</translation>
+<translation id="7229570126336867161">‏EVDO مورد نیاز است</translation>
<translation id="2999742336789313416"><ph name="DISPLAY_NAME"/> یک جلسه عمومی مدیریت‌شده توسط <ph name="DOMAIN"/> است</translation>
<translation id="7029814467594812963">خروج از جلسه</translation>
-<translation id="8454013096329229812">Wi-Fi روشن است.</translation>
-<translation id="4872237917498892622">Alt+جستجو یا Shift</translation>
+<translation id="8454013096329229812">‏Wi-Fi روشن است.</translation>
+<translation id="4872237917498892622">‏Alt+جستجو یا Shift</translation>
+<translation id="9201131092683066720">باتری <ph name="PERCENTAGE"/> درصد پر است.</translation>
<translation id="2983818520079887040">تنظیمات...</translation>
+<translation id="1195412055398077112">بزرگتر از صفحه</translation>
<translation id="1717216362413677834">حالت جایگاه اتصال</translation>
+<translation id="112308213915226829">پنهان کردن خودکار قفسه</translation>
<translation id="8927026611342028580">درخواست اتصال</translation>
-<translation id="8300849813060516376">OTASP انجام نشد</translation>
-<translation id="2792498699870441125">Alt+جستجو</translation>
+<translation id="8300849813060516376">‏OTASP انجام نشد</translation>
+<translation id="2792498699870441125">‏Alt+جستجو</translation>
<translation id="8660803626959853127">در حال همگام‌سازی فایل(های) <ph name="COUNT"/></translation>
+<translation id="5958529069007801266">کاربر نظارت‌شده</translation>
<translation id="3709443003275901162">+۹</translation>
-<translation id="639644700271529076">CAPS LOCK خاموش است</translation>
-<translation id="6248847161401822652">برای خروج Control‏، Shift و Q را دو بار فشار دهید.</translation>
+<translation id="639644700271529076">‏CAPS LOCK خاموش است</translation>
+<translation id="6248847161401822652">‏برای خروج Control‏، Shift و Q را دو بار فشار دهید.</translation>
+<translation id="6785414152754474415">باتری <ph name="PERCENTAGE"/> درصد پر و درحال شارژ است.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: در حال فعال‌سازی…</translation>
+<translation id="4895488851634969361">باتری پر است.</translation>
<translation id="1391854757121130358">ممکن است حجم مجاز داده تلفن همراه خود را مصرف کرده باشید.</translation>
-<translation id="5413208160176941586">کاربر مدیریت شده به صورت محلی</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>:‏ <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">موقعیت راه‌انداز</translation>
-<translation id="7593891976182323525">جستجو یا Shift</translation>
+<translation id="5947494881799873997">برگرداندن</translation>
+<translation id="7593891976182323525">‏جستجو یا Shift</translation>
<translation id="7649070708921625228">راهنما</translation>
-<translation id="3050422059534974565">CAPS LOCK روشن است.
+<translation id="3050422059534974565">‏CAPS LOCK روشن است.
جستجو یا Shift را برای لغو فشار دهید.</translation>
<translation id="397105322502079400">در حال محاسبه…</translation>
<translation id="158849752021629804">شبکه خانگی مورد نیاز است</translation>
<translation id="6857811139397017780">فعال سازی <ph name="NETWORKSERVICE"/></translation>
-<translation id="5864471791310927901">بررسی DHCP انجام نشد</translation>
+<translation id="5864471791310927901">‏بررسی DHCP انجام نشد</translation>
<translation id="5812035014844949013">خروجی</translation>
<translation id="6692173217867674490">کلمه عبور نادرست</translation>
<translation id="6165508094623778733">بیشتر بیاموزید</translation>
<translation id="9046895021617826162">اتصال برقرار نشد</translation>
+<translation id="7168224885072002358">برگرداندن به وضوح قدیمی در <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">این جلسه در <ph name="SESSION_TIME_REMAINING"/> به اتمام خواهد رسید. به طور خودکار از سیستم خارج خواهید شد.</translation>
-<translation id="8372369524088641025">کلید WEP نادرست</translation>
+<translation id="8372369524088641025">‏کلید WEP نادرست</translation>
<translation id="6636709850131805001">حالت ناشناس</translation>
<translation id="3573179567135747900">به &quot;<ph name="FROM_LOCALE"/>&quot; تغییر دهید (به راه‌اندازی دوباره نیاز دارد)</translation>
<translation id="8103386449138765447">پیامک‌ها: <ph name="MESSAGE_COUNT"/></translation>
-<translation id="5045002648206642691">تنظیمات Google Drive...</translation>
-<translation id="1510238584712386396">راه‌انداز</translation>
-<translation id="7209101170223508707">CAPS LOCK روشن است.
+<translation id="5045002648206642691">‏تنظیمات Google Drive...</translation>
+<translation id="7209101170223508707">‏CAPS LOCK روشن است.
Alt+جستجو یا Shift را برای لغو فشار دهید.</translation>
<translation id="8940956008527784070">باتری ضعیف است (<ph name="PERCENTAGE"/>٪)</translation>
+<translation id="4918086044614829423">پذیرش</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> باقیمانده است</translation>
-<translation id="520760366042891468">اشتراک‌گذاری کنترل صفحه نمایش شما از طریق Hangouts.</translation>
+<translation id="520760366042891468">‏اشتراک‌گذاری کنترل صفحه نمایش شما از طریق Hangouts.</translation>
<translation id="8000066093800657092">بدون شبکه</translation>
<translation id="4015692727874266537">ورود به سیستم با حسابی دیگر...</translation>
<translation id="5941711191222866238">کوچک کردن</translation>
<translation id="6911468394164995108">پیوستن به شبکه دیگر…</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>ساعت <ph name="MINUTE"/>دقیقه مانده تا باتری شارژ شود</translation>
<translation id="6359806961507272919">پیامک از <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">شرکت مخابراتی</translation>
diff --git a/chromium/ash/strings/ash_strings_fi.xtb b/chromium/ash/strings/ash_strings_fi.xtb
index d9793f2b869..9c4981dd86c 100644
--- a/chromium/ash/strings/ash_strings_fi.xtb
+++ b/chromium/ash/strings/ash_strings_fi.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="fi">
<translation id="3595596368722241419">Akku täynnä</translation>
-<translation id="5250713215130379958">Piilota käynnistyspalkki</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Portaalitila</translation>
<translation id="30155388420722288">Overflow-painike</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth käytössä</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> käännettiin asentoon <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth pois käytöstä</translation>
+<translation id="7165320105431587207">Verkon asetuksien määrittäminen epäonnistui</translation>
<translation id="3775358506042162758">Sinulla voi olla enintään kolme tiliä useaan tiliin kirjautuessasi.</translation>
<translation id="370649949373421643">Ota wifi käyttöön</translation>
<translation id="3626281679859535460">Kirkkaus</translation>
+<translation id="595202126637698455">Tehokkuuden seuranta on käytössä</translation>
<translation id="8054466585765276473">Lasketaan akun kesto.</translation>
<translation id="7982789257301363584">Verkko</translation>
<translation id="5565793151875479467">Välityspalvelin...</translation>
<translation id="938582441709398163">Näppäimistön peitto</translation>
<translation id="4387004326333427325">Todennusvarmenne on hylätty etäyhteyden kautta</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">Ruudun <ph name="DISPLAY_NAME"/> tarkkuudeksi vaihdettiin <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP get -toiminto epäonnistui</translation>
<translation id="2297568595583585744">Tila-alue</translation>
<translation id="1661867754829461514">PIN-koodi puuttuu</translation>
@@ -34,39 +38,41 @@ Vaihda syöttötapaa painamalla Shift + Alt.</translation>
<translation id="2127372758936585790">Pienitehoinen laturi</translation>
<translation id="3846575436967432996">Verkon tietoja ei saatavilla</translation>
<translation id="3026237328237090306">Määritä mobiilitiedonsiirron asetukset</translation>
+<translation id="5871632337994001636">Hallinnoi laitteita…</translation>
<translation id="785750925697875037">Näytä mobiilitili</translation>
<translation id="153454903766751181">Alustetaan matkapuhelinmodeemia…</translation>
<translation id="4628814525959230255">Näytönhallinnan jakaminen henkilön <ph name="HELPER_NAME"/> kanssa Hangout-keskustelujen kautta.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> on käännetty</translation>
<translation id="7864539943188674973">Poista Bluetooth käytöstä</translation>
<translation id="939252827960237676">Kuvakaappauksen tallentaminen epäonnistui</translation>
<translation id="3126069444801937830">Päivitä käynnistämällä uudelleen</translation>
<translation id="2268813581635650749">Kirjaa kaikki ulos</translation>
<translation id="735745346212279324">VPN-yhteys katkaistu</translation>
<translation id="7320906967354320621">Ei käytössä</translation>
-<translation id="6303423059719347535">Akussa on virtaa <ph name="PERCENTAGE"/> %</translation>
<translation id="15373452373711364">Suuri hiiren osoitin</translation>
-<translation id="2778346081696727092">Todennus annetulla käyttäjänimellä ja salasanalla epäonnistui.</translation>
<translation id="3294437725009624529">Vieras</translation>
<translation id="8190698733819146287">Muokkaa kieliä ja syötettä...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Hyllyn sijainti</translation>
<translation id="2903907270192926896">ÄÄNITULO</translation>
<translation id="8676770494376880701">Pienitehoinen laturi kytketty</translation>
<translation id="7170041865419449892">Katvealueella</translation>
<translation id="4804818685124855865">Katkaise yhteys</translation>
<translation id="2544853746127077729">Verkko on hylännyt todennusvarmenteen</translation>
<translation id="5222676887888702881">Kirjaudu ulos</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Määritykset</translation>
<translation id="1272079795634619415">Pysäytä</translation>
<translation id="4957722034734105353">Lisätietoja...</translation>
<translation id="2964193600955408481">Wifi pois käytöstä</translation>
-<translation id="811680302244032017">Lisää laite...</translation>
<translation id="4279490309300973883">Peilaus päällä</translation>
+<translation id="7973962044839454485">PPP-todennus epäonnistui virheellisen käyttäjänimen tai salasanan vuoksi</translation>
<translation id="2509468283778169019">CAPS LOCK on päällä</translation>
<translation id="3892641579809465218">Sisäinen näyttö</translation>
<translation id="7823564328645135659">Käyttökieli on muutettu kielestä <ph name="FROM_LOCALE"/> kieleksi <ph name="TO_LOCALE"/> asetustesi synkronoinnin yhteydessä.</translation>
<translation id="3368922792935385530">Yhdistetty</translation>
<translation id="8340999562596018839">Äänipalaute</translation>
<translation id="8654520615680304441">Ota wifi käyttöön…</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Syöttötapa on vaihtunut. Uusi syöttötapa on <ph name="INPUT_METHOD_ID"/>.
Vaihda syöttötapaa painamalla Shift + Alt.</translation>
<translation id="2562916301614567480">Yksityinen verkko</translation>
@@ -83,11 +89,12 @@ Vaihda syöttötapaa painamalla Shift + Alt.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/> % jäljellä</translation>
<translation id="9089416786594320554">Syöttötavat</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/> %</translation>
+<translation id="2825619548187458965">Hylly</translation>
<translation id="2614835198358683673">Chromebookisi ei välttämättä lataudu sen ollessa päällä. Harkitse virallisen laturin käyttämistä.</translation>
<translation id="1895658205118569222">Sulkeminen</translation>
<translation id="4430019312045809116">Äänenvoimakkuus</translation>
+<translation id="8681498213689260554">Käynnistä laite uudelleen ja suorita powerwash asentaaksesi päivitykset</translation>
<translation id="4442424173763614572">DNS-haku epäonnistui</translation>
-<translation id="6356500677799115505">Akku on täynnä ja laite on kytketty laturiin.</translation>
<translation id="7874779702599364982">Haetaan matkapuhelinverkkoja…</translation>
<translation id="583281660410589416">Tuntematon</translation>
<translation id="1383876407941801731">Haku</translation>
@@ -96,7 +103,6 @@ Vaihda syöttötapaa painamalla Shift + Alt.</translation>
<translation id="2204305834655267233">Verkon tiedot</translation>
<translation id="1621499497873603021">Akku on tyhjä <ph name="TIME_LEFT"/> kuluttua</translation>
<translation id="5980301590375426705">Sulje vierastila</translation>
-<translation id="4471417012762451363">Akussa on virtaa <ph name="PERCENTAGE"/> % ja laite on kytketty laturiin</translation>
<translation id="8308637677604853869">Edellinen valikko</translation>
<translation id="4666297444214622512">Toiseen tiliin kirjautuminen ei onnistunut.</translation>
<translation id="1346748346194534595">Oikealle</translation>
@@ -114,6 +120,7 @@ Poista se käytöstä painamalla Ctrl+Alt+Z.</translation>
<translation id="6312403991423642364">Tuntematon verkkovirhe</translation>
<translation id="1467432559032391204">Vasemmalle</translation>
<translation id="5543001071567407895">Tekstiviesti</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Aktivoidaan <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wifi</translation>
<translation id="1398853756734560583">Suurenna</translation>
@@ -123,7 +130,6 @@ Poista se käytöstä painamalla Ctrl+Alt+Z.</translation>
<translation id="2727977024730340865">Pienitehoinen laturi kytketty. Akku ei ehkä lataudu luotettavasti.</translation>
<translation id="3784455785234192852">Lukitse</translation>
<translation id="2805756323405976993">Sovellukset</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> on muutettu kokoon <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Aktivointivirhe</translation>
<translation id="5097002363526479830">Yhteyden muodostaminen verkkoon &quot;<ph name="NAME"/>&quot; epäonnistui: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wifi ei ole käytössä.</translation>
@@ -131,6 +137,7 @@ Poista se käytöstä painamalla Ctrl+Alt+Z.</translation>
<translation id="7052914147756339792">Aseta taustakuva...</translation>
<translation id="8678698760965522072">Online-tila</translation>
<translation id="2532589005999780174">Suuri kontrasti -tila</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Sisäinen virhe</translation>
<translation id="3019353588588144572">Akku on ladattu <ph name="TIME_REMAINING"/> kuluttua</translation>
<translation id="3473479545200714844">Ruudun suurentaminen</translation>
@@ -153,20 +160,24 @@ Palvelimen viesti: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Sulje käyttökerta</translation>
<translation id="8454013096329229812">Wifi on käytössä.</translation>
<translation id="4872237917498892622">Alt + haku tai Shift</translation>
+<translation id="9201131092683066720">Akussa on virtaa <ph name="PERCENTAGE"/> %.</translation>
<translation id="2983818520079887040">Asetukset...</translation>
+<translation id="1195412055398077112">kuvasta rajataan pois osa</translation>
<translation id="1717216362413677834">Telakointitila</translation>
+<translation id="112308213915226829">Piilota hylly automaattisesti</translation>
<translation id="8927026611342028580">Yhdistä pyydetyt</translation>
<translation id="8300849813060516376">OTASP epäonnistui</translation>
<translation id="2792498699870441125">Alt + haku</translation>
<translation id="8660803626959853127">Synkronoidaan <ph name="COUNT"/> tiedosto(a)</translation>
+<translation id="5958529069007801266">Valvottu käyttäjä</translation>
<translation id="3709443003275901162">Yli 9</translation>
<translation id="639644700271529076">CAPS LOCK on pois päältä</translation>
<translation id="6248847161401822652">Lopeta painamalla kahdesti Control Shift Q.</translation>
+<translation id="6785414152754474415">Akussa on virtaa <ph name="PERCENTAGE"/> %, ja laite on kytketty laturiin.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: aktivoidaan…</translation>
+<translation id="4895488851634969361">Akku on täynnä.</translation>
<translation id="1391854757121130358">Olet ehkä käyttänyt mobiilitiedonsiirron kiintiösi.</translation>
-<translation id="5413208160176941586">Paikallisesti hallinnoitu käyttäjä</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Käynnistyspalkin sijainti</translation>
+<translation id="5947494881799873997">Palauta</translation>
<translation id="7593891976182323525">Haku tai Shift</translation>
<translation id="7649070708921625228">Ohje</translation>
<translation id="3050422059534974565">CAPS LOCK on päällä. Peruuta painamalla haku- tai Shift-näppäintä.</translation>
@@ -178,21 +189,23 @@ Palvelimen viesti: <ph name="SERVER_MSG"/></translation>
<translation id="6692173217867674490">Väärä tunnuslause</translation>
<translation id="6165508094623778733">Lisätietoja</translation>
<translation id="9046895021617826162">Yhdistäminen epäonnistui</translation>
+<translation id="7168224885072002358">Palautetaan vanha tarkkuus, aikaa palautukseen <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Istunnon loppumiseen on <ph name="SESSION_TIME_REMAINING"/>. Sinut kirjataan automaattisesti ulos.</translation>
<translation id="8372369524088641025">Väärä WEP-avain</translation>
<translation id="6636709850131805001">Tunnistamaton tila</translation>
<translation id="3573179567135747900">Vaihda takaisin kieleksi <ph name="FROM_LOCALE"/> (vaatii uudelleenkäynnistyksen)</translation>
<translation id="8103386449138765447">Tekstiviestit: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google Driven asetukset...</translation>
-<translation id="1510238584712386396">Käynnistysohjelma</translation>
<translation id="7209101170223508707">CAPS LOCK on päällä. Peruuta painamalla Alt + hakupainike tai Shift.</translation>
<translation id="8940956008527784070">Akku vähissä (<ph name="PERCENTAGE"/> %)</translation>
+<translation id="4918086044614829423">Hyväksy</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>.<ph name="MINUTE"/> jäljellä</translation>
<translation id="520760366042891468">Näytön hallinnan jakaminen Hangout-keskustelujen kautta.</translation>
<translation id="8000066093800657092">Ei verkkoa</translation>
<translation id="4015692727874266537">Kirjaudu sisään toiseen tiliin…</translation>
<translation id="5941711191222866238">Pienennä</translation>
<translation id="6911468394164995108">Liity muuhun verkkoon...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">Akku täynnä <ph name="HOUR"/> t <ph name="MINUTE"/> min kuluttua</translation>
<translation id="6359806961507272919">Tekstiviesti lähettäjältä <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operaattori</translation>
diff --git a/chromium/ash/strings/ash_strings_fil.xtb b/chromium/ash/strings/ash_strings_fil.xtb
index d3c61d5a6ff..3685689d96b 100644
--- a/chromium/ash/strings/ash_strings_fil.xtb
+++ b/chromium/ash/strings/ash_strings_fil.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="fil">
<translation id="3595596368722241419">Puno na ang baterya</translation>
-<translation id="5250713215130379958">Awtomatikong itago ang launcher</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> at <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Katayuan ng portal</translation>
<translation id="30155388420722288">Button na Overflow</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Pinapagana ang Bluetooth</translation>
+<translation id="6310121235600822547">Na-rotate ang <ph name="DISPLAY_NAME"/> sa <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Hindi pinagana ang Bluetooth</translation>
+<translation id="7165320105431587207">Nabigong ma-configure ang network</translation>
<translation id="3775358506042162758">Maaari ka lang magkaroon ng hanggang sa tatlong account sa multiple na pag-sign-in.</translation>
<translation id="370649949373421643">Paganahin ang Wi-Fi</translation>
<translation id="3626281679859535460">Tingkad</translation>
+<translation id="595202126637698455">Naka-enable ang pagte-trace sa pagganap</translation>
<translation id="8054466585765276473">Kinakalkula ang oras ng baterya.</translation>
<translation id="7982789257301363584">Network</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Overlay ng Keyboard</translation>
<translation id="4387004326333427325">Remote na tinanggihan ang certificate sa pagpapatunay</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">Ginawang <ph name="RESOLUTION"/> ang resolution ng <ph name="DISPLAY_NAME"/></translation>
<translation id="6943836128787782965">Nabigo ang pagkuha ng HTTP</translation>
<translation id="2297568595583585744">Tray ng katayuan</translation>
<translation id="1661867754829461514">Nawawala ang PIN</translation>
@@ -34,39 +38,41 @@ Pindutin ang Shift + Alt upang magpalit.</translation>
<translation id="2127372758936585790">Low-power charger</translation>
<translation id="3846575436967432996">Walang available na impormasyon sa network</translation>
<translation id="3026237328237090306">I-setup ang mobile data</translation>
+<translation id="5871632337994001636">Pamahalaan ang mga device...</translation>
<translation id="785750925697875037">Tingnan ang account sa mobile</translation>
<translation id="153454903766751181">Sinisimulan ang cellular na modem...</translation>
<translation id="4628814525959230255">Ibinahagi ang kontrol sa iyong screen kay <ph name="HELPER_NAME"/> sa pamamagitan ng Hangouts.</translation>
-<translation id="8343941333792395995">Na-rotate na ang <ph name="DISPLAY_NAME"/></translation>
<translation id="7864539943188674973">Huwag Paganahin ang Bluetooth</translation>
<translation id="939252827960237676">Nabigong i-save ang screenshot</translation>
<translation id="3126069444801937830">I-restart upang mag-update</translation>
<translation id="2268813581635650749">I-sign out ang lahat</translation>
<translation id="735745346212279324">Nakadiskonekta ang VPN</translation>
<translation id="7320906967354320621">Hindi Ginagamit</translation>
-<translation id="6303423059719347535">Ang baterya ay <ph name="PERCENTAGE"/>% na puno</translation>
<translation id="15373452373711364">Malaking mouse cursor</translation>
-<translation id="2778346081696727092">Nabigong patotohanan gamit ang ibinigay na username o password</translation>
<translation id="3294437725009624529">Bisita</translation>
<translation id="8190698733819146287">I-customize ang mga wika at input...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Posisyon ng shelf</translation>
<translation id="2903907270192926896">INPUT</translation>
<translation id="8676770494376880701">Nakakabit ang low-power charger</translation>
<translation id="7170041865419449892">Wala sa sakop</translation>
<translation id="4804818685124855865">I-disconnect</translation>
<translation id="2544853746127077729">Tinanggihan ng network ang certificate sa pagpapatunay</translation>
<translation id="5222676887888702881">Mag-sign out</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Configuration</translation>
<translation id="1272079795634619415">Stop</translation>
<translation id="4957722034734105353">Matuto nang higit pa...</translation>
<translation id="2964193600955408481">Huwag paganahin ang Wi-Fi</translation>
-<translation id="811680302244032017">Magdagdag ng device...</translation>
<translation id="4279490309300973883">Nagmi-mirror</translation>
+<translation id="7973962044839454485">Nabigo ang pagpapatotoo sa PPP dahil sa hindi tamang username o password</translation>
<translation id="2509468283778169019">Naka-on ang CAPS LOCK</translation>
<translation id="3892641579809465218">Panloob na Display</translation>
<translation id="7823564328645135659">Nagbago ang wika mula &quot;<ph name="FROM_LOCALE"/>&quot; patungong &quot;<ph name="TO_LOCALE"/>&quot; pagkatapos i-sync ang iyong mga setting.</translation>
<translation id="3368922792935385530">Nakakonekta</translation>
<translation id="8340999562596018839">Pasalitang feedback</translation>
<translation id="8654520615680304441">I-on ang Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Naging <ph name="INPUT_METHOD_ID"/> ang iyong pamamaraan ng pag-input.
Pindutin ang Shift + Alt upang magpalit.</translation>
<translation id="2562916301614567480">Pribadong Network</translation>
@@ -83,11 +89,12 @@ Pindutin ang Shift + Alt upang magpalit.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% ang natitira</translation>
<translation id="9089416786594320554">Mga pamamaraan ng pag-input</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Shelf</translation>
<translation id="2614835198358683673">Maaaring hindi mag-charge ang iyong Chromebook habang naka-on ito. Pag-isipang gamitin ang opisyal na charger.</translation>
<translation id="1895658205118569222">Shutdown</translation>
<translation id="4430019312045809116">Volume</translation>
+<translation id="8681498213689260554">I-restart at I-powerwash upang ma-update</translation>
<translation id="4442424173763614572">Nabigo ang paghahanap sa DNS</translation>
-<translation id="6356500677799115505">Ang baterya ay puno at nagcha-charge.</translation>
<translation id="7874779702599364982">Naghahanap ng mga cellular network...</translation>
<translation id="583281660410589416">Hindi kilala</translation>
<translation id="1383876407941801731">Paghahanap</translation>
@@ -96,7 +103,6 @@ Pindutin ang Shift + Alt upang magpalit.</translation>
<translation id="2204305834655267233">Impormasyon ng Network</translation>
<translation id="1621499497873603021">Natitirang oras bago maubos ang baterya, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Lumabas sa session ng bisita</translation>
-<translation id="4471417012762451363">Ang baterya ay <ph name="PERCENTAGE"/>% na puno at nagcha-charge</translation>
<translation id="8308637677604853869">Nakaraang menu</translation>
<translation id="4666297444214622512">Hindi makaka-sign in sa isa pang account.</translation>
<translation id="1346748346194534595">Kanan</translation>
@@ -114,6 +120,7 @@ Pindutin ang Ctrl+Alt+Z upang huwag paganahin.</translation>
<translation id="6312403991423642364">Hindi alam na error sa network</translation>
<translation id="1467432559032391204">Kaliwa</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Ina-activate ang <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maximize</translation>
@@ -123,7 +130,6 @@ Pindutin ang Ctrl+Alt+Z upang huwag paganahin.</translation>
<translation id="2727977024730340865">Naka-saksak sa isang low-power charger. Maaaring hindi maging tiyak ang pag-charge ng baterya.</translation>
<translation id="3784455785234192852">I-lock</translation>
<translation id="2805756323405976993">Apps</translation>
-<translation id="8871072142849158571">na-resize ang <ph name="DISPLAY_NAME"/> sa <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Pagkabigo ng pag-activate</translation>
<translation id="5097002363526479830">Nabigong kumonekta sa network na '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Naka-off ang Wi-Fi.</translation>
@@ -131,6 +137,7 @@ Pindutin ang Ctrl+Alt+Z upang huwag paganahin.</translation>
<translation id="7052914147756339792">Magtakda ng wallpaper...</translation>
<translation id="8678698760965522072">Katayuan online</translation>
<translation id="2532589005999780174">High contrast mode</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Panloob na error</translation>
<translation id="3019353588588144572">Natitirang oras bago ganap na ma-charge ang baterya, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Screen magnifier</translation>
@@ -153,20 +160,24 @@ Mensahe mula sa server: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Lumabas sa session</translation>
<translation id="8454013096329229812">Naka-on ang Wi-Fi.</translation>
<translation id="4872237917498892622">Alt+Search o Shift</translation>
+<translation id="9201131092683066720">Ang baterya ay <ph name="PERCENTAGE"/>% na puno.</translation>
<translation id="2983818520079887040">Mga Setting...</translation>
+<translation id="1195412055398077112">overscan</translation>
<translation id="1717216362413677834">Dock mode</translation>
+<translation id="112308213915226829">Awtomatikong itago ang shelf</translation>
<translation id="8927026611342028580">Hiniling ang Koneksyon</translation>
<translation id="8300849813060516376">Nabigo ang OTASP</translation>
<translation id="2792498699870441125">Alt+Search</translation>
<translation id="8660803626959853127">Nagsi-sync ng <ph name="COUNT"/> (na) file</translation>
+<translation id="5958529069007801266">Pinangangasiwaang user</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">Naka-off ang CAPS LOCK</translation>
<translation id="6248847161401822652">Pindutin ang Control Shift Q nang dalawang beses upang lumabas.</translation>
+<translation id="6785414152754474415">Ang baterya ay <ph name="PERCENTAGE"/>% na puno at nagcha-charge.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Ina-activate...</translation>
+<translation id="4895488851634969361">Puno na ang baterya.</translation>
<translation id="1391854757121130358">Maaaring naubos mo na ang mobile data na nakalaan sa iyo.</translation>
-<translation id="5413208160176941586">Lokal na pinapamahalaang user</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Posisyon ng launcher</translation>
+<translation id="5947494881799873997">I-revert</translation>
<translation id="7593891976182323525">Search or Shift</translation>
<translation id="7649070708921625228">Tulong</translation>
<translation id="3050422059534974565">Naka-on ang CAPS LOCK.
@@ -179,22 +190,24 @@ Pindutin ang Search o Shift upang kanselahin.</translation>
<translation id="6692173217867674490">Mahinang passphrase</translation>
<translation id="6165508094623778733">Matuto nang higit pa</translation>
<translation id="9046895021617826162">Nabigo ang pagkonekta</translation>
+<translation id="7168224885072002358">Magre-revert sa lumang resolution sa loob ng <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Magtatapos ang session na ito sa <ph name="SESSION_TIME_REMAINING"/>. Awtomatiko kang masa-sign out.</translation>
<translation id="8372369524088641025">Mahinang WEP key</translation>
<translation id="6636709850131805001">Di-kilalang katayuan</translation>
<translation id="3573179567135747900">Palitan pabalik sa &quot;<ph name="FROM_LOCALE"/>&quot; (kailangang i-restart)</translation>
<translation id="8103386449138765447">Mga mensaheng SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Mga setting ng Google Drive ...</translation>
-<translation id="1510238584712386396">Launcher</translation>
<translation id="7209101170223508707">Naka-on ang CAPS LOCK.
Pindutin ang Alt+Search o Shift upang kanselahin.</translation>
<translation id="8940956008527784070">Mahina na ang baterya (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Tanggapin</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> ang natitira</translation>
<translation id="520760366042891468">Ibinahagi ang kontrol sa iyong screen sa pamamagitan ng Hangouts.</translation>
<translation id="8000066093800657092">Walang network</translation>
<translation id="4015692727874266537">Mag-sign sa isa pang account...</translation>
<translation id="5941711191222866238">Minimize</translation>
<translation id="6911468394164995108">Sumali sa iba...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>o <ph name="MINUTE"/>m hanggang mapuno</translation>
<translation id="6359806961507272919">SMS mula kay <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Carrier</translation>
diff --git a/chromium/ash/strings/ash_strings_fr.xtb b/chromium/ash/strings/ash_strings_fr.xtb
index 05c9f7ce73d..812cc0ff0ec 100644
--- a/chromium/ash/strings/ash_strings_fr.xtb
+++ b/chromium/ash/strings/ash_strings_fr.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="fr">
<translation id="3595596368722241419">Batterie pleine</translation>
-<translation id="5250713215130379958">Masquer automatiquement le lanceur d'applications</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> et <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">État du portail</translation>
<translation id="30155388420722288">Bouton de dépassement de capacité</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth activé</translation>
+<translation id="6310121235600822547">L'écran &quot;<ph name="DISPLAY_NAME"/>&quot; a effectué une rotation de <ph name="ROTATION"/>.</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth désactivé</translation>
+<translation id="7165320105431587207">Échec de la configuration du réseau.</translation>
<translation id="3775358506042162758">Vous ne pouvez vous connecter qu'à trois comptes au maximum dans le cadre de la connexion multicompte.</translation>
<translation id="370649949373421643">Activer le Wi-Fi</translation>
<translation id="3626281679859535460">Luminosité</translation>
+<translation id="595202126637698455">Suivi des performances activé</translation>
<translation id="8054466585765276473">Calcul de l'autonomie de la batterie en cours…</translation>
<translation id="7982789257301363584">Réseau</translation>
<translation id="5565793151875479467">Proxy…</translation>
<translation id="938582441709398163">Clavier en superposition</translation>
<translation id="4387004326333427325">Certificat d'authentification rejeté à distance.</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">La résolution de l'écran &quot;<ph name="DISPLAY_NAME"/>&quot; est désormais définie sur <ph name="RESOLUTION"/>.</translation>
<translation id="6943836128787782965">Échec de l'obtention HTTP.</translation>
<translation id="2297568595583585744">Barre d'état</translation>
<translation id="1661867754829461514">Code secret manquant</translation>
@@ -34,39 +38,41 @@ Appuyez sur Maj + Alt pour en utiliser un autre.</translation>
<translation id="2127372758936585790">Chargeur de faible puissance</translation>
<translation id="3846575436967432996">Aucune information disponible concernant le réseau</translation>
<translation id="3026237328237090306">Configurer les données mobiles</translation>
+<translation id="5871632337994001636">Gérer les appareils…</translation>
<translation id="785750925697875037">Afficher le compte mobile</translation>
<translation id="153454903766751181">Initialisation du modem cellulaire en cours…</translation>
<translation id="4628814525959230255">Partage du contrôle de votre écran avec <ph name="HELPER_NAME"/> via Hangouts</translation>
-<translation id="8343941333792395995">Rotation de l'écran &quot;<ph name="DISPLAY_NAME"/>&quot;</translation>
<translation id="7864539943188674973">Désactiver le Bluetooth</translation>
<translation id="939252827960237676">Échec d'enregistrement de la capture d'écran.</translation>
<translation id="3126069444801937830">Redémarrez pour mettre à jour</translation>
<translation id="2268813581635650749">Déconnecter tous les utilisateurs</translation>
<translation id="735745346212279324">VPN déconnecté</translation>
<translation id="7320906967354320621">Inactif</translation>
-<translation id="6303423059719347535">La batterie est chargée à <ph name="PERCENTAGE"/> %.</translation>
<translation id="15373452373711364">Grand curseur</translation>
-<translation id="2778346081696727092">Échec de l'authentification à l'aide du nom d'utilisateur ou du mot de passe indiqués.</translation>
<translation id="3294437725009624529">Invité</translation>
<translation id="8190698733819146287">Personnaliser les langues et la saisie...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Position de l'étagère</translation>
<translation id="2903907270192926896">ENTRÉE</translation>
<translation id="8676770494376880701">Chargeur de faible puissance connecté</translation>
<translation id="7170041865419449892">Hors de portée</translation>
<translation id="4804818685124855865">Se déconnecter</translation>
<translation id="2544853746127077729">Certificat d'authentification rejeté par le réseau.</translation>
<translation id="5222676887888702881">Déconnexion</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Configuration en cours</translation>
<translation id="1272079795634619415">Arrêter</translation>
<translation id="4957722034734105353">En savoir plus…</translation>
<translation id="2964193600955408481">Désactiver le réseau Wi-Fi</translation>
-<translation id="811680302244032017">Ajouter un appareil…</translation>
<translation id="4279490309300973883">Mise en miroir</translation>
+<translation id="7973962044839454485">Échec de l'authentification PPP en raison de la saisie d'un nom d'utilisateur ou d'un mot de passe erronés.</translation>
<translation id="2509468283778169019">Touche VERR MAJ activée</translation>
<translation id="3892641579809465218">Affichage interne</translation>
<translation id="7823564328645135659">La langue utilisée est passée de &quot;<ph name="FROM_LOCALE"/>&quot; à &quot;<ph name="TO_LOCALE"/>&quot; après la synchronisation de vos paramètres.</translation>
<translation id="3368922792935385530">Connecté</translation>
<translation id="8340999562596018839">Commentaires audio</translation>
<translation id="8654520615680304441">Activer le Wi-Fi…</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Votre mode de saisie a été remplacé par <ph name="INPUT_METHOD_ID"/>.
Appuyez sur Maj + Alt pour en utiliser un autre.</translation>
<translation id="2562916301614567480">Réseau privé</translation>
@@ -83,11 +89,12 @@ Appuyez sur Maj + Alt pour en utiliser un autre.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/> % restant(s)</translation>
<translation id="9089416786594320554">Modes de saisie</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/> %</translation>
+<translation id="2825619548187458965">Étagère</translation>
<translation id="2614835198358683673">Votre Chromebook risque de ne pas charger lorsqu'il est allumé. Utilisez plutôt le chargeur officiel.</translation>
<translation id="1895658205118569222">Arrêt.</translation>
<translation id="4430019312045809116">Volume</translation>
+<translation id="8681498213689260554">Redémarrer, puis lancer Powerwash pour mettre à jour le système</translation>
<translation id="4442424173763614572">Échec de la résolution DNS.</translation>
-<translation id="6356500677799115505">La batterie est pleine et en charge.</translation>
<translation id="7874779702599364982">Recherche de réseaux cellulaires en cours…</translation>
<translation id="583281660410589416">Inconnu</translation>
<translation id="1383876407941801731">Recherche</translation>
@@ -96,7 +103,6 @@ Appuyez sur Maj + Alt pour en utiliser un autre.</translation>
<translation id="2204305834655267233">Informations réseau</translation>
<translation id="1621499497873603021">Temps restant avant que la batterie ne soit vide : <ph name="TIME_LEFT"/>.</translation>
<translation id="5980301590375426705">Fermer la session Invité</translation>
-<translation id="4471417012762451363">La batterie est chargée à <ph name="PERCENTAGE"/> % et en charge.</translation>
<translation id="8308637677604853869">Menu précédent</translation>
<translation id="4666297444214622512">Impossible de se connecter à un autre compte.</translation>
<translation id="1346748346194534595">Vers la droite</translation>
@@ -114,6 +120,7 @@ Appuyez sur les touches Ctrl+Alt+Z pour les désactiver.</translation>
<translation id="6312403991423642364">Erreur de réseau inconnue.</translation>
<translation id="1467432559032391204">Vers la gauche</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Activation du réseau <ph name="NAME"/> en cours…</translation>
<translation id="8814190375133053267">Wi-Fi </translation>
<translation id="1398853756734560583">Agrandir</translation>
@@ -123,7 +130,6 @@ Appuyez sur les touches Ctrl+Alt+Z pour les désactiver.</translation>
<translation id="2727977024730340865">L'appareil est branché à un chargeur de faible puissance. Il se peut que la charge ne soit pas fiable.</translation>
<translation id="3784455785234192852">Verrouiller</translation>
<translation id="2805756323405976993">Applications</translation>
-<translation id="8871072142849158571">La résolution de l'écran &quot;<ph name="DISPLAY_NAME"/>&quot; est désormais la suivante : <ph name="RESOLUTION"/>.</translation>
<translation id="1512064327686280138">Échec de l'activation</translation>
<translation id="5097002363526479830">Échec de la connexion au réseau &quot;<ph name="NAME"/>&quot; : <ph name="DETAILS"/>.</translation>
<translation id="1850504506766569011">Le Wi-Fi est désactivé.</translation>
@@ -131,6 +137,7 @@ Appuyez sur les touches Ctrl+Alt+Z pour les désactiver.</translation>
<translation id="7052914147756339792">Définir un fond d'écran…</translation>
<translation id="8678698760965522072">En ligne</translation>
<translation id="2532589005999780174">Mode Contraste élevé</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Erreur interne.</translation>
<translation id="3019353588588144572">Temps restant avant chargement complet de la batterie : <ph name="TIME_REMAINING"/>.</translation>
<translation id="3473479545200714844">Loupe</translation>
@@ -153,20 +160,24 @@ Message du serveur : <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Quitter la session</translation>
<translation id="8454013096329229812">Le Wi-Fi est activé.</translation>
<translation id="4872237917498892622">Alt + Recherche ou Maj</translation>
+<translation id="9201131092683066720">La batterie est chargée à <ph name="PERCENTAGE"/> %.</translation>
<translation id="2983818520079887040">Paramètres...</translation>
+<translation id="1195412055398077112">Surbalayage</translation>
<translation id="1717216362413677834">Mode Ancrage</translation>
+<translation id="112308213915226829">Masquer automatiquement l'étagère</translation>
<translation id="8927026611342028580">Connexion demandée</translation>
<translation id="8300849813060516376">Échec de l'opération OTASP</translation>
<translation id="2792498699870441125">Alt + Recherche</translation>
<translation id="8660803626959853127">Synchronisation de <ph name="COUNT"/> fichier(s) en cours…</translation>
+<translation id="5958529069007801266">Utilisateur supervisé</translation>
<translation id="3709443003275901162">Plus de 9</translation>
<translation id="639644700271529076">La touche de verrouillage des majuscules est désactivée.</translation>
<translation id="6248847161401822652">Pour quitter, appuyez deux fois sur Ctrl+Maj+Q.</translation>
+<translation id="6785414152754474415">La batterie est chargée à <ph name="PERCENTAGE"/> % et en charge.</translation>
<translation id="6267036997247669271"><ph name="NAME"/> : activation en cours…</translation>
+<translation id="4895488851634969361">La batterie est pleine.</translation>
<translation id="1391854757121130358">Vous avez peut-être épuisé votre forfait de données mobiles.</translation>
-<translation id="5413208160176941586">Utilisateur géré localement</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/> : <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Position du lanceur</translation>
+<translation id="5947494881799873997">Rétablir</translation>
<translation id="7593891976182323525">Recherche ou Maj</translation>
<translation id="7649070708921625228">Aide</translation>
<translation id="3050422059534974565">Le VERROUILLAGE DES MAJUSCULES est activé.
@@ -179,22 +190,24 @@ Appuyez sur Search ou Maj pour le désactiver.</translation>
<translation id="6692173217867674490">Mot de passe multiterme erroné</translation>
<translation id="6165508094623778733">En savoir plus</translation>
<translation id="9046895021617826162">Échec de la connexion</translation>
+<translation id="7168224885072002358">Rétablissement de la résolution précédente dans <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Cette session se terminera dans <ph name="SESSION_TIME_REMAINING"/>. Vous serez automatiquement déconnecté.</translation>
<translation id="8372369524088641025">Clé WEP incorrecte</translation>
<translation id="6636709850131805001">État non reconnu</translation>
<translation id="3573179567135747900">Revenir à &quot;<ph name="FROM_LOCALE"/>&quot; (redémarrage requis)</translation>
<translation id="8103386449138765447">Messages SMS : <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Paramètres Google Drive…</translation>
-<translation id="1510238584712386396">Lanceur d'applications</translation>
<translation id="7209101170223508707">Le VERROUILLAGE DES MAJUSCULES est activé.
Appuyez sur Alt + Recherche ou Maj pour le désactiver.</translation>
<translation id="8940956008527784070">Batterie faible (<ph name="PERCENTAGE"/> %)</translation>
+<translation id="4918086044614829423">Accepter</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> d'autonomie</translation>
<translation id="520760366042891468">Partage du contrôle de votre écran via Hangouts</translation>
<translation id="8000066093800657092">Aucun réseau détecté</translation>
<translation id="4015692727874266537">Connecter un autre compte…</translation>
<translation id="5941711191222866238">Réduire</translation>
<translation id="6911468394164995108">Autre réseau…</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/> : <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">Encore <ph name="HOUR"/> h <ph name="MINUTE"/> min de chargement</translation>
<translation id="6359806961507272919">SMS de <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Opérateur</translation>
diff --git a/chromium/ash/strings/ash_strings_gu.xtb b/chromium/ash/strings/ash_strings_gu.xtb
index 7e3858cabca..f83fe87680c 100644
--- a/chromium/ash/strings/ash_strings_gu.xtb
+++ b/chromium/ash/strings/ash_strings_gu.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="gu">
<translation id="3595596368722241419">બૅટરી પૂર્ણ ચાર્જ</translation>
-<translation id="5250713215130379958">સ્વતઃછુપાવો લૉન્ચર</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> અને <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">પોર્ટલ સ્ટેટ</translation>
<translation id="30155388420722288">ઓવરફ્લો બટન</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth સક્ષમ છે</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> ને <ph name="ROTATION"/> પર ફેરવવામાં આવ્યું હતું</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth અક્ષમ છે</translation>
+<translation id="7165320105431587207">નેટવર્ક ગોઠવવામાં નિષ્ફળ</translation>
<translation id="3775358506042162758">તમે બહુવિધ સાઇન-ઇનમાં માત્ર ત્રણ એકાઉન્ટ્સ સુધી રાખી શકો છો.</translation>
<translation id="370649949373421643">Wi-Fi સક્ષમ કરો</translation>
<translation id="3626281679859535460">તેજ</translation>
+<translation id="595202126637698455">ભજવણી ટ્રેસિંગ સક્ષમ</translation>
<translation id="8054466585765276473">બેટરી સમયની ગણના કરે છે.</translation>
<translation id="7982789257301363584">નેટવર્ક</translation>
<translation id="5565793151875479467">પ્રોક્સી...</translation>
<translation id="938582441709398163">કીબોર્ડ ઓવરલે</translation>
<translation id="4387004326333427325">પ્રમાણીકરણ પ્રમાણપત્ર રિમોટલી નકારવામાં આવ્યું છે</translation>
<translation id="6979158407327259162">Google ડ્રાઇવ</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> ને <ph name="RESOLUTION"/> પર બદલવામાં આવ્યું હતું</translation>
<translation id="6943836128787782965">HTTP નિષ્ફળ ગયું</translation>
<translation id="2297568595583585744">સ્થિતિ ટ્રે</translation>
<translation id="1661867754829461514">PIN ખૂટે છે</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">નિમ્ન-પાવર ચાર્જર</translation>
<translation id="3846575436967432996">કોઈ નેટવર્ક માહિતી ઉપલબ્ધ નથી</translation>
<translation id="3026237328237090306">મોબાઇલ ડેટા સેટ કરો</translation>
+<translation id="5871632337994001636">ઉપકરણોનું સંચાલન કરો...</translation>
<translation id="785750925697875037">મોબાઇલ એકાઉન્ટ જુઓ</translation>
<translation id="153454903766751181">સેલ્યુલર મોડેમનો પ્રારંભ કરી રહ્યાં છે...</translation>
<translation id="4628814525959230255">Hangouts દ્વારા <ph name="HELPER_NAME"/> સાથે તમારી સ્ક્રીનનું નિયંત્રણ શેર કરવું.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> ને ફેરવવામાં આવ્યું છે</translation>
<translation id="7864539943188674973">Bluetooth અક્ષમ કરો</translation>
<translation id="939252827960237676">સ્ક્રીનશૉટ સાચવવામાં નિષ્ફળ રહ્યું</translation>
<translation id="3126069444801937830">અપડેટ કરવા માટે પુનઃપ્રારંભ કરો</translation>
<translation id="2268813581635650749">બધામાંથી સાઇન આઉટ કરો</translation>
<translation id="735745346212279324">VPN ડિસ્કનેક્ટ કર્યું છે</translation>
<translation id="7320906967354320621">નિષ્ક્રિય</translation>
-<translation id="6303423059719347535">બેટરી <ph name="PERCENTAGE"/> % પૂર્ણ છે</translation>
<translation id="15373452373711364">મોટું માઉસ કર્સર</translation>
-<translation id="2778346081696727092">આપેલા વપરાશકર્તાનામ અથવા પાસવર્ડ સાથે અધિકૃત કરવામાં નિષ્ફળ રહ્યું</translation>
<translation id="3294437725009624529">અતિથિ</translation>
<translation id="8190698733819146287">ભાષાઓ અને ઇનપુટને કસ્ટમાઇઝ કરો...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">શેલ્ફ સ્થિતી</translation>
<translation id="2903907270192926896">ઇનપુટ</translation>
<translation id="8676770494376880701">નિમ્ન-પાવર ચાર્જર કનેક્ટ કર્યું છે</translation>
<translation id="7170041865419449892">પહોંચ બહાર</translation>
<translation id="4804818685124855865">ડિસ્કનેક્ટ કરો</translation>
<translation id="2544853746127077729">નેટવર્ક દ્વારા પ્રમાણીકરણ પ્રમાણપત્ર નકારવામાં આવ્યું</translation>
<translation id="5222676887888702881">સાઇન આઉટ</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">કન્ફિગરેશન</translation>
<translation id="1272079795634619415">રોકો</translation>
<translation id="4957722034734105353">વધુ જાણો...</translation>
<translation id="2964193600955408481">Wi-Fi ને અક્ષમ કરો</translation>
-<translation id="811680302244032017">ઉપકરણ ઉમેરો...</translation>
<translation id="4279490309300973883">પ્રતિબિંબત થઈ રહ્યું છે</translation>
+<translation id="7973962044839454485">ખોટા વપરાશકર્તાનામ અથવા પાસવર્ડને કારણે PPP પ્રમાણીકરણ નિષ્ફળ થયું</translation>
<translation id="2509468283778169019">CAPS LOCK ચાલુ છે</translation>
<translation id="3892641579809465218">આંતરિક પ્રદર્શન</translation>
<translation id="7823564328645135659">તમારી સેટિંગ્સ સમન્વયિત કર્યા પછી ભાષા &quot;<ph name="FROM_LOCALE"/>&quot; થી &quot;<ph name="TO_LOCALE"/>&quot; માં બદલાઈ ગઈ છે.</translation>
<translation id="3368922792935385530">કનેક્ટેડ</translation>
<translation id="8340999562596018839">બોલાયેલ પ્રતિસાદ</translation>
<translation id="8654520615680304441">Wi-Fi ચાલુ કરો...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">તમારી ઇનપુટ પદ્ધતિ <ph name="INPUT_METHOD_ID"/> માં બદલાઇ ગયેલ છે.
સ્વિચ કરવા માટે Shift + Alt દબાવો.</translation>
<translation id="2562916301614567480">ખાનગી નેટવર્ક</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% બાકી</translation>
<translation id="9089416786594320554">ઇનપુટ પદ્ધતિઓ</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">શેલ્ફ</translation>
<translation id="2614835198358683673">જ્યારે તમારી Chromebook ચાલુ હોય ત્યારે તેને ચાર્જ કરી શકાશે નહીં. અધિકૃત ચાર્જરનો ઉપયોગ કરવાનું વિચારો.</translation>
<translation id="1895658205118569222">બંધ કરો</translation>
<translation id="4430019312045809116">વૉલ્યૂમ</translation>
+<translation id="8681498213689260554">અપડેટ કરવા માટે પુનઃપ્રારંભ કરો અને પાવરવૉશ કરો</translation>
<translation id="4442424173763614572">DNS લુકઅપ નિષ્ફળ ગયું</translation>
-<translation id="6356500677799115505">બેટરી સંપૂર્ણ છે અને ચાર્જ થઈ રહી છે.</translation>
<translation id="7874779702599364982">સેલ્યુલર નેટવર્ક્સ માટે શોધી રહ્યું છે...</translation>
<translation id="583281660410589416">અજ્ઞાત</translation>
<translation id="1383876407941801731">શોધ</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">નેટવર્ક માહિતી</translation>
<translation id="1621499497873603021">બેટરી ખાલી થવામાં બાકી સમય, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">અતિથિથી બહાર નીકળો</translation>
-<translation id="4471417012762451363">બેટરી <ph name="PERCENTAGE"/> % પૂર્ણ અને ચાર્જ થઈ રહી છે</translation>
<translation id="8308637677604853869">પહેલાનું મેનૂ</translation>
<translation id="4666297444214622512">બીજા એકાઉન્ટમાં સાઇન ઇન કરી શકતા નથી.</translation>
<translation id="1346748346194534595">જમણે</translation>
@@ -113,6 +119,7 @@
<translation id="6312403991423642364">અજ્ઞાત નેટવર્ક ભૂલ</translation>
<translation id="1467432559032391204">ડાબું</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> ને સક્રિય કરી રહ્યું છે</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">મોટું કરો</translation>
@@ -122,7 +129,6 @@
<translation id="2727977024730340865">નિમ્ન-પાવર ચાર્જરમાં પ્લગ કરેલું છે. બૅટરી ચાર્જિંગ વિશ્વસનીય હશે નહીં.</translation>
<translation id="3784455785234192852">લૉક</translation>
<translation id="2805756323405976993">એપ્લિકેશન્સ</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> નું કદ <ph name="RESOLUTION"/> માં બદલવામાં આવ્યું છે</translation>
<translation id="1512064327686280138">સક્રિયતા નિષ્ફળ</translation>
<translation id="5097002363526479830">નેટવર્ક '<ph name="NAME"/>' થી કનેક્ટ કરવામાં નિષ્ફળ: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi બંધ છે.</translation>
@@ -130,6 +136,7 @@
<translation id="7052914147756339792">વૉલપેપર સેટ કરો...</translation>
<translation id="8678698760965522072">ઓનલાઇન સ્ટેટ</translation>
<translation id="2532589005999780174">ઉચ્ચ કોન્ટ્રાસ્ટ મોડ</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">આંતરિક ભૂલ</translation>
<translation id="3019353588588144572">બેટરી સંપૂર્ણપણે ચાર્જ થવામાં બાકી સમય, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">સ્ક્રીન બૃહદદર્શક</translation>
@@ -152,20 +159,24 @@
<translation id="7029814467594812963">સત્રમાંથી બહાર નીકળો</translation>
<translation id="8454013096329229812">Wi-Fi ચાલુ છે.</translation>
<translation id="4872237917498892622">Alt+Search અથવા Shift</translation>
+<translation id="9201131092683066720">બેટરી <ph name="PERCENTAGE"/> % પૂર્ણ છે.</translation>
<translation id="2983818520079887040">સેટિંગ્સ...</translation>
+<translation id="1195412055398077112">ઓવરસ્કૅન</translation>
<translation id="1717216362413677834">ડૉક મોડ</translation>
+<translation id="112308213915226829">સ્વતઃછુપાવો શેલ્ફ</translation>
<translation id="8927026611342028580">કનેક્ટ કરવાની વિનંતી કરી છે</translation>
<translation id="8300849813060516376">OTASP નિષ્ફળ</translation>
<translation id="2792498699870441125">Alt+Search</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> ફાઇલને સમન્વયિત કરી રહ્યું છે</translation>
+<translation id="5958529069007801266">નિરીક્ષણ કરેલ વપરાશકર્તા</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK બંધ છે</translation>
<translation id="6248847161401822652">છોડવા માટે બે વાર Control Shift Q દબાવો.</translation>
+<translation id="6785414152754474415">બેટરી <ph name="PERCENTAGE"/> % પૂર્ણ અને ચાર્જ થઈ રહી છે.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: સક્રિય કરી રહ્યું છે...</translation>
+<translation id="4895488851634969361">બેટરી સંપૂર્ણ છે.</translation>
<translation id="1391854757121130358">તમે તમારા મોબાઇલ ડેટા ભથ્થાનો ઉપયોગ કરી લીધો હશે.</translation>
-<translation id="5413208160176941586">સ્થાનિક રીતે સંચાલિત વપરાશકર્તા</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">લૉન્ચર સ્થિતિ</translation>
+<translation id="5947494881799873997">પાછા ફરો</translation>
<translation id="7593891976182323525">Search અથવા Shift</translation>
<translation id="7649070708921625228">સહાય</translation>
<translation id="3050422059534974565">CAPS LOCK ચાલુ છે.
@@ -178,22 +189,24 @@
<translation id="6692173217867674490">ખરાબ પાસફ્રેઝ</translation>
<translation id="6165508094623778733">વધુ જાણો</translation>
<translation id="9046895021617826162">કનેક્ટ કરવું નિષ્ફળ</translation>
+<translation id="7168224885072002358">જૂના રિઝોલ્યુશન પર પાછા ફરી રહ્યાં છે <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">આ સત્ર <ph name="SESSION_TIME_REMAINING"/> માં સમાપ્ત થશે. તમને આપમેળે સાઇન આઉટ કરવામાં આવશે.</translation>
<translation id="8372369524088641025">ખરાબ WEP કી</translation>
<translation id="6636709850131805001">અપરિચિત સ્થિતિ</translation>
<translation id="3573179567135747900">&quot;<ph name="FROM_LOCALE"/>&quot; પર પાછાં જાઓ (પુનર્પ્રારંભની જરૂર છે)</translation>
<translation id="8103386449138765447">SMS સંદેશા: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google ડ્રાઇવ સેટિંગ્સ...</translation>
-<translation id="1510238584712386396">લૉન્ચર</translation>
<translation id="7209101170223508707">CAPS LOCK ચાલુ છે.
રદ કરવા માટે Alt+Search અથવા Shift દબાવો.</translation>
<translation id="8940956008527784070">બૅટરી ઓછી (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">સ્વીકારો</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> બાકી</translation>
<translation id="520760366042891468">Hangouts દ્વારા તમારી સ્ક્રીનનું નિયંત્રણ શેર કરી રહ્યું છે.</translation>
<translation id="8000066093800657092">નેટવર્ક નથી</translation>
<translation id="4015692727874266537">બીજા એકાઉન્ટમાં સાઇન ઇન કરો...</translation>
<translation id="5941711191222866238">નાનું કરો</translation>
<translation id="6911468394164995108">અન્યથી જોડાઓ...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>ક <ph name="MINUTE"/>મિ સુધીમાં પૂર્ણ</translation>
<translation id="6359806961507272919"><ph name="PHONE_NUMBER"/> તરફથી SMS</translation>
<translation id="1244147615850840081">વાહક</translation>
diff --git a/chromium/ash/strings/ash_strings_hi.xtb b/chromium/ash/strings/ash_strings_hi.xtb
index d12758fd96d..7882991fab5 100644
--- a/chromium/ash/strings/ash_strings_hi.xtb
+++ b/chromium/ash/strings/ash_strings_hi.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="hi">
<translation id="3595596368722241419">बैटरी पूर्ण</translation>
-<translation id="5250713215130379958">लॉन्चर को स्वत: छिपाएं</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> और <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">पोर्टल स्थिति</translation>
<translation id="30155388420722288">ओवरफ़्लो बटन</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth सक्षम किया गया</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> को <ph name="ROTATION"/> पर घुमाया गया</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth अक्षम किया गया</translation>
+<translation id="7165320105431587207">नेटवर्क कॉन्फ़िगर करने में विफल</translation>
<translation id="3775358506042162758">एकाधिक साइन-इन में आप तीन तक खाते रख सकते हैं.</translation>
<translation id="370649949373421643">Wi-Fi सक्षम करें</translation>
<translation id="3626281679859535460">चमक</translation>
+<translation id="595202126637698455">निष्पादन ट्रेसिंग सक्षम है</translation>
<translation id="8054466585765276473">बैटरी समय की गणना की जा रही है.</translation>
<translation id="7982789257301363584">नेटवर्क</translation>
<translation id="5565793151875479467">प्रॉक्सी...</translation>
<translation id="938582441709398163">कीबोर्ड ओवरले</translation>
<translation id="4387004326333427325">प्रमाणीकरण प्रमाणपत्र को दूरस्थ रूप से अस्वीकार किया गया</translation>
<translation id="6979158407327259162">Google डिस्क</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> रिज़ॉल्यूशन को <ph name="RESOLUTION"/> में बदल दिया गया</translation>
<translation id="6943836128787782965">HTTP विफल हुआ</translation>
<translation id="2297568595583585744">स्थिति ट्रे</translation>
<translation id="1661867754829461514">पिन गुम</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">कम-शक्ति वाला चार्जर</translation>
<translation id="3846575436967432996">कोई नेटवर्क जानकारी उपलब्ध नहीं</translation>
<translation id="3026237328237090306">मोबाइल डेटा सेट करें</translation>
+<translation id="5871632337994001636">उपकरणों को प्रबंधित करें...</translation>
<translation id="785750925697875037">मोबाइल खाते देखें</translation>
<translation id="153454903766751181">सेल्युलर मॉडम प्रारंभ हो रहा है...</translation>
<translation id="4628814525959230255">Hangout के माध्यम से अपनी स्क्रीन <ph name="HELPER_NAME"/> के साथ साझा करना.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> को घुमा दिया गया है</translation>
<translation id="7864539943188674973">Bluetooth अक्षम करें</translation>
<translation id="939252827960237676">स्क्रीनशॉट सहेजने में विफल</translation>
<translation id="3126069444801937830">अपडेट करने के लिए पुनरारंभ करें</translation>
-<translation id="2268813581635650749">सभी साइन आउट करें</translation>
+<translation id="2268813581635650749">सभी प्रस्थान करें</translation>
<translation id="735745346212279324">VPN डिस्कनेक्ट है</translation>
-<translation id="7320906967354320621">निष्क्रिय</translation>
-<translation id="6303423059719347535">बैटरी <ph name="PERCENTAGE"/>% भर गई है</translation>
+<translation id="7320906967354320621">प्रयोग में नहीं</translation>
<translation id="15373452373711364">बड़ा माउस कर्सर</translation>
-<translation id="2778346081696727092">प्रदान किए गए उपयोगकर्तानाम या पासवर्ड से प्रमाणीकृत करने में विफ़ल रहा</translation>
<translation id="3294437725009624529">अतिथि</translation>
<translation id="8190698733819146287">भाषाएं और इनपुट कस्टमाइज़ करें...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">शेल्फ़ की स्थिति</translation>
<translation id="2903907270192926896">इनपुट</translation>
<translation id="8676770494376880701">कम-शक्ति वाला चार्जर</translation>
<translation id="7170041865419449892">सीमा से बाहर</translation>
<translation id="4804818685124855865">डिस्कनेक्ट करें</translation>
<translation id="2544853746127077729">नेटवर्क द्वारा प्रमाणीकरण प्रमाणपत्र अस्वीकार किया गया</translation>
-<translation id="5222676887888702881">साइन आउट करें</translation>
+<translation id="5222676887888702881">प्रस्थान करें</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">कॉन्फ़िगरेशन</translation>
<translation id="1272079795634619415">रोकें</translation>
<translation id="4957722034734105353">और जानें...</translation>
<translation id="2964193600955408481">Wi-Fi अक्षम करें</translation>
-<translation id="811680302244032017">डिवाइस जोड़ें...</translation>
<translation id="4279490309300973883">मिरर करना</translation>
+<translation id="7973962044839454485">किसी गलत उपयोगकर्ता नाम या पासवर्ड के कारण PPP प्रमाणीकरण विफल रहा</translation>
<translation id="2509468283778169019">CAPS LOCK चालू है</translation>
<translation id="3892641579809465218">आंतरिक डिस्प्ले</translation>
<translation id="7823564328645135659">आपकी सेटिंग समन्वयित करने के बाद भाषा को &quot;<ph name="FROM_LOCALE"/>&quot; से &quot;<ph name="TO_LOCALE"/>&quot; में बदल दिया गया है.</translation>
<translation id="3368922792935385530">कनेक्टेड</translation>
<translation id="8340999562596018839">बोला जाने वाला फ़ीडबैक</translation>
<translation id="8654520615680304441">Wi-Fi चालू करें...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">आपकी इनपुट विधि <ph name="INPUT_METHOD_ID"/> में बदल गई है.
स्विच करने के लिए Shift + Alt दबाएं.</translation>
<translation id="2562916301614567480">निजी नेटवर्क</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% शेष है</translation>
<translation id="9089416786594320554">इनपुट पद्धतियां</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">शेल्फ़</translation>
<translation id="2614835198358683673">हो सकता है चालू होने पर आपका Chromebook चार्ज न हो. आधिकारिक चार्जर उपयोग करें.</translation>
<translation id="1895658205118569222">बंद करें</translation>
<translation id="4430019312045809116">मात्रा</translation>
+<translation id="8681498213689260554">अपडेट करने के लिए पुनः प्रारंभ करें या पावरवॉश करें</translation>
<translation id="4442424173763614572">DNS लुकअप विफल</translation>
-<translation id="6356500677799115505">बैटरी भर गई है और चार्ज हो रही है.</translation>
<translation id="7874779702599364982">सेलुलर नेटवर्क खोज रहा है...</translation>
<translation id="583281660410589416">अज्ञात</translation>
<translation id="1383876407941801731">खोज</translation>
@@ -96,9 +103,8 @@
<translation id="2204305834655267233">नेटवर्क जानकारी</translation>
<translation id="1621499497873603021">बैटरी के खाली होने में शेष समय, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">अतिथि सत्र से बाहर निकलें</translation>
-<translation id="4471417012762451363">बैटरी <ph name="PERCENTAGE"/>% भर गई है और चार्ज हो रही है</translation>
<translation id="8308637677604853869">पिछला मेनू</translation>
-<translation id="4666297444214622512">अन्य खाते में साइन इन नहीं कर सकते.</translation>
+<translation id="4666297444214622512">अन्य खाते में प्रवेश नहीं कर सकते.</translation>
<translation id="1346748346194534595">दाएं</translation>
<translation id="1773212559869067373">प्रमाणीकरण प्रमाणपत्र को स्थानीय रूप से अस्वीकार कर दिया गया</translation>
<translation id="8528322925433439945">मोबाइल ...</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">अज्ञात नेटवर्क त्रुटि</translation>
<translation id="1467432559032391204">बाएं</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> सक्रिय हो रहा है</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">बड़ा करें</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">कम-शक्ति वाले चार्जर में प्लग इन करें. बैटरी चार्ज करना संभवत: विश्वसनीय नहीं होगा.</translation>
<translation id="3784455785234192852">लॉक करें</translation>
<translation id="2805756323405976993">एप्लिकेशन</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> का आकार बदलकर <ph name="RESOLUTION"/> कर दिया गया है</translation>
<translation id="1512064327686280138">सक्रियण विफलता</translation>
<translation id="5097002363526479830">नेटवर्क से कनेक्ट करने में विफल '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi बंद है.</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">वॉलपेपर सेट करें...</translation>
<translation id="8678698760965522072">ऑनलाइन स्थिति</translation>
<translation id="2532589005999780174">उच्च कंट्रास्ट मोड</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">आंतरिक त्रुटि</translation>
<translation id="3019353588588144572">बैटरी के पूरी तरह से चार्ज होने में शेष समय, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">स्क्रीन आवर्द्धक</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">सत्र से बाहर निकलें</translation>
<translation id="8454013096329229812">Wi-Fi चालू है.</translation>
<translation id="4872237917498892622">Alt+Search या Shift</translation>
+<translation id="9201131092683066720">बैटरी <ph name="PERCENTAGE"/>% भरी हुई है.</translation>
<translation id="2983818520079887040">सेटिंग...</translation>
+<translation id="1195412055398077112">ओवरस्कैन</translation>
<translation id="1717216362413677834">डॉक मोड</translation>
+<translation id="112308213915226829">शेल्फ़ को स्वत: छिपाएं</translation>
<translation id="8927026611342028580">कनेक्ट करने का अनुरोध किया गया</translation>
<translation id="8300849813060516376">OTASP विफल</translation>
<translation id="2792498699870441125">Alt+Search</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> फ़ाइल/फ़ाइलें समन्वयित हो रही है/हो रही हैं</translation>
+<translation id="5958529069007801266">पर्यवेक्षित उपयोगकर्ता</translation>
<translation id="3709443003275901162">9 से अधिक</translation>
<translation id="639644700271529076">CAPS LOCK बंद है</translation>
<translation id="6248847161401822652">छोड़ने के लिए Control Shift Q दो बार दबाएं.</translation>
+<translation id="6785414152754474415">बैटरी <ph name="PERCENTAGE"/>% भरी हुई है और चार्ज हो रही है.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: सक्रिय हो रहा है...</translation>
+<translation id="4895488851634969361">बैटरी भरी हुई है.</translation>
<translation id="1391854757121130358">संभवत: आपने अपने मोबाइल डेटा सीमा का पूर्ण उपयोग कर लिया है.</translation>
-<translation id="5413208160176941586">स्थानीय रूप से प्रबंधित उपयोगकर्ता</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">लॉन्चर स्थिति</translation>
+<translation id="5947494881799873997">वापस लाएं</translation>
<translation id="7593891976182323525">Search या Shift</translation>
<translation id="7649070708921625228">सहायता</translation>
<translation id="3050422059534974565">CAPS LOCK चालू है.
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">ख़राब पासफ़्रेज़</translation>
<translation id="6165508094623778733">अधिक जानें</translation>
<translation id="9046895021617826162">कनेक्ट करना विफल</translation>
-<translation id="973896785707726617">यह सत्र <ph name="SESSION_TIME_REMAINING"/> में समाप्त हो जाएगा. आपको स्वचालित रूप से साइन आउट कर दिया जाएगा.</translation>
+<translation id="7168224885072002358"><ph name="TIMEOUT_SECONDS"/> में पुराने रिज़ॉल्यूशन में वापस लौट रहा है</translation>
+<translation id="973896785707726617">यह सत्र <ph name="SESSION_TIME_REMAINING"/> में समाप्त हो जाएगा. आपको स्वचालित रूप से प्रस्थान कर दिया जाएगा.</translation>
<translation id="8372369524088641025">ख़राब WEP कुंजी</translation>
<translation id="6636709850131805001">अपरिचित अवस्था</translation>
<translation id="3573179567135747900">&quot;<ph name="FROM_LOCALE"/>&quot; में पुन: बदलें (पुनः आरंभ करने की आवश्यकता है)</translation>
<translation id="8103386449138765447">SMS संदेश: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google डिस्क सेटिंग...</translation>
-<translation id="1510238584712386396">लॉन्चर</translation>
<translation id="7209101170223508707">CAPS LOCK चालू है.
रद्द करने के लिए Alt+Search या Shift दबाएं.</translation>
<translation id="8940956008527784070">बैटरी कम (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">स्वीकार करें</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> शेष</translation>
<translation id="520760366042891468">Hangout के माध्यम से अपनी स्क्रीन साझा करना.</translation>
<translation id="8000066093800657092">नेटवर्क नहीं है</translation>
-<translation id="4015692727874266537">अन्य खाते में साइन इन करें...</translation>
+<translation id="4015692727874266537">अन्य खाते में प्रवेश करें...</translation>
<translation id="5941711191222866238">छोटा करें</translation>
<translation id="6911468394164995108">अन्य में शामिल हों...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">पूरी तरह से चार्ज होने में <ph name="HOUR"/>घं <ph name="MINUTE"/>मि शेष</translation>
<translation id="6359806961507272919"><ph name="PHONE_NUMBER"/> से SMS</translation>
<translation id="1244147615850840081">कैरियर</translation>
diff --git a/chromium/ash/strings/ash_strings_hr.xtb b/chromium/ash/strings/ash_strings_hr.xtb
index b16f82def36..5e3fbd439c8 100644
--- a/chromium/ash/strings/ash_strings_hr.xtb
+++ b/chromium/ash/strings/ash_strings_hr.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="hr">
<translation id="3595596368722241419">Baterija je puna</translation>
-<translation id="5250713215130379958">Automatski sakrij pokretač</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> i <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Stanje mreže: Portal</translation>
<translation id="30155388420722288">Gumb padajućeg izbornika</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth omogućen</translation>
+<translation id="6310121235600822547">Zaslon <ph name="DISPLAY_NAME"/> rotiran je za <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth onemogućen</translation>
+<translation id="7165320105431587207">Konfiguriranje mreže nije uspjelo</translation>
<translation id="3775358506042162758">Možete imati najviše tri računa u višestrukoj prijavi.</translation>
<translation id="370649949373421643">Omogući Wi-Fi</translation>
<translation id="3626281679859535460">Svjetlina</translation>
+<translation id="595202126637698455">Omogućeno je praćenje izvedbe</translation>
<translation id="8054466585765276473">Izračun vremena baterije.</translation>
<translation id="7982789257301363584">Mreža</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Preklapanje tipkovnice</translation>
<translation id="4387004326333427325">Certifikat za autentifikaciju odbijen je daljinski</translation>
<translation id="6979158407327259162">Google disk</translation>
+<translation id="3683428399328702079">Razlučivost zaslona <ph name="DISPLAY_NAME"/> promijenjena je na <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP GET neuspješan</translation>
<translation id="2297568595583585744">Ladica statusa</translation>
<translation id="1661867754829461514">Nedostaje PIN</translation>
@@ -34,39 +38,41 @@ Pritisnite Shift + Alt za promjenu.</translation>
<translation id="2127372758936585790">Punjač male snage</translation>
<translation id="3846575436967432996">Informacije o mreži nisu dostupne</translation>
<translation id="3026237328237090306">Postavi mobilne podatke</translation>
+<translation id="5871632337994001636">Upravljanje uređajima...</translation>
<translation id="785750925697875037">Prikaz mobilnog računa</translation>
<translation id="153454903766751181">Inicijaliziranje modema mobilne mreže...</translation>
<translation id="4628814525959230255">Dijelite kontrolu nad zaslonom s korisnikom <ph name="HELPER_NAME"/> putem značajke Hangouts.</translation>
-<translation id="8343941333792395995">Prikaz <ph name="DISPLAY_NAME"/> zakrenut je</translation>
<translation id="7864539943188674973">Onemogući Bluetooth</translation>
<translation id="939252827960237676">Snimka zaslona nije spremljena</translation>
<translation id="3126069444801937830">Ponovo pokrenite za ažuriranje</translation>
<translation id="2268813581635650749">Odjavi sve</translation>
<translation id="735745346212279324">Veza s VPN-om prekinuta</translation>
<translation id="7320906967354320621">U mirovanju</translation>
-<translation id="6303423059719347535">Baterija je <ph name="PERCENTAGE"/>% puna</translation>
<translation id="15373452373711364">Veliki pokazivač miša</translation>
-<translation id="2778346081696727092">Autentifikacija s priloženim korisničkim imenom i zaporkom nije uspjela</translation>
<translation id="3294437725009624529">Gost</translation>
<translation id="8190698733819146287">Prilagodi jezike i unos...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Položaj police</translation>
<translation id="2903907270192926896">ULAZ</translation>
<translation id="8676770494376880701">Priključen je punjač male snage</translation>
<translation id="7170041865419449892">Izvan raspona</translation>
<translation id="4804818685124855865">Prekini vezu</translation>
<translation id="2544853746127077729">Mreža je odbila certifikat za autentifikaciju</translation>
<translation id="5222676887888702881">Odjava</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfiguracija</translation>
<translation id="1272079795634619415">Zaustavi</translation>
<translation id="4957722034734105353">Saznajte više...</translation>
<translation id="2964193600955408481">Onemogući Wi-Fi</translation>
-<translation id="811680302244032017">Dodajte uređaj...</translation>
<translation id="4279490309300973883">Zrcaljenje</translation>
+<translation id="7973962044839454485">PPP autentifikacija nije uspjela zbog netočnog korisničkog imena ili zaporke</translation>
<translation id="2509468283778169019">Opcija CAPS LOCK uključena</translation>
<translation id="3892641579809465218">Unutarnji zaslon</translation>
<translation id="7823564328645135659">Jezik je promijenjen iz: &quot;<ph name="FROM_LOCALE"/>&quot; u: &quot;<ph name="TO_LOCALE"/>&quot; nakon sinkronizacije vaših postavki.</translation>
<translation id="3368922792935385530">Spojeno</translation>
<translation id="8340999562596018839">Govorne povratne informacije</translation>
<translation id="8654520615680304441">Uključite Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Vaš je način unosa promijenjen u <ph name="INPUT_METHOD_ID"/>.
Pritisnite Shift + Alt za promjenu.</translation>
<translation id="2562916301614567480">Privatna mreža</translation>
@@ -83,11 +89,12 @@ Pritisnite Shift + Alt za promjenu.</translation>
<translation id="3626637461649818317">Preostalo <ph name="PERCENTAGE"/> %</translation>
<translation id="9089416786594320554">Načini unosa</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Polica</translation>
<translation id="2614835198358683673">Chromebook se možda neće puniti dok je uključen. Savjetujemo upotrebu službenog punjača.</translation>
<translation id="1895658205118569222">Isključivanje</translation>
<translation id="4430019312045809116">Glasnoća</translation>
+<translation id="8681498213689260554">Ponovo pokrenite sustav i Powerwash za ažuriranje</translation>
<translation id="4442424173763614572">Nije uspjelo pretraživanje DNS poslužitelja</translation>
-<translation id="6356500677799115505">Baterija je puna i puni se.</translation>
<translation id="7874779702599364982">Traženje mobilnih mreža...</translation>
<translation id="583281660410589416">Nepoznato</translation>
<translation id="1383876407941801731">Pretraživanje</translation>
@@ -96,7 +103,6 @@ Pritisnite Shift + Alt za promjenu.</translation>
<translation id="2204305834655267233">Podaci o mreži</translation>
<translation id="1621499497873603021">Baterija će se isprazniti za <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Izlazak iz sesije gosta</translation>
-<translation id="4471417012762451363">Baterija je <ph name="PERCENTAGE"/>% puna i puni se</translation>
<translation id="8308637677604853869">Prethodni izbornik</translation>
<translation id="4666297444214622512">Prijava na još jedan račun nije moguća.</translation>
<translation id="1346748346194534595">Udesno</translation>
@@ -114,6 +120,7 @@ Pritisnite Ctrl + Alt + Z da biste ih onemogućili.</translation>
<translation id="6312403991423642364">Nepoznata mrežna pogreška</translation>
<translation id="1467432559032391204">Ulijevo</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Aktiviranje mreže <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maksimiziraj</translation>
@@ -123,7 +130,6 @@ Pritisnite Ctrl + Alt + Z da biste ih onemogućili.</translation>
<translation id="2727977024730340865">Uređaj je priključen na punjač male snage. Punjenje baterije možda nije pouzdano.</translation>
<translation id="3784455785234192852">Zaključaj</translation>
<translation id="2805756323405976993">Apps</translation>
-<translation id="8871072142849158571">Veličina prikaza <ph name="DISPLAY_NAME"/> promijenjena je na <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Neuspjela aktivacija</translation>
<translation id="5097002363526479830">Neuspješno povezivanje s mrežom &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi je isključen.</translation>
@@ -131,6 +137,7 @@ Pritisnite Ctrl + Alt + Z da biste ih onemogućili.</translation>
<translation id="7052914147756339792">Postavljanje pozadinske slike...</translation>
<translation id="8678698760965522072">Stanje na mreži</translation>
<translation id="2532589005999780174">Način visokog kontrasta</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Interna pogreška</translation>
<translation id="3019353588588144572">Baterija će se napuniti za <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Povećalo</translation>
@@ -153,20 +160,24 @@ Poruka poslužitelja: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Izlazak iz sesije</translation>
<translation id="8454013096329229812">Wi-Fi je uključen.</translation>
<translation id="4872237917498892622">Alt + Pretraživanje ili Shift</translation>
+<translation id="9201131092683066720">Baterija je <ph name="PERCENTAGE"/>% puna.</translation>
<translation id="2983818520079887040">Postavke...</translation>
+<translation id="1195412055398077112">rubno područje zaslona</translation>
<translation id="1717216362413677834">Način rada na priključnoj stanici</translation>
+<translation id="112308213915226829">Automatski sakrij policu</translation>
<translation id="8927026611342028580">Podnesen je zahtjev za povezivanje</translation>
<translation id="8300849813060516376">OTASP nije uspio</translation>
<translation id="2792498699870441125">Alt + Pretraživanje</translation>
<translation id="8660803626959853127">Sinkroniziranje datoteka (<ph name="COUNT"/>)</translation>
+<translation id="5958529069007801266">Nadzirani korisnik</translation>
<translation id="3709443003275901162">više od 9</translation>
<translation id="639644700271529076">Tipka CAPS LOCK isključena</translation>
<translation id="6248847161401822652">Pritisnite tipke Control, Shift i Q dvaput da biste odustali.</translation>
+<translation id="6785414152754474415">Baterija je <ph name="PERCENTAGE"/>% puna i puni se.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: aktiviranje...</translation>
+<translation id="4895488851634969361">Baterija je puna.</translation>
<translation id="1391854757121130358">Možda ste potrošili dopuštenu količinu mobilnih podataka.</translation>
-<translation id="5413208160176941586">Lokalno upravljani korisnik</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Položaj pokretača</translation>
+<translation id="5947494881799873997">Vrati</translation>
<translation id="7593891976182323525">Pretraživanje ili Shift</translation>
<translation id="7649070708921625228">Pomoć</translation>
<translation id="3050422059534974565">Uključena je opcija CAPS LOCK.
@@ -179,22 +190,24 @@ Pritisnite tipke Pretraživanje ili Shift da biste ju isključili.</translation>
<translation id="6692173217867674490">Pogrešna zaporka</translation>
<translation id="6165508094623778733">Saznajte više</translation>
<translation id="9046895021617826162">Neuspjelo povezivanje</translation>
+<translation id="7168224885072002358">Vraćanje na staru razlučivost za <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Sesija će završiti za <ph name="SESSION_TIME_REMAINING"/>. Bit ćete automatski odjavljeni.</translation>
<translation id="8372369524088641025">Neispravan WEP ključ</translation>
<translation id="6636709850131805001">Neprepoznato stanje</translation>
<translation id="3573179567135747900">Vratite na &quot;<ph name="FROM_LOCALE"/>&quot; (zahtijeva ponovno pokretanje)</translation>
<translation id="8103386449138765447">SMS poruke: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Postavke Google diska...</translation>
-<translation id="1510238584712386396">Pokretač</translation>
<translation id="7209101170223508707">Uključena je opcija CAPS LOCK.
Pritisnite tipke Alt + Pretraživanje ili Shift da biste ju isključili.</translation>
<translation id="8940956008527784070">Baterija je skoro prazna (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Prihvati</translation>
<translation id="5102001756192215136">Preostalo <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Dijelite kontrolu nad zaslonom putem značajke Hangouts.</translation>
<translation id="8000066093800657092">Nema mreže</translation>
<translation id="4015692727874266537">Prijavite se na još jedan račun...</translation>
<translation id="5941711191222866238">Minimiziraj</translation>
<translation id="6911468394164995108">Pridruži se drugoj...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> h <ph name="MINUTE"/> min do završetka punjenja</translation>
<translation id="6359806961507272919">SMS šalje <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Davatelj usluge</translation>
diff --git a/chromium/ash/strings/ash_strings_hu.xtb b/chromium/ash/strings/ash_strings_hu.xtb
index 560b64d7f45..376fef9e5ad 100644
--- a/chromium/ash/strings/ash_strings_hu.xtb
+++ b/chromium/ash/strings/ash_strings_hu.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="hu">
<translation id="3595596368722241419">Akkumulátor feltöltve</translation>
-<translation id="5250713215130379958">Indító automatikus elrejtése</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> és <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Portál állapota</translation>
<translation id="30155388420722288">Túlcsordulás gomb</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth engedélyezve</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> elfordult erre: <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth letiltva</translation>
+<translation id="7165320105431587207">Nem sikerült konfigurálni a hálózatot</translation>
<translation id="3775358506042162758">Legfeljebb három fiókot használhat a többfiókos bejelentkezés során.</translation>
<translation id="370649949373421643">Wi-Fi engedélyezése</translation>
<translation id="3626281679859535460">Fényerő</translation>
+<translation id="595202126637698455">Teljesítménykövetés engedélyezve</translation>
<translation id="8054466585765276473">Akkumulátor-időtartam kiszámítása.</translation>
<translation id="7982789257301363584">Hálózat</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Billentyűzetkiosztás</translation>
<translation id="4387004326333427325">A hitelesítési tanúsítvány távolról elutasítva</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> felbontása erre módosult: <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">A HTTP-lekérés nem sikerült</translation>
<translation id="2297568595583585744">Állapottálca</translation>
<translation id="1661867754829461514">Hiányzó PIN kód</translation>
@@ -34,39 +38,41 @@ A váltáshoz nyomja meg a Shift + Alt billentyűkódot.</translation>
<translation id="2127372758936585790">Kis teljesítményű töltő</translation>
<translation id="3846575436967432996">Nem áll rendelkezésre hálózati információ</translation>
<translation id="3026237328237090306">Mobiladatok beállítása</translation>
+<translation id="5871632337994001636">Eszközök kezelése...</translation>
<translation id="785750925697875037">Mobil fiók megtekintése</translation>
<translation id="153454903766751181">Mobilmodem inicializálása...</translation>
<translation id="4628814525959230255"><ph name="HELPER_NAME"/> segéddel való képernyőmegosztás vezérlése a Hangoutson keresztül.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> elforgatva</translation>
<translation id="7864539943188674973">Bluetooth letiltása</translation>
<translation id="939252827960237676">Nem sikerült menteni a képernyőképet.</translation>
<translation id="3126069444801937830">Indítsa újra a frissítéshez</translation>
<translation id="2268813581635650749">Összes kijelentkeztetése</translation>
<translation id="735745346212279324">A VPN nincs csatlakoztatva</translation>
<translation id="7320906967354320621">Tétlen</translation>
-<translation id="6303423059719347535">Az akkumulátor töltöttsége: <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">Nagy egérmutató</translation>
-<translation id="2778346081696727092">A hitelesítés nem sikerült a megadott felhasználónévvel vagy jelszóval</translation>
<translation id="3294437725009624529">Vendég</translation>
<translation id="8190698733819146287">Nyelvek és beviteli módok személyre szabása...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Polc pozíciója</translation>
<translation id="2903907270192926896">BEMENET</translation>
<translation id="8676770494376880701">Kis teljesítményű töltő csatlakoztatva</translation>
<translation id="7170041865419449892">Tartományon kívül</translation>
<translation id="4804818685124855865">Kapcsolat bontása</translation>
<translation id="2544853746127077729">A hálózat elutasította a hitelesítési tanúsítványt</translation>
<translation id="5222676887888702881">Kijelentkezés</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfiguráció</translation>
<translation id="1272079795634619415">Leállítás</translation>
<translation id="4957722034734105353">További információ...</translation>
<translation id="2964193600955408481">Wi-Fi letiltása</translation>
-<translation id="811680302244032017">Eszköz hozzáadása...</translation>
<translation id="4279490309300973883">Tükrözés</translation>
+<translation id="7973962044839454485">Nem sikerült a PPP-hitelesítés helytelen felhasználónév vagy jelszó miatt</translation>
<translation id="2509468283778169019">A CAPS LOCK be van kapcsolva</translation>
<translation id="3892641579809465218">Belső kijelző</translation>
<translation id="7823564328645135659">A beállítások szinkronizálását követően &quot;<ph name="FROM_LOCALE"/>&quot; nyelvről &quot;<ph name="TO_LOCALE"/>&quot; nyelvre változott a nyelvi beállítás.</translation>
<translation id="3368922792935385530">Kapcsolódva</translation>
<translation id="8340999562596018839">Hangos visszajelzés</translation>
<translation id="8654520615680304441">Wi-Fi bekapcsolása...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">A beviteli mód a következőre változott: <ph name="INPUT_METHOD_ID"/>.
A váltáshoz nyomja meg a Shift + Alt billentyűkódot.</translation>
<translation id="2562916301614567480">Magánhálózat</translation>
@@ -83,11 +89,12 @@ A váltáshoz nyomja meg a Shift + Alt billentyűkódot.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% maradt</translation>
<translation id="9089416786594320554">Beviteli módszerek</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Polc</translation>
<translation id="2614835198358683673">Előfordulhat, hogy a Chromebook nem töltődik, amíg be van kapcsolva. Vegye fontolóra a gyári töltő használatát.</translation>
<translation id="1895658205118569222">Kikapcsolás</translation>
<translation id="4430019312045809116">Hangerő</translation>
+<translation id="8681498213689260554">Indítsa újra, és végezze el a Powerwash folyamatot a frissítéshez</translation>
<translation id="4442424173763614572">A DNS keresése sikertelen</translation>
-<translation id="6356500677799115505">Az akkumulátor teljesen fel van töltve, és töltődik.</translation>
<translation id="7874779702599364982">Mobilhálózatok keresése...</translation>
<translation id="583281660410589416">Ismeretlen</translation>
<translation id="1383876407941801731">Keresés</translation>
@@ -96,7 +103,6 @@ A váltáshoz nyomja meg a Shift + Alt billentyűkódot.</translation>
<translation id="2204305834655267233">Hálózatinformáció</translation>
<translation id="1621499497873603021">Akkumulátor lemerüléséig hátralévő idő: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Kilépés a vendég munkamenetből</translation>
-<translation id="4471417012762451363">Az akkumulátor töltöttsége <ph name="PERCENTAGE"/>%, és töltődik</translation>
<translation id="8308637677604853869">Előző menü</translation>
<translation id="4666297444214622512">Nem lehet bejelentkezni még egy fiókba.</translation>
<translation id="1346748346194534595">Jobbra</translation>
@@ -114,6 +120,7 @@ A tiltásához nyomja le a Ctrl+Alt+Z billentyűkombinációt.</translation>
<translation id="6312403991423642364">Ismeretlen hálózati hiba</translation>
<translation id="1467432559032391204">Balra</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> aktiválása</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Teljes méret</translation>
@@ -123,7 +130,6 @@ A tiltásához nyomja le a Ctrl+Alt+Z billentyűkombinációt.</translation>
<translation id="2727977024730340865">Kis teljesítményű töltőt csatlakoztatott. Az akkumulátor töltése nem megbízható.</translation>
<translation id="3784455785234192852">Zárolás</translation>
<translation id="2805756323405976993">Programok</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> átméretezve: <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Aktiválási hiba</translation>
<translation id="5097002363526479830">Nem sikerült csatlakozni a(z) <ph name="NAME"/> hálózathoz: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi kikapcsolva.</translation>
@@ -131,6 +137,7 @@ A tiltásához nyomja le a Ctrl+Alt+Z billentyűkombinációt.</translation>
<translation id="7052914147756339792">Háttérkép beállítása...</translation>
<translation id="8678698760965522072">Online</translation>
<translation id="2532589005999780174">Nagy kontrasztú mód</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Belső hiba</translation>
<translation id="3019353588588144572">Akkumulátor teljes feltöltéséig hátralévő idő: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Képernyőnagyító</translation>
@@ -153,20 +160,24 @@ Szerverüzenet: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Kilépés a munkamenetből</translation>
<translation id="8454013096329229812">Wi-Fi bekapcsolva.</translation>
<translation id="4872237917498892622">Alt + Keresés vagy Shift</translation>
+<translation id="9201131092683066720">Az akkumulátor töltöttsége: <ph name="PERCENTAGE"/>%.</translation>
<translation id="2983818520079887040">Beállítások...</translation>
+<translation id="1195412055398077112">túlpásztázás</translation>
<translation id="1717216362413677834">Dokkolt mód</translation>
+<translation id="112308213915226829">Polc automatikus elrejtése</translation>
<translation id="8927026611342028580">Csatlakozás kérelmezve</translation>
<translation id="8300849813060516376">OTASP sikertelen</translation>
<translation id="2792498699870441125">Alt + Keresés</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> fájl szinkronizálása</translation>
+<translation id="5958529069007801266">Felügyelt felhasználó</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">A CAPS LOCK ki van kapcsolva</translation>
<translation id="6248847161401822652">A kilépéshez nyomja meg kétszer a Ctrl Shift Q billentyűkódot.</translation>
+<translation id="6785414152754474415">Az akkumulátor töltöttsége <ph name="PERCENTAGE"/>%, és töltődik.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: aktiválás...</translation>
+<translation id="4895488851634969361">Az akkumulátor feltöltve.</translation>
<translation id="1391854757121130358">Elképzelhető, hogy mobil adatforgalmi kerete elfogyott.</translation>
-<translation id="5413208160176941586">Helyileg felügyelt felhasználó</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Pozíció az Indítóban</translation>
+<translation id="5947494881799873997">Visszavonás</translation>
<translation id="7593891976182323525">Keresés vagy Shift</translation>
<translation id="7649070708921625228">Súgó</translation>
<translation id="3050422059534974565">A CAPS LOCK be van kapcsolva.
@@ -179,22 +190,24 @@ Kikapcsolásához nyomja meg a Keresés vagy a Shift billentyűt.</translation>
<translation id="6692173217867674490">Rossz összetett jelszó</translation>
<translation id="6165508094623778733">További információ</translation>
<translation id="9046895021617826162">Csatlakozás sikertelen</translation>
+<translation id="7168224885072002358">Visszaállítás a régi felbontásra <ph name="TIMEOUT_SECONDS"/> mp múlva</translation>
<translation id="973896785707726617">A munkamenet <ph name="SESSION_TIME_REMAINING"/> múlva véget ér. Ekkor a rendszer automatikusan kijelentkezteti.</translation>
<translation id="8372369524088641025">Hibás WEP kulcs</translation>
<translation id="6636709850131805001">Azonosítatlan állam</translation>
<translation id="3573179567135747900">Visszatérés ehhez: &quot;<ph name="FROM_LOCALE"/>&quot; (újraindítás szükséges)</translation>
<translation id="8103386449138765447">SMS-üzenetek: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">A Google Drive beállításai...</translation>
-<translation id="1510238584712386396">Indító</translation>
<translation id="7209101170223508707">A CAPS LOCK be van kapcsolva.
Kikapcsolásához nyomja meg az Alt + Keresés vagy a Shift billentyűt.</translation>
<translation id="8940956008527784070">Alacsony akkumulátortöltöttség (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Elfogadás</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> van hátra</translation>
<translation id="520760366042891468">Képernyő megosztásának vezérlése a Hangoutson keresztül.</translation>
<translation id="8000066093800657092">Nincs hálózat</translation>
<translation id="4015692727874266537">Bejelentkezés másik fiókba...</translation>
<translation id="5941711191222866238">Kicsinyítés</translation>
<translation id="6911468394164995108">Csatlakozás másik hálózathoz...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> ó <ph name="MINUTE"/> p a teljes feltöltésig</translation>
<translation id="6359806961507272919">SMS innen: <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Szállító</translation>
diff --git a/chromium/ash/strings/ash_strings_id.xtb b/chromium/ash/strings/ash_strings_id.xtb
index 3007b2f92bd..5d3919c2e6a 100644
--- a/chromium/ash/strings/ash_strings_id.xtb
+++ b/chromium/ash/strings/ash_strings_id.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="id">
<translation id="3595596368722241419">Baterai penuh</translation>
-<translation id="5250713215130379958">Sembunyikan peluncur secara otomatis</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> dan <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Status portal</translation>
<translation id="30155388420722288">Tombol Luapan</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth diaktifkan</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> diputar ke <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth dinonaktifkan</translation>
+<translation id="7165320105431587207">Gagal mengonfigurasi jaringan</translation>
<translation id="3775358506042162758">Anda hanya dapat memiliki paling banyak tiga akun dalam fitur masuk multipel.</translation>
<translation id="370649949373421643">Aktifkan Wi-Fi</translation>
<translation id="3626281679859535460">Kecerahan</translation>
+<translation id="595202126637698455">Kinerja pelacakan aktif</translation>
<translation id="8054466585765276473">Menghitung masa pakai baterai.</translation>
<translation id="7982789257301363584">Jaringan</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Hamparan Keyboard</translation>
<translation id="4387004326333427325">Sertifikat atutentikasi ditolak dari jarak jauh</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> resolusi diubah menjadi <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP gagal</translation>
<translation id="2297568595583585744">Baki status</translation>
<translation id="1661867754829461514">PIN hilang</translation>
@@ -34,39 +38,41 @@ Tekan Shift + Alt untuk beralih.</translation>
<translation id="2127372758936585790">Pengisi daya rendah</translation>
<translation id="3846575436967432996">Tidak tersedia informasi jaringan</translation>
<translation id="3026237328237090306">Siapkan data seluler</translation>
+<translation id="5871632337994001636">Mengelola perangkat...</translation>
<translation id="785750925697875037">Lihat akun seluler</translation>
<translation id="153454903766751181">Memulai modem seluler...</translation>
<translation id="4628814525959230255">Berbagi kontrol layar Anda dengan <ph name="HELPER_NAME"/> melalui Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> telah diputar</translation>
<translation id="7864539943188674973">Nonaktifkan Bluetooth</translation>
<translation id="939252827960237676">Gagal menyimpan tangkapan layar</translation>
<translation id="3126069444801937830">Mulai ulang untuk memperbarui</translation>
<translation id="2268813581635650749">Keluarkan semua pengguna</translation>
<translation id="735745346212279324">VPN terputus</translation>
<translation id="7320906967354320621">Menganggur</translation>
-<translation id="6303423059719347535">Baterai terisi <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">Kursor mouse besar</translation>
-<translation id="2778346081696727092">Gagal mengautentikasi dengan nama pengguna atau sandi yang diberikan</translation>
<translation id="3294437725009624529">Tamu</translation>
<translation id="8190698733819146287">Sesuaikan bahasa dan masukan...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Posisi rak</translation>
<translation id="2903907270192926896">MASUKAN</translation>
<translation id="8676770494376880701">Pengisi daya rendah terpasang</translation>
<translation id="7170041865419449892">Di luar jangkauan</translation>
<translation id="4804818685124855865">Putuskan</translation>
<translation id="2544853746127077729">Sertifikat autentikasi ditolak oleh jaringan</translation>
<translation id="5222676887888702881">Keluar</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfigurasi</translation>
<translation id="1272079795634619415">Berhenti</translation>
<translation id="4957722034734105353">Pelajari selengkapnya...</translation>
<translation id="2964193600955408481">Nonaktifkan Wi-Fi</translation>
-<translation id="811680302244032017">Tambahkan perangkat...</translation>
<translation id="4279490309300973883">Mencerminkan</translation>
+<translation id="7973962044839454485">Autentifikasi PDB gagal karena nama pengguna dan sandi salah</translation>
<translation id="2509468283778169019">CAPS LOCK aktif</translation>
<translation id="3892641579809465218">Tampilan Internal</translation>
<translation id="7823564328645135659">Bahasa telah diubah dari &quot;<ph name="FROM_LOCALE"/>&quot; menjadi &quot;<ph name="TO_LOCALE"/>&quot; setelah menyinkronkan setelan Anda.</translation>
<translation id="3368922792935385530">Tersambung</translation>
<translation id="8340999562596018839">Masukan lisan</translation>
<translation id="8654520615680304441">Aktifkan Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Metode masukan Anda telah berubah menjadi <ph name="INPUT_METHOD_ID"/>.
Tekan Shift + Alt untuk beralih.</translation>
<translation id="2562916301614567480">Jaringan Pribadi</translation>
@@ -83,11 +89,12 @@ Tekan Shift + Alt untuk beralih.</translation>
<translation id="3626637461649818317">Sisa <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">Metode masukan</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Rak</translation>
<translation id="2614835198358683673">Chromebook Anda mungkin tidak mengisi daya saat sedang menyala. Pertimbangkan untuk menggunakan pengisi daya resmi.</translation>
<translation id="1895658205118569222">Mati</translation>
<translation id="4430019312045809116">Volume</translation>
+<translation id="8681498213689260554">Mulai Ulang dan Powerwash untuk memperbarui</translation>
<translation id="4442424173763614572">Pencarian DNS gagal</translation>
-<translation id="6356500677799115505">Baterai sudah penuh dan masih mengisi.</translation>
<translation id="7874779702599364982">Menelusuri jaringan seluler...</translation>
<translation id="583281660410589416">Tidak diketahui</translation>
<translation id="1383876407941801731">Penelusuran</translation>
@@ -96,7 +103,6 @@ Tekan Shift + Alt untuk beralih.</translation>
<translation id="2204305834655267233">Info Jaringan</translation>
<translation id="1621499497873603021">Waktu yang tersisa hingga baterai kosong, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Keluar dari sesi tamu</translation>
-<translation id="4471417012762451363">Baterai sudah terisi <ph name="PERCENTAGE"/>% dan masih mengisi</translation>
<translation id="8308637677604853869">Menu sebelumnya</translation>
<translation id="4666297444214622512">Tidak dapat masuk ke akun lain.</translation>
<translation id="1346748346194534595">Kanan</translation>
@@ -114,6 +120,7 @@ Tekan Ctrl+Alt+Z untuk menonaktifkan.</translation>
<translation id="6312403991423642364">Kesalahan jaringan tidak dikenal</translation>
<translation id="1467432559032391204">Kiri</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Mengaktifkan <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Perbesar</translation>
@@ -123,7 +130,6 @@ Tekan Ctrl+Alt+Z untuk menonaktifkan.</translation>
<translation id="2727977024730340865">Dipasang ke pengisi daya rendah. Pengisian daya baterai mungkin tidak dapat diandalkan.</translation>
<translation id="3784455785234192852">Kunci</translation>
<translation id="2805756323405976993">Apl</translation>
-<translation id="8871072142849158571">Ukuran <ph name="DISPLAY_NAME"/> telah diubah ke <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Kegagalan aktivasi</translation>
<translation id="5097002363526479830">Gagal menyambung ke jaringan '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi dinonaktifkan.</translation>
@@ -131,6 +137,7 @@ Tekan Ctrl+Alt+Z untuk menonaktifkan.</translation>
<translation id="7052914147756339792">Setel wallpaper...</translation>
<translation id="8678698760965522072">Status online</translation>
<translation id="2532589005999780174">Mode kontras tinggi</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Kesalahan internal</translation>
<translation id="3019353588588144572">Waktu yang tersisa hingga baterai terisi penuh, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Kaca pembesar layar</translation>
@@ -153,20 +160,24 @@ Pesan server: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Keluar dari sesi</translation>
<translation id="8454013096329229812">Wi-Fi diaktifkan.</translation>
<translation id="4872237917498892622">Alt+Telusuri atau Shift</translation>
+<translation id="9201131092683066720">Baterai terisi <ph name="PERCENTAGE"/>%.</translation>
<translation id="2983818520079887040">Setelan...</translation>
+<translation id="1195412055398077112">pemindaian berlebih</translation>
<translation id="1717216362413677834">Mode dok</translation>
+<translation id="112308213915226829">Sembunyikan otomatis rak</translation>
<translation id="8927026611342028580">Sambungan Diminta</translation>
<translation id="8300849813060516376">OTASP gagal</translation>
<translation id="2792498699870441125">Alt+Telusuri</translation>
<translation id="8660803626959853127">Menyinkronkan <ph name="COUNT"/> file</translation>
+<translation id="5958529069007801266">Pengguna yang diawasi</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK tidak aktif</translation>
<translation id="6248847161401822652">Tekan Control Shift Q dua kali untuk keluar.</translation>
+<translation id="6785414152754474415">Baterai sudah terisi <ph name="PERCENTAGE"/>% dan masih mengisi.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Mengaktifkan...</translation>
+<translation id="4895488851634969361">Baterai penuh.</translation>
<translation id="1391854757121130358">Anda mungkin telah menghabiskan jatah data seluler.</translation>
-<translation id="5413208160176941586">Pengguna yang dikelola secara lokal</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Posisi peluncur</translation>
+<translation id="5947494881799873997">Kembalikan</translation>
<translation id="7593891976182323525">Telusuri atau Shift</translation>
<translation id="7649070708921625228">Bantuan</translation>
<translation id="3050422059534974565">CAPS LOCK aktif.
@@ -179,22 +190,24 @@ Tekan Telusuri atau Shift untuk membatalkan.</translation>
<translation id="6692173217867674490">Frasa sandi yang buruk</translation>
<translation id="6165508094623778733">Pelajari lebih lanjut</translation>
<translation id="9046895021617826162">Gagal menyambung</translation>
+<translation id="7168224885072002358">Mengembalikan ke resolusi lama dalam <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Sesi ini akan berakhir dalam <ph name="SESSION_TIME_REMAINING"/>. Anda akan otomatis dikeluarkan.</translation>
<translation id="8372369524088641025">Kunci WEP yang buruk</translation>
<translation id="6636709850131805001">Keadaan yang tidak dikenal</translation>
<translation id="3573179567135747900">Ubah kembali ke &quot;<ph name="FROM_LOCALE"/>&quot; (harus dinyalakan ulang)</translation>
<translation id="8103386449138765447">Pesan SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Setelan Google Drive...</translation>
-<translation id="1510238584712386396">Peluncur</translation>
<translation id="7209101170223508707">CAPS LOCK aktif.
Tekan Alt+Telusuri atau Shift untuk membatalkan.</translation>
<translation id="8940956008527784070">Baterai lemah (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Terima</translation>
<translation id="5102001756192215136">Sisa <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Berbagi kontrol layar Anda melalui Hangouts.</translation>
<translation id="8000066093800657092">Tidak ada jaringan</translation>
<translation id="4015692727874266537">Masuk ke akun lain...</translation>
<translation id="5941711191222866238">Perkecil</translation>
<translation id="6911468394164995108">Bergabung dengan lainnya...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>j <ph name="MINUTE"/>m sampai penuh</translation>
<translation id="6359806961507272919">SMS dari <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operator</translation>
diff --git a/chromium/ash/strings/ash_strings_it.xtb b/chromium/ash/strings/ash_strings_it.xtb
index faa8420e5ff..5ba591b6e55 100644
--- a/chromium/ash/strings/ash_strings_it.xtb
+++ b/chromium/ash/strings/ash_strings_it.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="it">
<translation id="3595596368722241419">Batteria carica</translation>
-<translation id="5250713215130379958">Nascondi automaticamente Avvio applicazioni</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> e <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Stato portale</translation>
<translation id="30155388420722288">Pulsante Overflow</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth attivo</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> è stato ruotato a <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth disattivo</translation>
+<translation id="7165320105431587207">Impossibile configurare la rete</translation>
<translation id="3775358506042162758">Puoi avere massimo tre account per l'accesso simultaneo.</translation>
<translation id="370649949373421643">Attiva Wi-Fi</translation>
<translation id="3626281679859535460">Luminosità</translation>
+<translation id="595202126637698455">Rilevamento del rendimento attivo</translation>
<translation id="8054466585765276473">Calcolo della durata della batteria.</translation>
<translation id="7982789257301363584">Rete</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Overlay tastiera</translation>
<translation id="4387004326333427325">Certificato di autenticazione rifiutato da remoto</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">La risoluzione di <ph name="DISPLAY_NAME"/> è stata modificata in: <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Recupero HTTP non riuscito</translation>
<translation id="2297568595583585744">Barra di stato</translation>
<translation id="1661867754829461514">PIN mancante</translation>
@@ -34,39 +38,41 @@ Premi Maiusc+Alt per cambiare metodo.</translation>
<translation id="2127372758936585790">Caricabatterie a basso consumo</translation>
<translation id="3846575436967432996">Nessuna informazione di rete disponibile</translation>
<translation id="3026237328237090306">Configura dati mobili</translation>
+<translation id="5871632337994001636">Gestisci dispositivi...</translation>
<translation id="785750925697875037">Visualizza account per cellulari</translation>
<translation id="153454903766751181">Inizializzazione del modem per cellulari...</translation>
<translation id="4628814525959230255">Condivisione del controllo dello schermo con <ph name="HELPER_NAME"/> tramite Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> ruotato</translation>
<translation id="7864539943188674973">Disattiva Bluetooth</translation>
<translation id="939252827960237676">Salvataggio dello screenshot non riuscito</translation>
<translation id="3126069444801937830">Riavvia per aggiornare</translation>
<translation id="2268813581635650749">Disconnetti tutti</translation>
<translation id="735745346212279324">VPN scollegata</translation>
<translation id="7320906967354320621">In pausa</translation>
-<translation id="6303423059719347535">La batteria è carica al <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">Puntatore del mouse grande</translation>
-<translation id="2778346081696727092">Autenticazione non riuscita con il nome utente o la password forniti</translation>
<translation id="3294437725009624529">Ospite</translation>
<translation id="8190698733819146287">Personalizza lingue e immissione...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Posizione shelf</translation>
<translation id="2903907270192926896">INGRESSO</translation>
<translation id="8676770494376880701">Caricabatterie a basso consumo collegato</translation>
<translation id="7170041865419449892">Fuori dal raggio d'azione</translation>
<translation id="4804818685124855865">Disconnetti</translation>
<translation id="2544853746127077729">Certificato di autenticazione rifiutato dalla rete</translation>
<translation id="5222676887888702881">Esci</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Configurazione</translation>
<translation id="1272079795634619415">Interrompi</translation>
<translation id="4957722034734105353">Ulteriori informazioni...</translation>
<translation id="2964193600955408481">Disattiva Wi-Fi</translation>
-<translation id="811680302244032017">Aggiungi dispositivo...</translation>
<translation id="4279490309300973883">Mirroring</translation>
+<translation id="7973962044839454485">Autenticazione PPP non riuscita a causa di un nome utente o una password sbagliati</translation>
<translation id="2509468283778169019">BLOC MAIUSC è attivo</translation>
<translation id="3892641579809465218">Display interno</translation>
<translation id="7823564328645135659">La lingua è stata modificata da &quot;<ph name="FROM_LOCALE"/>&quot; a &quot;<ph name="TO_LOCALE"/>&quot; dopo la sincronizzazione delle impostazioni.</translation>
<translation id="3368922792935385530">Connessa</translation>
<translation id="8340999562596018839">Feedback vocale</translation>
<translation id="8654520615680304441">Attiva Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Il metodo di immissione è stato cambiato in <ph name="INPUT_METHOD_ID"/>.
Premi Maiusc+Alt per cambiare metodo.</translation>
<translation id="2562916301614567480">Rete privata</translation>
@@ -83,11 +89,12 @@ Premi Maiusc+Alt per cambiare metodo.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% rimanente</translation>
<translation id="9089416786594320554">Metodi di immissione</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Shelf</translation>
<translation id="2614835198358683673">Il Chromebook potrebbe non ricaricarsi mentre è accesso. Prova a utilizzare il caricabatterie ufficiale.</translation>
<translation id="1895658205118569222">Chiusura</translation>
<translation id="4430019312045809116">Volume</translation>
+<translation id="8681498213689260554">Riavvia ed esegui Powerwash per aggiornare</translation>
<translation id="4442424173763614572">Ricerca DNS non riuscita</translation>
-<translation id="6356500677799115505">La batteria è carica e in ricarica.</translation>
<translation id="7874779702599364982">Ricerca reti cellulari...</translation>
<translation id="583281660410589416">Sconosciuto</translation>
<translation id="1383876407941801731">Ricerca</translation>
@@ -96,7 +103,6 @@ Premi Maiusc+Alt per cambiare metodo.</translation>
<translation id="2204305834655267233">Informazioni di rete</translation>
<translation id="1621499497873603021">Tempo rimanente all'esaurimento della batteria: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Esci da sessione Ospite</translation>
-<translation id="4471417012762451363">La batteria è carica al <ph name="PERCENTAGE"/>% e in ricarica</translation>
<translation id="8308637677604853869">Menu precedente</translation>
<translation id="4666297444214622512">Impossibile accedere a un altro account.</translation>
<translation id="1346748346194534595">Destra</translation>
@@ -114,6 +120,7 @@ Premi Ctrl+Alt+Z per disattivarlo.</translation>
<translation id="6312403991423642364">Errore di rete sconosciuto</translation>
<translation id="1467432559032391204">Sinistra</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Attivazione di <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Ingrandisci</translation>
@@ -123,7 +130,6 @@ Premi Ctrl+Alt+Z per disattivarlo.</translation>
<translation id="2727977024730340865">Collegato a un caricabatterie a basso consumo. La carica della batteria potrebbe non essere affidabile.</translation>
<translation id="3784455785234192852">Blocca</translation>
<translation id="2805756323405976993">Applicazioni</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> è stato ridimensionato a <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Errore di attivazione</translation>
<translation id="5097002363526479830">Connessione alla rete &quot;<ph name="NAME"/>&quot; non riuscita: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi non attivo.</translation>
@@ -131,6 +137,7 @@ Premi Ctrl+Alt+Z per disattivarlo.</translation>
<translation id="7052914147756339792">Imposta sfondo...</translation>
<translation id="8678698760965522072">Stato online</translation>
<translation id="2532589005999780174">Modalità ad alto contrasto</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Errore interno</translation>
<translation id="3019353588588144572">Tempo rimanente al caricamento completo della batteria: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Ingrandimento dello schermo</translation>
@@ -153,20 +160,24 @@ Messaggio del server: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Esci da sessione</translation>
<translation id="8454013096329229812">Wi-Fi attivo.</translation>
<translation id="4872237917498892622">Alt+tasto per la ricerca o Maiusc</translation>
+<translation id="9201131092683066720">Percentuale di caricamento della batteria: <ph name="PERCENTAGE"/>%.</translation>
<translation id="2983818520079887040">Impostazioni...</translation>
+<translation id="1195412055398077112">overscan</translation>
<translation id="1717216362413677834">Modalità dock</translation>
+<translation id="112308213915226829">Nascondi automaticamente shelf</translation>
<translation id="8927026611342028580">Connessione richiesta</translation>
<translation id="8300849813060516376">OTASP non riuscito</translation>
<translation id="2792498699870441125">Alt+tasto per la ricerca</translation>
<translation id="8660803626959853127">Sincronizzazione di <ph name="COUNT"/> file in corso</translation>
+<translation id="5958529069007801266">Utente controllato</translation>
<translation id="3709443003275901162">Più di 9</translation>
<translation id="639644700271529076">Funzione BLOC MAIUSC non attiva</translation>
<translation id="6248847161401822652">Per uscire premi due volte Ctrl+Maiusc+Q.</translation>
+<translation id="6785414152754474415">Percentuale di caricamento batteria: <ph name="PERCENTAGE"/>%. La batteria è in carica.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: attivazione in corso...</translation>
+<translation id="4895488851634969361">La batteria è carica.</translation>
<translation id="1391854757121130358">Potresti avere esaurito la tua quota di dati mobili.</translation>
-<translation id="5413208160176941586">Utente gestito localmente</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Posizione Avvio applicazioni</translation>
+<translation id="5947494881799873997">Ripristina</translation>
<translation id="7593891976182323525">Tasto per la ricerca o Maiusc</translation>
<translation id="7649070708921625228">Guida</translation>
<translation id="3050422059534974565">La funzione BLOC MAIUSC è attiva.
@@ -179,22 +190,24 @@ Premi il tasto per la ricerca o Maiusc per annullare.</translation>
<translation id="6692173217867674490">Passphrase non valida</translation>
<translation id="6165508094623778733">Ulteriori informazioni</translation>
<translation id="9046895021617826162">Connessione non riuscita</translation>
+<translation id="7168224885072002358">Ripristino della risoluzione precedente tra <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Questa sessione terminerà fra <ph name="SESSION_TIME_REMAINING"/>. Verrà eseguita automaticamente la disconnessione.</translation>
<translation id="8372369524088641025">Chiave WEP non valida</translation>
<translation id="6636709850131805001">Stato non riconosciuto</translation>
<translation id="3573179567135747900">Torna a &quot;<ph name="FROM_LOCALE"/>&quot; (è necessario riavviare)</translation>
<translation id="8103386449138765447">Messaggi SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Impostazioni Google Drive...</translation>
-<translation id="1510238584712386396">Avvio applicazioni</translation>
<translation id="7209101170223508707">La funzione BLOC MAIUSC è attiva.
Premi Alt+tasto per la ricerca o Maiusc per annullare.</translation>
<translation id="8940956008527784070">Batteria in esaurimento (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Accetto</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> rimanenti</translation>
<translation id="520760366042891468">Condivisione del controllo dello schermo tramite Hangouts.</translation>
<translation id="8000066093800657092">Nessuna rete</translation>
<translation id="4015692727874266537">Accedi a un altro account...</translation>
<translation id="5941711191222866238">Riduci a icona</translation>
<translation id="6911468394164995108">Connetti a un'altra...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> h e <ph name="MINUTE"/> m per completare la ricarica</translation>
<translation id="6359806961507272919">SMS da <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Gestore</translation>
diff --git a/chromium/ash/strings/ash_strings_iw.xtb b/chromium/ash/strings/ash_strings_iw.xtb
index a71f1be87f8..870abf095e2 100644
--- a/chromium/ash/strings/ash_strings_iw.xtb
+++ b/chromium/ash/strings/ash_strings_iw.xtb
@@ -2,72 +2,78 @@
<!DOCTYPE translationbundle>
<translationbundle lang="iw">
<translation id="3595596368722241419">סוללה מלאה</translation>
-<translation id="5250713215130379958">הסתר אוטומטית את המפעיל</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> ו-<ph name="MINUTE"/></translation>
<translation id="7880025619322806991">מצב הפורטל</translation>
<translation id="30155388420722288">לחצן גלישה</translation>
-<translation id="5571066253365925590">Bluetooth מופעל</translation>
+<translation id="8673028979667498656">270°</translation>
+<translation id="5571066253365925590">‏Bluetooth מופעל</translation>
+<translation id="6310121235600822547">בוצע סיבוב של <ph name="DISPLAY_NAME"/> אל <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
-<translation id="2268130516524549846">Bluetooth מושבת</translation>
+<translation id="2268130516524549846">‏Bluetooth מושבת</translation>
+<translation id="7165320105431587207">כשל בהגדרת התצורה של הרשת</translation>
<translation id="3775358506042162758">ניתן לכלול עד שלושה חשבונות בלבד בכניסה עם מספר חשבונות.</translation>
-<translation id="370649949373421643">הפעל Wi-Fi</translation>
+<translation id="370649949373421643">‏הפעל Wi-Fi</translation>
<translation id="3626281679859535460">בהירות</translation>
+<translation id="595202126637698455">מעקב אחר הביצועים מופעל</translation>
<translation id="8054466585765276473">מחשב זמן סוללה</translation>
<translation id="7982789257301363584">רשת</translation>
-<translation id="5565793151875479467">שרת proxy...</translation>
+<translation id="5565793151875479467">‏שרת proxy...</translation>
<translation id="938582441709398163">שכבת על של מקלדת</translation>
<translation id="4387004326333427325">אישור האימות נדחה מרחוק</translation>
<translation id="6979158407327259162">Google Drive</translation>
-<translation id="6943836128787782965">פעולת get של HTTP נכשלה</translation>
+<translation id="3683428399328702079">הרזולוציה של <ph name="DISPLAY_NAME"/> שונתה ל-<ph name="RESOLUTION"/></translation>
+<translation id="6943836128787782965">‏פעולת get של HTTP נכשלה</translation>
<translation id="2297568595583585744">מגש סטטוס</translation>
-<translation id="1661867754829461514">חסר PIN</translation>
+<translation id="1661867754829461514">‏חסר PIN</translation>
<translation id="4508225577814909926"><ph name="NAME"/>: מתחבר...</translation>
<translation id="4237016987259239829">שגיאת חיבור רשת</translation>
-<translation id="2946640296642327832">הפעל Bluetooth</translation>
+<translation id="2946640296642327832">‏הפעל Bluetooth</translation>
<translation id="6459472438155181876">מרחיב את המסך אל <ph name="DISPLAY_NAME"/></translation>
<translation id="8206859287963243715">סלולארי</translation>
-<translation id="6596816719288285829">כתובת IP</translation>
+<translation id="6596816719288285829">‏כתובת IP</translation>
<translation id="4508265954913339219">ההפעלה נכשלה</translation>
<translation id="3621712662352432595">הגדרות אודיו</translation>
-<translation id="1812696562331527143">שיטת הקלט שלך השתנתה ל-‏<ph name="INPUT_METHOD_ID"/>*(<ph name="BEGIN_LINK"/>צד שלישי<ph name="END_LINK"/>)‎.
+<translation id="1812696562331527143">‏שיטת הקלט שלך השתנתה ל-‏<ph name="INPUT_METHOD_ID"/>*(<ph name="BEGIN_LINK"/>צד שלישי<ph name="END_LINK"/>)‎.
הקש Shift + Alt כדי להחליף.</translation>
<translation id="2127372758936585790">מטען בעל מתח נמוך</translation>
<translation id="3846575436967432996">אין מידע רשת זמין</translation>
<translation id="3026237328237090306">הגדר נתונים לנייד</translation>
+<translation id="5871632337994001636">נהל מכשירים...</translation>
<translation id="785750925697875037">הצג את חשבון הנייד</translation>
<translation id="153454903766751181">מאתחל מודם סלולרי...</translation>
-<translation id="4628814525959230255">משתף את השליטה במסך שלך עם <ph name="HELPER_NAME"/> באמצעות Hangouts.</translation>
-<translation id="8343941333792395995">בוצע סיבוב של <ph name="DISPLAY_NAME"/></translation>
-<translation id="7864539943188674973">השבת Bluetooth</translation>
+<translation id="4628814525959230255">‏משתף את השליטה במסך שלך עם <ph name="HELPER_NAME"/> באמצעות Hangouts.</translation>
+<translation id="7864539943188674973">‏השבת Bluetooth</translation>
<translation id="939252827960237676">שמירת צילום המסך נכשלה</translation>
<translation id="3126069444801937830">הפעל מחדש כדי לעדכן</translation>
<translation id="2268813581635650749">הוצא את כולם</translation>
-<translation id="735745346212279324">VPN מנותק</translation>
+<translation id="735745346212279324">‏VPN מנותק</translation>
<translation id="7320906967354320621">לא פעילה</translation>
-<translation id="6303423059719347535">הסוללה טעונה ב-‎<ph name="PERCENTAGE"/>%‎</translation>
<translation id="15373452373711364">סמן עכבר גדול</translation>
-<translation id="2778346081696727092">האימות נכשל עם שם המשתמש או הסיסמה שסופקו</translation>
<translation id="3294437725009624529">אורח</translation>
<translation id="8190698733819146287">התאם אישית שפה וקלט...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/>‏ (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">מיקום המדף</translation>
<translation id="2903907270192926896">קלט</translation>
<translation id="8676770494376880701">חובר מטען בעל מתח נמוך</translation>
<translation id="7170041865419449892">מחוץ לטווח</translation>
<translation id="4804818685124855865">נתק</translation>
<translation id="2544853746127077729">אישור האימות נדחה על ידי הרשת</translation>
<translation id="5222676887888702881">יציאה</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">תצורה</translation>
<translation id="1272079795634619415">הפסק</translation>
<translation id="4957722034734105353">למידע נוסף...</translation>
-<translation id="2964193600955408481">השבת Wi-Fi</translation>
-<translation id="811680302244032017">הוסף את המכשיר...</translation>
+<translation id="2964193600955408481">‏השבת Wi-Fi</translation>
<translation id="4279490309300973883">שיקוף</translation>
-<translation id="2509468283778169019">CAPS LOCK מופעל</translation>
+<translation id="7973962044839454485">‏אימות PPP נכשל בשל שם משתמש או סיסמה שגויים</translation>
+<translation id="2509468283778169019">‏CAPS LOCK מופעל</translation>
<translation id="3892641579809465218">תצוגה פנימית</translation>
-<translation id="7823564328645135659">שפת Chrome השתנתה מ&quot;<ph name="FROM_LOCALE"/>&quot; ל&quot;<ph name="TO_LOCALE"/>&quot; לאחר סנכרון ההגדרות.</translation>
+<translation id="7823564328645135659">‏שפת Chrome השתנתה מ&quot;<ph name="FROM_LOCALE"/>&quot; ל&quot;<ph name="TO_LOCALE"/>&quot; לאחר סנכרון ההגדרות.</translation>
<translation id="3368922792935385530">מחובר</translation>
<translation id="8340999562596018839">משוב קולי</translation>
-<translation id="8654520615680304441">הפעל את ה-Wi-Fi...</translation>
-<translation id="5825747213122829519">שיטת הקלט שלך השתנתה ל-<ph name="INPUT_METHOD_ID"/>.
+<translation id="8654520615680304441">‏הפעל את ה-Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
+<translation id="5825747213122829519">‏שיטת הקלט שלך השתנתה ל-<ph name="INPUT_METHOD_ID"/>.
הקש Shift + Alt כדי להחליף.</translation>
<translation id="2562916301614567480">רשת פרטית</translation>
<translation id="6549021752953852991">אין רשת סלולרית זמינה</translation>
@@ -76,18 +82,19 @@
<translation id="3087734570205094154">תחתית</translation>
<translation id="3742055079367172538">צילום המסך בוצע</translation>
<translation id="8878886163241303700">מסך מתרחב</translation>
-<translation id="5271016907025319479">לא הוגדר VPN.</translation>
-<translation id="372094107052732682">לחץ על Ctrl+Shift+Q פעמיים כדי לצאת.</translation>
+<translation id="5271016907025319479">‏לא הוגדר VPN.</translation>
+<translation id="372094107052732682">‏לחץ על Ctrl+Shift+Q פעמיים כדי לצאת.</translation>
<translation id="6803622936009808957">לא ניתן היה לשקף מסכים מכיוון שלא נמצאה רזולוציה נתמכת. במקום זאת התצוגה עברה למצב שולחן עבודה מורחב.</translation>
<translation id="1480041086352807611">מצב הדגמה</translation>
-<translation id="3626637461649818317"><ph name="PERCENTAGE"/>%‎ נותרו</translation>
+<translation id="3626637461649818317">‏<ph name="PERCENTAGE"/>%‎ נותרו</translation>
<translation id="9089416786594320554">שיטות קלט</translation>
<translation id="6247708409970142803">%<ph name="PERCENTAGE"/></translation>
-<translation id="2614835198358683673">ייתכן שה-Chromebook שלך לא ייטען בזמן שהוא מופעל. מומלץ להשתמש במטען הראשי.</translation>
+<translation id="2825619548187458965">מדף</translation>
+<translation id="2614835198358683673">‏ייתכן שה-Chromebook שלך לא ייטען בזמן שהוא מופעל. מומלץ להשתמש במטען הראשי.</translation>
<translation id="1895658205118569222">כיבוי</translation>
<translation id="4430019312045809116">עוצמת קול</translation>
-<translation id="4442424173763614572">חיפוש ה-DNS נכשל</translation>
-<translation id="6356500677799115505">הסוללה מלאה ובטעינה.</translation>
+<translation id="8681498213689260554">‏הפעל מחדש ובצע פעולת Powerwash כדי לעדכן</translation>
+<translation id="4442424173763614572">‏חיפוש ה-DNS נכשל</translation>
<translation id="7874779702599364982">מחפש רשתות סלולריות...</translation>
<translation id="583281660410589416">לא ידוע</translation>
<translation id="1383876407941801731">חיפוש</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">פרטי רשת</translation>
<translation id="1621499497873603021">הזמן שנותר עד להתרוקנות הסוללה, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">צא מהפעלת אורח</translation>
-<translation id="4471417012762451363">הסוללה טעונה ב-‎<ph name="PERCENTAGE"/>%‎ ונמצאת בטעינה</translation>
<translation id="8308637677604853869">התפריט הקודם</translation>
<translation id="4666297444214622512">לא ניתן להיכנס לחשבון אחר.</translation>
<translation id="1346748346194534595">ימינה</translation>
@@ -106,14 +112,15 @@
<translation id="8428213095426709021">הגדרות</translation>
<translation id="2372145515558759244">מסנכרן יישומים...</translation>
<translation id="7256405249507348194">שגיאה לא מזוהה: <ph name="DESC"/></translation>
-<translation id="7925247922861151263">בדיקת AAA נכשלה</translation>
+<translation id="7925247922861151263">‏בדיקת AAA נכשלה</translation>
<translation id="8456362689280298700"><ph name="HOUR"/>:<ph name="MINUTE"/> עד שמתמלא</translation>
-<translation id="5787281376604286451">משוב קולי מופעל.
+<translation id="5787281376604286451">‏משוב קולי מופעל.
הקש Ctrl+Alt+Z כדי להשבית אותו.</translation>
<translation id="4479639480957787382">אתרנט</translation>
<translation id="6312403991423642364">שגיאת רשת לא ידועה</translation>
<translation id="1467432559032391204">שמאלה</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">‎0°‎</translation>
<translation id="2354174487190027830">מפעיל את <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">הגדל</translation>
@@ -123,14 +130,14 @@
<translation id="2727977024730340865">מחובר למטען בעל מתח נמוך. ייתכן שטעינת הסוללה לא תהיה אמינה.</translation>
<translation id="3784455785234192852">נעילה</translation>
<translation id="2805756323405976993">יישומים</translation>
-<translation id="8871072142849158571">הגודל של <ph name="DISPLAY_NAME"/> השתנה ל-<ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">כשל בהפעלה</translation>
<translation id="5097002363526479830">ההתחברות לרשת נכשלה '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
-<translation id="1850504506766569011">Wi-Fi כבוי.</translation>
+<translation id="1850504506766569011">‏Wi-Fi כבוי.</translation>
<translation id="8132793192354020517">מחובר ל<ph name="NAME"/></translation>
<translation id="7052914147756339792">הגדר טפט...</translation>
<translation id="8678698760965522072">מצב מקוון</translation>
<translation id="2532589005999780174">מצב ניגודיות גבוהה</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>‏, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">שגיאה פנימית</translation>
<translation id="3019353588588144572">הזמן שנותר עד לטעינה מלאה של הסוללה, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">מגדיל התצוגה</translation>
@@ -144,58 +151,64 @@
<translation id="4032485810211612751"><ph name="HOURS"/>:<ph name="MINUTES"/>:<ph name="SECONDS"/></translation>
<translation id="225680501294068881">סורק לאיתור מכשירים...</translation>
<translation id="5597451508971090205"><ph name="SHORT_WEEKDAY"/>, <ph name="DATE"/></translation>
-<translation id="4448844063988177157">מחפש רשתות Wi-Fi...</translation>
+<translation id="4448844063988177157">‏מחפש רשתות Wi-Fi...</translation>
<translation id="8401662262483418323">הניסיון להתחבר אל '<ph name="NAME"/>' נכשל: <ph name="DETAILS"/>
הודעת השרת: <ph name="SERVER_MSG"/></translation>
<translation id="2475982808118771221">אירעה שגיאה</translation>
-<translation id="7229570126336867161">יש צורך ב-EVDO</translation>
+<translation id="7229570126336867161">‏יש צורך ב-EVDO</translation>
<translation id="2999742336789313416"><ph name="DISPLAY_NAME"/> היא הפעלה ציבורית המנוהלת על ידי <ph name="DOMAIN"/></translation>
<translation id="7029814467594812963">צא מההפעלה</translation>
-<translation id="8454013096329229812">Wi-Fi מופעל.</translation>
-<translation id="4872237917498892622">Alt + חיפוש או Shift</translation>
+<translation id="8454013096329229812">‏Wi-Fi מופעל.</translation>
+<translation id="4872237917498892622">‏Alt + חיפוש או Shift</translation>
+<translation id="9201131092683066720">‏הסוללה טעונה ברמה של ‎<ph name="PERCENTAGE"/>%‎.</translation>
<translation id="2983818520079887040">הגדרות...</translation>
+<translation id="1195412055398077112">סריקת יתר</translation>
<translation id="1717216362413677834">מצב מעגן</translation>
+<translation id="112308213915226829">הסתרה אוטומטית של המדף</translation>
<translation id="8927026611342028580">נשלחה בקשה לחיבור</translation>
-<translation id="8300849813060516376">OTASP נכשל</translation>
-<translation id="2792498699870441125">Alt + חיפוש</translation>
+<translation id="8300849813060516376">‏OTASP נכשל</translation>
+<translation id="2792498699870441125">‏Alt + חיפוש</translation>
<translation id="8660803626959853127">מסנכרן <ph name="COUNT"/> קבצים</translation>
+<translation id="5958529069007801266">משתמש מבוקר</translation>
<translation id="3709443003275901162">‎9+‎</translation>
-<translation id="639644700271529076">CAPS LOCK כבוי</translation>
-<translation id="6248847161401822652">לחץ פעמיים על Control Shift Q כדי לצאת.</translation>
+<translation id="639644700271529076">‏CAPS LOCK כבוי</translation>
+<translation id="6248847161401822652">‏לחץ פעמיים על Control Shift Q כדי לצאת.</translation>
+<translation id="6785414152754474415">‏הסוללה טעונה ברמה של ‎<ph name="PERCENTAGE"/>%‎ ומתבצעת טעינה.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: מפעיל...</translation>
+<translation id="4895488851634969361">הסוללה טעונה במלואה.</translation>
<translation id="1391854757121130358">ייתכן שכבר השתמשת בכל הקצבת הנתונים לנייד.</translation>
-<translation id="5413208160176941586">משתמש המנוהל באופן מקומי</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">מיקום המפעיל</translation>
-<translation id="7593891976182323525">חיפוש או Shift</translation>
+<translation id="5947494881799873997">חזרה לגרסה הקודמת</translation>
+<translation id="7593891976182323525">‏חיפוש או Shift</translation>
<translation id="7649070708921625228">עזרה</translation>
-<translation id="3050422059534974565">CAPS LOCK פועל.
+<translation id="3050422059534974565">‏CAPS LOCK פועל.
הקש על 'חיפוש' או על Shift כדי לבטל.</translation>
<translation id="397105322502079400">מחשב...</translation>
<translation id="158849752021629804">יש צורך ברשת ביתית</translation>
<translation id="6857811139397017780">הפעל את <ph name="NETWORKSERVICE"/></translation>
-<translation id="5864471791310927901">חיפוש DHCP נכשל</translation>
+<translation id="5864471791310927901">‏חיפוש DHCP נכשל</translation>
<translation id="5812035014844949013">פלט</translation>
<translation id="6692173217867674490">משפט-סיסמה גרוע</translation>
<translation id="6165508094623778733">למידע נוסף</translation>
<translation id="9046895021617826162">החיבור נכשל</translation>
+<translation id="7168224885072002358">חוזר לרזולוציה הקודמת בעוד <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">הפעילות הזו באתר תסתיים בעוד <ph name="SESSION_TIME_REMAINING"/>. תנותק אוטומטית.</translation>
-<translation id="8372369524088641025">מקש WEP גרוע</translation>
+<translation id="8372369524088641025">‏מקש WEP גרוע</translation>
<translation id="6636709850131805001">מצב לא מזוהה</translation>
<translation id="3573179567135747900">שנה בחזרה ל&quot;<ph name="FROM_LOCALE"/>&quot; (דורש הפעלה מחדש)</translation>
-<translation id="8103386449138765447">הודעות SMS‏: <ph name="MESSAGE_COUNT"/></translation>
-<translation id="5045002648206642691">הגדרות Google Drive...</translation>
-<translation id="1510238584712386396">מפעיל</translation>
-<translation id="7209101170223508707">CAPS LOCK פועל.
+<translation id="8103386449138765447">‏הודעות SMS‏: <ph name="MESSAGE_COUNT"/></translation>
+<translation id="5045002648206642691">‏הגדרות Google Drive...</translation>
+<translation id="7209101170223508707">‏CAPS LOCK פועל.
הקש על Alt + 'חיפוש' או Shift כדי לבטל.</translation>
-<translation id="8940956008527784070">סוללה חלשה (‎<ph name="PERCENTAGE"/>%‎)</translation>
+<translation id="8940956008527784070">‏סוללה חלשה (‎<ph name="PERCENTAGE"/>%‎)</translation>
+<translation id="4918086044614829423">אשר</translation>
<translation id="5102001756192215136">נותרו <ph name="HOUR"/> <ph name="MINUTE"/></translation>
-<translation id="520760366042891468">משתף את השליטה במסך שלך באמצעות Hangouts.</translation>
+<translation id="520760366042891468">‏משתף את השליטה במסך שלך באמצעות Hangouts.</translation>
<translation id="8000066093800657092">אין רשת</translation>
<translation id="4015692727874266537">הכנס חשבון אחר...</translation>
<translation id="5941711191222866238">מזער</translation>
<translation id="6911468394164995108">הצטרף לרשת אחרת...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>‏: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> שעות ו-<ph name="MINUTE"/> דקות עד לטעינה מלאה</translation>
-<translation id="6359806961507272919">SMS מאת <ph name="PHONE_NUMBER"/> </translation>
+<translation id="6359806961507272919">‏SMS מאת <ph name="PHONE_NUMBER"/> </translation>
<translation id="1244147615850840081">ספק</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ash/strings/ash_strings_ja.xtb b/chromium/ash/strings/ash_strings_ja.xtb
index c98ccb31fe1..180ae7ca056 100644
--- a/chromium/ash/strings/ash_strings_ja.xtb
+++ b/chromium/ash/strings/ash_strings_ja.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ja">
<translation id="3595596368722241419">バッテリー残量: 満</translation>
-<translation id="5250713215130379958">ランチャーを自動的に隠す</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">ポータル状態</translation>
<translation id="30155388420722288">オーバーフロー ボタン</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth オン</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> を <ph name="ROTATION"/> に回転しました</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth オフ</translation>
+<translation id="7165320105431587207">ネットワークを設定できませんでした</translation>
<translation id="3775358506042162758">マルチ ログインできるアカウントは 3 つまでです。</translation>
<translation id="370649949373421643">Wi-Fi を有効にする</translation>
<translation id="3626281679859535460">輝度</translation>
+<translation id="595202126637698455">パフォーマンス追跡機能が有効です</translation>
<translation id="8054466585765276473">バッテリーの残り時間を計算しています。</translation>
<translation id="7982789257301363584">ネットワーク</translation>
<translation id="5565793151875479467">プロキシ...</translation>
<translation id="938582441709398163">キーボード オーバーレイ</translation>
<translation id="4387004326333427325">認証証明書がリモートで拒否されました</translation>
<translation id="6979158407327259162">Google ドライブ</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> の解像度を <ph name="RESOLUTION"/> に変更しました</translation>
<translation id="6943836128787782965">HTTP を取得できませんでした</translation>
<translation id="2297568595583585744">ステータス トレイ</translation>
<translation id="1661867754829461514">PIN がありません</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">低電力の充電器</translation>
<translation id="3846575436967432996">利用可能なネットワーク情報がありません</translation>
<translation id="3026237328237090306">モバイル データをセットアップ</translation>
+<translation id="5871632337994001636">デバイスを管理...</translation>
<translation id="785750925697875037">モバイル アカウントを表示</translation>
<translation id="153454903766751181">セルラー モデムを初期化しています...</translation>
<translation id="4628814525959230255">ハングアウトを介して画面の制御を <ph name="HELPER_NAME"/> さんと共有しています。</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> は回転されました</translation>
<translation id="7864539943188674973">Bluetooth を無効にする</translation>
<translation id="939252827960237676">スクリーンショットを保存できませんでした</translation>
<translation id="3126069444801937830">再起動して更新</translation>
<translation id="2268813581635650749">すべてログアウト</translation>
<translation id="735745346212279324">VPN が切断されました</translation>
<translation id="7320906967354320621">待機中</translation>
-<translation id="6303423059719347535">バッテリー残量: <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">大きいマウス カーソル</translation>
-<translation id="2778346081696727092">入力されたユーザー名またはパスワードで認証できませんでした</translation>
<translation id="3294437725009624529">ゲスト</translation>
<translation id="8190698733819146287">言語と入力方法をカスタマイズ...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/>(<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">シェルフの位置</translation>
<translation id="2903907270192926896">入力</translation>
<translation id="8676770494376880701">低電力の充電器に接続されています</translation>
<translation id="7170041865419449892">圏外</translation>
<translation id="4804818685124855865">切断</translation>
<translation id="2544853746127077729">認証証明書がネットワークによって拒否されました</translation>
<translation id="5222676887888702881">ログアウト</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">設定</translation>
<translation id="1272079795634619415">中止</translation>
<translation id="4957722034734105353">詳細...</translation>
<translation id="2964193600955408481">Wi-Fi を無効にする</translation>
-<translation id="811680302244032017">デバイスを追加...</translation>
<translation id="4279490309300973883">ミラーリングしています</translation>
+<translation id="7973962044839454485">ユーザー名またはパスワードが正しくないため、PPP 認証に失敗しました</translation>
<translation id="2509468283778169019">Caps Lock がオンになっています</translation>
<translation id="3892641579809465218">内蔵ディスプレイ</translation>
<translation id="7823564328645135659">設定の同期後に言語が「<ph name="FROM_LOCALE"/>」から「<ph name="TO_LOCALE"/>」に変更されました。</translation>
<translation id="3368922792935385530">接続済み</translation>
<translation id="8340999562596018839">音声フィードバック</translation>
<translation id="8654520615680304441">Wi-Fi をオンにしています...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">入力方法を <ph name="INPUT_METHOD_ID"/> に変更しました。
切り替えるには Shift+Alt キーを押します。</translation>
<translation id="2562916301614567480">プライベート ネットワーク</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317">残り <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">入力方法</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">シェルフ</translation>
<translation id="2614835198358683673">この充電器がオンになっている間は、Chromebook が充電されない可能性があります。正規の充電器の使用をご検討ください。</translation>
<translation id="1895658205118569222">シャットダウン</translation>
<translation id="4430019312045809116">音量</translation>
+<translation id="8681498213689260554">更新のため、再起動して Powerwash を実行してください</translation>
<translation id="4442424173763614572">DNS を検索できませんでした</translation>
-<translation id="6356500677799115505">バッテリー残量: 満(充電中)</translation>
<translation id="7874779702599364982">携帯電話ネットワークを検索しています...</translation>
<translation id="583281660410589416">不明</translation>
<translation id="1383876407941801731">検索</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">ネットワーク情報</translation>
<translation id="1621499497873603021">バッテリーが空になるまであと: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">ゲスト セッションを終了</translation>
-<translation id="4471417012762451363">バッテリー残量: <ph name="PERCENTAGE"/>%(充電中)</translation>
<translation id="8308637677604853869">前のメニュー</translation>
<translation id="4666297444214622512">別のアカウントにログインすることはできません。</translation>
<translation id="1346748346194534595">右</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">ネットワークが不明なためエラーが発生しました</translation>
<translation id="1467432559032391204">左</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> を有効にしています</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">最大化</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">低電力の充電器に接続しています。バッテリーが充電されない可能性があります。</translation>
<translation id="3784455785234192852">ロック</translation>
<translation id="2805756323405976993">アプリ</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> のサイズが <ph name="RESOLUTION"/> に変更されました</translation>
<translation id="1512064327686280138">起動失敗</translation>
<translation id="5097002363526479830">ネットワーク「<ph name="NAME"/>」に接続できませんでした: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi が無効になりました。</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">壁紙を設定...</translation>
<translation id="8678698760965522072">オンライン状態</translation>
<translation id="2532589005999780174">ハイコントラスト モード</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>、<ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">内部エラー</translation>
<translation id="3019353588588144572">バッテリーがフル充電されるまであと: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">画面拡大鏡</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">セッションを終了</translation>
<translation id="8454013096329229812">Wi-Fi が有効になりました。</translation>
<translation id="4872237917498892622">Alt+ 検索/Shift</translation>
+<translation id="9201131092683066720">バッテリー残量: <ph name="PERCENTAGE"/>%。</translation>
<translation id="2983818520079887040">設定...</translation>
+<translation id="1195412055398077112">オーバースキャン</translation>
<translation id="1717216362413677834">ドック モード</translation>
+<translation id="112308213915226829">シェルフを自動的に隠す</translation>
<translation id="8927026611342028580">接続をリクエスト済み</translation>
<translation id="8300849813060516376">OTASP に失敗しました</translation>
<translation id="2792498699870441125">Alt+ 検索</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> 個のファイルを同期中</translation>
+<translation id="5958529069007801266">監視対象ユーザー</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CapsLock 機能はオフになっています</translation>
<translation id="6248847161401822652">終了するには Ctrl+Shift+Q を 2 回押してください。</translation>
+<translation id="6785414152754474415">バッテリー残量: <ph name="PERCENTAGE"/>%、充電しています。</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: 有効にしています...</translation>
+<translation id="4895488851634969361">バッテリー残量: 満。</translation>
<translation id="1391854757121130358">モバイル データの使用量上限に達した可能性があります。</translation>
-<translation id="5413208160176941586">ローカルの管理対象ユーザー</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">ランチャーの位置</translation>
+<translation id="5947494881799873997">元に戻す</translation>
<translation id="7593891976182323525">検索/Shift</translation>
<translation id="7649070708921625228">ヘルプ</translation>
<translation id="3050422059534974565">CapsLock がオンになっています。
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">パスフレーズが正しくありません</translation>
<translation id="6165508094623778733">詳しく見る</translation>
<translation id="9046895021617826162">接続に失敗しました</translation>
+<translation id="7168224885072002358"><ph name="TIMEOUT_SECONDS"/> 秒後に元の解像度に戻ります</translation>
<translation id="973896785707726617">このセッションはあと <ph name="SESSION_TIME_REMAINING"/>で終了します。終了すると、自動的にログアウトします。</translation>
<translation id="8372369524088641025">WEP キーが正しくありません</translation>
<translation id="6636709850131805001">不明な状態</translation>
<translation id="3573179567135747900">「<ph name="FROM_LOCALE"/>」に戻します(再起動が必要です)</translation>
<translation id="8103386449138765447">SMS メッセージ: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google ドライブの設定...</translation>
-<translation id="1510238584712386396">ランチャー</translation>
<translation id="7209101170223508707">CapsLock がオンになっています。
Alt+ 検索/Shift キーを押すと解除されます。</translation>
<translation id="8940956008527784070">バッテリー残量: 少(<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">承諾</translation>
<translation id="5102001756192215136">残り時間: <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">ハングアウトを介して画面の制御を共有しています。</translation>
<translation id="8000066093800657092">ネットワーク接続なし</translation>
<translation id="4015692727874266537">別のアカウントにログイン...</translation>
<translation id="5941711191222866238">最小化</translation>
<translation id="6911468394164995108">他のネットワークに接続...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">フル充電まで <ph name="HOUR"/> 時間 <ph name="MINUTE"/> 分</translation>
<translation id="6359806961507272919"><ph name="PHONE_NUMBER"/> の SMS</translation>
<translation id="1244147615850840081">通信会社</translation>
diff --git a/chromium/ash/strings/ash_strings_kn.xtb b/chromium/ash/strings/ash_strings_kn.xtb
index 1b3adb9487e..a5bb15e106d 100644
--- a/chromium/ash/strings/ash_strings_kn.xtb
+++ b/chromium/ash/strings/ash_strings_kn.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="kn">
<translation id="3595596368722241419">ಬ್ಯಾಟರಿ ಭರ್ತಿಯಾಗಿದೆ</translation>
-<translation id="5250713215130379958">ಲಾಂಚರ್ ಅನ್ನು ಸ್ವಯಂಮರೆಮಾಡಿ</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> ಮತ್ತು <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">ಪೋರ್ಟಲ್ ಸ್ಥಿತಿ</translation>
<translation id="30155388420722288">ಅತ್ಯಧಿಕ ಬಟನ್</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> ಅನ್ನು <ph name="ROTATION"/> ಗೆ ತಿರುಗಿಸಲಾಗಿದೆ</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation>
+<translation id="7165320105431587207">ನೆಟ್‌ವರ್ಕ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ</translation>
<translation id="3775358506042162758">ಬಹು ಸೈನ್-ಇನ್‌ನಲ್ಲಿ ನೀವು ಮೂರರಷ್ಟು ಖಾತೆಗಳನ್ನು ಮಾತ್ರ ಹೊಂದಬಹುದು.</translation>
<translation id="370649949373421643">Wi-Fi ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
<translation id="3626281679859535460">ಪ್ರಕಾಶಮಾನ</translation>
+<translation id="595202126637698455">ಕಾರ್ಯಕ್ಷಮತೆ ಟ್ರೇಸಿಂಗ್ ಸಕ್ರಿಯಗೊಂಡಿದೆ</translation>
<translation id="8054466585765276473">ಬ್ಯಾಟರಿ ಸಮಯವನ್ನು ಲೆಕ್ಕಾಚಾರ ಮಾಡಲಾಗುತ್ತಿದೆ.</translation>
<translation id="7982789257301363584">ನೆಟ್‌ವರ್ಕ್</translation>
<translation id="5565793151875479467">ಪ್ರಾಕ್ಸಿ...</translation>
<translation id="938582441709398163">ಕೀಬೋರ್ಡ್ ಒವರ್‌ಲೇ</translation>
<translation id="4387004326333427325">ದೃಢೀಕರಣ ಪ್ರಮಾಣಪತ್ರವನ್ನು ರಿಮೋಟ್ ಆಗಿ ತಿರಸ್ಕರಿಸಲಾಗಿದೆ</translation>
<translation id="6979158407327259162">Google ಡ್ರೈವ್‌‌</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> ರೆಸಲ್ಯೂಷನ್ ಅನ್ನು <ph name="RESOLUTION"/> ಗೆ ಬದಲಿಸಲಾಗಿದೆ</translation>
<translation id="6943836128787782965">HTTP ವಿಫಲವಾಗಿದೆ</translation>
<translation id="2297568595583585744">ಸ್ಥಿತಿ ಟ್ರೆ</translation>
<translation id="1661867754829461514">PIN ಕಾಣೆಯಾಗಿದೆ</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">ಕಡಿಮೆ ವಿದ್ಯುತ್ ಚಾರ್ಜರ್</translation>
<translation id="3846575436967432996">ನೆಟ್‌ವರ್ಕ್ ಮಾಹಿತಿ ಲಭ್ಯವಿಲ್ಲ</translation>
<translation id="3026237328237090306">ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಹೊಂದಿಸಿ</translation>
+<translation id="5871632337994001636">ಸಾಧನಗಳನ್ನು ನಿರ್ವಹಿಸಿ...</translation>
<translation id="785750925697875037">ಮೊಬೈಲ್ ಖಾತೆಯನ್ನು ವೀಕ್ಷಿಸಿ</translation>
<translation id="153454903766751181">ಸೆಲ್ಯುಲಾರ್ ಮೋಡೆಮ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ...</translation>
<translation id="4628814525959230255">Hangouts ಮೂಲಕ <ph name="HELPER_NAME"/> ಅವರೊಂದಿಗೆ ನಿಮ್ಮ ಪರದೆಯ ನಿಯಂತ್ರಣವನ್ನು ಹಂಚಲಾಗುತ್ತಿದೆ.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> ಅನ್ನು ತಿರುಗಿಸಲಾಗಿದೆ</translation>
<translation id="7864539943188674973">bluetooth ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
<translation id="939252827960237676">ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಉಳಿಸುವಲ್ಲಿ ವಿಫಲವಾಗಿದೆ</translation>
<translation id="3126069444801937830">ನವೀಕರಿಸಲು ಮರುಪ್ರಾರಂಭಿಸಿ</translation>
<translation id="2268813581635650749">ಎಲ್ಲವನ್ನೂ ಸೈನ್ ಔಟ್ ಮಾಡಿ</translation>
<translation id="735745346212279324">VPN ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ</translation>
<translation id="7320906967354320621">ಕಾರ್ಯನಿರತವಾಗಿಲ್ಲ</translation>
-<translation id="6303423059719347535">ಬ್ಯಾಟರಿ <ph name="PERCENTAGE"/>% ಪೂರ್ಣವಾಗಿದೆ</translation>
<translation id="15373452373711364">ದೊಡ್ಡ ಮೌಸ್ ಕರ್ಸರ್</translation>
-<translation id="2778346081696727092">ಒದಗಿಸಲಾದ ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್‌ನೊಂದಿಗಿನ ದೃಢೀಕರಣವು ವಿಫಲಗೊಂಡಿದೆ</translation>
<translation id="3294437725009624529">ಅತಿಥಿ</translation>
<translation id="8190698733819146287">ಭಾಷೆಗಳು ಮತ್ತು ಇನ್‌ಪುಟ್ ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">ಶೆಲ್ಫ್ ಸ್ಥಾನ</translation>
<translation id="2903907270192926896">ಇನ್‌ಪುಟ್</translation>
<translation id="8676770494376880701">ಕಡಿಮೆ ವಿದ್ಯುತ್ ಚಾರ್ಜರ್ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ</translation>
<translation id="7170041865419449892">ವ್ಯಾಪ್ತಿಯ ಹೊರಗೆ</translation>
<translation id="4804818685124855865">ಡಿಸ್‌ಕನೆಕ್ಟ್</translation>
<translation id="2544853746127077729">ದೃಢೀಕರಣ ಪ್ರಮಾಣಪತ್ರವನ್ನು ನೆಟ್‌ವರ್ಕ್‌ನಿಂದ ತಿರಸ್ಕರಿಸಲಾಗಿದೆ</translation>
<translation id="5222676887888702881">ಸೈನ್ ಔಟ್</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">ಕಾನ್ಫಿಗರೇಶನ್</translation>
<translation id="1272079795634619415">ನಿಲ್ಲಿಸು</translation>
<translation id="4957722034734105353">ಇನ್ನಷ್ಟು ತಿಳಿದುಕೊಳ್ಳಿ...</translation>
<translation id="2964193600955408481">Wi-Fi ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
-<translation id="811680302244032017">ಸಾಧನ ಸೇರಿಸಿ...</translation>
<translation id="4279490309300973883">ಪ್ರತಿಬಿಂಬಿಸುವಿಕೆ</translation>
+<translation id="7973962044839454485">ತಪ್ಪಾದ ಬಳಕೆದಾರ ಹೆಸರು ಮತ್ತು ಪಾಸ್‌ವರ್ಡ್‌ನಿಂದಾಗಿ PPP ದೃಢೀಕರಣ ವಿಫಲವಾಗಿದೆ</translation>
<translation id="2509468283778169019">CAPS LOCK ಆನ್ ಆಗಿದೆ</translation>
<translation id="3892641579809465218">ಆಂತರಿಕ ಪ್ರದರ್ಶನ</translation>
<translation id="7823564328645135659">ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಿದ ನಂತರ ಭಾಷೆಯನ್ನು &quot;<ph name="FROM_LOCALE"/>&quot; ನಿಂದ &quot;<ph name="TO_LOCALE"/>&quot; ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ.</translation>
<translation id="3368922792935385530">ಸಂಪರ್ಕಿಸಲಾಗಿದೆ</translation>
<translation id="8340999562596018839">ಮಾತನಾಡುವ ಪ್ರತಿಕ್ರಿಯೆ</translation>
<translation id="8654520615680304441">Wi-Fi ಆನ್ ಮಾಡಿ...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519"><ph name="INPUT_METHOD_ID"/> ಗೆ ನಿಮ್ಮ ಇನ್‌ಪುಟ್ ವಿಧಾನವನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.
ಬದಲಿಸಲು Shift + Alt ಕೀಲಿಯನ್ನು ಒತ್ತಿರಿ.</translation>
<translation id="2562916301614567480">ಖಾಸಗಿ ನೆಟ್‌ವರ್ಕ್‌</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% ಉಳಿದಿದೆ</translation>
<translation id="9089416786594320554">ಇನ್‌ಪುಟ್ ವಿಧಾನಗಳು</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">ಶೆಲ್ಫ್</translation>
<translation id="2614835198358683673">ನಿಮ್ಮ Chromebook ಆನ್ ಆಗಿರುವಾಗ ಅದು ಚಾರ್ಜ್ ಆಗುವುದಿಲ್ಲ. ಅಧಿಕೃತ ಚಾರ್ಜರ್ ಬಳಸಿ.</translation>
<translation id="1895658205118569222">ಶಟ್‌ಡೌನ್</translation>
<translation id="4430019312045809116">ವಾಲ್ಯೂಮ್</translation>
+<translation id="8681498213689260554">ನವೀಕರಿಸಲು ಮರುಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಪವರ್‌ವಾಶ್ ಮಾಡಿ</translation>
<translation id="4442424173763614572">DNS ಲುಕಪ್ ವಿಫಲವಾಗಿದೆ</translation>
-<translation id="6356500677799115505">ಬ್ಯಾಟರಿ ಪೂರ್ಣಗೊಂಡಿದೆ ಮತ್ತು ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ.</translation>
<translation id="7874779702599364982">ಸೆಲ್ಯುಲರ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳಿಗಾಗಿ ಹುಡುಕುತ್ತಿದೆ...</translation>
<translation id="583281660410589416">ಅಜ್ಞಾತ</translation>
<translation id="1383876407941801731">ಹುಡುಕಾಟ</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">ನೆಟ್‌ವರ್ಕ್ ಮಾಹಿತಿ</translation>
<translation id="1621499497873603021">ಬ್ಯಾಟರಿ ಖಾಲಿ ಆಗುವವರೆಗೆ ಉಳಿದಿರುವ ಸಮಯ, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">ಅತಿಥಿ ಸೆಶೆನ್‌ನಿಂದ ನಿರ್ಗಮಿಸು</translation>
-<translation id="4471417012762451363">ಬ್ಯಾಟರಿ <ph name="PERCENTAGE"/>% ಪೂರ್ಣವಾಗಿದೆ ಮತ್ತು ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ</translation>
<translation id="8308637677604853869">ಹಿಂದಿನ ಮೆನು</translation>
<translation id="4666297444214622512">ಮತ್ತೊಂದು ಖಾತೆಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</translation>
<translation id="1346748346194534595">ಬಲಕ್ಕೆ</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">ಅಜ್ಞಾತ ನೆಟ್‌ವರ್ಕ್ ದೋಷ</translation>
<translation id="1467432559032391204">ಎಡಕ್ಕೆ</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">ಗರಿಷ್ಠಗೊಳಿಸು</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">ಕಡಿಮೆ ವಿದ್ಯುತ್ ಚಾರ್ಜರ್‌ಗೆ ಪ್ಲಗ್ ಮಾಡಲಾಗಿದೆ. ಬ್ಯಾಟರಿ ಚಾರ್ಜಿಂಗ್ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿಲ್ಲದಿರಬಹುದು.</translation>
<translation id="3784455785234192852">ಲಾಕ್ ಮಾಡಿ</translation>
<translation id="2805756323405976993">ಅಪ್ಲಿಕೇಶನ್‌ಗಳು</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> ಅನ್ನು <ph name="RESOLUTION"/> ಗೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ</translation>
<translation id="1512064327686280138">ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ ವಿಫಲವಾಗಿದೆ</translation>
<translation id="5097002363526479830">'<ph name="NAME"/>' ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲು ವಿಫಲವಾಗಿದೆ: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi ಆಫ್ ಮಾಡಲಾಗಿದೆ.</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">ವಾಲ್‌ಪೇಪರ್ ಅನ್ನು ಹೊಂದಿಸಿ...</translation>
<translation id="8678698760965522072">ಆನ್‌ಲೈನ್ ಸ್ಥಿತಿ</translation>
<translation id="2532589005999780174">ಉನ್ನತ ಕಾಂಟ್ರಾಸ್ಟ್ ಮೋಡ್</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">ಆಂತರಿಕ ದೋಷ</translation>
<translation id="3019353588588144572">ಬ್ಯಾಟರಿ ಪೂರ್ಣವಾಗಿ ಚಾರ್ಜ್ ಆಗುವವರೆಗೆ ಉಳಿದಿರುವ ಸಮಯ, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">ಪರದೆ ವರ್ಧಕ</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">ಸೆಶನ್‌ನಿಂದ ನಿರ್ಗಮಿಸು</translation>
<translation id="8454013096329229812">Wi-Fi ಆನ್ ಮಾಡಲಾಗಿದೆ.</translation>
<translation id="4872237917498892622">Alt+ಹುಡುಕಾಟ ಅಥವಾ Shift</translation>
+<translation id="9201131092683066720">ಬ್ಯಾಟರಿ <ph name="PERCENTAGE"/>% ಪೂರ್ಣವಾಗಿದೆ.</translation>
<translation id="2983818520079887040">ಸೆಟ್ಟಿಂಗ್‌ಗಳು...</translation>
+<translation id="1195412055398077112">ಓವರ್‌ಸ್ಕ್ಯಾನ್</translation>
<translation id="1717216362413677834">ಡಾಕ್ ಮೋಡ್</translation>
+<translation id="112308213915226829">ಶೆಲ್ಫ್ ಅನ್ನು ಸ್ವಯಂಮರೆಮಾಡು</translation>
<translation id="8927026611342028580">ಸಂಪರ್ಕವನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ</translation>
<translation id="8300849813060516376">OTASP ವಿಫಲವಾಗಿದೆ</translation>
<translation id="2792498699870441125">Alt+ಹುಡುಕಾಟ</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> ಫೈಲ್‌(ಗಳ) ಅನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
+<translation id="5958529069007801266">ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರು</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK ಆಫ್ ಆಗಿದೆ</translation>
<translation id="6248847161401822652">ತೊರೆಯಲು Control Shift Q ಅನ್ನು ಎರಡು ಬಾರಿ ಒತ್ತಿರಿ.</translation>
+<translation id="6785414152754474415">ಬ್ಯಾಟರಿ <ph name="PERCENTAGE"/>% ಪೂರ್ಣಗೊಂಡಿದೆ ಮತ್ತು ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ...</translation>
+<translation id="4895488851634969361">ಬ್ಯಾಟರಿ ತುಂಬಿದೆ.</translation>
<translation id="1391854757121130358">ನಿಮ್ಮ ಮೊಬೈಲ್ ಡೇಟಾ ಭತ್ಯೆಯನ್ನು ನೀವು ಬಳಸಿರಬಹುದು.</translation>
-<translation id="5413208160176941586">ಸ್ಥಳೀಯವಾಗಿ ನಿರ್ವಹಿಸಲಾದ ಬಳಕೆದಾರ</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">ಲಾಂಚರ್ ಸ್ಥಾನ</translation>
+<translation id="5947494881799873997">ಹಿಂತಿರುಗಿಸು</translation>
<translation id="7593891976182323525">ಹುಡುಕಾಟ ಅಥವಾ Shift</translation>
<translation id="7649070708921625228">ಸಹಾಯ</translation>
<translation id="3050422059534974565">CAPS LOCK ಆನ್ ಆಗಿದೆ.
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">ಕೆಟ್ಟ ಪಾಸ್‌ಫ್ರೇಸ್</translation>
<translation id="6165508094623778733">ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation>
<translation id="9046895021617826162">ಸಂಪರ್ಕವು ವಿಫಲವಾಗಿದೆ</translation>
+<translation id="7168224885072002358"><ph name="TIMEOUT_SECONDS"/> ನಲ್ಲಿ ಹಳೆಯ ರೆಸಲ್ಯೂಷನ್‌ಗೆ ಹಿಂತಿರುಗಿಸಲಾಗುತ್ತಿದೆ</translation>
<translation id="973896785707726617">ಈ ಸೆಷನ್ <ph name="SESSION_TIME_REMAINING"/> ರಲ್ಲಿ ಮುಕ್ತಾಯಗೊಳ್ಳುತ್ತದೆ. ನಿಮ್ಮನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್ ಔಟ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation>
<translation id="8372369524088641025">ಕೆಟ್ಟ WEP ಕೀ</translation>
<translation id="6636709850131805001">ಅಂಗೀಕಾರವಲ್ಲದ ರಾಜ್ಯ</translation>
<translation id="3573179567135747900">&quot;<ph name="FROM_LOCALE"/>&quot; ಗೆ ಮರುಬದಲಾಯಿಸಿ (ಮರುಪ್ರಾರಂಭಿಸುವ ಅಗತ್ಯವಿದೆ)</translation>
<translation id="8103386449138765447">SMS ಸಂದೇಶಗಳು: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google ಡ್ರೈವ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು...</translation>
-<translation id="1510238584712386396">ಲಾಂಚರ್</translation>
<translation id="7209101170223508707">CAPS LOCK ಆನ್ ಆಗಿದೆ.
ರದ್ದುಗೊಳಿಸಲು Alt+ಹುಡುಕಾಟ ಅಥವಾ Shift ಕೀಲಿಯನ್ನು ಒತ್ತಿರಿ</translation>
<translation id="8940956008527784070">ಬ್ಯಾಟರಿ ಕಡಿಮೆ (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">ಸಮ್ಮತಿಸು</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> ಉಳಿದಿದೆ</translation>
<translation id="520760366042891468">Hangouts ಮೂಲಕ ನಿಮ್ಮ ಪರದೆಯ ನಿಯಂತ್ರಣವನ್ನು ಹಂಚಲಾಗುತ್ತಿದೆ.</translation>
<translation id="8000066093800657092">ನೆಟ್‌ವರ್ಕ್ ಇಲ್ಲ</translation>
<translation id="4015692727874266537">ಮತ್ತೊಂದು ಖಾತೆಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ...</translation>
<translation id="5941711191222866238">ಕುಗ್ಗಿಸು</translation>
<translation id="6911468394164995108">ಇತರರನ್ನು ಸೇರಿ...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">ಪೂರ್ಣವಾಗುವವರಗೆ <ph name="HOUR"/>ಗಂ <ph name="MINUTE"/>ನಿ</translation>
<translation id="6359806961507272919"><ph name="PHONE_NUMBER"/> ನಿಂದ SMS</translation>
<translation id="1244147615850840081">ವಾಹಕ</translation>
diff --git a/chromium/ash/strings/ash_strings_ko.xtb b/chromium/ash/strings/ash_strings_ko.xtb
index bb158ca6a3e..5c77190241c 100644
--- a/chromium/ash/strings/ash_strings_ko.xtb
+++ b/chromium/ash/strings/ash_strings_ko.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ko">
<translation id="3595596368722241419">배터리 충전 완료</translation>
-<translation id="5250713215130379958">실행기 자동으로 숨기기</translation>
<translation id="7814236020522506259"><ph name="HOUR"/>시간 <ph name="MINUTE"/>분</translation>
<translation id="7880025619322806991">포털 상태</translation>
<translation id="30155388420722288">오버플로 버튼</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">블루투스를 사용함</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/>(이)가 <ph name="ROTATION"/>(으)로 회전되었습니다.</translation>
<translation id="9074739597929991885">블루투스</translation>
<translation id="2268130516524549846">블루투스를 사용 안 함</translation>
+<translation id="7165320105431587207">네트워크를 설정하지 못했습니다.</translation>
<translation id="3775358506042162758">멀티 로그인 시 계정은 최대 3개까지만 사용할 수 있습니다.</translation>
<translation id="370649949373421643">Wi-Fi 사용</translation>
<translation id="3626281679859535460">밝기</translation>
+<translation id="595202126637698455">성능 추적 사용 중</translation>
<translation id="8054466585765276473">배터리 시간 계산 중</translation>
<translation id="7982789257301363584">네트워크</translation>
<translation id="5565793151875479467">프록시...</translation>
<translation id="938582441709398163">키보드 오버레이</translation>
<translation id="4387004326333427325">인증서가 원격으로 거부됨</translation>
<translation id="6979158407327259162">Google 드라이브</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> 해상도가 <ph name="RESOLUTION"/>(으)로 변경되었습니다.</translation>
<translation id="6943836128787782965">HTTP 실패</translation>
<translation id="2297568595583585744">상태 표시줄</translation>
<translation id="1661867754829461514">PIN이 없습니다.</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">저출력 충전기</translation>
<translation id="3846575436967432996">네트워크 정보 없음</translation>
<translation id="3026237328237090306">모바일 데이터 설정</translation>
+<translation id="5871632337994001636">기기 관리...</translation>
<translation id="785750925697875037">모바일 계정 표시</translation>
<translation id="153454903766751181">휴대전화 모뎀 초기화하는 중...</translation>
<translation id="4628814525959230255">행아웃을 통해 화면 제어를 <ph name="HELPER_NAME"/>님과 공유 중</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/>이(가) 회전됨</translation>
<translation id="7864539943188674973">블루투스 사용 안 함</translation>
<translation id="939252827960237676">캡처화면을 저장하지 못했습니다.</translation>
<translation id="3126069444801937830">업데이트하려면 다시 시작</translation>
<translation id="2268813581635650749">모두 로그아웃</translation>
<translation id="735745346212279324">VPN 연결 끊김</translation>
<translation id="7320906967354320621">대기</translation>
-<translation id="6303423059719347535">배터리가 <ph name="PERCENTAGE"/>% 충전됨</translation>
<translation id="15373452373711364">큰 마우스 커서</translation>
-<translation id="2778346081696727092">제공한 사용자 이름 또는 비밀번호로 인증하지 못했습니다.</translation>
<translation id="3294437725009624529">손님</translation>
<translation id="8190698733819146287">언어 및 입력 설정...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/>(<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">서가 위치</translation>
<translation id="2903907270192926896">입력:</translation>
<translation id="8676770494376880701">저출력 충전기 연결됨</translation>
<translation id="7170041865419449892">범위를 벗어났습니다.</translation>
<translation id="4804818685124855865">연결 해제</translation>
<translation id="2544853746127077729">인증서가 네트워크에 의해 거부됨</translation>
<translation id="5222676887888702881">로그아웃</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">설정</translation>
<translation id="1272079795634619415">중지</translation>
<translation id="4957722034734105353">자세히 알아보기...</translation>
<translation id="2964193600955408481">Wi-Fi 사용 안 함</translation>
-<translation id="811680302244032017">기기 추가...</translation>
<translation id="4279490309300973883">미러링</translation>
+<translation id="7973962044839454485">사용자 이름 또는 비밀번호가 잘못되어 PPP 인증에 실패했습니다.</translation>
<translation id="2509468283778169019">CAPS LOCK이 켜져 있습니다.</translation>
<translation id="3892641579809465218">내부 디스플레이</translation>
<translation id="7823564328645135659">설정을 동기화한 뒤 Chrome의 언어가 '<ph name="FROM_LOCALE"/>'에서 '<ph name="TO_LOCALE"/>'(으)로 변경되었습니다.</translation>
<translation id="3368922792935385530">연결됨</translation>
<translation id="8340999562596018839">음성 피드백</translation>
<translation id="8654520615680304441">Wi-Fi 사용...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">입력 방법이 <ph name="INPUT_METHOD_ID"/>(으)로 변경되었습니다.
전환하려면 Shift+Alt를 누르세요.</translation>
<translation id="2562916301614567480">사설 네트워크</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% 남음</translation>
<translation id="9089416786594320554">입력 방법</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">서가</translation>
<translation id="2614835198358683673">크롬북이 켜져 있으면 충전되지 않을 수 있습니다. 공식 충전기를 사용해보세요.</translation>
<translation id="1895658205118569222">종료</translation>
<translation id="4430019312045809116">볼륨</translation>
+<translation id="8681498213689260554">업데이트하려면 다시 시작하고 Powerwash하세요.</translation>
<translation id="4442424173763614572">DNS 조회 실패</translation>
-<translation id="6356500677799115505">배터리 충전이 완료되었으며 충전 중입니다.</translation>
<translation id="7874779702599364982">휴대전화 네트워크를 검색하는 중...</translation>
<translation id="583281660410589416">알 수 없음</translation>
<translation id="1383876407941801731">검색</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">네트워크 정보</translation>
<translation id="1621499497873603021">남은 배터리 사용 시간은 <ph name="TIME_LEFT"/>입니다.</translation>
<translation id="5980301590375426705">손님 세션 종료</translation>
-<translation id="4471417012762451363">배터리가 <ph name="PERCENTAGE"/>% 충전되었으며 충전 중</translation>
<translation id="8308637677604853869">이전 메뉴</translation>
<translation id="4666297444214622512">다른 계정에 로그인할 수 없습니다.</translation>
<translation id="1346748346194534595">오른쪽</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">알려지지 않은 네트워크 오류</translation>
<translation id="1467432559032391204">왼쪽</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> 활성화 중</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">최대화</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">저출력 충전기에 연결되었습니다. 배터리 충전 상태가 불안정합니다.</translation>
<translation id="3784455785234192852">잠금</translation>
<translation id="2805756323405976993">애플리케이션</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/>의 해상도가 <ph name="RESOLUTION"/>(으)로 변경됨</translation>
<translation id="1512064327686280138">활성화 실패</translation>
<translation id="5097002363526479830">'<ph name="NAME"/>' 네트워크에 연결하지 못했습니다: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi가 꺼져 있습니다.</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">배경화면 설정...</translation>
<translation id="8678698760965522072">온라인 상태</translation>
<translation id="2532589005999780174">고대비 모드</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">내부 오류</translation>
<translation id="3019353588588144572">배터리 충전이 완료될 때까지 남은 시간은 <ph name="TIME_REMAINING"/>입니다.</translation>
<translation id="3473479545200714844">화면 돋보기</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">세션 종료</translation>
<translation id="8454013096329229812">Wi-Fi가 켜져 있습니다.</translation>
<translation id="4872237917498892622">Alt+검색 또는 Shift 키</translation>
+<translation id="9201131092683066720">배터리가 <ph name="PERCENTAGE"/>% 남았습니다.</translation>
<translation id="2983818520079887040">설정...</translation>
+<translation id="1195412055398077112">오버스캔</translation>
<translation id="1717216362413677834">도크 모드</translation>
+<translation id="112308213915226829">서가 자동 숨김</translation>
<translation id="8927026611342028580">연결 요청됨</translation>
<translation id="8300849813060516376">OTASP 실패</translation>
<translation id="2792498699870441125">Alt+검색 키</translation>
<translation id="8660803626959853127">파일 <ph name="COUNT"/>개를 동기화 중</translation>
+<translation id="5958529069007801266">관리 대상 사용자</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK이 꺼져 있음</translation>
<translation id="6248847161401822652">종료하려면 Ctrl+Shift+Q를 두 번 누릅니다.</translation>
+<translation id="6785414152754474415">배터리가 <ph name="PERCENTAGE"/>% 충전되었으며 충전 중입니다.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: 활성화 중...</translation>
+<translation id="4895488851634969361">배터리 충전이 완료되었습니다.</translation>
<translation id="1391854757121130358">모바일 데이터 사용량을 모두 사용했을 수 있습니다.</translation>
-<translation id="5413208160176941586">로컬 관리 사용자</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">실행기 위치</translation>
+<translation id="5947494881799873997">되돌리기</translation>
<translation id="7593891976182323525">검색 또는 Shift 키</translation>
<translation id="7649070708921625228">도움말</translation>
<translation id="3050422059534974565">CAPS LOCK이 켜져 있습니다.
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">잘못된 암호</translation>
<translation id="6165508094623778733">자세히 알아보기</translation>
<translation id="9046895021617826162">연결 실패</translation>
+<translation id="7168224885072002358"><ph name="TIMEOUT_SECONDS"/>초 후 기존 해상도로 돌아갑니다.</translation>
<translation id="973896785707726617">이 세션은 <ph name="SESSION_TIME_REMAINING"/> 후에 종료되어 자동으로 로그아웃됩니다.</translation>
<translation id="8372369524088641025">잘못된 WEP 키</translation>
<translation id="6636709850131805001">인식할 수 없는 상태</translation>
<translation id="3573179567135747900">'<ph name="FROM_LOCALE"/>'(으)로 다시 변경(다시 시작해야 함)</translation>
<translation id="8103386449138765447">SMS 메시지: <ph name="MESSAGE_COUNT"/>개</translation>
<translation id="5045002648206642691">Google 문서함 설정...</translation>
-<translation id="1510238584712386396">실행기</translation>
<translation id="7209101170223508707">CAPS LOCK이 켜져 있습니다.
취소하려면 Alt+검색 또는 Shift 키를 누릅니다.</translation>
<translation id="8940956008527784070">배터리 부족(<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">수락</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> 남음</translation>
<translation id="520760366042891468">행아웃을 통해 화면 제어 권한 공유 중</translation>
<translation id="8000066093800657092">네트워크 없음</translation>
<translation id="4015692727874266537">다른 계정에 로그인...</translation>
<translation id="5941711191222866238">최소화</translation>
<translation id="6911468394164995108">다른 네트워크에 연결</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">충전 완료까지 <ph name="HOUR"/>시간 <ph name="MINUTE"/>분 남음</translation>
<translation id="6359806961507272919"><ph name="PHONE_NUMBER"/>에서 전송된 SMS</translation>
<translation id="1244147615850840081">네트워크 사업자</translation>
diff --git a/chromium/ash/strings/ash_strings_lt.xtb b/chromium/ash/strings/ash_strings_lt.xtb
index 611b1ea5ed3..0bb860e6630 100644
--- a/chromium/ash/strings/ash_strings_lt.xtb
+++ b/chromium/ash/strings/ash_strings_lt.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="lt">
<translation id="3595596368722241419">Akumuliatorius įkrautas</translation>
-<translation id="5250713215130379958">Automatiškai slėpti paleidimo priemonę</translation>
<translation id="7814236020522506259"><ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Portalo būsena</translation>
<translation id="30155388420722288">Perpildymo mygtukas</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">„Bluetooth“ įgalinta</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> pakeista į <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">„Bluetooth“ neleidžiama</translation>
+<translation id="7165320105431587207">Nepavyko sukonfigūruoti tinklo</translation>
<translation id="3775358506042162758">Naudodami kelių paskyrų funkciją, galite turėti iki trijų paskyrų.</translation>
<translation id="370649949373421643">Įgalinti „Wi-Fi“</translation>
<translation id="3626281679859535460">Skaistis</translation>
+<translation id="595202126637698455">Įgalintas našumo stebėjimas</translation>
<translation id="8054466585765276473">Apskaičiuojamas laikas, likęs iki akumuliatoriaus išsikrovimo.</translation>
<translation id="7982789257301363584">Tinklas</translation>
<translation id="5565793151875479467">Įgaliotasis serveris...</translation>
<translation id="938582441709398163">Klaviatūros perdanga</translation>
<translation id="4387004326333427325">Autentifikavimo sertifikatas atmestas nuotoliniu būdu</translation>
<translation id="6979158407327259162">„Google“ diskas</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> skyra pakeista į <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Įvyko HTTP klaida</translation>
<translation id="2297568595583585744">Būsenos dėklas</translation>
<translation id="1661867754829461514">Trūksta PIN kodo</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">Mažos galios įkroviklis</translation>
<translation id="3846575436967432996">Nėra tinklo informacijos</translation>
<translation id="3026237328237090306">Nustatyti duomenis mobiliesiems</translation>
+<translation id="5871632337994001636">Tvarkyti įrenginius...</translation>
<translation id="785750925697875037">Žiūrėti paskyrą mobiliesiems</translation>
<translation id="153454903766751181">Inicijuojamas korinio ryšio modemas...</translation>
<translation id="4628814525959230255">Jūsų ekrano valdymas bendrinamas su <ph name="HELPER_NAME"/> per „Hangout“.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> pasuktas</translation>
<translation id="7864539943188674973">Neleisti „Bluetooth“</translation>
<translation id="939252827960237676">Išsaugant ekrano kopiją įvyko klaida</translation>
<translation id="3126069444801937830">Paleisti iš naujo, kad būtų atnaujinta</translation>
<translation id="2268813581635650749">Atjungti visus</translation>
<translation id="735745346212279324">VPN atjungtas</translation>
<translation id="7320906967354320621">Neveikia</translation>
-<translation id="6303423059719347535">Likusi akumuliatoriaus įkrova: <ph name="PERCENTAGE"/> %</translation>
<translation id="15373452373711364">Didelis pelės žymeklis</translation>
-<translation id="2778346081696727092">Nepavyko autentifikuoti naudojant pateiktą naudotojo vardą ar slaptažodį</translation>
<translation id="3294437725009624529">Svečias</translation>
<translation id="8190698733819146287">Tinkinti kalbas ir įvestį...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Lentynos pozicija</translation>
<translation id="2903907270192926896">ĮVESTIS</translation>
<translation id="8676770494376880701">Prijungtas mažos galios įkroviklis</translation>
<translation id="7170041865419449892">Nepasiekiama</translation>
<translation id="4804818685124855865">Atsijungti</translation>
<translation id="2544853746127077729">Autentifikavimo sertifikatą atmetė tinklas</translation>
<translation id="5222676887888702881">Atsijungti</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfigūracija</translation>
<translation id="1272079795634619415">Sustabdyti</translation>
<translation id="4957722034734105353">Sužinokite daugiau...</translation>
<translation id="2964193600955408481">Neleisti „Wi-Fi“</translation>
-<translation id="811680302244032017">Pridėti įrenginį...</translation>
<translation id="4279490309300973883">Dubliuojama</translation>
+<translation id="7973962044839454485">Nepavyko autentifikuoti PGP dėl netinkamo naudotojo vardo ar slaptažodžio</translation>
<translation id="2509468283778169019">DIDŽIŲJŲ RAIDŽIŲ RAŠYMAS įjungtas</translation>
<translation id="3892641579809465218">Vidinė pateiktis</translation>
<translation id="7823564328645135659">Po nustatymų sinchronizavimo kalba pakeista iš <ph name="FROM_LOCALE"/> į <ph name="TO_LOCALE"/>.</translation>
<translation id="3368922792935385530">Prijungta</translation>
<translation id="8340999562596018839">Žodiniai atsiliepimai</translation>
<translation id="8654520615680304441">Įjungti „Wi-Fi“...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Įvesties metodas pakeistas į <ph name="INPUT_METHOD_ID"/>.
Jei norite perjungti, paspauskite „Shift“ + „Alt“.</translation>
<translation id="2562916301614567480">Privatus tinklas</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317">Liko <ph name="PERCENTAGE"/> proc.</translation>
<translation id="9089416786594320554">Įvesties metodai</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/> %</translation>
+<translation id="2825619548187458965">Lentyna</translation>
<translation id="2614835198358683673">„Chromebook“ gali nebūti įkraunamas, kai jis įjungtas. Apsvarstykite galimybę naudoti originalų įkroviklį.</translation>
<translation id="1895658205118569222">Išjungimas</translation>
<translation id="4430019312045809116">Apimtis</translation>
+<translation id="8681498213689260554">Kad atnaujintumėte, paleiskite iš naujo ir naudokite „Powerwash“</translation>
<translation id="4442424173763614572">Įvyko DNS paieškos klaida</translation>
-<translation id="6356500677799115505">Akumuliatorius įkrautas ir vis įkraunamas.</translation>
<translation id="7874779702599364982">Ieškoma korinio ryšio tinklų...</translation>
<translation id="583281660410589416">Nežinoma</translation>
<translation id="1383876407941801731">Ieškoti</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">Tinklo informacija</translation>
<translation id="1621499497873603021">Laikas, likęs iki akumuliatoriaus išsikrovimo: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Išeiti iš svečio režimo</translation>
-<translation id="4471417012762451363">Likusi akumuliatoriaus įkrova: <ph name="PERCENTAGE"/> %. Jis įkraunamas.</translation>
<translation id="8308637677604853869">Ankstesnis meniu</translation>
<translation id="4666297444214622512">Negalima prisijungti prie kitos paskyros.</translation>
<translation id="1346748346194534595">Dešinė</translation>
@@ -114,6 +120,7 @@ Jei norite neleisti, paspauskite „Ctrl“ + „Alt“ + Z.</translation>
<translation id="6312403991423642364">Nežinoma tinklo klaida</translation>
<translation id="1467432559032391204">Kairė</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Aktyvinamas „<ph name="NAME"/>“</translation>
<translation id="8814190375133053267">WI-Fi</translation>
<translation id="1398853756734560583">Išskleisti</translation>
@@ -123,7 +130,6 @@ Jei norite neleisti, paspauskite „Ctrl“ + „Alt“ + Z.</translation>
<translation id="2727977024730340865">Prijungtas mažos galios įkroviklis. Akumuliatoriaus įkrovimas gali būti nepatikimas.</translation>
<translation id="3784455785234192852">Užrakinti</translation>
<translation id="2805756323405976993">Programos</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> dydis pakeistas į <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Aktyvinimo triktis</translation>
<translation id="5097002363526479830">Nepavyko prisijungti prie tinklo „<ph name="NAME"/>“: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">„Wi-Fi“ ryšys išjungtas.</translation>
@@ -131,6 +137,7 @@ Jei norite neleisti, paspauskite „Ctrl“ + „Alt“ + Z.</translation>
<translation id="7052914147756339792">Nustatyti darbalaukio foną...</translation>
<translation id="8678698760965522072">Būsena „Prisijungus“</translation>
<translation id="2532589005999780174">Didelio kontrasto režimas</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Vidinė klaida</translation>
<translation id="3019353588588144572">Laikas, likęs iki akumuliatoriaus įkrovimo: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Ekrano didintuvas</translation>
@@ -153,20 +160,24 @@ Serverio pranešimas: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Išeiti iš sesijos</translation>
<translation id="8454013096329229812">„Wi-Fi“ ryšys įjungtas.</translation>
<translation id="4872237917498892622">„Alt“ + paieškos arba antrojo lygio klavišas</translation>
+<translation id="9201131092683066720">Likusi akumuliatoriaus įkrova: <ph name="PERCENTAGE"/> %.</translation>
<translation id="2983818520079887040">Nustatymai...</translation>
+<translation id="1195412055398077112">sritis aplink vaizdo kraštus</translation>
<translation id="1717216362413677834">Doko režimas</translation>
+<translation id="112308213915226829">Automatiškai slėpti lentyną</translation>
<translation id="8927026611342028580">Pateikta prisijungimo užklausa</translation>
<translation id="8300849813060516376">OTASP nepavyko</translation>
<translation id="2792498699870441125">„Alt“ + paieškos klavišas</translation>
<translation id="8660803626959853127">Sinchronizuojamas (-i) <ph name="COUNT"/> failas (-ai)</translation>
+<translation id="5958529069007801266">Prižiūrimas naudotojas</translation>
<translation id="3709443003275901162">Daugiau nei 9</translation>
<translation id="639644700271529076">DIDŽIŲJŲ RAIDŽIŲ RAŠYMAS išjungtas</translation>
<translation id="6248847161401822652">Jei norite išeiti, du kartus paspauskite „Control“ + „Shift“ + Q.</translation>
+<translation id="6785414152754474415">Likusi akumuliatoriaus įkrova: <ph name="PERCENTAGE"/> %. Jis įkraunamas.</translation>
<translation id="6267036997247669271">„<ph name="NAME"/>“: aktyvinama...</translation>
+<translation id="4895488851634969361">Akumuliatorius visiškai įkrautas.</translation>
<translation id="1391854757121130358">Galbūt išnaudojote savo mobiliojo ryšio duomenų normą.</translation>
-<translation id="5413208160176941586">Vietoje tvarkoma naudotojo paskyra</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Paleidiklio pozicija</translation>
+<translation id="5947494881799873997">Grąžinti</translation>
<translation id="7593891976182323525">Paieškos arba antrojo lygio klavišas</translation>
<translation id="7649070708921625228">Žinynas</translation>
<translation id="3050422059534974565">DIDŽIŲJŲ RAIDŽIŲ RAŠYMAS įjungtas.
@@ -179,22 +190,24 @@ Jei norite atšaukti, paspauskite paieškos arba antrojo lygio klavišą.</trans
<translation id="6692173217867674490">Netinkama slaptafrazė</translation>
<translation id="6165508094623778733">Sužinokite daugiau</translation>
<translation id="9046895021617826162">Nepavyko prisijungti</translation>
+<translation id="7168224885072002358">Po <ph name="TIMEOUT_SECONDS"/> bus grąžinta sena skyra</translation>
<translation id="973896785707726617">Ši sesija baigsis po <ph name="SESSION_TIME_REMAINING"/>. Būsite automatiškai atjungti.</translation>
<translation id="8372369524088641025">Netinkamas WEP raktas</translation>
<translation id="6636709850131805001">Neatpažinta būsena</translation>
<translation id="3573179567135747900">Pakeisti atgal į „<ph name="FROM_LOCALE"/>“ (reikia paleisti iš naujo)</translation>
<translation id="8103386449138765447">SMS pranešimų: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">„Google“ disko nustatymai...</translation>
-<translation id="1510238584712386396">Paleidimo priemonė</translation>
<translation id="7209101170223508707">DIDŽIŲJŲ RAIDŽIŲ RAŠYMAS įjungtas.
Jei norite atšaukti, paspauskite „Alt“ + paieškos klavišas arba „Alt“ + antrojo lygio klavišas.</translation>
<translation id="8940956008527784070">Akumuliatorius senka (<ph name="PERCENTAGE"/> %)</translation>
+<translation id="4918086044614829423">Priimti</translation>
<translation id="5102001756192215136">Liko <ph name="HOUR"/>.<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Jūsų ekrano valdymas bendrinamas per „Hangout“.</translation>
<translation id="8000066093800657092">Tinklo nėra</translation>
<translation id="4015692727874266537">Prisijungti prie kitos paskyros...</translation>
<translation id="5941711191222866238">Sumažinti</translation>
<translation id="6911468394164995108">Prisijungti prie kito...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> val. <ph name="MINUTE"/> min. iki visiško įkrovimo</translation>
<translation id="6359806961507272919">SMS iš <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operatorius</translation>
diff --git a/chromium/ash/strings/ash_strings_lv.xtb b/chromium/ash/strings/ash_strings_lv.xtb
index 5d8f38c5087..71e8d06b6e6 100644
--- a/chromium/ash/strings/ash_strings_lv.xtb
+++ b/chromium/ash/strings/ash_strings_lv.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="lv">
<translation id="3595596368722241419">Akumulators pilns</translation>
-<translation id="5250713215130379958">Automātiski paslēpt palaišanas lapu</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> un <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Portāla statuss</translation>
<translation id="30155388420722288">Pārpildes poga</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth iespējots</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> tika pagriezts šādi: <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth atspējots</translation>
+<translation id="7165320105431587207">Neizdevās konfigurēt tīklu</translation>
<translation id="3775358506042162758">Vairākkārtējas pierakstīšanās laikā var izmantot ne vairāk kā trīs kontus.</translation>
<translation id="370649949373421643">Iespējot Wi-Fi</translation>
<translation id="3626281679859535460">Spilgtums</translation>
+<translation id="595202126637698455">Veiktspējas izsekošana ir iespējota</translation>
<translation id="8054466585765276473">Notiek akumulatora darbības ilguma aprēķināšana.</translation>
<translation id="7982789257301363584">Tīkls</translation>
<translation id="5565793151875479467">Starpniekserveris...</translation>
<translation id="938582441709398163">Tastatūras pārklājums</translation>
<translation id="4387004326333427325">Autentifikācijas sertifikāts tika attāli noraidīts.</translation>
<translation id="6979158407327259162">Google disks</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> izšķirtspēja tika mainīta uz <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Neizdevās iegūt HTTP</translation>
<translation id="2297568595583585744">Statusa tekne</translation>
<translation id="1661867754829461514">Trūkst PIN koda</translation>
@@ -34,39 +38,41 @@ Lai to pārslēgtu, nospiediet taustiņu kombināciju Shift+Alt.</translation>
<translation id="2127372758936585790">Lādētājs ar mazu strāvas padevi</translation>
<translation id="3846575436967432996">Tīkla informācija nav pieejama.</translation>
<translation id="3026237328237090306">Iestatīt mobilo datu pārraidi</translation>
+<translation id="5871632337994001636">Pārvaldīt ierīces...</translation>
<translation id="785750925697875037">Skatīt mobilo kontu</translation>
<translation id="153454903766751181">Notiek mobilā modema inicializēšana...</translation>
<translation id="4628814525959230255">Ekrāna vadības kopīgošana ar lietotāju <ph name="HELPER_NAME"/>, izmantojot funkciju Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> ir pagriezts.</translation>
<translation id="7864539943188674973">Atspējot Bluetooth</translation>
<translation id="939252827960237676">Neizdevās saglabāt ekrānuzņēmumu.</translation>
<translation id="3126069444801937830">Restartēt, lai atjauninātu</translation>
<translation id="2268813581635650749">Izrakstīt visus</translation>
<translation id="735745346212279324">VPN ir atvienots</translation>
<translation id="7320906967354320621">Dīkstāve</translation>
-<translation id="6303423059719347535">Akumulatora uzlādes līmenis: <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">Liels peles kursors</translation>
-<translation id="2778346081696727092">Neizdevās autentificēt ievadīto lietotājvārdu un paroli</translation>
<translation id="3294437725009624529">Viesis</translation>
<translation id="8190698733819146287">Pielāgot valodas un ievadi...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Plaukta pozīcija</translation>
<translation id="2903907270192926896">IEEJA</translation>
<translation id="8676770494376880701">Pievienots lādētājs ar mazu strāvas padevi</translation>
<translation id="7170041865419449892">Ārpus diapazona</translation>
<translation id="4804818685124855865">Atvienot</translation>
<translation id="2544853746127077729">Tīkls noraidīja autentifikācijas sertifikātu.</translation>
<translation id="5222676887888702881">Izrakstīties</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfigurācija</translation>
<translation id="1272079795634619415">Apturēt</translation>
<translation id="4957722034734105353">Uzzināt vairāk...</translation>
<translation id="2964193600955408481">Atspējot Wi-Fi</translation>
-<translation id="811680302244032017">Pievienot ierīci...</translation>
<translation id="4279490309300973883">Spoguļošana</translation>
+<translation id="7973962044839454485">PSP autentifikācija neizdevās nepareiza lietotājvārda un paroles dēļ.</translation>
<translation id="2509468283778169019">Funkcija Caps Lock ir ieslēgta</translation>
<translation id="3892641579809465218">Iekšējais displejs</translation>
<translation id="7823564328645135659">Pēc jūsu iestatījumu sinhronizēšanas valoda ir mainīta no <ph name="FROM_LOCALE"/> uz <ph name="TO_LOCALE"/>.</translation>
<translation id="3368922792935385530">pievienots</translation>
<translation id="8340999562596018839">Balss komentāri</translation>
<translation id="8654520615680304441">Ieslēgt Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Ievades metode ir mainīta uz <ph name="INPUT_METHOD_ID"/>.
Lai to pārslēgtu, nospiediet taustiņu kombināciju Shift+Alt.</translation>
<translation id="2562916301614567480">Privāts tīkls</translation>
@@ -83,11 +89,12 @@ Lai to pārslēgtu, nospiediet taustiņu kombināciju Shift+Alt.</translation>
<translation id="3626637461649818317">Atlikums: <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">Ievades metodes</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Plaukts</translation>
<translation id="2614835198358683673">Jūsu Chromebook dators, iespējams, netiks uzlādēts, kamēr tas ir ieslēgts. Ieteicams izmantot oriģinālo lādētāju.</translation>
<translation id="1895658205118569222">Izslēgšana</translation>
<translation id="4430019312045809116">Skaļums</translation>
+<translation id="8681498213689260554">Lai atjauninātu, restartējiet un veiciet Powerwash</translation>
<translation id="4442424173763614572">DNS uzmeklēšana neizdevās</translation>
-<translation id="6356500677799115505">Akumulators ir pilnībā uzlādēts, un tiek turpināta tā uzlāde.</translation>
<translation id="7874779702599364982">Notiek mobilo sakaru tīklu meklēšana...</translation>
<translation id="583281660410589416">Nezināms</translation>
<translation id="1383876407941801731">Meklēšana</translation>
@@ -96,7 +103,6 @@ Lai to pārslēgtu, nospiediet taustiņu kombināciju Shift+Alt.</translation>
<translation id="2204305834655267233">Tīkla informācija</translation>
<translation id="1621499497873603021">Atlikušais akumulatora darbības laiks: <ph name="TIME_LEFT"/>.</translation>
<translation id="5980301590375426705">Aizvērt viesa sesiju</translation>
-<translation id="4471417012762451363">Akumulatora uzlādes līmenis: <ph name="PERCENTAGE"/>%; tiek turpināta tā uzlāde.</translation>
<translation id="8308637677604853869">Iepriekšējā izvēlne</translation>
<translation id="4666297444214622512">Nevar pierakstīties citā kontā.</translation>
<translation id="1346748346194534595">Pa labi</translation>
@@ -114,6 +120,7 @@ Nospiediet Ctrl+Alt+Z, lai tos atspējotu.</translation>
<translation id="6312403991423642364">Nezināma tīkla kļūda</translation>
<translation id="1467432559032391204">Pa kreisi</translation>
<translation id="5543001071567407895">Īsziņa</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Notiek <ph name="NAME"/> aktivizēšana.</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maksimizēt</translation>
@@ -123,7 +130,6 @@ Nospiediet Ctrl+Alt+Z, lai tos atspējotu.</translation>
<translation id="2727977024730340865">Pievienots lādētājs ar mazu strāvas padevi. Akumulatora uzlāde var nebūt uzticama.</translation>
<translation id="3784455785234192852">Bloķēt</translation>
<translation id="2805756323405976993">Lietotnes</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> lielums ir mainīts uz <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Aktivizācijas kļūme</translation>
<translation id="5097002363526479830">Neizdevās izveidot savienojumu ar tīklu <ph name="NAME"/>: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi tīkls ir izslēgts.</translation>
@@ -131,6 +137,7 @@ Nospiediet Ctrl+Alt+Z, lai tos atspējotu.</translation>
<translation id="7052914147756339792">Iestatīt fona tapeti...</translation>
<translation id="8678698760965522072">Tiešsaistes statuss</translation>
<translation id="2532589005999780174">Augsta kontrasta režīms</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Iekšēja kļūda</translation>
<translation id="3019353588588144572">Pilnīgais uzlādei nepieciešamais laiks: <ph name="TIME_REMAINING"/>.</translation>
<translation id="3473479545200714844">Ekrāna lupa</translation>
@@ -153,20 +160,24 @@ Servera ziņojums: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Iziet no sesijas</translation>
<translation id="8454013096329229812">Wi-Fi tīkls ir ieslēgts.</translation>
<translation id="4872237917498892622">Alt+Meklēt vai Shift</translation>
+<translation id="9201131092683066720">Akumulatora uzlādes līmenis: <ph name="PERCENTAGE"/>%</translation>
<translation id="2983818520079887040">Iestatījumi...</translation>
+<translation id="1195412055398077112">attēla izvērse</translation>
<translation id="1717216362413677834">Dokošanas režīms</translation>
+<translation id="112308213915226829">Automātiski slēpt plauktu</translation>
<translation id="8927026611342028580">Ir pieprasīta savienojuma izveide.</translation>
<translation id="8300849813060516376">OTASP neizdevās</translation>
<translation id="2792498699870441125">Alt+Meklēt</translation>
<translation id="8660803626959853127">Notiek <ph name="COUNT"/> faila(-u) sinhronizēšana</translation>
+<translation id="5958529069007801266">Uzraudzīts lietotājs</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">Funkcija CAPS LOCK ir izslēgta.</translation>
<translation id="6248847161401822652">Lai izietu, divas reizes nospiediet taustiņu kombināciju Ctrl+Shift+Q.</translation>
+<translation id="6785414152754474415">Akumulatora uzlādes līmenis: <ph name="PERCENTAGE"/>%; uzlāde tiek turpināta.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: notiek aktivizēšana...</translation>
+<translation id="4895488851634969361">Akumulators ir pilnībā uzlādēts.</translation>
<translation id="1391854757121130358">Iespējams, esat jau izmantojis savu mobilo datu atļauju.</translation>
-<translation id="5413208160176941586">Vietēji pārvaldīts lietotājs</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Palaidēja novietojums</translation>
+<translation id="5947494881799873997">Atgriezt</translation>
<translation id="7593891976182323525">Meklēt vai Shift</translation>
<translation id="7649070708921625228">Palīdzība</translation>
<translation id="3050422059534974565">Ir ieslēgts BURTSLĒGS.
@@ -179,22 +190,24 @@ Lai atceltu tā funkcionalitāti, nospiediet Meklēt vai Shift.</translation>
<translation id="6692173217867674490">Neatbilstoša ieejas frāze</translation>
<translation id="6165508094623778733">Uzziniet vairāk</translation>
<translation id="9046895021617826162">Savienojums neizdevās</translation>
+<translation id="7168224885072002358">Iepriekšējā izšķirtspēja tiks atgriezta pēc <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Atlikušais laiks līdz šīs sesijas beigām: <ph name="SESSION_TIME_REMAINING"/>. Jūs tiksiet automātiski izrakstīts.</translation>
<translation id="8372369524088641025">Neatbilstoša WEP atslēga</translation>
<translation id="6636709850131805001">Neatpazīts stāvoklis</translation>
<translation id="3573179567135747900">Mainīt atpakaļ uz <ph name="FROM_LOCALE"/> (nepieciešama restartēšana)</translation>
<translation id="8103386449138765447">Īsziņas: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google diska iestatījumi...</translation>
-<translation id="1510238584712386396">Lietojumprogrammu palaidējs</translation>
<translation id="7209101170223508707">Ir ieslēgts BURTSLĒGS.
Lai atceltu tā funkcionalitāti, nospiediet Alt+Meklēt vai Shift.</translation>
<translation id="8940956008527784070">Akumulators gandrīz tukšs (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Pieņemt</translation>
<translation id="5102001756192215136">Atlicis: <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Ekrāna vadības kopīgošana, izmantojot funkciju Hangouts.</translation>
<translation id="8000066093800657092">Nav tīkla</translation>
<translation id="4015692727874266537">Pierakstīties citā kontā...</translation>
<translation id="5941711191222866238">Minimizēt</translation>
<translation id="6911468394164995108">Pievienoties citam...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">Līdz pilnīgai uzlādei atlikušais laiks: <ph name="HOUR"/> h <ph name="MINUTE"/> min</translation>
<translation id="6359806961507272919">SMS no <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Mobilo sakaru operators</translation>
diff --git a/chromium/ash/strings/ash_strings_ml.xtb b/chromium/ash/strings/ash_strings_ml.xtb
index df9b8e869c0..a258cc7a98a 100644
--- a/chromium/ash/strings/ash_strings_ml.xtb
+++ b/chromium/ash/strings/ash_strings_ml.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ml">
<translation id="3595596368722241419">ബാറ്ററി നിറഞ്ഞു</translation>
-<translation id="5250713215130379958">ലോഞ്ചർ യാന്ത്രികമായി മറയ്‌ക്കുക</translation>
<translation id="7814236020522506259"><ph name="HOUR"/>, <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">പോര്‍ട്ടല്‍ അവസ്ഥ</translation>
<translation id="30155388420722288">ഓവർഫ്ലോ ബട്ടൺ</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth പ്രാപ്‌തമാക്കി</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> എന്നതിനെ <ph name="ROTATION"/> എന്നതിലേയ്‌ക്ക് തിരിച്ചു</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth അപ്രാപ്‌തമാക്കി</translation>
+<translation id="7165320105431587207">നെറ്റ്‌വർക്ക് കോൺഫിഗർ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു</translation>
<translation id="3775358506042162758">ഒന്നിലധികം സൈൻ ഇന്നുകളിൽ നിങ്ങൾക്ക് മൂന്ന് അക്കൗണ്ടുകൾ വരെ മാത്രമേ ഉണ്ടായിരിക്കാൻ പാടുള്ളൂ.</translation>
<translation id="370649949373421643">Wi-fi പ്രാപ്‌തമാക്കുക</translation>
<translation id="3626281679859535460">മിഴിവ്</translation>
+<translation id="595202126637698455">പ്രകടനം പിന്തുടരൽ പ്രവർത്തനക്ഷമമാക്കി</translation>
<translation id="8054466585765276473">ബാറ്ററി സമയം കണക്കാക്കുന്നു.</translation>
<translation id="7982789257301363584">നെറ്റ്വര്‍ക്ക്</translation>
<translation id="5565793151875479467">പ്രോക്‌സി...</translation>
<translation id="938582441709398163">കീബോര്‍ഡ് ഓവര്‍ലേ</translation>
<translation id="4387004326333427325">പ്രാമാണീകരണ സർട്ടിഫിക്കറ്റ് വിദൂരമായി നിരസിച്ചു</translation>
<translation id="6979158407327259162">Google ഡ്രൈവ്</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> മിഴിവ് <ph name="RESOLUTION"/> എന്നതിലേയ്‌ക്ക് മാറ്റി</translation>
<translation id="6943836128787782965">HTTP പരാജയപ്പെട്ടു</translation>
<translation id="2297568595583585744">സ്റ്റാറ്റസ് ട്രേ</translation>
<translation id="1661867754829461514">PIN കാണാനില്ല</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജർ</translation>
<translation id="3846575436967432996">നെറ്റ്‌വർക്ക് വിവരങ്ങളൊന്നും ലഭ്യമല്ല</translation>
<translation id="3026237328237090306">മൊബൈൽ ഡാറ്റ സജ്ജമാക്കുക</translation>
+<translation id="5871632337994001636">ഉപകരണങ്ങൾ നിയന്ത്രിക്കുക...</translation>
<translation id="785750925697875037">മൊബൈൽ അക്കൗണ്ട് കാണുക</translation>
<translation id="153454903766751181">സെല്ലുലാർ മോഡം സമാരംഭിക്കുന്നു...</translation>
<translation id="4628814525959230255">നിങ്ങളുടെ സ്‌ക്രീനിന്റെ നിയന്ത്രണം Hangouts വഴി <ph name="HELPER_NAME"/> എന്നതുമായി പങ്കിടുന്നു.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> തിരിച്ചു</translation>
<translation id="7864539943188674973">Bluetooth അപ്രാപ്‌തമാക്കുക</translation>
<translation id="939252827960237676">സ്‌ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു</translation>
<translation id="3126069444801937830">അപ്‌ഡേറ്റുചെയ്യുന്നതിന് പുനരാരംഭിക്കുക</translation>
<translation id="2268813581635650749">എല്ലാം സൈൻ ഔട്ട് ചെയ്യുക</translation>
<translation id="735745346212279324">VPN വിച്ഛേദിച്ചു</translation>
<translation id="7320906967354320621">നിഷ്ക്രിയം</translation>
-<translation id="6303423059719347535">ബാറ്ററി <ph name="PERCENTAGE"/>% പൂർണ്ണമാണ്</translation>
<translation id="15373452373711364">വലിയ മൗസ് കഴ്‌സർ</translation>
-<translation id="2778346081696727092">നൽകിയ ഉപയോക്തൃനാമം അല്ലെങ്കിൽ പാസ്‌വേഡ് ഉപയോഗിച്ച് പ്രാമാണീകരിക്കുന്നത് പരാജയപ്പെട്ടു</translation>
<translation id="3294437725009624529">അതിഥി</translation>
<translation id="8190698733819146287">ഭാഷകള്‍‌ ഇച്ഛാനുസൃതമാക്കി നല്‍‌കുക...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">ഷെൽഫ് സ്ഥാനം</translation>
<translation id="2903907270192926896">ഇൻപുട്ട്</translation>
<translation id="8676770494376880701">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജർ കണക്റ്റുചെയ്‌തു</translation>
<translation id="7170041865419449892">പരിധിയ്ക്ക് പുറത്താണ്</translation>
<translation id="4804818685124855865">വിച്ഛേദിക്കുക</translation>
<translation id="2544853746127077729">നെറ്റ്‌വർക്ക്, പ്രാമാണീകരണ സർട്ടിഫിക്കറ്റ് നിരസിച്ചു</translation>
<translation id="5222676887888702881">പുറത്തുകടക്കുക</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">ക്രമീകരണം</translation>
<translation id="1272079795634619415">നിര്‍ത്തുക</translation>
<translation id="4957722034734105353">കൂടുതലറിയുക...</translation>
<translation id="2964193600955408481">Wi-Fi അപ്രാപ്‌തമാക്കുക</translation>
-<translation id="811680302244032017">ഉപകരണം ചേർക്കുക...</translation>
<translation id="4279490309300973883">മിററിംഗ്</translation>
+<translation id="7973962044839454485">തെറ്റായ ഉപയോക്തൃനാമമോ പാസ്‌വേഡോ കാരണം PPP പ്രാമാണീകരണം പരാജയപ്പെട്ടു</translation>
<translation id="2509468283778169019">CAPS LOCK ഓൺ ആണ്</translation>
<translation id="3892641579809465218">ആന്തരിക പ്രദർശനം</translation>
<translation id="7823564328645135659">നിങ്ങളുടെ ക്രമീകരണങ്ങള്‍ സമന്വയിപ്പിച്ചതിന് ശേഷം ഭാഷ &quot;<ph name="FROM_LOCALE"/>&quot; എന്നതില്‍ നിന്ന് &quot;<ph name="TO_LOCALE"/>&quot; എന്നതിലേക്ക് മാറി.</translation>
<translation id="3368922792935385530">ബന്ധിപ്പിച്ചു</translation>
<translation id="8340999562596018839">സംഭാഷണ ഫീഡ്‌ബാക്ക്</translation>
<translation id="8654520615680304441">Wi-Fi ഓണാക്കുക...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">നിങ്ങളുടെ ഇൻപുട്ട് രീതി <ph name="INPUT_METHOD_ID"/> എന്നതിലേയ്‌ക്ക് മാറ്റി. സ്വിച്ചുചെയ്യുന്നതിന് Shift + Alt അമർത്തുക.</translation>
<translation id="2562916301614567480">സ്വകാര്യ നെറ്റ്‌വർക്ക്</translation>
<translation id="6549021752953852991">സെല്ലുലാർ നെറ്റ്‌വർക്കൊന്നും ലഭ്യമല്ല</translation>
@@ -82,11 +88,12 @@
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% ശേഷിക്കുന്നു</translation>
<translation id="9089416786594320554">ഇൻപുട്ട് രീതികൾ</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">ഷെൽഫ്</translation>
<translation id="2614835198358683673">ഓണായിരിക്കുമ്പോൾ നിങ്ങളുടെ Chromebook ചാർജ് ചെയ്യാനിടയില്ല. ഔദ്യോഗിക ചാർജ്ജർ ഉപയോഗിക്കുന്നത് പരിഗണിക്കുക.</translation>
<translation id="1895658205118569222">ഷട്ട്‌ഡൗൺ ചെയ്യുക</translation>
<translation id="4430019312045809116">അളവ്</translation>
+<translation id="8681498213689260554">പുനരാരംഭിക്കുക, തുടർന്ന് അപ്‌ഡേറ്റുചെയ്യാൻ പവർവാഷുചെയ്യുക</translation>
<translation id="4442424173763614572">DNS തിരയല്‍ പരാജയപ്പെട്ടു</translation>
-<translation id="6356500677799115505">ബാറ്ററി പൂർണ്ണവും ചാർജ്ജ് ചെയ്യുകയുമാണ്.</translation>
<translation id="7874779702599364982">സെല്ലുലാർ നെറ്റ്‌വർക്കുകൾക്കായി തിരയുന്നു...</translation>
<translation id="583281660410589416">അജ്ഞാതം</translation>
<translation id="1383876407941801731">തിരയൂ</translation>
@@ -95,7 +102,6 @@
<translation id="2204305834655267233">നെറ്റ്‌വർക്ക് വിവരം</translation>
<translation id="1621499497873603021">ബാറ്ററി ശൂന്യമാകുന്നതിന് ശേഷിക്കുന്ന സമയം, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">അതിഥി സെഷനിൽ നിന്നും പുറത്തുകടക്കുക</translation>
-<translation id="4471417012762451363">ബാറ്ററി <ph name="PERCENTAGE"/>% പൂർണ്ണവും ചാർജ്ജ് ചെയ്യുകയുമാണ്</translation>
<translation id="8308637677604853869">മുൻ മെനു</translation>
<translation id="4666297444214622512">മറ്റൊരു അക്കൗണ്ടിൽ സൈൻ ഇൻ ചെയ്യാനാകില്ല.</translation>
<translation id="1346748346194534595">ശരി</translation>
@@ -113,6 +119,7 @@
<translation id="6312403991423642364">അറിയാത്ത നെറ്റ്‌വര്‍ക്ക് പിശക്</translation>
<translation id="1467432559032391204">ഇടത്</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> സജീവമാക്കുന്നു</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">വലുതാക്കുക</translation>
@@ -122,7 +129,6 @@
<translation id="2727977024730340865">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജ്ജറിലേക്ക് പ്ലഗ് ചെയ്‌തിരിക്കുന്നു. ബാറ്ററി ചാർജുചെയ്യൽ വിശ്വസനീയമാകണമെന്നില്ല.</translation>
<translation id="3784455785234192852">ലോക്കുചെയ്യുക</translation>
<translation id="2805756323405976993">അപ്ലിക്കേഷനുകള്‍</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/>, <ph name="RESOLUTION"/> എന്നതിലേക്ക് വലുപ്പം മാറ്റി</translation>
<translation id="1512064327686280138">സജീവമാക്കല്‍ പരാജയപ്പെട്ടു</translation>
<translation id="5097002363526479830">'<ph name="NAME"/>' നെറ്റ്‌വര്‍‌ക്കിലേക്ക് ബന്ധിപ്പിക്കുന്നതിൽ പരാജയപ്പെട്ടു: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi ഓഫുചെയ്‌തു.</translation>
@@ -130,6 +136,7 @@
<translation id="7052914147756339792">വാൾപേപ്പർ സജ്ജമാക്കുക...</translation>
<translation id="8678698760965522072">ഓണ്‍ലൈന്‍ അവസ്ഥ</translation>
<translation id="2532589005999780174">ഉയർന്ന ദൃശ്യതീവ്രത മോഡ്</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">ആന്തരിക പിശക്</translation>
<translation id="3019353588588144572">ബാറ്ററി പൂർണ്ണമായി ചാർജ്ജാകുന്നതിന് ശേഷിക്കുന്ന സമയം, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">സ്‌ക്രീൻ മാഗ്‌നിഫയർ</translation>
@@ -152,20 +159,24 @@
<translation id="7029814467594812963">സെഷനിൽ നിന്ന് പുറത്തുകടക്കുക</translation>
<translation id="8454013096329229812">Wi-Fi ഓൺ ചെയ്‌തു.</translation>
<translation id="4872237917498892622">Alt+തിരയൽ അല്ലെങ്കിൽ Shift</translation>
+<translation id="9201131092683066720">ബാറ്ററി <ph name="PERCENTAGE"/>% നിറഞ്ഞു.</translation>
<translation id="2983818520079887040">ക്രമീകരണങ്ങള്‍...</translation>
+<translation id="1195412055398077112">ഓവർസ്‌കാൻ</translation>
<translation id="1717216362413677834">ഡോക്ക് മോഡ്</translation>
+<translation id="112308213915226829">ഷെൽഫ് യാന്ത്രികമായി മറയ്‌ക്കുക</translation>
<translation id="8927026611342028580">കണക്റ്റുചെയ്യാൻ അഭ്യർത്ഥിച്ചു</translation>
<translation id="8300849813060516376">OTASP പരാജയപ്പെട്ടു</translation>
<translation id="2792498699870441125">Alt+തിരയൽ</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> ഫയൽ(കൾ) സമന്വയിപ്പിക്കുന്നു</translation>
+<translation id="5958529069007801266">സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താവ്</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK ഓഫാണ്</translation>
<translation id="6248847161401822652">പുറത്തുപോകുന്നതിന് രണ്ടുതവണ Control Shift Q അമർത്തുക.</translation>
+<translation id="6785414152754474415">ബാറ്ററി <ph name="PERCENTAGE"/>% നിറഞ്ഞിരിക്കുന്നു, ചാർജുചെയ്യൽ തുടരുന്നു.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: സജീവമാക്കുന്നു...</translation>
+<translation id="4895488851634969361">ബാറ്ററി ചാർജുചെയ്യൽ പൂർണ്ണമായി.</translation>
<translation id="1391854757121130358">നിങ്ങൾ മൊബൈൽ ഡാറ്റ അലവൻസ് ഉപയോഗിച്ചിരിക്കാനിടയുണ്ട്.</translation>
-<translation id="5413208160176941586">പ്രാദേശികമായി നിയന്ത്രിക്കപ്പെടുന്ന ഉപയോക്താവ്</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">ലോഞ്ചറിന്റെ സ്ഥാനം</translation>
+<translation id="5947494881799873997">പഴയപടിയാക്കുക</translation>
<translation id="7593891976182323525">തിരയൽ അല്ലെങ്കിൽ Shift</translation>
<translation id="7649070708921625228">സഹായം</translation>
<translation id="3050422059534974565">CAPS LOCK ഓൺ ആണ്.
@@ -178,22 +189,24 @@
<translation id="6692173217867674490">മോശം പാസ്ഫ്രെയ്സ്</translation>
<translation id="6165508094623778733">കൂടുതല്‍ മനസിലാക്കുക</translation>
<translation id="9046895021617826162">ബന്ധിപ്പിക്കല്‍ പരാജയപ്പെട്ടു</translation>
+<translation id="7168224885072002358"><ph name="TIMEOUT_SECONDS"/>-ൽ പഴയ മിഴിവിലേക്ക് പഴയപടിയാക്കുന്നു</translation>
<translation id="973896785707726617"><ph name="SESSION_TIME_REMAINING"/> ആകുമ്പോൾ ഈ സെഷൻ അവസാനിക്കും. നിങ്ങൾ യാന്ത്രികമായി സൈൻ ഔട്ടാകും.</translation>
<translation id="8372369524088641025">മോശം WEP കീ</translation>
<translation id="6636709850131805001">തിരിച്ചറിയാത്ത അവസ്ഥ</translation>
<translation id="3573179567135747900">&quot;<ph name="FROM_LOCALE"/>&quot; എന്നതിലേക്ക് തിരികെ മാറുക (റീസ്റ്റാര്‍ട്ട് ആവശ്യമാണ്)</translation>
<translation id="8103386449138765447">SMS സന്ദേശങ്ങൾ: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google ഡ്രൈവ് ക്രമീകരണങ്ങൾ...</translation>
-<translation id="1510238584712386396">ലോഞ്ചർ</translation>
<translation id="7209101170223508707">CAPS LOCK ഓണാണ്.
റദ്ദാക്കുന്നതിന് Alt+തിരയൽ അല്ലെങ്കിൽ Shift അമർത്തുക.</translation>
<translation id="8940956008527784070">ബാറ്ററി കുറവാണ് (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">സ്വീകരിക്കുക</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> ശേഷിക്കുന്നു</translation>
<translation id="520760366042891468">നിങ്ങളുടെ സ്‌ക്രീനിന്റെ നിയന്ത്രണം Hangouts വഴി പങ്കിടുന്നു.</translation>
<translation id="8000066093800657092">നെറ്റ്‍വര്‍ക്ക് ഇല്ല</translation>
<translation id="4015692727874266537">മറ്റൊരു അക്കൗണ്ടിൽ സൈൻ ഇൻ ചെയ്യുക...</translation>
<translation id="5941711191222866238">ചെറുതാക്കുക‍</translation>
<translation id="6911468394164995108">മറ്റുള്ളവ ചേർക്കുക...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">പൂർണ്ണമായും ചാർജാകുന്നതിന് <ph name="HOUR"/>മ <ph name="MINUTE"/>മി</translation>
<translation id="6359806961507272919"><ph name="PHONE_NUMBER"/> എന്നതില്‍ നിന്നുള്ള SMS</translation>
<translation id="1244147615850840081">കാരിയര്‍</translation>
diff --git a/chromium/ash/strings/ash_strings_mr.xtb b/chromium/ash/strings/ash_strings_mr.xtb
index 4705f008a35..6d80de1f818 100644
--- a/chromium/ash/strings/ash_strings_mr.xtb
+++ b/chromium/ash/strings/ash_strings_mr.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="mr">
<translation id="3595596368722241419">बॅटरी पूर्ण चार्ज</translation>
-<translation id="5250713215130379958">लाँचर स्वयं लपवा</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> आणि <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">पोर्टल राज्य</translation>
<translation id="30155388420722288">ओव्हरफ्लो बटण</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth सक्षम</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> <ph name="ROTATION"/> वर फिरविले होते</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth अक्षम</translation>
+<translation id="7165320105431587207">नेटवर्क कॉन्फिगर करण्यात अयशस्वी</translation>
<translation id="3775358506042162758">आपल्याकडे एकाधिक साइन इनमध्ये फक्त तीन पर्यंत खाती असू शकतात.</translation>
<translation id="370649949373421643">Wi-fi सक्षम करा</translation>
<translation id="3626281679859535460">ब्राइटनेस</translation>
+<translation id="595202126637698455">कार्यप्रदर्शन ट्रेसिंग सक्षम केले</translation>
<translation id="8054466585765276473">बॅटरी वेळ गणना करत आहे.</translation>
<translation id="7982789257301363584">नेटवर्क</translation>
<translation id="5565793151875479467">प्रॉक्सी...</translation>
<translation id="938582441709398163">कीबोर्ड आच्छादन</translation>
<translation id="4387004326333427325">प्रमाणीकरण प्रमाणपत्र दूरस्थपणे नाकारले</translation>
<translation id="6979158407327259162">Google ड्राइव्ह</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> रिजोल्यूशन <ph name="RESOLUTION"/> वर बदलले होते</translation>
<translation id="6943836128787782965">HTTP अयशस्वी झाले</translation>
<translation id="2297568595583585744">स्थिती ट्रे</translation>
<translation id="1661867754829461514">PIN गहाळ आहे </translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">निम्न-उर्जेचे चार्जर</translation>
<translation id="3846575436967432996">कोणतीही नेटवर्क माहिती उपलब्ध नाही</translation>
<translation id="3026237328237090306">मोबाइल डेटा सेटअप करा</translation>
+<translation id="5871632337994001636">डिव्हाइस व्यवस्थापित करा...</translation>
<translation id="785750925697875037">मोबाइल खाते पहा</translation>
<translation id="153454903766751181">सेल्युलर मोडेम आरंभ करत आहे...</translation>
<translation id="4628814525959230255">Hangouts द्वारे <ph name="HELPER_NAME"/> सह आपल्या स्क्रीनचे सामायिकरण नियंत्रण.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> फिरवले गेले आ</translation>
<translation id="7864539943188674973">Bluetooth अक्षम करा</translation>
<translation id="939252827960237676">स्क्रीनशॉट जतन करण्यात अयशस्वी</translation>
<translation id="3126069444801937830">अद्यतनासाठी पुनर्प्रारंभ करा</translation>
<translation id="2268813581635650749">सर्व साइन आउट करा</translation>
<translation id="735745346212279324">VPN डिस्कनेक्ट केले</translation>
<translation id="7320906967354320621">निष्क्रिय</translation>
-<translation id="6303423059719347535">बॅटरी <ph name="PERCENTAGE"/>% भरली आहे</translation>
<translation id="15373452373711364">मोठा माउस कर्सर</translation>
-<translation id="2778346081696727092">प्रदान केलेल्या वापरकर्तानाव किंवा संकेतशब्दासह प्रमाणिकरण करण्‍यात अयशस्वी झाले</translation>
<translation id="3294437725009624529">अतिथी</translation>
<translation id="8190698733819146287">भाषा आणि इनपुट सानुकूलित करा...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">शेल्फ स्थिती</translation>
<translation id="2903907270192926896">इनपुट</translation>
<translation id="8676770494376880701">निम्न-उर्जेचे चार्जर कनेक्ट केले</translation>
<translation id="7170041865419449892">परिक्षेत्राबाहेर</translation>
<translation id="4804818685124855865">‍डिस्कनेक्ट</translation>
<translation id="2544853746127077729">प्रमाणीकरण प्रमाणपत्र नेटवर्कद्वारे नाकारले</translation>
<translation id="5222676887888702881">साइन आउट करा</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">कॉन्फिगरेशन</translation>
<translation id="1272079795634619415">थांबा</translation>
<translation id="4957722034734105353">अधिक जाणून घ्या...</translation>
<translation id="2964193600955408481">Wi-Fi अक्षम करा</translation>
-<translation id="811680302244032017">डिव्हाइस जोडा...</translation>
<translation id="4279490309300973883">मिररिंग</translation>
+<translation id="7973962044839454485">अयोग्य वापरकर्तानावामुळे किंवा संकेतशब्दामुळे PPP प्रमाणीकरण अयशस्वी झाले</translation>
<translation id="2509468283778169019">CAPS LOCK सुरु आहे</translation>
<translation id="3892641579809465218">अंतर्गत डिस्प्ले</translation>
<translation id="7823564328645135659">आपली सेटिंग्ज समक्रमित केल्यानंतर भाषा &quot;<ph name="FROM_LOCALE"/>&quot; मधून &quot;<ph name="TO_LOCALE"/>&quot; मध्ये बदलली आहे.</translation>
<translation id="3368922792935385530">कनेक्ट केले</translation>
<translation id="8340999562596018839">संभाषण अभिप्राय</translation>
<translation id="8654520615680304441">Wi-Fi चालू करा...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">आपली इनपुट पद्धत <ph name="INPUT_METHOD_ID"/> मध्ये बदलली आहे.
स्विच करण्यासाठी Shift + Alt दाबा.</translation>
<translation id="2562916301614567480">खाजगी नेटवर्क</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% उर्वरित</translation>
<translation id="9089416786594320554">इनपुट पद्धती</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">शेल्फ</translation>
<translation id="2614835198358683673">आपले Chromebook चालू असताना ते चार्ज होऊ शकत नाही. अधिकृत चार्जर वापरण्याचा विचार करा.</translation>
<translation id="1895658205118569222">बंद करा</translation>
<translation id="4430019312045809116">व्हॉल्यूम</translation>
+<translation id="8681498213689260554">अद्यतनासाठी रीस्टार्ट करा आणि पॉवरवॉश करा</translation>
<translation id="4442424173763614572">DNS लुकअप अयश्सवी</translation>
-<translation id="6356500677799115505">बॅटरी भरली आहे आणि चार्ज होत आहे</translation>
<translation id="7874779702599364982">सेल्यूलर नेटवर्कसाठी शोधत आहे...</translation>
<translation id="583281660410589416">अज्ञात</translation>
<translation id="1383876407941801731">शोध</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">नेटवर्क माहिती</translation>
<translation id="1621499497873603021">बॅटरी रिक्त होईपर्यंत शिल्लक वेळ, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">अतिथी निर्गमन करा</translation>
-<translation id="4471417012762451363">बॅटरी <ph name="PERCENTAGE"/>% भरली आहे आणि चार्ज होत आहे</translation>
<translation id="8308637677604853869">मागील मेनू</translation>
<translation id="4666297444214622512">दुसर्‍या खात्यामध्ये साइन इन करू शकत नाही.</translation>
<translation id="1346748346194534595">उजवे</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">अज्ञात नेटवर्क त्रुटी</translation>
<translation id="1467432559032391204">डावे</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> सक्रिय करत आहे</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">वाढवा</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">एका निम्न-उर्जेच्या चार्जरवर प्लग इन केले. बॅटरी चार्जिंग विश्वसनीय असू शकत नाही.</translation>
<translation id="3784455785234192852">लॉक करा</translation>
<translation id="2805756323405976993">अनुप्रयोग</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> चा आकार <ph name="RESOLUTION"/> मध्ये बदलण्यात आला</translation>
<translation id="1512064327686280138">सक्रियन अयशस्वी</translation>
<translation id="5097002363526479830">'<ph name="NAME"/>': नेटवर्कशी कनेक्ट करण्यात अयशस्वी. <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi बंद आहे.</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">वॉलपेपर सेट करा...</translation>
<translation id="8678698760965522072">ऑनलाइन राज्य</translation>
<translation id="2532589005999780174">उच्च तीव्रता मोड</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">अंतर्गत त्रुटी</translation>
<translation id="3019353588588144572">बॅटरी पूर्णपणे चार्ज होईपर्यंत उर्वरित वेळ, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">स्क्रीन भिंग</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">सत्र निर्गमन करा</translation>
<translation id="8454013096329229812">Wi-Fi चालू आहे.</translation>
<translation id="4872237917498892622">Alt+Search किंवा Shift</translation>
+<translation id="9201131092683066720">बॅटरी <ph name="PERCENTAGE"/>% भरली आहे.</translation>
<translation id="2983818520079887040">सेटिंग्ज...</translation>
+<translation id="1195412055398077112">ओव्हरस्कॅन</translation>
<translation id="1717216362413677834">डॉक मोड</translation>
+<translation id="112308213915226829">शेल्फ स्वयं लपवा</translation>
<translation id="8927026611342028580">विनंती केलेले कनेक्ट करा</translation>
<translation id="8300849813060516376">OTASP बिघडले</translation>
<translation id="2792498699870441125">Alt+Search</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> फाईल(ली) समक्रमित करीत आहे</translation>
+<translation id="5958529069007801266">पर्यवेक्षी वापरकर्ता</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK बंद आहे</translation>
<translation id="6248847161401822652">बाहेर पडण्यासाठी Control Shift Q दोनदा दाबा.</translation>
+<translation id="6785414152754474415">बॅटरी <ph name="PERCENTAGE"/>% भरली आहे आणि चार्ज होत आहे.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: सक्रिय करत आहे...</translation>
+<translation id="4895488851634969361">बॅटरी भरली आहे.</translation>
<translation id="1391854757121130358">आपण आपल्या मोबाईल डेटा भत्त्याचा वापर केला असेल.</translation>
-<translation id="5413208160176941586">स्थानिकरित्या व्यवस्थापित वापरकर्ता</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">लाँचर स्थिती</translation>
+<translation id="5947494881799873997">परत करा</translation>
<translation id="7593891976182323525">Search किंवा Shift</translation>
<translation id="7649070708921625228">मदत</translation>
<translation id="3050422059534974565">CAPS LOCK चालू आहे.
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">चुकीचा सांकेतिक वाक्यांश</translation>
<translation id="6165508094623778733">अधिक जाणून घ्या</translation>
<translation id="9046895021617826162">कनेक्ट करण्यात अयशस्वी</translation>
+<translation id="7168224885072002358"><ph name="TIMEOUT_SECONDS"/> मध्ये जुन्या रिजोल्यूशनवर परत करत आहे</translation>
<translation id="973896785707726617">हे सत्र <ph name="SESSION_TIME_REMAINING"/> मध्ये समाप्त होईल. आपल्याला स्वयंचलितपणे साइन आउट केले जाईल.</translation>
<translation id="8372369524088641025">खराब WEP की</translation>
<translation id="6636709850131805001">अपरिचित राज्य</translation>
<translation id="3573179567135747900">&quot;<ph name="FROM_LOCALE"/>&quot; मध्ये परत बदला (रीस्टार्ट करणे आवश्यक)</translation>
<translation id="8103386449138765447">SMS संदेश: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google ड्राइव्ह सेटिंग्ज...</translation>
-<translation id="1510238584712386396">लाँचर</translation>
<translation id="7209101170223508707">CAPS LOCK चालू आहे.
रद्द करण्यासाठी Alt+Search किंवा Shift दाबा.</translation>
<translation id="8940956008527784070">बॅटरी कमी झाली (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">स्वीकारा</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> शिल्‍लक</translation>
<translation id="520760366042891468">Hangouts द्वारे आपल्या स्क्रीनचे नियंत्रण सामायिक करत आहे.</translation>
<translation id="8000066093800657092">कोणतेही नेटवर्क नाही</translation>
<translation id="4015692727874266537">दुसऱ्या खात्यात साइन इन करा...</translation>
<translation id="5941711191222866238">लहान करा</translation>
<translation id="6911468394164995108">दुसरीकडे सामील व्हा...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">पूर्ण होईपर्यंत <ph name="HOUR"/>ता <ph name="MINUTE"/>मि</translation>
<translation id="6359806961507272919"><ph name="PHONE_NUMBER"/> कडून SMS</translation>
<translation id="1244147615850840081">कॅरियर</translation>
diff --git a/chromium/ash/strings/ash_strings_ms.xtb b/chromium/ash/strings/ash_strings_ms.xtb
index e701bf92582..7006c53b69b 100644
--- a/chromium/ash/strings/ash_strings_ms.xtb
+++ b/chromium/ash/strings/ash_strings_ms.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ms">
<translation id="3595596368722241419">Bateri penuh</translation>
-<translation id="5250713215130379958">Autosembunyi pelancar</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> dan <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Keadaan portal</translation>
<translation id="30155388420722288">Butang Limpahan</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth didayakan</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> telah diputarkan ke <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth dilumpuhkan</translation>
+<translation id="7165320105431587207">Gagal mengkonfigurasi rangkaian</translation>
<translation id="3775358506042162758">Anda hanya boleh mempunyai sehingga tiga akaun dalam log masuk berbilang.</translation>
<translation id="370649949373421643">Dayakan Wi-Fi</translation>
<translation id="3626281679859535460">Kecerahan</translation>
+<translation id="595202126637698455">Penjejakan prestasi didayakan</translation>
<translation id="8054466585765276473">Mengira tempoh bateri.</translation>
<translation id="7982789257301363584">Rangkaian</translation>
<translation id="5565793151875479467">Proksi...</translation>
<translation id="938582441709398163">Tindihan Papan Kekunci</translation>
<translation id="4387004326333427325">Sijil pengesahan ditolak dari jauh</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">Peleraian <ph name="DISPLAY_NAME"/> telah diubah kepada <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP gagal</translation>
<translation id="2297568595583585744">Dulang status</translation>
<translation id="1661867754829461514">PIN tiada</translation>
@@ -34,39 +38,41 @@ Tekan Shift + Alt untuk menukar.</translation>
<translation id="2127372758936585790">Pengecas berkuasa rendah</translation>
<translation id="3846575436967432996">Tiada maklumat rangkaian tersedia</translation>
<translation id="3026237328237090306">Sediakan data mudah alih</translation>
+<translation id="5871632337994001636">Uruskan peranti...</translation>
<translation id="785750925697875037">Lihat akaun mudah alih</translation>
<translation id="153454903766751181">Memulakan modem selular...</translation>
<translation id="4628814525959230255">Berkongsi kawalan skrin anda dengan <ph name="HELPER_NAME"/> melalui Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> telah diputar</translation>
<translation id="7864539943188674973">Lumpuhkan Bluetooth</translation>
<translation id="939252827960237676">Gagal menyimpan tangkapan skrin</translation>
<translation id="3126069444801937830">Mulakan semula untuk mengemas kini</translation>
<translation id="2268813581635650749">Log keluar semua</translation>
<translation id="735745346212279324">VPN diputuskan sambungan</translation>
<translation id="7320906967354320621">Melahu</translation>
-<translation id="6303423059719347535">Bateri <ph name="PERCENTAGE"/>% penuh</translation>
<translation id="15373452373711364">Kursor tetikus besar</translation>
-<translation id="2778346081696727092">Gagal untuk mengesahkan dengan nama pengguna atau kata laluan yang disediakan</translation>
<translation id="3294437725009624529">Tetamu</translation>
<translation id="8190698733819146287">Sesuaikan bahasa dan input...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Kedudukan rak</translation>
<translation id="2903907270192926896">INPUT</translation>
<translation id="8676770494376880701">Pengecas berkuasa rendah disambungkan</translation>
<translation id="7170041865419449892">Di luar lingkungan</translation>
<translation id="4804818685124855865">Putuskan sambungan</translation>
<translation id="2544853746127077729">Sijil pengesahan ditolak oleh rangkaian</translation>
<translation id="5222676887888702881">Log keluar</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfigurasi</translation>
<translation id="1272079795634619415">Berhenti</translation>
<translation id="4957722034734105353">Ketahui lebih lanjut...</translation>
<translation id="2964193600955408481">Lumpuhkan Wi-Fi</translation>
-<translation id="811680302244032017">Tambah peranti...</translation>
<translation id="4279490309300973883">Pencerminan</translation>
+<translation id="7973962044839454485">Pengesahan PPP gagal disebabkan oleh nama pengguna atau kata laluan yang salah</translation>
<translation id="2509468283778169019">Kekunci CAPS LOCK dihidupkan</translation>
<translation id="3892641579809465218">Paparan Dalaman</translation>
<translation id="7823564328645135659">Bahasa telah ditukar daripada &quot;<ph name="FROM_LOCALE"/>&quot; kepada &quot;<ph name="TO_LOCALE"/>&quot; selepas menyegerakkan tetapan anda.</translation>
<translation id="3368922792935385530">Disambungkan</translation>
<translation id="8340999562596018839">Maklum balas dituturkan</translation>
<translation id="8654520615680304441">Hidupkan Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Kaedah masukan anda telah ditukar kepada <ph name="INPUT_METHOD_ID"/>.
Tekan Shift + Alt untuk menukar.</translation>
<translation id="2562916301614567480">Rangkaian Persendirian</translation>
@@ -83,11 +89,12 @@ Tekan Shift + Alt untuk menukar.</translation>
<translation id="3626637461649818317">Tinggal <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">Kaedah input</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Rak</translation>
<translation id="2614835198358683673">Chromebook anda tidak boleh dicas semasa dihidupkan. Pertimbangkan untuk menggunakan pengecas rasmi.</translation>
<translation id="1895658205118569222">Tutup</translation>
<translation id="4430019312045809116">Kelantangan</translation>
+<translation id="8681498213689260554">Mulakan semula dan Hapus Bersih untuk mengemas kini</translation>
<translation id="4442424173763614572">Carian DNS gagal</translation>
-<translation id="6356500677799115505">Bateri penuh dan sedang dicas.</translation>
<translation id="7874779702599364982">Mencari rangkaian selular...</translation>
<translation id="583281660410589416">Tidak diketahui</translation>
<translation id="1383876407941801731">Cari</translation>
@@ -96,7 +103,6 @@ Tekan Shift + Alt untuk menukar.</translation>
<translation id="2204305834655267233">Maklumat Rangkaian</translation>
<translation id="1621499497873603021">Masa yang tinggal sehingga bateri kosong, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Keluar dari tetamu</translation>
-<translation id="4471417012762451363">Bateri <ph name="PERCENTAGE"/>% penuh dan sedang dicas</translation>
<translation id="8308637677604853869">Menu sebelumnya</translation>
<translation id="4666297444214622512">Tidak boleh log masuk ke akaun lain.</translation>
<translation id="1346748346194534595">Kanan</translation>
@@ -114,6 +120,7 @@ Tekan Ctrl+Alt+Z untuk melumpuhkan.</translation>
<translation id="6312403991423642364">Ralat rangkaian tidak diketahui</translation>
<translation id="1467432559032391204">Kiri</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Mengaktifkan <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maksimumkan</translation>
@@ -123,7 +130,6 @@ Tekan Ctrl+Alt+Z untuk melumpuhkan.</translation>
<translation id="2727977024730340865">Dipalamkan pada pengecas berkuasa rendah. Pengecasan bateri mungkin tidak boleh diharapkan.</translation>
<translation id="3784455785234192852">Kunci</translation>
<translation id="2805756323405976993">Apl</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> telah diubah saiz kepada <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Gagal pengaktifan</translation>
<translation id="5097002363526479830">Gagal untuk bersambung ke rangkaian '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi dimatikan.</translation>
@@ -131,6 +137,7 @@ Tekan Ctrl+Alt+Z untuk melumpuhkan.</translation>
<translation id="7052914147756339792">Tetapkan kertas dinding...</translation>
<translation id="8678698760965522072">Keadaan dalam talian</translation>
<translation id="2532589005999780174">Mod kontras tinggi</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Ralat dalaman</translation>
<translation id="3019353588588144572">Masa yang tinggal sehingga bateri dicas sepenuhnya, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Penggadang skrin</translation>
@@ -153,20 +160,24 @@ Mesej pelayan: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Keluar dari sesi</translation>
<translation id="8454013096329229812">Wi-Fi dihidupkan.</translation>
<translation id="4872237917498892622">Alt+Search atau Shift</translation>
+<translation id="9201131092683066720">Bateri <ph name="PERCENTAGE"/>% penuh.</translation>
<translation id="2983818520079887040">Tetapan...</translation>
+<translation id="1195412055398077112">imbas lampau</translation>
<translation id="1717216362413677834">Mod dok</translation>
+<translation id="112308213915226829">Autosembunyi rak</translation>
<translation id="8927026611342028580">Sambungan Diminta</translation>
<translation id="8300849813060516376">OTASP gagal</translation>
<translation id="2792498699870441125">Alt+Search</translation>
<translation id="8660803626959853127">Menyegerakkan <ph name="COUNT"/> fail</translation>
+<translation id="5958529069007801266">Pengguna diselia</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">Kekunci CAPS LOCK dimatikan</translation>
<translation id="6248847161401822652">Tekan Control Shift Q dua kali untuk keluar.</translation>
+<translation id="6785414152754474415">Bateri <ph name="PERCENTAGE"/>% penuh dan sedang dicas.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Mengaktifkan...</translation>
+<translation id="4895488851634969361">Bateri penuh.</translation>
<translation id="1391854757121130358">Anda mungkin telah menghabiskan peruntukan data mudah alih anda.</translation>
-<translation id="5413208160176941586">Pengguna terurus setempat</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Kedudukan pelancar</translation>
+<translation id="5947494881799873997">Berbalik</translation>
<translation id="7593891976182323525">Search atau Shift</translation>
<translation id="7649070708921625228">Bantuan</translation>
<translation id="3050422059534974565">CAPS LOCK dihidupkan. Tekan Search atau Shift untuk membatalkan.</translation>
@@ -178,22 +189,24 @@ Mesej pelayan: <ph name="SERVER_MSG"/></translation>
<translation id="6692173217867674490">Frasa laluan teruk</translation>
<translation id="6165508094623778733">Ketahui lebih lanjut</translation>
<translation id="9046895021617826162">Gagal disambungkan</translation>
+<translation id="7168224885072002358">Kembali kepada peleraian lama dalam <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Sesi ini akan berakhir dalam <ph name="SESSION_TIME_REMAINING"/>. Anda akan dilog keluar secara automatik.</translation>
<translation id="8372369524088641025">Kekunci WEP teruk</translation>
<translation id="6636709850131805001">Keadaan tidak dikenali</translation>
<translation id="3573179567135747900">Tukar kembali kepada &quot;<ph name="FROM_LOCALE"/>&quot; (perlu dimulakan semula)</translation>
<translation id="8103386449138765447">Mesej SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Tetapan Google Drive</translation>
-<translation id="1510238584712386396">Pelancar</translation>
<translation id="7209101170223508707">CAPS LOCK dihidupkan.
Tekan Alt+Search atau Shift untuk membatalkan.</translation>
<translation id="8940956008527784070">Bateri lemah (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Terima</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> tinggal</translation>
<translation id="520760366042891468">Berkongsi kawalan skrin anda melalui Hangouts.</translation>
<translation id="8000066093800657092">Tiada rangkaian</translation>
<translation id="4015692727874266537">Log masuk akaun lain...</translation>
<translation id="5941711191222866238">Minimumkan</translation>
<translation id="6911468394164995108">Sertai yang lain...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>j <ph name="MINUTE"/>m sehingga penuh</translation>
<translation id="6359806961507272919">SMS daripada <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Pembawa</translation>
diff --git a/chromium/ash/strings/ash_strings_nl.xtb b/chromium/ash/strings/ash_strings_nl.xtb
index e92a4a594e3..ccb89626970 100644
--- a/chromium/ash/strings/ash_strings_nl.xtb
+++ b/chromium/ash/strings/ash_strings_nl.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="nl">
<translation id="3595596368722241419">Accu is vol</translation>
-<translation id="5250713215130379958">Opstartprogramma automatisch verbergen</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> en <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Status van portal</translation>
<translation id="30155388420722288">Overloopknop</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth ingeschakeld</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> is gedraaid naar <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth uitgeschakeld</translation>
-<translation id="3775358506042162758">U kunt maximaal drie accounts hebben in Toegang tot meerdere accounts</translation>
+<translation id="7165320105431587207">Kan netwerk niet configureren</translation>
+<translation id="3775358506042162758">Je kunt maximaal drie accounts hebben in Toegang tot meerdere accounts</translation>
<translation id="370649949373421643">Wifi inschakelen</translation>
<translation id="3626281679859535460">Helderheid</translation>
+<translation id="595202126637698455">Bijhouden van prestaties ingeschakeld</translation>
<translation id="8054466585765276473">Accuduur berekenen.</translation>
<translation id="7982789257301363584">Netwerk</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Overlay voor toetsenbord</translation>
<translation id="4387004326333427325">Verificatiecertificaat afgewezen op afstand</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">De resolutie van <ph name="DISPLAY_NAME"/> is gewijzigd in <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Ophalen van HTTP mislukt</translation>
<translation id="2297568595583585744">Statussysteemvak</translation>
<translation id="1661867754829461514">Pincode ontbreekt</translation>
@@ -29,45 +33,47 @@
<translation id="6596816719288285829">IP-adres</translation>
<translation id="4508265954913339219">Activering mislukt</translation>
<translation id="3621712662352432595">Audio-instellingen</translation>
-<translation id="1812696562331527143">Uw invoermethode is gewijzigd in <ph name="INPUT_METHOD_ID"/>*(<ph name="BEGIN_LINK"/>derden<ph name="END_LINK"/>).
+<translation id="1812696562331527143">Je invoermethode is gewijzigd in <ph name="INPUT_METHOD_ID"/>*(<ph name="BEGIN_LINK"/>derden<ph name="END_LINK"/>).
Druk op Shift + Alt om te schakelen.j</translation>
<translation id="2127372758936585790">Laag-vermogen-lader</translation>
<translation id="3846575436967432996">Geen netwerkinformatie beschikbaar</translation>
<translation id="3026237328237090306">Mobiele gegevens instellen</translation>
+<translation id="5871632337994001636">Apparaten beheren...</translation>
<translation id="785750925697875037">Mobiel account weergeven</translation>
<translation id="153454903766751181">Mobiele modem initialiseren...</translation>
-<translation id="4628814525959230255">Controle over uw scherm delen met <ph name="HELPER_NAME"/> via Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> is gedraaid</translation>
+<translation id="4628814525959230255">Controle over je scherm delen met <ph name="HELPER_NAME"/> via Hangouts.</translation>
<translation id="7864539943188674973">Bluetooth uitschakelen</translation>
<translation id="939252827960237676">Kan screenshot niet opslaan</translation>
<translation id="3126069444801937830">Opnieuw starten voor bijwerken</translation>
<translation id="2268813581635650749">Alle gebruikers uitloggen</translation>
<translation id="735745346212279324">Verbinding met VPN verbroken</translation>
<translation id="7320906967354320621">Inactief</translation>
-<translation id="6303423059719347535">De accu is <ph name="PERCENTAGE"/>% vol</translation>
<translation id="15373452373711364">Grote muisaanwijzer</translation>
-<translation id="2778346081696727092">Kan niet verifiëren met deze gebruikersnaam of dit wachtwoord</translation>
<translation id="3294437725009624529">Gast</translation>
<translation id="8190698733819146287">Talen en invoer aanpassen...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Positie van plank</translation>
<translation id="2903907270192926896">INVOER</translation>
<translation id="8676770494376880701">Laag-vermogen-lader aangesloten</translation>
<translation id="7170041865419449892">Geen bereik</translation>
<translation id="4804818685124855865">Verbinding verbreken</translation>
<translation id="2544853746127077729">Verificatiecertificaat geweigerd door netwerk</translation>
<translation id="5222676887888702881">Uitloggen</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Configuratie</translation>
<translation id="1272079795634619415">Stop</translation>
<translation id="4957722034734105353">Meer informatie...</translation>
<translation id="2964193600955408481">Wifi uitschakelen</translation>
-<translation id="811680302244032017">Apparaat toevoegen...</translation>
<translation id="4279490309300973883">Mirroring</translation>
+<translation id="7973962044839454485">PPP-verificatie mislukt wegens een onjuiste gebruikersnaam of wachtwoord</translation>
<translation id="2509468283778169019">CAPS LOCK is ingeschakeld</translation>
<translation id="3892641579809465218">Interne display</translation>
-<translation id="7823564328645135659">Na het synchroniseren met uw instellingen, is de taal gewijzigd van '<ph name="FROM_LOCALE"/>' in '<ph name="TO_LOCALE"/>'.</translation>
+<translation id="7823564328645135659">Na het synchroniseren met je instellingen, is de taal gewijzigd van '<ph name="FROM_LOCALE"/>' in '<ph name="TO_LOCALE"/>'.</translation>
<translation id="3368922792935385530">Verbonden</translation>
<translation id="8340999562596018839">Gesproken feedback</translation>
<translation id="8654520615680304441">Wifi inschakelen...</translation>
-<translation id="5825747213122829519">Uw invoermethode is gewijzigd in <ph name="INPUT_METHOD_ID"/>.
+<translation id="8828714802988429505">90°</translation>
+<translation id="5825747213122829519">Je invoermethode is gewijzigd in <ph name="INPUT_METHOD_ID"/>.
Druk op Shift + Alt om te schakelen.</translation>
<translation id="2562916301614567480">Privénetwerk</translation>
<translation id="6549021752953852991">Geen mobiel netwerk beschikbaar</translation>
@@ -83,11 +89,12 @@ Druk op Shift + Alt om te schakelen.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% resterend</translation>
<translation id="9089416786594320554">Invoermethoden</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
-<translation id="2614835198358683673">Uw Chromebook wordt mogelijk niet opgeladen wanneer deze is ingeschakeld. Overweeg het gebruik van een officiële lader.</translation>
+<translation id="2825619548187458965">Plank</translation>
+<translation id="2614835198358683673">Je Chromebook wordt mogelijk niet opgeladen wanneer deze is ingeschakeld. Overweeg het gebruik van een officiële lader.</translation>
<translation id="1895658205118569222">Uitschakeling</translation>
<translation id="4430019312045809116">Volume</translation>
+<translation id="8681498213689260554">Start opnieuw op en voer Powerwash uit om bij te werken</translation>
<translation id="4442424173763614572">DNS-lookup mislukt</translation>
-<translation id="6356500677799115505">De accu is vol en wordt opgeladen.</translation>
<translation id="7874779702599364982">Zoeken naar mobiele netwerken...</translation>
<translation id="583281660410589416">Onbekend</translation>
<translation id="1383876407941801731">Zoeken</translation>
@@ -96,7 +103,6 @@ Druk op Shift + Alt om te schakelen.</translation>
<translation id="2204305834655267233">Netwerkinfo</translation>
<translation id="1621499497873603021">Resterende tijd totdat de accu leeg is: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Gastsessie sluiten</translation>
-<translation id="4471417012762451363">De accu is <ph name="PERCENTAGE"/>% vol en wordt opgeladen</translation>
<translation id="8308637677604853869">Vorig menu</translation>
<translation id="4666297444214622512">Kan niet inloggen op een ander account.</translation>
<translation id="1346748346194534595">Rechts</translation>
@@ -114,6 +120,7 @@ Druk op Ctrl+Alt+Z om uit te schakelen.</translation>
<translation id="6312403991423642364">Onbekende netwerkfout</translation>
<translation id="1467432559032391204">Links</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> activeren</translation>
<translation id="8814190375133053267">Wifi</translation>
<translation id="1398853756734560583">Maximaliseren</translation>
@@ -123,7 +130,6 @@ Druk op Ctrl+Alt+Z om uit te schakelen.</translation>
<translation id="2727977024730340865">Aangesloten op een laag-vermogen-lader. Opladen van de batterij mogelijk niet betrouwbaar.</translation>
<translation id="3784455785234192852">Vergrendelen</translation>
<translation id="2805756323405976993">Applicaties</translation>
-<translation id="8871072142849158571">Het formaat van <ph name="DISPLAY_NAME"/> is aangepast naar <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Activering mislukt</translation>
<translation id="5097002363526479830">Kan geen verbinding maken met het netwerk '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wifi is uitgeschakeld.</translation>
@@ -131,6 +137,7 @@ Druk op Ctrl+Alt+Z om uit te schakelen.</translation>
<translation id="7052914147756339792">Achtergrond instellen...</translation>
<translation id="8678698760965522072">Online status</translation>
<translation id="2532589005999780174">Modus voor hoog contrast</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Interne fout</translation>
<translation id="3019353588588144572">Resterende tijd totdat de accu volledig is opgeladen: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Vergrootglas</translation>
@@ -153,20 +160,24 @@ Melding van de server: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Sessie sluiten</translation>
<translation id="8454013096329229812">Wifi is ingeschakeld.</translation>
<translation id="4872237917498892622">Alt+Zoeken of Shift</translation>
+<translation id="9201131092683066720">De accu is <ph name="PERCENTAGE"/>% vol.</translation>
<translation id="2983818520079887040">Instellingen...</translation>
+<translation id="1195412055398077112">overscan</translation>
<translation id="1717216362413677834">Dockmodus</translation>
+<translation id="112308213915226829">Plank automatisch verbergen</translation>
<translation id="8927026611342028580">Verbinding aangevraagd</translation>
<translation id="8300849813060516376">OTASP mislukt</translation>
<translation id="2792498699870441125">Alt+Zoeken</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> bestand(en) synchroniseren</translation>
+<translation id="5958529069007801266">Bewaakte gebruiker</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK is uitgeschakeld</translation>
<translation id="6248847161401822652">Druk twee keer op Control+Shift+Q om te stoppen.</translation>
+<translation id="6785414152754474415">De accu is <ph name="PERCENTAGE"/>% vol en wordt opgeladen.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: activeren...</translation>
-<translation id="1391854757121130358">U heeft mogelijk uw quotum voor mobiele gegevens verbruikt.</translation>
-<translation id="5413208160176941586">Lokaal beheerde gebruiker</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Positie van launcher</translation>
+<translation id="4895488851634969361">De accu is vol.</translation>
+<translation id="1391854757121130358">Je hebt mogelijk je quotum voor mobiele gegevens verbruikt.</translation>
+<translation id="5947494881799873997">Terugzetten</translation>
<translation id="7593891976182323525">Zoeken of Shift</translation>
<translation id="7649070708921625228">Help</translation>
<translation id="3050422059534974565">CAPS LOCK is ingeschakeld.
@@ -179,22 +190,24 @@ Druk op Zoeken of Shift om te annuleren.</translation>
<translation id="6692173217867674490">Slechte wachtwoordzin</translation>
<translation id="6165508094623778733">Meer informatie</translation>
<translation id="9046895021617826162">Verbinding mislukt</translation>
-<translation id="973896785707726617">Deze sessie loopt af over <ph name="SESSION_TIME_REMAINING"/>. U wordt automatisch uitgelogd.</translation>
+<translation id="7168224885072002358">Terugzetten naar oude resolutie over <ph name="TIMEOUT_SECONDS"/></translation>
+<translation id="973896785707726617">Deze sessie loopt af over <ph name="SESSION_TIME_REMAINING"/>. Je wordt automatisch uitgelogd.</translation>
<translation id="8372369524088641025">Slechte WEP-sleutel</translation>
<translation id="6636709850131805001">Niet-herkende staat</translation>
<translation id="3573179567135747900">Teruggaan naar '<ph name="FROM_LOCALE"/>' (opnieuw starten vereist)</translation>
<translation id="8103386449138765447">SMS-berichten: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Instellingen voor Google Drive...</translation>
-<translation id="1510238584712386396">Opstartprogramma</translation>
<translation id="7209101170223508707">CAPS LOCK is ingeschakeld.
Druk op Alt+Zoeken of Shift om te annuleren.</translation>
<translation id="8940956008527784070">Accu is bijna leeg (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Accepteren</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> resterend</translation>
-<translation id="520760366042891468">Controle over uw scherm delen via Hangouts.</translation>
+<translation id="520760366042891468">Controle over je scherm delen via Hangouts.</translation>
<translation id="8000066093800657092">Geen netwerk</translation>
<translation id="4015692727874266537">Inloggen op ander account...</translation>
<translation id="5941711191222866238">Minimaliseren</translation>
<translation id="6911468394164995108">Verbinding met ander netwerk maken...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>u <ph name="MINUTE"/>m tot volledig opgeladen</translation>
<translation id="6359806961507272919">Sms van <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Provider</translation>
diff --git a/chromium/ash/strings/ash_strings_no.xtb b/chromium/ash/strings/ash_strings_no.xtb
index 06b5745a658..5c3a4876143 100644
--- a/chromium/ash/strings/ash_strings_no.xtb
+++ b/chromium/ash/strings/ash_strings_no.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="no">
<translation id="3595596368722241419">Batteriet er fullt</translation>
-<translation id="5250713215130379958">Skjul programlisten automatisk</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> og <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Portaltilstand</translation>
<translation id="30155388420722288">Overflyt-knappen</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth er aktivert</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> ble rotert til <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth er deaktivert</translation>
+<translation id="7165320105431587207">Kunne ikke konfigurere nettverket</translation>
<translation id="3775358506042162758">Du kan bare ha opptil tre kontoer i flerpålogging.</translation>
<translation id="370649949373421643">Aktivér Wi-Fi</translation>
<translation id="3626281679859535460">Lysstyrke</translation>
+<translation id="595202126637698455">Ytelsessporing er aktivert</translation>
<translation id="8054466585765276473">Beregner batteritid.</translation>
<translation id="7982789257301363584">Nettverk</translation>
<translation id="5565793151875479467">Mellomtjener</translation>
<translation id="938582441709398163">Tastaturbelegg</translation>
<translation id="4387004326333427325">Autentiseringssertifikatet ble avvist eksternt</translation>
<translation id="6979158407327259162">Google Disk</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/>-oppløsningen ble endret til <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Henting av HTTP mislyktes</translation>
<translation id="2297568595583585744">Status-felt</translation>
<translation id="1661867754829461514">Personlig kode mangler</translation>
@@ -34,39 +38,41 @@ Trykk på Shift + Alt for å bytte.</translation>
<translation id="2127372758936585790">Lading med lav effekt</translation>
<translation id="3846575436967432996">Ingen nettverksinformasjon tilgjengelig</translation>
<translation id="3026237328237090306">Konfigurer mobildata</translation>
+<translation id="5871632337994001636">Administrer enheter</translation>
<translation id="785750925697875037">Se mobilkontoen</translation>
<translation id="153454903766751181">Starter mobilmodemet ...</translation>
<translation id="4628814525959230255">Deling av skjermkontrollen din med <ph name="HELPER_NAME"/> via Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> er rotert</translation>
<translation id="7864539943188674973">Deaktiver Bluetooth</translation>
<translation id="939252827960237676">Lagringen av skjermdumpen mislyktes</translation>
<translation id="3126069444801937830">Start på nytt for å oppdatere</translation>
<translation id="2268813581635650749">Logg alle av</translation>
<translation id="735745346212279324">VPN frakoblet</translation>
<translation id="7320906967354320621">Ikke aktiv</translation>
-<translation id="6303423059719347535">Batteriet er <ph name="PERCENTAGE"/> % fullt</translation>
<translation id="15373452373711364">Stor markør</translation>
-<translation id="2778346081696727092">Kunne ikke autentisere med oppgitt brukernavn eller passord</translation>
<translation id="3294437725009624529">Gjest</translation>
<translation id="8190698733819146287">Tilpass språk og inndata</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Hylleposisjon</translation>
<translation id="2903907270192926896">INNDATA</translation>
<translation id="8676770494376880701">Laveffektslader er tilkoblet</translation>
<translation id="7170041865419449892">Utenfor rekkevidde</translation>
<translation id="4804818685124855865">Koble fra</translation>
<translation id="2544853746127077729">Autentiseringssertifikatet ble avvist av nettverket</translation>
<translation id="5222676887888702881">Logg av</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfigurasjon</translation>
<translation id="1272079795634619415">Stopp</translation>
<translation id="4957722034734105353">Finn ut mer</translation>
<translation id="2964193600955408481">Deaktiver Wi-Fi</translation>
-<translation id="811680302244032017">Legg til enhet</translation>
<translation id="4279490309300973883">Speiling</translation>
+<translation id="7973962044839454485">PPP-autentiseringen mislyktes på grunn av feil brukernavn eller passord</translation>
<translation id="2509468283778169019">Caps Lock er på</translation>
<translation id="3892641579809465218">Innebygd skjerm</translation>
<translation id="7823564328645135659">Språket er endret fra <ph name="FROM_LOCALE"/> til <ph name="TO_LOCALE"/> etter synkronisering av innstillingene dine.</translation>
<translation id="3368922792935385530">Tilkoblet</translation>
<translation id="8340999562596018839">Talerespons</translation>
<translation id="8654520615680304441">Slå på Wi-Fi</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Inndatametoden din er endret til <ph name="INPUT_METHOD_ID"/>.
Trykk på Shift + Alt for å bytte.</translation>
<translation id="2562916301614567480">Privat nettverk</translation>
@@ -83,11 +89,12 @@ Trykk på Shift + Alt for å bytte.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% igjen</translation>
<translation id="9089416786594320554">Inndatametoder</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/> %</translation>
+<translation id="2825619548187458965">Hylle</translation>
<translation id="2614835198358683673">Chromebook kan ikke lades mens den er slått på. Vurder å bruke den offisielle laderen.</translation>
<translation id="1895658205118569222">Avslutning</translation>
<translation id="4430019312045809116">Volum</translation>
+<translation id="8681498213689260554">Start på nytt og kjør Powerwash for å oppdatere</translation>
<translation id="4442424173763614572">DNS-søk mislyktes</translation>
-<translation id="6356500677799115505">Batteriet er fullt og til lading.</translation>
<translation id="7874779702599364982">Søker etter mobilnettverk ...</translation>
<translation id="583281660410589416">Ukjent</translation>
<translation id="1383876407941801731">Søk</translation>
@@ -96,7 +103,6 @@ Trykk på Shift + Alt for å bytte.</translation>
<translation id="2204305834655267233">Nettverksinformasjon</translation>
<translation id="1621499497873603021">Gjenværende tid til batteriet er tomt – <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Avslutt gjesteøkten</translation>
-<translation id="4471417012762451363">Batteriet er <ph name="PERCENTAGE"/> % fullt og til lading</translation>
<translation id="8308637677604853869">Forrige meny</translation>
<translation id="4666297444214622512">Kan ikke logge på en annen konto.</translation>
<translation id="1346748346194534595">Høyre</translation>
@@ -114,6 +120,7 @@ Trykk på Ctrl+Alt+Z for å deaktivere.</translation>
<translation id="6312403991423642364">Ukjent nettverksfeil</translation>
<translation id="1467432559032391204">Venstre</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Aktiverer <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maksimer</translation>
@@ -123,7 +130,6 @@ Trykk på Ctrl+Alt+Z for å deaktivere.</translation>
<translation id="2727977024730340865">Tilkoblet laveffektslader. Batteriladingen kan være upålitelig.</translation>
<translation id="3784455785234192852">Lås</translation>
<translation id="2805756323405976993">Programmer</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> har endret oppløsning til <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Aktiveringen mislyktes</translation>
<translation id="5097002363526479830">Kunne ikke koble til nettverket «<ph name="NAME"/>»: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi er slått av.</translation>
@@ -131,6 +137,7 @@ Trykk på Ctrl+Alt+Z for å deaktivere.</translation>
<translation id="7052914147756339792">Angi bakgrunnsbilde</translation>
<translation id="8678698760965522072">Tilkoblet tilstand</translation>
<translation id="2532589005999780174">Høykontrastmodus</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Intern feil</translation>
<translation id="3019353588588144572">Tid som gjenstår til batteriet er fulladet – <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Skjermforstørrer</translation>
@@ -153,20 +160,24 @@ Tjenermelding: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Avslutt økten</translation>
<translation id="8454013096329229812">Wi-Fi er slått på.</translation>
<translation id="4872237917498892622">Alt + Søk eller Shift</translation>
+<translation id="9201131092683066720">Batteriet er <ph name="PERCENTAGE"/> % fullt</translation>
<translation id="2983818520079887040">Innstillinger</translation>
+<translation id="1195412055398077112">overscan</translation>
<translation id="1717216362413677834">Dokkmodus</translation>
+<translation id="112308213915226829">Skjul hylle automatisk</translation>
<translation id="8927026611342028580">Tilkobling har blitt forespurt</translation>
<translation id="8300849813060516376">OTASP mislyktes</translation>
<translation id="2792498699870441125">Alt + Søk</translation>
<translation id="8660803626959853127">Synkroniserer <ph name="COUNT"/> fil(er)</translation>
+<translation id="5958529069007801266">Overvåket bruker</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK er av</translation>
<translation id="6248847161401822652">Trykk Control+Shift+Q to ganger for å avslutte.</translation>
+<translation id="6785414152754474415">Batteriet er <ph name="PERCENTAGE"/> % fullt og til lading.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: aktiveres …</translation>
+<translation id="4895488851634969361">Batteriet er fullt.</translation>
<translation id="1391854757121130358">Du kan ha brukt opp mobildatakvoten din.</translation>
-<translation id="5413208160176941586">Lokalt administrert bruker</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Programlisteplassering</translation>
+<translation id="5947494881799873997">Tilbakestill</translation>
<translation id="7593891976182323525">Søk eller Shift</translation>
<translation id="7649070708921625228">Hjelp</translation>
<translation id="3050422059534974565">Caps Lock er på.
@@ -179,22 +190,24 @@ Trykk på Søk eller Shift for å avbryte.</translation>
<translation id="6692173217867674490">Feil passordfrase</translation>
<translation id="6165508094623778733">Les mer</translation>
<translation id="9046895021617826162">Tilkoblingen mislyktes</translation>
+<translation id="7168224885072002358">Går tilbake til den gamle oppløsningen om <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Denne økten slutter om <ph name="SESSION_TIME_REMAINING"/>. Du logges ut automatisk.</translation>
<translation id="8372369524088641025">Feil WEP-nøkkel</translation>
<translation id="6636709850131805001">Ikke gjenkjent tilstand</translation>
<translation id="3573179567135747900">Endre tilbake til <ph name="FROM_LOCALE"/> (krever omstart)</translation>
<translation id="8103386449138765447">SMS-meldinger: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Innstillinger for Google Disk</translation>
-<translation id="1510238584712386396">Appvelger</translation>
<translation id="7209101170223508707">Caps Lock er på.
Trykk på Alt + Søk eller Shift for å avbryte.</translation>
<translation id="8940956008527784070">Lavt batterinivå (<ph name="PERCENTAGE"/> %)</translation>
+<translation id="4918086044614829423">Godta</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>.<ph name="MINUTE"/> gjenstår</translation>
<translation id="520760366042891468">Deler skjermkontrollen din via Hangouts.</translation>
<translation id="8000066093800657092">Ingen nettverk</translation>
<translation id="4015692727874266537">Logg på en annen konto</translation>
<translation id="5941711191222866238">Minimer</translation>
<translation id="6911468394164995108">Koble til annet</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> t og <ph name="MINUTE"/> m til batteriet er ferdigladet</translation>
<translation id="6359806961507272919">Tekstmelding fra <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operatør</translation>
diff --git a/chromium/ash/strings/ash_strings_pl.xtb b/chromium/ash/strings/ash_strings_pl.xtb
index 2258bf53677..b0b124da7f4 100644
--- a/chromium/ash/strings/ash_strings_pl.xtb
+++ b/chromium/ash/strings/ash_strings_pl.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="pl">
<translation id="3595596368722241419">Bateria naładowana</translation>
-<translation id="5250713215130379958">Automatycznie ukrywaj program uruchamiający</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> i <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Stan portalu</translation>
<translation id="30155388420722288">Przycisk akcji</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth włączony</translation>
+<translation id="6310121235600822547">Wyświetlacz <ph name="DISPLAY_NAME"/> został obrócony na <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth wyłączony</translation>
+<translation id="7165320105431587207">Nie można skonfigurować sieci</translation>
<translation id="3775358506042162758">W wielokrotnym logowaniu możesz mieć najwyżej trzy konta.</translation>
<translation id="370649949373421643">Włącz Wi-Fi</translation>
<translation id="3626281679859535460">Jasność</translation>
+<translation id="595202126637698455">Śledzenie wydajności jest włączone</translation>
<translation id="8054466585765276473">Obliczanie czasu pracy na baterii.</translation>
<translation id="7982789257301363584">Sieć</translation>
<translation id="5565793151875479467">Serwer proxy...</translation>
<translation id="938582441709398163">Nakładka klawiatury</translation>
<translation id="4387004326333427325">Certyfikat uwierzytelniania został odrzucony zdalnie</translation>
<translation id="6979158407327259162">Dysk Google</translation>
+<translation id="3683428399328702079">Rozdzielczość wyświetlacza <ph name="DISPLAY_NAME"/> została zmieniona na <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Wykonanie metody GET protokołu HTTP nie powiodło się.</translation>
<translation id="2297568595583585744">Zasobnik stanu</translation>
<translation id="1661867754829461514">Brak kodu PIN</translation>
@@ -34,39 +38,41 @@ Naciśnij Shift + Alt, by ją przełączyć.</translation>
<translation id="2127372758936585790">Ładowarka o małej mocy</translation>
<translation id="3846575436967432996">Brak informacji o sieciach</translation>
<translation id="3026237328237090306">Skonfiguruj komórkową transmisję danych</translation>
+<translation id="5871632337994001636">Zarządzaj urządzeniami...</translation>
<translation id="785750925697875037">Wyświetl konto dla telefonów komórkowych</translation>
<translation id="153454903766751181">Inicjuję modem komórkowy...</translation>
<translation id="4628814525959230255">Udostępniasz ekran w Hangouts – <ph name="HELPER_NAME"/> kontroluje Twój komputer.</translation>
-<translation id="8343941333792395995">Ekran <ph name="DISPLAY_NAME"/> został obrócony</translation>
<translation id="7864539943188674973">Wyłącz Bluetooth</translation>
<translation id="939252827960237676">Nie można zapisać zrzutu ekranu</translation>
<translation id="3126069444801937830">Uruchom ponownie i zaktualizuj</translation>
<translation id="2268813581635650749">Wyloguj wszystkich</translation>
<translation id="735745346212279324">VPN odłączona</translation>
<translation id="7320906967354320621">Bezczynna</translation>
-<translation id="6303423059719347535">Naładowanie baterii: <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">Duży kursor myszy</translation>
-<translation id="2778346081696727092">Nie powiodło się uwierzytelnienie przy użyciu podanej nazwy użytkownika i hasła.</translation>
<translation id="3294437725009624529">Gość</translation>
<translation id="8190698733819146287">Dostosuj języki i metody wprowadzania</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Pozycja półki</translation>
<translation id="2903907270192926896">WEJŚCIE</translation>
<translation id="8676770494376880701">Podłączono ładowarkę o małej mocy</translation>
<translation id="7170041865419449892">Poza zasięgiem</translation>
<translation id="4804818685124855865">Rozłącz</translation>
<translation id="2544853746127077729">Certyfikat uwierzytelniania został odrzucony przez sieć</translation>
<translation id="5222676887888702881">Wyloguj się</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfiguracja</translation>
<translation id="1272079795634619415">Zatrzymaj</translation>
<translation id="4957722034734105353">Więcej informacji...</translation>
<translation id="2964193600955408481">Wyłącz Wi-Fi</translation>
-<translation id="811680302244032017">Dodaj urządzenie...</translation>
<translation id="4279490309300973883">Odbicie lustrzane</translation>
+<translation id="7973962044839454485">Uwierzytelnianie PPP nie powiodło się z powodu nieprawidłowej nazwy użytkownika lub hasła</translation>
<translation id="2509468283778169019">CAPS LOCK jest włączony.</translation>
<translation id="3892641579809465218">Wyświetlacz wewnętrzny</translation>
<translation id="7823564328645135659">Po zsynchronizowaniu ustawień zmieniono język z „<ph name="FROM_LOCALE"/>” na „<ph name="TO_LOCALE"/>”.</translation>
<translation id="3368922792935385530">Połączone</translation>
<translation id="8340999562596018839">Potwierdzenia głosowe</translation>
<translation id="8654520615680304441">Włącz Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Metoda wprowadzania została zmieniona na <ph name="INPUT_METHOD_ID"/>.
Naciśnij Shift + Alt, by ją przełączyć.</translation>
<translation id="2562916301614567480">Sieć prywatna</translation>
@@ -83,11 +89,12 @@ Naciśnij Shift + Alt, by ją przełączyć.</translation>
<translation id="3626637461649818317">Pozostało <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">Wprowadzanie tekstu</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Półka</translation>
<translation id="2614835198358683673">Włączony Chromebook może nie być ładowany. Zalecamy użycie oryginalnej ładowarki.</translation>
<translation id="1895658205118569222">Wyłączenie</translation>
<translation id="4430019312045809116">Głośność</translation>
+<translation id="8681498213689260554">Uruchom ponownie i użyj funkcji Powerwash, by zaktualizować</translation>
<translation id="4442424173763614572">Wyszukiwanie DNS nie powiodło się.</translation>
-<translation id="6356500677799115505">Bateria jest pełna i trwa ładowanie.</translation>
<translation id="7874779702599364982">Szukam sieci komórkowych...</translation>
<translation id="583281660410589416">Nieznany</translation>
<translation id="1383876407941801731">Wyszukiwanie</translation>
@@ -96,7 +103,6 @@ Naciśnij Shift + Alt, by ją przełączyć.</translation>
<translation id="2204305834655267233">Informacje o sieci</translation>
<translation id="1621499497873603021">Czas pozostały do wyczerpania baterii: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Zakończ sesję gościa</translation>
-<translation id="4471417012762451363">Naładowanie baterii: <ph name="PERCENTAGE"/>%. Trwa ładowanie</translation>
<translation id="8308637677604853869">Poprzednie menu</translation>
<translation id="4666297444214622512">Nie można zalogować się na kolejne konto.</translation>
<translation id="1346748346194534595">W prawo</translation>
@@ -114,6 +120,7 @@ Aby wyłączyć, naciśnij Ctrl+Alt+Z.</translation>
<translation id="6312403991423642364">Nieznany błąd sieci</translation>
<translation id="1467432559032391204">W lewo</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Aktywuję <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maksymalizuj</translation>
@@ -123,7 +130,6 @@ Aby wyłączyć, naciśnij Ctrl+Alt+Z.</translation>
<translation id="2727977024730340865">Podłączono ładowarkę o małej mocy. Ładowanie baterii może być nieprawidłowe.</translation>
<translation id="3784455785234192852">Zablokuj</translation>
<translation id="2805756323405976993">Aplikacje</translation>
-<translation id="8871072142849158571">Rozdzielczość ekranu <ph name="DISPLAY_NAME"/> została zmieniona na <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Niepowodzenie aktywacji</translation>
<translation id="5097002363526479830">Nie udało się połączyć z siecią „<ph name="NAME"/>”: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi wyłączone.</translation>
@@ -131,6 +137,7 @@ Aby wyłączyć, naciśnij Ctrl+Alt+Z.</translation>
<translation id="7052914147756339792">Ustaw tapetę...</translation>
<translation id="8678698760965522072">Online</translation>
<translation id="2532589005999780174">Tryb wysokiego kontrastu</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Błąd wewnętrzny</translation>
<translation id="3019353588588144572">Czas pozostały do pełnego naładowania baterii: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Lupa</translation>
@@ -153,20 +160,24 @@ Komunikat serwera: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Zakończ sesję</translation>
<translation id="8454013096329229812">Wi-Fi włączone.</translation>
<translation id="4872237917498892622">Alt+Szukaj lub Shift</translation>
+<translation id="9201131092683066720">Naładowanie baterii: <ph name="PERCENTAGE"/>%.</translation>
<translation id="2983818520079887040">Ustawienia</translation>
+<translation id="1195412055398077112">nadmiarowość obrazu</translation>
<translation id="1717216362413677834">Tryb doku</translation>
+<translation id="112308213915226829">Autoukrywanie półki</translation>
<translation id="8927026611342028580">Poproszono o połączenie</translation>
<translation id="8300849813060516376">Dostarczanie OTASP nie powiodło się</translation>
<translation id="2792498699870441125">Alt+Szukaj</translation>
<translation id="8660803626959853127">Synchronizacja: <ph name="COUNT"/> pliki(ów)</translation>
+<translation id="5958529069007801266">Użytkownik nadzorowany</translation>
<translation id="3709443003275901162">Ponad 9</translation>
<translation id="639644700271529076">CAPS LOCK jest wyłączony</translation>
<translation id="6248847161401822652">Naciśnij dwukrotnie Control Shift Q, by zakończyć.</translation>
+<translation id="6785414152754474415">Naładowanie baterii: <ph name="PERCENTAGE"/>%. Trwa ładowanie.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: aktywuję...</translation>
+<translation id="4895488851634969361">Bateria jest pełna.</translation>
<translation id="1391854757121130358">Być może został wyczerpany limit komórkowej transmisji danych.</translation>
-<translation id="5413208160176941586">Użytkownik zarządzany lokalnie</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Pozycja programu uruchamiającego</translation>
+<translation id="5947494881799873997">Przywróć</translation>
<translation id="7593891976182323525">Szukaj lub Shift</translation>
<translation id="7649070708921625228">Pomoc</translation>
<translation id="3050422059534974565">CAPS LOCK jest włączony.
@@ -179,22 +190,24 @@ Naciśnij Szukaj lub Shift, by anulować.</translation>
<translation id="6692173217867674490">Błędne hasło</translation>
<translation id="6165508094623778733">Więcej informacji</translation>
<translation id="9046895021617826162">Łączenie nie powiodło się</translation>
+<translation id="7168224885072002358">Powrót do wcześniejszej rozdzielczości za <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Ta sesja zakończy się za <ph name="SESSION_TIME_REMAINING"/>. Nastąpi automatyczne wylogowanie.</translation>
<translation id="8372369524088641025">Błędny klucz WEP</translation>
<translation id="6636709850131805001">Nierozpoznany stan</translation>
<translation id="3573179567135747900">Zmień z powrotem na „<ph name="FROM_LOCALE"/>” (wymaga ponownego uruchomienia)</translation>
<translation id="8103386449138765447">SMS-y: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Ustawienia Dysku Google...</translation>
-<translation id="1510238584712386396">Program uruchamiający</translation>
<translation id="7209101170223508707">CAPS LOCK jest włączony.
Naciśnij Alt+Szukaj lub Shift, by anulować.</translation>
<translation id="8940956008527784070">Niski stan baterii (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Akceptuj</translation>
<translation id="5102001756192215136">Pozostało <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Udostępniasz ekran i kontrolę nad komputerem w Hangouts.</translation>
<translation id="8000066093800657092">Brak sieci</translation>
<translation id="4015692727874266537">Zaloguj się na kolejne konto...</translation>
<translation id="5941711191222866238">Minimalizuj</translation>
<translation id="6911468394164995108">Połącz z inną...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> godz. <ph name="MINUTE"/> min do pełnego naładowania</translation>
<translation id="6359806961507272919">Wiadomość SMS z numeru <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operator</translation>
diff --git a/chromium/ash/strings/ash_strings_pt-BR.xtb b/chromium/ash/strings/ash_strings_pt-BR.xtb
index b351f45c0cd..d2f1d0e53a0 100644
--- a/chromium/ash/strings/ash_strings_pt-BR.xtb
+++ b/chromium/ash/strings/ash_strings_pt-BR.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="pt-BR">
<translation id="3595596368722241419">Bateria carregada</translation>
-<translation id="5250713215130379958">Ocultar automaticamente o iniciador</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> e <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Estado do portal</translation>
<translation id="30155388420722288">Botão de estouro</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth ativado</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> foi substituída por <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth desativado</translation>
+<translation id="7165320105431587207">Falha ao configurar rede</translation>
<translation id="3775358506042162758">É possível ter até três contas em login múltiplo.</translation>
<translation id="370649949373421643">Ativar Wi-Fi</translation>
<translation id="3626281679859535460">Brilho</translation>
+<translation id="595202126637698455">Rastreamento de desempenho ativado</translation>
<translation id="8054466585765276473">Calculando duração da bateria.</translation>
<translation id="7982789257301363584">Rede</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Sobreposição do teclado</translation>
<translation id="4387004326333427325">Certificado de autenticação rejeitado remotamente</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">A resolução de <ph name="DISPLAY_NAME"/> foi alterada para <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP falhou</translation>
<translation id="2297568595583585744">Bandeja de status</translation>
<translation id="1661867754829461514">PIN ausente</translation>
@@ -34,39 +38,41 @@ Pressione Shift + Alt para alternar.</translation>
<translation id="2127372758936585790">Carregador de baixa potência</translation>
<translation id="3846575436967432996">Não há informações de rede disponíveis</translation>
<translation id="3026237328237090306">Configurar dados móveis</translation>
+<translation id="5871632337994001636">Gerenciar dispositivos...</translation>
<translation id="785750925697875037">Exibir conta de celular</translation>
<translation id="153454903766751181">Inicializando modem celular...</translation>
<translation id="4628814525959230255">Compartilhando o controle de sua tela com <ph name="HELPER_NAME"/> por meio do Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> foi girada</translation>
<translation id="7864539943188674973">Desativar bluetooth</translation>
<translation id="939252827960237676">Falha ao salvar a captura de tela</translation>
<translation id="3126069444801937830">Reiniciar para atualizar</translation>
<translation id="2268813581635650749">Desconectar todos</translation>
<translation id="735745346212279324">VPN desconectada</translation>
<translation id="7320906967354320621">Inativo</translation>
-<translation id="6303423059719347535">A bateria está <ph name="PERCENTAGE"/>% cheia</translation>
<translation id="15373452373711364">Cursor grande do mouse</translation>
-<translation id="2778346081696727092">Falha na autenticação com nome de usuário ou senha fornecidos</translation>
<translation id="3294437725009624529">Visitante</translation>
<translation id="8190698733819146287">Personalizar idiomas e entrada...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Posição da estante</translation>
<translation id="2903907270192926896">ENTRADA</translation>
<translation id="8676770494376880701">Carregador de baixa potência conectado</translation>
<translation id="7170041865419449892">Fora de alcance</translation>
<translation id="4804818685124855865">Desconectar</translation>
<translation id="2544853746127077729">Certificado de autenticação rejeitado pela rede</translation>
<translation id="5222676887888702881">Sair</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Configuração</translation>
<translation id="1272079795634619415">Parar</translation>
<translation id="4957722034734105353">Saiba mais...</translation>
<translation id="2964193600955408481">Desativar Wi-Fi</translation>
-<translation id="811680302244032017">Adicionar dispositivo...</translation>
<translation id="4279490309300973883">Espelhamento</translation>
+<translation id="7973962044839454485">Falha da autenticação PPC devido a senha ou nome de usuário incorreto</translation>
<translation id="2509468283778169019">CAPS LOCK está ativado</translation>
<translation id="3892641579809465218">Display interno</translation>
<translation id="7823564328645135659">O idioma foi alterado de &quot;<ph name="FROM_LOCALE"/>&quot; para &quot;<ph name="TO_LOCALE"/>&quot; após a sincronização de suas configurações.</translation>
<translation id="3368922792935385530">Conectado</translation>
<translation id="8340999562596018839">Feedback falado</translation>
<translation id="8654520615680304441">Ativar Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Seu método de entrada mudou para <ph name="INPUT_METHOD_ID"/>.
Pressione Shift + Alt para alternar.</translation>
<translation id="2562916301614567480">Rede privada</translation>
@@ -83,11 +89,12 @@ Pressione Shift + Alt para alternar.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% restante</translation>
<translation id="9089416786594320554">Métodos de entrada</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Estante</translation>
<translation id="2614835198358683673">Seu Chromebook pode não carregar enquanto estiver ligado. Considere usar o carregador oficial.</translation>
<translation id="1895658205118569222">Encerramento</translation>
<translation id="4430019312045809116">Volume</translation>
+<translation id="8681498213689260554">Reiniciar e executar Powerwash para atualizar</translation>
<translation id="4442424173763614572">A busca de DNS falhou</translation>
-<translation id="6356500677799115505">A bateria está cheia e carregando.</translation>
<translation id="7874779702599364982">Procurando redes de celular...</translation>
<translation id="583281660410589416">Desconhecido</translation>
<translation id="1383876407941801731">Pesquisa</translation>
@@ -96,7 +103,6 @@ Pressione Shift + Alt para alternar.</translation>
<translation id="2204305834655267233">Informações de rede</translation>
<translation id="1621499497873603021">O tempo restante até que a bateria se esgote é de <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Sair da sessão de visitante</translation>
-<translation id="4471417012762451363">A bateria está <ph name="PERCENTAGE"/>% cheia e carregando</translation>
<translation id="8308637677604853869">Menu anterior</translation>
<translation id="4666297444214622512">Não é possível fazer login em outra conta.</translation>
<translation id="1346748346194534595">Para a direita</translation>
@@ -114,6 +120,7 @@ Pressione Ctrl+Alt+Z para desativá-lo.</translation>
<translation id="6312403991423642364">Erro de rede desconhecido</translation>
<translation id="1467432559032391204">Para a esquerda</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Ativando <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maximizar</translation>
@@ -123,7 +130,6 @@ Pressione Ctrl+Alt+Z para desativá-lo.</translation>
<translation id="2727977024730340865">Conectado a um carregador de baixa potência. O carregamento da bateria pode não ser confiável.</translation>
<translation id="3784455785234192852">Bloquear</translation>
<translation id="2805756323405976993">Aplicativos</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> foi redimensionada para <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Falha na ativação</translation>
<translation id="5097002363526479830">Falha na conexão à rede &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">O Wi-Fi está desligado.</translation>
@@ -131,6 +137,7 @@ Pressione Ctrl+Alt+Z para desativá-lo.</translation>
<translation id="7052914147756339792">Definir plano de fundo...</translation>
<translation id="8678698760965522072">Estado on-line</translation>
<translation id="2532589005999780174">Modo de alto contraste</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Erro interno</translation>
<translation id="3019353588588144572">O tempo restante até que a bateria esteja totalmente carregada é de <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Lupa</translation>
@@ -153,20 +160,24 @@ Mensagem do servidor: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Sair da sessão</translation>
<translation id="8454013096329229812">O Wi-Fi está ligado.</translation>
<translation id="4872237917498892622">Alt + Pesquisar ou Shift</translation>
+<translation id="9201131092683066720">A bateria está <ph name="PERCENTAGE"/>% carregada.</translation>
<translation id="2983818520079887040">Configurações...</translation>
+<translation id="1195412055398077112">overscan</translation>
<translation id="1717216362413677834">Modo dock</translation>
+<translation id="112308213915226829">Ocultar estante automaticamente</translation>
<translation id="8927026611342028580">Conexão solicitada</translation>
<translation id="8300849813060516376">Falha no OTASP</translation>
<translation id="2792498699870441125">Alt + Pesquisar</translation>
<translation id="8660803626959853127">Sincronizando <ph name="COUNT"/> arquivos</translation>
+<translation id="5958529069007801266">Usuário supervisionado</translation>
<translation id="3709443003275901162">Mais de 9</translation>
<translation id="639644700271529076">CAPS LOCK está desativado</translation>
<translation id="6248847161401822652">Pressione Control+Shift+Q duas vezes para sair.</translation>
+<translation id="6785414152754474415">A bateria está <ph name="PERCENTAGE"/>% cheia e carregando.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Ativando...</translation>
+<translation id="4895488851634969361">A bateria está carregada.</translation>
<translation id="1391854757121130358">Você pode ter esgotado sua permissão de dados móveis.</translation>
-<translation id="5413208160176941586">Usuário gerenciado localmente</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Posição do iniciador</translation>
+<translation id="5947494881799873997">Reverter</translation>
<translation id="7593891976182323525">Pesquisar ou Shift</translation>
<translation id="7649070708921625228">Ajuda</translation>
<translation id="3050422059534974565">A tecla CAPS LOCK está ativada. Pressione Pesquisar ou Shift para cancelar.</translation>
@@ -178,21 +189,23 @@ Mensagem do servidor: <ph name="SERVER_MSG"/></translation>
<translation id="6692173217867674490">Senha incorreta</translation>
<translation id="6165508094623778733">Saiba mais</translation>
<translation id="9046895021617826162">Falha na conexão</translation>
+<translation id="7168224885072002358">Revertendo para resolução anterior em <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Esta sessão terminará em <ph name="SESSION_TIME_REMAINING"/>. Você será automaticamente desconectado.</translation>
<translation id="8372369524088641025">Chave WEP incorreta</translation>
<translation id="6636709850131805001">Estado não reconhecido</translation>
<translation id="3573179567135747900">Voltar a &quot;<ph name="FROM_LOCALE"/>&quot; (exige reinicialização)</translation>
<translation id="8103386449138765447">Mensagens SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Configurações do Google Drive...</translation>
-<translation id="1510238584712386396">Iniciador</translation>
<translation id="7209101170223508707">A tecla CAPS LOCK está ativada. Pressione Alt + Pesquisar ou Shift para cancelar.</translation>
<translation id="8940956008527784070">Nível de bateria baixo (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Aceitar</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> restantes</translation>
<translation id="520760366042891468">Compartilhando o controle de sua tela por meio do Hangouts.</translation>
<translation id="8000066093800657092">Sem rede</translation>
<translation id="4015692727874266537">Fazer login em outra conta...</translation>
<translation id="5941711191222866238">Minimizar</translation>
<translation id="6911468394164995108">Conectar-se a outra...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>h<ph name="MINUTE"/>m até a carga total</translation>
<translation id="6359806961507272919">SMS de <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operadora</translation>
diff --git a/chromium/ash/strings/ash_strings_pt-PT.xtb b/chromium/ash/strings/ash_strings_pt-PT.xtb
index cf5df2d6704..5cb04a1b4e2 100644
--- a/chromium/ash/strings/ash_strings_pt-PT.xtb
+++ b/chromium/ash/strings/ash_strings_pt-PT.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="pt-PT">
<translation id="3595596368722241419">Bateria carregada</translation>
-<translation id="5250713215130379958">Ocultar automaticamente iniciador</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> e <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Estado do portal</translation>
<translation id="30155388420722288">Botão de Sobrecarga</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth ativado</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> foi rodado para <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth desativado</translation>
+<translation id="7165320105431587207">Não foi possível configurar a rede</translation>
<translation id="3775358506042162758">Só pode ter três contas no máximo no início de sessão integrado.</translation>
<translation id="370649949373421643">Ativar Wi-Fi</translation>
<translation id="3626281679859535460">Brilho</translation>
+<translation id="595202126637698455">Rastreio do desempenho ativado</translation>
<translation id="8054466585765276473">A calcular tempo da bateria.</translation>
<translation id="7982789257301363584">Rede</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Sobreposição do teclado</translation>
<translation id="4387004326333427325">Certificado de autenticação rejeitado remotamente</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">A resolução de <ph name="DISPLAY_NAME"/> foi alterada para <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">A obtenção de HTTP falhou</translation>
<translation id="2297568595583585744">Tabuleiro de estado</translation>
<translation id="1661867754829461514">Falta o PIN</translation>
@@ -34,39 +38,41 @@ Prima Shift + Alt para mudar.</translation>
<translation id="2127372758936585790">Carregador de baixo consumo</translation>
<translation id="3846575436967432996">Não existem informações de rede disponíveis</translation>
<translation id="3026237328237090306">Configurar dados móveis</translation>
+<translation id="5871632337994001636">Gerir dispositivos...</translation>
<translation id="785750925697875037">Ver conta do telemóvel</translation>
<translation id="153454903766751181">A inicializar o modem celular...</translation>
<translation id="4628814525959230255">Partilhar o controlo do seu ecrã com <ph name="HELPER_NAME"/> através do Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> foi rodado</translation>
<translation id="7864539943188674973">Desativar Bluetooth</translation>
<translation id="939252827960237676">Não foi possível guardar a captura de ecrã</translation>
<translation id="3126069444801937830">Reiniciar para atualizar</translation>
<translation id="2268813581635650749">Terminar sessão de todos</translation>
<translation id="735745346212279324">VPN desligado</translation>
<translation id="7320906967354320621">Inactiva</translation>
-<translation id="6303423059719347535">A bateria está <ph name="PERCENTAGE"/>% cheia</translation>
<translation id="15373452373711364">Cursor do rato grande</translation>
-<translation id="2778346081696727092">Falha ao autenticar com o nome de utilizador ou palavra-passe fornecidos</translation>
<translation id="3294437725009624529">Convidado</translation>
<translation id="8190698733819146287">Personalizar idiomas e introdução...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Posição da prateleira</translation>
<translation id="2903907270192926896">ENTRADA</translation>
<translation id="8676770494376880701">Carregador de baixo consumo ligado</translation>
<translation id="7170041865419449892">Fora de alcance</translation>
<translation id="4804818685124855865">Desligar</translation>
<translation id="2544853746127077729">Certificado de autenticação rejeitado pela rede</translation>
<translation id="5222676887888702881">Terminar sessão</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Configuração</translation>
<translation id="1272079795634619415">Parar</translation>
<translation id="4957722034734105353">Saiba mais...</translation>
<translation id="2964193600955408481">Desativar Wi-Fi</translation>
-<translation id="811680302244032017">Adicionar aparelho...</translation>
<translation id="4279490309300973883">Espelhamento</translation>
+<translation id="7973962044839454485">Falha na autenticação PPP devido a um nome de utilizador ou palavra-passe incorretos</translation>
<translation id="2509468283778169019">CAPS LOCK está ativado</translation>
<translation id="3892641579809465218">Apresentação Interna</translation>
<translation id="7823564328645135659">O idioma foi alterado de <ph name="FROM_LOCALE"/> para <ph name="TO_LOCALE"/> depois de sincronizar as suas definições.</translation>
<translation id="3368922792935385530">Ligado</translation>
<translation id="8340999562596018839">Respostas faladas</translation>
<translation id="8654520615680304441">Ligar Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">O seu método de introdução foi alterado para <ph name="INPUT_METHOD_ID"/>.
Prima Shift + Alt para mudar.</translation>
<translation id="2562916301614567480">Rede Privada</translation>
@@ -83,11 +89,12 @@ Prima Shift + Alt para mudar.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/> % restante</translation>
<translation id="9089416786594320554">Métodos de introdução</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Prateleira</translation>
<translation id="2614835198358683673">É possível que não consiga carregar o seu Chromebook enquanto este se encontrar ligado. Considere utilizar o carregador oficial.</translation>
<translation id="1895658205118569222">Encerrar</translation>
<translation id="4430019312045809116">Volume</translation>
+<translation id="8681498213689260554">Reiniciar e Powerwash para atualizar</translation>
<translation id="4442424173763614572">A procura de DNS falhou</translation>
-<translation id="6356500677799115505">A bateria está cheia e a carregar.</translation>
<translation id="7874779702599364982">A procurar redes celulares...</translation>
<translation id="583281660410589416">Desconhecido</translation>
<translation id="1383876407941801731">Pesquisa</translation>
@@ -96,7 +103,6 @@ Prima Shift + Alt para mudar.</translation>
<translation id="2204305834655267233">Informações da Rede</translation>
<translation id="1621499497873603021">Tempo restante até a bateria terminar, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Sair da sessão de convidado</translation>
-<translation id="4471417012762451363">A bateria está <ph name="PERCENTAGE"/>% cheia e a carregar</translation>
<translation id="8308637677604853869">Menu anterior</translation>
<translation id="4666297444214622512">Não é possível iniciar sessão noutra conta.</translation>
<translation id="1346748346194534595">Direita</translation>
@@ -114,6 +120,7 @@ Prima Ctrl+Alt+Z para desativar.</translation>
<translation id="6312403991423642364">Erro de rede desconhecido</translation>
<translation id="1467432559032391204">Esquerda</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">A ativar <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maximizar</translation>
@@ -123,7 +130,6 @@ Prima Ctrl+Alt+Z para desativar.</translation>
<translation id="2727977024730340865">Ligado a um carregador de baixo consumo. O carregamento da bateria pode não ser fiável.</translation>
<translation id="3784455785234192852">Bloquear</translation>
<translation id="2805756323405976993">Aplicações</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> foi redimensionado para <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Falha na activação</translation>
<translation id="5097002363526479830">Falha ao ligar à rede &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">A ligação Wi-Fi está desativada.</translation>
@@ -131,6 +137,7 @@ Prima Ctrl+Alt+Z para desativar.</translation>
<translation id="7052914147756339792">Definir imagem de fundo...</translation>
<translation id="8678698760965522072">Estado on-line</translation>
<translation id="2532589005999780174">Modo de alto contraste</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Erro interno</translation>
<translation id="3019353588588144572">Tempo restante até a bateria estar totalmente carregada: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Lupa</translation>
@@ -153,20 +160,24 @@ Mensagem do servidor: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Sair da sessão</translation>
<translation id="8454013096329229812">A ligação Wi-Fi está ativada.</translation>
<translation id="4872237917498892622">Alt + Pesquisar ou Shift</translation>
+<translation id="9201131092683066720">A bateria está <ph name="PERCENTAGE"/>% cheia.</translation>
<translation id="2983818520079887040">Definições...</translation>
+<translation id="1195412055398077112">overscan</translation>
<translation id="1717216362413677834">Modo da estação de ancoragem</translation>
+<translation id="112308213915226829">Ocultar automaticamente a prateleira</translation>
<translation id="8927026611342028580">Ligação Solicitada</translation>
<translation id="8300849813060516376">O OTASP falhou</translation>
<translation id="2792498699870441125">Alt + Pesquisar</translation>
<translation id="8660803626959853127">A sincronizar <ph name="COUNT"/> ficheiro(s)</translation>
+<translation id="5958529069007801266">Utilizador supervisionado</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK está desativado</translation>
<translation id="6248847161401822652">Prima Ctrl+Shift+Q duas vezes para sair.</translation>
+<translation id="6785414152754474415">A bateria está <ph name="PERCENTAGE"/>% cheia e a carregar.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: a ativar...</translation>
+<translation id="4895488851634969361">A bateria está carregada.</translation>
<translation id="1391854757121130358">Poderá ter utilizado toda a sua bonificação de dados móveis.</translation>
-<translation id="5413208160176941586">Utilizador gerido localmente</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Posição do iniciador</translation>
+<translation id="5947494881799873997">Reverter</translation>
<translation id="7593891976182323525">Pesquisar ou Shift</translation>
<translation id="7649070708921625228">Ajuda</translation>
<translation id="3050422059534974565">CAPS LOCK ativado.
@@ -179,22 +190,24 @@ Prima Pesquisar ou Shift para cancelar.</translation>
<translation id="6692173217867674490">Frase de acesso incorrecta</translation>
<translation id="6165508094623778733">Saiba mais</translation>
<translation id="9046895021617826162">A ligação falhou</translation>
+<translation id="7168224885072002358">A reverter para a resolução antiga dentro de <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Esta sessão irá terminar em <ph name="SESSION_TIME_REMAINING"/>. A sua sessão será automaticamente terminada.</translation>
<translation id="8372369524088641025">Chave WEP incorrecta</translation>
<translation id="6636709850131805001">Estado não reconhecido</translation>
<translation id="3573179567135747900">Reverter alteração para <ph name="FROM_LOCALE"/> (requer reinicio)</translation>
<translation id="8103386449138765447">Mensagens SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Definições do Google Drive...</translation>
-<translation id="1510238584712386396">Iniciador</translation>
<translation id="7209101170223508707">CAPS LOCK ativado.
Prima Alt + Pesquisar ou Shift para cancelar.</translation>
<translation id="8940956008527784070">Bateria fraca (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Aceitar</translation>
<translation id="5102001756192215136">Restam <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Partilhar o controlo do seu ecrã através dos Hangouts.</translation>
<translation id="8000066093800657092">Sem rede</translation>
<translation id="4015692727874266537">Iniciar sessão numa conta adicional...</translation>
<translation id="5941711191222866238">Minimizar</translation>
<translation id="6911468394164995108">Aderir a outra...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>h <ph name="MINUTE"/>m até ficar completa</translation>
<translation id="6359806961507272919">SMS de <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operador</translation>
diff --git a/chromium/ash/strings/ash_strings_ro.xtb b/chromium/ash/strings/ash_strings_ro.xtb
index 2412434089a..ace43009830 100644
--- a/chromium/ash/strings/ash_strings_ro.xtb
+++ b/chromium/ash/strings/ash_strings_ro.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ro">
<translation id="3595596368722241419">Baterie încărcată</translation>
-<translation id="5250713215130379958">Ascundeți automat lansatorul</translation>
<translation id="7814236020522506259"><ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Stare portal</translation>
<translation id="30155388420722288">Butonul Overflow</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth activat</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> a fost rotit la <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth dezactivat</translation>
+<translation id="7165320105431587207">Rețeaua nu a putut fi configurată</translation>
<translation id="3775358506042162758">Conectarea multiplă acceptă maximum trei conturi.</translation>
<translation id="370649949373421643">Activați Wi-Fi</translation>
<translation id="3626281679859535460">Luminozitate</translation>
+<translation id="595202126637698455">Urmărirea performanței este activată</translation>
<translation id="8054466585765276473">Se calculează durata bateriei.</translation>
<translation id="7982789257301363584">Rețea</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Suprapunere a tastaturii</translation>
<translation id="4387004326333427325">Certificatul de autentificare a fost respins de la distanță</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">Rezoluția <ph name="DISPLAY_NAME"/> a fost modificată la <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Metoda GET a protocolului HTTP a eșuat</translation>
<translation id="2297568595583585744">Bara de stare</translation>
<translation id="1661867754829461514">Codul PIN lipsește</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">Încărcător de putere joasă</translation>
<translation id="3846575436967432996">Nu sunt disponibile informații despre rețele</translation>
<translation id="3026237328237090306">Configurați datele mobile</translation>
+<translation id="5871632337994001636">Gestionați dispozitivele...</translation>
<translation id="785750925697875037">Afișați contul mobil</translation>
<translation id="153454903766751181">Se inițializează modemul mobil...</translation>
<translation id="4628814525959230255">În prezent, <ph name="HELPER_NAME"/> vă poate controla ecranul prin intermediul Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> a fost rotit</translation>
<translation id="7864539943188674973">Dezactivați Bluetooth</translation>
<translation id="939252827960237676">Captura de ecran nu a putut fi salvată.</translation>
<translation id="3126069444801937830">Reporniți pentru a actualiza</translation>
<translation id="2268813581635650749">Deconectați toți utilizatorii</translation>
<translation id="735745346212279324">Rețea VPN deconectată</translation>
<translation id="7320906967354320621">Inactivă</translation>
-<translation id="6303423059719347535">Nivelul bateriei este de <ph name="PERCENTAGE"/> %</translation>
<translation id="15373452373711364">Cursor de mouse mare</translation>
-<translation id="2778346081696727092">Autentificarea cu numele de utilizator sau parola furnizate a eșuat</translation>
<translation id="3294437725009624529">Invitat</translation>
<translation id="8190698733819146287">Personalizați limbile și modul de introducere...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Poziție raft</translation>
<translation id="2903907270192926896">INTRARE</translation>
<translation id="8676770494376880701">A fost conectat un încărcător de putere joasă</translation>
<translation id="7170041865419449892">Fără acoperire</translation>
<translation id="4804818685124855865">Deconectați-vă</translation>
<translation id="2544853746127077729">Certificatul de autentificare a fost respins de rețea</translation>
<translation id="5222676887888702881">Deconectați-vă</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Configurare</translation>
<translation id="1272079795634619415">Opriți</translation>
<translation id="4957722034734105353">Aflați mai multe...</translation>
<translation id="2964193600955408481">Dezactivați Wi-Fi</translation>
-<translation id="811680302244032017">Adăugați un dispozitiv...</translation>
<translation id="4279490309300973883">Oglindire</translation>
+<translation id="7973962044839454485">Autentificarea PPP nu a reușit, din cauza unui nume de utilizator sau a unei parole greșite</translation>
<translation id="2509468283778169019">Tasta CAPS LOCK este activată</translation>
<translation id="3892641579809465218">Afișaj intern</translation>
<translation id="7823564328645135659">După sincronizarea setărilor, limba a fost modificată de la „<ph name="FROM_LOCALE"/>” la „<ph name="TO_LOCALE"/>”.</translation>
<translation id="3368922792935385530">Conectat</translation>
<translation id="8340999562596018839">Feedback vocal</translation>
<translation id="8654520615680304441">Activați Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Metoda de introducere s-a schimbat la <ph name="INPUT_METHOD_ID"/>.
Apăsați pe Shift + Alt pentru a comuta.</translation>
<translation id="2562916301614567480">Rețea privată</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317">Nivel disponibil: <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">Metode de introducere</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/> %</translation>
+<translation id="2825619548187458965">Raft</translation>
<translation id="2614835198358683673">Este posibil ca laptopul Chromebook să nu se încarce în timp ce este pornit. Se recomandă să utilizați încărcătorul original.</translation>
<translation id="1895658205118569222">Închideți</translation>
<translation id="4430019312045809116">Volum</translation>
+<translation id="8681498213689260554">Pentru a actualiza, reporniți și efectuați Powerwash</translation>
<translation id="4442424173763614572">Căutarea DNS a eșuat</translation>
-<translation id="6356500677799115505">Bateria este plină și se încarcă.</translation>
<translation id="7874779702599364982">Se caută rețele mobile...</translation>
<translation id="583281660410589416">Necunoscut</translation>
<translation id="1383876407941801731">Căutare</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">Informații despre rețea</translation>
<translation id="1621499497873603021">Timp rămas până la descărcarea bateriei: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Ieșiți din sesiunea pentru invitați</translation>
-<translation id="4471417012762451363">Nivelul bateriei este de <ph name="PERCENTAGE"/> % și se încarcă</translation>
<translation id="8308637677604853869">Meniul anterior</translation>
<translation id="4666297444214622512">Nu vă mai puteți conecta la alt cont.</translation>
<translation id="1346748346194534595">Dreapta</translation>
@@ -114,6 +120,7 @@ Apăsați Ctrl+Alt+Z pentru a-l dezactiva.</translation>
<translation id="6312403991423642364">Eroare de rețea necunoscută</translation>
<translation id="1467432559032391204">Stânga</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Se activează <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maximizați</translation>
@@ -123,7 +130,6 @@ Apăsați Ctrl+Alt+Z pentru a-l dezactiva.</translation>
<translation id="2727977024730340865">V-ați conectat la un încărcător de putere joasă. Încărcarea bateriei poate fi nesigură.</translation>
<translation id="3784455785234192852">Blocați</translation>
<translation id="2805756323405976993">Google Apps</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> a fost redimensionat la <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Activare nereușită</translation>
<translation id="5097002363526479830">A eșuat conectarea la rețeaua „<ph name="NAME"/>”: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Conexiunea Wi-Fi este dezactivată.</translation>
@@ -131,6 +137,7 @@ Apăsați Ctrl+Alt+Z pentru a-l dezactiva.</translation>
<translation id="7052914147756339792">Setați o imagine de fundal...</translation>
<translation id="8678698760965522072">Stare online</translation>
<translation id="2532589005999780174">Mod de contrast ridicat</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Eroare internă</translation>
<translation id="3019353588588144572">Timp rămas până la încărcarea completă a bateriei: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Lupă de ecran</translation>
@@ -153,20 +160,24 @@ Mesaj server: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Ieșiți din sesiune</translation>
<translation id="8454013096329229812">Conexiunea Wi-Fi este activată.</translation>
<translation id="4872237917498892622">Alt+Căutare sau Shift</translation>
+<translation id="9201131092683066720">Nivelul bateriei este de <ph name="PERCENTAGE"/>%.</translation>
<translation id="2983818520079887040">Setări...</translation>
+<translation id="1195412055398077112">suprascanare</translation>
<translation id="1717216362413677834">Mod de andocare</translation>
+<translation id="112308213915226829">Ascundeți automat raftul</translation>
<translation id="8927026611342028580">Conectare solicitată</translation>
<translation id="8300849813060516376">OTASP a eșuat</translation>
<translation id="2792498699870441125">Alt+Căutare</translation>
<translation id="8660803626959853127">Se sincronizează <ph name="COUNT"/> (de) fișiere</translation>
+<translation id="5958529069007801266">Utilizator monitorizat</translation>
<translation id="3709443003275901162">Peste 9</translation>
<translation id="639644700271529076">Tasta CAPS LOCK este dezactivată</translation>
<translation id="6248847161401822652">Apăsați de două ori Control Shift Q pentru a ieși.</translation>
+<translation id="6785414152754474415">Nivelul bateriei este de <ph name="PERCENTAGE"/>% și se încarcă.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: se activează...</translation>
+<translation id="4895488851634969361">Bateria este încărcată complet.</translation>
<translation id="1391854757121130358">Este posibil să fi consumat complet alocarea datelor mobile.</translation>
-<translation id="5413208160176941586">Utilizator gestionat local</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Poziția lansatorului</translation>
+<translation id="5947494881799873997">Reveniți</translation>
<translation id="7593891976182323525">Căutare sau Shift</translation>
<translation id="7649070708921625228">Ajutor</translation>
<translation id="3050422059534974565">Tasta CAPS LOCK este activată.
@@ -179,22 +190,24 @@ Apăsați Căutare sau Shift pentru a anula.</translation>
<translation id="6692173217867674490">Expresie de acces greșită</translation>
<translation id="6165508094623778733">Aflați mai multe</translation>
<translation id="9046895021617826162">Conectarea a eșuat</translation>
+<translation id="7168224885072002358">Se revine la rezoluția anterioară în <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Această sesiune se va încheia în <ph name="SESSION_TIME_REMAINING"/>. Veți fi deconectat(ă) automat.</translation>
<translation id="8372369524088641025">Cheie WEP greșită</translation>
<translation id="6636709850131805001">Stare nerecunoscută</translation>
<translation id="3573179567135747900">Modificați înapoi la „<ph name="FROM_LOCALE"/>” (este necesară repornirea)</translation>
<translation id="8103386449138765447">Mesaje SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Setări Disc Google...</translation>
-<translation id="1510238584712386396">Lansator</translation>
<translation id="7209101170223508707">Tasta CAPS LOCK este activată.
Apăsați Alt+Căutare sau Shift pentru a anula.</translation>
<translation id="8940956008527784070">Baterie slabă (<ph name="PERCENTAGE"/> %)</translation>
+<translation id="4918086044614829423">Accept</translation>
<translation id="5102001756192215136">Timp rămas: <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">În prezent, permiteți controlul la ecran prin intermediul Hangouts.</translation>
<translation id="8000066093800657092">Nicio rețea</translation>
<translation id="4015692727874266537">Conectați-vă la alt cont...</translation>
<translation id="5941711191222866238">Minimizați</translation>
<translation id="6911468394164995108">Conectați-vă la altă rețea...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> h. <ph name="MINUTE"/> min. până la încărcare completă</translation>
<translation id="6359806961507272919">SMS de la <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operator</translation>
diff --git a/chromium/ash/strings/ash_strings_ru.xtb b/chromium/ash/strings/ash_strings_ru.xtb
index c248abcaa21..e99e8b8418a 100644
--- a/chromium/ash/strings/ash_strings_ru.xtb
+++ b/chromium/ash/strings/ash_strings_ru.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ru">
<translation id="3595596368722241419">Аккумулятор заряжен</translation>
-<translation id="5250713215130379958">Автоматически скрывать панель запуска</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Состояние портала</translation>
<translation id="30155388420722288">Кнопка переполнения</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth включен</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/>: положение изменено на <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth отключен</translation>
+<translation id="7165320105431587207">Не удалось настроить сеть</translation>
<translation id="3775358506042162758">Множественный вход поддерживает не более трех аккаунтов.</translation>
<translation id="370649949373421643">Включить Wi-Fi</translation>
<translation id="3626281679859535460">Яркость</translation>
+<translation id="595202126637698455">Включено отслеживание эффективности</translation>
<translation id="8054466585765276473">Подсчет оставшегося времени работы от батареи…</translation>
<translation id="7982789257301363584">Сеть</translation>
<translation id="5565793151875479467">Прокси-сервер…</translation>
<translation id="938582441709398163">Накладка на клавиатуру</translation>
<translation id="4387004326333427325">Сертификат аутентификации отклонен удаленно</translation>
<translation id="6979158407327259162">Google Диск</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/>: установлено разрешение <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Произошла ошибка запроса HTTP GET</translation>
<translation id="2297568595583585744">Строка состояния</translation>
<translation id="1661867754829461514">PIN-код отсутствует</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">Маломощное зарядное устройство</translation>
<translation id="3846575436967432996">Информация о сетях недоступна</translation>
<translation id="3026237328237090306">Настроить мобильную передачу данных</translation>
+<translation id="5871632337994001636">Управление устройствами...</translation>
<translation id="785750925697875037">Просмотр мобильного аккаунта</translation>
<translation id="153454903766751181">Инициализация сотового модема…</translation>
<translation id="4628814525959230255">Доступ к экрану для <ph name="HELPER_NAME"/> в Hangouts.</translation>
-<translation id="8343941333792395995">Экран <ph name="DISPLAY_NAME"/> перевернут</translation>
<translation id="7864539943188674973">Отключить Bluetooth</translation>
<translation id="939252827960237676">Не удалось сохранить скриншот</translation>
<translation id="3126069444801937830">Перезагрузите, чтобы обновить</translation>
<translation id="2268813581635650749">Выйти из всех аккаунтов</translation>
<translation id="735745346212279324">VPN-соединение прервано</translation>
<translation id="7320906967354320621">Не активно</translation>
-<translation id="6303423059719347535">Батарея заряжена на <ph name="PERCENTAGE"/>%.</translation>
<translation id="15373452373711364">Большой курсор мыши</translation>
-<translation id="2778346081696727092">Не удалось выполнить аутентификацию</translation>
<translation id="3294437725009624529">Гость</translation>
<translation id="8190698733819146287">Настройка языков и ввода...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Положение полки</translation>
<translation id="2903907270192926896">ВХОД</translation>
<translation id="8676770494376880701">Подключено маломощное зарядное устройство</translation>
<translation id="7170041865419449892">Выход за рамки диапазона</translation>
<translation id="4804818685124855865">Отключиться</translation>
<translation id="2544853746127077729">Сертификат аутентификации отклонен сетью</translation>
<translation id="5222676887888702881">Выйти</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Конфигурация</translation>
<translation id="1272079795634619415">Остановить</translation>
<translation id="4957722034734105353">Подробнее…</translation>
<translation id="2964193600955408481">Отключить Wi-Fi</translation>
-<translation id="811680302244032017">Добавить устройство</translation>
<translation id="4279490309300973883">Отражение</translation>
+<translation id="7973962044839454485">Не удалось выполнить аутентификацию PPP: неверное имя пользователя или пароль</translation>
<translation id="2509468283778169019">Включен режим CAPS LOCK</translation>
<translation id="3892641579809465218">Встроенный дисплей</translation>
<translation id="7823564328645135659">В результате синхронизации настроек язык изменен. Теперь используется <ph name="TO_LOCALE"/>, а не <ph name="FROM_LOCALE"/>.</translation>
<translation id="3368922792935385530">Подключено</translation>
<translation id="8340999562596018839">Голосовое сопровождение</translation>
<translation id="8654520615680304441">Включение Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Способ ввода изменен на <ph name="INPUT_METHOD_ID"/>.
Для переключения нажмите Shift + Alt.</translation>
<translation id="2562916301614567480">Частная сеть</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317">Осталось <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">Методы ввода</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Полка</translation>
<translation id="2614835198358683673">Возможны проблемы при зарядке Chromebook. Рекомендуем использовать комплектное зарядное устройство.</translation>
<translation id="1895658205118569222">Завершение работы</translation>
<translation id="4430019312045809116">Объем</translation>
+<translation id="8681498213689260554">Чтобы обновить систему, перезапустите ее и выполните Powerwash</translation>
<translation id="4442424173763614572">Произошла ошибка при поиске сервера DNS</translation>
-<translation id="6356500677799115505">Батарея заряжена и подключена к источнику питания.</translation>
<translation id="7874779702599364982">Поиск сетей мобильной связи...</translation>
<translation id="583281660410589416">неизвестно</translation>
<translation id="1383876407941801731">Поиск</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">Информация о сети</translation>
<translation id="1621499497873603021">Оставшееся время работы от батареи: <ph name="TIME_LEFT"/>.</translation>
<translation id="5980301590375426705">Выйти из гостевого режима</translation>
-<translation id="4471417012762451363">Батарея заряжена на <ph name="PERCENTAGE"/>% и подключена к источнику питания.</translation>
<translation id="8308637677604853869">Предыдущее меню</translation>
<translation id="4666297444214622512">Не удается войти ещё в один аккаунт.</translation>
<translation id="1346748346194534595">Вправо</translation>
@@ -113,6 +119,7 @@
<translation id="6312403991423642364">Неизвестная ошибка сети</translation>
<translation id="1467432559032391204">Влево</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Активация <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Развернуть</translation>
@@ -122,7 +129,6 @@
<translation id="2727977024730340865">Подключено маломощное зарядное устройство. Возможны проблемы при зарядке.</translation>
<translation id="3784455785234192852">Заблокировать</translation>
<translation id="2805756323405976993">Приложения</translation>
-<translation id="8871072142849158571">Установлено новое разрешение экрана <ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Сбой активации</translation>
<translation id="5097002363526479830">Не удалось подключиться к сети <ph name="NAME"/>: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi отключен</translation>
@@ -130,6 +136,7 @@
<translation id="7052914147756339792">Выбрать обои</translation>
<translation id="8678698760965522072">Состояние &quot;В сети&quot;</translation>
<translation id="2532589005999780174">Режим высокой контрастности</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Внутренняя ошибка</translation>
<translation id="3019353588588144572">Оставшееся время до полной зарядки батареи: <ph name="TIME_REMAINING"/>.</translation>
<translation id="3473479545200714844">Лупа</translation>
@@ -152,20 +159,24 @@
<translation id="7029814467594812963">Завершить сеанс</translation>
<translation id="8454013096329229812">Wi-Fi включен</translation>
<translation id="4872237917498892622">Alt + Search или Shift</translation>
+<translation id="9201131092683066720">Батарея заряжена на <ph name="PERCENTAGE"/>%.</translation>
<translation id="2983818520079887040">Настройки...</translation>
+<translation id="1195412055398077112">Каемка экрана</translation>
<translation id="1717216362413677834">Закрепленный режим</translation>
+<translation id="112308213915226829">Автоматически скрывать полку</translation>
<translation id="8927026611342028580">Запрос на подключение отправлен</translation>
<translation id="8300849813060516376">Сбой OTASP</translation>
<translation id="2792498699870441125">Alt + Search</translation>
<translation id="8660803626959853127">Синхронизация файлов (<ph name="COUNT"/>)</translation>
+<translation id="5958529069007801266">Контролируемый профиль</translation>
<translation id="3709443003275901162">более 9</translation>
<translation id="639644700271529076">CAPS LOCK отключен</translation>
<translation id="6248847161401822652">Чтобы выйти, дважды нажмите Control + Shift + Q.</translation>
+<translation id="6785414152754474415">Батарея заряжена на <ph name="PERCENTAGE"/>% и подключена к источнику питания.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: выполняется активация...</translation>
+<translation id="4895488851634969361">Батарея полностью заряжена.</translation>
<translation id="1391854757121130358">Вероятно, вы использовали весь объем данных, предусмотренный тарифным планом.</translation>
-<translation id="5413208160176941586">Локально управляемый профиль</translation>
-<translation id="1059194134494239015">Разрешение экрана <ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Положение панели запуска</translation>
+<translation id="5947494881799873997">Отменить</translation>
<translation id="7593891976182323525">Search или Shift</translation>
<translation id="7649070708921625228">Справка</translation>
<translation id="3050422059534974565">Включен режим CAPS LOCK.
@@ -178,22 +189,24 @@
<translation id="6692173217867674490">Неправильная кодовая фраза</translation>
<translation id="6165508094623778733">Подробнее...</translation>
<translation id="9046895021617826162">Сбой подключения</translation>
+<translation id="7168224885072002358">Возврат к предыдущему разрешению через <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Сеанс будет завершен через <ph name="SESSION_TIME_REMAINING"/>. Произойдет автоматический выход из системы.</translation>
<translation id="8372369524088641025">Недопустимый ключ WEP</translation>
<translation id="6636709850131805001">Нераспознанное состояние</translation>
<translation id="3573179567135747900">Вернуться к языку: &quot;<ph name="FROM_LOCALE"/>&quot; (потребуется перезагрузка)</translation>
<translation id="8103386449138765447">SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Настройки Диска Google…</translation>
-<translation id="1510238584712386396">Панель запуска</translation>
<translation id="7209101170223508707">Включен режим CAPS LOCK.
Чтобы отключить его, нажмите Alt + Search или Shift.</translation>
<translation id="8940956008527784070">Низкий заряд батареи (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Принять</translation>
<translation id="5102001756192215136">Осталось <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Доступ к экрану в Hangouts.</translation>
<translation id="8000066093800657092">Нет сети</translation>
<translation id="4015692727874266537">Войти ещё в один аккаунт...</translation>
<translation id="5941711191222866238">Свернуть</translation>
<translation id="6911468394164995108">Подключиться к другой сети...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">До полной зарядки: <ph name="HOUR"/> ч <ph name="MINUTE"/> мин</translation>
<translation id="6359806961507272919">SMS от <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Оператор связи</translation>
diff --git a/chromium/ash/strings/ash_strings_sk.xtb b/chromium/ash/strings/ash_strings_sk.xtb
index 02ba009f4e1..c313ac11200 100644
--- a/chromium/ash/strings/ash_strings_sk.xtb
+++ b/chromium/ash/strings/ash_strings_sk.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="sk">
<translation id="3595596368722241419">Batéria je nabitá</translation>
-<translation id="5250713215130379958">Automaticky skryť spúšťač</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> a <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Stav portálu</translation>
<translation id="30155388420722288">Tlačidlo pretečenia</translation>
+<translation id="8673028979667498656">270 °</translation>
<translation id="5571066253365925590">Rozhranie Bluetooth je povolené</translation>
+<translation id="6310121235600822547">Obrazovka <ph name="DISPLAY_NAME"/> bola otočená o <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Rozhranie Bluetooth je zakázané</translation>
+<translation id="7165320105431587207">Sieť sa nepodarilo nakonfigurovať</translation>
<translation id="3775358506042162758">V rámci viacnásobného prihlásenia môžete mať maximálne tri účty.</translation>
<translation id="370649949373421643">Povoliť Wi-Fi</translation>
<translation id="3626281679859535460">Jas</translation>
+<translation id="595202126637698455">Sledovanie výkonnosti je povolené</translation>
<translation id="8054466585765276473">Výpočet času výdrže batérie.</translation>
<translation id="7982789257301363584">Sieť</translation>
<translation id="5565793151875479467">Server proxy...</translation>
<translation id="938582441709398163">Prekryvná vrstva klávesnice</translation>
<translation id="4387004326333427325">Certifikát na overenie totožnosti bol zamietnutý na diaľku</translation>
<translation id="6979158407327259162">Disk Google</translation>
+<translation id="3683428399328702079">Rozlíšenie obrazovky <ph name="DISPLAY_NAME"/> bolo zmenené na <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Príkaz get protokolu HTTP zlyhal</translation>
<translation id="2297568595583585744">Stavový panel</translation>
<translation id="1661867754829461514">Chýba kód PIN</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">Nabíjačka s nízkym výkonom</translation>
<translation id="3846575436967432996">Informácie o sieti nie sú k dispozícii</translation>
<translation id="3026237328237090306">Nastavenie mobilného dátového pripojenia</translation>
+<translation id="5871632337994001636">Spravovať zariadenia...</translation>
<translation id="785750925697875037">Zobraziť mobilný účet</translation>
<translation id="153454903766751181">Inicializácia mobilného modemu...</translation>
<translation id="4628814525959230255">Zdieľanie ovládania obrazovky s používateľom <ph name="HELPER_NAME"/> prostredníctvom služby Hangouts.</translation>
-<translation id="8343941333792395995">Obrazovka <ph name="DISPLAY_NAME"/> sa otočila</translation>
<translation id="7864539943188674973">Zakázať rozhranie Bluetooth</translation>
<translation id="939252827960237676">Uloženie snímky obrazovky zlyhalo.</translation>
<translation id="3126069444801937830">Reštartovaním vykonáte aktualizáciu</translation>
<translation id="2268813581635650749">Odhlásiť všetkých</translation>
<translation id="735745346212279324">Sieť VPN je odpojená</translation>
<translation id="7320906967354320621">Nečinná</translation>
-<translation id="6303423059719347535">Batéria je nabitá na <ph name="PERCENTAGE"/> %</translation>
<translation id="15373452373711364">Veľký kurzor myši</translation>
-<translation id="2778346081696727092">Overenie totožnosti pomocou zadaného používateľského mena a hesla zlyhalo</translation>
<translation id="3294437725009624529">Hosť</translation>
<translation id="8190698733819146287">Prebieha prispôsobenie jazykov a vstupu...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Pozícia poličky</translation>
<translation id="2903907270192926896">VSTUP</translation>
<translation id="8676770494376880701">Pripojila sa nabíjačka s nízkym výkonom</translation>
<translation id="7170041865419449892">Mimo rozsah</translation>
<translation id="4804818685124855865">Odpojiť</translation>
<translation id="2544853746127077729">Certifikát na overenie totožnosti bol zamietnutý sieťou</translation>
<translation id="5222676887888702881">Odhlásiť sa</translation>
+<translation id="2391579633712104609">180 °</translation>
<translation id="2688477613306174402">Konfigurácia</translation>
<translation id="1272079795634619415">Zastaviť</translation>
<translation id="4957722034734105353">Viac informácií...</translation>
<translation id="2964193600955408481">Zakázať sieť Wi-Fi</translation>
-<translation id="811680302244032017">Pridať zariadenie ...</translation>
<translation id="4279490309300973883">Zrkadlenie</translation>
+<translation id="7973962044839454485">Overenie PKS zlyhalo z dôvodu nesprávneho používateľského mena alebo hesla</translation>
<translation id="2509468283778169019">Kláves CAPS LOCK je zapnutý</translation>
<translation id="3892641579809465218">Interný displej</translation>
<translation id="7823564328645135659">Po synchronizácii vašich nastavení bol zmenený jazyk „<ph name="FROM_LOCALE"/>“ na jazyk „<ph name="TO_LOCALE"/>“.</translation>
<translation id="3368922792935385530">Pripojené</translation>
<translation id="8340999562596018839">Hlasová odozva</translation>
<translation id="8654520615680304441">Zapnúť sieť Wi-Fi...</translation>
+<translation id="8828714802988429505">90 °</translation>
<translation id="5825747213122829519">Metóda vstupu sa zmenila na <ph name="INPUT_METHOD_ID"/>.
Prepnete ju stlačením klávesov Shift + Alt.</translation>
<translation id="2562916301614567480">Súkromná sieť</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317">Zostáva <ph name="PERCENTAGE"/> %</translation>
<translation id="9089416786594320554">Metódy vstupu</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/> %</translation>
+<translation id="2825619548187458965">Polička</translation>
<translation id="2614835198358683673">Chromebook sa nesmie dobíjať v čase, keď je zapnutý. Zvážte použitie oficiálnej nabíjačky.</translation>
<translation id="1895658205118569222">Vypnúť</translation>
<translation id="4430019312045809116">Hlasitosť</translation>
+<translation id="8681498213689260554">Aktualizáciu uskutočníte reštartovaním a použitím funkcie Powerwash</translation>
<translation id="4442424173763614572">Vyhľadanie DNS zlyhalo</translation>
-<translation id="6356500677799115505">Batéria je úplne nabitá a nabíja sa.</translation>
<translation id="7874779702599364982">Prebieha vyhľadávanie mobilných sietí...</translation>
<translation id="583281660410589416">Neznámy</translation>
<translation id="1383876407941801731">Vyhľadávanie</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">Informácie o sieti</translation>
<translation id="1621499497873603021">Čas zostávajúci do vybitia batérie: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Ukončiť reláciu hosťa</translation>
-<translation id="4471417012762451363">Batéria je nabitá na <ph name="PERCENTAGE"/> % a nabíja sa</translation>
<translation id="8308637677604853869">Predchádzajúca ponuka</translation>
<translation id="4666297444214622512">Nepodarilo sa prihlásiť do iného účtu.</translation>
<translation id="1346748346194534595">Doprava</translation>
@@ -114,6 +120,7 @@ Zakážete ju stlačením klávesov Ctrl+Alt+Z.</translation>
<translation id="6312403991423642364">Neznáma chyba siete</translation>
<translation id="1467432559032391204">Doľava</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Aktivujte sa sieť <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maximalizovať</translation>
@@ -123,7 +130,6 @@ Zakážete ju stlačením klávesov Ctrl+Alt+Z.</translation>
<translation id="2727977024730340865">Batéria je zapojená do nabíjačky s nízkym výkonom. Nabíjanie batérie nemusí byť spoľahlivé.</translation>
<translation id="3784455785234192852">Uzamknúť</translation>
<translation id="2805756323405976993">Aplikácie</translation>
-<translation id="8871072142849158571">Veľkosť obrazovky <ph name="DISPLAY_NAME"/> sa zmenila na veľkosť <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Zlyhanie aktivácie</translation>
<translation id="5097002363526479830">K sieti „<ph name="NAME"/>“ sa nepodarilo pripojiť: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Pripojenie Wi-Fi je vypnuté.</translation>
@@ -131,6 +137,7 @@ Zakážete ju stlačením klávesov Ctrl+Alt+Z.</translation>
<translation id="7052914147756339792">Nastavenie tapety...</translation>
<translation id="8678698760965522072">Stav online</translation>
<translation id="2532589005999780174">Režim s vysokým kontrastom</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Interná chyba</translation>
<translation id="3019353588588144572">Čas zostávajúci do úplného nabitia batérie: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Lupa</translation>
@@ -153,20 +160,24 @@ Správa zo servera: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Ukončiť reláciu</translation>
<translation id="8454013096329229812">Pripojenie Wi-Fi je zapnuté.</translation>
<translation id="4872237917498892622">Alt + Hľadať alebo Shift</translation>
+<translation id="9201131092683066720">Batéria je nabitá na <ph name="PERCENTAGE"/> %.</translation>
<translation id="2983818520079887040">Nastavenia...</translation>
+<translation id="1195412055398077112">presah obsahu</translation>
<translation id="1717216362413677834">Režim doku</translation>
+<translation id="112308213915226829">Automatické skrývanie poličky</translation>
<translation id="8927026611342028580">Vyžaduje sa pripojenie</translation>
<translation id="8300849813060516376">Zlyhanie služby OTASP</translation>
<translation id="2792498699870441125">Alt + Hľadať</translation>
<translation id="8660803626959853127">Synchronizácia súborov (<ph name="COUNT"/>)</translation>
+<translation id="5958529069007801266">Kontrolovaný používateľ</translation>
<translation id="3709443003275901162">viac ako 9</translation>
<translation id="639644700271529076">CAPS LOCK je vypnutý</translation>
<translation id="6248847161401822652">Ak chcete skončiť, stlačte dvakrát kombináciu kláves Ctrl+Shift+Q.</translation>
+<translation id="6785414152754474415">Batéria je nabitá na <ph name="PERCENTAGE"/> % a nabíja sa.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Aktivuje sa...</translation>
+<translation id="4895488851634969361">Batéria je úplne nabitá.</translation>
<translation id="1391854757121130358">Možno ste dosiahli limit povolených mobilných dát.</translation>
-<translation id="5413208160176941586">Miestne spravovaný používateľ</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Pozícia spúťača</translation>
+<translation id="5947494881799873997">Vrátiť</translation>
<translation id="7593891976182323525">Hľadať alebo Shift</translation>
<translation id="7649070708921625228">Pomocník</translation>
<translation id="3050422059534974565">Kláves CAPS LOCK je zapnutý.
@@ -179,22 +190,24 @@ Ak ho chcete zrušiť, stlačte klávesy Hľadať alebo Shift.</translation>
<translation id="6692173217867674490">Zlá prístupová fráza</translation>
<translation id="6165508094623778733">Viac informácií</translation>
<translation id="9046895021617826162">Zlyhanie pripojenia</translation>
+<translation id="7168224885072002358">Vrátenie starého rozlíšenia prebehne o <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Relácia sa ukončí o <ph name="SESSION_TIME_REMAINING"/>. Automaticky dôjde k odhláseniu.</translation>
<translation id="8372369524088641025">Zlý kľúč WEP</translation>
<translation id="6636709850131805001">Nerozpoznaný stav</translation>
<translation id="3573179567135747900">Zmeniť späť na miestne nastavenie „<ph name="FROM_LOCALE"/>“ (vyžaduje sa reštart)</translation>
<translation id="8103386449138765447">Správy SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Nastavenia služby Disk Google...</translation>
-<translation id="1510238584712386396">Spúšťač</translation>
<translation id="7209101170223508707">Kláves CAPS LOCK je zapnutý.
Ak ho chcete zrušiť, stlačte klávesy Alt + Hľadať alebo Shift.</translation>
<translation id="8940956008527784070">Kapacita batérie je nízka (<ph name="PERCENTAGE"/> %)</translation>
+<translation id="4918086044614829423">Prijať</translation>
<translation id="5102001756192215136">zostáva <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Zdieľanie ovládania obrazovky prostredníctvom služby Hangouts.</translation>
<translation id="8000066093800657092">Žiadna sieť</translation>
<translation id="4015692727874266537">Prihláste sa do iného účtu...</translation>
<translation id="5941711191222866238">Minimalizovať</translation>
<translation id="6911468394164995108">Pripojiť k ďalšej...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>h <ph name="MINUTE"/>min do nabitia</translation>
<translation id="6359806961507272919">SMS z č. <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operátor</translation>
diff --git a/chromium/ash/strings/ash_strings_sl.xtb b/chromium/ash/strings/ash_strings_sl.xtb
index 3ac1f59d5b2..e9d5d1ec8cc 100644
--- a/chromium/ash/strings/ash_strings_sl.xtb
+++ b/chromium/ash/strings/ash_strings_sl.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="sl">
<translation id="3595596368722241419">Baterija je polna</translation>
-<translation id="5250713215130379958">Samodejno skrij zaganjalnik</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> in <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Stanje portala</translation>
<translation id="30155388420722288">Gumb za presežek</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth omogočen</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> – zasuk na <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth onemogočen</translation>
+<translation id="7165320105431587207">Omrežja ni bilo mogoče konfigurirati</translation>
<translation id="3775358506042162758">S prijavo z več računi lahko uporabljate samo tri račune.</translation>
<translation id="370649949373421643">Omogoči Wi-Fi</translation>
<translation id="3626281679859535460">Svetlost</translation>
+<translation id="595202126637698455">Sledenje učinkovitosti delovanja je omogočeno</translation>
<translation id="8054466585765276473">Izračunavanje časa trajanja akumulatorja.</translation>
<translation id="7982789257301363584">Omrežje</translation>
<translation id="5565793151875479467">Proxy ...</translation>
<translation id="938582441709398163">Prekrivna tipkovnica</translation>
<translation id="4387004326333427325">Potrdilo za preverjanje pristnosti je bilo zavrnjeno na oddaljeni lokaciji</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> – ločljivost je bila spremenjena na: <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Ukaz HTTP get ni uspel</translation>
<translation id="2297568595583585744">Pladenj stanja</translation>
<translation id="1661867754829461514">Manjka PIN</translation>
@@ -34,39 +38,41 @@ Pritisnite Shift + Alt, da ga preklopite.</translation>
<translation id="2127372758936585790">Nizkoenergijski polnilnik</translation>
<translation id="3846575436967432996">Ni podatkov o omrežju</translation>
<translation id="3026237328237090306">Nastavitev mobilne podatkovne povezave</translation>
+<translation id="5871632337994001636">Upravljanje naprav ...</translation>
<translation id="785750925697875037">Prikaz mobilnega računa</translation>
<translation id="153454903766751181">Inicializacija modema za mobilno omrežje ...</translation>
<translation id="4628814525959230255">Skupni nadzor zaslona z osebo <ph name="HELPER_NAME"/> prek klepetalnic Hangouts.</translation>
-<translation id="8343941333792395995">Zaslon <ph name="DISPLAY_NAME"/> je zasukan</translation>
<translation id="7864539943188674973">Onemogoči Bluetooth</translation>
<translation id="939252827960237676">Posnetka zaslona ni bilo mogoče shraniti</translation>
<translation id="3126069444801937830">Znova zaženite za posodobitev</translation>
<translation id="2268813581635650749">Odjava vseh</translation>
<translation id="735745346212279324">Povezava z navideznim zasebnim omrežjem je prekinjena</translation>
<translation id="7320906967354320621">Nedejavno</translation>
-<translation id="6303423059719347535">Napolnjenost akumulatorja: <ph name="PERCENTAGE"/> %</translation>
<translation id="15373452373711364">Velik miškin kazalec</translation>
-<translation id="2778346081696727092">Preverjanje pristnosti vnesenega uporabniškega imena ali gesla ni uspelo</translation>
<translation id="3294437725009624529">Gost</translation>
<translation id="8190698733819146287">Prilagajanje jezikov in vnosa ...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Položaj police</translation>
<translation id="2903907270192926896">VHOD</translation>
<translation id="8676770494376880701">Priključen je nizkoenergijski polnilnik</translation>
<translation id="7170041865419449892">Zunaj dosega</translation>
<translation id="4804818685124855865">Prekini povezavo</translation>
<translation id="2544853746127077729">Omrežje je zavrnilo potrdilo za preverjanje pristnosti</translation>
<translation id="5222676887888702881">Odjava</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfiguracija</translation>
<translation id="1272079795634619415">Ustavi</translation>
<translation id="4957722034734105353">Več o tem ...</translation>
<translation id="2964193600955408481">Onemogoči Wi-Fi</translation>
-<translation id="811680302244032017">Dodaj napravo ...</translation>
<translation id="4279490309300973883">Zrcaljenje</translation>
+<translation id="7973962044839454485">Preverjanje pristnosti PPP ni uspelo zaradi napačnega uporabniškega imena ali gesla</translation>
<translation id="2509468283778169019">Tipka CAPS LOCK je vklopljena</translation>
<translation id="3892641579809465218">Notranji zaslon</translation>
<translation id="7823564328645135659">Po sinhronizaciji nastavitev se je jezik spremenil iz jezika »<ph name="FROM_LOCALE"/>« v jezik »<ph name="TO_LOCALE"/>«.</translation>
<translation id="3368922792935385530">Povezano</translation>
<translation id="8340999562596018839">Glasovni odziv</translation>
<translation id="8654520615680304441">Vklop omrežja Wi-Fi ...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Način vnosa se je spremenil v <ph name="INPUT_METHOD_ID"/>.
Pritisnite Shift + Alt, da ga preklopite.</translation>
<translation id="2562916301614567480">Zasebno omrežje</translation>
@@ -83,11 +89,12 @@ Pritisnite Shift + Alt, da ga preklopite.</translation>
<translation id="3626637461649818317">Preostane še <ph name="PERCENTAGE"/> %</translation>
<translation id="9089416786594320554">Načini vnosa</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/> %</translation>
+<translation id="2825619548187458965">Polica</translation>
<translation id="2614835198358683673">Vaš Chromebook se ne more polniti, ko je vklopljen. Priporočamo uporabo uradnega polnilnika.</translation>
<translation id="1895658205118569222">Zaprt</translation>
<translation id="4430019312045809116">Glasnost</translation>
+<translation id="8681498213689260554">Če želite posodobiti, znova zaženite in uporabite funkcijo Powerwash</translation>
<translation id="4442424173763614572">Iskanje DNS ni uspelo</translation>
-<translation id="6356500677799115505">Akumulator je poln in se polni.</translation>
<translation id="7874779702599364982">Iskanje mobilnih omrežij ...</translation>
<translation id="583281660410589416">Neznano</translation>
<translation id="1383876407941801731">Iskanje</translation>
@@ -96,7 +103,6 @@ Pritisnite Shift + Alt, da ga preklopite.</translation>
<translation id="2204305834655267233">Podatki o omrežju</translation>
<translation id="1621499497873603021">Preostali čas do izpraznitve akumulatorja, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Zapusti sejo gosta</translation>
-<translation id="4471417012762451363">Napolnjenost akumulatorja: <ph name="PERCENTAGE"/> % in se polni</translation>
<translation id="8308637677604853869">Prejšnji meni</translation>
<translation id="4666297444214622512">V drug račun se ni mogoče prijaviti.</translation>
<translation id="1346748346194534595">V desno</translation>
@@ -114,6 +120,7 @@ Pritisnite Shift + Alt, da ga preklopite.</translation>
<translation id="6312403991423642364">Neznana napaka v omrežju</translation>
<translation id="1467432559032391204">V levo</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Aktiviranje omrežja <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Povečaj</translation>
@@ -123,7 +130,6 @@ Pritisnite Shift + Alt, da ga preklopite.</translation>
<translation id="2727977024730340865">Priključen je nizkoenergijski polnilnik. Polnjenje akumulatorja morda ne bo zanesljivo.</translation>
<translation id="3784455785234192852">Zakleni</translation>
<translation id="2805756323405976993">Google Apps</translation>
-<translation id="8871072142849158571">Ločljivost zaslona <ph name="DISPLAY_NAME"/> je spremenjena na <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Napaka pri aktiviranju</translation>
<translation id="5097002363526479830">Povezava z omrežjem »<ph name="NAME"/>« ni uspela: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi je izklopljen.</translation>
@@ -131,6 +137,7 @@ Pritisnite Shift + Alt, da ga preklopite.</translation>
<translation id="7052914147756339792">Nastavi sliko za ozadje ...</translation>
<translation id="8678698760965522072">Stanje s povezavo</translation>
<translation id="2532589005999780174">Visokokontrastni način</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Notranja napaka</translation>
<translation id="3019353588588144572">Preostali čas do napolnitve akumulatorja, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Lupa</translation>
@@ -153,20 +160,24 @@ Sporočilo strežnika: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Zapusti sejo</translation>
<translation id="8454013096329229812">Wi-Fi je vklopljen.</translation>
<translation id="4872237917498892622">Alt + iskanje ali Shift</translation>
+<translation id="9201131092683066720">Napolnjenost akumulatorja: <ph name="PERCENTAGE"/> %.</translation>
<translation id="2983818520079887040">Nastavitve ...</translation>
+<translation id="1195412055398077112">upodabljanje čez rob zaslona</translation>
<translation id="1717216362413677834">Zasidrani način</translation>
+<translation id="112308213915226829">Samodejno skrivanje police</translation>
<translation id="8927026611342028580">Povezava zahtevana</translation>
<translation id="8300849813060516376">Storitev OTASP ni uspela</translation>
<translation id="2792498699870441125">Alt + iskanje</translation>
<translation id="8660803626959853127">Sinhroniziranje toliko datotek: <ph name="COUNT"/> ...</translation>
+<translation id="5958529069007801266">Nadzorovan uporabnik</translation>
<translation id="3709443003275901162">Več kot 9</translation>
<translation id="639644700271529076">Tipka CAPS LOCK je izklopljena</translation>
<translation id="6248847161401822652">Dvakrat pritisnite Ctrl + Shift + Q, če želite končati.</translation>
+<translation id="6785414152754474415">Napolnjenost akumulatorja: <ph name="PERCENTAGE"/> % – polnjenje še poteka.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Aktiviranje ...</translation>
+<translation id="4895488851634969361">Akumulator je poln.</translation>
<translation id="1391854757121130358">Morda ste porabili dovoljeno količino mobilnih podatkov.</translation>
-<translation id="5413208160176941586">Lokalno upravljani uporabnik</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Položaj zaganjalnika</translation>
+<translation id="5947494881799873997">Razveljavi</translation>
<translation id="7593891976182323525">Iskanje ali Shift</translation>
<translation id="7649070708921625228">Pomoč</translation>
<translation id="3050422059534974565">Tipka CAPS LOCK je vklopljena.
@@ -179,22 +190,24 @@ Pritisnite tipko za iskanje ali Shift, da jo prekličete.</translation>
<translation id="6692173217867674490">Napačno geslo</translation>
<translation id="6165508094623778733">Več o tem</translation>
<translation id="9046895021617826162">Vzpostavljanje povezave ni uspelo</translation>
+<translation id="7168224885072002358">Ponastavitev na prejšnjo ločljivost čez <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Ta seja se bo končala čez <ph name="SESSION_TIME_REMAINING"/>. Samodejno boste odjavljeni.</translation>
<translation id="8372369524088641025">Napačen ključ WEP</translation>
<translation id="6636709850131805001">Neprepoznano stanje</translation>
<translation id="3573179567135747900">Spremeni nazaj v jezik »<ph name="FROM_LOCALE"/>« (potreben vnovični zagon)</translation>
<translation id="8103386449138765447">Sporočila SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Nastavitve za Google Drive ...</translation>
-<translation id="1510238584712386396">Zaganjalnik</translation>
<translation id="7209101170223508707">Tipka CAPS LOCK je vklopljena.
Pritisnite Alt in tipko za iskanje ali Shift, da jo prekličete.</translation>
<translation id="8940956008527784070">Akumulator je skoraj prazen (<ph name="PERCENTAGE"/> %)</translation>
+<translation id="4918086044614829423">Sprejmi</translation>
<translation id="5102001756192215136">Še <ph name="HOUR"/>.<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Skupni nadzor zaslona prek klepetalnic Hangouts.</translation>
<translation id="8000066093800657092">Ni omrežja</translation>
<translation id="4015692727874266537">Prijava z drugim računom ...</translation>
<translation id="5941711191222866238">Pomanjšaj</translation>
<translation id="6911468394164995108">Pridružite se drugemu ...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> h <ph name="MINUTE"/> min do napolnjenosti</translation>
<translation id="6359806961507272919">SMS od <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operater</translation>
diff --git a/chromium/ash/strings/ash_strings_sr.xtb b/chromium/ash/strings/ash_strings_sr.xtb
index dba64929d63..df00c69eecb 100644
--- a/chromium/ash/strings/ash_strings_sr.xtb
+++ b/chromium/ash/strings/ash_strings_sr.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="sr">
<translation id="3595596368722241419">Батерија је пуна</translation>
-<translation id="5250713215130379958">Аутоматски сакриј покретач</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> и <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Стање Портал</translation>
<translation id="30155388420722288">Дугме за додатне опције</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth је омогућен</translation>
+<translation id="6310121235600822547">Екран <ph name="DISPLAY_NAME"/> је промењен у <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth је онемогућен</translation>
+<translation id="7165320105431587207">Конфигурација мреже није успела</translation>
<translation id="3775358506042162758">Можете да имате највише три налога за вишеструко пријављивање.</translation>
<translation id="370649949373421643">Омогући Wi-Fi</translation>
<translation id="3626281679859535460">Осветљеност</translation>
+<translation id="595202126637698455">Праћење учинка је омогућено</translation>
<translation id="8054466585765276473">Израчунавање времена трајања батерије.</translation>
<translation id="7982789257301363584">Мрежа</translation>
<translation id="5565793151875479467">Прокси...</translation>
<translation id="938582441709398163">Постављени елемент тастатуре</translation>
<translation id="4387004326333427325">Сертификат за потврду аутентичности је одбијен даљински</translation>
<translation id="6979158407327259162">Google диск</translation>
+<translation id="3683428399328702079">Резолуција <ph name="DISPLAY_NAME"/> је промењена у <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP get није успео</translation>
<translation id="2297568595583585744">Палета статуса</translation>
<translation id="1661867754829461514">Недостаје PIN</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">Пуњач мале снаге</translation>
<translation id="3846575436967432996">Нису доступне информације о мрежи</translation>
<translation id="3026237328237090306">Подеси податке за мобилне уређаје</translation>
+<translation id="5871632337994001636">Управљај уређајима...</translation>
<translation id="785750925697875037">Прикажи налог за мобилне уређаје</translation>
<translation id="153454903766751181">Покретање модема за мобилну мрежу...</translation>
<translation id="4628814525959230255">Контрола над екраном се дели са корисником <ph name="HELPER_NAME"/> преко Hangouts-а.</translation>
-<translation id="8343941333792395995">Екран <ph name="DISPLAY_NAME"/> је ротиран</translation>
<translation id="7864539943188674973">Онемогући Bluetooth</translation>
<translation id="939252827960237676">Чување снимка екрана није успело</translation>
<translation id="3126069444801937830">Покрените поново да бисте ажурирали</translation>
<translation id="2268813581635650749">Одјави све</translation>
<translation id="735745346212279324">Веза са VPN-ом је прекинута</translation>
<translation id="7320906967354320621">Неактивно</translation>
-<translation id="6303423059719347535">Батерија је <ph name="PERCENTAGE"/>% пуна</translation>
<translation id="15373452373711364">Велики показивач миша</translation>
-<translation id="2778346081696727092">Потврда аутентичности помоћу наведеног корисничког имена или лозинке није успела</translation>
<translation id="3294437725009624529">Гост</translation>
<translation id="8190698733819146287">Прилагоди језике и унос...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Положај полице</translation>
<translation id="2903907270192926896">УЛАЗ</translation>
<translation id="8676770494376880701">Повезан је пуњач мале снаге</translation>
<translation id="7170041865419449892">Изван опсега</translation>
<translation id="4804818685124855865">Прекини везу</translation>
<translation id="2544853746127077729">Мрежа је одбила сертификат за потврду аутентичности</translation>
<translation id="5222676887888702881">Одјави ме</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Конфигурација</translation>
<translation id="1272079795634619415">Заустави</translation>
<translation id="4957722034734105353">Сазнајте више...</translation>
<translation id="2964193600955408481">Онемогући Wi-Fi</translation>
-<translation id="811680302244032017">Додај уређај...</translation>
<translation id="4279490309300973883">Пресликавање</translation>
+<translation id="7973962044839454485">Провера аутентичности преко протокола PPP није успела због нетачног корисничког имена или лозинке</translation>
<translation id="2509468283778169019">CAPS LOCK је укључен</translation>
<translation id="3892641579809465218">Интерни екран</translation>
<translation id="7823564328645135659">Језик је промењен са језика „<ph name="FROM_LOCALE"/>“ на „<ph name="TO_LOCALE"/>“ након синхронизације подешавања.</translation>
<translation id="3368922792935385530">Повезан</translation>
<translation id="8340999562596018839">Говорне повратне информације</translation>
<translation id="8654520615680304441">Укључи Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Метод уноса је промењен у <ph name="INPUT_METHOD_ID"/>.
Притисните Shift + Alt да бисте пребацили.</translation>
<translation id="2562916301614567480">Приватна мрежа</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317">Преостало је <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">Методи уноса</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Полица</translation>
<translation id="2614835198358683673">Chromebook се можда неће пунити док је укључен. Размислите о коришћењу оригиналног пуњача.</translation>
<translation id="1895658205118569222">Затварање</translation>
<translation id="4430019312045809116">Јачина звука</translation>
+<translation id="8681498213689260554">Поново покрените и обавите Powerwash да бисте ажурирали</translation>
<translation id="4442424173763614572">DNS претрага није успела</translation>
-<translation id="6356500677799115505">Батерија је пуна и још увек се пуни.</translation>
<translation id="7874779702599364982">Претраживање мобилних мрежа...</translation>
<translation id="583281660410589416">Непознато</translation>
<translation id="1383876407941801731">Претрага</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">Информације о мрежи</translation>
<translation id="1621499497873603021">Време које је преостало док се батерија не испразни, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Изађи из сесије госта</translation>
-<translation id="4471417012762451363">Батерија је <ph name="PERCENTAGE"/>% пуна и још увек се пуни</translation>
<translation id="8308637677604853869">Претходни мени</translation>
<translation id="4666297444214622512">Не можете да се пријавите на други налог.</translation>
<translation id="1346748346194534595">Удесно</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">Непозната грешка на мрежи</translation>
<translation id="1467432559032391204">Улево</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Активирање мреже <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Увећај</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">Уређај је укључен у пуњач мале снаге. Пуњење батерије можда неће бити поуздано.</translation>
<translation id="3784455785234192852">Закључај</translation>
<translation id="2805756323405976993">Apps</translation>
-<translation id="8871072142849158571">Величина екрана <ph name="DISPLAY_NAME"/> је промењена у <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Активација није успела</translation>
<translation id="5097002363526479830">Повезивање са мрежом „<ph name="NAME"/>“ није успело: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi је искључен.</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">Подеси позадину...</translation>
<translation id="8678698760965522072">Стање На мрежи</translation>
<translation id="2532589005999780174">Режим високог контраста</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Интерна грешка</translation>
<translation id="3019353588588144572">Време које је преостало док се батерија у потпуности не напуни, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Лупа екрана</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">Изађи из сесије</translation>
<translation id="8454013096329229812">Wi-Fi је укључен.</translation>
<translation id="4872237917498892622">Alt + тастер за претрагу или Shift</translation>
+<translation id="9201131092683066720">Батерија је <ph name="PERCENTAGE"/>% пуна.</translation>
<translation id="2983818520079887040">Подешавања...</translation>
+<translation id="1195412055398077112">ивично подручје екрана</translation>
<translation id="1717216362413677834">Режим базне станице</translation>
+<translation id="112308213915226829">Аутоматски сакриј полицу</translation>
<translation id="8927026611342028580">Захтева се повезивање</translation>
<translation id="8300849813060516376">OTASP није успео</translation>
<translation id="2792498699870441125">Alt + тастер за претрагу</translation>
<translation id="8660803626959853127">Синхронизовање <ph name="COUNT"/> датотеке(а)</translation>
+<translation id="5958529069007801266">Корисник под надзором</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK је искључен</translation>
<translation id="6248847161401822652">Притисните Control Shift Q двапут да бисте изашли.</translation>
+<translation id="6785414152754474415">Батерија је <ph name="PERCENTAGE"/>% пуна и још увек се пуни.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Активирање...</translation>
+<translation id="4895488851634969361">Батерија је пуна.</translation>
<translation id="1391854757121130358">Можда сте искористили додељени пакет података за мобилне уређаје.</translation>
-<translation id="5413208160176941586">Корисник којим се локално управља</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Положај покретача</translation>
+<translation id="5947494881799873997">Врати</translation>
<translation id="7593891976182323525">Тастер за претрагу или Shift</translation>
<translation id="7649070708921625228">Помоћ</translation>
<translation id="3050422059534974565">CAPS LOCK је укључен.
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">Неисправна приступна фраза</translation>
<translation id="6165508094623778733">Сазнајте више</translation>
<translation id="9046895021617826162">Повезивање није успело</translation>
+<translation id="7168224885072002358">Враћање на стару резолуцију за <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Ова сесија ће се завршити за <ph name="SESSION_TIME_REMAINING"/>. Бићете аутоматски одјављени.</translation>
<translation id="8372369524088641025">Неисправна WEP шифра</translation>
<translation id="6636709850131805001">Непознато стање</translation>
<translation id="3573179567135747900">Врати на „<ph name="FROM_LOCALE"/>“ (потребно је поновно покретање)</translation>
<translation id="8103386449138765447">SMS поруке: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Подешавања Google диска...</translation>
-<translation id="1510238584712386396">Покретач</translation>
<translation id="7209101170223508707">CAPS LOCK је укључен.
Притисните Alt + тастер за претрагу или Shift да бисте га отказали.</translation>
<translation id="8940956008527784070">Батерија је скоро празна (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Прихвати</translation>
<translation id="5102001756192215136">Преостало је <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Контрола над екраном се дели преко Hangouts-а.</translation>
<translation id="8000066093800657092">Нема мреже</translation>
<translation id="4015692727874266537">Пријави ме на други налог...</translation>
<translation id="5941711191222866238">Смањи</translation>
<translation id="6911468394164995108">Придружи ме другој...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> с <ph name="MINUTE"/> м до краја пуњења</translation>
<translation id="6359806961507272919">SMS са броја <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Мобилни оператер</translation>
diff --git a/chromium/ash/strings/ash_strings_sv.xtb b/chromium/ash/strings/ash_strings_sv.xtb
index 7418d0e765a..b07c6b93e7a 100644
--- a/chromium/ash/strings/ash_strings_sv.xtb
+++ b/chromium/ash/strings/ash_strings_sv.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="sv">
<translation id="3595596368722241419">Batteriet är fulladdat</translation>
-<translation id="5250713215130379958">Dölj startfältet automatiskt</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> och <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Portalläge</translation>
<translation id="30155388420722288">Överflödsknapp</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth aktiverad</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> byttes till <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth inaktiverad</translation>
+<translation id="7165320105431587207">Det gick inte att konfigurera nätverket</translation>
<translation id="3775358506042162758">Du kan högst använda tre konton för multiinloggning.</translation>
<translation id="370649949373421643">Aktivera Wi-Fi</translation>
<translation id="3626281679859535460">Ljusstyrka</translation>
+<translation id="595202126637698455">Resultatspårning aktiverat</translation>
<translation id="8054466585765276473">Batteritiden beräknas.</translation>
<translation id="7982789257301363584">Nätverk</translation>
<translation id="5565793151875479467">Proxy ...</translation>
<translation id="938582441709398163">Tangentbordsöverlägg</translation>
<translation id="4387004326333427325">Autentiseringscertifikatet godkändes inte av fjärrvärden</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">Upplösningen för <ph name="DISPLAY_NAME"/> ändrades till <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP GET misslyckades</translation>
<translation id="2297568595583585744">Statusfält</translation>
<translation id="1661867754829461514">PIN saknas</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">Laddning med låg effekt</translation>
<translation id="3846575436967432996">Det finns ingen nätverksinformation</translation>
<translation id="3026237328237090306">Konfigurera mobildata</translation>
+<translation id="5871632337994001636">Hantera enheter ...</translation>
<translation id="785750925697875037">Visa mobilkonto</translation>
<translation id="153454903766751181">Mobilt modem initieras ...</translation>
<translation id="4628814525959230255">Delar kontrollen över din skärm med <ph name="HELPER_NAME"/> via Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> har roterats</translation>
<translation id="7864539943188674973">Inaktivera Bluetooth</translation>
<translation id="939252827960237676">Det gick inte att spara skärmdumpen</translation>
<translation id="3126069444801937830">Starta om för att uppdatera</translation>
<translation id="2268813581635650749">Logga ut alla</translation>
<translation id="735745346212279324">VPN frånkopplat</translation>
<translation id="7320906967354320621">Inaktiv</translation>
-<translation id="6303423059719347535">Batteriet är fullt till <ph name="PERCENTAGE"/> %</translation>
<translation id="15373452373711364">Stor muspekare</translation>
-<translation id="2778346081696727092">Det gick inte att autentisera med användarnamnet eller lösenordet som angavs</translation>
<translation id="3294437725009624529">Gäst</translation>
<translation id="8190698733819146287">Anpassa språk och inmatning...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Hyllposition</translation>
<translation id="2903907270192926896">INDATA</translation>
<translation id="8676770494376880701">Laddare med låg effekt ansluten</translation>
<translation id="7170041865419449892">Utanför intervallet</translation>
<translation id="4804818685124855865">Koppla från</translation>
<translation id="2544853746127077729">Autentiseringscertifikatet godkändes inte av nätverket</translation>
<translation id="5222676887888702881">Logga ut</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Konfiguration</translation>
<translation id="1272079795634619415">Stopp</translation>
<translation id="4957722034734105353">Läs mer ...</translation>
<translation id="2964193600955408481">Inaktivera Wi-Fi</translation>
-<translation id="811680302244032017">Lägg till enhet ...</translation>
<translation id="4279490309300973883">Spegling</translation>
+<translation id="7973962044839454485">PPP-autentisering misslyckades på grund av felaktigt användarnamn eller lösenord</translation>
<translation id="2509468283778169019">CAPS LOCK är på</translation>
<translation id="3892641579809465218">Intern bildskärm</translation>
<translation id="7823564328645135659">Chromes språk har ändrats från <ph name="FROM_LOCALE"/> till <ph name="TO_LOCALE"/> efter synkronisering av dina inställningar.</translation>
<translation id="3368922792935385530">Ansluten</translation>
<translation id="8340999562596018839">Talad feedback</translation>
<translation id="8654520615680304441">Aktivera Wi-Fi ...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Inmatningsmetoden har ändrats till <ph name="INPUT_METHOD_ID"/>.
Tryck på Skift + Alt om du vill byta.</translation>
<translation id="2562916301614567480">Privat nätverk</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317"><ph name="PERCENTAGE"/> % återstår</translation>
<translation id="9089416786594320554">Inmatningsmetoder</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/> %</translation>
+<translation id="2825619548187458965">Hylla</translation>
<translation id="2614835198358683673">Din Chromebook kanske inte laddas medan den är på. Överväg att använda den officiella laddaren.</translation>
<translation id="1895658205118569222">Stängning</translation>
<translation id="4430019312045809116">Volym</translation>
+<translation id="8681498213689260554">Starta om och utför en powerwash för att uppdatera</translation>
<translation id="4442424173763614572">DNS-sökning misslyckades</translation>
-<translation id="6356500677799115505">Batteriet är fullt och laddas.</translation>
<translation id="7874779702599364982">Söker efter mobilnätverk ...</translation>
<translation id="583281660410589416">Okänt</translation>
<translation id="1383876407941801731">Sökning</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">Nätverksinformation</translation>
<translation id="1621499497873603021">Tid som återstår tills batteriet är tomt: <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Avsluta gästsession</translation>
-<translation id="4471417012762451363">Batteriet är fullt till <ph name="PERCENTAGE"/> % och laddas</translation>
<translation id="8308637677604853869">Föregående meny</translation>
<translation id="4666297444214622512">Det går inte att logga in på ett annat konto.</translation>
<translation id="1346748346194534595">Höger</translation>
@@ -114,6 +120,7 @@ Inaktivera genom att trycka Ctrl+Alt+Z.</translation>
<translation id="6312403991423642364">Okänt nätverksfel</translation>
<translation id="1467432559032391204">Vänster</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Aktiverar <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Maximera</translation>
@@ -123,7 +130,6 @@ Inaktivera genom att trycka Ctrl+Alt+Z.</translation>
<translation id="2727977024730340865">Ansluten till en laddare med låg effekt. Batteriet kanske inte laddas ordentligt.</translation>
<translation id="3784455785234192852">Lås</translation>
<translation id="2805756323405976993">Appar</translation>
-<translation id="8871072142849158571">Storleken på <ph name="DISPLAY_NAME"/> har ändrats till <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Aktiveringsfel</translation>
<translation id="5097002363526479830">Det gick inte att ansluta till nätverket <ph name="NAME"/>: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi är inaktiverat.</translation>
@@ -131,6 +137,7 @@ Inaktivera genom att trycka Ctrl+Alt+Z.</translation>
<translation id="7052914147756339792">Ange bakgrund ...</translation>
<translation id="8678698760965522072">Onlineläge</translation>
<translation id="2532589005999780174">Högkontrastläge</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Internt fel</translation>
<translation id="3019353588588144572">Tid som återstår tills batteriet är fulladdat: <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Skärmförstorare</translation>
@@ -153,20 +160,24 @@ Meddelande från servern: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Avsluta session</translation>
<translation id="8454013096329229812">Wi-Fi är aktiverat.</translation>
<translation id="4872237917498892622">Alt + Sök eller Skift</translation>
+<translation id="9201131092683066720">Batteriet är fullt till <ph name="PERCENTAGE"/> %.</translation>
<translation id="2983818520079887040">Inställningar...</translation>
+<translation id="1195412055398077112">överskanning</translation>
<translation id="1717216362413677834">Dockningsläge</translation>
+<translation id="112308213915226829">Dölj hylla automatiskt</translation>
<translation id="8927026611342028580">Anslutning begärd</translation>
<translation id="8300849813060516376">Det gick inte att etablera tjänsten over-the-air.</translation>
<translation id="2792498699870441125">Alt + Sök</translation>
<translation id="8660803626959853127">Synkroniserar <ph name="COUNT"/> filer</translation>
+<translation id="5958529069007801266">Övervakad användare</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK är av</translation>
<translation id="6248847161401822652">Avsluta genom att trycka på Ctrl + Skift + Q två gånger.</translation>
+<translation id="6785414152754474415">Batteriet är fullt till <ph name="PERCENTAGE"/> % och laddas.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Aktiverar ...</translation>
+<translation id="4895488851634969361">Batteriet är fullt.</translation>
<translation id="1391854757121130358">Du kanske har slut på mobildata.</translation>
-<translation id="5413208160176941586">Lokalt hanterad användare</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Startfältets position</translation>
+<translation id="5947494881799873997">Återgå</translation>
<translation id="7593891976182323525">Sök eller Skift</translation>
<translation id="7649070708921625228">Hjälp</translation>
<translation id="3050422059534974565">CAPS LOCK är på. Avbryt genom att trycka på Sök eller Shift.</translation>
@@ -178,21 +189,23 @@ Meddelande från servern: <ph name="SERVER_MSG"/></translation>
<translation id="6692173217867674490">Ogiltig lösenfras</translation>
<translation id="6165508094623778733">Läs mer</translation>
<translation id="9046895021617826162">Kunde inte ansluta</translation>
+<translation id="7168224885072002358">Återgår till den gamla upplösningen om <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Sessionen avslutas om <ph name="SESSION_TIME_REMAINING"/>. Du kommer att loggas ut automatiskt.</translation>
<translation id="8372369524088641025">Felaktig WEP-nyckel</translation>
<translation id="6636709850131805001">Okänt tillstånd</translation>
<translation id="3573179567135747900">Byt tillbaka till &quot;<ph name="FROM_LOCALE"/>&quot; (kräver omstart)</translation>
<translation id="8103386449138765447">SMS-meddelanden: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Inställningar för Google Drive ...</translation>
-<translation id="1510238584712386396">Startprogram</translation>
<translation id="7209101170223508707">CAPS LOCK är på. Avbryt genom att trycka på Alt + Sök eller Skift.</translation>
<translation id="8940956008527784070">Låg batterinivå (<ph name="PERCENTAGE"/> %)</translation>
+<translation id="4918086044614829423">Acceptera</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> kvar</translation>
<translation id="520760366042891468">Delar kontrollen över din skärm via Hangouts.</translation>
<translation id="8000066093800657092">Inget nätverk</translation>
<translation id="4015692727874266537">Logga in på ett annat konto …</translation>
<translation id="5941711191222866238">Minimera</translation>
<translation id="6911468394164995108">Anslut till andra ...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> h <ph name="MINUTE"/> m till fulladdat</translation>
<translation id="6359806961507272919">SMS från <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Operatör</translation>
diff --git a/chromium/ash/strings/ash_strings_sw.xtb b/chromium/ash/strings/ash_strings_sw.xtb
index 8ee3b5f47f3..ab296ff9543 100644
--- a/chromium/ash/strings/ash_strings_sw.xtb
+++ b/chromium/ash/strings/ash_strings_sw.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="sw">
<translation id="3595596368722241419">Betri imejaa</translation>
-<translation id="5250713215130379958">Kizinduzi cha Kuficha otomatiki</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> na <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Hali ya lango</translation>
<translation id="30155388420722288">Kitufe Jalizi</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth imewezeshwa</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> ilizungushwa hadi <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth imelemazwa</translation>
+<translation id="7165320105431587207">Ilishindwa kusanidi mtandao</translation>
<translation id="3775358506042162758">Unaweza tu kuwa na hadi akaunti tatu zilizoingiwa kwa wakati mmoja</translation>
<translation id="370649949373421643">Wezesha Wi-Fi</translation>
<translation id="3626281679859535460">Ung'aavu</translation>
+<translation id="595202126637698455">Ufuatiliaji wa utendaji umewashwa</translation>
<translation id="8054466585765276473">Inakokotoa muda wa betri.</translation>
<translation id="7982789257301363584">Mtandao</translation>
<translation id="5565793151875479467">Proksi...</translation>
<translation id="938582441709398163">Mtandazo wa Kibodi</translation>
<translation id="4387004326333427325">Cheti cha uthibitishaji kimekataliwa kwa mbali</translation>
<translation id="6979158407327259162">Hifadhi ya Google</translation>
+<translation id="3683428399328702079">Ubora wa <ph name="DISPLAY_NAME"/> ulibadilishwa hadi <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP imeshindikana</translation>
<translation id="2297568595583585744">Treya ya hali</translation>
<translation id="1661867754829461514">PIN inakosekana</translation>
@@ -34,39 +38,41 @@ Bonyeza Shift + Alt ili kubadilisha.</translation>
<translation id="2127372758936585790">Chaja ya nguvu ya chini</translation>
<translation id="3846575436967432996">Hakuna maelezo ya mtandao yanayopatikana</translation>
<translation id="3026237328237090306">Sanidi data ya simu</translation>
+<translation id="5871632337994001636">Simamia vifaa...</translation>
<translation id="785750925697875037">Ona akaunti ya simu ya mkononi</translation>
<translation id="153454903766751181">Inaanzisha modemu ya simu za mkononi...</translation>
<translation id="4628814525959230255">Inashiriki udhibiti wa skrini yako na <ph name="HELPER_NAME"/> kupitia Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> limezungushwa</translation>
<translation id="7864539943188674973">Lemaza Bluetooth</translation>
<translation id="939252827960237676">Imeshindwa kuhifadhi picha ya skrini</translation>
<translation id="3126069444801937830">Anzisha upya ili kusasisha</translation>
<translation id="2268813581635650749">Ondoa wote</translation>
<translation id="735745346212279324">VPN imekatwa muunganisho</translation>
<translation id="7320906967354320621">Tulivu</translation>
-<translation id="6303423059719347535">Betri imejaa <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">Kishale kikubwa cha kipanya</translation>
-<translation id="2778346081696727092">Imeshindwa kuthibitisha kwa jina la mtumiaji au nenosiri lililotolewa</translation>
<translation id="3294437725009624529">Mgeni</translation>
<translation id="8190698733819146287">Geuza lugha na uingizaji kukufaa...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Nafasi ya rafu</translation>
<translation id="2903907270192926896">INGIZO</translation>
<translation id="8676770494376880701">Chaja ya nguvu ya chini imeunganishwa</translation>
<translation id="7170041865419449892">Nje ya eneo</translation>
<translation id="4804818685124855865">Tenganisha</translation>
<translation id="2544853746127077729">Cheti cha uthibitishaji kimekataliwa na mtandao</translation>
<translation id="5222676887888702881">Ondoka</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Usanidi</translation>
<translation id="1272079795634619415">Simamisha</translation>
<translation id="4957722034734105353">Pata maelezo zaidi...</translation>
<translation id="2964193600955408481">Lemaza Wi-Fi</translation>
-<translation id="811680302244032017">Ongeza kifaa...</translation>
<translation id="4279490309300973883">Kuakisi</translation>
+<translation id="7973962044839454485">Uthibitishaji wa PPP ulishindwa kutokana na jina la mtumiaji na nenosiri lisilo sahihi</translation>
<translation id="2509468283778169019">Caps Lock imewashwa.</translation>
<translation id="3892641579809465218">Onyesho la Ndani</translation>
<translation id="7823564328645135659">Lugha imebadilika kutoka &quot;<ph name="FROM_LOCALE"/> &quot;na kuwa&quot; <ph name="TO_LOCALE"/>&quot; baada ya kulinganisha mipangilio yako.</translation>
<translation id="3368922792935385530">Umeunganishwa</translation>
<translation id="8340999562596018839">Maoni ya yaliyotamkwa</translation>
<translation id="8654520615680304441">Washa Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Mbinu ingizo yako imebadilika hadi <ph name="INPUT_METHOD_ID"/>.
Bonyeza Shift + Alt ili kubadili.</translation>
<translation id="2562916301614567480">Mtandao Binafsi</translation>
@@ -83,11 +89,12 @@ Bonyeza Shift + Alt ili kubadili.</translation>
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% inayobaki</translation>
<translation id="9089416786594320554">Mbinu Ingizo</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Rafu</translation>
<translation id="2614835198358683673">Chromebook yako huenda isichaji ikiwa imewashwa. Fikiria kutumia chaja rasmi.</translation>
<translation id="1895658205118569222">Funga</translation>
<translation id="4430019312045809116">Kiwango</translation>
+<translation id="8681498213689260554">Zima na uwashe na Powerwash ili kusasisha</translation>
<translation id="4442424173763614572">Mwonekano wa DNS umeshindikana</translation>
-<translation id="6356500677799115505">Betri imejaa na inachajiwa.</translation>
<translation id="7874779702599364982">Inatafuta mitandao ya simu za mkononi...</translation>
<translation id="583281660410589416">Siojulikana</translation>
<translation id="1383876407941801731">Tafuta</translation>
@@ -96,7 +103,6 @@ Bonyeza Shift + Alt ili kubadili.</translation>
<translation id="2204305834655267233">Maelezo ya Mtandao</translation>
<translation id="1621499497873603021">Muda unaosalia mpaka betri inapoisha, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Maliza Ugeni</translation>
-<translation id="4471417012762451363">Betri imejaa <ph name="PERCENTAGE"/>% na inachaji</translation>
<translation id="8308637677604853869">Menyu ya awali</translation>
<translation id="4666297444214622512">Huwezi kuingia katika akaunti nyingine.</translation>
<translation id="1346748346194534595">Kulia</translation>
@@ -114,6 +120,7 @@ Bonyeza Ctrl+Alt+Z ili ufunge.</translation>
<translation id="6312403991423642364">Hitilafu isiyojulikana ya mtandao</translation>
<translation id="1467432559032391204">Kushoto</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Inaanza kutumia <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Tanua</translation>
@@ -123,7 +130,6 @@ Bonyeza Ctrl+Alt+Z ili ufunge.</translation>
<translation id="2727977024730340865">Imechomekwa katika chaja ya kawi ya chini. Huenda kuchaji kwa betri hakutakuwa kuzuri.</translation>
<translation id="3784455785234192852">Funga</translation>
<translation id="2805756323405976993">Programu</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> imebadilishwa ukubwa kuwa <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Kushindwa kwa uamilishaji</translation>
<translation id="5097002363526479830">Imeshindwa kuunganisha kwenye mtandao '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi imezimwa.</translation>
@@ -131,6 +137,7 @@ Bonyeza Ctrl+Alt+Z ili ufunge.</translation>
<translation id="7052914147756339792">Weka Mandhari...</translation>
<translation id="8678698760965522072">Hali ya mtandaoni</translation>
<translation id="2532589005999780174">Hali ya juu ya utofautishaji</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Hitilafu ya ndani</translation>
<translation id="3019353588588144572">Muda unaosalia hadi betri itakapochajiwa kikamilifu, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Kikuza skrini</translation>
@@ -153,20 +160,24 @@ Ujumbe wa seza: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Toka kwenye kipindi</translation>
<translation id="8454013096329229812">Wi-Fi imewashwa.</translation>
<translation id="4872237917498892622">Alt + Utafutaji au Hama</translation>
+<translation id="9201131092683066720">Betri imejaa <ph name="PERCENTAGE"/>%.</translation>
<translation id="2983818520079887040">Mipangilio...</translation>
+<translation id="1195412055398077112">angalia kwa ujumla:</translation>
<translation id="1717216362413677834">Hali ya kufungwa</translation>
+<translation id="112308213915226829">Ficha rafu kiotomatiki</translation>
<translation id="8927026611342028580">Muunganisho Umeombwa</translation>
<translation id="8300849813060516376">OTASP imeshindikana</translation>
<translation id="2792498699870441125">Alt + Utafutaji</translation>
<translation id="8660803626959853127">Inalinganisha faili <ph name="COUNT"/></translation>
+<translation id="5958529069007801266">Mtumiaji anayesimamiwa</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK imezimwa</translation>
<translation id="6248847161401822652">Bofya &quot;Control&quot; na &quot;Shift&quot; na Q kwa pamoja mara mbili ili kuacha.</translation>
+<translation id="6785414152754474415">Betri imejaa <ph name="PERCENTAGE"/>% na inachaji.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Inaanza kutumia...</translation>
+<translation id="4895488851634969361">Betri imejaa.</translation>
<translation id="1391854757121130358">Inawezekana umemaliza mgawo wako wa data ya simu ya mkononi.</translation>
-<translation id="5413208160176941586">Mtumiaji anayedhibitiwa karibu</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Sehemu ya kizinduzi</translation>
+<translation id="5947494881799873997">Rejesha</translation>
<translation id="7593891976182323525">Utafutaji au Hama</translation>
<translation id="7649070708921625228">Usaidizi</translation>
<translation id="3050422059534974565">CAPS LOCK imeamilishwa.
@@ -179,22 +190,24 @@ Bonyeza Alt + Utafutaji au Hama ili kughairi.</translation>
<translation id="6692173217867674490">Kaulisiri mbovu</translation>
<translation id="6165508094623778733">Pata maelezo zaidi</translation>
<translation id="9046895021617826162">Muunganisho umeshindikana</translation>
+<translation id="7168224885072002358">Inarejesha katika ubora wa zamani baada ya <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Kipindi hiki kitaisha katika <ph name="SESSION_TIME_REMAINING"/>. Utaondolewa kiotomatiki.</translation>
<translation id="8372369524088641025">Kitufe kibovu cha WEP</translation>
<translation id="6636709850131805001">Hali isiyotambulika</translation>
<translation id="3573179567135747900">Badilisha hadi &quot;<ph name="FROM_LOCALE"/>&quot; (inahitaji uzime na uwashe)</translation>
<translation id="8103386449138765447">Ujumbe wa SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Mipangilio ya Hifadhi ya Google...</translation>
-<translation id="1510238584712386396">Kizindua</translation>
<translation id="7209101170223508707">CAPS LOCK imeamilishwa.
Bonyeza Alt + Utafutaji au Hama ili kughairi.</translation>
<translation id="8940956008527784070">Betri inaisha (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Kubali</translation>
<translation id="5102001756192215136">Imesalia <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Kushiriki udhibiti wa skrini yako kupitia Hangouts.</translation>
<translation id="8000066093800657092">Hakuna mtandao</translation>
<translation id="4015692727874266537">Ingia katika akaunti nyingine...</translation>
<translation id="5941711191222866238">Punguza</translation>
<translation id="6911468394164995108">Jiunge na mwingine...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">Saa<ph name="HOUR"/> dakika<ph name="MINUTE"/> ili ijae</translation>
<translation id="6359806961507272919">SMS kutoka <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Mtoa huduma</translation>
diff --git a/chromium/ash/strings/ash_strings_ta.xtb b/chromium/ash/strings/ash_strings_ta.xtb
index dce0b3ef07c..097fe33a02c 100644
--- a/chromium/ash/strings/ash_strings_ta.xtb
+++ b/chromium/ash/strings/ash_strings_ta.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ta">
<translation id="3595596368722241419">பேட்டரி நிரம்பியது</translation>
-<translation id="5250713215130379958">தொடக்கத்தை தானாக மறை</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> மற்றும் <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">போர்ட்டல் நிலை</translation>
<translation id="30155388420722288">மிகைப்படுத்தி பொத்தான்</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth இயக்கப்பட்டது</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> <ph name="ROTATION"/> ஆகச் சுழற்றப்பட்டது</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth முடக்கப்பட்டது</translation>
+<translation id="7165320105431587207">பிணையத்தை உள்ளமைப்பது தோல்வியடைந்தது</translation>
<translation id="3775358506042162758">பல உள்நுழைவில் மூன்று கணக்குகள் வரை மட்டுமே வைத்திருக்கலாம்.</translation>
<translation id="370649949373421643">Wi-fi ஐ இயக்கு</translation>
<translation id="3626281679859535460">ஒளிர்வு</translation>
+<translation id="595202126637698455">செயல்திறனைத் தடமறிதல் இயக்கப்பட்டுள்ளது</translation>
<translation id="8054466585765276473">பேட்டரி நேரத்தைக் கணக்கிடுகிறது.</translation>
<translation id="7982789257301363584">நெட்வொர்க்</translation>
<translation id="5565793151875479467">ப்ராக்ஸி...</translation>
<translation id="938582441709398163">விசைப்பலகை மேல்தோற்றம்</translation>
<translation id="4387004326333427325">அங்கீகரிப்புச் சான்றிதழ் தொலைநிலையில் நிராகரிக்கப்பட்டது</translation>
<translation id="6979158407327259162">Google இயக்ககம்</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> தெளிவுத்திறன் <ph name="RESOLUTION"/> க்கு மாற்றப்பட்டது</translation>
<translation id="6943836128787782965">HTTP தோல்வியடைந்தது</translation>
<translation id="2297568595583585744">நிலைத் தட்டு</translation>
<translation id="1661867754829461514">PIN இல்லை</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">குறைந்த சக்திகொண்ட சார்ஜர்</translation>
<translation id="3846575436967432996">நெட்வொர்க் தகவல் எதுவும் இல்லை</translation>
<translation id="3026237328237090306">மொபைல் தரவை அமை</translation>
+<translation id="5871632337994001636">சாதனங்களை நிர்வகி...</translation>
<translation id="785750925697875037">மொபைல் கணக்கைப் பார்க்கவும்</translation>
<translation id="153454903766751181">செல்லுலார் பயன்முறையைத் துவக்குகிறது...</translation>
<translation id="4628814525959230255">Hangouts வழியாக <ph name="HELPER_NAME"/> உடன் உங்கள் திரையின் கட்டுப்பாட்டைப் பகிர்கிறது.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> சுழற்றப்பட்டது</translation>
<translation id="7864539943188674973">Bluetooth ஐ முடக்கு</translation>
<translation id="939252827960237676">ஸ்கிரீன் ஷாட்டை சேமிப்பதில் தோல்வி</translation>
<translation id="3126069444801937830">புதுப்பிக்க மீண்டும் தொடங்குக</translation>
<translation id="2268813581635650749">அனைவரையும் வெளியேற்று</translation>
<translation id="735745346212279324">VPN துண்டிக்கப்பட்டது</translation>
<translation id="7320906967354320621">செயலின்றி</translation>
-<translation id="6303423059719347535"><ph name="PERCENTAGE"/>% பேட்டரி நிரம்பியது</translation>
<translation id="15373452373711364">பெரிய மவுஸ் இடஞ்சுட்டி</translation>
-<translation id="2778346081696727092">வழங்கப்பட்ட பயனர் பெயர் அல்லது கடவுச்சொல்லை அங்கீகரிப்பதில் தோல்வி</translation>
<translation id="3294437725009624529">விருந்தினர்</translation>
<translation id="8190698733819146287">மொழிகள் மற்றும் உள்ளீடைத் தனிப்பயனாக்கு...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">அடுக்கின் நிலை</translation>
<translation id="2903907270192926896">உள்ளீடு</translation>
<translation id="8676770494376880701">குறைந்த சக்தியிலான சார்ஜர் இணைக்கப்பட்டுள்ளது</translation>
<translation id="7170041865419449892">வரம்புக்கு வெளியே</translation>
<translation id="4804818685124855865">தொடர்பைத் துண்டி</translation>
<translation id="2544853746127077729">அங்கீகரிப்புச் சான்றிதழ் பிணையத்தால் நிராகரிக்கப்பட்டது</translation>
<translation id="5222676887888702881">வெளியேறு</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">உள்ளமைவு</translation>
<translation id="1272079795634619415">நிறுத்து</translation>
<translation id="4957722034734105353">மேலும் அறிக...</translation>
<translation id="2964193600955408481">Wi-Fi ஐ முடக்கு</translation>
-<translation id="811680302244032017">சாதனத்தைச் சேர்க்கவும்...</translation>
<translation id="4279490309300973883">பிரதிபலிக்கிறது</translation>
+<translation id="7973962044839454485">தவறான பயனர்பெயர் அல்லது கடவுச்சொல் காரணமாக PPP அங்கீகாரம் தோல்வியடைந்தது</translation>
<translation id="2509468283778169019">CAPS LOCK இயக்கத்தில்</translation>
<translation id="3892641579809465218">இணையக் காட்சி</translation>
<translation id="7823564328645135659">உங்கள் அமைப்புகளை ஒத்திசைத்த பிறகு, மொழியானது &quot;<ph name="FROM_LOCALE"/>&quot; இலிருந்து &quot;<ph name="TO_LOCALE"/>&quot; க்கு மாற்றப்பட்டுள்ளது.</translation>
<translation id="3368922792935385530">இணைக்கப்பட்டது</translation>
<translation id="8340999562596018839">பேச்சுவடிவ கருத்து</translation>
<translation id="8654520615680304441">Wi-Fi ஐ இயக்கு...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">உங்கள் உள்ளீட்டு முறையானது <ph name="INPUT_METHOD_ID"/> க்கு மாற்றப்பட்டது.
மாற்ற Shift + Alt ஐ அழுத்தவும்.</translation>
<translation id="2562916301614567480">தனிப்பட்ட நெட்வொர்க்</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% மீதமுள்ளது</translation>
<translation id="9089416786594320554">உள்ளீட்டு முறைகள்</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">அடுக்கு</translation>
<translation id="2614835198358683673">உங்கள் Chromebook இயக்கத்தில் இருக்கும்போது சார்ஜ் செய்ய முடியாது. அதிகாரப்பூர்வ சார்ஜரைப் பயன்படுத்தவும்.</translation>
<translation id="1895658205118569222">நிறுத்தம்</translation>
<translation id="4430019312045809116">அளவு</translation>
+<translation id="8681498213689260554">புதுப்பிப்பதற்கு மீண்டும் தொடங்கி, பவர்வாஷ் செய்க</translation>
<translation id="4442424173763614572">DNS தேடுதல் தோல்வி</translation>
-<translation id="6356500677799115505">பேட்டரி நிரம்பியது மேலும் சார்ஜ் ஆகிறது.</translation>
<translation id="7874779702599364982">செல்லுலார் நெட்வொர்க்குகளைத் தேடுகிறது...</translation>
<translation id="583281660410589416">அறியப்படாத</translation>
<translation id="1383876407941801731">தேடு</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">பிணைய தகவல்</translation>
<translation id="1621499497873603021">இன்னும் <ph name="TIME_LEFT"/> இல் பேட்டரி காலியாகிவிடும்</translation>
<translation id="5980301590375426705">விருந்தினரிலிருந்து வெளியேறவும்</translation>
-<translation id="4471417012762451363"><ph name="PERCENTAGE"/>% பேட்டரி நிரம்பியது மேலும் சார்ஜ் ஆகிறது</translation>
<translation id="8308637677604853869">முந்தைய மெனு</translation>
<translation id="4666297444214622512">இன்னொரு கணக்கில் உள்நுழைய முடியாது.</translation>
<translation id="1346748346194534595">வலது</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">அறியப்படாத பிணையப் பிழை</translation>
<translation id="1467432559032391204">இடது</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> ஐச் செயல்படுத்துகிறது</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">பெரிதாக்கு</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">குறைந்த சக்தியிலான சார்ஜர் செருகப்பட்டுள்ளது. பேட்டரி சார்ஜிங் நம்பகமானதாக இல்லாமல் இருக்கலாம்.</translation>
<translation id="3784455785234192852">பூட்டு</translation>
<translation id="2805756323405976993">ஆப்ஸ்</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> ஆனது <ph name="RESOLUTION"/> க்கு மாற்றியமைக்கப்பட்டது</translation>
<translation id="1512064327686280138">செயலாக்கம் தோல்வி</translation>
<translation id="5097002363526479830">'<ph name="NAME"/>' நெட்வொர்க்குடன் இணைப்பதில் தோல்வி: <ph name="DETAILS"/> </translation>
<translation id="1850504506766569011">Wi-Fi முடக்கத்தில் உள்ளது.</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">வால்பேப்பரை அமை...</translation>
<translation id="8678698760965522072">ஆன்லைன் நிலை</translation>
<translation id="2532589005999780174">அதிக ஒளி மாறுபாட்டுப் பயன்முறை</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">அகப் பிழை</translation>
<translation id="3019353588588144572"><ph name="TIME_REMAINING"/> இல் பேட்டரி முழுவதும் சார்ஜ் ஆகிவிடும்</translation>
<translation id="3473479545200714844">திரை உருப்பெருக்கி</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">அமர்விலிருந்து வெளியேறவும்</translation>
<translation id="8454013096329229812">Wi-Fi இயக்கத்தில் உள்ளது.</translation>
<translation id="4872237917498892622">Alt+Search அல்லது Shift</translation>
+<translation id="9201131092683066720">பேட்டரி <ph name="PERCENTAGE"/>% நிரம்பியது.</translation>
<translation id="2983818520079887040">அமைப்புகள்...</translation>
+<translation id="1195412055398077112">ஓவர்ஸ்கேன்</translation>
<translation id="1717216362413677834">டாக் பயன்முறை</translation>
+<translation id="112308213915226829">அடுக்கைத் தானாக மறை</translation>
<translation id="8927026611342028580">இணைக்க கோரப்பட்டது</translation>
<translation id="8300849813060516376">OTASP தோல்வியுற்றது</translation>
<translation id="2792498699870441125">Alt+Search</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> கோப்பு(களை) ஒத்திசைக்கிறது</translation>
+<translation id="5958529069007801266">கண்காணிக்கப்படும் பயனர்</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK முடக்கப்பட்டுள்ளது</translation>
<translation id="6248847161401822652">வெளியேற Control Shift Q ஐ இருமுறை அழுத்தவும்.</translation>
+<translation id="6785414152754474415">பேட்டரி <ph name="PERCENTAGE"/>% நிரம்பியது, மேலும் சார்ஜ் ஆகிறது.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: செயல்படுத்துகிறது...</translation>
+<translation id="4895488851634969361">பேட்டரி நிரம்பியது.</translation>
<translation id="1391854757121130358">உங்களின் அனுமதிக்கப்பட்ட மொபைல் தரவை நீங்கள் பயன்படுத்தி இருக்கலாம்.</translation>
-<translation id="5413208160176941586">உட்புறமாக நிர்வகிக்கப்படும் பயனர்</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">துவக்கி நிலை</translation>
+<translation id="5947494881799873997">மாற்றியமை</translation>
<translation id="7593891976182323525">Search அல்லது Shift</translation>
<translation id="7649070708921625228">உதவி</translation>
<translation id="3050422059534974565">CAPS LOCK இயக்கத்தில் உள்ளது.
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">மோசமான கடவுச்சொற்றொடர்</translation>
<translation id="6165508094623778733">மேலும் அறிக</translation>
<translation id="9046895021617826162">இணைப்பு தோல்வியடைந்தது</translation>
+<translation id="7168224885072002358"><ph name="TIMEOUT_SECONDS"/> வினாடிகளில் பழைய தெளிவுதிறனுக்கு மாற்றியமைக்கப்படும்</translation>
<translation id="973896785707726617">இந்த அமர்வு <ph name="SESSION_TIME_REMAINING"/> நிமிடங்களில் முடியும். நீங்கள் தானாகவே வெளியேற்றப்படுவீர்கள்.</translation>
<translation id="8372369524088641025">மோசமான WEP விசை</translation>
<translation id="6636709850131805001">அறியப்படாத நிலை</translation>
<translation id="3573179567135747900">&quot;<ph name="FROM_LOCALE"/>&quot; க்கு மீண்டும் மாற்று (மறுதொடக்கம் தேவை)</translation>
<translation id="8103386449138765447">SMS செய்திகள்: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google இயக்கக அமைப்புகள்...</translation>
-<translation id="1510238584712386396">துவக்கி</translation>
<translation id="7209101170223508707">CAPS LOCK இயக்கத்தில் உள்ளது.
ரத்துசெய்ய Alt+Search அல்லது Shift ஐ அழுத்தவும்.</translation>
<translation id="8940956008527784070">பேட்டரி குறைவு (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">ஏற்கிறேன்</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> உள்ளது</translation>
<translation id="520760366042891468">Hangouts மூலமாக உங்கள் திரையின் கட்டுப்பாட்டைப் பகிர்கிறது.</translation>
<translation id="8000066093800657092">நெட்வொர்க் இல்லை</translation>
<translation id="4015692727874266537">இன்னொரு கணக்கில் உள்நுழைக...</translation>
<translation id="5941711191222866238">சிறிதாக்கு</translation>
<translation id="6911468394164995108">மற்றொன்றில் சேர்...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">முழுவதும் சார்ஜ் ஆகும் நேரம் - <ph name="HOUR"/>ம <ph name="MINUTE"/>நி</translation>
<translation id="6359806961507272919"><ph name="PHONE_NUMBER"/> என்ற எண்ணிலிருந்து வந்த SMS</translation>
<translation id="1244147615850840081">சேவை வழங்குநர்</translation>
diff --git a/chromium/ash/strings/ash_strings_te.xtb b/chromium/ash/strings/ash_strings_te.xtb
index 9e37d6251b1..5bac372bd69 100644
--- a/chromium/ash/strings/ash_strings_te.xtb
+++ b/chromium/ash/strings/ash_strings_te.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="te">
<translation id="3595596368722241419">బ్యాటరీ నిండింది</translation>
-<translation id="5250713215130379958">లాంచర్‌ను స్వయంచాలకంగా దాచు</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> మరియు <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">పోర్టల్ స్థితి</translation>
<translation id="30155388420722288">అతివ్యాప్తి బటన్</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth ప్రారంభించబడింది</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> <ph name="ROTATION"/>కి తిప్పబడింది</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth నిలిపివేయబడింది</translation>
+<translation id="7165320105431587207">నెట్‌వర్క్‌ని కాన్ఫిగర్ చేయడంలో విఫలమైంది</translation>
<translation id="3775358506042162758">మీరు బహుళ సైన్-ఇన్‌లో గరిష్టంగా మూడు ఖాతాలను మాత్రమే కలిగి ఉండవచ్చు.</translation>
<translation id="370649949373421643">Wi-fiని ప్రారంభించు</translation>
<translation id="3626281679859535460">ప్రకాశం</translation>
+<translation id="595202126637698455">పనితీరుని గుర్తించడం ప్రారంభించబడింది</translation>
<translation id="8054466585765276473">బ్యాటరీ సమయాన్ని లెక్కిస్తోంది.</translation>
<translation id="7982789257301363584">నెట్‌వర్క్</translation>
<translation id="5565793151875479467">ప్రాక్సీ...</translation>
<translation id="938582441709398163">కీబోర్డ్ అవలోకనం</translation>
<translation id="4387004326333427325">ప్రామాణీకరణ ప్రమాణపత్రం రిమోట్‌లో తిరస్కరించబడింది</translation>
<translation id="6979158407327259162">Google డిస్క్</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> రిజల్యూషన్ <ph name="RESOLUTION"/>కి మార్చబడింది</translation>
<translation id="6943836128787782965">HTTP పొందడంలో విఫలమైంది</translation>
<translation id="2297568595583585744">స్థితి ట్రే</translation>
<translation id="1661867754829461514">PIN లేదు</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">తక్కువ-పవర్ గల ఛార్జర్</translation>
<translation id="3846575436967432996">నెట్‌వర్క్ సమాచారం అందుబాటులో లేదు</translation>
<translation id="3026237328237090306">మొబైల్ డేటాను సెటప్ చేయి</translation>
+<translation id="5871632337994001636">పరికరాలను నిర్వహించండి...</translation>
<translation id="785750925697875037">మొబైల్ ఖాతాని వీక్షించండి</translation>
<translation id="153454903766751181">సెల్యులార్ మోడెమ్‌ను ప్రారంభిస్తోంది...</translation>
<translation id="4628814525959230255">మీ స్క్రీన్ యొక్క నియంత్రణ Hangouts ద్వారా <ph name="HELPER_NAME"/>తో భాగస్వామ్యం చేయబడుతోంది.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> తిప్పబడింది</translation>
<translation id="7864539943188674973">Bluetoothని నిలిపివేయి</translation>
<translation id="939252827960237676">స్క్రీన్‌షాట్‌ను సేవ్ చేయడంలో విఫలమైంది</translation>
<translation id="3126069444801937830">నవీకరించడానికి పునఃప్రారంభించండి</translation>
<translation id="2268813581635650749">అందరినీ సైన్ అవుట్ చేయి</translation>
<translation id="735745346212279324">VPN డిస్‌కనెక్ట్ చేయబడింది</translation>
<translation id="7320906967354320621">ఖాళీగా ఉంది</translation>
-<translation id="6303423059719347535">బ్యాటరీ <ph name="PERCENTAGE"/>% నిండింది</translation>
<translation id="15373452373711364">పెద్ద మౌస్ కర్సర్</translation>
-<translation id="2778346081696727092">అందించిన వినియోగదారు పేరుతో లేదా పాస్‌వర్డ్‌తో ప్రామాణీకరించడం విఫలమైంది</translation>
<translation id="3294437725009624529">అతిథి</translation>
<translation id="8190698733819146287">భాషలను అనుకూలీకరించి, ఇన్‌పుట్ చెయ్యి...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">అర స్థానం</translation>
<translation id="2903907270192926896">ఇన్‌పుట్</translation>
<translation id="8676770494376880701">తక్కువ-పవర్ గల ఛార్జర్ కనెక్ట్ చేయబడింది</translation>
<translation id="7170041865419449892">పరిధిని దాటింది</translation>
<translation id="4804818685124855865">డిస్‌కనెక్ట్ చెయ్యి</translation>
<translation id="2544853746127077729">ప్రామాణీకరణ ప్రమాణపత్రం నెట్‌వర్క్ ద్వారా తిరస్కరించబడింది</translation>
<translation id="5222676887888702881">సైన్ ఔట్</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">కాన్ఫిగరేషన్</translation>
<translation id="1272079795634619415">ఆపు</translation>
<translation id="4957722034734105353">మరింత తెలుసుకోండి...</translation>
<translation id="2964193600955408481">Wi-Fiని నిలిపివేయి</translation>
-<translation id="811680302244032017">పరికరాన్ని జోడించు...</translation>
<translation id="4279490309300973883">ప్రతిబింబిస్తుంది</translation>
+<translation id="7973962044839454485">వినియోగదారు పేరు లేదా పాస్‌వర్డ్ తప్పు అయినందున PPP ప్రామాణీకరణ విఫలమైంది</translation>
<translation id="2509468283778169019">CAPS LOCK ఆన్‌లో ఉంది</translation>
<translation id="3892641579809465218">అంతర్గత ప్రదర్శన</translation>
<translation id="7823564328645135659">మీ సెట్టింగ్‌లను సమకాలీకరించిన తర్వాత Chrome యొక్క భాష &quot;<ph name="FROM_LOCALE"/>&quot; నుండి &quot;<ph name="TO_LOCALE"/>&quot;కి మార్చబడింది.</translation>
<translation id="3368922792935385530">కనెక్ట్ అయింది</translation>
<translation id="8340999562596018839">చదవబడే అభిప్రాయం</translation>
<translation id="8654520615680304441">Wi-Fiని ప్రారంభించు...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">మీ ఇన్‌పుట్ పద్ధతి <ph name="INPUT_METHOD_ID"/>కు మార్చబడింది.
మారడానికి Shift + Altను నొక్కండి.</translation>
<translation id="2562916301614567480">ప్రైవేట్ నెట్‌వర్క్</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317"><ph name="PERCENTAGE"/>% మిగిలి ఉంది</translation>
<translation id="9089416786594320554">ఇన్‌పుట్ పద్ధతులు</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">అర</translation>
<translation id="2614835198358683673">మీ Chromebook ప్రారంభించబడినప్పుడు ఛార్జ్ కాకపోవచ్చు. అధికారిక ఛార్జర్‌ను ఉపయోగించడానికి ప్రయత్నించండి.</translation>
<translation id="1895658205118569222">షట్‌డౌన్</translation>
<translation id="4430019312045809116">వాల్యూమ్</translation>
+<translation id="8681498213689260554">నవీకరించడానికి పునఃప్రారంభించి పవర్‌వాష్ చేయండి</translation>
<translation id="4442424173763614572">DNS శోధన విఫలమైంది</translation>
-<translation id="6356500677799115505">బ్యాటరీ నిండింది మరియు చార్జ్ అవుతోంది.</translation>
<translation id="7874779702599364982">సెల్యులార్ నెట్‌వర్క్‌ల కోసం శోధిస్తోంది...</translation>
<translation id="583281660410589416">తెలియనిది</translation>
<translation id="1383876407941801731">శోధన</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">నెట్‌వర్క్ సమాచారం</translation>
<translation id="1621499497873603021">బ్యాటరీ ఖాళీ కావడానికి మిగిలి ఉన్న సమయం, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">అతిథిగా నిష్క్రమించు</translation>
-<translation id="4471417012762451363">బ్యాటరీ <ph name="PERCENTAGE"/>% నిండింది మరియు చార్జ్ అవుతోంది</translation>
<translation id="8308637677604853869">మునుపటి మెను</translation>
<translation id="4666297444214622512">మరో ఖాతాకు సైన్ ఇన్ చేయలేరు.</translation>
<translation id="1346748346194534595">కుడి</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">తెలియని నెట్‌వర్క్ లోపం</translation>
<translation id="1467432559032391204">ఎడమ</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/>ని సక్రియం చేస్తోంది</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">గరిష్ఠీకరించు</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">తక్కువ-పవర్ గల ఛార్జర్‌కు ప్లగిన్ చేయబడింది. బ్యాటరీ ఛార్జింగ్ విశ్వసనీయంగా ఉండకపోవచ్చు.</translation>
<translation id="3784455785234192852">లాక్ చేయి</translation>
<translation id="2805756323405976993">Apps</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> పరిమాణం <ph name="RESOLUTION"/>కి మార్చబడింది</translation>
<translation id="1512064327686280138">సక్రియా విఫలం</translation>
<translation id="5097002363526479830">'<ph name="NAME"/>'కు నెట్‌వర్క్‌కు కనెక్ట్ చేయడానికి విఫలమైంది: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi నిలిపివేయబడింది.</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">వాల్‌పేపర్‌ను సెట్ చేయి...</translation>
<translation id="8678698760965522072">ఆన్‌లైన్ స్థితి</translation>
<translation id="2532589005999780174">అధిక కాంట్రాస్ట్ మోడ్</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">అంతర్గత లోపం</translation>
<translation id="3019353588588144572">బ్యాటరీ నిండటానికి పట్టే సమయం, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">స్క్రీన్ మాగ్నిఫైయర్</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">సెషన్‌ని నిష్క్రమించు</translation>
<translation id="8454013096329229812">Wi-Fi ప్రారంభించబడింది.</translation>
<translation id="4872237917498892622">Alt+Search లేదా Shift</translation>
+<translation id="9201131092683066720">బ్యాటరీ <ph name="PERCENTAGE"/>% నిండింది.</translation>
<translation id="2983818520079887040">సెట్టింగ్‌లు...</translation>
+<translation id="1195412055398077112">ఓవర్‌స్కాన్</translation>
<translation id="1717216362413677834">డాక్ మోడ్</translation>
+<translation id="112308213915226829">అరను స్వయంచాలకంగా దాచు</translation>
<translation id="8927026611342028580">కనెక్ట్ చేయడం అభ్యర్థించబడింది</translation>
<translation id="8300849813060516376">OTASP విఫలమైంది</translation>
<translation id="2792498699870441125">Alt+Search</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> ఫైల్(ల)ను సమకాలీకరిస్తోంది</translation>
+<translation id="5958529069007801266">పర్యవేక్షించబడే వినియోగదారు</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK ఆపివేయబడింది</translation>
<translation id="6248847161401822652">నిష్క్రమించడానికి రెండుసార్లు Control Shift Q నొక్కండి.</translation>
+<translation id="6785414152754474415">బ్యాటరీ <ph name="PERCENTAGE"/>% నిండింది మరియు ఛార్జ్ అవుతోంది.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: సక్రియం చేస్తోంది...</translation>
+<translation id="4895488851634969361">బ్యాటరీ నిండింది.</translation>
<translation id="1391854757121130358">మీరు మీ మొబైల్ డేటా కేటాయింపును ఉపయోగించి ఉండవచ్చు.</translation>
-<translation id="5413208160176941586">స్థానికంగా నిర్వహించబడే వినియోగదారు</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">లాంచర్ స్థానం</translation>
+<translation id="5947494881799873997">తిరిగి పూర్వ స్థితికి మార్చు</translation>
<translation id="7593891976182323525">Search లేదా Shift</translation>
<translation id="7649070708921625228">సహాయం</translation>
<translation id="3050422059534974565">CAPS LOCK ఆన్‌లో ఉంది.
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">తప్పుడు పాస్‌ఫ్రేజ్</translation>
<translation id="6165508094623778733">మరింత తెలుసుకోండి</translation>
<translation id="9046895021617826162">కనెక్ట్ విఫలమైంది</translation>
+<translation id="7168224885072002358"><ph name="TIMEOUT_SECONDS"/>లో తిరిగి పాత రిజల్యూషన్‌కి మార్చబడుతోంది</translation>
<translation id="973896785707726617">ఈ సెషన్ <ph name="SESSION_TIME_REMAINING"/> తర్వాత ముగుస్తుంది. మీరు స్వయంచాలకంగా సైన్ అవుట్ చేయబడతారు.</translation>
<translation id="8372369524088641025">తప్పుడు WEP కీ</translation>
<translation id="6636709850131805001">గుర్తించబడని రాష్ట్రం</translation>
<translation id="3573179567135747900">&quot;<ph name="FROM_LOCALE"/>&quot;కు వెనుకకి మార్చండి (పునఃప్రారంభం అవసరం)</translation>
<translation id="8103386449138765447">SMS సందేశాలు: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google డిస్క్ సెట్టింగ్‌లు...</translation>
-<translation id="1510238584712386396">లాంచర్</translation>
<translation id="7209101170223508707">CAPS LOCK ఆన్‌లో ఉంది.
రద్దు చేయడానికి Alt+Search లేదా Shiftని నొక్కండి.</translation>
<translation id="8940956008527784070">బ్యాటరీ తక్కువగా ఉంది (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">ఆమోదించు</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> మిగిలి ఉంది</translation>
<translation id="520760366042891468">మీ స్క్రీన్ యొక్క నియంత్రణ Hangouts ద్వారా భాగస్వామ్యం చేయబడుతోంది.</translation>
<translation id="8000066093800657092">ఏ నెట్‌వర్క్ లేదు</translation>
<translation id="4015692727874266537">మరో ఖాతాతో సైన్ ఇన్ చేయి...</translation>
<translation id="5941711191222866238">కనిష్టీకరించు</translation>
<translation id="6911468394164995108">మరొక దానిలో చేరండి...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">నిండే వరకు <ph name="HOUR"/>h <ph name="MINUTE"/>m అవుతుంది</translation>
<translation id="6359806961507272919"><ph name="PHONE_NUMBER"/> నుండి SMS</translation>
<translation id="1244147615850840081">కారియర్</translation>
diff --git a/chromium/ash/strings/ash_strings_th.xtb b/chromium/ash/strings/ash_strings_th.xtb
index a749f023b66..c0d786c12c0 100644
--- a/chromium/ash/strings/ash_strings_th.xtb
+++ b/chromium/ash/strings/ash_strings_th.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="th">
<translation id="3595596368722241419">แบตเตอรี่เต็ม</translation>
-<translation id="5250713215130379958">ตัวเรียกใช้งานแบบซ่อนอัตโนมัติ</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> กับ <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">สถานะพอร์ทัล</translation>
<translation id="30155388420722288">ปุ่มแบบโอเวอร์โฟลว์</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">เปิดใช้งานบลูทูธแล้ว</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> หมุนเวียนเป็น <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">บลูทูธ</translation>
<translation id="2268130516524549846">ปิดใช้งานบลูทูธแล้ว</translation>
+<translation id="7165320105431587207">ล้มเหลวในการกำหนดค่าเครือข่าย</translation>
<translation id="3775358506042162758">คุณสามารถมีได้มากสุดสามบัญชีเท่านั้นในการลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี</translation>
<translation id="370649949373421643">เปิดใช้งาน Wi-Fi</translation>
<translation id="3626281679859535460">ความสว่าง</translation>
+<translation id="595202126637698455">เปิดใช้งานการติดตามการปฏิบัติงานแล้ว</translation>
<translation id="8054466585765276473">กำลังคำนวณเวลาใช้งานแบตเตอรี่</translation>
<translation id="7982789257301363584">เครือข่าย</translation>
<translation id="5565793151875479467">พร็อกซี...</translation>
<translation id="938582441709398163">การวางซ้อนแป้นพิมพ์</translation>
<translation id="4387004326333427325">ใบรับรองการตรวจสอบสิทธิ์ได้รับการปฏิเสธจากระยะไกล</translation>
<translation id="6979158407327259162">Google ไดรฟ์</translation>
+<translation id="3683428399328702079">ความละเอียดของ <ph name="DISPLAY_NAME"/> เปลี่ยนเป็น <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">การรับ HTTP ล้มเหลว</translation>
<translation id="2297568595583585744">ถาดสถานะ</translation>
<translation id="1661867754829461514">ไม่พบ PIN</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">ที่ชาร์จพลังงานต่ำ</translation>
<translation id="3846575436967432996">ไม่มีข้อมูลเครือข่ายที่สามารถใช้งานได้</translation>
<translation id="3026237328237090306">ตั้งค่าข้อมูลมือถือ</translation>
+<translation id="5871632337994001636">จัดการอุปกรณ์...</translation>
<translation id="785750925697875037">ดูบัญชีมือถือ</translation>
<translation id="153454903766751181">กำลังเริ่มต้นโมเด็มมือถือ...</translation>
<translation id="4628814525959230255">กำลังแชร์การควบคุมหน้าจอของคุณด้วย <ph name="HELPER_NAME"/> ผ่านแฮงเอาท์</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> ถูกหมุนเวียน</translation>
<translation id="7864539943188674973">ปิดใช้งานบลูทูธ</translation>
<translation id="939252827960237676">ไม่สามารถบันทึกภาพหน้าจอ</translation>
<translation id="3126069444801937830">รีสตาร์ทเพื่ออัปเดต</translation>
<translation id="2268813581635650749">ออกจากระบบทั้งหมด</translation>
<translation id="735745346212279324">ยกเลิกการเชื่อมต่อ VPN แล้ว</translation>
<translation id="7320906967354320621">ไม่ทำงาน</translation>
-<translation id="6303423059719347535">มีแบตเตอรี่ <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">เคอร์เซอร์เมาส์ขนาดใหญ่</translation>
-<translation id="2778346081696727092">ไม่สามารถตรวจสอบสิทธิ์ชื่อผู้ใช้หรือรหัสผ่านที่ให้มาได้</translation>
<translation id="3294437725009624529">ผู้มาเยือน</translation>
<translation id="8190698733819146287">กำหนดค่าภาษาและการป้อนข้อมูล... </translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">ตำแหน่งของชั้นวาง</translation>
<translation id="2903907270192926896">อินพุต</translation>
<translation id="8676770494376880701">เชื่อมต่อกับที่ชาร์จพลังงานต่ำ</translation>
<translation id="7170041865419449892">อยู่นอกระยะสัญญาณ</translation>
<translation id="4804818685124855865">ตัดการเชื่อมต่อ</translation>
<translation id="2544853746127077729">ใบรับรองการตรวจสอบสิทธิ์ได้รับการปฏิเสธจากเครือข่าย</translation>
<translation id="5222676887888702881">ออกจากระบบ</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">การกำหนดค่า</translation>
<translation id="1272079795634619415">หยุด</translation>
<translation id="4957722034734105353">เรียนรู้เพิ่มเติม...</translation>
<translation id="2964193600955408481">ปิดใช้งาน WiFi</translation>
-<translation id="811680302244032017">เพิ่มอุปกรณ์...</translation>
<translation id="4279490309300973883">กำลังแสดงผล</translation>
+<translation id="7973962044839454485">การตรวจสอบสิทธิ์ PPP ล้มเหลวเนื่องจากชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง</translation>
<translation id="2509468283778169019">Caps Lock เปิดอยู่</translation>
<translation id="3892641579809465218">จอแสดงผลภายใน</translation>
<translation id="7823564328645135659">เปลี่ยนภาษาจาก &quot;<ph name="FROM_LOCALE"/>&quot; เป็น &quot;<ph name="TO_LOCALE"/>&quot; หลังจากซิงค์การตั้งค่าของคุณ</translation>
<translation id="3368922792935385530">เชื่อมต่อแล้ว</translation>
<translation id="8340999562596018839">การตอบสนองด้วยเสียง</translation>
<translation id="8654520615680304441">เปิด WiFi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">วิธีการป้อนข้อมูลของคุณเปลี่ยนแปลงเป็น <ph name="INPUT_METHOD_ID"/> แล้ว
กด Shift + Alt เพื่อสลับ</translation>
<translation id="2562916301614567480">เครือข่ายส่วนบุคคล</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317">เหลืออีก <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">วิธีการป้อนข้อมูล</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">ชั้นวาง</translation>
<translation id="2614835198358683673">Chromebook ของคุณอาจไม่ได้ชาร์จในขณะที่เปิดอยู่ ลองใช้ที่ชาร์จมาตรฐาน</translation>
<translation id="1895658205118569222">ปิด</translation>
<translation id="4430019312045809116">ระดับเสียง</translation>
+<translation id="8681498213689260554">รีสตาร์ทและ Powerwash เพื่ออัปเดต</translation>
<translation id="4442424173763614572">การค้นหา DNS ล้มเหลว</translation>
-<translation id="6356500677799115505">แบตเตอรี่เต็มและกำลังชาร์จ</translation>
<translation id="7874779702599364982">กำลังค้นหาเครือข่ายโทรศัพท์มือถือ...</translation>
<translation id="583281660410589416">ไม่รู้จัก</translation>
<translation id="1383876407941801731">เครื่องมือค้นหา</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">ข้อมูลเครือข่าย</translation>
<translation id="1621499497873603021">เวลาที่เหลือกว่าแบตเตอรี่จะหมด, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">ออกจากเซสชันผู้มาเยือน</translation>
-<translation id="4471417012762451363">มีแบตเตอรี่ <ph name="PERCENTAGE"/>% และกำลังชาร์จ</translation>
<translation id="8308637677604853869">เมนูก่อนหน้า</translation>
<translation id="4666297444214622512">ไม่สามารถลงชื่อเข้าใช้บัญชีอื่น</translation>
<translation id="1346748346194534595">ขวา</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">ข้อผิดพลาดเครือข่ายที่ไม่รู้จัก</translation>
<translation id="1467432559032391204">ซ้าย</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">กำลังเปิดใช้งาน <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">ย่อ</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">เสียบอยู่กับที่ชาร์จพลังงานต่ำ การชาร์จแบตเตอรี่อาจไม่น่าเชื่อถือ</translation>
<translation id="3784455785234192852">ล็อก</translation>
<translation id="2805756323405976993">Apps</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> ถูกปรับขนาดเป็น <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">การเปิดใช้งานล้มเหลว</translation>
<translation id="5097002363526479830">ไม่สามารถเชื่อมต่อเครือข่าย &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">WiFi ปิดอยู่</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">ตั้งค่าวอลเปเปอร์...</translation>
<translation id="8678698760965522072">สถานะออนไลน์</translation>
<translation id="2532589005999780174">โหมดคอนทราสต์สูง</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">ข้อผิดพลาดภายใน</translation>
<translation id="3019353588588144572">เวลาที่เหลือกว่าจะชาร์จแบตเตอรี่เต็ม, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">แว่นขยายหน้าจอ</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">ออกจากเซสชัน</translation>
<translation id="8454013096329229812">WiFi เปิดอยู่</translation>
<translation id="4872237917498892622">Alt+ค้นหา หรือ Shift</translation>
+<translation id="9201131092683066720">มีแบตเตอรี่ <ph name="PERCENTAGE"/>%</translation>
<translation id="2983818520079887040">การตั้งค่า...</translation>
+<translation id="1195412055398077112">โอเวอร์สแกน</translation>
<translation id="1717216362413677834">โหมดแท่นชาร์จ</translation>
+<translation id="112308213915226829">ซ่อนชั้นวางโดยอัตโนมัติ</translation>
<translation id="8927026611342028580">ขอเชื่อมต่อ</translation>
<translation id="8300849813060516376">OTASP ล้มเหลว</translation>
<translation id="2792498699870441125">Alt+ค้นหา</translation>
<translation id="8660803626959853127">กำลังซิงค์ <ph name="COUNT"/> ไฟล์</translation>
+<translation id="5958529069007801266">ผู้ใช้ภายใต้การดูแล</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK ปิดอยู่</translation>
<translation id="6248847161401822652">กด Control Shift Q สองครั้งเพื่อออก</translation>
+<translation id="6785414152754474415">มีแบตเตอรี่ <ph name="PERCENTAGE"/>% และกำลังชาร์จ</translation>
<translation id="6267036997247669271"><ph name="NAME"/> กำลังเปิดใช้งาน...</translation>
+<translation id="4895488851634969361">แบตเตอรี่เต็ม</translation>
<translation id="1391854757121130358">คุณอาจใช้ข้อมูลมือถือถึงขีดจำกัดแล้ว</translation>
-<translation id="5413208160176941586">ผู้ใช้ที่ได้รับการจัดการในเครื่อง</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">ตำแหน่งของตัวเรียกใช้งาน</translation>
+<translation id="5947494881799873997">ย้อนกลับ</translation>
<translation id="7593891976182323525">ค้นหาหรือ Shift</translation>
<translation id="7649070708921625228">ช่วยเหลือ</translation>
<translation id="3050422059534974565">CAPS LOCK เปิดอยู่
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">ข้อความรหัสผ่านไม่ถูกต้อง</translation>
<translation id="6165508094623778733">เรียนรู้เพิ่มเติม</translation>
<translation id="9046895021617826162">การเชื่อมต่อล้มเหลว</translation>
+<translation id="7168224885072002358">เปลี่ยนกลับไปเป็นความละเอียดเดิมภายใน <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">เซสชันนี้จะสิ้นสุดใน <ph name="SESSION_TIME_REMAINING"/> ระบบจะลงชื่อออกให้คุณโดยอัตโนมัติ</translation>
<translation id="8372369524088641025">คีย์ WEP ไม่ถูกต้อง</translation>
<translation id="6636709850131805001">สถานะที่ไม่รู้จัก</translation>
<translation id="3573179567135747900">เปลี่ยนกลับเป็น &quot;<ph name="FROM_LOCALE"/>&quot; (จำเป็นต้องรีสตาร์ต)</translation>
<translation id="8103386449138765447">ข้อความ SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">การตั้งค่า Google ไดรฟ์...</translation>
-<translation id="1510238584712386396">ตัวเรียกใช้งาน</translation>
<translation id="7209101170223508707">CAPS LOCK เปิดอยู่
กด Alt+ค้นหา หรือ Shift เพื่อยกเลิก</translation>
<translation id="8940956008527784070">แบตเตอรี่ต่ำ (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">ยอมรับ</translation>
<translation id="5102001756192215136">เหลืออีก <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">กำลังแชร์การควบคุมหน้าจอผ่านแฮงเอาท์</translation>
<translation id="8000066093800657092">ไม่มีเครือข่าย</translation>
<translation id="4015692727874266537">ลงชื่อเข้าใช้บัญชีอื่น...</translation>
<translation id="5941711191222866238">ย่อ</translation>
<translation id="6911468394164995108">เชื่อมต่อเครือข่ายอื่น...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">อีก <ph name="HOUR"/>ชม. <ph name="MINUTE"/>นาทีจึงจะเต็ม</translation>
<translation id="6359806961507272919">SMS จาก <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">ผู้ให้บริการ</translation>
diff --git a/chromium/ash/strings/ash_strings_tr.xtb b/chromium/ash/strings/ash_strings_tr.xtb
index b6580301792..afc2efc3574 100644
--- a/chromium/ash/strings/ash_strings_tr.xtb
+++ b/chromium/ash/strings/ash_strings_tr.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="tr">
<translation id="3595596368722241419">Pil tam dolu</translation>
-<translation id="5250713215130379958">Başlatıcıyı otomatik gizle</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> ve <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Portal durumu</translation>
<translation id="30155388420722288">Taşma Düğmesi</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth etkin</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> dönme ayarı <ph name="ROTATION"/> olarak değiştirildi</translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth devre dışı</translation>
+<translation id="7165320105431587207">Ağ yapılandırılamadı</translation>
<translation id="3775358506042162758">Çoklu oturum açmada en fazla üç hesabınız olabilir.</translation>
<translation id="370649949373421643">Kablosuzu Etkinleştir</translation>
<translation id="3626281679859535460">Parlaklık</translation>
+<translation id="595202126637698455">Performans izleme etkin</translation>
<translation id="8054466585765276473">Pilin süresi hesaplanıyor.</translation>
<translation id="7982789257301363584">Ağ</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Klavye Yer Paylaşımı</translation>
<translation id="4387004326333427325">Kimlik doğrulama sertifikası uzaktan reddedildi</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> çözünürlüğü <ph name="RESOLUTION"/> olarak değiştirildi</translation>
<translation id="6943836128787782965">HTTP get işlevi başarısız oldu</translation>
<translation id="2297568595583585744">Durum tepsisi</translation>
<translation id="1661867754829461514">PIN eksik</translation>
@@ -34,39 +38,41 @@ Geçiş yapmak için ÜstKrktr + Alt tuşlarına basın.</translation>
<translation id="2127372758936585790">Düşük güçlü şarj cihazı</translation>
<translation id="3846575436967432996">Hiçbir ağ bilgisi yok</translation>
<translation id="3026237328237090306">Mobil verileri ayarla</translation>
+<translation id="5871632337994001636">Cihazları yönet...</translation>
<translation id="785750925697875037">Mobil hesabı görüntüle</translation>
<translation id="153454903766751181">Hücresel modem başlatılıyor...</translation>
<translation id="4628814525959230255">Ekranınızın denetimi Hangouts üzerinden <ph name="HELPER_NAME"/> ile paylaşılıyor.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> döndürüldü</translation>
<translation id="7864539943188674973">Bluetooth'u devre dışı bırak</translation>
<translation id="939252827960237676">Ekran görüntüsü kaydedilemedi</translation>
<translation id="3126069444801937830">Güncellemek için yeniden başlat</translation>
<translation id="2268813581635650749">Tüm kullanıcıların oturumunu kapat</translation>
<translation id="735745346212279324">VPN bağlantısı kesildi</translation>
<translation id="7320906967354320621">Boşta</translation>
-<translation id="6303423059719347535">Pil %<ph name="PERCENTAGE"/> dolu</translation>
<translation id="15373452373711364">Büyük fare imleci</translation>
-<translation id="2778346081696727092">Sağlanan kullanıcı adı ve şifreyle kimlik doğrulanamadı</translation>
<translation id="3294437725009624529">Misafir</translation>
<translation id="8190698733819146287">Dilleri ve girişi özelleştir...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Raf konumu</translation>
<translation id="2903907270192926896">GİRİŞ</translation>
<translation id="8676770494376880701">Düşük güçlü şarj cihazı bağlandı</translation>
<translation id="7170041865419449892">Aralık dışında</translation>
<translation id="4804818685124855865">Bağlantıyı kes</translation>
<translation id="2544853746127077729">Kimlik doğrulama sertifikası ağ tarafından reddedildi</translation>
<translation id="5222676887888702881">Çıkış</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Yapılandırma</translation>
<translation id="1272079795634619415">Durdur</translation>
<translation id="4957722034734105353">Daha fazla bilgi edinin...</translation>
<translation id="2964193600955408481">Kablosuz bağlantıyı devre dışı bırak</translation>
-<translation id="811680302244032017">Cihaz ekle...</translation>
<translation id="4279490309300973883">Yansıtılıyor</translation>
+<translation id="7973962044839454485">Yanlış kullanıcı adı veya şifreden dolayı PPP kimlik doğrulaması başarısız oldu</translation>
<translation id="2509468283778169019">CAPS LOCK açık</translation>
<translation id="3892641579809465218">Dahili Ekran</translation>
<translation id="7823564328645135659">Ayarlarınız senkronize edildikten sonra &quot;<ph name="FROM_LOCALE"/>&quot; olan dil &quot;<ph name="TO_LOCALE"/>&quot; olarak değiştirildi.</translation>
<translation id="3368922792935385530">Bağlı</translation>
<translation id="8340999562596018839">Sesli geri bildirim</translation>
<translation id="8654520615680304441">Kablosuz'u aç...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Giriş yönteminiz <ph name="INPUT_METHOD_ID"/> olarak değiştirildi.
Geçiş yapmak için ÜstKrktr + Alt tuşlarına basın.</translation>
<translation id="2562916301614567480">Özel Ağ</translation>
@@ -83,11 +89,12 @@ Geçiş yapmak için ÜstKrktr + Alt tuşlarına basın.</translation>
<translation id="3626637461649818317">%<ph name="PERCENTAGE"/> kaldı</translation>
<translation id="9089416786594320554">Giriş yöntemleri</translation>
<translation id="6247708409970142803">%<ph name="PERCENTAGE"/></translation>
+<translation id="2825619548187458965">Raf</translation>
<translation id="2614835198358683673">Chromebook'unuz açıkken şarj edilemeyebilir. Orijinal şarj cihazını kullanmayı düşünün.</translation>
<translation id="1895658205118569222">Kapat</translation>
<translation id="4430019312045809116">Ses</translation>
+<translation id="8681498213689260554">Güncellemek için yeniden başlatın ve Powerwash yapın</translation>
<translation id="4442424173763614572">DNS arama başarısız oldu</translation>
-<translation id="6356500677799115505">Pil dolu ve şarj oluyor.</translation>
<translation id="7874779702599364982">Hücresel ağlar aranıyor...</translation>
<translation id="583281660410589416">Bilinmiyor</translation>
<translation id="1383876407941801731">Arama</translation>
@@ -96,7 +103,6 @@ Geçiş yapmak için ÜstKrktr + Alt tuşlarına basın.</translation>
<translation id="2204305834655267233">Ağ Bilgisi</translation>
<translation id="1621499497873603021">Pilin boşalması için kalan süre, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Misafir oturumundan çık</translation>
-<translation id="4471417012762451363">Pil %<ph name="PERCENTAGE"/> dolu ve şarj oluyor</translation>
<translation id="8308637677604853869">Önceki menü</translation>
<translation id="4666297444214622512">Başka bir hesapta oturum açılamıyor.</translation>
<translation id="1346748346194534595">Sağa</translation>
@@ -114,6 +120,7 @@ Devre dışı bırakmak için Ctrl+Alt+Z tuşlarına basın.</translation>
<translation id="6312403991423642364">Bilinmeyen ağ hatası</translation>
<translation id="1467432559032391204">Sola</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830"><ph name="NAME"/> etkinleştiriliyor</translation>
<translation id="8814190375133053267">Kablosuz</translation>
<translation id="1398853756734560583">Büyüt</translation>
@@ -123,7 +130,6 @@ Devre dışı bırakmak için Ctrl+Alt+Z tuşlarına basın.</translation>
<translation id="2727977024730340865">Düşük güçlü bir şarj cihazına takıldı. Şarj durumu güvenilir olmayabilir.</translation>
<translation id="3784455785234192852">Kilitle</translation>
<translation id="2805756323405976993">Uygulamalar</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> ekranı <ph name="RESOLUTION"/> olarak yeniden boyutlandırıldı</translation>
<translation id="1512064327686280138">Etkinleştirme hatası</translation>
<translation id="5097002363526479830">'<ph name="NAME"/>' ağına bağlanamadı: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Kablosuz kapalı.</translation>
@@ -131,6 +137,7 @@ Devre dışı bırakmak için Ctrl+Alt+Z tuşlarına basın.</translation>
<translation id="7052914147756339792">Duvar kağıdını ayarla...</translation>
<translation id="8678698760965522072">Çevrimiçi durumu</translation>
<translation id="2532589005999780174">Yüksek kontrast modu</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Dahili hata</translation>
<translation id="3019353588588144572">Pilin tam olarak şarj olması için kalan süre, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Ekran büyüteci</translation>
@@ -153,20 +160,24 @@ Sunucu mesajı: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Oturumdan çık</translation>
<translation id="8454013096329229812">Kablosuz açık.</translation>
<translation id="4872237917498892622">Alt+Arama veya Üst Karakter</translation>
+<translation id="9201131092683066720">Pil %<ph name="PERCENTAGE"/> dolu.</translation>
<translation id="2983818520079887040">Ayarlar...</translation>
+<translation id="1195412055398077112">fazla tarama</translation>
<translation id="1717216362413677834">Yuva modu</translation>
+<translation id="112308213915226829">Rafı otomatik gizle</translation>
<translation id="8927026611342028580">Bağlantı İstendi</translation>
<translation id="8300849813060516376">OTASP başarısız oldu</translation>
<translation id="2792498699870441125">Alt+Arama</translation>
<translation id="8660803626959853127"><ph name="COUNT"/> dosya senkronize ediliyor</translation>
+<translation id="5958529069007801266">Denetlenen kullanıcı</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK kapalı</translation>
<translation id="6248847161401822652">Çıkmak için Ctrl+ÜstKrktr+Q tuşlarına iki kez basın.</translation>
+<translation id="6785414152754474415">Pil %<ph name="PERCENTAGE"/> dolu ve şarj oluyor.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Etkinleştiriliyor...</translation>
+<translation id="4895488851634969361">Pil dolu.</translation>
<translation id="1391854757121130358">Mobil veri hakkınızı bitirmiş olabilirsiniz.</translation>
-<translation id="5413208160176941586">Yerel olarak yönetilen kullanıcı</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Başlatıcı konumu</translation>
+<translation id="5947494881799873997">Geri döndür</translation>
<translation id="7593891976182323525">Arama veya Üst Karakter</translation>
<translation id="7649070708921625228">Yardım</translation>
<translation id="3050422059534974565">CAPS LOCK açık.
@@ -179,22 +190,24 @@ Sunucu mesajı: <ph name="SERVER_MSG"/></translation>
<translation id="6692173217867674490">Hatalı parola</translation>
<translation id="6165508094623778733">Daha fazla bilgi edinin</translation>
<translation id="9046895021617826162">Bağlantı başarısız oldu</translation>
+<translation id="7168224885072002358"><ph name="TIMEOUT_SECONDS"/> saniye içinde eski çözünürlüğe dönülüyor</translation>
<translation id="973896785707726617">Bu oturum <ph name="SESSION_TIME_REMAINING"/> içinde sona erecek. Oturumunuz otomatik olarak kapatılacaktır.</translation>
<translation id="8372369524088641025">Hatalı WEP anahtarı</translation>
<translation id="6636709850131805001">Tanınmayan durum</translation>
<translation id="3573179567135747900">Tekrar &quot;<ph name="FROM_LOCALE"/>&quot; ayarına dön (yeniden başlatmak gerekir)</translation>
<translation id="8103386449138765447">SMS mesajları: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google Drive ayarları...</translation>
-<translation id="1510238584712386396">Başlatıcı</translation>
<translation id="7209101170223508707">CAPS LOCK açık.
İptal için Alt+Arama veya Üst Karakter tuşlarına basın.</translation>
<translation id="8940956008527784070">Pil gücü az (%<ph name="PERCENTAGE"/>)</translation>
+<translation id="4918086044614829423">Kabul et</translation>
<translation id="5102001756192215136"><ph name="HOUR"/>:<ph name="MINUTE"/> kaldı</translation>
<translation id="520760366042891468">Ekranınızın denetimi Hangouts üzerinden paylaşılıyor.</translation>
<translation id="8000066093800657092">Ağ yok</translation>
<translation id="4015692727874266537">Başka bir hesapta oturum açın...</translation>
<translation id="5941711191222866238">Simge durumuna küçült</translation>
<translation id="6911468394164995108">Başka ağa katıl...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">Tam dolana kadar <ph name="HOUR"/> sa <ph name="MINUTE"/> dk var</translation>
<translation id="6359806961507272919"><ph name="PHONE_NUMBER"/> numaradan SMS alındı</translation>
<translation id="1244147615850840081">Operatör</translation>
diff --git a/chromium/ash/strings/ash_strings_uk.xtb b/chromium/ash/strings/ash_strings_uk.xtb
index 711cb63da8f..298cd93d92c 100644
--- a/chromium/ash/strings/ash_strings_uk.xtb
+++ b/chromium/ash/strings/ash_strings_uk.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="uk">
<translation id="3595596368722241419">Акумулятор заряджено</translation>
-<translation id="5250713215130379958">Автоматично ховати панель запуску</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> і <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Стан порталу</translation>
<translation id="30155388420722288">Кнопка переповнення</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Bluetooth увімкнено</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> обернено на <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Bluetooth вимкнено</translation>
+<translation id="7165320105431587207">Помилка налаштування мережі</translation>
<translation id="3775358506042162758">Паралельно можна входити не більше ніж у три облікові записи.</translation>
<translation id="370649949373421643">Увімкнути Wi-Fi</translation>
<translation id="3626281679859535460">Яскравість</translation>
+<translation id="595202126637698455">Відстеження ефективності ввімкнено</translation>
<translation id="8054466585765276473">Обчислення часу роботи акумулятора.</translation>
<translation id="7982789257301363584">Мережа</translation>
<translation id="5565793151875479467">Проксі-сервер...</translation>
<translation id="938582441709398163">Розкладка клавіатури</translation>
<translation id="4387004326333427325">Сертифікат автентифікації відхилений дистанційно</translation>
<translation id="6979158407327259162">Диск Google</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/>: установлено роздільну здатність <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">Помилка HTTP</translation>
<translation id="2297568595583585744">Контейтер стану</translation>
<translation id="1661867754829461514">Відсутній PIN-код</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">Зарядний пристрій низької потужності</translation>
<translation id="3846575436967432996">Інформація про мережу не доступна</translation>
<translation id="3026237328237090306">Налаштувати передавання мобільних даних</translation>
+<translation id="5871632337994001636">Керування пристроями…</translation>
<translation id="785750925697875037">Переглянути обліковий запис для мобільних пристроїв</translation>
<translation id="153454903766751181">Ініціалізація мобільного модема…</translation>
<translation id="4628814525959230255">Спільний доступ до екрана для користувача <ph name="HELPER_NAME"/> через Hangouts.</translation>
-<translation id="8343941333792395995">Екран <ph name="DISPLAY_NAME"/> обернено</translation>
<translation id="7864539943188674973">Вимкнути Bluetooth</translation>
<translation id="939252827960237676">Не вдалося зберегти знімок екрана</translation>
<translation id="3126069444801937830">Перезапустіть, щоб оновити</translation>
<translation id="2268813581635650749">Вийти з усіх облікових записів</translation>
<translation id="735745346212279324">VPN від’єднано</translation>
<translation id="7320906967354320621">Простій</translation>
-<translation id="6303423059719347535">Акумулятор заряджений на <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">Великий курсор миші</translation>
-<translation id="2778346081696727092">Помилка автентифікації за допомогою введеного імені користувача чи пароля</translation>
<translation id="3294437725009624529">Гість</translation>
<translation id="8190698733819146287">Налаштувати мови та введення тексту...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Розташування полиці</translation>
<translation id="2903907270192926896">ВХІД</translation>
<translation id="8676770494376880701">Зарядний пристрій низької потужності підключено</translation>
<translation id="7170041865419449892">За межами досяжності</translation>
<translation id="4804818685124855865">Від'єднатися</translation>
<translation id="2544853746127077729">Сертифікат автентифікації відхилений мережею</translation>
<translation id="5222676887888702881">Вийти</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Конфігурація</translation>
<translation id="1272079795634619415">Зупинити</translation>
<translation id="4957722034734105353">Докладніше...</translation>
<translation id="2964193600955408481">Вимкнути Wi-Fi</translation>
-<translation id="811680302244032017">Додати пристрій...</translation>
<translation id="4279490309300973883">Дзеркальне відображення</translation>
+<translation id="7973962044839454485">Помилка автентифікації PPP через неправильне ім’я користувача або пароль</translation>
<translation id="2509468283778169019">Режим CAPS LOCK увімкнено</translation>
<translation id="3892641579809465218">Внутрішній екран</translation>
<translation id="7823564328645135659">Після синхронізації налаштувань мову змінено. Попередня: <ph name="FROM_LOCALE"/>, нова: <ph name="TO_LOCALE"/>.</translation>
<translation id="3368922792935385530">Підключено</translation>
<translation id="8340999562596018839">Голосові підказки</translation>
<translation id="8654520615680304441">Увімкнення Wi-Fi…</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Метод введення змінено на <ph name="INPUT_METHOD_ID"/>.
Щоб переключитися, натисніть Shift + Alt.</translation>
<translation id="2562916301614567480">Приватна мережа</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317">Залишилося <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">Методи введення</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Полиця</translation>
<translation id="2614835198358683673">Ваш Chromebook може не заряджатися, якщо ввімкнений. Спробуйте скористатися офіційним зарядним пристроєм.</translation>
<translation id="1895658205118569222">Завершення роботи</translation>
<translation id="4430019312045809116">Гучність</translation>
+<translation id="8681498213689260554">Щоб оновити, перезапустіть і скористайтеся функцією Powerwash</translation>
<translation id="4442424173763614572">Помилка пошуку DNS</translation>
-<translation id="6356500677799115505">Акумулятор заряджений і продовжує заряджатися.</translation>
<translation id="7874779702599364982">Пошук мобільних мереж…</translation>
<translation id="583281660410589416">Невідомо</translation>
<translation id="1383876407941801731">Пошук</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">Інформація про мережу</translation>
<translation id="1621499497873603021">До розрядження акумулятора залишилося <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Завершити сеанс у режимі гостя</translation>
-<translation id="4471417012762451363">Акумулятор заряджений на <ph name="PERCENTAGE"/>% і продовжує заряджатися</translation>
<translation id="8308637677604853869">Попереднє меню</translation>
<translation id="4666297444214622512">Неможливо ввійти в інший обліковий запис.</translation>
<translation id="1346748346194534595">Праворуч</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">Невідома помилка мережі</translation>
<translation id="1467432559032391204">Ліворуч</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Активація <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Збільшити</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">Підключено до зарядного пристрою низької потужності. Акумулятор може заряджатися неналежним чином.</translation>
<translation id="3784455785234192852">Заблокувати</translation>
<translation id="2805756323405976993">Програми</translation>
-<translation id="8871072142849158571">Роздільну здатність екрана <ph name="DISPLAY_NAME"/> змінено на <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Помилка активації</translation>
<translation id="5097002363526479830">Не вдалося під’єднатися до мережі &quot;<ph name="NAME"/>&quot;: <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi вимкнено.</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">Установити фоновий малюнок...</translation>
<translation id="8678698760965522072">Статус онлайн</translation>
<translation id="2532589005999780174">Режим високого контрасту</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Внутрішня помилка</translation>
<translation id="3019353588588144572">До повного зарядження акумулятора залишилося <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Лупа</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">Завершити сеанс</translation>
<translation id="8454013096329229812">Wi-Fi увімкнено.</translation>
<translation id="4872237917498892622">Alt+клавіша пошуку або Shift</translation>
+<translation id="9201131092683066720">Акумулятор заряджений на <ph name="PERCENTAGE"/>%.</translation>
<translation id="2983818520079887040">Налаштування...</translation>
+<translation id="1195412055398077112">облямівка екрана</translation>
<translation id="1717216362413677834">Режим док-станції</translation>
+<translation id="112308213915226829">Автоматично ховати полицю</translation>
<translation id="8927026611342028580">Подано запит на під’єднання</translation>
<translation id="8300849813060516376">Помилка OTASP</translation>
<translation id="2792498699870441125">Alt+клавіша пошуку</translation>
<translation id="8660803626959853127">Синхронізація файлів (<ph name="COUNT"/>)</translation>
+<translation id="5958529069007801266">Контрольований користувач</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">Режим CAPS LOCK вимкнено</translation>
<translation id="6248847161401822652">Двічі натисніть комбінацію клавіш Control Shift Q, щоб вийти.</translation>
+<translation id="6785414152754474415">Акумулятор заряджений на <ph name="PERCENTAGE"/>% і заряджається.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: активація…</translation>
+<translation id="4895488851634969361">Акумулятор заряджений.</translation>
<translation id="1391854757121130358">Можливо, ви використали свій ліміт мобільного передавання даних.</translation>
-<translation id="5413208160176941586">Локально керований користувач</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Положення панелі запуску</translation>
+<translation id="5947494881799873997">Повернути</translation>
<translation id="7593891976182323525">Клавіша пошуку або Shift</translation>
<translation id="7649070708921625228">Довідка</translation>
<translation id="3050422059534974565">Клавішу CAPS LOCK увімкнено.
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">Погана парольна фраза</translation>
<translation id="6165508094623778733">Докладніше</translation>
<translation id="9046895021617826162">Помилка з'єднання</translation>
+<translation id="7168224885072002358">Попередня роздільна здатність повернеться через <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Сеанс закінчиться за <ph name="SESSION_TIME_REMAINING"/>. Ви вийдете автоматично.</translation>
<translation id="8372369524088641025">Поганий WEP-ключ</translation>
<translation id="6636709850131805001">Нерозпізнаний стан</translation>
<translation id="3573179567135747900">Повернутися до мови &quot;<ph name="FROM_LOCALE"/>&quot; (потрібно перезавантажитися)</translation>
<translation id="8103386449138765447">SMS повідомлень: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Налаштування Диска Google...</translation>
-<translation id="1510238584712386396">Панель запуску</translation>
<translation id="7209101170223508707">Клавішу CAPS LOCK увімкнено.
Натисніть Alt+клавішу пошуку або Shift, щоб скасувати.</translation>
<translation id="8940956008527784070">Низький заряд акумулятора (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Прийняти</translation>
<translation id="5102001756192215136">Залишилося <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Спільний доступ до екрана через Hangouts.</translation>
<translation id="8000066093800657092">Немає мережі</translation>
<translation id="4015692727874266537">Увійти в інший обліковий запис…</translation>
<translation id="5941711191222866238">Зменшити</translation>
<translation id="6911468394164995108">Під’єднатися до іншої...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/> год. <ph name="MINUTE"/> хв. до повного зарядження</translation>
<translation id="6359806961507272919">SMS-повідомлення від <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Постачальник</translation>
diff --git a/chromium/ash/strings/ash_strings_vi.xtb b/chromium/ash/strings/ash_strings_vi.xtb
index b0affdb44ce..52855111fed 100644
--- a/chromium/ash/strings/ash_strings_vi.xtb
+++ b/chromium/ash/strings/ash_strings_vi.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="vi">
<translation id="3595596368722241419">Pin đầy</translation>
-<translation id="5250713215130379958">Tự động ẩn trình khởi chạy</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> và <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">Trạng thái cổng</translation>
<translation id="30155388420722288">Nút tràn</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">Đã bật bluetooth</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> đã được xoay vòng sang <ph name="ROTATION"/></translation>
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="2268130516524549846">Đã tắt bluetooth</translation>
+<translation id="7165320105431587207">Không định cấu hình mạng được</translation>
<translation id="3775358506042162758">Bạn chỉ có thể có tối đa ba tài khoản khi đăng nhập nhiều tài khoản.</translation>
<translation id="370649949373421643">Bật Wi-Fi</translation>
<translation id="3626281679859535460">Độ sáng</translation>
+<translation id="595202126637698455">Đã bật theo dõi hoạt động</translation>
<translation id="8054466585765276473">Đang tính toán thời lượng pin.</translation>
<translation id="7982789257301363584">Mạng</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">Lớp phủ bàn phím</translation>
<translation id="4387004326333427325">Chứng chỉ xác thực bị từ chối từ xa</translation>
<translation id="6979158407327259162">Google Drive</translation>
+<translation id="3683428399328702079">Độ phân giải <ph name="DISPLAY_NAME"/> đã được chuyển thành <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP gặp lỗi</translation>
<translation id="2297568595583585744">Khay trạng thái</translation>
<translation id="1661867754829461514">Thiếu PIN</translation>
@@ -34,39 +38,41 @@ Nhấn Shift + Alt để chuyển đổi.</translation>
<translation id="2127372758936585790">Bộ sạc công suất thấp</translation>
<translation id="3846575436967432996">Không có thông tin mạng</translation>
<translation id="3026237328237090306">Thiết lập dữ liệu di động</translation>
+<translation id="5871632337994001636">Quản lý thiết bị...</translation>
<translation id="785750925697875037">Xem tài khoản di động</translation>
<translation id="153454903766751181">Đang khởi chạy modem di động...</translation>
<translation id="4628814525959230255">Chia sẻ quyền kiểm soát màn hình của bạn với <ph name="HELPER_NAME"/> qua Hangouts.</translation>
-<translation id="8343941333792395995"><ph name="DISPLAY_NAME"/> đã được xoay</translation>
<translation id="7864539943188674973">Tắt bluetooth</translation>
<translation id="939252827960237676">Không lưu được ảnh chụp màn hình</translation>
<translation id="3126069444801937830">Khởi động lại để cập nhật</translation>
<translation id="2268813581635650749">Đăng xuất tất cả</translation>
<translation id="735745346212279324">Đã ngắt kết nối VPN</translation>
<translation id="7320906967354320621">Rảnh</translation>
-<translation id="6303423059719347535">Pin <ph name="PERCENTAGE"/>% đầy</translation>
<translation id="15373452373711364">Con trỏ chuột lớn</translation>
-<translation id="2778346081696727092">Không thể xác thực với tên người dùng và mật khẩu đã cung cấp</translation>
<translation id="3294437725009624529">Khách</translation>
<translation id="8190698733819146287">Tùy chỉnh ngôn ngữ và dữ liệu nhập...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">Vị trí giá</translation>
<translation id="2903907270192926896">ĐẦU VÀO</translation>
<translation id="8676770494376880701">Đã kết nối bộ sạc công suất thấp</translation>
<translation id="7170041865419449892">Ngoài vùng phủ sóng</translation>
<translation id="4804818685124855865">Ngắt kết nối</translation>
<translation id="2544853746127077729">Chứng chỉ xác thực bị mạng từ chối</translation>
<translation id="5222676887888702881">Đăng xuất</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">Cấu hình</translation>
<translation id="1272079795634619415">Dừng</translation>
<translation id="4957722034734105353">Tìm hiểu thêm...</translation>
<translation id="2964193600955408481">Tắt Wi-Fi</translation>
-<translation id="811680302244032017">Thêm thiết bị...</translation>
<translation id="4279490309300973883">Đang phản chiếu</translation>
+<translation id="7973962044839454485">Xác thực PPP không thành công do tên người dùng hoặc mật khẩu không đúng</translation>
<translation id="2509468283778169019">Đang bật CAPS LOCK</translation>
<translation id="3892641579809465218">Màn hình nội bộ</translation>
<translation id="7823564328645135659">Ngôn ngữ đã chuyển từ &quot;<ph name="FROM_LOCALE"/>&quot; thành &quot;<ph name="TO_LOCALE"/>&quot; sau khi đồng bộ hóa cài đặt của bạn.</translation>
<translation id="3368922792935385530">Đã kết nối</translation>
<translation id="8340999562596018839">Phản hồi nói</translation>
<translation id="8654520615680304441">Bật Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">Phương thức nhập của bạn đã thay đổi thành <ph name="INPUT_METHOD_ID"/>.
Nhấn Shift + Alt để chuyển đổi.</translation>
<translation id="2562916301614567480">Mạng riêng</translation>
@@ -83,11 +89,12 @@ Nhấn Shift + Alt để chuyển đổi.</translation>
<translation id="3626637461649818317">Còn lại <ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">Phương thức nhập</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">Giá</translation>
<translation id="2614835198358683673">Chromebook của bạn có thể không sạc khi đang bật. Hãy xem xét sử dụng bộ sạc chính thức.</translation>
<translation id="1895658205118569222">Tắt</translation>
<translation id="4430019312045809116">Âm lượng</translation>
+<translation id="8681498213689260554">Khởi động lại và powerwash để cập nhật</translation>
<translation id="4442424173763614572">Tìm kiếm DNS không thành công</translation>
-<translation id="6356500677799115505">Pin đầy và đang sạc.</translation>
<translation id="7874779702599364982">Đang tìm kiếm mạng di động...</translation>
<translation id="583281660410589416">Không biết</translation>
<translation id="1383876407941801731">Tìm kiếm</translation>
@@ -96,7 +103,6 @@ Nhấn Shift + Alt để chuyển đổi.</translation>
<translation id="2204305834655267233">Thông tin mạng</translation>
<translation id="1621499497873603021">Thời gian còn lại cho đến khi pin hết, <ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">Thoát khỏi phiên khách</translation>
-<translation id="4471417012762451363">Pin <ph name="PERCENTAGE"/>% đầy và đang sạc</translation>
<translation id="8308637677604853869">Trình đơn trước</translation>
<translation id="4666297444214622512">Không thể đăng nhập tài khoản khác.</translation>
<translation id="1346748346194534595">Phải</translation>
@@ -114,6 +120,7 @@ Nhấn Ctrl+Alt+Z để tắt.</translation>
<translation id="6312403991423642364">Lỗi mạng không xác định</translation>
<translation id="1467432559032391204">Trái</translation>
<translation id="5543001071567407895">SMS</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">Kích hoạt <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">Phóng to</translation>
@@ -123,7 +130,6 @@ Nhấn Ctrl+Alt+Z để tắt.</translation>
<translation id="2727977024730340865">Được cắm vào bộ sạc công suất thấp. Việc sạc pin có thể không được đảm bảo.</translation>
<translation id="3784455785234192852">Khóa</translation>
<translation id="2805756323405976993">Ứng dụng</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/> đã được đổi kích thước thành <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">Lỗi kích hoạt</translation>
<translation id="5097002363526479830">Không thể kết nối với mạng '<ph name="NAME"/>': <ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi đang tắt.</translation>
@@ -131,6 +137,7 @@ Nhấn Ctrl+Alt+Z để tắt.</translation>
<translation id="7052914147756339792">Đặt hình nền...</translation>
<translation id="8678698760965522072">Trạng thái trực tuyến</translation>
<translation id="2532589005999780174">Chế độ tương phản cao</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>, <ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">Lỗi nội bộ</translation>
<translation id="3019353588588144572">Thời gian còn lại cho đến khi pin được sạc đầy, <ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">Phóng to màn hình</translation>
@@ -153,20 +160,24 @@ Thông báo máy chủ: <ph name="SERVER_MSG"/></translation>
<translation id="7029814467594812963">Thoát khỏi phiên</translation>
<translation id="8454013096329229812">Wi-Fi đang bật.</translation>
<translation id="4872237917498892622">Alt+Search hoặc Shift</translation>
+<translation id="9201131092683066720">Pin đầy <ph name="PERCENTAGE"/>%.</translation>
<translation id="2983818520079887040">Cài đặt...</translation>
+<translation id="1195412055398077112">quét quá mức</translation>
<translation id="1717216362413677834">Chế độ gắn đế</translation>
+<translation id="112308213915226829">Tự động ẩn giá</translation>
<translation id="8927026611342028580">Yêu cầu kết nối</translation>
<translation id="8300849813060516376">OTASP không thành công</translation>
<translation id="2792498699870441125">Alt+Search</translation>
<translation id="8660803626959853127">Đang đồng bộ hóa <ph name="COUNT"/> tệp</translation>
+<translation id="5958529069007801266">Người dùng được giám sát</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK tắt</translation>
<translation id="6248847161401822652">Nhấn Control Shift Q hai lần để thoát.</translation>
+<translation id="6785414152754474415">Pin đầy <ph name="PERCENTAGE"/>% và đang sạc.</translation>
<translation id="6267036997247669271"><ph name="NAME"/>: Đang kích hoạt...</translation>
+<translation id="4895488851634969361">Pin đầy.</translation>
<translation id="1391854757121130358">Có thể bạn đã sử dụng hết dữ liệu di động được phép.</translation>
-<translation id="5413208160176941586">Người dùng được quản lý cục bộ</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>: <ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">Vị trí trình khởi chạy</translation>
+<translation id="5947494881799873997">Hoàn nguyên</translation>
<translation id="7593891976182323525">Search hoặc Shift</translation>
<translation id="7649070708921625228">Trợ giúp</translation>
<translation id="3050422059534974565">CAPS LOCK đang bật.
@@ -179,22 +190,24 @@ Nhấn Search hoặc Shift để hủy.</translation>
<translation id="6692173217867674490">Cụm mật khẩu sai</translation>
<translation id="6165508094623778733">Tìm hiểu thêm</translation>
<translation id="9046895021617826162">Kết nối không thành công</translation>
+<translation id="7168224885072002358">Sẽ hoàn nguyên về độ phân giải cũ sau <ph name="TIMEOUT_SECONDS"/></translation>
<translation id="973896785707726617">Phiên này sẽ kết thúc sau <ph name="SESSION_TIME_REMAINING"/>. Bạn sẽ tự động bị đăng xuất.</translation>
<translation id="8372369524088641025">Khóa WEP sai</translation>
<translation id="6636709850131805001">Trạng thái không xác định</translation>
<translation id="3573179567135747900">Thay đổi lại thành &quot;<ph name="FROM_LOCALE"/>&quot; (yêu cầu khởi động lại)</translation>
<translation id="8103386449138765447">Tin nhắn SMS: <ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Cài đặt Google Drive...</translation>
-<translation id="1510238584712386396">Trình khởi chạy</translation>
<translation id="7209101170223508707">CAPS LOCK đang bật.
Nhấn Alt+Search hoặc Shift để hủy.</translation>
<translation id="8940956008527784070">Pin yếu (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">Chấp nhận</translation>
<translation id="5102001756192215136">Còn lại <ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">Chia sẻ quyền kiểm soát màn hình của bạn qua Hangouts.</translation>
<translation id="8000066093800657092">Không có mạng nào</translation>
<translation id="4015692727874266537">Đăng nhập tài khoản khác...</translation>
<translation id="5941711191222866238">Thu nhỏ</translation>
<translation id="6911468394164995108">Tham gia mạng khác...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>: <ph name="ANNOTATION"/></translation>
<translation id="412065659894267608"><ph name="HOUR"/>g <ph name="MINUTE"/>p cho đến khi đầy</translation>
<translation id="6359806961507272919">SMS từ <ph name="PHONE_NUMBER"/></translation>
<translation id="1244147615850840081">Nhà cung cấp</translation>
diff --git a/chromium/ash/strings/ash_strings_zh-CN.xtb b/chromium/ash/strings/ash_strings_zh-CN.xtb
index 97af7e7a548..18ab6705034 100644
--- a/chromium/ash/strings/ash_strings_zh-CN.xtb
+++ b/chromium/ash/strings/ash_strings_zh-CN.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="zh-CN">
<translation id="3595596368722241419">电池已充满</translation>
-<translation id="5250713215130379958">自动隐藏启动程序</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> <ph name="MINUTE"/></translation>
<translation id="7880025619322806991">“门户网站”状态</translation>
<translation id="30155388420722288">溢出按钮</translation>
+<translation id="8673028979667498656">270°</translation>
<translation id="5571066253365925590">蓝牙已启用</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/>已旋转为<ph name="ROTATION"/></translation>
<translation id="9074739597929991885">蓝牙</translation>
<translation id="2268130516524549846">蓝牙已停用</translation>
+<translation id="7165320105431587207">无法配置网络</translation>
<translation id="3775358506042162758">使用多帐户登录时,最多只能有 3 个帐户。</translation>
<translation id="370649949373421643">启用 Wi-Fi</translation>
<translation id="3626281679859535460">亮度</translation>
+<translation id="595202126637698455">已启用性能跟踪</translation>
<translation id="8054466585765276473">正在计算续航时间。</translation>
<translation id="7982789257301363584">网络</translation>
<translation id="5565793151875479467">代理...</translation>
<translation id="938582441709398163">Overlay 键盘</translation>
<translation id="4387004326333427325">身份验证证书遭到远程拒绝</translation>
<translation id="6979158407327259162">Google 云端硬盘</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/>的分辨率已改为<ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP 获取请求失败</translation>
<translation id="2297568595583585744">状态栏</translation>
<translation id="1661867754829461514">缺少 PIN</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">低功率充电器</translation>
<translation id="3846575436967432996">没有可用的网络信息</translation>
<translation id="3026237328237090306">设置移动数据</translation>
+<translation id="5871632337994001636">管理设备…</translation>
<translation id="785750925697875037">查看移动帐户</translation>
<translation id="153454903766751181">正在初始化蜂窝调制解调器...</translation>
<translation id="4628814525959230255">通过环聊与<ph name="HELPER_NAME"/>共享您屏幕的控制权。</translation>
-<translation id="8343941333792395995">已旋转<ph name="DISPLAY_NAME"/></translation>
<translation id="7864539943188674973">停用蓝牙</translation>
<translation id="939252827960237676">无法保存屏幕截图</translation>
<translation id="3126069444801937830">重新启动以进行更新</translation>
<translation id="2268813581635650749">全部退出</translation>
<translation id="735745346212279324">VPN 连接已断开</translation>
<translation id="7320906967354320621">空闲</translation>
-<translation id="6303423059719347535">电池电量为 <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">大号鼠标光标</translation>
-<translation id="2778346081696727092">无法使用提供的用户名或密码进行身份验证</translation>
<translation id="3294437725009624529">访客</translation>
<translation id="8190698733819146287">自定义语言和输入法...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/>(<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">底栏的放置</translation>
<translation id="2903907270192926896">输入</translation>
<translation id="8676770494376880701">已连接低功率充电器</translation>
<translation id="7170041865419449892">超出范围</translation>
<translation id="4804818685124855865">断开连接</translation>
<translation id="2544853746127077729">身份验证证书遭到网络拒绝</translation>
<translation id="5222676887888702881">退出</translation>
+<translation id="2391579633712104609">180°</translation>
<translation id="2688477613306174402">配置</translation>
<translation id="1272079795634619415">停止</translation>
<translation id="4957722034734105353">了解详情...</translation>
<translation id="2964193600955408481">停用 Wi-Fi</translation>
-<translation id="811680302244032017">添加设备...</translation>
<translation id="4279490309300973883">正在镜像</translation>
+<translation id="7973962044839454485">用户名或密码不正确,导致 PPP 身份验证失败</translation>
<translation id="2509468283778169019">CAPS LOCK 已打开</translation>
<translation id="3892641579809465218">内部显示</translation>
<translation id="7823564328645135659">同步了您的设置后,该语言已由“<ph name="FROM_LOCALE"/>”更改为“<ph name="TO_LOCALE"/>”。</translation>
<translation id="3368922792935385530">已连接</translation>
<translation id="8340999562596018839">语音反馈</translation>
<translation id="8654520615680304441">启用 Wi-Fi...</translation>
+<translation id="8828714802988429505">90°</translation>
<translation id="5825747213122829519">您的输入法已更改为“<ph name="INPUT_METHOD_ID"/>”。
按 Shift + Alt 键可进行切换。</translation>
<translation id="2562916301614567480">专用网</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317">剩余电量:<ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">输入法</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">底栏</translation>
<translation id="2614835198358683673">您的 Chromebook 在开启期间可能无法充电。建议您使用产品原装的充电器。</translation>
<translation id="1895658205118569222">关闭</translation>
<translation id="4430019312045809116">音量</translation>
+<translation id="8681498213689260554">重新启动并通过 Powerwash 来更新系统</translation>
<translation id="4442424173763614572">DNS 查找失败</translation>
-<translation id="6356500677799115505">电池电量已满并处于充电状态。</translation>
<translation id="7874779702599364982">正在搜索蜂窝网络...</translation>
<translation id="583281660410589416">未知</translation>
<translation id="1383876407941801731">搜索</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">网络信息</translation>
<translation id="1621499497873603021">电池电量将在 <ph name="TIME_LEFT"/>后耗尽</translation>
<translation id="5980301590375426705">退出访客模式</translation>
-<translation id="4471417012762451363">电池电量为 <ph name="PERCENTAGE"/>% 并处于充电状态</translation>
<translation id="8308637677604853869">上一菜单</translation>
<translation id="4666297444214622512">无法登录到其他帐户。</translation>
<translation id="1346748346194534595">向右</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">未知网络错误</translation>
<translation id="1467432559032391204">向左</translation>
<translation id="5543001071567407895">短信</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">正在激活“<ph name="NAME"/>”</translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">最大化</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">已插入低功率充电器;可能无法保证充电成功。</translation>
<translation id="3784455785234192852">锁定</translation>
<translation id="2805756323405976993">应用</translation>
-<translation id="8871072142849158571"><ph name="DISPLAY_NAME"/>的分辨率已调整为 <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">激活失败</translation>
<translation id="5097002363526479830">无法连接到网络“<ph name="NAME"/>”:<ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi 已关闭。</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">设置壁纸...</translation>
<translation id="8678698760965522072">“在线”状态</translation>
<translation id="2532589005999780174">高反差模式</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>,<ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">内部错误</translation>
<translation id="3019353588588144572">电池电量将在 <ph name="TIME_REMAINING"/>后充满</translation>
<translation id="3473479545200714844">屏幕放大镜</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">退出会话</translation>
<translation id="8454013096329229812">Wi-Fi 已打开。</translation>
<translation id="4872237917498892622">Alt + 搜索键或 Shift</translation>
+<translation id="9201131092683066720">电池电量为<ph name="PERCENTAGE"/>%。</translation>
<translation id="2983818520079887040">设置...</translation>
+<translation id="1195412055398077112">过扫描</translation>
<translation id="1717216362413677834">基座模式</translation>
+<translation id="112308213915226829">自动隐藏底栏</translation>
<translation id="8927026611342028580">连接请求已发送</translation>
<translation id="8300849813060516376">OTASP 失败</translation>
<translation id="2792498699870441125">Alt + 搜索键</translation>
<translation id="8660803626959853127">正在同步 <ph name="COUNT"/> 个文件</translation>
+<translation id="5958529069007801266">受监管用户</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">CAPS LOCK 已关闭</translation>
<translation id="6248847161401822652">连按两次 Control+Shift+Q 即可退出。</translation>
+<translation id="6785414152754474415">电池电量为<ph name="PERCENTAGE"/>%(正在充电)。</translation>
<translation id="6267036997247669271"><ph name="NAME"/>:正在激活…</translation>
+<translation id="4895488851634969361">电池电量已满。</translation>
<translation id="1391854757121130358">您可能已用尽移动数据配额。</translation>
-<translation id="5413208160176941586">本地托管用户</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>:<ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">启动器位置</translation>
+<translation id="5947494881799873997">还原</translation>
<translation id="7593891976182323525">搜索键或 Shift</translation>
<translation id="7649070708921625228">帮助</translation>
<translation id="3050422059534974565">CAPS LOCK 已开启。
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">密码错误</translation>
<translation id="6165508094623778733">了解详情</translation>
<translation id="9046895021617826162">连接失败</translation>
+<translation id="7168224885072002358"><ph name="TIMEOUT_SECONDS"/>秒后恢复到原分辨率</translation>
<translation id="973896785707726617">该会话将在 <ph name="SESSION_TIME_REMAINING"/>后结束,到时您将自动退出。</translation>
<translation id="8372369524088641025">WEP 密钥错误</translation>
<translation id="6636709850131805001">未知状态</translation>
<translation id="3573179567135747900">重新更改为“<ph name="FROM_LOCALE"/>”(需要重启)</translation>
<translation id="8103386449138765447">短信数:<ph name="MESSAGE_COUNT"/> 条</translation>
<translation id="5045002648206642691">Google 云端硬盘设置...</translation>
-<translation id="1510238584712386396">启动器</translation>
<translation id="7209101170223508707">Caps Lock 已开启。
按 Alt + 搜索键或 Shift 可取消。</translation>
<translation id="8940956008527784070">电池电量不足 (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">接受</translation>
<translation id="5102001756192215136">可用时长:<ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">通过环聊共享您屏幕的控制权。</translation>
<translation id="8000066093800657092">未连接任何网络</translation>
<translation id="4015692727874266537">登录其他帐户…</translation>
<translation id="5941711191222866238">最小化</translation>
<translation id="6911468394164995108">连接其他...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>:<ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">还需要 <ph name="HOUR"/> 小时 <ph name="MINUTE"/> 分钟才能充满电</translation>
<translation id="6359806961507272919"><ph name="PHONE_NUMBER"/> 发来的短信</translation>
<translation id="1244147615850840081">运营商</translation>
diff --git a/chromium/ash/strings/ash_strings_zh-TW.xtb b/chromium/ash/strings/ash_strings_zh-TW.xtb
index 83261ecbf75..ac3d090bb42 100644
--- a/chromium/ash/strings/ash_strings_zh-TW.xtb
+++ b/chromium/ash/strings/ash_strings_zh-TW.xtb
@@ -2,22 +2,26 @@
<!DOCTYPE translationbundle>
<translationbundle lang="zh-TW">
<translation id="3595596368722241419">電池已充滿</translation>
-<translation id="5250713215130379958">自動隱藏啟動器</translation>
<translation id="7814236020522506259"><ph name="HOUR"/> 小時 <ph name="MINUTE"/> 分鐘</translation>
<translation id="7880025619322806991">入口網站狀態</translation>
<translation id="30155388420722288">溢位按鈕</translation>
+<translation id="8673028979667498656">270 度</translation>
<translation id="5571066253365925590">藍牙已啟用</translation>
+<translation id="6310121235600822547"><ph name="DISPLAY_NAME"/> 已旋轉到<ph name="ROTATION"/></translation>
<translation id="9074739597929991885">藍牙</translation>
<translation id="2268130516524549846">藍牙已停用</translation>
+<translation id="7165320105431587207">無法設定網路</translation>
<translation id="3775358506042162758">多帳戶登入功能一次只能登入最多 3 個帳戶。</translation>
<translation id="370649949373421643">啟用 Wi-Fi</translation>
<translation id="3626281679859535460">亮度</translation>
+<translation id="595202126637698455">效能追蹤已啟用</translation>
<translation id="8054466585765276473">正在計算電池使用時間。</translation>
<translation id="7982789257301363584">網路</translation>
<translation id="5565793151875479467">Proxy...</translation>
<translation id="938582441709398163">鍵盤自訂快速鍵</translation>
<translation id="4387004326333427325">遠端已拒絕驗證憑證</translation>
<translation id="6979158407327259162">Google 雲端硬碟</translation>
+<translation id="3683428399328702079"><ph name="DISPLAY_NAME"/> 的解析度已變更為 <ph name="RESOLUTION"/></translation>
<translation id="6943836128787782965">HTTP 擷取失敗</translation>
<translation id="2297568595583585744">狀態匣</translation>
<translation id="1661867754829461514">找不到 PIN</translation>
@@ -34,39 +38,41 @@
<translation id="2127372758936585790">低功率充電器</translation>
<translation id="3846575436967432996">沒有可用的網路資訊</translation>
<translation id="3026237328237090306">設定行動數據</translation>
+<translation id="5871632337994001636">管理裝置...</translation>
<translation id="785750925697875037">查看行動帳戶</translation>
<translation id="153454903766751181">正在初始化行動數據機...</translation>
<translation id="4628814525959230255">透過 Hangouts 與 <ph name="HELPER_NAME"/> 分享螢幕控制權。</translation>
-<translation id="8343941333792395995">已旋轉 <ph name="DISPLAY_NAME"/></translation>
<translation id="7864539943188674973">停用藍牙</translation>
<translation id="939252827960237676">無法儲存螢幕擷取畫面</translation>
<translation id="3126069444801937830">重新啟用即可更新</translation>
<translation id="2268813581635650749">登出所有使用者</translation>
<translation id="735745346212279324">已中斷 VPN 連線</translation>
<translation id="7320906967354320621">閒置</translation>
-<translation id="6303423059719347535">電池電量為 <ph name="PERCENTAGE"/>%</translation>
<translation id="15373452373711364">大型滑鼠游標</translation>
-<translation id="2778346081696727092">無法使用您所提供的使用者名稱或密碼進行驗證</translation>
<translation id="3294437725009624529">訪客</translation>
<translation id="8190698733819146287">自訂語言與輸入法...</translation>
+<translation id="1279938420744323401"><ph name="DISPLAY_NAME"/> (<ph name="ANNOTATION"/>)</translation>
+<translation id="2942516765047364088">檔案櫃位置</translation>
<translation id="2903907270192926896">輸入</translation>
<translation id="8676770494376880701">已連接低功率充電器</translation>
<translation id="7170041865419449892">超出範圍</translation>
<translation id="4804818685124855865">中斷連線</translation>
<translation id="2544853746127077729">網路已拒絕驗證憑證</translation>
<translation id="5222676887888702881">登出</translation>
+<translation id="2391579633712104609">180 度</translation>
<translation id="2688477613306174402">設定</translation>
<translation id="1272079795634619415">停止</translation>
<translation id="4957722034734105353">瞭解詳情...</translation>
<translation id="2964193600955408481">停用 WiFi</translation>
-<translation id="811680302244032017">新增裝置...</translation>
<translation id="4279490309300973883">鏡像</translation>
+<translation id="7973962044839454485">使用者名稱或密碼錯誤,導致 PPP 驗證失敗</translation>
<translation id="2509468283778169019">大寫鍵已啟用</translation>
<translation id="3892641579809465218">內部畫面</translation>
<translation id="7823564328645135659">同步處理您的設定後,系統已將語言從「<ph name="FROM_LOCALE"/>」變更為「<ph name="TO_LOCALE"/>」。</translation>
<translation id="3368922792935385530">已連線</translation>
<translation id="8340999562596018839">互動朗讀</translation>
<translation id="8654520615680304441">開啟 Wi-Fi...</translation>
+<translation id="8828714802988429505">90 度</translation>
<translation id="5825747213122829519">您的輸入法已變更為 <ph name="INPUT_METHOD_ID"/>。
按下 Shift + Alt 鍵即可切換。</translation>
<translation id="2562916301614567480">私人網路</translation>
@@ -83,11 +89,12 @@
<translation id="3626637461649818317">剩餘電量:<ph name="PERCENTAGE"/>%</translation>
<translation id="9089416786594320554">輸入法</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE"/>%</translation>
+<translation id="2825619548187458965">檔案櫃</translation>
<translation id="2614835198358683673">您的 Chromebook 可能無法在開機時充電。建議您使用官方提供的充電器。</translation>
<translation id="1895658205118569222">關閉</translation>
<translation id="4430019312045809116">音量</translation>
+<translation id="8681498213689260554">重新啟動並恢復原廠設定以進行更新</translation>
<translation id="4442424173763614572">DNS 查詢失敗</translation>
-<translation id="6356500677799115505">電池電量已滿 (充電中)。</translation>
<translation id="7874779702599364982">正在搜尋行動網路...</translation>
<translation id="583281660410589416">不明</translation>
<translation id="1383876407941801731">搜尋</translation>
@@ -96,7 +103,6 @@
<translation id="2204305834655267233">網路資訊</translation>
<translation id="1621499497873603021">電池剩餘使用時間:<ph name="TIME_LEFT"/></translation>
<translation id="5980301590375426705">結束訪客工作階段</translation>
-<translation id="4471417012762451363">電池電量為 <ph name="PERCENTAGE"/>% (充電中)</translation>
<translation id="8308637677604853869">前一個選單</translation>
<translation id="4666297444214622512">無法登入其他帳戶。</translation>
<translation id="1346748346194534595">向右</translation>
@@ -114,6 +120,7 @@
<translation id="6312403991423642364">不明的網路錯誤</translation>
<translation id="1467432559032391204">向左</translation>
<translation id="5543001071567407895">簡訊</translation>
+<translation id="1957803754585243749">0°</translation>
<translation id="2354174487190027830">正在啟用 <ph name="NAME"/></translation>
<translation id="8814190375133053267">Wi-Fi</translation>
<translation id="1398853756734560583">放到最大</translation>
@@ -123,7 +130,6 @@
<translation id="2727977024730340865">使用低功率充電器,可能導致充電狀態不穩定。</translation>
<translation id="3784455785234192852">鎖定</translation>
<translation id="2805756323405976993">應用程式</translation>
-<translation id="8871072142849158571">已將 <ph name="DISPLAY_NAME"/> 的大小重新調整為 <ph name="RESOLUTION"/></translation>
<translation id="1512064327686280138">啟用失敗</translation>
<translation id="5097002363526479830">無法連線至「<ph name="NAME"/>」:<ph name="DETAILS"/></translation>
<translation id="1850504506766569011">Wi-Fi 已關閉。</translation>
@@ -131,6 +137,7 @@
<translation id="7052914147756339792">設定桌布...</translation>
<translation id="8678698760965522072">線上狀態</translation>
<translation id="2532589005999780174">高反差模式</translation>
+<translation id="511445211639755999"><ph name="RESOLUTION"/>,<ph name="OVERSCAN"/></translation>
<translation id="1119447706177454957">內部錯誤</translation>
<translation id="3019353588588144572">電池剩餘充電時間:<ph name="TIME_REMAINING"/></translation>
<translation id="3473479545200714844">畫面放大鏡</translation>
@@ -153,20 +160,24 @@
<translation id="7029814467594812963">結束工作階段</translation>
<translation id="8454013096329229812">Wi-Fi 已開啟。</translation>
<translation id="4872237917498892622">Alt + 搜尋鍵或 Shift 鍵</translation>
+<translation id="9201131092683066720">電池電量為 <ph name="PERCENTAGE"/>%。</translation>
<translation id="2983818520079887040">設定...</translation>
+<translation id="1195412055398077112">遮視區域</translation>
<translation id="1717216362413677834">座架模式</translation>
+<translation id="112308213915226829">自動隱藏檔案櫃</translation>
<translation id="8927026611342028580">已要求連線</translation>
<translation id="8300849813060516376">OTASP 失敗</translation>
<translation id="2792498699870441125">Alt + 搜尋鍵</translation>
<translation id="8660803626959853127">正在同步處理 <ph name="COUNT"/> 個檔案</translation>
+<translation id="5958529069007801266">受監管的使用者</translation>
<translation id="3709443003275901162">9+</translation>
<translation id="639644700271529076">大寫鍵已關閉</translation>
<translation id="6248847161401822652">按兩下 Control、Shift 和 Q 鍵即可結束。</translation>
+<translation id="6785414152754474415">電池電量為 <ph name="PERCENTAGE"/>% (充電中)。</translation>
<translation id="6267036997247669271"><ph name="NAME"/>:正在啟用...</translation>
+<translation id="4895488851634969361">電池電量已滿。</translation>
<translation id="1391854757121130358">您可能已用盡行動數據配額。</translation>
-<translation id="5413208160176941586">本機管理化環境下的使用者</translation>
-<translation id="1059194134494239015"><ph name="DISPLAY_NAME"/>:<ph name="RESOLUTION"/></translation>
-<translation id="4864165860509564259">啟動器位置</translation>
+<translation id="5947494881799873997">還原</translation>
<translation id="7593891976182323525">搜尋鍵或 Shift 鍵</translation>
<translation id="7649070708921625228">說明</translation>
<translation id="3050422059534974565">大寫鍵已啟用。
@@ -179,22 +190,24 @@
<translation id="6692173217867674490">通關密語有誤</translation>
<translation id="6165508094623778733">瞭解詳情</translation>
<translation id="9046895021617826162">連線失敗</translation>
+<translation id="7168224885072002358">系統將在 <ph name="TIMEOUT_SECONDS"/> 秒後還原成原來的解析度</translation>
<translation id="973896785707726617">這個工作階段將在 <ph name="SESSION_TIME_REMAINING"/>後結束,系統會自動將您登出。</translation>
<translation id="8372369524088641025">WEP 金鑰有誤</translation>
<translation id="6636709850131805001">不明狀態</translation>
<translation id="3573179567135747900">改回「<ph name="FROM_LOCALE"/>」(需要重新啟動)</translation>
<translation id="8103386449138765447">簡訊數:<ph name="MESSAGE_COUNT"/></translation>
<translation id="5045002648206642691">Google 雲端硬碟設定...</translation>
-<translation id="1510238584712386396">啟動器</translation>
<translation id="7209101170223508707">大寫鍵已啟用。
按下 Alt + 搜尋鍵或 Shift 鍵即可取消。</translation>
<translation id="8940956008527784070">電池電量不足 (<ph name="PERCENTAGE"/>%)</translation>
+<translation id="4918086044614829423">接受</translation>
<translation id="5102001756192215136">電量剩餘時間:<ph name="HOUR"/>:<ph name="MINUTE"/></translation>
<translation id="520760366042891468">透過 Hangouts 分享螢幕控制權。</translation>
<translation id="8000066093800657092">沒有網路</translation>
<translation id="4015692727874266537">使用其他帳戶登入...</translation>
<translation id="5941711191222866238">縮到最小</translation>
<translation id="6911468394164995108">加入其他網路...</translation>
+<translation id="3678715477168044796"><ph name="DISPLAY_NAME"/>:<ph name="ANNOTATION"/></translation>
<translation id="412065659894267608">尚需 <ph name="HOUR"/> 小時 <ph name="MINUTE"/> 分鐘才能充滿電</translation>
<translation id="6359806961507272919">來自 <ph name="PHONE_NUMBER"/> 的簡訊</translation>
<translation id="1244147615850840081">通訊業者</translation>
diff --git a/chromium/ash/system/chromeos/network/network_connect.cc b/chromium/ash/system/chromeos/network/network_connect.cc
index 3aca1622223..d733a01fa64 100644
--- a/chromium/ash/system/chromeos/network/network_connect.cc
+++ b/chromium/ash/system/chromeos/network/network_connect.cc
@@ -66,7 +66,8 @@ void OnConnectFailed(const std::string& service_path,
if (error_name == NetworkConnectionHandler::kErrorConnectCanceled)
return;
- if (error_name == NetworkConnectionHandler::kErrorPassphraseRequired ||
+ if (error_name == flimflam::kErrorBadPassphrase ||
+ error_name == NetworkConnectionHandler::kErrorPassphraseRequired ||
error_name == NetworkConnectionHandler::kErrorConfigurationRequired ||
error_name == NetworkConnectionHandler::kErrorAuthenticationRequired) {
ash::Shell::GetInstance()->system_tray_delegate()->ConfigureNetwork(
@@ -96,7 +97,7 @@ void OnConnectFailed(const std::string& service_path,
ShowErrorNotification(error_name, service_path);
// Show a configure dialog for ConnectFailed errors.
- if (error_name != NetworkConnectionHandler::kErrorConnectFailed)
+ if (error_name != flimflam::kErrorConnectFailed)
return;
// If Shill reports an InProgress error, don't try to configure the network.
@@ -137,11 +138,10 @@ void CallConnectToNetwork(const std::string& service_path,
}
void OnActivateFailed(const std::string& service_path,
- const std::string& error_name,
+ const std::string& error_name,
scoped_ptr<base::DictionaryValue> error_data) {
NET_LOG_ERROR("Unable to activate network", service_path);
- ShowErrorNotification(
- NetworkConnectionHandler::kErrorActivateFailed, service_path);
+ ShowErrorNotification(network_connect::kErrorActivateFailed, service_path);
}
void OnActivateSucceeded(const std::string& service_path) {
@@ -246,6 +246,8 @@ void ConfigureSetProfileSucceeded(
namespace network_connect {
+const char kErrorActivateFailed[] = "activate-failed";
+
void ConnectToNetwork(const std::string& service_path,
gfx::NativeWindow owning_window) {
const bool check_error_state = true;
@@ -254,25 +256,27 @@ void ConnectToNetwork(const std::string& service_path,
void ActivateCellular(const std::string& service_path) {
NET_LOG_USER("ActivateCellular", service_path);
+ const NetworkState* cellular =
+ NetworkHandler::Get()->network_state_handler()->
+ GetNetworkState(service_path);
+ if (!cellular || cellular->type() != flimflam::kTypeCellular) {
+ NET_LOG_ERROR("ActivateCellular with no Service", service_path);
+ return;
+ }
const DeviceState* cellular_device =
NetworkHandler::Get()->network_state_handler()->
- GetDeviceStateByType(flimflam::kTypeCellular);
+ GetDeviceState(cellular->device_path());
if (!cellular_device) {
NET_LOG_ERROR("ActivateCellular with no Device", service_path);
return;
}
if (!IsDirectActivatedCarrier(cellular_device->carrier())) {
// For non direct activation, show the mobile setup dialog which can be
- // used to activate the network.
- ash::Shell::GetInstance()->system_tray_delegate()->ShowMobileSetup(
- service_path);
- return;
- }
- const NetworkState* cellular =
- NetworkHandler::Get()->network_state_handler()->
- GetNetworkState(service_path);
- if (!cellular || cellular->type() != flimflam::kTypeCellular) {
- NET_LOG_ERROR("ActivateCellular with no Service", service_path);
+ // used to activate the network. Only show the dialog, if an account
+ // management URL is available.
+ if (!cellular->payment_url().empty())
+ ash::Shell::GetInstance()->system_tray_delegate()->ShowMobileSetup(
+ service_path);
return;
}
if (cellular->activation_state() == flimflam::kActivationStateActivated) {
diff --git a/chromium/ash/system/chromeos/network/network_connect.h b/chromium/ash/system/chromeos/network/network_connect.h
index 65c430d073e..06656ce0548 100644
--- a/chromium/ash/system/chromeos/network/network_connect.h
+++ b/chromium/ash/system/chromeos/network/network_connect.h
@@ -18,6 +18,8 @@ class DictionaryValue;
namespace ash {
namespace network_connect {
+ASH_EXPORT extern const char kErrorActivateFailed[];
+
// Requests a network connection and handles any errors and notifications.
// |owning_window| is used to parent any UI on failure (e.g. for certificate
// enrollment). If NULL, the default window will be used.
diff --git a/chromium/ash/system/chromeos/network/network_icon.cc b/chromium/ash/system/chromeos/network/network_icon.cc
index efe7e07afc4..bd32a9f8b16 100644
--- a/chromium/ash/system/chromeos/network/network_icon.cc
+++ b/chromium/ash/system/chromeos/network/network_icon.cc
@@ -620,8 +620,9 @@ void NetworkIconImpl::GetBadges(const NetworkState* network, Badges* badges) {
// For networks that are always in roaming don't show roaming badge.
const DeviceState* device =
handler->GetDeviceState(network->device_path());
- DCHECK(device);
- if (!device->provider_requires_roaming()) {
+ LOG_IF(WARNING, !device) << "Could not find device state for "
+ << network->device_path();
+ if (!device || !device->provider_requires_roaming()) {
badges->bottom_right = rb.GetImageSkiaNamed(
IconTypeIsDark(icon_type_) ?
IDR_AURA_UBER_TRAY_NETWORK_ROAMING_DARK :
diff --git a/chromium/ash/system/chromeos/network/network_state_notifier.cc b/chromium/ash/system/chromeos/network/network_state_notifier.cc
index 1c971a32a44..47940d5f746 100644
--- a/chromium/ash/system/chromeos/network/network_state_notifier.cc
+++ b/chromium/ash/system/chromeos/network/network_state_notifier.cc
@@ -35,7 +35,7 @@ string16 GetConnectErrorString(const std::string& error_name) {
if (error_name == NetworkConnectionHandler::kErrorConfigureFailed)
return l10n_util::GetStringUTF16(
IDS_CHROMEOS_NETWORK_ERROR_CONFIGURE_FAILED);
- if (error_name == NetworkConnectionHandler::kErrorActivateFailed)
+ if (error_name == ash::network_connect::kErrorActivateFailed)
return l10n_util::GetStringUTF16(
IDS_CHROMEOS_NETWORK_ERROR_ACTIVATION_FAILED);
return string16();
@@ -71,7 +71,7 @@ void NetworkStateNotifier::NetworkListChanged() {
// case a connect attempt fails because a network is no longer visible.
if (!connect_failed_network_.empty()) {
ShowNetworkConnectError(
- NetworkConnectionHandler::kErrorConnectFailed, connect_failed_network_);
+ flimflam::kErrorConnectFailed, connect_failed_network_);
}
}
@@ -92,7 +92,7 @@ void NetworkStateNotifier::NetworkPropertiesUpdated(
// property has been set.
if (network->path() == connect_failed_network_ && !network->error().empty()) {
ShowNetworkConnectError(
- NetworkConnectionHandler::kErrorConnectFailed, connect_failed_network_);
+ flimflam::kErrorConnectFailed, connect_failed_network_);
}
// Trigger "Out of credits" notification if the cellular network is the most
// recent default network (i.e. we have not switched to another network).
@@ -141,7 +141,7 @@ void NetworkStateNotifier::ShowNetworkConnectError(
const std::string& service_path) {
const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
GetNetworkState(service_path);
- if (error_name == NetworkConnectionHandler::kErrorConnectFailed &&
+ if (error_name == flimflam::kErrorConnectFailed &&
service_path != connect_failed_network_) {
// Shill may not have set the Error property yet. First request an update
// and wait for either the update to complete or the network list to be
diff --git a/chromium/ash/system/chromeos/network/network_state_notifier_unittest.cc b/chromium/ash/system/chromeos/network/network_state_notifier_unittest.cc
index d8d036ad653..6e2069deb65 100644
--- a/chromium/ash/system/chromeos/network/network_state_notifier_unittest.cc
+++ b/chromium/ash/system/chromeos/network/network_state_notifier_unittest.cc
@@ -14,6 +14,7 @@
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/shill_device_client.h"
#include "chromeos/dbus/shill_service_client.h"
+#include "chromeos/network/network_connection_handler.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
namespace {
@@ -26,6 +27,8 @@ ash::SystemTray* GetSystemTray() {
} // namespace
using chromeos::DBusThreadManager;
+using chromeos::NetworkHandler;
+using chromeos::NetworkConnectionHandler;
using chromeos::ShillDeviceClient;
using chromeos::ShillServiceClient;
@@ -40,12 +43,14 @@ class NetworkStateNotifierTest : public AshTestBase {
virtual void SetUp() OVERRIDE {
DBusThreadManager::InitializeWithStub();
SetupDefaultShillState();
+ NetworkHandler::Initialize();
RunAllPendingInMessageLoop();
AshTestBase::SetUp();
}
virtual void TearDown() OVERRIDE {
AshTestBase::TearDown();
+ NetworkHandler::Shutdown();
DBusThreadManager::Shutdown();
}
diff --git a/chromium/ash/system/chromeos/network/sms_observer.h b/chromium/ash/system/chromeos/network/sms_observer.h
new file mode 100644
index 00000000000..bc5496780d1
--- /dev/null
+++ b/chromium/ash/system/chromeos/network/sms_observer.h
@@ -0,0 +1,26 @@
+// 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 ASH_SYSTEM_CHROMEOS_NETWORK_SMS_OBSERVER_H
+#define ASH_SYSTEM_CHROMEOS_NETWORK_SMS_OBSERVER_H
+
+namespace base {
+class DictionaryValue;
+}
+
+namespace ash {
+
+const char kSmsNumberKey[] = "number";
+const char kSmsTextKey[] = "text";
+
+class SmsObserver {
+ public:
+ virtual ~SmsObserver() {}
+
+ virtual void AddMessage(const base::DictionaryValue& message) = 0;
+};
+
+} // namespace ash
+
+#endif // ASH_SYSTEM_CHROMEOS_NETWORK_SMS_OBSERVER_H
diff --git a/chromium/ash/system/chromeos/network/tray_sms.cc b/chromium/ash/system/chromeos/network/tray_sms.cc
index 008129faa5f..982a5643181 100644
--- a/chromium/ash/system/chromeos/network/tray_sms.cc
+++ b/chromium/ash/system/chromeos/network/tray_sms.cc
@@ -16,8 +16,6 @@
#include "ash/system/tray/tray_notification_view.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
-#include "chromeos/network/network_event_log.h"
-#include "chromeos/network/network_handler.h"
#include "grit/ash_resources.h"
#include "grit/ash_strings.h"
#include "ui/base/l10n/l10n_util.h"
@@ -37,15 +35,12 @@ const int kMessageListMinHeight = 200;
// Top/bottom padding of the text items.
const int kPaddingVertical = 10;
-const char kSmsNumberKey[] = "number";
-const char kSmsTextKey[] = "text";
-
bool GetMessageFromDictionary(const base::DictionaryValue* message,
std::string* number,
std::string* text) {
- if (!message->GetStringWithoutPathExpansion(kSmsNumberKey, number))
+ if (!message->GetStringWithoutPathExpansion(ash::kSmsNumberKey, number))
return false;
- if (!message->GetStringWithoutPathExpansion(kSmsTextKey, text))
+ if (!message->GetStringWithoutPathExpansion(ash::kSmsTextKey, text))
return false;
return true;
}
@@ -286,14 +281,11 @@ TraySms::TraySms(SystemTray* system_tray)
default_(NULL),
detailed_(NULL),
notification_(NULL) {
- // TODO(armansito): SMS could be a special case for cellular that requires a
- // user (perhaps the owner) to be logged in. If that is the case, then an
- // additional check should be done before subscribing for SMS notifications.
- chromeos::NetworkHandler::Get()->network_sms_handler()->AddObserver(this);
+ Shell::GetInstance()->system_tray_notifier()->AddSmsObserver(this);
}
TraySms::~TraySms() {
- chromeos::NetworkHandler::Get()->network_sms_handler()->RemoveObserver(this);
+ Shell::GetInstance()->system_tray_notifier()->RemoveSmsObserver(this);
}
views::View* TraySms::CreateDefaultView(user::LoginStatus status) {
@@ -335,35 +327,8 @@ void TraySms::DestroyNotificationView() {
notification_ = NULL;
}
-void TraySms::MessageReceived(const base::DictionaryValue& message) {
-
- std::string message_text;
- if (!message.GetStringWithoutPathExpansion(
- chromeos::NetworkSmsHandler::kTextKey, &message_text)) {
- NET_LOG_ERROR("SMS message contains no content.", "");
- return;
- }
- // TODO(armansito): A message might be due to a special "Message Waiting"
- // state that the message is in. Once SMS handling moves to shill, such
- // messages should be filtered there so that this check becomes unnecessary.
- if (message_text.empty()) {
- NET_LOG_DEBUG("SMS has empty content text. Ignoring.", "");
- return;
- }
- std::string message_number;
- if (!message.GetStringWithoutPathExpansion(
- chromeos::NetworkSmsHandler::kNumberKey, &message_number)) {
- NET_LOG_DEBUG("SMS contains no number. Ignoring.", "");
- return;
- }
-
- NET_LOG_DEBUG("Received SMS from: " + message_number + " with text: " +
- message_text, "");
-
- base::DictionaryValue* dict = new base::DictionaryValue();
- dict->SetString(kSmsNumberKey, message_number);
- dict->SetString(kSmsTextKey, message_text);
- messages_.Append(dict);
+void TraySms::AddMessage(const base::DictionaryValue& message) {
+ messages_.Append(message.DeepCopy());
Update(true);
}
diff --git a/chromium/ash/system/chromeos/network/tray_sms.h b/chromium/ash/system/chromeos/network/tray_sms.h
index 5a79360052a..7fc334b7ebd 100644
--- a/chromium/ash/system/chromeos/network/tray_sms.h
+++ b/chromium/ash/system/chromeos/network/tray_sms.h
@@ -7,15 +7,15 @@
#include <string>
+#include "ash/system/chromeos/network/sms_observer.h"
#include "ash/system/tray/system_tray_item.h"
#include "base/values.h"
-#include "chromeos/network/network_sms_handler.h"
namespace ash {
namespace internal {
class TraySms : public SystemTrayItem,
- public chromeos::NetworkSmsHandler::Observer {
+ public SmsObserver {
public:
explicit TraySms(SystemTray* system_tray);
virtual ~TraySms();
@@ -29,8 +29,8 @@ class TraySms : public SystemTrayItem,
virtual void DestroyDetailedView() OVERRIDE;
virtual void DestroyNotificationView() OVERRIDE;
- // Overridden from chromeos::NetworkSmsHandler::Observer.
- virtual void MessageReceived(const base::DictionaryValue& message) OVERRIDE;
+ // Overridden from SmsObserver.
+ virtual void AddMessage(const base::DictionaryValue& message) OVERRIDE;
protected:
class SmsDefaultView;
@@ -45,8 +45,7 @@ class TraySms : public SystemTrayItem,
// Removes message at |index| from message list.
void RemoveMessage(size_t index);
- // Called when sms messages have changed (through
- // chromeos::NetworkSmsHandler::Observer).
+ // Called when sms messages have changed (by tray::SmsObserver).
void Update(bool notify);
base::ListValue& messages() { return messages_; }
diff --git a/chromium/ash/system/chromeos/settings/tray_settings.cc b/chromium/ash/system/chromeos/settings/tray_settings.cc
index 8153aeae81e..8868b7cf50d 100644
--- a/chromium/ash/system/chromeos/settings/tray_settings.cc
+++ b/chromium/ash/system/chromeos/settings/tray_settings.cc
@@ -142,6 +142,9 @@ views::View* TraySettings::CreateDefaultView(user::LoginStatus status) {
!PowerStatus::Get()->IsBatteryPresent())
return NULL;
+ if (!ash::Shell::GetInstance()->system_tray_delegate()->ShouldShowSettings())
+ return NULL;
+
CHECK(default_view_ == NULL);
default_view_ = new tray::SettingsDefaultView(status);
return default_view_;
diff --git a/chromium/ash/system/logout_button/logout_button_tray.cc b/chromium/ash/system/logout_button/logout_button_tray.cc
deleted file mode 100644
index f62921f1a08..00000000000
--- a/chromium/ash/system/logout_button/logout_button_tray.cc
+++ /dev/null
@@ -1,158 +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 "ash/system/logout_button/logout_button_tray.h"
-
-#include "ash/shelf/shelf_types.h"
-#include "ash/shell.h"
-#include "ash/system/status_area_widget.h"
-#include "ash/system/tray/system_tray_delegate.h"
-#include "ash/system/tray/system_tray_notifier.h"
-#include "ash/system/tray/tray_constants.h"
-#include "ash/system/tray/tray_utils.h"
-#include "base/logging.h"
-#include "grit/ash_resources.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "ui/base/events/event.h"
-#include "ui/gfx/font.h"
-#include "ui/gfx/insets.h"
-#include "ui/gfx/size.h"
-#include "ui/views/bubble/tray_bubble_view.h"
-#include "ui/views/controls/button/label_button.h"
-#include "ui/views/controls/button/label_button_border.h"
-#include "ui/views/painter.h"
-
-namespace ash {
-
-namespace internal {
-
-namespace {
-
-const int kLogoutButtonHorizontalExtraPadding = 7;
-
-const int kLogoutButtonNormalImages[] = {
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_TOP_LEFT,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_TOP,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_TOP_RIGHT,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_LEFT,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_CENTER,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_RIGHT,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_BOTTOM_LEFT,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_BOTTOM,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_BOTTOM_RIGHT
-};
-
-const int kLogoutButtonPushedImages[] = {
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_TOP_LEFT,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_TOP,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_TOP_RIGHT,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_LEFT,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_CENTER,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_RIGHT,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_BOTTOM_LEFT,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_BOTTOM,
- IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_BOTTOM_RIGHT
-};
-
-class LogoutButton : public views::LabelButton {
- public:
- LogoutButton(views::ButtonListener* listener);
- virtual ~LogoutButton();
-
- private:
- DISALLOW_COPY_AND_ASSIGN(LogoutButton);
-};
-
-} // namespace
-
-LogoutButton::LogoutButton(views::ButtonListener* listener)
- : views::LabelButton(listener, base::string16()) {
- SetupLabelForTray(label());
- SetFont(GetFont().DeriveFont(0, gfx::Font::NORMAL));
- for (size_t state = 0; state < views::Button::STATE_COUNT; ++state)
- SetTextColor(static_cast<views::Button::ButtonState>(state), SK_ColorWHITE);
-
- views::LabelButtonBorder* border =
- new views::LabelButtonBorder(views::Button::STYLE_TEXTBUTTON);
- border->SetPainter(false, views::Button::STATE_NORMAL,
- views::Painter::CreateImageGridPainter(kLogoutButtonNormalImages));
- border->SetPainter(false, views::Button::STATE_HOVERED,
- views::Painter::CreateImageGridPainter(kLogoutButtonNormalImages));
- border->SetPainter(false, views::Button::STATE_PRESSED,
- views::Painter::CreateImageGridPainter(kLogoutButtonPushedImages));
- gfx::Insets insets = border->GetInsets();
- insets += gfx::Insets(0, kLogoutButtonHorizontalExtraPadding,
- 0, kLogoutButtonHorizontalExtraPadding);
- border->set_insets(insets);
- set_border(border);
- set_animate_on_state_change(false);
-
- set_min_size(gfx::Size(0, GetShelfItemHeight()));
-}
-
-LogoutButton::~LogoutButton() {
-}
-
-LogoutButtonTray::LogoutButtonTray(StatusAreaWidget* status_area_widget)
- : TrayBackgroundView(status_area_widget),
- button_(NULL),
- login_status_(user::LOGGED_IN_NONE),
- show_logout_button_in_tray_(false) {
- button_ = new LogoutButton(this);
- tray_container()->AddChildView(button_);
- tray_container()->set_border(NULL);
- Shell::GetInstance()->system_tray_notifier()->AddLogoutButtonObserver(this);
-}
-
-LogoutButtonTray::~LogoutButtonTray() {
- Shell::GetInstance()->system_tray_notifier()->
- RemoveLogoutButtonObserver(this);
-}
-
-void LogoutButtonTray::SetShelfAlignment(ShelfAlignment alignment) {
- TrayBackgroundView::SetShelfAlignment(alignment);
- tray_container()->set_border(NULL);
-}
-
-base::string16 LogoutButtonTray::GetAccessibleNameForTray() {
- return button_->GetText();
-}
-
-void LogoutButtonTray::HideBubbleWithView(
- const views::TrayBubbleView* bubble_view) {
-}
-
-bool LogoutButtonTray::ClickedOutsideBubble() {
- return false;
-}
-
-void LogoutButtonTray::OnShowLogoutButtonInTrayChanged(bool show) {
- show_logout_button_in_tray_ = show;
- UpdateVisibility();
-}
-
-void LogoutButtonTray::ButtonPressed(views::Button* sender,
- const ui::Event& event) {
- DCHECK_EQ(sender, button_);
- Shell::GetInstance()->system_tray_delegate()->SignOut();
-}
-
-void LogoutButtonTray::UpdateAfterLoginStatusChange(
- user::LoginStatus login_status) {
- login_status_ = login_status;
- const base::string16 title =
- GetLocalizedSignOutStringForStatus(login_status, false);
- button_->SetText(title);
- button_->SetAccessibleName(title);
- UpdateVisibility();
-}
-
-void LogoutButtonTray::UpdateVisibility() {
- SetVisible(show_logout_button_in_tray_ &&
- login_status_ != user::LOGGED_IN_NONE &&
- login_status_ != user::LOGGED_IN_LOCKED);
-}
-
-} // namespace internal
-} // namespace ash
diff --git a/chromium/ash/system/logout_button/logout_button_tray.h b/chromium/ash/system/logout_button/logout_button_tray.h
deleted file mode 100644
index 5683e5e2654..00000000000
--- a/chromium/ash/system/logout_button/logout_button_tray.h
+++ /dev/null
@@ -1,62 +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 ASH_SYSTEM_LOGOUT_BUTTON_LOGOUT_BUTTON_TRAY_H_
-#define ASH_SYSTEM_LOGOUT_BUTTON_LOGOUT_BUTTON_TRAY_H_
-
-#include "ash/system/logout_button/logout_button_observer.h"
-#include "ash/system/tray/tray_background_view.h"
-#include "ash/system/user/login_status.h"
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "ui/views/controls/button/button.h"
-
-namespace views {
-class LabelButton;
-}
-
-namespace ash {
-namespace internal {
-
-class StatusAreaWidget;
-
-// Adds a logout button to the launcher's status area if enabled by the
-// kShowLogoutButtonInTray pref.
-class LogoutButtonTray : public TrayBackgroundView,
- public LogoutButtonObserver,
- public views::ButtonListener {
- public:
- explicit LogoutButtonTray(StatusAreaWidget* status_area_widget);
- virtual ~LogoutButtonTray();
-
- // TrayBackgroundView:
- virtual void SetShelfAlignment(ShelfAlignment alignment) OVERRIDE;
- virtual base::string16 GetAccessibleNameForTray() OVERRIDE;
- virtual void HideBubbleWithView(
- const views::TrayBubbleView* bubble_view) OVERRIDE;
- virtual bool ClickedOutsideBubble() OVERRIDE;
-
- // LogoutButtonObserver:
- virtual void OnShowLogoutButtonInTrayChanged(bool show) OVERRIDE;
-
- // views::ButtonListener:
- virtual void ButtonPressed(views::Button* sender,
- const ui::Event& event) OVERRIDE;
-
- void UpdateAfterLoginStatusChange(user::LoginStatus login_status);
-
- private:
- void UpdateVisibility();
-
- views::LabelButton* button_; // Not owned.
- user::LoginStatus login_status_;
- bool show_logout_button_in_tray_;
-
- DISALLOW_COPY_AND_ASSIGN(LogoutButtonTray);
-};
-
-} // namespace internal
-} // namespace ash
-
-#endif // ASH_SYSTEM_LOGOUT_BUTTON_LOGOUT_BUTTON_TRAY_H_
diff --git a/chromium/ash/system/logout_button/tray_logout_button.cc b/chromium/ash/system/logout_button/tray_logout_button.cc
new file mode 100644
index 00000000000..102329c9a22
--- /dev/null
+++ b/chromium/ash/system/logout_button/tray_logout_button.cc
@@ -0,0 +1,168 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/system/logout_button/tray_logout_button.h"
+
+#include <cstddef>
+
+#include "ash/shell.h"
+#include "ash/system/tray/system_tray_delegate.h"
+#include "ash/system/tray/system_tray_notifier.h"
+#include "ash/system/tray/tray_constants.h"
+#include "ash/system/user/login_status.h"
+#include "base/logging.h"
+#include "base/strings/string16.h"
+#include "grit/ash_resources.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/views/border.h"
+#include "ui/views/controls/button/button.h"
+#include "ui/views/controls/button/custom_button.h"
+#include "ui/views/controls/button/label_button.h"
+#include "ui/views/controls/button/label_button_border.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/view.h"
+
+namespace {
+
+const int kLogoutButtonNormalImages[] = {
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_TOP_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_TOP,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_TOP_RIGHT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_CENTER,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_RIGHT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_BOTTOM_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_BOTTOM,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_NORMAL_BOTTOM_RIGHT
+};
+const int kLogoutButtonHotImages[] = {
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_TOP_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_TOP,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_TOP_RIGHT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_CENTER,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_RIGHT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_BOTTOM_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_BOTTOM,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_HOT_BOTTOM_RIGHT
+};
+const int kLogoutButtonPushedImages[] = {
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_TOP_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_TOP,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_TOP_RIGHT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_CENTER,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_RIGHT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_BOTTOM_LEFT,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_BOTTOM,
+ IDR_AURA_UBER_TRAY_LOGOUT_BUTTON_PUSHED_BOTTOM_RIGHT
+};
+
+} // namespace
+
+namespace ash {
+namespace internal {
+
+namespace tray {
+
+class LogoutButton : public views::View,
+ public views::ButtonListener {
+ public:
+ LogoutButton(user::LoginStatus status) : button_(NULL),
+ login_status_(user::LOGGED_IN_NONE),
+ show_logout_button_in_tray_(false) {
+ views::BoxLayout* layout = new views::BoxLayout(
+ views::BoxLayout::kHorizontal, 0, 0, 0);
+ layout->set_spread_blank_space(true);
+ SetLayoutManager(layout);
+ set_border(views::Border::CreateEmptyBorder(
+ 0, kTrayLabelItemHorizontalPaddingBottomAlignment, 0, 0));
+
+ button_ = new views::LabelButton(this, base::string16());
+ for (size_t state = 0; state < views::Button::STATE_COUNT; ++state) {
+ button_->SetTextColor(
+ static_cast<views::Button::ButtonState>(state), SK_ColorWHITE);
+ }
+ button_->SetFont(button_->GetFont().DeriveFont(1));
+ views::LabelButtonBorder* border =
+ new views::LabelButtonBorder(views::Button::STYLE_TEXTBUTTON);
+ border->SetPainter(false, views::Button::STATE_NORMAL,
+ views::Painter::CreateImageGridPainter(kLogoutButtonNormalImages));
+ border->SetPainter(false, views::Button::STATE_HOVERED,
+ views::Painter::CreateImageGridPainter(kLogoutButtonHotImages));
+ border->SetPainter(false, views::Button::STATE_PRESSED,
+ views::Painter::CreateImageGridPainter(kLogoutButtonPushedImages));
+ button_->set_border(border);
+ AddChildView(button_);
+ OnLoginStatusChanged(status);
+ }
+
+ void OnLoginStatusChanged(user::LoginStatus status) {
+ login_status_ = status;
+ const base::string16 title = GetLocalizedSignOutStringForStatus(
+ login_status_, false);
+ button_->SetText(title);
+ button_->SetAccessibleName(title);
+ UpdateVisibility();
+ }
+
+ void OnShowLogoutButtonInTrayChanged(bool show) {
+ show_logout_button_in_tray_ = show;
+ UpdateVisibility();
+ }
+
+ // Overridden from views::ButtonListener.
+ virtual void ButtonPressed(views::Button* sender,
+ const ui::Event& event) OVERRIDE {
+ DCHECK_EQ(sender, button_);
+ Shell::GetInstance()->system_tray_delegate()->SignOut();
+ }
+
+ private:
+ void UpdateVisibility() {
+ SetVisible(show_logout_button_in_tray_ &&
+ login_status_ != user::LOGGED_IN_NONE &&
+ login_status_ != user::LOGGED_IN_LOCKED);
+ }
+
+ views::LabelButton* button_;
+ user::LoginStatus login_status_;
+ bool show_logout_button_in_tray_;
+
+ DISALLOW_COPY_AND_ASSIGN(LogoutButton);
+};
+
+} // namespace tray
+
+TrayLogoutButton::TrayLogoutButton(SystemTray* system_tray)
+ : SystemTrayItem(system_tray),
+ logout_button_(NULL) {
+ Shell::GetInstance()->system_tray_notifier()->AddLogoutButtonObserver(this);
+}
+
+TrayLogoutButton::~TrayLogoutButton() {
+ Shell::GetInstance()->system_tray_notifier()->
+ RemoveLogoutButtonObserver(this);
+}
+
+views::View* TrayLogoutButton::CreateTrayView(user::LoginStatus status) {
+ CHECK(logout_button_ == NULL);
+ logout_button_ = new tray::LogoutButton(status);
+ return logout_button_;
+}
+
+void TrayLogoutButton::DestroyTrayView() {
+ logout_button_ = NULL;
+}
+
+void TrayLogoutButton::UpdateAfterLoginStatusChange(user::LoginStatus status) {
+ logout_button_->OnLoginStatusChanged(status);
+}
+
+void TrayLogoutButton::OnShowLogoutButtonInTrayChanged(bool show) {
+ logout_button_->OnShowLogoutButtonInTrayChanged(show);
+}
+
+} // namespace internal
+} // namespace ash
diff --git a/chromium/ash/system/logout_button/tray_logout_button.h b/chromium/ash/system/logout_button/tray_logout_button.h
new file mode 100644
index 00000000000..50ca9f9c2c1
--- /dev/null
+++ b/chromium/ash/system/logout_button/tray_logout_button.h
@@ -0,0 +1,44 @@
+// 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 ASH_SYSTEM_LOGOUT_BUTTON_TRAY_LOGOUT_BUTTON_H_
+#define ASH_SYSTEM_LOGOUT_BUTTON_TRAY_LOGOUT_BUTTON_H_
+
+#include "ash/system/logout_button/logout_button_observer.h"
+#include "ash/system/tray/system_tray_item.h"
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+
+namespace ash {
+namespace internal {
+
+namespace tray {
+class LogoutButton;
+}
+
+// Adds a logout button to the system tray if enabled by the
+// kShowLogoutButtonInTray pref.
+class TrayLogoutButton : public SystemTrayItem, public LogoutButtonObserver {
+ public:
+ explicit TrayLogoutButton(SystemTray* system_tray);
+ virtual ~TrayLogoutButton();
+
+ // Overridden from SystemTrayItem.
+ virtual views::View* CreateTrayView(user::LoginStatus status) OVERRIDE;
+ virtual void DestroyTrayView() OVERRIDE;
+ virtual void UpdateAfterLoginStatusChange(user::LoginStatus status) OVERRIDE;
+
+ // Overridden from LogoutButtonObserver.
+ virtual void OnShowLogoutButtonInTrayChanged(bool show) OVERRIDE;
+
+ private:
+ tray::LogoutButton* logout_button_;
+
+ DISALLOW_COPY_AND_ASSIGN(TrayLogoutButton);
+};
+
+} // namespace internal
+} // namespace ash
+
+#endif // ASH_SYSTEM_LOGOUT_BUTTON_TRAY_LOGOUT_BUTTON_H_
diff --git a/chromium/ash/system/status_area_widget.cc b/chromium/ash/system/status_area_widget.cc
index ed31ba286fd..147251c6f52 100644
--- a/chromium/ash/system/status_area_widget.cc
+++ b/chromium/ash/system/status_area_widget.cc
@@ -11,7 +11,6 @@
#include "ash/shell_delegate.h"
#include "ash/shell_window_ids.h"
#include "ash/system/bluetooth/bluetooth_observer.h"
-#include "ash/system/logout_button/logout_button_tray.h"
#include "ash/system/status_area_widget_delegate.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/system_tray_delegate.h"
@@ -31,7 +30,6 @@ StatusAreaWidget::StatusAreaWidget(aura::Window* status_container)
: status_area_widget_delegate_(new internal::StatusAreaWidgetDelegate),
system_tray_(NULL),
web_notification_tray_(NULL),
- logout_button_tray_(NULL),
login_status_(user::LOGGED_IN_NONE) {
views::Widget::InitParams params(
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
@@ -50,7 +48,6 @@ StatusAreaWidget::~StatusAreaWidget() {
void StatusAreaWidget::CreateTrayViews() {
AddSystemTray();
AddWebNotificationTray();
- AddLogoutButtonTray();
SystemTrayDelegate* delegate =
ash::Shell::GetInstance()->system_tray_delegate();
DCHECK(delegate);
@@ -59,8 +56,6 @@ void StatusAreaWidget::CreateTrayViews() {
system_tray_->InitializeTrayItems(delegate);
if (web_notification_tray_)
web_notification_tray_->Initialize();
- if (logout_button_tray_)
- logout_button_tray_->Initialize();
UpdateAfterLoginStatusChange(delegate->GetUserLoginStatus());
}
@@ -68,8 +63,6 @@ void StatusAreaWidget::Shutdown() {
// Destroy the trays early, causing them to be removed from the view
// hierarchy. Do not used scoped pointers since we don't want to destroy them
// in the destructor if Shutdown() is not called (e.g. in tests).
- delete logout_button_tray_;
- logout_button_tray_ = NULL;
delete web_notification_tray_;
web_notification_tray_ = NULL;
delete system_tray_;
@@ -114,19 +107,12 @@ void StatusAreaWidget::AddWebNotificationTray() {
status_area_widget_delegate_->AddTray(web_notification_tray_);
}
-void StatusAreaWidget::AddLogoutButtonTray() {
- logout_button_tray_ = new LogoutButtonTray(this);
- status_area_widget_delegate_->AddTray(logout_button_tray_);
-}
-
void StatusAreaWidget::SetShelfAlignment(ShelfAlignment alignment) {
status_area_widget_delegate_->set_alignment(alignment);
if (system_tray_)
system_tray_->SetShelfAlignment(alignment);
if (web_notification_tray_)
web_notification_tray_->SetShelfAlignment(alignment);
- if (logout_button_tray_)
- logout_button_tray_->SetShelfAlignment(alignment);
status_area_widget_delegate_->UpdateLayout();
}
@@ -148,8 +134,6 @@ void StatusAreaWidget::UpdateAfterLoginStatusChange(
system_tray_->UpdateAfterLoginStatusChange(login_status);
if (web_notification_tray_)
web_notification_tray_->UpdateAfterLoginStatusChange(login_status);
- if (logout_button_tray_)
- logout_button_tray_->UpdateAfterLoginStatusChange(login_status);
}
} // namespace internal
diff --git a/chromium/ash/system/status_area_widget.h b/chromium/ash/system/status_area_widget.h
index 6a4cb2a40aa..5283535f5a0 100644
--- a/chromium/ash/system/status_area_widget.h
+++ b/chromium/ash/system/status_area_widget.h
@@ -18,7 +18,6 @@ class WebNotificationTray;
namespace internal {
-class LogoutButtonTray;
class StatusAreaWidgetDelegate;
class ASH_EXPORT StatusAreaWidget : public views::Widget {
@@ -28,7 +27,7 @@ class ASH_EXPORT StatusAreaWidget : public views::Widget {
explicit StatusAreaWidget(aura::Window* status_container);
virtual ~StatusAreaWidget();
- // Creates the SystemTray, WebNotificationTray and LogoutButtonTray.
+ // Creates the SystemTray and the WebNotificationTray.
void CreateTrayViews();
// Destroys the system tray and web notification tray. Called before
@@ -73,13 +72,11 @@ class ASH_EXPORT StatusAreaWidget : public views::Widget {
private:
void AddSystemTray();
void AddWebNotificationTray();
- void AddLogoutButtonTray();
// Weak pointers to View classes that are parented to StatusAreaWidget:
internal::StatusAreaWidgetDelegate* status_area_widget_delegate_;
SystemTray* system_tray_;
WebNotificationTray* web_notification_tray_;
- LogoutButtonTray* logout_button_tray_;
user::LoginStatus login_status_;
DISALLOW_COPY_AND_ASSIGN(StatusAreaWidget);
diff --git a/chromium/ash/system/tray/system_tray.cc b/chromium/ash/system/tray/system_tray.cc
index 47157ea46ff..122253f9986 100644
--- a/chromium/ash/system/tray/system_tray.cc
+++ b/chromium/ash/system/tray/system_tray.cc
@@ -15,6 +15,7 @@
#include "ash/system/date/tray_date.h"
#include "ash/system/drive/tray_drive.h"
#include "ash/system/ime/tray_ime.h"
+#include "ash/system/logout_button/tray_logout_button.h"
#include "ash/system/monitor/tray_monitor.h"
#include "ash/system/session_length_limit/tray_session_length_limit.h"
#include "ash/system/status_area_widget.h"
@@ -146,6 +147,7 @@ void SystemTray::InitializeTrayItems(SystemTrayDelegate* delegate) {
void SystemTray::CreateItems(SystemTrayDelegate* delegate) {
#if !defined(OS_WIN)
AddTrayItem(new internal::TraySessionLengthLimit(this));
+ AddTrayItem(new internal::TrayLogoutButton(this));
// In multi-profile user mode we can have multiple user tiles.
ash::Shell* shell = ash::Shell::GetInstance();
int maximum_user_profiles =
diff --git a/chromium/ash/system/tray/system_tray.h b/chromium/ash/system/tray/system_tray.h
index b37a643205a..ded64750026 100644
--- a/chromium/ash/system/tray/system_tray.h
+++ b/chromium/ash/system/tray/system_tray.h
@@ -36,6 +36,7 @@ class UpdateObserver;
class UserObserver;
#if defined(OS_CHROMEOS)
class NetworkObserver;
+class SmsObserver;
#endif
class SystemTrayItem;
diff --git a/chromium/ash/system/tray/system_tray_delegate.h b/chromium/ash/system/tray/system_tray_delegate.h
index a66726b8232..0742ad147ad 100644
--- a/chromium/ash/system/tray/system_tray_delegate.h
+++ b/chromium/ash/system/tray/system_tray_delegate.h
@@ -156,6 +156,9 @@ class SystemTrayDelegate {
// Shows settings.
virtual void ShowSettings() = 0;
+ // Returns true if settings menu item should appear.
+ virtual bool ShouldShowSettings() = 0;
+
// Shows the settings related to date, timezone etc.
virtual void ShowDateSettings() = 0;
@@ -288,6 +291,16 @@ class SystemTrayDelegate {
// Returns whether bluetooth is enabled.
virtual bool GetBluetoothEnabled() = 0;
+ // Retrieves information about the carrier and locale specific |setup_url|.
+ // If none of the carrier info/setup URL cannot be retrieved, returns false.
+ // Note: |setup_url| is returned when carrier is not defined (no SIM card).
+ virtual bool GetCellularCarrierInfo(std::string* carrier_id,
+ std::string* topup_url,
+ std::string* setup_url) = 0;
+
+ // Opens the cellular network specific URL.
+ virtual void ShowCellularURL(const std::string& url) = 0;
+
// Shows UI for changing proxy settings.
virtual void ChangeProxySettings() = 0;
diff --git a/chromium/ash/system/tray/system_tray_notifier.cc b/chromium/ash/system/tray/system_tray_notifier.cc
index fcdb2d6d5bc..73f619586fd 100644
--- a/chromium/ash/system/tray/system_tray_notifier.cc
+++ b/chromium/ash/system/tray/system_tray_notifier.cc
@@ -140,6 +140,14 @@ void SystemTrayNotifier::RemoveNetworkObserver(NetworkObserver* observer) {
network_observers_.RemoveObserver(observer);
}
+void SystemTrayNotifier::AddSmsObserver(SmsObserver* observer) {
+ sms_observers_.AddObserver(observer);
+}
+
+void SystemTrayNotifier::RemoveSmsObserver(SmsObserver* observer) {
+ sms_observers_.RemoveObserver(observer);
+}
+
void SystemTrayNotifier::AddEnterpriseDomainObserver(
EnterpriseDomainObserver* observer) {
enterprise_domain_observers_.AddObserver(observer);
@@ -318,6 +326,11 @@ void SystemTrayNotifier::NotifyRequestToggleWifi() {
RequestToggleWifi());
}
+void SystemTrayNotifier::NotifyAddSmsMessage(
+ const base::DictionaryValue& message) {
+ FOR_EACH_OBSERVER(SmsObserver, sms_observers_, AddMessage(message));
+}
+
void SystemTrayNotifier::NotifyEnterpriseDomainChanged() {
FOR_EACH_OBSERVER(EnterpriseDomainObserver, enterprise_domain_observers_,
OnEnterpriseDomainChanged());
diff --git a/chromium/ash/system/tray/system_tray_notifier.h b/chromium/ash/system/tray/system_tray_notifier.h
index 2ae739fe9e3..86210b4d343 100644
--- a/chromium/ash/system/tray/system_tray_notifier.h
+++ b/chromium/ash/system/tray/system_tray_notifier.h
@@ -13,6 +13,7 @@
#include "ash/system/brightness/brightness_observer.h"
#include "ash/system/chromeos/enterprise/enterprise_domain_observer.h"
#include "ash/system/chromeos/network/network_observer.h"
+#include "ash/system/chromeos/network/sms_observer.h"
#include "ash/system/chromeos/tray_tracing.h"
#include "ash/system/date/clock_observer.h"
#include "ash/system/drive/drive_observer.h"
@@ -28,6 +29,7 @@
#if defined(OS_CHROMEOS)
#include "ash/system/chromeos/network/network_observer.h"
+#include "ash/system/chromeos/network/sms_observer.h"
#include "ash/system/chromeos/screen_security/screen_capture_observer.h"
#include "ash/system/chromeos/screen_security/screen_share_observer.h"
#endif
@@ -86,6 +88,9 @@ public:
void AddNetworkObserver(NetworkObserver* observer);
void RemoveNetworkObserver(NetworkObserver* observer);
+ void AddSmsObserver(SmsObserver* observer);
+ void RemoveSmsObserver(SmsObserver* observer);
+
void AddEnterpriseDomainObserver(EnterpriseDomainObserver* observer);
void RemoveEnterpriseDomainObserver(EnterpriseDomainObserver* observer);
@@ -126,6 +131,7 @@ public:
const std::vector<base::string16>& links);
void NotifyClearNetworkMessage(NetworkObserver::MessageType message_type);
void NotifyRequestToggleWifi();
+ void NotifyAddSmsMessage(const base::DictionaryValue& message);
void NotifyEnterpriseDomainChanged();
void NotifyScreenCaptureStart(const base::Closure& stop_callback,
const base::string16& sharing_app_name);
@@ -155,6 +161,7 @@ public:
ObserverList<UserObserver> user_observers_;
#if defined(OS_CHROMEOS)
ObserverList<NetworkObserver> network_observers_;
+ ObserverList<SmsObserver> sms_observers_;
ObserverList<EnterpriseDomainObserver> enterprise_domain_observers_;
ObserverList<ScreenCaptureObserver> screen_capture_observers_;
ObserverList<ScreenShareObserver> screen_share_observers_;
diff --git a/chromium/ash/system/tray/test_system_tray_delegate.cc b/chromium/ash/system/tray/test_system_tray_delegate.cc
index 44b21fa8ff9..d7a3a551584 100644
--- a/chromium/ash/system/tray/test_system_tray_delegate.cc
+++ b/chromium/ash/system/tray/test_system_tray_delegate.cc
@@ -114,6 +114,10 @@ base::HourClockType TestSystemTrayDelegate::GetHourClockType() const {
void TestSystemTrayDelegate::ShowSettings() {
}
+bool TestSystemTrayDelegate::ShouldShowSettings() {
+ return true;
+}
+
void TestSystemTrayDelegate::ShowDateSettings() {
}
@@ -254,6 +258,15 @@ bool TestSystemTrayDelegate::GetBluetoothEnabled() {
return bluetooth_enabled_;
}
+bool TestSystemTrayDelegate::GetCellularCarrierInfo(std::string* carrier_id,
+ std::string* topup_url,
+ std::string* setup_url) {
+ return false;
+}
+
+void TestSystemTrayDelegate::ShowCellularURL(const std::string& url) {
+}
+
void TestSystemTrayDelegate::ChangeProxySettings() {
}
diff --git a/chromium/ash/system/tray/test_system_tray_delegate.h b/chromium/ash/system/tray/test_system_tray_delegate.h
index 9be9c8ac652..68bb593b843 100644
--- a/chromium/ash/system/tray/test_system_tray_delegate.h
+++ b/chromium/ash/system/tray/test_system_tray_delegate.h
@@ -38,6 +38,7 @@ class TestSystemTrayDelegate : public SystemTrayDelegate {
virtual bool SystemShouldUpgrade() const OVERRIDE;
virtual base::HourClockType GetHourClockType() const OVERRIDE;
virtual void ShowSettings() OVERRIDE;
+ virtual bool ShouldShowSettings() OVERRIDE;
virtual void ShowDateSettings() OVERRIDE;
virtual void ShowNetworkSettings(const std::string& service_path) OVERRIDE;
virtual void ShowBluetoothSettings() OVERRIDE;
@@ -83,6 +84,10 @@ class TestSystemTrayDelegate : public SystemTrayDelegate {
virtual void ShowOtherCellular() OVERRIDE;
virtual bool GetBluetoothAvailable() OVERRIDE;
virtual bool GetBluetoothEnabled() OVERRIDE;
+ virtual bool GetCellularCarrierInfo(std::string* carrier_id,
+ std::string* topup_url,
+ std::string* setup_url) OVERRIDE;
+ virtual void ShowCellularURL(const std::string& url) OVERRIDE;
virtual void ChangeProxySettings() OVERRIDE;
virtual VolumeControlDelegate* GetVolumeControlDelegate() const OVERRIDE;
virtual void SetVolumeControlDelegate(
diff --git a/chromium/ash/system/tray/tray_background_view.h b/chromium/ash/system/tray/tray_background_view.h
index b0f28067f61..4d57d5bab22 100644
--- a/chromium/ash/system/tray/tray_background_view.h
+++ b/chromium/ash/system/tray/tray_background_view.h
@@ -19,8 +19,7 @@ class StatusAreaWidget;
class TrayEventFilter;
class TrayBackground;
-// Base class for children of StatusAreaWidget: SystemTray, WebNotificationTray,
-// LogoutButtonTray.
+// Base class for children of StatusAreaWidget: SystemTray, WebNotificationTray.
// This class handles setting and animating the background when the Launcher
// his shown/hidden. It also inherits from ActionableView so that the tray
// items can override PerformAction when clicked on.
diff --git a/chromium/ash/system/tray/tray_constants.cc b/chromium/ash/system/tray/tray_constants.cc
index 6d4b2e6b90d..6d108c8d029 100644
--- a/chromium/ash/system/tray/tray_constants.cc
+++ b/chromium/ash/system/tray/tray_constants.cc
@@ -67,17 +67,12 @@ const int kTrayNotificationContentsWidth = kTrayPopupMinWidth -
(kTrayPopupPaddingHorizontal / 2) * 3);
const int kTraySpacing = 8;
const int kAlternateTraySpacing = 4;
-const int kShelfItemHeight = 31;
-const int kAlternateShelfItemHeight = 38;
+// Returns kTraySpacing or kAlternateTraySpacing as applicable
+// (Determined by ash::switches::UseAlternateShelfLayout).
int GetTraySpacing() {
return ash::switches::UseAlternateShelfLayout() ?
kAlternateTraySpacing : kTraySpacing;
}
-int GetShelfItemHeight() {
- return ash::switches::UseAlternateShelfLayout() ?
- kAlternateShelfItemHeight : kShelfItemHeight;
-}
-
} // namespace ash
diff --git a/chromium/ash/system/tray/tray_constants.h b/chromium/ash/system/tray/tray_constants.h
index 50b2210bca0..480d5d54a35 100644
--- a/chromium/ash/system/tray/tray_constants.h
+++ b/chromium/ash/system/tray/tray_constants.h
@@ -66,10 +66,6 @@ extern const int kTrayNotificationContentsWidth;
// (Determined by ash::switches::UseAlternateShelfLayout).
int GetTraySpacing();
-// Returns kShelfItemHeight or kAlternateShelfItemHeight as applicable
-// (Determined by ash::switches::UseAlternateShelfLayout).
-int GetShelfItemHeight();
-
} // namespace ash
#endif // ASH_SYSTEM_TRAY_TRAY_CONSTANTS_H_
diff --git a/chromium/ash/system/tray/tray_image_item.cc b/chromium/ash/system/tray/tray_image_item.cc
index 7c5e216c942..d4ff9040ade 100644
--- a/chromium/ash/system/tray/tray_image_item.cc
+++ b/chromium/ash/system/tray/tray_image_item.cc
@@ -4,13 +4,12 @@
#include "ash/system/tray/tray_image_item.h"
-#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/tray_item_view.h"
#include "ash/system/tray/tray_utils.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/image/image.h"
#include "ui/views/controls/image_view.h"
-#include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/fill_layout.h"
namespace ash {
namespace internal {
@@ -42,7 +41,6 @@ views::View* TrayImageItem::CreateTrayView(user::LoginStatus status) {
tray_view_->image_view()->SetImage(ui::ResourceBundle::GetSharedInstance().
GetImageNamed(resource_id_).ToImageSkia());
tray_view_->SetVisible(GetInitialVisibility());
- SetItemAlignment(system_tray()->shelf_alignment());
return tray_view_;
}
@@ -59,7 +57,6 @@ void TrayImageItem::UpdateAfterLoginStatusChange(user::LoginStatus status) {
void TrayImageItem::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
SetTrayImageItemBorder(tray_view_, alignment);
- SetItemAlignment(alignment);
}
void TrayImageItem::DestroyTrayView() {
@@ -72,22 +69,5 @@ void TrayImageItem::DestroyDefaultView() {
void TrayImageItem::DestroyDetailedView() {
}
-void TrayImageItem::SetItemAlignment(ShelfAlignment alignment) {
- // Center the item dependent on the orientation of the shelf.
- views::BoxLayout::Orientation layout = views::BoxLayout::kHorizontal;
- switch (alignment) {
- case ash::SHELF_ALIGNMENT_BOTTOM:
- case ash::SHELF_ALIGNMENT_TOP:
- layout = views::BoxLayout::kHorizontal;
- break;
- case ash::SHELF_ALIGNMENT_LEFT:
- case ash::SHELF_ALIGNMENT_RIGHT:
- layout = views::BoxLayout::kVertical;
- break;
- }
- tray_view_->SetLayoutManager(new views::BoxLayout(layout, 0, 0, 0));
- tray_view_->Layout();
-}
-
} // namespace internal
} // namespace ash
diff --git a/chromium/ash/system/tray/tray_image_item.h b/chromium/ash/system/tray/tray_image_item.h
index 6dea5c8372f..ebaf30e14a0 100644
--- a/chromium/ash/system/tray/tray_image_item.h
+++ b/chromium/ash/system/tray/tray_image_item.h
@@ -41,9 +41,6 @@ class TrayImageItem : public SystemTrayItem {
ShelfAlignment alignment) OVERRIDE;
private:
- // Set the alignment of the image depending on the shelf alignment.
- void SetItemAlignment(ShelfAlignment alignment);
-
int resource_id_;
TrayItemView* tray_view_;
diff --git a/chromium/ash/system/user/tray_user.cc b/chromium/ash/system/user/tray_user.cc
index 94a85ea07a5..2ab24a8b8a4 100644
--- a/chromium/ash/system/user/tray_user.cc
+++ b/chromium/ash/system/user/tray_user.cc
@@ -10,9 +10,7 @@
#include "ash/ash_switches.h"
#include "ash/popup_message.h"
-#include "ash/root_window_controller.h"
#include "ash/session_state_delegate.h"
-#include "ash/shelf/shelf_layout_manager.h"
#include "ash/shell.h"
#include "ash/shell_delegate.h"
#include "ash/system/tray/system_tray.h"
@@ -1172,7 +1170,7 @@ void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) {
need_label = true;
break;
case user::LOGGED_IN_GUEST:
- need_label = true;
+ need_avatar = true;
break;
case user::LOGGED_IN_RETAIL_MODE:
case user::LOGGED_IN_KIOSK_APP:
@@ -1202,8 +1200,6 @@ void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) {
if (status == user::LOGGED_IN_LOCALLY_MANAGED) {
label_->SetText(
bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_LOCALLY_MANAGED_LABEL));
- } else if (status == user::LOGGED_IN_GUEST) {
- label_->SetText(bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_GUEST_LABEL));
}
if (avatar_ && ash::switches::UseAlternateShelfLayout()) {
@@ -1214,12 +1210,6 @@ void TrayUser::UpdateAfterLoginStatusChange(user::LoginStatus status) {
avatar_->set_border(NULL);
}
UpdateAvatarImage(status);
-
- // Update layout after setting label_ and avatar_ with new login status.
- if (Shell::GetPrimaryRootWindowController()->shelf())
- UpdateAfterShelfAlignmentChange(
- Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()->
- GetAlignment());
}
void TrayUser::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
@@ -1286,10 +1276,19 @@ void TrayUser::UpdateAvatarImage(user::LoginStatus status) {
int icon_size = ash::switches::UseAlternateShelfLayout() ?
kUserIconLargeSize : kUserIconSize;
- avatar_->SetImage(
- ash::Shell::GetInstance()->session_state_delegate()->GetUserImage(
- multiprofile_index_),
- gfx::Size(icon_size, icon_size));
+ if (status == user::LOGGED_IN_GUEST) {
+ int image_name = ash::switches::UseAlternateShelfLayout() ?
+ IDR_AURA_UBER_TRAY_GUEST_ICON_LARGE :
+ IDR_AURA_UBER_TRAY_GUEST_ICON;
+ avatar_->SetImage(*ui::ResourceBundle::GetSharedInstance().
+ GetImageNamed(image_name).ToImageSkia(),
+ gfx::Size(icon_size, icon_size));
+ } else {
+ avatar_->SetImage(
+ ash::Shell::GetInstance()->session_state_delegate()->GetUserImage(
+ multiprofile_index_),
+ gfx::Size(icon_size, icon_size));
+ }
}
} // namespace internal
diff --git a/chromium/ash/system/web_notification/web_notification_tray.cc b/chromium/ash/system/web_notification/web_notification_tray.cc
index e6bd4925e3e..2a6e2deadca 100644
--- a/chromium/ash/system/web_notification/web_notification_tray.cc
+++ b/chromium/ash/system/web_notification/web_notification_tray.cc
@@ -58,6 +58,10 @@ namespace ash {
namespace internal {
namespace {
+const int kWebNotificationIconSize = 31;
+// Height of the art assets used in alternate shelf layout,
+// see ash/ash_switches.h:UseAlternateShelfLayout.
+const int kWebNotificationAlternateSize = 38;
const SkColor kWebNotificationColorNoUnread = SkColorSetA(SK_ColorWHITE, 128);
const SkColor kWebNotificationColorWithUnread = SK_ColorWHITE;
@@ -106,15 +110,6 @@ WorkAreaObserver::~WorkAreaObserver() {
void WorkAreaObserver::SetSystemTrayHeight(int height) {
system_tray_height_ = height;
-
- // If the shelf is shown during auto-hide state, the distance from the edge
- // should be reduced by the height of shelf's shown height.
- if (shelf_->visibility_state() == SHELF_AUTO_HIDE &&
- shelf_->auto_hide_state() == SHELF_AUTO_HIDE_SHOWN) {
- system_tray_height_ -= ShelfLayoutManager::GetPreferredShelfSize() -
- ShelfLayoutManager::kAutoHideSize;
- }
-
if (system_tray_height_ > 0 && ash::switches::UseAlternateShelfLayout())
system_tray_height_ += message_center::kMarginBetweenItems;
@@ -132,23 +127,43 @@ void WorkAreaObserver::OnAutoHideStateChanged(ShelfAutoHideState new_state) {
shelf_->shelf_widget()->GetNativeView());
gfx::Rect work_area = display.work_area();
int width = 0;
- if ((shelf_->visibility_state() == SHELF_AUTO_HIDE) &&
- new_state == SHELF_AUTO_HIDE_SHOWN) {
- // Since the work_area is already reduced by kAutoHideSize, the inset width
- // should be just the difference.
- width = ShelfLayoutManager::GetPreferredShelfSize() -
- ShelfLayoutManager::kAutoHideSize;
+ if (shelf_->auto_hide_behavior() != SHELF_AUTO_HIDE_BEHAVIOR_NEVER) {
+ width = (new_state == SHELF_AUTO_HIDE_HIDDEN) ?
+ ShelfLayoutManager::kAutoHideSize :
+ ShelfLayoutManager::GetPreferredShelfSize();
}
- work_area.Inset(shelf_->SelectValueForShelfAlignment(
- gfx::Insets(0, 0, width, 0),
- gfx::Insets(0, width, 0, 0),
- gfx::Insets(0, 0, 0, width),
- gfx::Insets(width, 0, 0, 0)));
- if (system_tray_height_ > 0) {
- work_area.set_height(
- std::max(0, work_area.height() - system_tray_height_));
- if (shelf_->GetAlignment() == SHELF_ALIGNMENT_TOP)
- work_area.set_y(work_area.y() + system_tray_height_);
+ switch (shelf_->GetAlignment()) {
+ case SHELF_ALIGNMENT_BOTTOM:
+ work_area.Inset(0, 0, 0, width);
+ if (system_tray_height_ > 0) {
+ work_area.set_height(
+ std::max(0, work_area.height() - system_tray_height_));
+ }
+ break;
+ case SHELF_ALIGNMENT_LEFT:
+ work_area.Inset(width, 0, 0, 0);
+ // Popups appear on the left bottom only when UI is RTL.
+ if (base::i18n::IsRTL() && system_tray_height_ > 0) {
+ work_area.set_height(
+ std::max(0, work_area.height() - system_tray_height_));
+ }
+ break;
+ case SHELF_ALIGNMENT_RIGHT:
+ work_area.Inset(0, 0, width, 0);
+ // Popups appear on the right bottom only when UI isn't RTL.
+ if (!base::i18n::IsRTL() && system_tray_height_ > 0) {
+ work_area.set_height(
+ std::max(0, work_area.height() - system_tray_height_));
+ }
+ break;
+ case SHELF_ALIGNMENT_TOP:
+ work_area.Inset(0, width, 0, 0);
+ if (system_tray_height_ > 0) {
+ work_area.set_y(work_area.y() + system_tray_height_);
+ work_area.set_height(
+ std::max(0, work_area.height() - system_tray_height_));
+ }
+ break;
}
collection_->SetDisplayInfo(work_area, display.bounds());
}
@@ -226,12 +241,10 @@ class WebNotificationButton : public views::CustomButton {
protected:
// Overridden from views::ImageButton:
virtual gfx::Size GetPreferredSize() OVERRIDE {
- const int notification_item_size = GetShelfItemHeight();
- return gfx::Size(notification_item_size, notification_item_size);
- }
-
- virtual int GetHeightForWidth(int width) OVERRIDE {
- return GetPreferredSize().height();
+ if (ash::switches::UseAlternateShelfLayout())
+ return gfx::Size(kWebNotificationAlternateSize,
+ kWebNotificationAlternateSize);
+ return gfx::Size(kWebNotificationIconSize, kWebNotificationIconSize);
}
private:
diff --git a/chromium/ash/system/web_notification/web_notification_tray.h b/chromium/ash/system/web_notification/web_notification_tray.h
index 1fb9c4d3fbc..d8b2fd3a02a 100644
--- a/chromium/ash/system/web_notification/web_notification_tray.h
+++ b/chromium/ash/system/web_notification/web_notification_tray.h
@@ -124,7 +124,6 @@ class ASH_EXPORT WebNotificationTray
FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, ManyPopupNotifications);
FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, PopupShownOnBothDisplays);
FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, PopupAndSystemTray);
- FRIEND_TEST_ALL_PREFIXES(WebNotificationTrayTest, PopupAndAutoHideShelf);
void UpdateTrayContent();
diff --git a/chromium/ash/system/web_notification/web_notification_tray_unittest.cc b/chromium/ash/system/web_notification/web_notification_tray_unittest.cc
index 5b67b7d72b4..026500f1798 100644
--- a/chromium/ash/system/web_notification/web_notification_tray_unittest.cc
+++ b/chromium/ash/system/web_notification/web_notification_tray_unittest.cc
@@ -16,14 +16,8 @@
#include "ash/system/tray/system_tray_item.h"
#include "ash/system/tray/test_system_tray_delegate.h"
#include "ash/test/ash_test_base.h"
-#include "ash/wm/window_properties.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/test/event_generator.h"
-#include "ui/aura/window.h"
-#include "ui/gfx/display.h"
-#include "ui/gfx/screen.h"
#include "ui/message_center/message_center_style.h"
#include "ui/message_center/message_center_tray.h"
#include "ui/message_center/message_center_util.h"
@@ -150,10 +144,6 @@ class WebNotificationTrayTest : public test::AshTestBase {
return tray->popup_collection_->work_area_;
}
- bool IsPopupVisible() {
- return GetTray()->IsPopupVisible();
- }
-
private:
DISALLOW_COPY_AND_ASSIGN(WebNotificationTrayTest);
};
@@ -304,12 +294,8 @@ TEST_F(WebNotificationTrayTest, MAYBE_PopupShownOnBothDisplays) {
// RootWindow's bound can be bigger than gfx::Display's work area so that
// openingsystem tray doesn't affect at all the work area of popups.
#define MAYBE_PopupAndSystemTray PopupAndSystemTray
-#define MAYBE_PopupAndAutoHideShelf PopupAndAutoHideShelf
-#define MAYBE_PopupAndFullscreen PopupAndFullscreen
#else
#define MAYBE_PopupAndSystemTray DISABLED_PopupAndSystemTray
-#define MAYBE_PopupAndAutoHideShelf DISABLED_PopupAndAutoHideShelf
-#define MAYBE_PopupAndFullscreen DISABLED_PopupAndFullscreen
#endif
TEST_F(WebNotificationTrayTest, MAYBE_PopupAndSystemTray) {
@@ -346,115 +332,22 @@ TEST_F(WebNotificationTrayTest, MAYBE_PopupAndSystemTray) {
EXPECT_LT(work_area_with_tray_notificaiton.size().GetArea(),
work_area_with_notification.size().GetArea());
- // Close the system tray notifications.
+ // Close the notifications.
GetSystemTray()->HideNotificationView(test_item);
EXPECT_TRUE(GetTray()->IsPopupVisible());
EXPECT_EQ(work_area.ToString(), GetPopupWorkArea().ToString());
}
-TEST_F(WebNotificationTrayTest, MAYBE_PopupAndAutoHideShelf) {
+TEST_F(WebNotificationTrayTest, PopupAndSystemTrayAlignment) {
+ Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()->
+ SetAlignment(SHELF_ALIGNMENT_LEFT);
AddNotification("test_id");
- EXPECT_TRUE(GetTray()->IsPopupVisible());
gfx::Rect work_area = GetPopupWorkArea();
- // Shelf's auto-hide state won't be HIDDEN unless window exists.
- scoped_ptr<aura::Window> window(
- CreateTestWindowInShellWithBounds(gfx::Rect(1, 2, 3, 4)));
- internal::ShelfLayoutManager* shelf =
- Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager();
- shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
-
- EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
- gfx::Rect work_area_auto_hidden = GetPopupWorkArea();
- EXPECT_LT(work_area.size().GetArea(), work_area_auto_hidden.size().GetArea());
-
- // Close the window, which shows the shelf.
- window.reset();
- EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
- gfx::Rect work_area_auto_shown = GetPopupWorkArea();
- EXPECT_EQ(work_area.ToString(), work_area_auto_shown.ToString());
-
- // Create the system tray during auto-hide.
- window.reset(CreateTestWindowInShellWithBounds(gfx::Rect(1, 2, 3, 4)));
- TestItem* test_item = new TestItem;
- GetSystemTray()->AddTrayItem(test_item);
+ // System tray is created, but the work area is not affected since the tray
+ // appears at the left-bottom while the popups appear at the right bottom.
GetSystemTray()->ShowDefaultView(BUBBLE_CREATE_NEW);
-
- EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
- EXPECT_TRUE(GetTray()->IsPopupVisible());
- gfx::Rect work_area_with_tray = GetPopupWorkArea();
- EXPECT_GT(work_area_auto_shown.size().GetArea(),
- work_area_with_tray.size().GetArea());
-
- // Create tray notification.
- GetSystemTray()->ShowNotificationView(test_item);
- EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
- gfx::Rect work_area_with_tray_notification = GetPopupWorkArea();
- EXPECT_GT(work_area_with_tray.size().GetArea(),
- work_area_with_tray_notification.size().GetArea());
-
- // Close the system tray.
- GetSystemTray()->ClickedOutsideBubble();
- shelf->UpdateAutoHideState();
- RunAllPendingInMessageLoop();
- EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
- gfx::Rect work_area_hidden_with_tray_notification = GetPopupWorkArea();
- EXPECT_LT(work_area_with_tray_notification.size().GetArea(),
- work_area_hidden_with_tray_notification.size().GetArea());
- EXPECT_GT(work_area_auto_hidden.size().GetArea(),
- work_area_hidden_with_tray_notification.size().GetArea());
-
- // Close the window again, which shows the shelf.
- window.reset();
- EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
- gfx::Rect work_area_shown_with_tray_notification = GetPopupWorkArea();
- EXPECT_GT(work_area_hidden_with_tray_notification.size().GetArea(),
- work_area_shown_with_tray_notification.size().GetArea());
- EXPECT_GT(work_area_auto_shown.size().GetArea(),
- work_area_shown_with_tray_notification.size().GetArea());
-}
-
-TEST_F(WebNotificationTrayTest, MAYBE_PopupAndFullscreen) {
- AddNotification("test_id");
- EXPECT_TRUE(IsPopupVisible());
- gfx::Rect work_area = GetPopupWorkArea();
-
- // Checks the work area for normal auto-hidden state.
- scoped_ptr<aura::Window> window(
- CreateTestWindowInShellWithBounds(gfx::Rect(1, 2, 3, 4)));
- internal::ShelfLayoutManager* shelf =
- Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager();
- shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
- EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
- gfx::Rect work_area_auto_hidden = GetPopupWorkArea();
- shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER);
-
- // Make the window to use immersive mode.
- window->SetProperty(internal::kFullscreenUsesMinimalChromeKey, true);
- window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN);
- RunAllPendingInMessageLoop();
-
- // The work area for auto-hidden status of fullscreen is a bit larger
- // since it doesn't even have the 3-pixel width.
- EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
- gfx::Rect work_area_fullscreen_hidden = GetPopupWorkArea();
- EXPECT_EQ(work_area_auto_hidden.ToString(),
- work_area_fullscreen_hidden.ToString());
-
- // Move the mouse cursor at the bottom, which shows the shelf.
- aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
- gfx::Point bottom_right =
- Shell::GetScreen()->GetPrimaryDisplay().bounds().bottom_right();
- bottom_right.Offset(-1, -1);
- generator.MoveMouseTo(bottom_right);
- shelf->UpdateAutoHideStateNow();
- EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->auto_hide_state());
EXPECT_EQ(work_area.ToString(), GetPopupWorkArea().ToString());
-
- generator.MoveMouseTo(work_area.CenterPoint());
- shelf->UpdateAutoHideStateNow();
- EXPECT_EQ(SHELF_AUTO_HIDE_HIDDEN, shelf->auto_hide_state());
- EXPECT_EQ(work_area_auto_hidden.ToString(), GetPopupWorkArea().ToString());
}
TEST_F(WebNotificationTrayTest, MAYBE_PopupAndSystemTrayMultiDisplay) {
diff --git a/chromium/ash/wm/boot_splash_screen_chromeos.cc b/chromium/ash/wm/boot_splash_screen.cc
index 00743409ae5..202ebe28eeb 100644
--- a/chromium/ash/wm/boot_splash_screen_chromeos.cc
+++ b/chromium/ash/wm/boot_splash_screen.cc
@@ -1,12 +1,11 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "ash/wm/boot_splash_screen_chromeos.h"
+#include "ash/wm/boot_splash_screen.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/aura/root_window.h"
-#include "ui/base/x/x11_util.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_type.h"
#include "ui/compositor/scoped_layer_animation_settings.h"
@@ -34,9 +33,9 @@ class BootSplashScreen::CopyHostContentLayerDelegate
// TODO(derat): Instead of copying the data, use GLX_EXT_texture_from_pixmap
// to create a zero-copy texture (when possible):
// https://codereview.chromium.org/10543125
- ui::CopyAreaToCanvas(root_window_->GetAcceleratedWidget(),
+ root_window_->CopyAreaToSkCanvas(
gfx::Rect(root_window_->GetHostOrigin(), root_window_->GetHostSize()),
- gfx::Point(), canvas);
+ gfx::Point(), canvas->sk_canvas());
}
virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE {}
diff --git a/chromium/ash/wm/boot_splash_screen_chromeos.h b/chromium/ash/wm/boot_splash_screen.h
index e844275ad5f..f56f49fe195 100644
--- a/chromium/ash/wm/boot_splash_screen_chromeos.h
+++ b/chromium/ash/wm/boot_splash_screen.h
@@ -1,9 +1,9 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// 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 ASH_WM_BOOT_SPLASH_SCREEN_CHROMEOS_H_
-#define ASH_WM_BOOT_SPLASH_SCREEN_CHROMEOS_H_
+#ifndef ASH_WM_BOOT_SPLASH_SCREEN_H_
+#define ASH_WM_BOOT_SPLASH_SCREEN_H_
#include <string>
@@ -50,4 +50,4 @@ class BootSplashScreen {
} // namespace internal
} // namespace ash
-#endif // ASH_WM_BOOT_SPLASH_SCREEN_CHROMEOS_H_
+#endif // ASH_WM_BOOT_SPLASH_SCREEN_H_
diff --git a/chromium/ash/wm/dock/docked_window_layout_manager.cc b/chromium/ash/wm/dock/docked_window_layout_manager.cc
index 1dacf5e9fbd..d73a0ccac7d 100644
--- a/chromium/ash/wm/dock/docked_window_layout_manager.cc
+++ b/chromium/ash/wm/dock/docked_window_layout_manager.cc
@@ -84,58 +84,10 @@ bool IsUsedByLayout(aura::Window* window) {
window->type() != aura::client::WINDOW_TYPE_POPUP);
}
-// A functor used to sort the windows in order of their center Y position.
-// |delta| is a pre-calculated distance from the bottom of one window to the top
-// of the next. Its value can be positive (gap) or negative (overlap).
-// Half of |delta| is used as a transition point at which windows could ideally
-// swap positions.
-struct CompareWindowPos {
- CompareWindowPos(aura::Window* dragged_window, float delta)
- : dragged_window_(dragged_window),
- delta_(delta / 2) {}
-
- bool operator()(const aura::Window* win1, const aura::Window* win2) {
- const gfx::Rect win1_bounds = win1->GetBoundsInScreen();
- const gfx::Rect win2_bounds = win2->GetBoundsInScreen();
- // If one of the windows is the |dragged_window_| attempt to make an
- // earlier swap between the windows than just based on their centers.
- // This is possible if the dragged window is at least as tall as the other
- // window.
- if (win1 == dragged_window_)
- return compare_two_windows(win1_bounds, win2_bounds);
- if (win2 == dragged_window_)
- return !compare_two_windows(win2_bounds, win1_bounds);
- // Otherwise just compare the centers.
- return win1_bounds.CenterPoint().y() < win2_bounds.CenterPoint().y();
- }
-
- // Based on center point tries to deduce where the drag is coming from.
- // When dragging from below up the transition point is lower.
- // When dragging from above down the transition point is higher.
- bool compare_bounds(const gfx::Rect dragged, const gfx::Rect other) {
- if (dragged.CenterPoint().y() < other.CenterPoint().y())
- return dragged.CenterPoint().y() < other.y() - delta_;
- return dragged.CenterPoint().y() < other.bottom() + delta_;
- }
-
- // Performs comparison both ways and selects stable result.
- bool compare_two_windows(const gfx::Rect bounds1, const gfx::Rect bounds2) {
- // Try comparing windows in both possible orders and see if the comparison
- // is stable.
- bool result1 = compare_bounds(bounds1, bounds2);
- bool result2 = compare_bounds(bounds2, bounds1);
- if (result1 != result2)
- return result1;
-
- // Otherwise it is not possible to be sure that the windows will not bounce.
- // In this case just compare the centers.
- return bounds1.CenterPoint().y() < bounds2.CenterPoint().y();
- }
-
- private:
- aura::Window* dragged_window_;
- float delta_;
-};
+bool CompareWindowPos(const aura::Window* win1, const aura::Window* win2) {
+ return win1->GetTargetBounds().CenterPoint().y() <
+ win2->GetTargetBounds().CenterPoint().y();
+}
} // namespace
@@ -146,8 +98,6 @@ DockedWindowLayoutManager::DockedWindowLayoutManager(
: dock_container_(dock_container),
in_layout_(false),
dragged_window_(NULL),
- is_dragged_window_docked_(false),
- is_dragged_from_dock_(false),
launcher_(NULL),
shelf_layout_manager_(NULL),
shelf_hidden_(false),
@@ -189,79 +139,106 @@ void DockedWindowLayoutManager::RemoveObserver(
}
void DockedWindowLayoutManager::StartDragging(aura::Window* window) {
+ if (window->parent() != dock_container_)
+ return;
DCHECK(!dragged_window_);
dragged_window_ = window;
- // Start observing a window unless it is docked container's child in which
- // case it is already observed.
- if (dragged_window_->parent() != dock_container_)
- dragged_window_->AddObserver(this);
- is_dragged_from_dock_ = window->parent() == dock_container_;
- DCHECK(!is_dragged_window_docked_);
-}
-
-void DockedWindowLayoutManager::DockDraggedWindow(aura::Window* window) {
- OnWindowDocked(window);
Relayout();
}
-void DockedWindowLayoutManager::UndockDraggedWindow() {
- OnWindowUndocked();
- Relayout();
- is_dragged_from_dock_ = false;
-}
-
void DockedWindowLayoutManager::FinishDragging() {
- DCHECK(dragged_window_);
- if (is_dragged_window_docked_)
- OnWindowUndocked();
- DCHECK (!is_dragged_window_docked_);
- // Stop observing a window unless it is docked container's child in which
- // case it needs to keep being observed after the drag completes.
- if (dragged_window_->parent() != dock_container_)
- dragged_window_->RemoveObserver(this);
- dragged_window_ = NULL;
+ if (!dragged_window_)
+ return;
+
+ // If this is the first window getting docked - update alignment.
+ if (alignment_ == DOCKED_ALIGNMENT_NONE) {
+ alignment_ = AlignmentOfWindow(dragged_window_);
+ } else {
+ // There were some docked windows before. Check if the |dragged_window_|
+ // was the only one remaining and if so possibly switch alignment to
+ // opposite side. Ignore popups.
+ bool found_docked_window = false;
+ for (size_t i = 0; i < dock_container_->children().size(); ++i) {
+ aura::Window* window(dock_container_->children()[i]);
+ if (window != dragged_window_ &&
+ window->type() != aura::client::WINDOW_TYPE_POPUP) {
+ found_docked_window = true;
+ break;
+ }
+ }
+ if (!found_docked_window)
+ alignment_ = AlignmentOfWindow(dragged_window_);
+ }
+
+ // We no longer need to observe |dragged_window_| unless it is added back;
+ if (dragged_window_) {
+ if (dragged_window_->parent() != dock_container_)
+ dragged_window_->RemoveObserver(this);
+ dragged_window_ = NULL;
+ }
+
Relayout();
UpdateDockBounds();
}
-void DockedWindowLayoutManager::SetLauncher(ash::Launcher* launcher) {
- DCHECK(!launcher_);
- DCHECK(!shelf_layout_manager_);
- launcher_ = launcher;
- if (launcher_->shelf_widget()) {
- shelf_layout_manager_ = ash::internal::ShelfLayoutManager::ForLauncher(
- launcher_->shelf_widget()->GetNativeWindow());
- WillChangeVisibilityState(shelf_layout_manager_->visibility_state());
- shelf_layout_manager_->AddObserver(this);
+// static
+bool DockedWindowLayoutManager::ShouldWindowDock(aura::Window* window,
+ const gfx::Point& location) {
+ DockedWindowLayoutManager* layout_manager = GetDockLayoutManager(window,
+ location);
+ const DockedAlignment alignment = layout_manager->CalculateAlignment();
+ const gfx::Rect& bounds(window->GetBoundsInScreen());
+ const gfx::Rect docked_bounds = (alignment == DOCKED_ALIGNMENT_NONE) ?
+ layout_manager->dock_container_->GetBoundsInScreen() :
+ layout_manager->docked_bounds_;
+ DockedAlignment dock_edge = DOCKED_ALIGNMENT_NONE;
+ if (alignment == DOCKED_ALIGNMENT_NONE) {
+ // Check if the window is touching the edge - it may need to get docked.
+ dock_edge = layout_manager->AlignmentOfWindow(window);
+ } else if ((docked_bounds.Intersects(bounds) &&
+ docked_bounds.Contains(location)) ||
+ alignment == layout_manager->AlignmentOfWindow(window)) {
+ // A window is being added to other docked windows (on the same side).
+ // Both bounds and pointer location are checked because some drags involve
+ // sticky edges and so the |location| may be outside of the |bounds|.
+ // It is also possible that all the docked windows are minimized or hidden
+ // in which case the dragged window needs to be exactly touching the same
+ // edge that those docked windows were aligned before they got minimized.
+ dock_edge = alignment;
}
-}
-DockedAlignment DockedWindowLayoutManager::GetAlignmentOfWindow(
- const aura::Window* window) const {
- const gfx::Rect& bounds(window->GetBoundsInScreen());
- const gfx::Rect docked_bounds = dock_container_->GetBoundsInScreen();
+ // Do not allow docking on the same side as launcher shelf.
+ if (layout_manager->launcher_ && layout_manager->launcher_->shelf_widget()) {
+ ShelfAlignment shelf_alignment =
+ layout_manager->launcher_->shelf_widget()->GetAlignment();
+ if ((shelf_alignment == SHELF_ALIGNMENT_LEFT &&
+ dock_edge == DOCKED_ALIGNMENT_LEFT) ||
+ (shelf_alignment == SHELF_ALIGNMENT_RIGHT &&
+ dock_edge == DOCKED_ALIGNMENT_RIGHT)) {
+ dock_edge = DOCKED_ALIGNMENT_NONE;
+ }
+ }
// Do not allow docking if a window is vertically maximized (as is the case
// when it is snapped).
const gfx::Rect work_area =
- Shell::GetScreen()->GetDisplayNearestWindow(dock_container_).work_area();
+ Shell::GetScreen()->GetDisplayNearestWindow(window).work_area();
if (bounds.y() == work_area.y() && bounds.height() == work_area.height())
- return DOCKED_ALIGNMENT_NONE;
+ dock_edge = DOCKED_ALIGNMENT_NONE;
- // Do not allow docking on the same side as launcher shelf.
- ShelfAlignment shelf_alignment = SHELF_ALIGNMENT_BOTTOM;
- if (launcher_)
- shelf_alignment = launcher_->alignment();
+ return dock_edge != DOCKED_ALIGNMENT_NONE;
+}
- if (bounds.x() == docked_bounds.x() &&
- shelf_alignment != SHELF_ALIGNMENT_LEFT) {
- return DOCKED_ALIGNMENT_LEFT;
- }
- if (bounds.right() == docked_bounds.right() &&
- shelf_alignment != SHELF_ALIGNMENT_RIGHT) {
- return DOCKED_ALIGNMENT_RIGHT;
+void DockedWindowLayoutManager::SetLauncher(ash::Launcher* launcher) {
+ DCHECK(!launcher_);
+ DCHECK(!shelf_layout_manager_);
+ launcher_ = launcher;
+ if (launcher_->shelf_widget()) {
+ shelf_layout_manager_ = ash::internal::ShelfLayoutManager::ForLauncher(
+ launcher_->shelf_widget()->GetNativeWindow());
+ WillChangeVisibilityState(shelf_layout_manager_->visibility_state());
+ shelf_layout_manager_->AddObserver(this);
}
- return DOCKED_ALIGNMENT_NONE;
}
DockedAlignment DockedWindowLayoutManager::CalculateAlignment() const {
@@ -285,24 +262,22 @@ DockedAlignment DockedWindowLayoutManager::CalculateAlignment() const {
// DockLayoutManager, aura::LayoutManager implementation:
void DockedWindowLayoutManager::OnWindowResized() {
Relayout();
- // When screen resizes update the insets even when dock width or alignment
- // does not change.
+ // When screen resizes we need to update the insets even when dock width or
+ // alignment does not change.
UpdateDockBounds();
}
void DockedWindowLayoutManager::OnWindowAddedToLayout(aura::Window* child) {
if (child->type() == aura::client::WINDOW_TYPE_POPUP)
return;
- // Dragged windows are already observed by StartDragging and do not change
- // docked alignment during the drag.
- if (child == dragged_window_)
- return;
+
// If this is the first window getting docked - update alignment.
- if (alignment_ == DOCKED_ALIGNMENT_NONE) {
- alignment_ = GetAlignmentOfWindow(child);
- DCHECK(alignment_ != DOCKED_ALIGNMENT_NONE);
- }
- child->AddObserver(this);
+ if (alignment_ == DOCKED_ALIGNMENT_NONE)
+ alignment_ = AlignmentOfWindow(child);
+ // We need to observe a child unless it is a |dragged_window_| that just got
+ // added back in which case we are already observing it.
+ if (child != dragged_window_)
+ child->AddObserver(this);
Relayout();
UpdateDockBounds();
}
@@ -310,20 +285,36 @@ void DockedWindowLayoutManager::OnWindowAddedToLayout(aura::Window* child) {
void DockedWindowLayoutManager::OnWindowRemovedFromLayout(aura::Window* child) {
if (child->type() == aura::client::WINDOW_TYPE_POPUP)
return;
- // Dragged windows are stopped being observed by FinishDragging and do not
- // change alignment during the drag. They also cannot be set to be the
- // |last_active_window_|.
- if (child == dragged_window_)
- return;
- // If this is the last window, set alignment and maximize the workspace.
- if (!IsAnyWindowDocked()) {
- alignment_ = DOCKED_ALIGNMENT_NONE;
- docked_width_ = 0;
+
+ // Try to find a child that is not a popup and is not being dragged.
+ bool found_docked_window = false;
+ for (size_t i = 0; i < dock_container_->children().size(); ++i) {
+ aura::Window* window(dock_container_->children()[i]);
+ if (window != dragged_window_ &&
+ window->type() != aura::client::WINDOW_TYPE_POPUP) {
+ found_docked_window = true;
+ break;
+ }
}
+ if (!found_docked_window)
+ alignment_ = DOCKED_ALIGNMENT_NONE;
+
+ // Keep track of former children if they are dragged as they can be reparented
+ // temporarily just for the drag.
+ if (child != dragged_window_)
+ child->RemoveObserver(this);
+
if (last_active_window_ == child)
last_active_window_ = NULL;
- child->RemoveObserver(this);
+
+ // Close the dock and expand workspace work area.
Relayout();
+
+ // When a panel is removed from this layout manager it may still be dragged.
+ // Delay updating dock and workspace bounds until the drag is completed. This
+ // preserves the docked area width until the panel drag is finished.
+ if (child->type() != aura::client::WINDOW_TYPE_PANEL)
+ UpdateDockBounds();
}
void DockedWindowLayoutManager::OnChildWindowVisibilityChanged(
@@ -340,8 +331,11 @@ void DockedWindowLayoutManager::OnChildWindowVisibilityChanged(
void DockedWindowLayoutManager::SetChildBounds(
aura::Window* child,
const gfx::Rect& requested_bounds) {
- // Whenever one of our windows is moved or resized enforce layout.
+ // Whenever one of our windows is moved or resized we need to enforce layout.
SetChildBoundsDirect(child, requested_bounds);
+ if (child->type() == aura::client::WINDOW_TYPE_POPUP)
+ return;
+ Relayout();
}
////////////////////////////////////////////////////////////////////////////////
@@ -394,18 +388,13 @@ void DockedWindowLayoutManager::OnWindowBoundsChanged(
aura::Window* window,
const gfx::Rect& old_bounds,
const gfx::Rect& new_bounds) {
- // Only relayout if the dragged window would get docked.
- if (window == dragged_window_ && is_dragged_window_docked_)
+ if (window == dragged_window_)
Relayout();
}
void DockedWindowLayoutManager::OnWindowDestroying(aura::Window* window) {
if (dragged_window_ == window)
- FinishDragging();
- DCHECK(!dragged_window_);
- DCHECK (!is_dragged_window_docked_);
- if (window == last_active_window_)
- last_active_window_ = NULL;
+ dragged_window_ = NULL;
}
@@ -437,7 +426,7 @@ void DockedWindowLayoutManager::WillChangeVisibilityState(
// to allow the full-screen application to use the full screen.
// TODO(varkha): ShelfLayoutManager::UpdateVisibilityState sets state to
- // SHELF_AUTO_HIDE when in immersive mode. Distinguish this from
+ // SHELF_AUTO_HIDE when in immersive mode. We need to distinguish this from
// when shelf enters auto-hide state based on mouse hover when auto-hide
// setting is enabled and hide all windows (immersive mode should hide docked
// windows).
@@ -473,43 +462,30 @@ void DockedWindowLayoutManager::RestoreWindow(aura::Window* window) {
window->Show();
}
-void DockedWindowLayoutManager::OnWindowDocked(aura::Window* window) {
- DCHECK(!is_dragged_window_docked_);
- is_dragged_window_docked_ = true;
-
- // If there are no other docked windows update alignment.
- if (!IsAnyWindowDocked())
- alignment_ = DOCKED_ALIGNMENT_NONE;
-}
-
-void DockedWindowLayoutManager::OnWindowUndocked() {
- // If this is the first window getting docked - update alignment.
- if (!IsAnyWindowDocked())
- alignment_ = GetAlignmentOfWindow(dragged_window_);
-
- DCHECK (is_dragged_window_docked_);
- is_dragged_window_docked_ = false;
-}
-
-bool DockedWindowLayoutManager::IsAnyWindowDocked() {
- return CalculateAlignment() != DOCKED_ALIGNMENT_NONE;
+DockedAlignment DockedWindowLayoutManager::AlignmentOfWindow(
+ const aura::Window* window) const {
+ const gfx::Rect& bounds(window->GetBoundsInScreen());
+ const gfx::Rect docked_bounds = dock_container_->GetBoundsInScreen();
+ if (bounds.x() == docked_bounds.x())
+ return DOCKED_ALIGNMENT_LEFT;
+ if (bounds.right() == docked_bounds.right())
+ return DOCKED_ALIGNMENT_RIGHT;
+ return DOCKED_ALIGNMENT_NONE;
}
void DockedWindowLayoutManager::Relayout() {
- if (in_layout_)
- return;
- if (alignment_ == DOCKED_ALIGNMENT_NONE && !is_dragged_window_docked_)
+ if (in_layout_ || alignment_ == DOCKED_ALIGNMENT_NONE)
return;
base::AutoReset<bool> auto_reset_in_layout(&in_layout_, true);
- gfx::Rect dock_bounds = dock_container_->GetBoundsInScreen();
+ gfx::Rect dock_bounds = dock_container_->bounds();
aura::Window* active_window = NULL;
aura::Window::Windows visible_windows;
docked_width_ = 0;
for (size_t i = 0; i < dock_container_->children().size(); ++i) {
aura::Window* window(dock_container_->children()[i]);
- if (!IsUsedByLayout(window) || window == dragged_window_)
+ if (!IsUsedByLayout(window))
continue;
// If the shelf is currently hidden (full-screen mode), hide window until
@@ -529,14 +505,14 @@ void DockedWindowLayoutManager::Relayout() {
visible_windows.push_back(window);
}
- // Consider docked dragged_window_ when fanning out other child windows.
- if (is_dragged_window_docked_) {
+ // Consider windows that were formerly children of the |dock_container_|
+ // when fanning out other child windows.
+ if (dragged_window_ && dragged_window_->parent() != dock_container_)
visible_windows.push_back(dragged_window_);
- DCHECK(!active_window);
- active_window = dragged_window_;
- }
- // Calculate free space or overlap.
+ // Sort windows by their center positions and fan out overlapping
+ // windows.
+ std::sort(visible_windows.begin(), visible_windows.end(), CompareWindowPos);
gfx::Display display = Shell::GetScreen()->GetDisplayNearestWindow(
dock_container_);
const gfx::Rect work_area = display.work_area();
@@ -549,19 +525,15 @@ void DockedWindowLayoutManager::Relayout() {
const float delta = (float)available_room /
((available_room > 0 || num_windows <= 1) ?
num_windows + 1 : num_windows - 1);
- float y_pos = work_area.y() + ((available_room > 0) ? delta : 0);
+ float y_pos = (available_room > 0) ? delta : 0;
- // Sort windows by their center positions and fan out overlapping
- // windows.
- std::sort(visible_windows.begin(),
- visible_windows.end(),
- CompareWindowPos(is_dragged_from_dock_ ? dragged_window_ : NULL,
- delta));
- is_dragged_from_dock_ = true;
for (aura::Window::Windows::const_iterator iter = visible_windows.begin();
iter != visible_windows.end(); ++iter) {
aura::Window* window = *iter;
- gfx::Rect bounds = window->GetBoundsInScreen();
+ gfx::Rect bounds = window->GetTargetBounds();
+ // Do not force position of a single window.
+ if (num_windows == 1)
+ y_pos = bounds.y();
// Fan out windows evenly distributing the overlap or remaining free space.
bounds.set_y(std::max(work_area.y(),
@@ -571,27 +543,24 @@ void DockedWindowLayoutManager::Relayout() {
// All docked windows other than the one currently dragged remain stuck
// to the screen edge.
+ if (window == dragged_window_)
+ continue;
switch (alignment_) {
case DOCKED_ALIGNMENT_LEFT:
- bounds.set_x(dock_bounds.x());
+ bounds.set_x(0);
break;
case DOCKED_ALIGNMENT_RIGHT:
bounds.set_x(dock_bounds.right() - bounds.width());
break;
case DOCKED_ALIGNMENT_NONE:
+ NOTREACHED() << "Relayout called when dock alignment is 'NONE'";
break;
}
- if (window == dragged_window_) {
- dragged_bounds_ = bounds;
- continue;
- }
- DCHECK_NE(alignment_, DOCKED_ALIGNMENT_NONE);
// Keep the dock at least kMinDockWidth when all windows in it overhang.
docked_width_ = std::min(kMaxDockWidth,
std::max(docked_width_,
bounds.width() > kMaxDockWidth ?
kMinDockWidth : bounds.width()));
- bounds = ScreenAsh::ConvertRectFromScreen(dock_container_, bounds);
SetChildBoundsDirect(window, bounds);
}
UpdateStacking(active_window);
@@ -600,7 +569,7 @@ void DockedWindowLayoutManager::Relayout() {
void DockedWindowLayoutManager::UpdateDockBounds() {
int dock_inset = docked_width_ + (docked_width_ > 0 ? kMinDockGap : 0);
gfx::Rect bounds = gfx::Rect(
- alignment_ == DOCKED_ALIGNMENT_RIGHT && dock_inset > 0 ?
+ alignment_ == DOCKED_ALIGNMENT_RIGHT ?
dock_container_->bounds().right() - dock_inset:
dock_container_->bounds().x(),
dock_container_->bounds().y(),
@@ -632,7 +601,7 @@ void DockedWindowLayoutManager::UpdateStacking(aura::Window* active_window) {
active_window = last_active_window_;
}
- // Windows are stacked like a deck of cards:
+ // We want to to stack the windows like a deck of cards:
// ,------.
// |,------.|
// |,------.|
@@ -641,7 +610,7 @@ void DockedWindowLayoutManager::UpdateStacking(aura::Window* active_window) {
// |`------'|
// |`------'|
// `------'
- // Use the middle of each window to figure out how to stack the window.
+ // We use the middle of each window to figure out how to stack the window.
// This allows us to update the stacking when a window is being dragged around
// by the titlebar.
std::map<int, aura::Window*> window_ordering;
@@ -656,7 +625,7 @@ void DockedWindowLayoutManager::UpdateStacking(aura::Window* active_window) {
}
int active_center_y = active_window->bounds().CenterPoint().y();
- aura::Window* previous_window = NULL;
+ aura::Window* previous_window = background_widget_->GetNativeWindow();
for (std::map<int, aura::Window*>::const_iterator it =
window_ordering.begin();
it != window_ordering.end() && it->first < active_center_y; ++it) {
@@ -676,8 +645,9 @@ void DockedWindowLayoutManager::UpdateStacking(aura::Window* active_window) {
if (active_window->parent() == dock_container_)
dock_container_->StackChildAtTop(active_window);
- if (active_window != dragged_window_)
- last_active_window_ = active_window;
+ if (dragged_window_ && dragged_window_->parent() == dock_container_)
+ dock_container_->StackChildAtTop(dragged_window_);
+ last_active_window_ = active_window;
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/chromium/ash/wm/dock/docked_window_layout_manager.h b/chromium/ash/wm/dock/docked_window_layout_manager.h
index a3019aa7175..aa02b343423 100644
--- a/chromium/ash/wm/dock/docked_window_layout_manager.h
+++ b/chromium/ash/wm/dock/docked_window_layout_manager.h
@@ -50,9 +50,7 @@ class ShelfLayoutManager;
// its layout manager to this instance, e.g.:
// dock_container->SetLayoutManager(
// new DockedWindowLayoutManager(dock_container));
-//
-// TODO(varkha): extend BaseLayoutManager instead of LayoutManager to inherit
-// common functionality.
+
class ASH_EXPORT DockedWindowLayoutManager
: public aura::LayoutManager,
public ash::ShellObserver,
@@ -72,35 +70,26 @@ class ASH_EXPORT DockedWindowLayoutManager
virtual void RemoveObserver(DockedWindowLayoutManagerObserver* observer);
// Called by a DockedWindowResizer to update which window is being dragged.
- // Starts observing the window unless it is a child.
void StartDragging(aura::Window* window);
-
- // Called by a DockedWindowResizer when a dragged window is docked.
- void DockDraggedWindow(aura::Window* window);
-
- // Called by a DockedWindowResizer when a dragged window is no longer docked.
- void UndockDraggedWindow();
-
- // Called by a DockedWindowResizer when a window is no longer being dragged.
- // Stops observing the window unless it is a child.
void FinishDragging();
+ // Returns true if a window is touching the side of the screen except 2 cases:
+ // when some other windows are already docked on the other side or
+ // when launcher (shelf) is aligned on the same side.
+ static bool ShouldWindowDock(aura::Window* window,
+ const gfx::Point& location);
+
ash::Launcher* launcher() { return launcher_; }
void SetLauncher(ash::Launcher* launcher);
- // Calculates if a window is touching the screen edges and returns edge.
- DockedAlignment GetAlignmentOfWindow(const aura::Window* window) const;
-
// Used to snap docked windows to the side of screen during drag.
DockedAlignment CalculateAlignment() const;
- aura::Window* dock_container() const { return dock_container_; }
-
// Returns current bounding rectangle of docked windows area.
const gfx::Rect& docked_bounds() const { return docked_bounds_; }
- // Returns last known coordinates of |dragged_window_| after Relayout.
- const gfx::Rect dragged_bounds() const { return dragged_bounds_;}
+ // Currently dragged window should be able to dock on another screen
+ aura::Window* dragged_window() const { return dragged_window_;}
// aura::LayoutManager:
virtual void OnWindowResized() OVERRIDE;
@@ -154,14 +143,8 @@ class ASH_EXPORT DockedWindowLayoutManager
void MinimizeWindow(aura::Window* window);
void RestoreWindow(aura::Window* window);
- // Updates docked layout state when a window gets inside the dock.
- void OnWindowDocked(aura::Window* window);
-
- // Updates docked layout state when a window gets outside the dock.
- void OnWindowUndocked();
-
- // Returns true if there are any windows currently docked.
- bool IsAnyWindowDocked();
+ // Calculates if a window is touching the screen edges and returns edge.
+ DockedAlignment AlignmentOfWindow(const aura::Window* window) const;
// Called whenever the window layout might change.
void Relayout();
@@ -182,21 +165,8 @@ class ASH_EXPORT DockedWindowLayoutManager
aura::Window* dock_container_;
// Protect against recursive calls to Relayout().
bool in_layout_;
-
- // A window that is being dragged (whether docked or not).
- // Windows are tracked by docked layout manager only if they are docked;
- // however we need to know if a window is being dragged in order to avoid
- // positioning it or even considering it for layout.
+ // The docked window being dragged.
aura::Window* dragged_window_;
-
- // True if the window being dragged is currently docked.
- bool is_dragged_window_docked_;
-
- // Previously docked windows use a more relaxed dragging sorting algorithm
- // that uses assumption that a window starts being dragged out of position
- // that was previously established in Relayout. This allows easier reordering.
- bool is_dragged_from_dock_;
-
// The launcher we are observing for launcher icon changes.
Launcher* launcher_;
// The shelf layout manager being observed for visibility changes.
@@ -210,9 +180,6 @@ class ASH_EXPORT DockedWindowLayoutManager
// Last bounds that were sent to observers.
gfx::Rect docked_bounds_;
- // Target bounds of a docked window being dragged.
- gfx::Rect dragged_bounds_;
-
// Side of the screen that the dock is positioned at.
DockedAlignment alignment_;
diff --git a/chromium/ash/wm/dock/docked_window_layout_manager_unittest.cc b/chromium/ash/wm/dock/docked_window_layout_manager_unittest.cc
index b2f6ffd9cf4..cf7b476f26a 100644
--- a/chromium/ash/wm/dock/docked_window_layout_manager_unittest.cc
+++ b/chromium/ash/wm/dock/docked_window_layout_manager_unittest.cc
@@ -5,7 +5,6 @@
#include "ash/wm/dock/docked_window_layout_manager.h"
#include "ash/ash_switches.h"
-#include "ash/display/display_controller.h"
#include "ash/launcher/launcher.h"
#include "ash/launcher/launcher_model.h"
#include "ash/root_window_controller.h"
@@ -28,7 +27,6 @@
#include "ui/aura/root_window.h"
#include "ui/aura/window.h"
#include "ui/base/hit_test.h"
-#include "ui/gfx/screen.h"
#include "ui/views/widget/widget.h"
namespace ash {
@@ -62,6 +60,11 @@ class DockedWindowLayoutManagerTest
DOCKED_EDGE_RIGHT,
};
+ enum DockedState {
+ UNDOCKED,
+ DOCKED,
+ };
+
aura::Window* CreateTestWindow(const gfx::Rect& bounds) {
aura::Window* window = CreateTestWindowInShellWithDelegateAndType(
NULL,
@@ -133,10 +136,12 @@ class DockedWindowLayoutManagerTest
// Docked windows are parented by dock container during drags.
// All other windows that we are testing here have default container as a
// parent.
- int CorrectContainerIdDuringDrag() {
+ int CorrectContainerIdDuringDrag(DockedState is_docked) {
if (window_type_ == aura::client::WINDOW_TYPE_PANEL)
return internal::kShellWindowId_PanelContainer;
- return internal::kShellWindowId_DockedContainer;
+ if (is_docked == DOCKED)
+ return internal::kShellWindowId_DockedContainer;
+ return internal::kShellWindowId_DefaultContainer;
}
// Test dragging the window vertically (to detach if it is a panel) and then
@@ -181,7 +186,7 @@ class DockedWindowLayoutManagerTest
// Drag enough to detach since our tests assume panels to be initially
// detached.
DragMove(0, dy);
- EXPECT_EQ(CorrectContainerIdDuringDrag(), window->parent()->id());
+ EXPECT_EQ(CorrectContainerIdDuringDrag(UNDOCKED), window->parent()->id());
EXPECT_EQ(initial_bounds.x(), window->GetBoundsInScreen().x());
EXPECT_EQ(initial_bounds.y() + dy, window->GetBoundsInScreen().y());
@@ -203,7 +208,7 @@ class DockedWindowLayoutManagerTest
else if (edge == DOCKED_EDGE_RIGHT)
dx += window->GetRootWindow()->bounds().right() - initial_bounds.right();
DragMove(dx, window_type_ == aura::client::WINDOW_TYPE_PANEL ? 0 : dy);
- EXPECT_EQ(CorrectContainerIdDuringDrag(), window->parent()->id());
+ EXPECT_EQ(CorrectContainerIdDuringDrag(UNDOCKED), window->parent()->id());
// Release the mouse and the panel should be attached to the dock.
DragEnd();
@@ -309,7 +314,7 @@ TEST_P(DockedWindowLayoutManagerTest, ThreeWindowsDragging) {
scoped_ptr<aura::Window> w1(CreateTestWindow(gfx::Rect(0, 0, 201, 201)));
DragToVerticalPositionAndToEdge(DOCKED_EDGE_RIGHT, w1.get(), 20);
scoped_ptr<aura::Window> w2(CreateTestWindow(gfx::Rect(0, 0, 210, 202)));
- DragToVerticalPositionAndToEdge(DOCKED_EDGE_RIGHT, w2.get(), 200);
+ DragToVerticalPositionAndToEdge(DOCKED_EDGE_RIGHT, w2.get(), 100);
scoped_ptr<aura::Window> w3(CreateTestWindow(gfx::Rect(0, 0, 220, 204)));
DragToVerticalPositionAndToEdge(DOCKED_EDGE_RIGHT, w3.get(), 300);
@@ -336,10 +341,9 @@ TEST_P(DockedWindowLayoutManagerTest, ThreeWindowsDragging) {
EXPECT_LE(abs(overlap2 - overlap3), 1);
EXPECT_EQ(0, overlap4);
- // Drag w1 below the point where w1 and w2 would swap places. This point is
- // half way between the tops of those two windows. Add 1 because w2 is taller.
+ // Drag w1 below w2.
ASSERT_NO_FATAL_FAILURE(DragStartAtOffsetFromwindowOrigin(w1.get(), 0, 20));
- DragMove(0, (w2->bounds().y() - w1->bounds().y()) / 2 + 1);
+ DragMove(0, w2->bounds().y() - w1->bounds().y() + 20);
// During the drag the windows get rearranged and the top and the bottom
// should be clamped by the work area.
@@ -360,73 +364,6 @@ TEST_P(DockedWindowLayoutManagerTest, ThreeWindowsDragging) {
EXPECT_EQ(0, overlap4);
}
-// Adds three windows in bottom display and tests layout after a drag.
-TEST_P(DockedWindowLayoutManagerTest, ThreeWindowsDraggingSecondScreen) {
- if (!SupportsMultipleDisplays())
- return;
- if (!SupportsHostWindowResize())
- return;
-
- // Create two screen vertical layout.
- UpdateDisplay("100+100-600x600,100+700-600x600");
- // Layout the secondary display to the bottom of the primary.
- DisplayLayout layout(DisplayLayout::BOTTOM, 0);
- ASSERT_GT(Shell::GetScreen()->GetNumDisplays(), 1);
- Shell::GetInstance()->display_controller()->
- SetLayoutForCurrentDisplays(layout);
-
- scoped_ptr<aura::Window> w1(CreateTestWindow(gfx::Rect(0, 600, 201, 201)));
- DragToVerticalPositionAndToEdge(DOCKED_EDGE_RIGHT, w1.get(), 600 + 20);
- scoped_ptr<aura::Window> w2(CreateTestWindow(gfx::Rect(0, 600, 210, 202)));
- DragToVerticalPositionAndToEdge(DOCKED_EDGE_RIGHT, w2.get(), 600 + 200);
- scoped_ptr<aura::Window> w3(CreateTestWindow(gfx::Rect(0, 600, 220, 204)));
- DragToVerticalPositionAndToEdge(DOCKED_EDGE_RIGHT, w3.get(), 600 + 300);
-
- // All windows should be attached and snapped to the right side of the screen.
- EXPECT_EQ(w1->GetRootWindow()->bounds().right(),
- w1->GetBoundsInScreen().right());
- EXPECT_EQ(internal::kShellWindowId_DockedContainer, w1->parent()->id());
- EXPECT_EQ(w2->GetRootWindow()->bounds().right(),
- w2->GetBoundsInScreen().right());
- EXPECT_EQ(internal::kShellWindowId_DockedContainer, w2->parent()->id());
- EXPECT_EQ(w3->GetRootWindow()->bounds().right(),
- w3->GetBoundsInScreen().right());
- EXPECT_EQ(internal::kShellWindowId_DockedContainer, w3->parent()->id());
-
- gfx::Rect work_area =
- Shell::GetScreen()->GetDisplayNearestWindow(w1.get()).work_area();
- // Test that the top and bottom windows are clamped in work area and
- // that the overlaps between the windows differ at most by a pixel.
- int overlap1 = w1->GetBoundsInScreen().y() - work_area.y();
- int overlap2 = w1->GetBoundsInScreen().bottom() - w2->GetBoundsInScreen().y();
- int overlap3 = w2->GetBoundsInScreen().bottom() - w3->GetBoundsInScreen().y();
- int overlap4 = work_area.bottom() - w3->GetBoundsInScreen().bottom();
- EXPECT_EQ(0, overlap1);
- EXPECT_LE(abs(overlap2 - overlap3), 1);
- EXPECT_EQ(0, overlap4);
-
- // Drag w1 below the point where w1 and w2 would swap places. This point is
- // half way between the tops of those two windows. Add 1 because w2 is taller.
- ASSERT_NO_FATAL_FAILURE(DragStartAtOffsetFromwindowOrigin(w1.get(), 0, 20));
- DragMove(0, (w2->bounds().y() - w1->bounds().y()) / 2 + 1);
-
- // During the drag the windows get rearranged and the top and the bottom
- // should be clamped by the work area.
- EXPECT_EQ(work_area.y(), w2->GetBoundsInScreen().y());
- EXPECT_GT(w1->GetBoundsInScreen().y(), w2->GetBoundsInScreen().y());
- EXPECT_EQ(work_area.bottom(), w3->GetBoundsInScreen().bottom());
- DragEnd();
-
- // Test the new windows order and that the overlaps differ at most by a pixel.
- overlap1 = w2->GetBoundsInScreen().y() - work_area.y();
- overlap2 = w2->GetBoundsInScreen().bottom() - w1->GetBoundsInScreen().y();
- overlap3 = w1->GetBoundsInScreen().bottom() - w3->GetBoundsInScreen().y();
- overlap4 = work_area.bottom() - w3->GetBoundsInScreen().bottom();
- EXPECT_EQ(0, overlap1);
- EXPECT_LE(abs(overlap2 - overlap3), 1);
- EXPECT_EQ(0, overlap4);
-}
-
// Tests run twice - on both panels and normal windows
INSTANTIATE_TEST_CASE_P(NormalOrPanel,
DockedWindowLayoutManagerTest,
diff --git a/chromium/ash/wm/dock/docked_window_resizer.cc b/chromium/ash/wm/dock/docked_window_resizer.cc
index 3e1ef29b0ad..beae1d13a18 100644
--- a/chromium/ash/wm/dock/docked_window_resizer.cc
+++ b/chromium/ash/wm/dock/docked_window_resizer.cc
@@ -16,9 +16,7 @@
#include "ash/wm/dock/docked_window_layout_manager.h"
#include "ash/wm/property_util.h"
#include "ash/wm/window_properties.h"
-#include "ash/wm/workspace/magnetism_matcher.h"
-#include "ash/wm/workspace/phantom_window_controller.h"
-#include "ash/wm/workspace/workspace_window_resizer.h"
+#include "ash/wm/workspace_controller.h"
#include "base/command_line.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/env.h"
@@ -31,18 +29,15 @@
#include "ui/views/widget/widget.h"
namespace ash {
-namespace internal {
namespace {
-DockedWindowLayoutManager* GetDockedLayoutManagerAtPoint(
- const gfx::Point& point) {
- aura::Window* dock_container = Shell::GetContainer(
- wm::GetRootWindowAt(point),
- kShellWindowId_DockedContainer);
- return static_cast<DockedWindowLayoutManager*>(
- dock_container->layout_manager());
-}
+// Distance in pixels that the cursor must move past an edge for a window
+// to move beyond that edge.
+const int kStickyDistance = 64;
+
+// How far in pixels we have to drag to undock a window.
+const int kSnapToDockDistance = 32;
} // namespace
@@ -94,78 +89,37 @@ void DockedWindowResizer::Drag(const gfx::Point& location, int event_flags) {
destroyed_ = NULL;
if (set_tracked_by_workspace)
SetTrackedByWorkspace(GetTarget(), tracked_by_workspace);
-
- DockedWindowLayoutManager* new_dock_layout =
- GetDockedLayoutManagerAtPoint(last_location_);
- if (new_dock_layout != dock_layout_) {
- // The window is being dragged to a new display. If the previous
- // container is the current parent of the window it will be informed of
- // the end of drag when the window is reparented, otherwise let the
- // previous container know the drag is complete. If we told the
- // window's parent that the drag was complete it would begin
- // positioning the window.
- if (is_docked_)
- dock_layout_->UndockDraggedWindow();
- if (dock_layout_ != initial_dock_layout_)
- dock_layout_->FinishDragging();
- is_docked_ = false;
- dock_layout_ = new_dock_layout;
- // The window's initial layout manager already knows that the drag is
- // in progress for this window.
- if (new_dock_layout != initial_dock_layout_)
- new_dock_layout->StartDragging(GetTarget());
- }
-
- // Show snapping animation when a window touches a screen edge or when
- // it is about to get docked.
- DockedAlignment new_docked_alignment = GetDraggedWindowAlignment();
- if (new_docked_alignment != DOCKED_ALIGNMENT_NONE) {
- if (!is_docked_) {
- dock_layout_->DockDraggedWindow(GetTarget());
- is_docked_ = true;
- }
- UpdateSnapPhantomWindow();
- } else {
- if (is_docked_) {
- dock_layout_->UndockDraggedWindow();
- is_docked_ = false;
- }
- // Clear phantom window when a window gets undocked.
- snap_phantom_window_controller_.reset();
- }
}
void DockedWindowResizer::CompleteDrag(int event_flags) {
- snap_phantom_window_controller_.reset();
-
// Temporarily clear kWindowTrackedByWorkspaceKey for panels so that they
// don't get forced into the workspace that may be shrunken because of docked
// windows.
bool tracked_by_workspace = GetTrackedByWorkspace(GetTarget());
- bool set_tracked_by_workspace = was_docked_;
+ bool set_tracked_by_workspace =
+ (was_docked_ && GetTarget()->type() == aura::client::WINDOW_TYPE_PANEL);
if (set_tracked_by_workspace)
SetTrackedByWorkspace(GetTarget(), false);
// The root window can change when dragging into a different screen.
next_window_resizer_->CompleteDrag(event_flags);
- FinishedDragging();
if (set_tracked_by_workspace)
SetTrackedByWorkspace(GetTarget(), tracked_by_workspace);
+ FinishDragging();
}
void DockedWindowResizer::RevertDrag() {
- snap_phantom_window_controller_.reset();
-
// Temporarily clear kWindowTrackedByWorkspaceKey for panels so that they
// don't get forced into the workspace that may be shrunken because of docked
// windows.
bool tracked_by_workspace = GetTrackedByWorkspace(GetTarget());
- bool set_tracked_by_workspace = was_docked_;
+ bool set_tracked_by_workspace =
+ (was_docked_ && GetTarget()->type() == aura::client::WINDOW_TYPE_PANEL);
if (set_tracked_by_workspace)
SetTrackedByWorkspace(GetTarget(), false);
next_window_resizer_->RevertDrag();
- FinishedDragging();
if (set_tracked_by_workspace)
SetTrackedByWorkspace(GetTarget(), tracked_by_workspace);
+ FinishDragging();
}
aura::Window* DockedWindowResizer::GetTarget() {
@@ -181,57 +135,29 @@ DockedWindowResizer::DockedWindowResizer(WindowResizer* next_window_resizer,
: details_(details),
next_window_resizer_(next_window_resizer),
dock_layout_(NULL),
- initial_dock_layout_(NULL),
did_move_or_resize_(false),
was_docked_(false),
- is_docked_(false),
destroyed_(NULL) {
DCHECK(details_.is_resizable);
aura::Window* dock_container = Shell::GetContainer(
details.window->GetRootWindow(),
- kShellWindowId_DockedContainer);
- dock_layout_ = static_cast<DockedWindowLayoutManager*>(
+ internal::kShellWindowId_DockedContainer);
+ DCHECK(dock_container->id() == internal::kShellWindowId_DockedContainer);
+ dock_layout_ = static_cast<internal::DockedWindowLayoutManager*>(
dock_container->layout_manager());
- initial_dock_layout_ = dock_layout_;
was_docked_ = details.window->parent() == dock_container;
- is_docked_ = was_docked_;
-}
-
-DockedAlignment DockedWindowResizer::GetDraggedWindowAlignment() {
- aura::Window* window = GetTarget();
- DockedWindowLayoutManager* layout_manager =
- GetDockedLayoutManagerAtPoint(last_location_);
- const DockedAlignment alignment = layout_manager->CalculateAlignment();
- const gfx::Rect& bounds(window->GetBoundsInScreen());
-
- // Check if the window is touching the edge - it may need to get docked.
- if (alignment == DOCKED_ALIGNMENT_NONE)
- return layout_manager->GetAlignmentOfWindow(window);
-
- // Both bounds and pointer location are checked because some drags involve
- // stickiness at the workspace-to-dock boundary and so the |location| may be
- // outside of the |bounds|.
- // It is also possible that all the docked windows are minimized or hidden
- // in which case the dragged window needs to be exactly touching the same
- // edge that those docked windows were aligned before they got minimized.
- // TODO(varkha): Consider eliminating sticky behavior on that boundary when
- // a pointer enters docked area.
- if ((layout_manager->docked_bounds().Intersects(bounds) &&
- layout_manager->docked_bounds().Contains(last_location_)) ||
- alignment == layout_manager->GetAlignmentOfWindow(window)) {
- // A window is being added to other docked windows (on the same side).
- return alignment;
- }
- return DOCKED_ALIGNMENT_NONE;
}
bool DockedWindowResizer::MaybeSnapToEdge(const gfx::Rect& bounds,
gfx::Point* offset) {
aura::Window* dock_container = Shell::GetContainer(
wm::GetRootWindowAt(last_location_),
- kShellWindowId_DockedContainer);
- DockedAlignment dock_alignment =
- GetDockedLayoutManagerAtPoint(last_location_)->CalculateAlignment();
+ internal::kShellWindowId_DockedContainer);
+ DCHECK(dock_container->id() == internal::kShellWindowId_DockedContainer);
+ internal::DockedWindowLayoutManager* dock_layout =
+ static_cast<internal::DockedWindowLayoutManager*>(
+ dock_container->layout_manager());
+ internal::DockedAlignment dock_alignment = dock_layout->CalculateAlignment();
gfx::Rect dock_bounds = ScreenAsh::ConvertRectFromScreen(
GetTarget()->parent(), dock_container->GetBoundsInScreen());
// Windows only snap magnetically when they are close to the edge of the
@@ -239,33 +165,23 @@ bool DockedWindowResizer::MaybeSnapToEdge(const gfx::Rect& bounds,
// When a window being dragged is the last window that was previously
// docked it is still allowed to magnetically snap to either side.
bool can_snap = was_docked_ ||
- (GetDraggedWindowAlignment() != DOCKED_ALIGNMENT_NONE);
+ internal::DockedWindowLayoutManager::ShouldWindowDock(GetTarget(),
+ last_location_);
if (!can_snap)
return false;
- // Distance in pixels that the cursor must move past an edge for a window
- // to move beyond that edge. Same constant as in WorkspaceWindowResizer
- // is used for consistency.
- const int kStickyDistance = WorkspaceWindowResizer::kStickyDistancePixels;
-
- // Short-range magnetism when retaining docked state. Same constant as in
- // MagnetismMatcher is used for consistency.
- const int kSnapToDockDistance = MagnetismMatcher::kMagneticDistance;
-
- if (dock_alignment == DOCKED_ALIGNMENT_LEFT ||
- (dock_alignment == DOCKED_ALIGNMENT_NONE && was_docked_)) {
+ if (dock_alignment == internal::DOCKED_ALIGNMENT_LEFT ||
+ (dock_alignment == internal::DOCKED_ALIGNMENT_NONE && was_docked_)) {
const int distance = bounds.x() - dock_bounds.x();
- if (distance < (was_docked_ ? kSnapToDockDistance : 0) &&
- distance > -kStickyDistance) {
+ if (distance < kSnapToDockDistance && distance > -kStickyDistance) {
offset->set_x(-distance);
return true;
}
}
- if (dock_alignment == DOCKED_ALIGNMENT_RIGHT ||
- (dock_alignment == DOCKED_ALIGNMENT_NONE && was_docked_)) {
+ if (dock_alignment == internal::DOCKED_ALIGNMENT_RIGHT ||
+ (dock_alignment == internal::DOCKED_ALIGNMENT_NONE && was_docked_)) {
const int distance = dock_bounds.right() - bounds.right();
- if (distance < (was_docked_ ? kSnapToDockDistance : 0) &&
- distance > -kStickyDistance) {
+ if (distance < kSnapToDockDistance && distance > -kStickyDistance) {
offset->set_x(distance);
return true;
}
@@ -275,54 +191,37 @@ bool DockedWindowResizer::MaybeSnapToEdge(const gfx::Rect& bounds,
void DockedWindowResizer::StartedDragging() {
// Tell the dock layout manager that we are dragging this window.
- // At this point we are not yet animating the window as it may not be
- // inside the docked area.
dock_layout_->StartDragging(GetTarget());
- // Reparent workspace windows during the drag to elevate them above workspace.
- // Other windows for which the DockedWindowResizer is instantiated include
- // panels and windows that are already docked. Those do not need reparenting.
- if (GetTarget()->type() != aura::client::WINDOW_TYPE_PANEL &&
- GetTarget()->parent()->id() == kShellWindowId_DefaultContainer) {
- // The window is going to be reparented - avoid completing the drag.
- GetTarget()->SetProperty(kContinueDragAfterReparent, true);
-
- // Reparent the window into the docked windows container in order to get it
- // on top of other docked windows.
- aura::Window* docked_container = Shell::GetContainer(
- GetTarget()->GetRootWindow(),
- kShellWindowId_DockedContainer);
- docked_container->AddChild(GetTarget());
- }
- if (is_docked_)
- dock_layout_->DockDraggedWindow(GetTarget());
}
-void DockedWindowResizer::FinishedDragging() {
+void DockedWindowResizer::FinishDragging() {
if (!did_move_or_resize_)
return;
aura::Window* window = GetTarget();
bool should_dock = was_docked_;
- const bool attached_panel =
- window->type() == aura::client::WINDOW_TYPE_PANEL &&
- window->GetProperty(kPanelAttachedKey);
- // If a window was previously docked then keep it docked if it is resized and
- // still aligned at the screen edge.
- if ((was_docked_ ||
- ((details_.bounds_change & WindowResizer::kBoundsChange_Repositions) &&
- !(details_.bounds_change & WindowResizer::kBoundsChange_Resizes)))) {
- should_dock = GetDraggedWindowAlignment() != DOCKED_ALIGNMENT_NONE;
+ if ((details_.bounds_change & WindowResizer::kBoundsChange_Repositions) &&
+ !(details_.bounds_change & WindowResizer::kBoundsChange_Resizes) &&
+ CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kAshEnableDockedWindows)) {
+ const bool attached_panel =
+ window->type() == aura::client::WINDOW_TYPE_PANEL &&
+ window->GetProperty(internal::kPanelAttachedKey);
+ should_dock = !attached_panel &&
+ internal::DockedWindowLayoutManager::ShouldWindowDock(window,
+ last_location_);
}
- // Check if the window needs to be docked or returned to workspace.
- aura::Window* dock_container = Shell::GetContainer(
- window->GetRootWindow(),
- kShellWindowId_DockedContainer);
- if (!attached_panel &&
- should_dock != (window->parent() == dock_container)) {
+ // Check if desired docked state is not same as current.
+ // If not same dock or undock accordingly.
+ if (should_dock !=
+ (window->parent()->id() == internal::kShellWindowId_DockedContainer)) {
if (should_dock) {
+ aura::Window* dock_container = Shell::GetContainer(
+ window->GetRootWindow(),
+ internal::kShellWindowId_DockedContainer);
dock_container->AddChild(window);
- } else if (window->parent()->id() == kShellWindowId_DockedContainer) {
+ } else {
// Reparent the window back to workspace.
// We need to be careful to give SetDefaultParentByRootWindow location in
// the right root window (matching the logic in DragWindowResizer) based
@@ -336,25 +235,6 @@ void DockedWindowResizer::FinishedDragging() {
}
}
dock_layout_->FinishDragging();
-
- // If we started the drag in one root window and moved into another root
- // but then canceled the drag we may need to inform the original layout
- // manager that the drag is finished.
- if (initial_dock_layout_ != dock_layout_)
- initial_dock_layout_->FinishDragging();
- is_docked_ = false;
-}
-
-void DockedWindowResizer::UpdateSnapPhantomWindow() {
- if (!did_move_or_resize_ || details_.window_component != HTCAPTION)
- return;
-
- if (!snap_phantom_window_controller_) {
- snap_phantom_window_controller_.reset(
- new PhantomWindowController(GetTarget()));
- }
- snap_phantom_window_controller_->Show(dock_layout_->dragged_bounds());
}
-} // namespace internal
-} // namespace ash
+} // namespace aura
diff --git a/chromium/ash/wm/dock/docked_window_resizer.h b/chromium/ash/wm/dock/docked_window_resizer.h
index 41bb4fecd5f..41dd47d5b38 100644
--- a/chromium/ash/wm/dock/docked_window_resizer.h
+++ b/chromium/ash/wm/dock/docked_window_resizer.h
@@ -5,10 +5,8 @@
#ifndef ASH_WM_DOCK_DOCK_WINDOW_RESIZER_H_
#define ASH_WM_DOCK_DOCK_WINDOW_RESIZER_H_
-#include "ash/wm/dock/dock_types.h"
#include "ash/wm/window_resizer.h"
#include "base/compiler_specific.h"
-#include "base/memory/scoped_ptr.h"
namespace gfx {
class Point;
@@ -20,10 +18,10 @@ class RootWindow;
}
namespace ash {
-namespace internal {
+namespace internal {
class DockedWindowLayoutManager;
-class PhantomWindowController;
+}
// DockWindowResizer is used by ToplevelWindowEventFilter to handle dragging,
// moving or resizing of a window while it is docked to the side of a screen.
@@ -54,12 +52,6 @@ class ASH_EXPORT DockedWindowResizer : public WindowResizer {
DockedWindowResizer(WindowResizer* next_window_resizer,
const Details& details);
- // Returns the side of the screen that the window should dock to or
- // DOCKED_ALIGNMENT_NONE when the window is not on a side or when some other
- // windows are already docked on the other side or when launcher (shelf) is
- // aligned on the same side.
- DockedAlignment GetDraggedWindowAlignment();
-
// Checks if the provided window bounds should snap to the side of a screen.
// If so the offset returned gives the necessary adjustment to snap.
bool MaybeSnapToEdge(const gfx::Rect& bounds, gfx::Point* offset);
@@ -70,10 +62,7 @@ class ASH_EXPORT DockedWindowResizer : public WindowResizer {
// Informs the DockLayoutManager that the drag is complete if it was informed
// of the drag start.
- void FinishedDragging();
-
- // Updates the bounds of the phantom window that is used as a docking hint.
- void UpdateSnapPhantomWindow();
+ void FinishDragging();
const Details details_;
@@ -84,20 +73,13 @@ class ASH_EXPORT DockedWindowResizer : public WindowResizer {
// Dock container window.
internal::DockedWindowLayoutManager* dock_layout_;
- internal::DockedWindowLayoutManager* initial_dock_layout_;
// Set to true once Drag() is invoked and the bounds of the window change.
bool did_move_or_resize_;
- // Gives a preview of where the the window will end up.
- scoped_ptr<PhantomWindowController> snap_phantom_window_controller_;
-
// Set to true if the window that is being dragged was docked before drag.
bool was_docked_;
- // True if the dragged window is docked during the drag.
- bool is_docked_;
-
// If non-NULL the destructor sets this to true. Used to determine if this has
// been deleted.
bool* destroyed_;
@@ -105,7 +87,6 @@ class ASH_EXPORT DockedWindowResizer : public WindowResizer {
DISALLOW_COPY_AND_ASSIGN(DockedWindowResizer);
};
-} // namespace internal
} // namespace ash
#endif // ASH_WM_DOCK_DOCK_WINDOW_RESIZER_H_
diff --git a/chromium/ash/wm/dock/docked_window_resizer_unittest.cc b/chromium/ash/wm/dock/docked_window_resizer_unittest.cc
index 49aeca25318..606e6f4f9d7 100644
--- a/chromium/ash/wm/dock/docked_window_resizer_unittest.cc
+++ b/chromium/ash/wm/dock/docked_window_resizer_unittest.cc
@@ -63,6 +63,11 @@ class DockedWindowResizerTest
DOCKED_EDGE_RIGHT,
};
+ enum DockedState {
+ UNDOCKED,
+ DOCKED,
+ };
+
aura::Window* CreateTestWindow(const gfx::Rect& bounds) {
aura::Window* window = CreateTestWindowInShellWithDelegateAndType(
&delegate_,
@@ -140,12 +145,15 @@ class DockedWindowResizerTest
}
// Panels are parented by panel container during drags.
- // All other windows that are tested here are parented by dock container
- // during drags.
- int CorrectContainerIdDuringDrag() {
+ // Docked windows are parented by dock container during drags.
+ // All other windows that we are testing here have default container as a
+ // parent.
+ int CorrectContainerIdDuringDrag(DockedState is_docked) {
if (window_type_ == aura::client::WINDOW_TYPE_PANEL)
return internal::kShellWindowId_PanelContainer;
- return internal::kShellWindowId_DockedContainer;
+ if (is_docked == DOCKED)
+ return internal::kShellWindowId_DockedContainer;
+ return internal::kShellWindowId_DefaultContainer;
}
// Test dragging the window vertically (to detach if it is a panel) and then
@@ -190,7 +198,7 @@ class DockedWindowResizerTest
// Drag enough to detach since our tests assume panels to be initially
// detached.
DragMove(0, dy);
- EXPECT_EQ(CorrectContainerIdDuringDrag(), window->parent()->id());
+ EXPECT_EQ(CorrectContainerIdDuringDrag(UNDOCKED), window->parent()->id());
EXPECT_EQ(initial_bounds.x(), window->GetBoundsInScreen().x());
EXPECT_EQ(initial_bounds.y() + dy, window->GetBoundsInScreen().y());
@@ -212,7 +220,7 @@ class DockedWindowResizerTest
else if (edge == DOCKED_EDGE_RIGHT)
dx += window->GetRootWindow()->bounds().right() - initial_bounds.right();
DragMove(dx, window_type_ == aura::client::WINDOW_TYPE_PANEL ? 0 : dy);
- EXPECT_EQ(CorrectContainerIdDuringDrag(), window->parent()->id());
+ EXPECT_EQ(CorrectContainerIdDuringDrag(UNDOCKED), window->parent()->id());
// Release the mouse and the panel should be attached to the dock.
DragEnd();
@@ -381,10 +389,9 @@ TEST_P(DockedWindowResizerTest, AttachTryDetach) {
window->GetBoundsInScreen().right());
EXPECT_EQ(internal::kShellWindowId_DockedContainer, window->parent()->id());
- // Try to detach by dragging left less than kSnapToDockDistance.
- // The window should stay docked.
+ // Try to detach by dragging left a bit (should stay docked)
ASSERT_NO_FATAL_FAILURE(DragStart(window.get()));
- DragMove(-4, -10);
+ DragMove(-10, -10);
// Release the mouse and the window should be still attached to the dock.
DragEnd();
@@ -393,8 +400,7 @@ TEST_P(DockedWindowResizerTest, AttachTryDetach) {
window->GetBoundsInScreen().right());
EXPECT_EQ(internal::kShellWindowId_DockedContainer, window->parent()->id());
- // Try to detach by dragging left by kSnapToDockDistance or more.
- // The window should get undocked.
+ // Try to detach by dragging left a bit more (should get undocked)
ASSERT_NO_FATAL_FAILURE(DragStart(window.get()));
DragMove(-32, -10);
// Release the mouse and the window should be no longer attached to the dock.
@@ -539,7 +545,7 @@ TEST_P(DockedWindowResizerTest, DragAcrossDisplays) {
// but not enough to land in the other screen
ASSERT_NO_FATAL_FAILURE(DragStart(window.get()));
DragMove(70, 0);
- EXPECT_EQ(CorrectContainerIdDuringDrag(), window->parent()->id());
+ EXPECT_EQ(CorrectContainerIdDuringDrag(DOCKED), window->parent()->id());
DragEnd();
EXPECT_NE(window->GetRootWindow()->bounds().right(),
window->GetBoundsInScreen().right());
@@ -550,7 +556,7 @@ TEST_P(DockedWindowResizerTest, DragAcrossDisplays) {
// Move back left - should dock again.
ASSERT_NO_FATAL_FAILURE(DragStart(window.get()));
DragMove(-70, 0);
- EXPECT_EQ(CorrectContainerIdDuringDrag(), window->parent()->id());
+ EXPECT_EQ(CorrectContainerIdDuringDrag(UNDOCKED), window->parent()->id());
DragEnd();
EXPECT_EQ(window->GetRootWindow()->bounds().right(),
window->GetBoundsInScreen().right());
@@ -566,7 +572,7 @@ TEST_P(DockedWindowResizerTest, DragAcrossDisplays) {
window->bounds().width()/2 + 10,
0));
DragMove(window->bounds().width()/2 - 5, 0);
- EXPECT_EQ(CorrectContainerIdDuringDrag(), window->parent()->id());
+ EXPECT_EQ(CorrectContainerIdDuringDrag(DOCKED), window->parent()->id());
DragEnd();
EXPECT_NE(window->GetRootWindow()->bounds().right(),
window->GetBoundsInScreen().right());
@@ -583,7 +589,7 @@ TEST_P(DockedWindowResizerTest, DragAcrossDisplays) {
DragMove(window->GetRootWindow()->GetBoundsInScreen().x() -
window->GetBoundsInScreen().x(),
0);
- EXPECT_EQ(CorrectContainerIdDuringDrag(), window->parent()->id());
+ EXPECT_EQ(CorrectContainerIdDuringDrag(UNDOCKED), window->parent()->id());
DragEnd();
EXPECT_EQ(window->GetRootWindow()->GetBoundsInScreen().x(),
window->GetBoundsInScreen().x());
@@ -614,7 +620,7 @@ TEST_P(DockedWindowResizerTest, AttachTwoWindowsDetachOne)
EXPECT_EQ(DOCKED_ALIGNMENT_RIGHT, manager->alignment_);
EXPECT_EQ(w1->bounds().width(), manager->docked_width_);
- DragToVerticalPositionRelativeToEdge(DOCKED_EDGE_RIGHT, w2.get(), 0, 100);
+ DragToVerticalPositionRelativeToEdge(DOCKED_EDGE_RIGHT, w2.get(), 0, 50);
// Both windows should now be attached and snapped to the right edge.
EXPECT_EQ(w2->GetRootWindow()->bounds().right(),
w2->GetBoundsInScreen().right());
@@ -721,11 +727,12 @@ TEST_P(DockedWindowResizerTest, AttachWindowMaximizeOther)
ASSERT_NO_FATAL_FAILURE(DragStart(w1.get()));
EXPECT_EQ(DOCKED_ALIGNMENT_RIGHT, manager->alignment_);
DragMove(-35, 10);
- // Alignment is set to "NONE" when drag starts.
- EXPECT_EQ(DOCKED_ALIGNMENT_NONE, manager->alignment_);
+ // For NORMAL windows alignment is set to "RIGHT" until the drag is completed.
+ // For PANEL windows alignment is set to "NONE" when drag starts.
+ EXPECT_EQ(test_panels() ? DOCKED_ALIGNMENT_NONE : DOCKED_ALIGNMENT_RIGHT,
+ manager->alignment_);
// Release the mouse and the window should be no longer attached to the edge.
DragEnd();
- EXPECT_EQ(DOCKED_ALIGNMENT_NONE, manager->alignment_);
// Dock should get shrunk and desktop should get expanded.
EXPECT_EQ(internal::kShellWindowId_DefaultContainer, w1->parent()->id());
EXPECT_EQ(internal::kShellWindowId_DefaultContainer, w2->parent()->id());
@@ -817,7 +824,7 @@ TEST_P(DockedWindowResizerTest, AttachOneTestSticky)
// Drag w2 by a bit more - it should resist the drag (stuck edges)
int start_x = w2->bounds().x();
- ASSERT_NO_FATAL_FAILURE(DragStartAtOffsetFromwindowOrigin(w2.get(), 100, 5));
+ ASSERT_NO_FATAL_FAILURE(DragStart(w2.get()));
DragMove(-2, 0);
// Window should not actually move.
EXPECT_EQ(start_x, w2->bounds().x());
@@ -881,7 +888,7 @@ TEST_P(DockedWindowResizerTest, ResizeTwoWindows)
EXPECT_EQ(DOCKED_ALIGNMENT_RIGHT, manager->alignment_);
EXPECT_EQ(w1->bounds().width(), manager->docked_width_);
- DragToVerticalPositionRelativeToEdge(DOCKED_EDGE_RIGHT, w2.get(), 0, 100);
+ DragToVerticalPositionRelativeToEdge(DOCKED_EDGE_RIGHT, w2.get(), 0, 50);
// Both windows should now be attached and snapped to the right edge.
EXPECT_EQ(w2->GetRootWindow()->bounds().right(),
w2->GetBoundsInScreen().right());
@@ -1024,11 +1031,12 @@ TEST_P(DockedWindowResizerTest, DragToShelf)
// Detach and drag down to shelf.
ASSERT_NO_FATAL_FAILURE(DragStart(w1.get()));
DragMove(-40, 0);
- // Alignment is set to "NONE" when drag starts.
- EXPECT_EQ(DOCKED_ALIGNMENT_NONE, manager->alignment_);
+ // For NORMAL windows alignment is set to "RIGHT" until the drag is completed.
+ // For PANEL windows alignment is set to "NONE" when drag starts.
+ EXPECT_EQ(test_panels() ? DOCKED_ALIGNMENT_NONE : DOCKED_ALIGNMENT_RIGHT,
+ manager->alignment_);
// Release the mouse and the window should be no longer attached to the edge.
DragEnd();
- EXPECT_EQ(DOCKED_ALIGNMENT_NONE, manager->alignment_);
// Drag down almost to shelf. A panel will snap, a regular window won't.
ShelfWidget* shelf = Launcher::ForPrimaryDisplay()->shelf_widget();
diff --git a/chromium/ash/wm/event_client_impl.cc b/chromium/ash/wm/event_client_impl.cc
index 03d4dea0b03..fcdc1b425d3 100644
--- a/chromium/ash/wm/event_client_impl.cc
+++ b/chromium/ash/wm/event_client_impl.cc
@@ -8,7 +8,6 @@
#include "ash/shell.h"
#include "ash/shell_window_ids.h"
#include "ui/aura/window.h"
-#include "ui/keyboard/keyboard_util.h"
namespace ash {
namespace internal {
@@ -22,34 +21,26 @@ EventClientImpl::~EventClientImpl() {
bool EventClientImpl::CanProcessEventsWithinSubtree(
const aura::Window* window) const {
const aura::RootWindow* root_window = window ? window->GetRootWindow() : NULL;
- if (!root_window ||
- !Shell::GetInstance()->session_state_delegate()->IsUserSessionBlocked()) {
+ if (!root_window)
return true;
- }
-
- const aura::Window* lock_screen_containers = Shell::GetContainer(
- root_window,
- kShellWindowId_LockScreenContainersContainer);
- const aura::Window* lock_background_containers = Shell::GetContainer(
- root_window,
- kShellWindowId_LockScreenBackgroundContainer);
- const aura::Window* lock_screen_related_containers = Shell::GetContainer(
- root_window,
- kShellWindowId_LockScreenRelatedContainersContainer);
- bool can_process_events = (window->Contains(lock_screen_containers) &&
- window->Contains(lock_background_containers) &&
- window->Contains(lock_screen_related_containers)) ||
- lock_screen_containers->Contains(window) ||
- lock_background_containers->Contains(window) ||
- lock_screen_related_containers->Contains(window);
- if (keyboard::IsKeyboardEnabled()) {
- const aura::Window* virtual_keyboard_container = Shell::GetContainer(
+ if (Shell::GetInstance()->session_state_delegate()->IsUserSessionBlocked()) {
+ const aura::Window* lock_screen_containers = Shell::GetContainer(
+ root_window,
+ kShellWindowId_LockScreenContainersContainer);
+ const aura::Window* lock_background_containers = Shell::GetContainer(
+ root_window,
+ kShellWindowId_LockScreenBackgroundContainer);
+ const aura::Window* lock_screen_related_containers = Shell::GetContainer(
root_window,
- kShellWindowId_VirtualKeyboardContainer);
- can_process_events |= (window->Contains(virtual_keyboard_container) ||
- virtual_keyboard_container->Contains(window));
+ kShellWindowId_LockScreenRelatedContainersContainer);
+ return (window->Contains(lock_screen_containers) &&
+ window->Contains(lock_background_containers) &&
+ window->Contains(lock_screen_related_containers)) ||
+ lock_screen_containers->Contains(window) ||
+ lock_background_containers->Contains(window) ||
+ lock_screen_related_containers->Contains(window);
}
- return can_process_events;
+ return true;
}
ui::EventTarget* EventClientImpl::GetToplevelEventTarget() {
diff --git a/chromium/ash/wm/frame_painter.h b/chromium/ash/wm/frame_painter.h
index e79b012d2e9..38f2fb1e697 100644
--- a/chromium/ash/wm/frame_painter.h
+++ b/chromium/ash/wm/frame_painter.h
@@ -160,6 +160,8 @@ class ASH_EXPORT FramePainter : public aura::WindowObserver,
FRIEND_TEST_ALL_PREFIXES(FramePainterTest, GetHeaderOpacity);
FRIEND_TEST_ALL_PREFIXES(FramePainterTest, TitleIconAlignment);
FRIEND_TEST_ALL_PREFIXES(FramePainterTest, ChildWindowVisibility);
+ FRIEND_TEST_ALL_PREFIXES(FramePainterTest,
+ NoCrashShutdownWithAlwaysOnTopWindow);
// Sets the images for a button based on IDs from the |frame_| theme provider.
void SetButtonImages(views::ImageButton* button,
diff --git a/chromium/ash/wm/frame_painter_unittest.cc b/chromium/ash/wm/frame_painter_unittest.cc
index ee9313fcf10..5826be6787d 100644
--- a/chromium/ash/wm/frame_painter_unittest.cc
+++ b/chromium/ash/wm/frame_painter_unittest.cc
@@ -12,6 +12,7 @@
#include "ash/wm/window_properties.h"
#include "ash/wm/window_util.h"
#include "base/memory/scoped_ptr.h"
+#include "base/message_loop/message_loop.h"
#include "grit/ash_resources.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/aura/client/aura_constants.h"
@@ -25,6 +26,7 @@
#include "ui/views/controls/button/image_button.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h"
+#include "ui/views/widget/widget_observer.h"
#include "ui/views/window/non_client_view.h"
using ash::FramePainter;
@@ -148,6 +150,33 @@ FramePainter* CreateTestPainter(Widget* widget) {
return painter;
}
+// Self-owned manager of the frame painter which deletes the painter and itself
+// when its widget is closed.
+class FramePainterOwner : views::WidgetObserver {
+ public:
+ explicit FramePainterOwner(Widget* widget)
+ : frame_painter_(CreateTestPainter(widget)) {
+ widget->AddObserver(this);
+ }
+
+ virtual ~FramePainterOwner() {}
+
+ FramePainter* frame_painter() { return frame_painter_.get(); }
+
+ private:
+ virtual void OnWidgetDestroying(Widget* widget) OVERRIDE {
+ widget->RemoveObserver(this);
+ // Do not delete directly here, since the task of FramePainter causing
+ // the crash of crbug.com/273310 may run after this class handles this
+ // event.
+ base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
+ }
+
+ scoped_ptr<FramePainter> frame_painter_;
+
+ DISALLOW_COPY_AND_ASSIGN(FramePainterOwner);
+};
+
} // namespace
namespace ash {
@@ -690,4 +719,33 @@ TEST_F(FramePainterTest, ChildWindowVisibility) {
0));
}
+TEST_F(FramePainterTest, NoCrashShutdownWithAlwaysOnTopWindow) {
+ // Create normal window and an always-on-top window, and leave it as is
+ // and finish the test, then verify it doesn't cause a crash. See
+ // crbug.com/273310. Note that those widgets will be deleted at
+ // RootWindowController::CloseChildWindows(), so this code is memory-safe.
+ Widget* w1 = new Widget;
+ Widget::InitParams params1;
+ params1.context = CurrentContext();
+ w1->Init(params1);
+ FramePainterOwner* o1 = new FramePainterOwner(w1);
+ FramePainter* p1 = o1->frame_painter();
+ w1->SetBounds(gfx::Rect(0, 0, 100, 100));
+ w1->Show();
+ EXPECT_TRUE(p1->UseSoloWindowHeader());
+
+ Widget* w2 = new Widget;
+ Widget::InitParams params2;
+ params2.context = CurrentContext();
+ params2.keep_on_top = true;
+ w2->Init(params2);
+ FramePainterOwner* o2 = new FramePainterOwner(w2);
+ FramePainter* p2 = o2->frame_painter();
+ w2->Show();
+ EXPECT_FALSE(p1->UseSoloWindowHeader());
+ EXPECT_FALSE(p2->UseSoloWindowHeader());
+
+ // Exit with no resource release. They'll be released at shutdown.
+}
+
} // namespace ash
diff --git a/chromium/ash/wm/panels/panel_layout_manager_unittest.cc b/chromium/ash/wm/panels/panel_layout_manager_unittest.cc
index 08f53f7aa8b..ca231ce005d 100644
--- a/chromium/ash/wm/panels/panel_layout_manager_unittest.cc
+++ b/chromium/ash/wm/panels/panel_layout_manager_unittest.cc
@@ -128,8 +128,6 @@ class PanelLayoutManagerTest : public test::AshTestBase {
ASSERT_FALSE(icon_bounds.width() == 0 && icon_bounds.height() == 0);
gfx::Rect window_bounds = panel->GetBoundsInScreen();
- ASSERT_LT(icon_bounds.width(), window_bounds.width());
- ASSERT_LT(icon_bounds.height(), window_bounds.height());
gfx::Rect launcher_bounds = launcher->shelf_widget()->
GetWindowBoundsInScreen();
ShelfAlignment alignment = GetAlignment(panel->GetRootWindow());
diff --git a/chromium/ash/wm/status_area_layout_manager.cc b/chromium/ash/wm/status_area_layout_manager.cc
index d9e0424d240..e17d84e26d2 100644
--- a/chromium/ash/wm/status_area_layout_manager.cc
+++ b/chromium/ash/wm/status_area_layout_manager.cc
@@ -70,7 +70,7 @@ void StatusAreaLayoutManager::SetChildBounds(
void StatusAreaLayoutManager::LayoutStatusArea() {
// Shelf layout manager may be already doing layout.
- if (shelf_->shelf_layout_manager()->updating_bounds())
+ if (shelf_->shelf_layout_manager()->in_layout())
return;
base::AutoReset<bool> auto_reset_in_layout(&in_layout_, true);
diff --git a/chromium/ash/wm/window_animations.cc b/chromium/ash/wm/window_animations.cc
index a3c0ca80621..73deafd75c1 100644
--- a/chromium/ash/wm/window_animations.cc
+++ b/chromium/ash/wm/window_animations.cc
@@ -295,6 +295,9 @@ class CrossFadeObserver : public ui::CompositorObserver,
// Triggers OnImplicitAnimationsCompleted() to be called and deletes us.
layer_->GetAnimator()->StopAnimating();
}
+ virtual void OnWindowRemovingFromRootWindow(aura::Window* window) OVERRIDE {
+ layer_->GetAnimator()->StopAnimating();
+ }
// ui::ImplicitAnimationObserver overrides:
virtual void OnImplicitAnimationsCompleted() OVERRIDE {
diff --git a/chromium/ash/wm/window_resizer.cc b/chromium/ash/wm/window_resizer.cc
index 1ea317a1a3f..e312fc179e5 100644
--- a/chromium/ash/wm/window_resizer.cc
+++ b/chromium/ash/wm/window_resizer.cc
@@ -7,7 +7,6 @@
#include "ash/screen_ash.h"
#include "ash/shell.h"
#include "ash/shell_window_ids.h"
-#include "ash/wm/coordinate_conversion.h"
#include "ash/wm/dock/docked_window_layout_manager.h"
#include "ash/wm/property_util.h"
#include "ash/wm/window_util.h"
@@ -181,6 +180,14 @@ gfx::Rect WindowResizer::CalculateBoundsForDrag(
return details.initial_bounds_in_parent;
gfx::Point location = passed_location;
+ aura::Window* dock_container = Shell::GetContainer(
+ details.window->GetRootWindow(),
+ internal::kShellWindowId_DockedContainer);
+ DCHECK_EQ(dock_container->id(), internal::kShellWindowId_DockedContainer);
+ internal::DockedWindowLayoutManager* dock_layout =
+ static_cast<internal::DockedWindowLayoutManager*>(
+ dock_container->layout_manager());
+
int delta_x = location.x() - details.initial_location_in_parent.x();
int delta_y = location.y() - details.initial_location_in_parent.y();
@@ -199,13 +206,6 @@ gfx::Rect WindowResizer::CalculateBoundsForDrag(
if (details.bounds_change & kBoundsChange_Resizes) {
gfx::Rect work_area =
Shell::GetScreen()->GetDisplayNearestWindow(details.window).work_area();
- aura::Window* dock_container = Shell::GetContainer(
- details.window->GetRootWindow(),
- internal::kShellWindowId_DockedContainer);
- internal::DockedWindowLayoutManager* dock_layout =
- static_cast<internal::DockedWindowLayoutManager*>(
- dock_container->layout_manager());
-
work_area.Union(dock_layout->docked_bounds());
work_area = ScreenAsh::ConvertRectFromScreen(details.window->parent(),
work_area);
@@ -265,13 +265,6 @@ gfx::Rect WindowResizer::CalculateBoundsForDrag(
ScreenAsh::ConvertRectToScreen(parent, new_bounds);
const gfx::Display& display =
Shell::GetScreen()->GetDisplayMatching(new_bounds_in_screen);
- aura::Window* dock_container = Shell::GetContainer(
- wm::GetRootWindowMatching(new_bounds_in_screen),
- internal::kShellWindowId_DockedContainer);
- internal::DockedWindowLayoutManager* dock_layout =
- static_cast<internal::DockedWindowLayoutManager*>(
- dock_container->layout_manager());
-
gfx::Rect screen_work_area = display.work_area();
screen_work_area.Union(dock_layout->docked_bounds());
screen_work_area.Inset(kMinimumOnScreenArea, 0);
diff --git a/chromium/ash/wm/window_selector.cc b/chromium/ash/wm/window_selector.cc
index 47e20159572..8e87a95163c 100644
--- a/chromium/ash/wm/window_selector.cc
+++ b/chromium/ash/wm/window_selector.cc
@@ -361,10 +361,6 @@ void WindowSelector::OnEvent(ui::Event* event) {
aura::Window* target = static_cast<aura::Window*>(event->target());
for (size_t i = 0; i < windows_.size(); ++i) {
if (windows_[i]->Contains(target)) {
- // TODO(flackr): StopPropogation prevents generation of gesture events.
- // We should find a better way to prevent events from being delivered to
- // the window, perhaps a transparent window in front of the target window
- // or using EventClientImpl::CanProcessEventsWithinSubtree.
event->StopPropagation();
break;
}
@@ -385,8 +381,8 @@ void WindowSelector::OnMouseEvent(ui::MouseEvent* event) {
HandleSelectionEvent(target);
}
-void WindowSelector::OnTouchEvent(ui::TouchEvent* event) {
- if (event->type() != ui::ET_TOUCH_PRESSED)
+void WindowSelector::OnGestureEvent(ui::GestureEvent* event) {
+ if (event->type() != ui::ET_GESTURE_TAP)
return;
WindowSelectorWindow* target = GetEventTarget(event);
if (!target)
diff --git a/chromium/ash/wm/window_selector.h b/chromium/ash/wm/window_selector.h
index 9cd1e04fd22..92ed607eabc 100644
--- a/chromium/ash/wm/window_selector.h
+++ b/chromium/ash/wm/window_selector.h
@@ -64,7 +64,7 @@ class WindowSelector : public ui::EventHandler,
// ui::EventHandler:
virtual void OnEvent(ui::Event* event) OVERRIDE;
virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
- virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
+ virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
// aura::WindowObserver:
virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE;
diff --git a/chromium/ash/wm/window_util.cc b/chromium/ash/wm/window_util.cc
index 67dcd95c4c1..7b8e616aa7e 100644
--- a/chromium/ash/wm/window_util.cc
+++ b/chromium/ash/wm/window_util.cc
@@ -161,29 +161,29 @@ void SetPreAutoManageWindowBounds(aura::Window* window,
new gfx::Rect(bounds));
}
-void AdjustBoundsToEnsureMinimumWindowVisibility(const gfx::Rect& work_area,
+void AdjustBoundsToEnsureMinimumWindowVisibility(const gfx::Rect& visible_area,
gfx::Rect* bounds) {
AdjustBoundsToEnsureWindowVisibility(
- work_area, kMinimumOnScreenArea, kMinimumOnScreenArea, bounds);
+ visible_area, kMinimumOnScreenArea, kMinimumOnScreenArea, bounds);
}
-void AdjustBoundsToEnsureWindowVisibility(const gfx::Rect& work_area,
+void AdjustBoundsToEnsureWindowVisibility(const gfx::Rect& visible_area,
int min_width,
int min_height,
gfx::Rect* bounds) {
- bounds->set_width(std::min(bounds->width(), work_area.width()));
- bounds->set_height(std::min(bounds->height(), work_area.height()));
+ bounds->set_width(std::min(bounds->width(), visible_area.width()));
+ bounds->set_height(std::min(bounds->height(), visible_area.height()));
- min_width = std::min(min_width, work_area.width());
- min_height = std::min(min_height, work_area.height());
+ min_width = std::min(min_width, visible_area.width());
+ min_height = std::min(min_height, visible_area.height());
- if (bounds->x() + min_width > work_area.right()) {
- bounds->set_x(work_area.right() - min_width);
+ if (bounds->x() + min_width > visible_area.right()) {
+ bounds->set_x(visible_area.right() - min_width);
} else if (bounds->right() - min_width < 0) {
bounds->set_x(min_width - bounds->width());
}
- if (bounds->y() + min_height > work_area.bottom()) {
- bounds->set_y(work_area.bottom() - min_height);
+ if (bounds->y() + min_height > visible_area.bottom()) {
+ bounds->set_y(visible_area.bottom() - min_height);
} else if (bounds->bottom() - min_height < 0) {
bounds->set_y(min_height - bounds->height());
}
diff --git a/chromium/ash/wm/window_util.h b/chromium/ash/wm/window_util.h
index 1ffeb7db8a3..659d3e11e2d 100644
--- a/chromium/ash/wm/window_util.h
+++ b/chromium/ash/wm/window_util.h
@@ -108,16 +108,16 @@ ASH_EXPORT const gfx::Rect* GetPreAutoManageWindowBounds(
ASH_EXPORT void SetPreAutoManageWindowBounds(aura::Window* window,
const gfx::Rect& bounds);
-// Move the given bounds inside the given work area, including a safety margin
-// given by |kMinimumOnScreenArea|.
+// Move the given bounds inside the given |visible_area|, including a
+// safety margin given by |kMinimumOnScreenArea|.
ASH_EXPORT void AdjustBoundsToEnsureMinimumWindowVisibility(
- const gfx::Rect& work_area,
+ const gfx::Rect& visible_area,
gfx::Rect* bounds);
-// Move the given bounds inside the given work area, including a safety margin
-// given by |min_width| and |min_height|.
+// Move the given bounds inside the given |visible_area|, including a
+// safety margin given by |min_width| and |min_height|.
ASH_EXPORT void AdjustBoundsToEnsureWindowVisibility(
- const gfx::Rect& work_area,
+ const gfx::Rect& visible_area,
int min_width,
int min_height,
gfx::Rect* bounds);
diff --git a/chromium/ash/wm/workspace/phantom_window_controller.cc b/chromium/ash/wm/workspace/phantom_window_controller.cc
index 67272c18a39..4287d5b40d0 100644
--- a/chromium/ash/wm/workspace/phantom_window_controller.cc
+++ b/chromium/ash/wm/workspace/phantom_window_controller.cc
@@ -8,7 +8,6 @@
#include "ash/shell_window_ids.h"
#include "ash/wm/coordinate_conversion.h"
#include "third_party/skia/include/core/SkCanvas.h"
-#include "ui/aura/root_window.h"
#include "ui/aura/window.h"
#include "ui/base/animation/slide_animation.h"
#include "ui/compositor/layer.h"
@@ -92,56 +91,25 @@ void EdgePainter::Paint(gfx::Canvas* canvas, const gfx::Size& size) {
PhantomWindowController::PhantomWindowController(aura::Window* window)
: window_(window),
phantom_below_window_(NULL),
- phantom_widget_(NULL),
- phantom_widget_start_(NULL) {
+ phantom_widget_(NULL) {
}
PhantomWindowController::~PhantomWindowController() {
Hide();
}
-void PhantomWindowController::Show(const gfx::Rect& bounds_in_screen) {
- if (bounds_in_screen == bounds_in_screen_)
+void PhantomWindowController::Show(const gfx::Rect& bounds) {
+ if (bounds == bounds_)
return;
- bounds_in_screen_ = bounds_in_screen;
- aura::RootWindow* target_root = wm::GetRootWindowMatching(bounds_in_screen);
- // Show the phantom at the current bounds of the window. We'll animate to the
- // target bounds. If phantom exists, update the start bounds.
- if (!phantom_widget_)
+ bounds_ = bounds;
+ if (!phantom_widget_) {
+ // Show the phantom at the bounds of the window. We'll animate to the target
+ // bounds.
start_bounds_ = window_->GetBoundsInScreen();
- else
+ CreatePhantomWidget(start_bounds_);
+ } else {
start_bounds_ = phantom_widget_->GetWindowBoundsInScreen();
- if (phantom_widget_ &&
- phantom_widget_->GetNativeWindow()->GetRootWindow() != target_root) {
- phantom_widget_->Close();
- phantom_widget_ = NULL;
- }
- if (!phantom_widget_)
- phantom_widget_ = CreatePhantomWidget(target_root, start_bounds_);
-
- // Create a secondary widget in a second screen if start_bounds_ lie at least
- // partially in that other screen. This allows animations to start or restart
- // in one root window and progress into another root.
- aura::RootWindow* start_root = wm::GetRootWindowMatching(start_bounds_);
- if (start_root == target_root) {
- Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
- for (size_t i = 0; i < root_windows.size(); ++i) {
- if (root_windows[i] != target_root &&
- root_windows[i]->GetBoundsInScreen().Intersects(start_bounds_)) {
- start_root = root_windows[i];
- break;
- }
- }
}
- if (phantom_widget_start_ &&
- (phantom_widget_start_->GetNativeWindow()->GetRootWindow() != start_root
- || start_root == target_root)) {
- phantom_widget_start_->Close();
- phantom_widget_start_ = NULL;
- }
- if (!phantom_widget_start_ && start_root != target_root)
- phantom_widget_start_ = CreatePhantomWidget(start_root, start_bounds_);
-
animation_.reset(new ui::SlideAnimation(this));
animation_->SetTweenType(ui::Tween::EASE_IN);
const int kAnimationDurationMS = 200;
@@ -153,9 +121,6 @@ void PhantomWindowController::Hide() {
if (phantom_widget_)
phantom_widget_->Close();
phantom_widget_ = NULL;
- if (phantom_widget_start_)
- phantom_widget_start_->Close();
- phantom_widget_start_ = NULL;
}
bool PhantomWindowController::IsShowing() const {
@@ -164,50 +129,45 @@ bool PhantomWindowController::IsShowing() const {
void PhantomWindowController::AnimationProgressed(
const ui::Animation* animation) {
- const gfx::Rect current_bounds =
- animation->CurrentValueBetween(start_bounds_, bounds_in_screen_);
- if (phantom_widget_start_)
- phantom_widget_start_->SetBounds(current_bounds);
- phantom_widget_->SetBounds(current_bounds);
+ phantom_widget_->SetBounds(
+ animation->CurrentValueBetween(start_bounds_, bounds_));
}
-views::Widget* PhantomWindowController::CreatePhantomWidget(
- aura::RootWindow* root_window,
- const gfx::Rect& bounds_in_screen) {
- views::Widget* phantom_widget = new views::Widget;
+void PhantomWindowController::CreatePhantomWidget(const gfx::Rect& bounds) {
+ DCHECK(!phantom_widget_);
+ phantom_widget_ = new views::Widget;
views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
// PhantomWindowController is used by FrameMaximizeButton to highlight the
// launcher button. Put the phantom in the same window as the launcher so that
// the phantom is visible.
- params.parent = Shell::GetContainer(root_window,
+ params.parent = Shell::GetContainer(wm::GetRootWindowMatching(bounds),
kShellWindowId_ShelfContainer);
params.can_activate = false;
params.keep_on_top = true;
- phantom_widget->set_focus_on_creation(false);
- phantom_widget->Init(params);
- phantom_widget->SetVisibilityChangedAnimationsEnabled(false);
- phantom_widget->GetNativeWindow()->SetName("PhantomWindow");
- phantom_widget->GetNativeWindow()->set_id(kShellWindowId_PhantomWindow);
+ phantom_widget_->set_focus_on_creation(false);
+ phantom_widget_->Init(params);
+ phantom_widget_->SetVisibilityChangedAnimationsEnabled(false);
+ phantom_widget_->GetNativeWindow()->SetName("PhantomWindow");
+ phantom_widget_->GetNativeWindow()->set_id(kShellWindowId_PhantomWindow);
views::View* content_view = new views::View;
content_view->set_background(
views::Background::CreateBackgroundPainter(true, new EdgePainter));
- phantom_widget->SetContentsView(content_view);
- phantom_widget->SetBounds(bounds_in_screen);
+ phantom_widget_->SetContentsView(content_view);
+ phantom_widget_->SetBounds(bounds);
if (phantom_below_window_)
- phantom_widget->StackBelow(phantom_below_window_);
+ phantom_widget_->StackBelow(phantom_below_window_);
else
- phantom_widget->StackAbove(window_);
+ phantom_widget_->StackAbove(window_);
// Show the widget after all the setups.
- phantom_widget->Show();
+ phantom_widget_->Show();
// Fade the window in.
- ui::Layer* widget_layer = phantom_widget->GetNativeWindow()->layer();
+ ui::Layer* widget_layer = phantom_widget_->GetNativeWindow()->layer();
widget_layer->SetOpacity(0);
ui::ScopedLayerAnimationSettings scoped_setter(widget_layer->GetAnimator());
widget_layer->SetOpacity(1);
- return phantom_widget;
}
} // namespace internal
diff --git a/chromium/ash/wm/workspace/phantom_window_controller.h b/chromium/ash/wm/workspace/phantom_window_controller.h
index 5cd40daa2cd..d7622fcc556 100644
--- a/chromium/ash/wm/workspace/phantom_window_controller.h
+++ b/chromium/ash/wm/workspace/phantom_window_controller.h
@@ -13,7 +13,6 @@
#include "ui/gfx/rect.h"
namespace aura {
-class RootWindow;
class Window;
}
@@ -36,14 +35,13 @@ class ASH_EXPORT PhantomWindowController : public ui::AnimationDelegate {
virtual ~PhantomWindowController();
// Bounds last passed to Show().
- const gfx::Rect& bounds_in_screen() const { return bounds_in_screen_; }
+ const gfx::Rect& bounds() const { return bounds_; }
- // Animates the phantom window towards |bounds_in_screen|.
- // Creates two (if start bounds intersect any root window other than the
- // root window that matches the target bounds) or one (otherwise) phantom
- // widgets to display animated rectangle in each root.
+ // Shows the phantom window at the specified location (coordinates of the
+ // parent). If |layer| is non-NULL, it is shown on top of the phantom window.
+ // |layer| is owned by the caller.
// This does not immediately show the window.
- void Show(const gfx::Rect& bounds_in_screen);
+ void Show(const gfx::Rect& bounds);
// Hides the phantom.
void Hide();
@@ -61,12 +59,12 @@ class ASH_EXPORT PhantomWindowController : public ui::AnimationDelegate {
virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE;
private:
- FRIEND_TEST_ALL_PREFIXES(WorkspaceWindowResizerTest, PhantomWindowShow);
+ FRIEND_TEST_ALL_PREFIXES(WorkspaceWindowResizerTest, PhantomStyle);
- // Creates, shows and returns a phantom widget at |bounds|
- // with kShellWindowId_ShelfContainer in |root_window| as a parent.
- views::Widget* CreatePhantomWidget(aura::RootWindow* root_window,
- const gfx::Rect& bounds_in_screen);
+ // Creates and shows the |phantom_widget_| at |bounds|.
+ // |layer| is shown on top of the phantom window if it is non-NULL.
+ // |layer| is not owned by this object.
+ void CreatePhantomWidget(const gfx::Rect& bounds);
// Window the phantom is placed beneath.
aura::Window* window_;
@@ -74,24 +72,15 @@ class ASH_EXPORT PhantomWindowController : public ui::AnimationDelegate {
// If set, the phantom window should get stacked below this window.
aura::Window* phantom_below_window_;
- // Initially the bounds of |window_| (in screen coordinates).
- // Each time Show() is invoked |start_bounds_| is then reset to the bounds of
- // |phantom_widget_| and |bounds_| is set to the value passed into Show().
- // The animation animates between these two values.
+ // Initially the bounds of |window_|. Each time Show() is invoked
+ // |start_bounds_| is then reset to the bounds of |phantom_widget_| and
+ // |bounds_| is set to the value passed into Show(). The animation animates
+ // between these two values.
gfx::Rect start_bounds_;
+ gfx::Rect bounds_;
- // Target bounds of the animation in screen coordinates.
- gfx::Rect bounds_in_screen_;
-
- // The primary phantom representation of the window. It is parented by the
- // root window matching the target bounds.
views::Widget* phantom_widget_;
- // If the animation starts on another display, this is the secondary phantom
- // representation of the window used on the initial display, otherwise this is
- // NULL. This allows animation to progress from one display into the other.
- views::Widget* phantom_widget_start_;
-
// Used to transition the bounds.
scoped_ptr<ui::SlideAnimation> animation_;
diff --git a/chromium/ash/wm/workspace/workspace_layout_manager.cc b/chromium/ash/wm/workspace/workspace_layout_manager.cc
index 69bcc16069a..0dd9dbf3464 100644
--- a/chromium/ash/wm/workspace/workspace_layout_manager.cc
+++ b/chromium/ash/wm/workspace/workspace_layout_manager.cc
@@ -48,13 +48,15 @@ void MoveToDisplayForRestore(aura::Window* window) {
return;
// Move only if the restore bounds is outside of
- // the root window. There is no information about in which
+ // the display. There is no information about in which
// display it should be restored, so this is best guess.
// TODO(oshima): Restore information should contain the
// work area information like WindowResizer does for the
// last window location.
- if (!window->GetRootWindow()->GetBoundsInScreen().Intersects(
- *restore_bounds)) {
+ gfx::Rect display_area =
+ Shell::GetScreen()->GetDisplayNearestWindow(window).bounds();
+
+ if (!display_area.Intersects(*restore_bounds)) {
DisplayController* display_controller =
Shell::GetInstance()->display_controller();
const gfx::Display& display =
@@ -87,14 +89,7 @@ void WorkspaceLayoutManager::SetShelf(internal::ShelfLayoutManager* shelf) {
}
void WorkspaceLayoutManager::OnWindowAddedToLayout(Window* child) {
- // Adjust window bounds in case that the new child is given the bounds that
- // is out of the workspace. Exclude the case where bounds is empty
- // (this happens when a views::Widget is created), or the window
- // is added with the bounds because a user explicitly moved to
- // this position (drag and drop for example).
- if (!child->bounds().IsEmpty() &&
- !wm::HasUserChangedWindowPositionOrSize(child))
- AdjustWindowBoundsWhenAdded(child);
+ AdjustWindowBoundsWhenAdded(child);
BaseLayoutManager::OnWindowAddedToLayout(child);
UpdateDesktopVisibility();
RearrangeVisibleWindowOnShow(child);
@@ -252,6 +247,14 @@ void WorkspaceLayoutManager::AdjustWindowBoundsForWorkAreaChange(
void WorkspaceLayoutManager::AdjustWindowBoundsWhenAdded(
Window* window) {
+ // Don't adjust window bounds if the bounds are empty as this
+ // happens when a new views::Widget is created.
+ // When a window is dragged and dropped onto a different
+ // root window, the bounds will be updated after they are added
+ // to the root window.
+ if (window->bounds().IsEmpty())
+ return;
+
if (!GetTrackedByWorkspace(window))
return;
@@ -261,9 +264,14 @@ void WorkspaceLayoutManager::AdjustWindowBoundsWhenAdded(
gfx::Rect bounds = window->bounds();
int min_width = bounds.width() * kMinimumPercentOnScreenArea;
int min_height = bounds.height() * kMinimumPercentOnScreenArea;
+ // Use entire display instead of workarea because the workarea can
+ // be further shrunk by the docked area. The logic ensures 30%
+ // visibility which should be enough to see where the window gets
+ // moved.
+ gfx::Rect display_area =
+ Shell::GetScreen()->GetDisplayNearestWindow(window).bounds();
ash::wm::AdjustBoundsToEnsureWindowVisibility(
- work_area_, min_width, min_height, &bounds);
-
+ display_area, min_width, min_height, &bounds);
if (window->bounds() != bounds)
window->SetBounds(bounds);
}
diff --git a/chromium/ash/wm/workspace/workspace_layout_manager_unittest.cc b/chromium/ash/wm/workspace/workspace_layout_manager_unittest.cc
index 3dce5b015c9..13cfdea04a3 100644
--- a/chromium/ash/wm/workspace/workspace_layout_manager_unittest.cc
+++ b/chromium/ash/wm/workspace/workspace_layout_manager_unittest.cc
@@ -304,6 +304,15 @@ TEST_F(WorkspaceLayoutManagerTest, WindowShouldBeOnScreenWhenAdded) {
EXPECT_GT(bounds.width(), out_window->bounds().width() * 0.29);
EXPECT_GT(bounds.height(), out_window->bounds().height() * 0.29);
+ aura::Window* parent = out_window->parent();
+ parent->RemoveChild(out_window.get());
+ out_window->SetBounds(gfx::Rect(-200, -200, 200, 200));
+ // UserHasChangedWindowPositionOrSize flag shouldn't turn off this behavior.
+ wm::SetUserHasChangedWindowPositionOrSize(window.get(), true);
+ parent->AddChild(out_window.get());
+ EXPECT_GT(bounds.width(), out_window->bounds().width() * 0.29);
+ EXPECT_GT(bounds.height(), out_window->bounds().height() * 0.29);
+
// Make sure we always make more than 1/3 of the window edge visible even
// if the initial bounds intersects with display.
window_bounds.SetRect(-150, -150, 200, 200);
diff --git a/chromium/ash/wm/workspace/workspace_window_resizer.cc b/chromium/ash/wm/workspace/workspace_window_resizer.cc
index 4b8c0aaf7e9..2143e45668b 100644
--- a/chromium/ash/wm/workspace/workspace_window_resizer.cc
+++ b/chromium/ash/wm/workspace/workspace_window_resizer.cc
@@ -87,13 +87,8 @@ scoped_ptr<WindowResizer> CreateWindowResizer(
window_resizer = PanelWindowResizer::Create(
window_resizer, window, point_in_parent, window_component, source);
}
- if (CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kAshEnableDockedWindows) &&
- window_resizer && window->parent() &&
- (window->parent()->id() == internal::kShellWindowId_DefaultContainer ||
- window->parent()->id() == internal::kShellWindowId_DockedContainer ||
- window->parent()->id() == internal::kShellWindowId_PanelContainer)) {
- window_resizer = internal::DockedWindowResizer::Create(
+ if (window_resizer) {
+ window_resizer = DockedWindowResizer::Create(
window_resizer, window, point_in_parent, window_component, source);
}
return make_scoped_ptr<WindowResizer>(window_resizer);
@@ -103,6 +98,10 @@ namespace internal {
namespace {
+// Distance in pixels that the cursor must move past an edge for a window
+// to move or resize beyond that edge.
+const int kStickyDistancePixels = 64;
+
// Snapping distance used instead of WorkspaceWindowResizer::kScreenEdgeInset
// when resizing a window using touchscreen.
const int kScreenEdgeInsetForTouchResize = 32;
@@ -117,7 +116,7 @@ bool ShouldStickToEdge(int distance_from_edge, int sticky_size) {
distance_from_edge > -sticky_size;
}
return distance_from_edge < sticky_size &&
- distance_from_edge > -sticky_size * 2;
+ distance_from_edge > -sticky_size * 2;
}
// Returns the coordinate along the secondary axis to snap to.
@@ -260,9 +259,6 @@ const int WorkspaceWindowResizer::kMinOnscreenHeight = 32;
// static
const int WorkspaceWindowResizer::kScreenEdgeInset = 8;
-// static
-const int WorkspaceWindowResizer::kStickyDistancePixels = 64;
-
// Represents the width or height of a window with constraints on its minimum
// and maximum size. 0 represents a lack of a constraint.
class WindowSize {
@@ -509,7 +505,7 @@ gfx::Rect WorkspaceWindowResizer::GetFinalBounds(
const gfx::Rect& bounds) const {
if (snap_phantom_window_controller_.get() &&
snap_phantom_window_controller_->IsShowing()) {
- return snap_phantom_window_controller_->bounds_in_screen();
+ return snap_phantom_window_controller_->bounds();
}
return bounds;
}
@@ -750,12 +746,8 @@ void WorkspaceWindowResizer::AdjustBoundsForMainWindow(
}
if (sticky_size > 0) {
- // Possibly stick to edge except when a mouse pointer is outside the
- // work area.
- if (!(display.work_area().Contains(last_mouse_location_in_screen) &&
- StickToWorkAreaOnMove(work_area, sticky_size, bounds))) {
+ if (!StickToWorkAreaOnMove(work_area, sticky_size, bounds))
MagneticallySnapToOtherWindows(bounds);
- }
}
} else if (sticky_size > 0) {
MagneticallySnapResizeToOtherWindows(bounds);
diff --git a/chromium/ash/wm/workspace/workspace_window_resizer.h b/chromium/ash/wm/workspace/workspace_window_resizer.h
index 76176b1a2b4..61f18969cbc 100644
--- a/chromium/ash/wm/workspace/workspace_window_resizer.h
+++ b/chromium/ash/wm/workspace/workspace_window_resizer.h
@@ -41,10 +41,6 @@ class ASH_EXPORT WorkspaceWindowResizer : public WindowResizer {
// this close to an edge of the screen it snaps to the edge.
static const int kScreenEdgeInset;
- // Distance in pixels that the cursor must move past an edge for a window
- // to move or resize beyond that edge.
- static const int kStickyDistancePixels;
-
virtual ~WorkspaceWindowResizer();
static WorkspaceWindowResizer* Create(
@@ -69,7 +65,6 @@ class ASH_EXPORT WorkspaceWindowResizer : public WindowResizer {
private:
FRIEND_TEST_ALL_PREFIXES(WorkspaceWindowResizerTest, CancelSnapPhantom);
FRIEND_TEST_ALL_PREFIXES(WorkspaceWindowResizerTest, PhantomSnapMaxSize);
- FRIEND_TEST_ALL_PREFIXES(WorkspaceWindowResizerTest, PhantomWindowShow);
// Type of snapping.
enum SnapType {
diff --git a/chromium/ash/wm/workspace/workspace_window_resizer_unittest.cc b/chromium/ash/wm/workspace/workspace_window_resizer_unittest.cc
index 8459c54ef5f..a00d0121429 100644
--- a/chromium/ash/wm/workspace/workspace_window_resizer_unittest.cc
+++ b/chromium/ash/wm/workspace/workspace_window_resizer_unittest.cc
@@ -30,36 +30,6 @@
#include "ui/gfx/screen.h"
#include "ui/views/widget/widget.h"
-namespace ui {
-
-// Class to provide access to SlideAnimation internals for testing.
-class SlideAnimation::TestApi {
- public:
- explicit TestApi(SlideAnimation* animation) : animation_(animation) {}
-
- void SetStartTime(base::TimeTicks ticks) {
- animation_->SetStartTime(ticks);
- }
-
- void Step(base::TimeTicks ticks) {
- animation_->Step(ticks);
- }
-
- void RunTillComplete() {
- SetStartTime(base::TimeTicks());
- Step(base::TimeTicks() +
- base::TimeDelta::FromMilliseconds(animation_->GetSlideDuration()));
- EXPECT_EQ(1.0, animation_->GetCurrentValue());
- }
-
- private:
- SlideAnimation* animation_;
-
- DISALLOW_COPY_AND_ASSIGN(TestApi);
-};
-
-}
-
namespace ash {
namespace internal {
namespace {
@@ -200,12 +170,6 @@ class WorkspaceWindowResizerTest : public test::AshTestBase {
touch_resize_window_->set_hit_test_bounds_override_inner(mouse_insets);
}
- // Simulate running the animation.
- void RunAnimationTillComplete(ui::SlideAnimation* animation) {
- ui::SlideAnimation::TestApi test_api(animation);
- test_api.RunTillComplete();
- }
-
TestWindowDelegate delegate_;
TestWindowDelegate delegate2_;
TestWindowDelegate delegate3_;
@@ -878,12 +842,8 @@ TEST_F(WorkspaceWindowResizerTest, SnapToEdge) {
Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()->
SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
window_->SetBounds(gfx::Rect(96, 112, 320, 160));
- // Click 50px to the right so that the mouse pointer does not leave the
- // workspace ensuring sticky behavior.
scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
- window_.get(),
- window_->bounds().origin() + gfx::Vector2d(50, 0),
- HTCAPTION,
+ window_.get(), gfx::Point(), HTCAPTION,
aura::client::WINDOW_MOVE_SOURCE_MOUSE, empty_windows()));
ASSERT_TRUE(resizer.get());
// Move to an x-coordinate of 15, which should not snap.
@@ -998,12 +958,8 @@ TEST_F(WorkspaceWindowResizerTestSticky, StickToEdge) {
Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()->
SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
window_->SetBounds(gfx::Rect(96, 112, 320, 160));
- // Click 50px to the right so that the mouse pointer does not leave the
- // workspace ensuring sticky behavior.
scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
- window_.get(),
- window_->bounds().origin() + gfx::Vector2d(50, 0),
- HTCAPTION,
+ window_.get(), gfx::Point(), HTCAPTION,
aura::client::WINDOW_MOVE_SOURCE_MOUSE, empty_windows()));
ASSERT_TRUE(resizer.get());
// Move to an x-coordinate of 15, which should not stick.
@@ -1038,22 +994,6 @@ TEST_F(WorkspaceWindowResizerTestSticky, StickToEdge) {
// No need to test dragging < 0 as we force that to 0.
}
-// Verifies not sticking to edges when a mouse pointer is outside of work area.
-TEST_F(WorkspaceWindowResizerTestSticky, NoStickToEdgeWhenOutside) {
- Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()->
- SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
- window_->SetBounds(gfx::Rect(96, 112, 320, 160));
- scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
- window_.get(), gfx::Point(), HTCAPTION,
- aura::client::WINDOW_MOVE_SOURCE_MOUSE, empty_windows()));
- ASSERT_TRUE(resizer.get());
- // Move to an x-coordinate of 15, which should not stick.
- resizer->Drag(CalculateDragPoint(*resizer, 15 - 96, 0), 0);
- // Move to -15, should still stick to 0.
- resizer->Drag(CalculateDragPoint(*resizer, -15 - 96, 0), 0);
- EXPECT_EQ("-15,112 320x160", window_->bounds().ToString());
-}
-
// Verifies a resize sticks when dragging TOPLEFT.
TEST_F(WorkspaceWindowResizerTestSticky, StickToWorkArea_TOPLEFT) {
window_->SetBounds(gfx::Rect(100, 200, 20, 30));
@@ -1865,114 +1805,5 @@ TEST_F(WorkspaceWindowResizerTest, TouchResizeToEdge_BOTTOM) {
EXPECT_EQ(gfx::Rect(100, 100, 600, kRootHeight - 100).ToString(),
touch_resize_window_->bounds().ToString());
}
-
-TEST_F(WorkspaceWindowResizerTest, PhantomWindowShow) {
- if (!SupportsMultipleDisplays())
- return;
-
- UpdateDisplay("500x400,500x400");
- window_->SetBoundsInScreen(gfx::Rect(0, 0, 50, 60),
- Shell::GetScreen()->GetPrimaryDisplay());
- Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
- EXPECT_EQ(root_windows[0], window_->GetRootWindow());
-
- scoped_ptr<WorkspaceWindowResizer> resizer(WorkspaceWindowResizer::Create(
- window_.get(), gfx::Point(), HTCAPTION,
- aura::client::WINDOW_MOVE_SOURCE_MOUSE, empty_windows()));
- ASSERT_TRUE(resizer.get());
- EXPECT_FALSE(resizer->snap_phantom_window_controller_.get());
-
- // The pointer is on the edge but not shared. The snap phantom window
- // controller should be non-NULL.
- resizer->Drag(CalculateDragPoint(*resizer, 499, 0), 0);
- EXPECT_TRUE(resizer->snap_phantom_window_controller_.get());
- PhantomWindowController* phantom_controller(
- resizer->snap_phantom_window_controller_.get());
-
- // phantom widget only in the left screen.
- phantom_controller->Show(gfx::Rect(100, 100, 50, 60));
- EXPECT_TRUE(phantom_controller->phantom_widget_);
- EXPECT_FALSE(phantom_controller->phantom_widget_start_);
- EXPECT_EQ(
- root_windows[0],
- phantom_controller->phantom_widget_->GetNativeWindow()->GetRootWindow());
-
- // Move phantom widget into the right screen. Test that 2 widgets got created.
- phantom_controller->Show(gfx::Rect(600, 100, 50, 60));
- EXPECT_TRUE(phantom_controller->phantom_widget_);
- EXPECT_TRUE(phantom_controller->phantom_widget_start_);
- EXPECT_EQ(
- root_windows[1],
- phantom_controller->phantom_widget_->GetNativeWindow()->GetRootWindow());
- EXPECT_EQ(
- root_windows[0],
- phantom_controller->phantom_widget_start_->GetNativeWindow()->
- GetRootWindow());
- RunAnimationTillComplete(phantom_controller->animation_.get());
-
- // Move phantom widget only in the right screen. Start widget should close.
- phantom_controller->Show(gfx::Rect(700, 100, 50, 60));
- EXPECT_TRUE(phantom_controller->phantom_widget_);
- EXPECT_FALSE(phantom_controller->phantom_widget_start_);
- EXPECT_EQ(
- root_windows[1],
- phantom_controller->phantom_widget_->GetNativeWindow()->GetRootWindow());
- RunAnimationTillComplete(phantom_controller->animation_.get());
-
- // Move phantom widget into the left screen. Start widget should open.
- phantom_controller->Show(gfx::Rect(100, 100, 50, 60));
- EXPECT_TRUE(phantom_controller->phantom_widget_);
- EXPECT_TRUE(phantom_controller->phantom_widget_start_);
- EXPECT_EQ(
- root_windows[0],
- phantom_controller->phantom_widget_->GetNativeWindow()->GetRootWindow());
- EXPECT_EQ(
- root_windows[1],
- phantom_controller->phantom_widget_start_->GetNativeWindow()->
- GetRootWindow());
- RunAnimationTillComplete(phantom_controller->animation_.get());
-
- // Move phantom widget while in the left screen. Start widget should close.
- phantom_controller->Show(gfx::Rect(200, 100, 50, 60));
- EXPECT_TRUE(phantom_controller->phantom_widget_);
- EXPECT_FALSE(phantom_controller->phantom_widget_start_);
- EXPECT_EQ(
- root_windows[0],
- phantom_controller->phantom_widget_->GetNativeWindow()->GetRootWindow());
- RunAnimationTillComplete(phantom_controller->animation_.get());
-
- // Move phantom widget spanning both screens with most of the window in the
- // right screen. Two widgets are created.
- phantom_controller->Show(gfx::Rect(495, 100, 50, 60));
- EXPECT_TRUE(phantom_controller->phantom_widget_);
- EXPECT_TRUE(phantom_controller->phantom_widget_start_);
- EXPECT_EQ(
- root_windows[1],
- phantom_controller->phantom_widget_->GetNativeWindow()->GetRootWindow());
- EXPECT_EQ(
- root_windows[0],
- phantom_controller->phantom_widget_start_->GetNativeWindow()->
- GetRootWindow());
- RunAnimationTillComplete(phantom_controller->animation_.get());
-
- // Move phantom widget back into the left screen. Phantom widgets should swap.
- phantom_controller->Show(gfx::Rect(200, 100, 50, 60));
- EXPECT_TRUE(phantom_controller->phantom_widget_);
- EXPECT_TRUE(phantom_controller->phantom_widget_start_);
- EXPECT_EQ(
- root_windows[0],
- phantom_controller->phantom_widget_->GetNativeWindow()->GetRootWindow());
- EXPECT_EQ(
- root_windows[1],
- phantom_controller->phantom_widget_start_->GetNativeWindow()->
- GetRootWindow());
- RunAnimationTillComplete(phantom_controller->animation_.get());
-
- // Hide phantom controller. Both widgets should close.
- phantom_controller->Hide();
- EXPECT_FALSE(phantom_controller->phantom_widget_);
- EXPECT_FALSE(phantom_controller->phantom_widget_start_);
-}
-
} // namespace internal
} // namespace ash
diff --git a/chromium/ash/wm/workspace_controller.cc b/chromium/ash/wm/workspace_controller.cc
index 7fbbda2f7af..e2ee3f5c222 100644
--- a/chromium/ash/wm/workspace_controller.cc
+++ b/chromium/ash/wm/workspace_controller.cc
@@ -39,6 +39,8 @@ WorkspaceController::WorkspaceController(aura::Window* viewport)
event_handler_(new WorkspaceEventHandler(viewport_)) {
SetWindowVisibilityAnimationTransition(
viewport_, views::corewm::ANIMATE_NONE);
+ // Do this so when animating out windows don't extend beyond the bounds.
+ viewport_->layer()->SetMasksToBounds(true);
// The layout-manager cannot be created in the initializer list since it
// depends on the window to have been initialized.
diff --git a/chromium/ash/wm/workspace_controller_unittest.cc b/chromium/ash/wm/workspace_controller_unittest.cc
index 7dca75a08ba..f6a4ffb0ef2 100644
--- a/chromium/ash/wm/workspace_controller_unittest.cc
+++ b/chromium/ash/wm/workspace_controller_unittest.cc
@@ -1118,16 +1118,8 @@ class DragMaximizedNonTrackedWindowObserver
}
// aura::WindowObserver overrides:
- // Counts number of times a window is reparented. Ignores reparenting into and
- // from a docked container which is expected when a tab is dragged.
virtual void OnWindowHierarchyChanged(
const HierarchyChangeParams& params) OVERRIDE {
- if ((params.old_parent->id() == kShellWindowId_DefaultContainer &&
- params.new_parent->id() == kShellWindowId_DockedContainer) ||
- (params.old_parent->id() == kShellWindowId_DockedContainer &&
- params.new_parent->id() == kShellWindowId_DefaultContainer)) {
- return;
- }
change_count_++;
}
diff --git a/chromium/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java b/chromium/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
index 8c4ac0fe01b..eb33091cfe1 100644
--- a/chromium/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
+++ b/chromium/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
@@ -56,17 +56,6 @@ public class ApiCompatibilityUtils {
}
/**
- * @see android.view.ViewGroup.MarginLayoutParams#getMarginEnd()
- */
- public static int getMarginEnd(MarginLayoutParams layoutParams) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
- return layoutParams.getMarginEnd();
- } else {
- return layoutParams.rightMargin;
- }
- }
-
- /**
* @see android.view.ViewGroup.MarginLayoutParams#setMarginStart(int)
*/
public static void setMarginStart(MarginLayoutParams layoutParams, int start) {
diff --git a/chromium/base/base.gypi b/chromium/base/base.gypi
index 6d82ee335b9..6dd8bf67eb4 100644
--- a/chromium/base/base.gypi
+++ b/chromium/base/base.gypi
@@ -757,6 +757,13 @@
['include', '^threading/platform_thread_linux\\.cc$'],
],
}],
+ ['OS == "android" and <(android_webview_build)==1', {
+ 'defines': [
+ # WebView builds as part of the system which already has sincos;
+ # avoid defining it again as it causes a linker warning.
+ 'ANDROID_SINCOS_PROVIDED',
+ ],
+ }],
['OS == "ios" and _toolset != "host"', {
'sources/': [
# Pull in specific Mac files for iOS (which have been filtered out
diff --git a/chromium/base/debug/crash_logging.h b/chromium/base/debug/crash_logging.h
index 376d0116553..d6ffa912ee6 100644
--- a/chromium/base/debug/crash_logging.h
+++ b/chromium/base/debug/crash_logging.h
@@ -23,8 +23,7 @@ namespace debug {
class StackTrace;
-// Set or clear a specific key-value pair from the crash metadata. Keys and
-// values are terminated at the null byte.
+// Set or clear a specific key-value pair from the crash metadata.
BASE_EXPORT void SetCrashKeyValue(const base::StringPiece& key,
const base::StringPiece& value);
BASE_EXPORT void ClearCrashKey(const base::StringPiece& key);
@@ -76,8 +75,6 @@ BASE_EXPORT size_t InitCrashKeys(const CrashKey* const keys, size_t count,
// Returns the correspnding crash key object or NULL for a given key.
BASE_EXPORT const CrashKey* LookupCrashKey(const base::StringPiece& key);
-// In the platform crash reporting implementation, these functions set and
-// clear the NUL-termianted key-value pairs.
typedef void (*SetCrashKeyValueFuncT)(const base::StringPiece&,
const base::StringPiece&);
typedef void (*ClearCrashKeyValueFuncT)(const base::StringPiece&);
diff --git a/chromium/base/debug/trace_event_unittest.cc b/chromium/base/debug/trace_event_unittest.cc
index b5909845f27..ea295c05dba 100644
--- a/chromium/base/debug/trace_event_unittest.cc
+++ b/chromium/base/debug/trace_event_unittest.cc
@@ -54,7 +54,7 @@ class TraceEventTestFixture : public testing::Test {
void OnTraceNotification(int notification) {
if (notification & TraceLog::EVENT_WATCH_NOTIFICATION)
++event_watch_notification_;
- notifications_received_ |= notification;
+ notifications_received_ |= notification;
}
DictionaryValue* FindMatchingTraceEntry(const JsonKeyValue* key_values);
DictionaryValue* FindNamePhase(const char* name, const char* phase);
diff --git a/chromium/base/file_util_unittest.cc b/chromium/base/file_util_unittest.cc
index 787b6d50ba7..e523920431f 100644
--- a/chromium/base/file_util_unittest.cc
+++ b/chromium/base/file_util_unittest.cc
@@ -30,7 +30,6 @@
#if defined(OS_WIN)
#include "base/win/scoped_handle.h"
-#include "base/win/windows_version.h"
#endif
// This macro helps avoid wrapped lines in the test structs.
@@ -117,36 +116,6 @@ bool DeleteReparsePoint(HANDLE source) {
}
return true;
}
-
-// Manages a reparse point for a test.
-class ReparsePoint {
- public:
- // Creates a reparse point from |source| (an empty directory) to |target|.
- ReparsePoint(const FilePath& source, const FilePath& target) {
- dir_.Set(
- ::CreateFile(source.value().c_str(),
- FILE_ALL_ACCESS,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- NULL,
- OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory.
- NULL));
- created_ = dir_.IsValid() && SetReparsePoint(dir_, target);
- }
-
- ~ReparsePoint() {
- if (created_)
- DeleteReparsePoint(dir_);
- }
-
- bool IsValid() { return created_; }
-
- private:
- base::win::ScopedHandle dir_;
- bool created_;
- DISALLOW_COPY_AND_ASSIGN(ReparsePoint);
-};
-
#endif
#if defined(OS_POSIX)
@@ -462,61 +431,86 @@ TEST_F(FileUtilTest, NormalizeFilePathReparsePoints) {
FilePath to_sub_a = base_b.Append(FPL("to_sub_a"));
ASSERT_TRUE(file_util::CreateDirectory(to_sub_a));
- FilePath normalized_path;
- {
- ReparsePoint reparse_to_sub_a(to_sub_a, sub_a);
- ASSERT_TRUE(reparse_to_sub_a.IsValid());
-
- FilePath to_base_b = base_b.Append(FPL("to_base_b"));
- ASSERT_TRUE(file_util::CreateDirectory(to_base_b));
- ReparsePoint reparse_to_base_b(to_base_b, base_b);
- ASSERT_TRUE(reparse_to_base_b.IsValid());
-
- FilePath to_sub_long = base_b.Append(FPL("to_sub_long"));
- ASSERT_TRUE(file_util::CreateDirectory(to_sub_long));
- ReparsePoint reparse_to_sub_long(to_sub_long, sub_long);
- ASSERT_TRUE(reparse_to_sub_long.IsValid());
-
- // Normalize a junction free path: base_a\sub_a\file.txt .
- ASSERT_TRUE(file_util::NormalizeFilePath(file_txt, &normalized_path));
- ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
-
- // Check that the path base_b\to_sub_a\file.txt can be normalized to exclude
- // the junction to_sub_a.
- ASSERT_TRUE(file_util::NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
- &normalized_path));
- ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
-
- // Check that the path base_b\to_base_b\to_base_b\to_sub_a\file.txt can be
- // normalized to exclude junctions to_base_b and to_sub_a .
- ASSERT_TRUE(file_util::NormalizeFilePath(base_b.Append(FPL("to_base_b"))
- .Append(FPL("to_base_b"))
- .Append(FPL("to_sub_a"))
- .Append(FPL("file.txt")),
- &normalized_path));
- ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
-
- // A long enough path will cause NormalizeFilePath() to fail. Make a long
- // path using to_base_b many times, and check that paths long enough to fail
- // do not cause a crash.
- FilePath long_path = base_b;
- const int kLengthLimit = MAX_PATH + 200;
- while (long_path.value().length() <= kLengthLimit) {
- long_path = long_path.Append(FPL("to_base_b"));
- }
- long_path = long_path.Append(FPL("to_sub_a"))
- .Append(FPL("file.txt"));
+ base::win::ScopedHandle reparse_to_sub_a(
+ ::CreateFile(to_sub_a.value().c_str(),
+ FILE_ALL_ACCESS,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory.
+ NULL));
+ ASSERT_TRUE(reparse_to_sub_a.IsValid());
+ ASSERT_TRUE(SetReparsePoint(reparse_to_sub_a, sub_a));
- ASSERT_FALSE(file_util::NormalizeFilePath(long_path, &normalized_path));
+ FilePath to_base_b = base_b.Append(FPL("to_base_b"));
+ ASSERT_TRUE(file_util::CreateDirectory(to_base_b));
+ base::win::ScopedHandle reparse_to_base_b(
+ ::CreateFile(to_base_b.value().c_str(),
+ FILE_ALL_ACCESS,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory.
+ NULL));
+ ASSERT_TRUE(reparse_to_base_b.IsValid());
+ ASSERT_TRUE(SetReparsePoint(reparse_to_base_b, base_b));
- // Normalizing the junction to deep.txt should fail, because the expanded
- // path to deep.txt is longer than MAX_PATH.
- ASSERT_FALSE(file_util::NormalizeFilePath(to_sub_long.Append(deep_txt),
- &normalized_path));
+ FilePath to_sub_long = base_b.Append(FPL("to_sub_long"));
+ ASSERT_TRUE(file_util::CreateDirectory(to_sub_long));
+ base::win::ScopedHandle reparse_to_sub_long(
+ ::CreateFile(to_sub_long.value().c_str(),
+ FILE_ALL_ACCESS,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS, // Needed to open a directory.
+ NULL));
+ ASSERT_TRUE(reparse_to_sub_long.IsValid());
+ ASSERT_TRUE(SetReparsePoint(reparse_to_sub_long, sub_long));
- // Delete the reparse points, and see that NormalizeFilePath() fails
- // to traverse them.
+ // Normalize a junction free path: base_a\sub_a\file.txt .
+ FilePath normalized_path;
+ ASSERT_TRUE(file_util::NormalizeFilePath(file_txt, &normalized_path));
+ ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
+
+ // Check that the path base_b\to_sub_a\file.txt can be normalized to exclude
+ // the junction to_sub_a.
+ ASSERT_TRUE(file_util::NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
+ &normalized_path));
+ ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
+
+ // Check that the path base_b\to_base_b\to_base_b\to_sub_a\file.txt can be
+ // normalized to exclude junctions to_base_b and to_sub_a .
+ ASSERT_TRUE(file_util::NormalizeFilePath(base_b.Append(FPL("to_base_b"))
+ .Append(FPL("to_base_b"))
+ .Append(FPL("to_sub_a"))
+ .Append(FPL("file.txt")),
+ &normalized_path));
+ ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
+
+ // A long enough path will cause NormalizeFilePath() to fail. Make a long
+ // path using to_base_b many times, and check that paths long enough to fail
+ // do not cause a crash.
+ FilePath long_path = base_b;
+ const int kLengthLimit = MAX_PATH + 200;
+ while (long_path.value().length() <= kLengthLimit) {
+ long_path = long_path.Append(FPL("to_base_b"));
}
+ long_path = long_path.Append(FPL("to_sub_a"))
+ .Append(FPL("file.txt"));
+
+ ASSERT_FALSE(file_util::NormalizeFilePath(long_path, &normalized_path));
+
+ // Normalizing the junction to deep.txt should fail, because the expanded
+ // path to deep.txt is longer than MAX_PATH.
+ ASSERT_FALSE(file_util::NormalizeFilePath(to_sub_long.Append(deep_txt),
+ &normalized_path));
+
+ // Delete the reparse points, and see that NormalizeFilePath() fails
+ // to traverse them.
+ ASSERT_TRUE(DeleteReparsePoint(reparse_to_sub_a));
+ ASSERT_TRUE(DeleteReparsePoint(reparse_to_base_b));
+ ASSERT_TRUE(DeleteReparsePoint(reparse_to_sub_long));
ASSERT_FALSE(file_util::NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
&normalized_path));
@@ -1827,35 +1821,36 @@ TEST_F(FileUtilTest, DetectDirectoryTest) {
TEST_F(FileUtilTest, FileEnumeratorTest) {
// Test an empty directory.
FileEnumerator f0(temp_dir_.path(), true, FILES_AND_DIRECTORIES);
- EXPECT_EQ(f0.Next().value(), FPL(""));
- EXPECT_EQ(f0.Next().value(), FPL(""));
+ EXPECT_EQ(f0.Next().value(), FILE_PATH_LITERAL(""));
+ EXPECT_EQ(f0.Next().value(), FILE_PATH_LITERAL(""));
// Test an empty directory, non-recursively, including "..".
FileEnumerator f0_dotdot(temp_dir_.path(), false,
FILES_AND_DIRECTORIES | FileEnumerator::INCLUDE_DOT_DOT);
- EXPECT_EQ(temp_dir_.path().Append(FPL("..")).value(),
+ EXPECT_EQ(temp_dir_.path().Append(FILE_PATH_LITERAL("..")).value(),
+ f0_dotdot.Next().value());
+ EXPECT_EQ(FILE_PATH_LITERAL(""),
f0_dotdot.Next().value());
- EXPECT_EQ(FPL(""), f0_dotdot.Next().value());
// create the directories
- FilePath dir1 = temp_dir_.path().Append(FPL("dir1"));
+ FilePath dir1 = temp_dir_.path().Append(FILE_PATH_LITERAL("dir1"));
EXPECT_TRUE(file_util::CreateDirectory(dir1));
- FilePath dir2 = temp_dir_.path().Append(FPL("dir2"));
+ FilePath dir2 = temp_dir_.path().Append(FILE_PATH_LITERAL("dir2"));
EXPECT_TRUE(file_util::CreateDirectory(dir2));
- FilePath dir2inner = dir2.Append(FPL("inner"));
+ FilePath dir2inner = dir2.Append(FILE_PATH_LITERAL("inner"));
EXPECT_TRUE(file_util::CreateDirectory(dir2inner));
// create the files
- FilePath dir2file = dir2.Append(FPL("dir2file.txt"));
+ FilePath dir2file = dir2.Append(FILE_PATH_LITERAL("dir2file.txt"));
CreateTextFile(dir2file, std::wstring());
- FilePath dir2innerfile = dir2inner.Append(FPL("innerfile.txt"));
+ FilePath dir2innerfile = dir2inner.Append(FILE_PATH_LITERAL("innerfile.txt"));
CreateTextFile(dir2innerfile, std::wstring());
- FilePath file1 = temp_dir_.path().Append(FPL("file1.txt"));
+ FilePath file1 = temp_dir_.path().Append(FILE_PATH_LITERAL("file1.txt"));
CreateTextFile(file1, std::wstring());
FilePath file2_rel = dir2.Append(FilePath::kParentDirectory)
- .Append(FPL("file2.txt"));
+ .Append(FILE_PATH_LITERAL("file2.txt"));
CreateTextFile(file2_rel, std::wstring());
- FilePath file2_abs = temp_dir_.path().Append(FPL("file2.txt"));
+ FilePath file2_abs = temp_dir_.path().Append(FILE_PATH_LITERAL("file2.txt"));
// Only enumerate files.
FileEnumerator f1(temp_dir_.path(), true, FileEnumerator::FILES);
@@ -1889,7 +1884,8 @@ TEST_F(FileUtilTest, FileEnumeratorTest) {
FindResultCollector c2_dotdot(f2_dotdot);
EXPECT_TRUE(c2_dotdot.HasFile(dir1));
EXPECT_TRUE(c2_dotdot.HasFile(dir2));
- EXPECT_TRUE(c2_dotdot.HasFile(temp_dir_.path().Append(FPL(".."))));
+ EXPECT_TRUE(c2_dotdot.HasFile(
+ temp_dir_.path().Append(FILE_PATH_LITERAL(".."))));
EXPECT_EQ(c2_dotdot.size(), 3);
// Enumerate files and directories.
@@ -1914,7 +1910,8 @@ TEST_F(FileUtilTest, FileEnumeratorTest) {
EXPECT_EQ(c4.size(), 4);
// Enumerate with a pattern.
- FileEnumerator f5(temp_dir_.path(), true, FILES_AND_DIRECTORIES, FPL("dir*"));
+ FileEnumerator f5(temp_dir_.path(), true, FILES_AND_DIRECTORIES,
+ FILE_PATH_LITERAL("dir*"));
FindResultCollector c5(f5);
EXPECT_TRUE(c5.HasFile(dir1));
EXPECT_TRUE(c5.HasFile(dir2));
@@ -1923,52 +1920,10 @@ TEST_F(FileUtilTest, FileEnumeratorTest) {
EXPECT_TRUE(c5.HasFile(dir2innerfile));
EXPECT_EQ(c5.size(), 5);
-#if defined(OS_WIN)
- {
- // Make dir1 point to dir2.
- ReparsePoint reparse_point(dir1, dir2);
- EXPECT_TRUE(reparse_point.IsValid());
-
- if ((base::win::GetVersion() >= base::win::VERSION_VISTA)) {
- // There can be a delay for the enumeration code to see the change on
- // the file system so skip this test for XP.
- // Enumerate the reparse point.
- FileEnumerator f6(dir1, true, FILES_AND_DIRECTORIES);
- FindResultCollector c6(f6);
- FilePath inner2 = dir1.Append(FPL("inner"));
- EXPECT_TRUE(c6.HasFile(inner2));
- EXPECT_TRUE(c6.HasFile(inner2.Append(FPL("innerfile.txt"))));
- EXPECT_TRUE(c6.HasFile(dir1.Append(FPL("dir2file.txt"))));
- EXPECT_EQ(c6.size(), 3);
- }
-
- // No changes for non recursive operation.
- FileEnumerator f7(temp_dir_.path(), false, FILES_AND_DIRECTORIES);
- FindResultCollector c7(f7);
- EXPECT_TRUE(c7.HasFile(dir2));
- EXPECT_TRUE(c7.HasFile(dir2));
- EXPECT_TRUE(c7.HasFile(file1));
- EXPECT_TRUE(c7.HasFile(file2_abs));
- EXPECT_EQ(c7.size(), 4);
-
- // Should not enumerate inside dir1 when using recursion.
- FileEnumerator f8(temp_dir_.path(), true, FILES_AND_DIRECTORIES);
- FindResultCollector c8(f8);
- EXPECT_TRUE(c8.HasFile(dir1));
- EXPECT_TRUE(c8.HasFile(dir2));
- EXPECT_TRUE(c8.HasFile(file1));
- EXPECT_TRUE(c8.HasFile(file2_abs));
- EXPECT_TRUE(c8.HasFile(dir2file));
- EXPECT_TRUE(c8.HasFile(dir2inner));
- EXPECT_TRUE(c8.HasFile(dir2innerfile));
- EXPECT_EQ(c8.size(), 7);
- }
-#endif
-
// Make sure the destructor closes the find handle while in the middle of a
// query to allow TearDown to delete the directory.
- FileEnumerator f9(temp_dir_.path(), true, FILES_AND_DIRECTORIES);
- EXPECT_FALSE(f9.Next().value().empty()); // Should have found something
+ FileEnumerator f6(temp_dir_.path(), true, FILES_AND_DIRECTORIES);
+ EXPECT_FALSE(f6.Next().value().empty()); // Should have found something
// (we don't care what).
}
diff --git a/chromium/base/files/file_enumerator_win.cc b/chromium/base/files/file_enumerator_win.cc
index e47f5421a71..64c98455ce5 100644
--- a/chromium/base/files/file_enumerator_win.cc
+++ b/chromium/base/files/file_enumerator_win.cc
@@ -133,10 +133,8 @@ FilePath FileEnumerator::Next() {
if (recursive_) {
// If |cur_file| is a directory, and we are doing recursive searching,
// add it to pending_paths_ so we scan it after we finish scanning this
- // directory. However, don't do recursion through reparse points or we
- // may end up with an infinite cycle.
- if (!(find_data_.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))
- pending_paths_.push(cur_file);
+ // directory.
+ pending_paths_.push(cur_file);
}
if (file_type_ & FileEnumerator::DIRECTORIES)
return cur_file;
diff --git a/chromium/base/os_compat_android.cc b/chromium/base/os_compat_android.cc
index 2643dc30e1e..ec221e480dc 100644
--- a/chromium/base/os_compat_android.cc
+++ b/chromium/base/os_compat_android.cc
@@ -75,7 +75,8 @@ time_t timegm(struct tm* const t) {
// for each function would simply end up calling itself, resulting in a
// runtime crash due to stack overflow.
//
-#if defined(__GNUC__) && !defined(__clang__)
+#if defined(__GNUC__) && !defined(__clang__) && \
+ !defined(ANDROID_SINCOS_PROVIDED)
// For the record, Clang does not support the 'optimize' attribute.
// In the unlikely event that it begins performing this optimization too,
diff --git a/chromium/base/posix/file_descriptor_shuffle.h b/chromium/base/posix/file_descriptor_shuffle.h
index 9cd918f2e15..6888c3e5237 100644
--- a/chromium/base/posix/file_descriptor_shuffle.h
+++ b/chromium/base/posix/file_descriptor_shuffle.h
@@ -47,7 +47,7 @@ class InjectionDelegate {
// An implementation of the InjectionDelegate interface using the file
// descriptor table of the current process as the domain.
-class BASE_EXPORT FileDescriptorTableInjection : public InjectionDelegate {
+class FileDescriptorTableInjection : public InjectionDelegate {
virtual bool Duplicate(int* result, int fd) OVERRIDE;
virtual bool Move(int src, int dest) OVERRIDE;
virtual void Close(int fd) OVERRIDE;
diff --git a/chromium/base/synchronization/lock_impl_posix.cc b/chromium/base/synchronization/lock_impl_posix.cc
index 86158767ea9..f638fcd321c 100644
--- a/chromium/base/synchronization/lock_impl_posix.cc
+++ b/chromium/base/synchronization/lock_impl_posix.cc
@@ -5,7 +5,6 @@
#include "base/synchronization/lock_impl.h"
#include <errno.h>
-#include <string.h>
#include "base/logging.h"
@@ -17,13 +16,13 @@ LockImpl::LockImpl() {
// In debug, setup attributes for lock error checking.
pthread_mutexattr_t mta;
int rv = pthread_mutexattr_init(&mta);
- DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+ DCHECK_EQ(rv, 0);
rv = pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_ERRORCHECK);
- DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+ DCHECK_EQ(rv, 0);
rv = pthread_mutex_init(&os_lock_, &mta);
- DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+ DCHECK_EQ(rv, 0);
rv = pthread_mutexattr_destroy(&mta);
- DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+ DCHECK_EQ(rv, 0);
#else
// In release, go with the default lock attributes.
pthread_mutex_init(&os_lock_, NULL);
@@ -32,23 +31,23 @@ LockImpl::LockImpl() {
LockImpl::~LockImpl() {
int rv = pthread_mutex_destroy(&os_lock_);
- DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+ DCHECK_EQ(rv, 0);
}
bool LockImpl::Try() {
int rv = pthread_mutex_trylock(&os_lock_);
- DCHECK(rv == 0 || rv == EBUSY) << ". " << strerror(rv);
+ DCHECK(rv == 0 || rv == EBUSY);
return rv == 0;
}
void LockImpl::Lock() {
int rv = pthread_mutex_lock(&os_lock_);
- DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+ DCHECK_EQ(rv, 0);
}
void LockImpl::Unlock() {
int rv = pthread_mutex_unlock(&os_lock_);
- DCHECK_EQ(rv, 0) << ". " << strerror(rv);
+ DCHECK_EQ(rv, 0);
}
} // namespace internal
diff --git a/chromium/base/time/time_posix.cc b/chromium/base/time/time_posix.cc
index 16eb83c59a9..69e80e10c60 100644
--- a/chromium/base/time/time_posix.cc
+++ b/chromium/base/time/time_posix.cc
@@ -211,9 +211,41 @@ Time Time::FromExploded(bool is_local, const Exploded& exploded) {
timestruct.tm_zone = NULL; // not a POSIX field, so mktime/timegm ignore
#endif
- SysTime seconds = SysTimeFromTimeStruct(&timestruct, is_local);
int64 milliseconds;
+ SysTime seconds;
+
+ // Certain exploded dates do not really exist due to daylight saving times,
+ // and this causes mktime() to return implementation-defined values when
+ // tm_isdst is set to -1. On Android, the function will return -1, while the
+ // C libraries of other platforms typically return a liberally-chosen value.
+ // Handling this requires the special code below.
+
+ // SysTimeFromTimeStruct() modifies the input structure, save current value.
+ struct tm timestruct0 = timestruct;
+
+ seconds = SysTimeFromTimeStruct(&timestruct, is_local);
+ if (seconds == -1) {
+ // Get the time values with tm_isdst == 0 and 1, then select the closest one
+ // to UTC 00:00:00 that isn't -1.
+ timestruct = timestruct0;
+ timestruct.tm_isdst = 0;
+ int64 seconds_isdst0 = SysTimeFromTimeStruct(&timestruct, is_local);
+
+ timestruct = timestruct0;
+ timestruct.tm_isdst = 1;
+ int64 seconds_isdst1 = SysTimeFromTimeStruct(&timestruct, is_local);
+
+ // seconds_isdst0 or seconds_isdst1 can be -1 for some timezones.
+ // E.g. "CLST" (Chile Summer Time) returns -1 for 'tm_isdt == 1'.
+ if (seconds_isdst0 < 0)
+ seconds = seconds_isdst1;
+ else if (seconds_isdst1 < 0)
+ seconds = seconds_isdst0;
+ else
+ seconds = std::min(seconds_isdst0, seconds_isdst1);
+ }
+
// Handle overflow. Clamping the range to what mktime and timegm might
// return is the best that can be done here. It's not ideal, but it's better
// than failing here or ignoring the overflow case and treating each time
@@ -234,14 +266,19 @@ Time Time::FromExploded(bool is_local, const Exploded& exploded) {
// When representing the most distant time in the future, add in an extra
// 999ms to avoid the time being less than any other possible value that
// this function can return.
+
+ // On Android, SysTime is int64, special care must be taken to avoid
+ // overflows.
+ const int64 min_seconds = (sizeof(SysTime) < sizeof(int64))
+ ? std::numeric_limits<SysTime>::min()
+ : std::numeric_limits<int32_t>::min();
+ const int64 max_seconds = (sizeof(SysTime) < sizeof(int64))
+ ? std::numeric_limits<SysTime>::max()
+ : std::numeric_limits<int32_t>::max();
if (exploded.year < 1969) {
- CHECK(sizeof(SysTime) < sizeof(int64)) << "integer overflow";
- milliseconds = std::numeric_limits<SysTime>::min();
- milliseconds *= kMillisecondsPerSecond;
+ milliseconds = min_seconds * kMillisecondsPerSecond;
} else {
- CHECK(sizeof(SysTime) < sizeof(int64)) << "integer overflow";
- milliseconds = std::numeric_limits<SysTime>::max();
- milliseconds *= kMillisecondsPerSecond;
+ milliseconds = max_seconds * kMillisecondsPerSecond;
milliseconds += (kMillisecondsPerSecond - 1);
}
} else {
diff --git a/chromium/base/time/time_unittest.cc b/chromium/base/time/time_unittest.cc
index 7f3fde0c5ee..81a3358f08c 100644
--- a/chromium/base/time/time_unittest.cc
+++ b/chromium/base/time/time_unittest.cc
@@ -7,6 +7,8 @@
#include <time.h>
#include "base/compiler_specific.h"
+#include "base/logging.h"
+#include "base/strings/stringprintf.h"
#include "base/threading/platform_thread.h"
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -541,6 +543,28 @@ TEST_F(TimeTest, TimeTOverflow) {
}
#endif
+#if defined(OS_ANDROID)
+TEST_F(TimeTest, FromLocalExplodedCrashOnAndroid) {
+ // This crashed inside Time:: FromLocalExploded() on Android 4.1.2.
+ // See http://crbug.com/287821
+ Time::Exploded midnight = {2013, // year
+ 10, // month
+ 0, // day_of_week
+ 13, // day_of_month
+ 0, // hour
+ 0, // minute
+ 0, // second
+ };
+ // The string passed to putenv() must be a char* and the documentation states
+ // that it 'becomes part of the environment', so use a static buffer.
+ static char buffer[] = "TZ=America/Santiago";
+ putenv(buffer);
+ tzset();
+ Time t = Time::FromLocalExploded(midnight);
+ EXPECT_EQ(1381633200, t.ToTimeT());
+}
+#endif // OS_ANDROID
+
TEST(TimeTicks, Deltas) {
for (int index = 0; index < 50; index++) {
TimeTicks ticks_start = TimeTicks::Now();
diff --git a/chromium/base/values.cc b/chromium/base/values.cc
index adfb9801398..0c6a44c0d8e 100644
--- a/chromium/base/values.cc
+++ b/chromium/base/values.cc
@@ -752,7 +752,7 @@ bool DictionaryValue::RemoveWithoutPathExpansion(const std::string& key,
return true;
}
-DictionaryValue* DictionaryValue::DeepCopyWithoutEmptyChildren() {
+DictionaryValue* DictionaryValue::DeepCopyWithoutEmptyChildren() const {
Value* copy = CopyWithoutEmptyChildren(this);
return copy ? static_cast<DictionaryValue*>(copy) : new DictionaryValue;
}
diff --git a/chromium/base/values.h b/chromium/base/values.h
index 4025c751eeb..21d72aba714 100644
--- a/chromium/base/values.h
+++ b/chromium/base/values.h
@@ -324,7 +324,7 @@ class BASE_EXPORT DictionaryValue : public Value {
// Makes a copy of |this| but doesn't include empty dictionaries and lists in
// the copy. This never returns NULL, even if |this| itself is empty.
- DictionaryValue* DeepCopyWithoutEmptyChildren();
+ DictionaryValue* DeepCopyWithoutEmptyChildren() const;
// Merge |dictionary| into this dictionary. This is done recursively, i.e. any
// sub-dictionaries will be merged as well. In case of key collisions, the
diff --git a/chromium/base/win/scoped_handle.h b/chromium/base/win/scoped_handle.h
index d236a70beb4..1e1b5b434df 100644
--- a/chromium/base/win/scoped_handle.h
+++ b/chromium/base/win/scoped_handle.h
@@ -197,7 +197,7 @@ class BASE_EXPORT VerifierTraits {
DISALLOW_IMPLICIT_CONSTRUCTORS(VerifierTraits);
};
-typedef GenericScopedHandle<HandleTraits, VerifierTraits> ScopedHandle;
+typedef GenericScopedHandle<HandleTraits, DummyVerifierTraits> ScopedHandle;
} // namespace win
} // namespace base
diff --git a/chromium/build/all.gyp b/chromium/build/all.gyp
index 6c6aee993a1..d90b5a5795c 100644
--- a/chromium/build/all.gyp
+++ b/chromium/build/all.gyp
@@ -342,7 +342,6 @@
'../chrome/chrome.gyp:performance_browser_tests',
'../chrome/chrome.gyp:performance_ui_tests',
'../chrome/chrome.gyp:sync_performance_tests',
- '../tools/perf/clear_system_cache/clear_system_cache.gyp:*',
],
}, # target_name: chromium_builder_perf
{
@@ -515,7 +514,6 @@
'../sync/sync.gyp:sync_unit_tests',
'../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
'../third_party/libphonenumber/libphonenumber.gyp:libphonenumber_unittests',
- '../tools/perf/clear_system_cache/clear_system_cache.gyp:*',
'../ui/ui.gyp:ui_unittests',
'../url/url.gyp:url_unittests',
'../webkit/renderer/compositor_bindings/compositor_bindings_tests.gyp:webkit_compositor_bindings_unittests',
@@ -547,7 +545,6 @@
'../sync/sync.gyp:sync_unit_tests',
'../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
'../third_party/libphonenumber/libphonenumber.gyp:libphonenumber_unittests',
- '../tools/perf/clear_system_cache/clear_system_cache.gyp:*',
'../ui/ui.gyp:ui_unittests',
'../url/url.gyp:url_unittests',
'../webkit/renderer/compositor_bindings/compositor_bindings_tests.gyp:webkit_compositor_bindings_unittests',
@@ -644,7 +641,6 @@
'../sync/sync.gyp:sync_unit_tests',
'../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
'../third_party/libphonenumber/libphonenumber.gyp:libphonenumber_unittests',
- '../tools/perf/clear_system_cache/clear_system_cache.gyp:*',
'../ui/ui.gyp:ui_unittests',
'../ui/views/views.gyp:views_unittests',
'../url/url.gyp:url_unittests',
diff --git a/chromium/build/all_android.gyp b/chromium/build/all_android.gyp
index 2e3711e496e..02965807a97 100644
--- a/chromium/build/all_android.gyp
+++ b/chromium/build/all_android.gyp
@@ -40,8 +40,8 @@
{
# The current list of tests for android. This is temporary
# until the full set supported. If adding a new test here,
- # please also add it to build/android/pylib/gtest/gtest_config.py,
- # else the test is not run.
+ # please also add it to build/android/run_tests.py, else the
+ # test is not run.
#
# WARNING:
# Do not add targets here without communicating the implications
diff --git a/chromium/build/common.gypi b/chromium/build/common.gypi
index 4bb835a0235..16e8a729e5e 100644
--- a/chromium/build/common.gypi
+++ b/chromium/build/common.gypi
@@ -523,7 +523,6 @@
'enable_automation%': 0,
'enable_extensions%': 0,
'enable_google_now%': 0,
- 'enable_printing%': 0,
'enable_spellcheck%': 0,
'enable_themes%': 0,
'proprietary_codecs%': 1,
@@ -534,6 +533,15 @@
'native_memory_pressure_signals%': 1,
}],
+ # Enable basic printing for Chrome for Android but disable printing
+ # completely for WebView.
+ ['OS=="android" and android_webview_build==0', {
+ 'enable_printing%': 2,
+ }],
+ ['OS=="android" and android_webview_build==1', {
+ 'enable_printing%': 0,
+ }],
+
# Enable autofill dialog for Android, Mac and Views-enabled platforms.
['toolkit_views==1 or (OS=="android" and android_webview_build==0) or OS=="mac"', {
'enable_autofill_dialog%': 1
@@ -2822,14 +2830,6 @@
'-Wl,--warn-shared-textrel',
],
}],
- ['OS=="android" and android_webview_build==1', {
- 'ldflags!': [
- # Must not turn on --fatal-warnings or warn-shared-textrel,
- # see crbug.com/157326.
- '-Wl,--fatal-warnings',
- '-Wl,--warn-shared-textrel',
- ],
- }],
['OS=="android" and android_full_debug==0', {
# Some configurations are copied from Release_Base to reduce
# the binary size.
@@ -2903,14 +2903,6 @@
'-Wl,--warn-shared-textrel',
],
}],
- ['OS=="android" and android_webview_build==1', {
- 'ldflags!': [
- # Must not turn on --fatal-warnings or
- # shared-text-rel, see crbug.com/157326.
- '-Wl,--fatal-warnings',
- '-Wl,--warn-shared-textrel',
- ],
- }],
['clang==1', {
'cflags!': [
'-fno-ident',
@@ -3003,6 +2995,7 @@
['chromeos==1 and disable_sse2==0', {
'cflags': [
'-msse2',
+ '-mfpmath=sse',
],
}],
# Use gold linker for Android ia32 target.
@@ -3813,6 +3806,8 @@
'-Wl,--gc-sections',
'-Wl,-O1',
'-Wl,--as-needed',
+ '-Wl,--warn-shared-textrel',
+ '-Wl,--fatal-warnings',
],
}],
# Settings for building host targets on mac.
diff --git a/chromium/build/java.gypi b/chromium/build/java.gypi
index 5318e2a3598..1635c71da40 100644
--- a/chromium/build/java.gypi
+++ b/chromium/build/java.gypi
@@ -70,21 +70,6 @@
'intermediate_dir': '<(SHARED_INTERMEDIATE_DIR)/<(_target_name)',
'classes_dir': '<(intermediate_dir)/classes',
'compile_stamp': '<(intermediate_dir)/compile.stamp',
- 'proguard_config%': '',
- 'proguard_preprocess%': '0',
- 'variables': {
- 'variables': {
- 'proguard_preprocess%': 0,
- },
- 'conditions': [
- ['proguard_preprocess == 1', {
- 'javac_jar_path': '<(intermediate_dir)/<(_target_name).pre.jar'
- }, {
- 'javac_jar_path': '<(PRODUCT_DIR)/lib.java/<(jar_name)'
- }],
- ],
- },
- 'javac_jar_path': '<(javac_jar_path)',
},
# This all_dependent_settings is used for java targets only. This will add the
# jar path to the classpath of dependent java targets.
@@ -233,35 +218,6 @@
},
],
}],
- ['proguard_preprocess == 1', {
- 'actions': [
- {
- 'action_name': 'proguard_<(_target_name)',
- 'message': 'Proguard preprocessing <(_target_name) jar',
- 'inputs': [
- '<(android_sdk_root)/tools/proguard/bin/proguard.sh',
- '<(DEPTH)/build/android/gyp/util/build_utils.py',
- '<(DEPTH)/build/android/gyp/proguard.py',
- '<(javac_jar_path)',
- '<(proguard_config)',
- ],
- 'outputs': [
- '<(jar_path)',
- ],
- 'action': [
- 'python', '<(DEPTH)/build/android/gyp/proguard.py',
- '--proguard-path=<(android_sdk_root)/tools/proguard/bin/proguard.sh',
- '--input-path=<(javac_jar_path)',
- '--output-path=<(jar_path)',
- '--proguard-config=<(proguard_config)',
- '--classpath=<(android_sdk_jar) >(input_jars_paths)',
-
- # TODO(newt): remove this once http://crbug.com/177552 is fixed in ninja.
- '--ignore=>!(echo \'>(_inputs)\' | md5sum)',
- ]
- },
- ],
- }],
],
'actions': [
{
@@ -307,12 +263,12 @@
'<(compile_stamp)',
],
'outputs': [
- '<(javac_jar_path)',
+ '<(jar_path)',
],
'action': [
'python', '<(DEPTH)/build/android/gyp/jar.py',
'--classes-dir=<(classes_dir)',
- '--jar-path=<(javac_jar_path)',
+ '--jar-path=<(jar_path)',
'--excluded-classes=<(jar_excluded_classes)',
# TODO(newt): remove this once http://crbug.com/177552 is fixed in ninja.
diff --git a/chromium/build/java_apk.gypi b/chromium/build/java_apk.gypi
index 0e550a0e1f6..2457d3a1939 100644
--- a/chromium/build/java_apk.gypi
+++ b/chromium/build/java_apk.gypi
@@ -371,11 +371,6 @@
},
],
}],
- ['is_test_apk == 1', {
- 'dependencies': [
- '<(DEPTH)/tools/android/android_tools.gyp:android_tools',
- ]
- }],
],
'actions': [
{
diff --git a/chromium/build/linux/unbundle/openssl.gyp b/chromium/build/linux/unbundle/openssl.gyp
deleted file mode 100644
index d832ba7be4d..00000000000
--- a/chromium/build/linux/unbundle/openssl.gyp
+++ /dev/null
@@ -1,25 +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.
-
-{
- 'targets': [
- {
- 'target_name': 'openssl',
- 'type': 'none',
- 'direct_dependent_settings': {
- 'cflags': [
- '<!@(pkg-config --cflags openssl)',
- ],
- },
- 'link_settings': {
- 'ldflags': [
- '<!@(pkg-config --libs-only-L --libs-only-other openssl)',
- ],
- 'libraries': [
- '<!@(pkg-config --libs-only-l openssl)',
- ],
- },
- }
- ],
-}
diff --git a/chromium/build/linux/unbundle/replace_gyp_files.py b/chromium/build/linux/unbundle/replace_gyp_files.py
index c0fcc49f553..1436711a8b3 100755
--- a/chromium/build/linux/unbundle/replace_gyp_files.py
+++ b/chromium/build/linux/unbundle/replace_gyp_files.py
@@ -30,7 +30,6 @@ REPLACEMENTS = {
'use_system_libwebp': 'third_party/libwebp/libwebp.gyp',
'use_system_libxml': 'third_party/libxml/libxml.gyp',
'use_system_libxslt': 'third_party/libxslt/libxslt.gyp',
- 'use_system_openssl': 'third_party/openssl/openssl.gyp',
'use_system_opus': 'third_party/opus/opus.gyp',
'use_system_re2': 'third_party/re2/re2.gyp',
'use_system_snappy': 'third_party/snappy/snappy.gyp',
diff --git a/chromium/build/shim_headers.gypi b/chromium/build/shim_headers.gypi
index 4291468de10..997a4d0b0f5 100644
--- a/chromium/build/shim_headers.gypi
+++ b/chromium/build/shim_headers.gypi
@@ -17,12 +17,19 @@
'<(shim_headers_path)',
],
'all_dependent_settings': {
+ # Repeating this with different numbers of plusses is unfortunately required
+ # to make sure that even if this include is inside nested conditions/etc, it
+ # still gets inserted at the beginning of the include_dirs list. See
+ # http://crbug.com/263818 for details.
'include_dirs+++': [
'<(shim_headers_path)',
],
'include_dirs++++': [
'<(shim_headers_path)',
],
+ 'include_dirs+++++': [
+ '<(shim_headers_path)',
+ ],
},
'actions': [
{
diff --git a/chromium/build/util/LASTCHANGE b/chromium/build/util/LASTCHANGE
index c0cc8012e1e..6e98c846aae 100644
--- a/chromium/build/util/LASTCHANGE
+++ b/chromium/build/util/LASTCHANGE
@@ -1 +1 @@
-LASTCHANGE=217753
+LASTCHANGE=235169
diff --git a/chromium/build/util/LASTCHANGE.blink b/chromium/build/util/LASTCHANGE.blink
index 94d5ccaa6ee..2b4cc5ae4d6 100644
--- a/chromium/build/util/LASTCHANGE.blink
+++ b/chromium/build/util/LASTCHANGE.blink
@@ -1 +1 @@
-LASTCHANGE=156113
+LASTCHANGE=155942
diff --git a/chromium/cc/cc.gyp b/chromium/cc/cc.gyp
index e6e03c49899..78060a4175c 100644
--- a/chromium/cc/cc.gyp
+++ b/chromium/cc/cc.gyp
@@ -86,10 +86,6 @@
'debug/rendering_stats_instrumentation.cc',
'debug/rendering_stats_instrumentation.h',
'debug/ring_buffer.h',
- 'debug/test_context_provider.cc',
- 'debug/test_context_provider.h',
- 'debug/test_web_graphics_context_3d.cc',
- 'debug/test_web_graphics_context_3d.h',
'debug/traced_picture.cc',
'debug/traced_picture.h',
'debug/traced_value.cc',
diff --git a/chromium/cc/cc_tests.gyp b/chromium/cc/cc_tests.gyp
index 4e4f4382e2c..7e2ff87f574 100644
--- a/chromium/cc/cc_tests.gyp
+++ b/chromium/cc/cc_tests.gyp
@@ -100,6 +100,8 @@
'test/fake_content_layer_client.h',
'test/fake_content_layer_impl.cc',
'test/fake_content_layer_impl.h',
+ 'test/fake_context_provider.cc',
+ 'test/fake_context_provider.h',
'test/fake_delegated_renderer_layer.cc',
'test/fake_delegated_renderer_layer.h',
'test/fake_delegated_renderer_layer_impl.cc',
@@ -172,6 +174,8 @@
'test/skia_common.h',
'test/test_tile_priorities.cc',
'test/test_tile_priorities.h',
+ 'test/test_web_graphics_context_3d.cc',
+ 'test/test_web_graphics_context_3d.h',
'test/tiled_layer_test_common.cc',
'test/tiled_layer_test_common.h',
],
diff --git a/chromium/cc/debug/test_context_provider.cc b/chromium/cc/debug/test_context_provider.cc
deleted file mode 100644
index 4a3a2fcee2f..00000000000
--- a/chromium/cc/debug/test_context_provider.cc
+++ /dev/null
@@ -1,107 +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 "cc/debug/test_context_provider.h"
-
-#include "base/logging.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
-
-namespace cc {
-
-// static
-scoped_refptr<TestContextProvider> TestContextProvider::Create() {
- return Create(TestWebGraphicsContext3D::CreateFactory());
-}
-
-// static
-scoped_refptr<TestContextProvider> TestContextProvider::Create(
- const CreateCallback& create_callback) {
- scoped_refptr<TestContextProvider> provider = new TestContextProvider;
- if (!provider->InitializeOnMainThread(create_callback))
- return NULL;
- return provider;
-}
-
-TestContextProvider::TestContextProvider()
- : bound_(false),
- destroyed_(false) {
- DCHECK(main_thread_checker_.CalledOnValidThread());
- context_thread_checker_.DetachFromThread();
-}
-
-TestContextProvider::~TestContextProvider() {
- DCHECK(main_thread_checker_.CalledOnValidThread() ||
- context_thread_checker_.CalledOnValidThread());
-}
-
-bool TestContextProvider::InitializeOnMainThread(
- const CreateCallback& create_callback) {
- DCHECK(main_thread_checker_.CalledOnValidThread());
-
- DCHECK(!context3d_);
- DCHECK(!create_callback.is_null());
- context3d_ = create_callback.Run();
- return context3d_;
-}
-
-bool TestContextProvider::BindToCurrentThread() {
- DCHECK(context3d_);
-
- // This is called on the thread the context will be used.
- DCHECK(context_thread_checker_.CalledOnValidThread());
-
- if (bound_)
- return true;
-
- bound_ = true;
- if (!context3d_->makeContextCurrent()) {
- base::AutoLock lock(destroyed_lock_);
- destroyed_ = true;
- return false;
- }
- return true;
-}
-
-WebKit::WebGraphicsContext3D* TestContextProvider::Context3d() {
- DCHECK(context3d_);
- DCHECK(bound_);
- DCHECK(context_thread_checker_.CalledOnValidThread());
-
- return context3d_.get();
-}
-
-class GrContext* TestContextProvider::GrContext() {
- DCHECK(context3d_);
- DCHECK(bound_);
- DCHECK(context_thread_checker_.CalledOnValidThread());
-
- // TODO(danakj): Make a test GrContext that works with a test Context3d.
- return NULL;
-}
-
-void TestContextProvider::VerifyContexts() {
- DCHECK(context3d_);
- DCHECK(bound_);
- DCHECK(context_thread_checker_.CalledOnValidThread());
-
- if (context3d_->isContextLost()) {
- base::AutoLock lock(destroyed_lock_);
- destroyed_ = true;
- }
-}
-
-bool TestContextProvider::DestroyedOnMainThread() {
- DCHECK(main_thread_checker_.CalledOnValidThread());
-
- base::AutoLock lock(destroyed_lock_);
- return destroyed_;
-}
-
-void TestContextProvider::SetLostContextCallback(
- const LostContextCallback& cb) {
- DCHECK(context_thread_checker_.CalledOnValidThread());
- NOTIMPLEMENTED();
-}
-
-} // namespace cc
diff --git a/chromium/cc/debug/test_context_provider.h b/chromium/cc/debug/test_context_provider.h
deleted file mode 100644
index 3a95bfbbcb7..00000000000
--- a/chromium/cc/debug/test_context_provider.h
+++ /dev/null
@@ -1,58 +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 CC_DEBUG_TEST_CONTEXT_PROVIDER_H_
-#define CC_DEBUG_TEST_CONTEXT_PROVIDER_H_
-
-#include "base/callback.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/thread_checker.h"
-#include "cc/base/cc_export.h"
-#include "cc/output/context_provider.h"
-
-namespace WebKit { class WebGraphicsContext3D; }
-
-namespace cc {
-class TestWebGraphicsContext3D;
-
-class CC_EXPORT TestContextProvider
- : public NON_EXPORTED_BASE(cc::ContextProvider) {
- public:
- typedef base::Callback<scoped_ptr<TestWebGraphicsContext3D>(void)>
- CreateCallback;
-
- static scoped_refptr<TestContextProvider> Create();
- static scoped_refptr<TestContextProvider> Create(
- const CreateCallback& create_callback);
-
- virtual bool BindToCurrentThread() OVERRIDE;
- virtual WebKit::WebGraphicsContext3D* Context3d() OVERRIDE;
- virtual class GrContext* GrContext() OVERRIDE;
- virtual void VerifyContexts() OVERRIDE;
- virtual bool DestroyedOnMainThread() OVERRIDE;
- virtual void SetLostContextCallback(const LostContextCallback& cb) OVERRIDE;
-
- TestWebGraphicsContext3D* TestContext3d() { return context3d_.get(); }
-
- protected:
- TestContextProvider();
- virtual ~TestContextProvider();
-
- bool InitializeOnMainThread(const CreateCallback& create_callback);
-
- scoped_ptr<TestWebGraphicsContext3D> context3d_;
- bool bound_;
-
- base::ThreadChecker main_thread_checker_;
- base::ThreadChecker context_thread_checker_;
-
- base::Lock destroyed_lock_;
- bool destroyed_;
-};
-
-} // namespace cc
-
-#endif // CC_DEBUG_TEST_CONTEXT_PROVIDER_H_
-
diff --git a/chromium/cc/debug/test_web_graphics_context_3d.cc b/chromium/cc/debug/test_web_graphics_context_3d.cc
deleted file mode 100644
index 229ef636de3..00000000000
--- a/chromium/cc/debug/test_web_graphics_context_3d.cc
+++ /dev/null
@@ -1,654 +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 "cc/debug/test_web_graphics_context_3d.h"
-
-#include <algorithm>
-#include <string>
-
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "third_party/khronos/GLES2/gl2ext.h"
-
-using WebKit::WGC3Dboolean;
-using WebKit::WGC3Dchar;
-using WebKit::WGC3Denum;
-using WebKit::WGC3Dint;
-using WebKit::WGC3Dsizei;
-using WebKit::WGC3Dsizeiptr;
-using WebKit::WGC3Duint;
-using WebKit::WebGLId;
-using WebKit::WebGraphicsContext3D;
-
-namespace cc {
-
-static const WebGLId kFramebufferId = 1;
-static const WebGLId kProgramId = 2;
-static const WebGLId kRenderbufferId = 3;
-static const WebGLId kShaderId = 4;
-
-static unsigned s_context_id = 1;
-
-const WebGLId TestWebGraphicsContext3D::kExternalTextureId = 1337;
-
-static base::LazyInstance<base::Lock>::Leaky
- g_shared_namespace_lock = LAZY_INSTANCE_INITIALIZER;
-
-TestWebGraphicsContext3D::Namespace*
- TestWebGraphicsContext3D::shared_namespace_ = NULL;
-
-TestWebGraphicsContext3D::Namespace::Namespace()
- : next_buffer_id(1),
- next_image_id(1),
- next_texture_id(1) {
-}
-
-TestWebGraphicsContext3D::Namespace::~Namespace() {
- g_shared_namespace_lock.Get().AssertAcquired();
- if (shared_namespace_ == this)
- shared_namespace_ = NULL;
-}
-
-// static
-scoped_ptr<TestWebGraphicsContext3D> TestWebGraphicsContext3D::Create() {
- return make_scoped_ptr(new TestWebGraphicsContext3D());
-}
-
-// static
-base::Callback<scoped_ptr<TestWebGraphicsContext3D>()>
-TestWebGraphicsContext3D::CreateFactory() {
- return base::Bind(&TestWebGraphicsContext3D::Create);
-}
-
-TestWebGraphicsContext3D::TestWebGraphicsContext3D()
- : FakeWebGraphicsContext3D(),
- context_id_(s_context_id++),
- support_swapbuffers_complete_callback_(true),
- have_extension_io_surface_(false),
- have_extension_egl_image_(false),
- times_make_current_succeeds_(-1),
- times_bind_texture_succeeds_(-1),
- times_end_query_succeeds_(-1),
- times_gen_mailbox_succeeds_(-1),
- context_lost_(false),
- times_map_image_chromium_succeeds_(-1),
- times_map_buffer_chromium_succeeds_(-1),
- context_lost_callback_(NULL),
- swap_buffers_callback_(NULL),
- memory_allocation_changed_callback_(NULL),
- max_texture_size_(1024),
- width_(0),
- height_(0),
- bound_buffer_(0),
- weak_ptr_factory_(this) {
- CreateNamespace();
-}
-
-TestWebGraphicsContext3D::TestWebGraphicsContext3D(
- const WebGraphicsContext3D::Attributes& attributes)
- : FakeWebGraphicsContext3D(),
- context_id_(s_context_id++),
- attributes_(attributes),
- support_swapbuffers_complete_callback_(true),
- have_extension_io_surface_(false),
- have_extension_egl_image_(false),
- times_make_current_succeeds_(-1),
- times_bind_texture_succeeds_(-1),
- times_end_query_succeeds_(-1),
- times_gen_mailbox_succeeds_(-1),
- context_lost_(false),
- times_map_image_chromium_succeeds_(-1),
- times_map_buffer_chromium_succeeds_(-1),
- context_lost_callback_(NULL),
- swap_buffers_callback_(NULL),
- memory_allocation_changed_callback_(NULL),
- max_texture_size_(1024),
- width_(0),
- height_(0),
- bound_buffer_(0),
- weak_ptr_factory_(this) {
- CreateNamespace();
-}
-
-void TestWebGraphicsContext3D::CreateNamespace() {
- if (attributes_.shareResources) {
- base::AutoLock lock(g_shared_namespace_lock.Get());
- if (shared_namespace_) {
- namespace_ = shared_namespace_;
- } else {
- namespace_ = new Namespace;
- shared_namespace_ = namespace_.get();
- }
- } else {
- namespace_ = new Namespace;
- }
-}
-
-TestWebGraphicsContext3D::~TestWebGraphicsContext3D() {
- for (size_t i = 0; i < sync_point_callbacks_.size(); ++i) {
- if (sync_point_callbacks_[i] != NULL)
- delete sync_point_callbacks_[i];
- }
- base::AutoLock lock(g_shared_namespace_lock.Get());
- namespace_ = NULL;
-}
-
-bool TestWebGraphicsContext3D::makeContextCurrent() {
- if (times_make_current_succeeds_ >= 0) {
- if (!times_make_current_succeeds_) {
- loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
- GL_INNOCENT_CONTEXT_RESET_ARB);
- }
- --times_make_current_succeeds_;
- }
- return !context_lost_;
-}
-
-int TestWebGraphicsContext3D::width() {
- return width_;
-}
-
-int TestWebGraphicsContext3D::height() {
- return height_;
-}
-
-void TestWebGraphicsContext3D::reshapeWithScaleFactor(
- int width, int height, float scale_factor) {
- width_ = width;
- height_ = height;
-}
-
-bool TestWebGraphicsContext3D::isContextLost() {
- return context_lost_;
-}
-
-WGC3Denum TestWebGraphicsContext3D::getGraphicsResetStatusARB() {
- return context_lost_ ? GL_UNKNOWN_CONTEXT_RESET_ARB : GL_NO_ERROR;
-}
-
-WGC3Denum TestWebGraphicsContext3D::checkFramebufferStatus(
- WGC3Denum target) {
- if (context_lost_)
- return GL_FRAMEBUFFER_UNDEFINED_OES;
- return GL_FRAMEBUFFER_COMPLETE;
-}
-
-WebGraphicsContext3D::Attributes
- TestWebGraphicsContext3D::getContextAttributes() {
- return attributes_;
-}
-
-WebKit::WebString TestWebGraphicsContext3D::getString(WGC3Denum name) {
- std::string string;
-
- if (support_swapbuffers_complete_callback_)
- string += "GL_CHROMIUM_swapbuffers_complete_callback";
-
- if (name == GL_EXTENSIONS) {
- if (have_extension_io_surface_)
- string += " GL_CHROMIUM_iosurface GL_ARB_texture_rectangle";
- if (have_extension_egl_image_)
- string += " GL_OES_EGL_image_external";
- }
-
- return WebKit::WebString::fromUTF8(string.c_str());
-}
-
-WGC3Dint TestWebGraphicsContext3D::getUniformLocation(
- WebGLId program,
- const WGC3Dchar* name) {
- return 0;
-}
-
-WGC3Dsizeiptr TestWebGraphicsContext3D::getVertexAttribOffset(
- WGC3Duint index,
- WGC3Denum pname) {
- return 0;
-}
-
-WGC3Dboolean TestWebGraphicsContext3D::isBuffer(
- WebGLId buffer) {
- return false;
-}
-
-WGC3Dboolean TestWebGraphicsContext3D::isEnabled(
- WGC3Denum cap) {
- return false;
-}
-
-WGC3Dboolean TestWebGraphicsContext3D::isFramebuffer(
- WebGLId framebuffer) {
- return false;
-}
-
-WGC3Dboolean TestWebGraphicsContext3D::isProgram(
- WebGLId program) {
- return false;
-}
-
-WGC3Dboolean TestWebGraphicsContext3D::isRenderbuffer(
- WebGLId renderbuffer) {
- return false;
-}
-
-WGC3Dboolean TestWebGraphicsContext3D::isShader(
- WebGLId shader) {
- return false;
-}
-
-WGC3Dboolean TestWebGraphicsContext3D::isTexture(
- WebGLId texture) {
- return false;
-}
-
-WebGLId TestWebGraphicsContext3D::createBuffer() {
- return NextBufferId();
-}
-
-void TestWebGraphicsContext3D::deleteBuffer(WebGLId id) {
- base::AutoLock lock(namespace_->lock);
- unsigned context_id = id >> 17;
- unsigned buffer_id = id & 0x1ffff;
- DCHECK(buffer_id && buffer_id < namespace_->next_buffer_id);
- DCHECK_EQ(context_id, context_id_);
-}
-
-WebGLId TestWebGraphicsContext3D::createFramebuffer() {
- return kFramebufferId | context_id_ << 16;
-}
-
-void TestWebGraphicsContext3D::deleteFramebuffer(WebGLId id) {
- DCHECK_EQ(kFramebufferId | context_id_ << 16, id);
-}
-
-WebGLId TestWebGraphicsContext3D::createProgram() {
- return kProgramId | context_id_ << 16;
-}
-
-void TestWebGraphicsContext3D::deleteProgram(WebGLId id) {
- DCHECK_EQ(kProgramId | context_id_ << 16, id);
-}
-
-WebGLId TestWebGraphicsContext3D::createRenderbuffer() {
- return kRenderbufferId | context_id_ << 16;
-}
-
-void TestWebGraphicsContext3D::deleteRenderbuffer(WebGLId id) {
- DCHECK_EQ(kRenderbufferId | context_id_ << 16, id);
-}
-
-WebGLId TestWebGraphicsContext3D::createShader(WGC3Denum) {
- return kShaderId | context_id_ << 16;
-}
-
-void TestWebGraphicsContext3D::deleteShader(WebGLId id) {
- DCHECK_EQ(kShaderId | context_id_ << 16, id);
-}
-
-WebGLId TestWebGraphicsContext3D::createTexture() {
- WebGLId texture_id = NextTextureId();
- DCHECK_NE(texture_id, kExternalTextureId);
- base::AutoLock lock(namespace_->lock);
- namespace_->textures.push_back(texture_id);
- return texture_id;
-}
-
-void TestWebGraphicsContext3D::deleteTexture(WebGLId texture_id) {
- base::AutoLock lock(namespace_->lock);
- std::vector<WebKit::WebGLId>& textures = namespace_->textures;
- DCHECK(std::find(textures.begin(), textures.end(), texture_id) !=
- textures.end());
- textures.erase(std::find(textures.begin(), textures.end(), texture_id));
-}
-
-void TestWebGraphicsContext3D::attachShader(WebGLId program, WebGLId shader) {
- DCHECK_EQ(kProgramId | context_id_ << 16, program);
- DCHECK_EQ(kShaderId | context_id_ << 16, shader);
-}
-
-void TestWebGraphicsContext3D::useProgram(WebGLId program) {
- if (!program)
- return;
- DCHECK_EQ(kProgramId | context_id_ << 16, program);
-}
-
-void TestWebGraphicsContext3D::bindFramebuffer(
- WGC3Denum target, WebGLId framebuffer) {
- if (!framebuffer)
- return;
- DCHECK_EQ(kFramebufferId | context_id_ << 16, framebuffer);
-}
-
-void TestWebGraphicsContext3D::bindRenderbuffer(
- WGC3Denum target, WebGLId renderbuffer) {
- if (!renderbuffer)
- return;
- DCHECK_EQ(kRenderbufferId | context_id_ << 16, renderbuffer);
-}
-
-void TestWebGraphicsContext3D::bindTexture(
- WGC3Denum target, WebGLId texture_id) {
- if (times_bind_texture_succeeds_ >= 0) {
- if (!times_bind_texture_succeeds_) {
- loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
- GL_INNOCENT_CONTEXT_RESET_ARB);
- }
- --times_bind_texture_succeeds_;
- }
-
- if (!texture_id)
- return;
- if (texture_id == kExternalTextureId)
- return;
- base::AutoLock lock(namespace_->lock);
- std::vector<WebKit::WebGLId>& textures = namespace_->textures;
- DCHECK(std::find(textures.begin(), textures.end(), texture_id) !=
- textures.end());
- used_textures_.insert(texture_id);
-}
-
-void TestWebGraphicsContext3D::endQueryEXT(WGC3Denum target) {
- if (times_end_query_succeeds_ >= 0) {
- if (!times_end_query_succeeds_) {
- loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
- GL_INNOCENT_CONTEXT_RESET_ARB);
- }
- --times_end_query_succeeds_;
- }
-}
-
-void TestWebGraphicsContext3D::getQueryObjectuivEXT(
- WebGLId query,
- WGC3Denum pname,
- WGC3Duint* params) {
- // If the context is lost, behave as if result is available.
- if (pname == GL_QUERY_RESULT_AVAILABLE_EXT)
- *params = 1;
-}
-
-void TestWebGraphicsContext3D::getIntegerv(
- WGC3Denum pname,
- WebKit::WGC3Dint* value) {
- if (pname == GL_MAX_TEXTURE_SIZE)
- *value = max_texture_size_;
- else if (pname == GL_ACTIVE_TEXTURE)
- *value = GL_TEXTURE0;
-}
-
-void TestWebGraphicsContext3D::genMailboxCHROMIUM(WebKit::WGC3Dbyte* mailbox) {
- if (times_gen_mailbox_succeeds_ >= 0) {
- if (!times_gen_mailbox_succeeds_) {
- loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
- GL_INNOCENT_CONTEXT_RESET_ARB);
- }
- --times_gen_mailbox_succeeds_;
- }
- if (context_lost_) {
- memset(mailbox, 0, 64);
- return;
- }
-
- static char mailbox_name1 = '1';
- static char mailbox_name2 = '1';
- mailbox[0] = mailbox_name1;
- mailbox[1] = mailbox_name2;
- mailbox[2] = '\0';
- if (++mailbox_name1 == 0) {
- mailbox_name1 = '1';
- ++mailbox_name2;
- }
-}
-
-void TestWebGraphicsContext3D::setContextLostCallback(
- WebGraphicsContextLostCallback* callback) {
- context_lost_callback_ = callback;
-}
-
-void TestWebGraphicsContext3D::loseContextCHROMIUM(WGC3Denum current,
- WGC3Denum other) {
- if (context_lost_)
- return;
- context_lost_ = true;
- if (context_lost_callback_)
- context_lost_callback_->onContextLost();
-
- for (size_t i = 0; i < shared_contexts_.size(); ++i)
- shared_contexts_[i]->loseContextCHROMIUM(current, other);
- shared_contexts_.clear();
-}
-
-void TestWebGraphicsContext3D::signalSyncPoint(
- unsigned sync_point,
- WebGraphicsSyncPointCallback* callback) {
- sync_point_callbacks_.push_back(callback);
-}
-
-void TestWebGraphicsContext3D::signalQuery(
- WebKit::WebGLId query,
- WebGraphicsSyncPointCallback* callback) {
- sync_point_callbacks_.push_back(callback);
-}
-
-void TestWebGraphicsContext3D::setSwapBuffersCompleteCallbackCHROMIUM(
- WebGraphicsSwapBuffersCompleteCallbackCHROMIUM* callback) {
- if (support_swapbuffers_complete_callback_)
- swap_buffers_callback_ = callback;
-}
-
-void TestWebGraphicsContext3D::setMemoryAllocationChangedCallbackCHROMIUM(
- WebGraphicsMemoryAllocationChangedCallbackCHROMIUM* callback) {
- memory_allocation_changed_callback_ = callback;
-}
-
-void TestWebGraphicsContext3D::prepareTexture() {
- if (swap_buffers_callback_) {
- base::MessageLoop::current()->PostTask(
- FROM_HERE, base::Bind(&TestWebGraphicsContext3D::SwapBuffersComplete,
- weak_ptr_factory_.GetWeakPtr()));
- }
- CallAllSyncPointCallbacks();
-}
-
-void TestWebGraphicsContext3D::finish() {
- CallAllSyncPointCallbacks();
-}
-
-void TestWebGraphicsContext3D::flush() {
- CallAllSyncPointCallbacks();
-}
-
-static void CallAndDestroy(
- WebKit::WebGraphicsContext3D::WebGraphicsSyncPointCallback* callback) {
- if (!callback)
- return;
- callback->onSyncPointReached();
- delete callback;
-}
-
-void TestWebGraphicsContext3D::CallAllSyncPointCallbacks() {
- for (size_t i = 0; i < sync_point_callbacks_.size(); ++i) {
- base::MessageLoop::current()->PostTask(
- FROM_HERE,
- base::Bind(&CallAndDestroy,
- sync_point_callbacks_[i]));
- }
- sync_point_callbacks_.clear();
-}
-
-void TestWebGraphicsContext3D::SwapBuffersComplete() {
- if (swap_buffers_callback_)
- swap_buffers_callback_->onSwapBuffersComplete();
-}
-
-void TestWebGraphicsContext3D::bindBuffer(WebKit::WGC3Denum target,
- WebKit::WebGLId buffer) {
- bound_buffer_ = buffer;
- if (!bound_buffer_)
- return;
- unsigned context_id = buffer >> 17;
- unsigned buffer_id = buffer & 0x1ffff;
- base::AutoLock lock(namespace_->lock);
- DCHECK(buffer_id && buffer_id < namespace_->next_buffer_id);
- DCHECK_EQ(context_id, context_id_);
-
- ScopedPtrHashMap<unsigned, Buffer>& buffers = namespace_->buffers;
- if (buffers.count(bound_buffer_) == 0)
- buffers.set(bound_buffer_, make_scoped_ptr(new Buffer).Pass());
-
- buffers.get(bound_buffer_)->target = target;
-}
-
-void TestWebGraphicsContext3D::bufferData(WebKit::WGC3Denum target,
- WebKit::WGC3Dsizeiptr size,
- const void* data,
- WebKit::WGC3Denum usage) {
- base::AutoLock lock(namespace_->lock);
- ScopedPtrHashMap<unsigned, Buffer>& buffers = namespace_->buffers;
- DCHECK_GT(buffers.count(bound_buffer_), 0u);
- DCHECK_EQ(target, buffers.get(bound_buffer_)->target);
- if (context_lost_) {
- buffers.get(bound_buffer_)->pixels.reset();
- return;
- }
- buffers.get(bound_buffer_)->pixels.reset(new uint8[size]);
- if (data != NULL)
- memcpy(buffers.get(bound_buffer_)->pixels.get(), data, size);
-}
-
-void* TestWebGraphicsContext3D::mapBufferCHROMIUM(WebKit::WGC3Denum target,
- WebKit::WGC3Denum access) {
- base::AutoLock lock(namespace_->lock);
- ScopedPtrHashMap<unsigned, Buffer>& buffers = namespace_->buffers;
- DCHECK_GT(buffers.count(bound_buffer_), 0u);
- DCHECK_EQ(target, buffers.get(bound_buffer_)->target);
- if (times_map_buffer_chromium_succeeds_ >= 0) {
- if (!times_map_buffer_chromium_succeeds_) {
- return NULL;
- }
- --times_map_buffer_chromium_succeeds_;
- }
- return buffers.get(bound_buffer_)->pixels.get();
-}
-
-WebKit::WGC3Dboolean TestWebGraphicsContext3D::unmapBufferCHROMIUM(
- WebKit::WGC3Denum target) {
- base::AutoLock lock(namespace_->lock);
- ScopedPtrHashMap<unsigned, Buffer>& buffers = namespace_->buffers;
- DCHECK_GT(buffers.count(bound_buffer_), 0u);
- DCHECK_EQ(target, buffers.get(bound_buffer_)->target);
- buffers.get(bound_buffer_)->pixels.reset();
- return true;
-}
-
-void TestWebGraphicsContext3D::bindTexImage2DCHROMIUM(
- WebKit::WGC3Denum target,
- WebKit::WGC3Dint image_id) {
- base::AutoLock lock(namespace_->lock);
- DCHECK_GT(namespace_->images.count(image_id), 0u);
-}
-
-WebKit::WGC3Duint TestWebGraphicsContext3D::createImageCHROMIUM(
- WebKit::WGC3Dsizei width, WebKit::WGC3Dsizei height,
- WebKit::WGC3Denum internalformat) {
- DCHECK_EQ(GL_RGBA8_OES, static_cast<int>(internalformat));
- WebKit::WGC3Duint image_id = NextImageId();
- base::AutoLock lock(namespace_->lock);
- ScopedPtrHashMap<unsigned, Image>& images = namespace_->images;
- images.set(image_id, make_scoped_ptr(new Image).Pass());
- images.get(image_id)->pixels.reset(new uint8[width * height * 4]);
- return image_id;
-}
-
-void TestWebGraphicsContext3D::destroyImageCHROMIUM(
- WebKit::WGC3Duint id) {
- base::AutoLock lock(namespace_->lock);
- unsigned context_id = id >> 17;
- unsigned image_id = id & 0x1ffff;
- DCHECK(image_id && image_id < namespace_->next_image_id);
- DCHECK_EQ(context_id, context_id_);
-}
-
-void TestWebGraphicsContext3D::getImageParameterivCHROMIUM(
- WebKit::WGC3Duint image_id,
- WebKit::WGC3Denum pname,
- WebKit::WGC3Dint* params) {
- base::AutoLock lock(namespace_->lock);
- DCHECK_GT(namespace_->images.count(image_id), 0u);
- DCHECK_EQ(GL_IMAGE_ROWBYTES_CHROMIUM, static_cast<int>(pname));
- *params = 0;
-}
-
-void* TestWebGraphicsContext3D::mapImageCHROMIUM(WebKit::WGC3Duint image_id,
- WebKit::WGC3Denum access) {
- base::AutoLock lock(namespace_->lock);
- ScopedPtrHashMap<unsigned, Image>& images = namespace_->images;
- DCHECK_GT(images.count(image_id), 0u);
- if (times_map_image_chromium_succeeds_ >= 0) {
- if (!times_map_image_chromium_succeeds_) {
- return NULL;
- }
- --times_map_image_chromium_succeeds_;
- }
- return images.get(image_id)->pixels.get();
-}
-
-void TestWebGraphicsContext3D::unmapImageCHROMIUM(
- WebKit::WGC3Duint image_id) {
- base::AutoLock lock(namespace_->lock);
- DCHECK_GT(namespace_->images.count(image_id), 0u);
-}
-
-size_t TestWebGraphicsContext3D::NumTextures() const {
- base::AutoLock lock(namespace_->lock);
- return namespace_->textures.size();
-}
-
-WebKit::WebGLId TestWebGraphicsContext3D::TextureAt(int i) const {
- base::AutoLock lock(namespace_->lock);
- return namespace_->textures[i];
-}
-
-WebGLId TestWebGraphicsContext3D::NextTextureId() {
- base::AutoLock lock(namespace_->lock);
- WebGLId texture_id = namespace_->next_texture_id++;
- DCHECK(texture_id < (1 << 16));
- texture_id |= context_id_ << 16;
- return texture_id;
-}
-
-WebGLId TestWebGraphicsContext3D::NextBufferId() {
- base::AutoLock lock(namespace_->lock);
- WebGLId buffer_id = namespace_->next_buffer_id++;
- DCHECK(buffer_id < (1 << 17));
- buffer_id |= context_id_ << 17;
- return buffer_id;
-}
-
-WebKit::WGC3Duint TestWebGraphicsContext3D::NextImageId() {
- base::AutoLock lock(namespace_->lock);
- WGC3Duint image_id = namespace_->next_image_id++;
- DCHECK(image_id < (1 << 17));
- image_id |= context_id_ << 17;
- return image_id;
-}
-
-void TestWebGraphicsContext3D::SetMemoryAllocation(
- WebKit::WebGraphicsMemoryAllocation allocation) {
- if (!memory_allocation_changed_callback_)
- return;
- memory_allocation_changed_callback_->onMemoryAllocationChanged(allocation);
-}
-
-TestWebGraphicsContext3D::Buffer::Buffer() : target(0) {}
-
-TestWebGraphicsContext3D::Buffer::~Buffer() {}
-
-TestWebGraphicsContext3D::Image::Image() {}
-
-TestWebGraphicsContext3D::Image::~Image() {}
-
-} // namespace cc
diff --git a/chromium/cc/debug/test_web_graphics_context_3d.h b/chromium/cc/debug/test_web_graphics_context_3d.h
deleted file mode 100644
index e66a16552be..00000000000
--- a/chromium/cc/debug/test_web_graphics_context_3d.h
+++ /dev/null
@@ -1,293 +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 CC_DEBUG_TEST_WEB_GRAPHICS_CONTEXT_3D_H_
-#define CC_DEBUG_TEST_WEB_GRAPHICS_CONTEXT_3D_H_
-
-#include <vector>
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/containers/hash_tables.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/stl_util.h"
-#include "base/synchronization/lock.h"
-#include "cc/base/cc_export.h"
-#include "cc/base/scoped_ptr_hash_map.h"
-#include "cc/debug/fake_web_graphics_context_3d.h"
-#include "third_party/khronos/GLES2/gl2.h"
-
-namespace WebKit { struct WebGraphicsMemoryAllocation; }
-
-namespace cc {
-
-class CC_EXPORT TestWebGraphicsContext3D : public FakeWebGraphicsContext3D {
- public:
- static scoped_ptr<TestWebGraphicsContext3D> Create();
- static base::Callback<
- scoped_ptr<TestWebGraphicsContext3D>()> CreateFactory();
-
- virtual ~TestWebGraphicsContext3D();
-
- virtual bool makeContextCurrent();
-
- virtual int width();
- virtual int height();
-
- virtual void reshapeWithScaleFactor(
- int width, int height, float scale_factor);
-
- virtual bool isContextLost();
- virtual WebKit::WGC3Denum getGraphicsResetStatusARB();
-
- virtual void attachShader(WebKit::WebGLId program, WebKit::WebGLId shader);
- virtual void bindFramebuffer(
- WebKit::WGC3Denum target, WebKit::WebGLId framebuffer);
- virtual void bindRenderbuffer(
- WebKit::WGC3Denum target, WebKit::WebGLId renderbuffer);
- virtual void bindTexture(
- WebKit::WGC3Denum target,
- WebKit::WebGLId texture_id);
-
- virtual WebKit::WGC3Denum checkFramebufferStatus(WebKit::WGC3Denum target);
-
- virtual Attributes getContextAttributes();
-
- virtual WebKit::WebString getString(WebKit::WGC3Denum name);
- virtual WebKit::WGC3Dint getUniformLocation(
- WebKit::WebGLId program,
- const WebKit::WGC3Dchar* name);
- virtual WebKit::WGC3Dsizeiptr getVertexAttribOffset(
- WebKit::WGC3Duint index,
- WebKit::WGC3Denum pname);
-
- virtual WebKit::WGC3Dboolean isBuffer(WebKit::WebGLId buffer);
- virtual WebKit::WGC3Dboolean isEnabled(WebKit::WGC3Denum cap);
- virtual WebKit::WGC3Dboolean isFramebuffer(WebKit::WebGLId framebuffer);
- virtual WebKit::WGC3Dboolean isProgram(WebKit::WebGLId program);
- virtual WebKit::WGC3Dboolean isRenderbuffer(WebKit::WebGLId renderbuffer);
- virtual WebKit::WGC3Dboolean isShader(WebKit::WebGLId shader);
- virtual WebKit::WGC3Dboolean isTexture(WebKit::WebGLId texture);
-
- virtual void useProgram(WebKit::WebGLId program);
-
- virtual WebKit::WebGLId createBuffer();
- virtual WebKit::WebGLId createFramebuffer();
- virtual WebKit::WebGLId createProgram();
- virtual WebKit::WebGLId createRenderbuffer();
- virtual WebKit::WebGLId createShader(WebKit::WGC3Denum);
- virtual WebKit::WebGLId createTexture();
-
- virtual void deleteBuffer(WebKit::WebGLId id);
- virtual void deleteFramebuffer(WebKit::WebGLId id);
- virtual void deleteProgram(WebKit::WebGLId id);
- virtual void deleteRenderbuffer(WebKit::WebGLId id);
- virtual void deleteShader(WebKit::WebGLId id);
- virtual void deleteTexture(WebKit::WebGLId texture_id);
-
- virtual void endQueryEXT(WebKit::WGC3Denum target);
- virtual void getQueryObjectuivEXT(
- WebKit::WebGLId query,
- WebKit::WGC3Denum pname,
- WebKit::WGC3Duint* params);
-
- virtual void getIntegerv(
- WebKit::WGC3Denum pname,
- WebKit::WGC3Dint* value);
-
- virtual void genMailboxCHROMIUM(WebKit::WGC3Dbyte* mailbox);
- virtual void produceTextureCHROMIUM(WebKit::WGC3Denum target,
- const WebKit::WGC3Dbyte* mailbox) { }
- virtual void consumeTextureCHROMIUM(WebKit::WGC3Denum target,
- const WebKit::WGC3Dbyte* mailbox) { }
-
- virtual void setContextLostCallback(
- WebGraphicsContextLostCallback* callback);
-
- virtual void loseContextCHROMIUM(WebKit::WGC3Denum current,
- WebKit::WGC3Denum other);
-
- // Takes ownership of the |callback|.
- virtual void signalSyncPoint(unsigned sync_point,
- WebGraphicsSyncPointCallback* callback);
- virtual void signalQuery(WebKit::WebGLId query,
- WebGraphicsSyncPointCallback* callback);
-
- virtual void setSwapBuffersCompleteCallbackCHROMIUM(
- WebGraphicsSwapBuffersCompleteCallbackCHROMIUM* callback);
-
- virtual void setMemoryAllocationChangedCallbackCHROMIUM(
- WebGraphicsMemoryAllocationChangedCallbackCHROMIUM* callback);
-
- virtual void prepareTexture();
- virtual void finish();
- virtual void flush();
-
- virtual void bindBuffer(WebKit::WGC3Denum target, WebKit::WebGLId buffer);
- virtual void bufferData(WebKit::WGC3Denum target,
- WebKit::WGC3Dsizeiptr size,
- const void* data,
- WebKit::WGC3Denum usage);
- virtual void* mapBufferCHROMIUM(WebKit::WGC3Denum target,
- WebKit::WGC3Denum access);
- virtual WebKit::WGC3Dboolean unmapBufferCHROMIUM(WebKit::WGC3Denum target);
-
- virtual void bindTexImage2DCHROMIUM(WebKit::WGC3Denum target,
- WebKit::WGC3Dint image_id);
- virtual WebKit::WGC3Duint createImageCHROMIUM(
- WebKit::WGC3Dsizei width,
- WebKit::WGC3Dsizei height,
- WebKit::WGC3Denum internalformat);
- virtual void destroyImageCHROMIUM(WebKit::WGC3Duint image_id);
- virtual void getImageParameterivCHROMIUM(
- WebKit::WGC3Duint image_id,
- WebKit::WGC3Denum pname,
- WebKit::WGC3Dint* params);
- virtual void* mapImageCHROMIUM(
- WebKit::WGC3Duint image_id,
- WebKit::WGC3Denum access);
- virtual void unmapImageCHROMIUM(WebKit::WGC3Duint image_id);
-
- // When set, MakeCurrent() will fail after this many times.
- void set_times_make_current_succeeds(int times) {
- times_make_current_succeeds_ = times;
- }
- void set_times_bind_texture_succeeds(int times) {
- times_bind_texture_succeeds_ = times;
- }
- void set_times_end_query_succeeds(int times) {
- times_end_query_succeeds_ = times;
- }
- void set_times_gen_mailbox_succeeds(int times) {
- times_gen_mailbox_succeeds_ = times;
- }
-
- // When set, mapImageCHROMIUM and mapBufferCHROMIUM will return NULL after
- // this many times.
- void set_times_map_image_chromium_succeeds(int times) {
- times_map_image_chromium_succeeds_ = times;
- }
- void set_times_map_buffer_chromium_succeeds(int times) {
- times_map_buffer_chromium_succeeds_ = times;
- }
-
- size_t NumTextures() const;
- WebKit::WebGLId TextureAt(int i) const;
-
- size_t NumUsedTextures() const { return used_textures_.size(); }
- bool UsedTexture(int texture) const {
- return ContainsKey(used_textures_, texture);
- }
- void ResetUsedTextures() { used_textures_.clear(); }
-
- void set_support_swapbuffers_complete_callback(bool support) {
- support_swapbuffers_complete_callback_ = support;
- }
- void set_have_extension_io_surface(bool have) {
- have_extension_io_surface_ = have;
- }
- void set_have_extension_egl_image(bool have) {
- have_extension_egl_image_ = have;
- }
-
- // When this context is lost, all contexts in its share group are also lost.
- void add_share_group_context(WebKit::WebGraphicsContext3D* context3d) {
- shared_contexts_.push_back(context3d);
- }
-
- void set_max_texture_size(int size) { max_texture_size_ = size; }
-
- static const WebKit::WebGLId kExternalTextureId;
- virtual WebKit::WebGLId NextTextureId();
-
- virtual WebKit::WebGLId NextBufferId();
-
- virtual WebKit::WebGLId NextImageId();
-
- void SetMemoryAllocation(WebKit::WebGraphicsMemoryAllocation allocation);
-
- protected:
- struct Buffer {
- Buffer();
- ~Buffer();
-
- WebKit::WGC3Denum target;
- scoped_ptr<uint8[]> pixels;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(Buffer);
- };
-
- struct Image {
- Image();
- ~Image();
-
- scoped_ptr<uint8[]> pixels;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(Image);
- };
-
- struct Namespace : public base::RefCountedThreadSafe<Namespace> {
- Namespace();
-
- // Protects all fields.
- base::Lock lock;
- unsigned next_buffer_id;
- unsigned next_image_id;
- unsigned next_texture_id;
- std::vector<WebKit::WebGLId> textures;
- ScopedPtrHashMap<unsigned, Buffer> buffers;
- ScopedPtrHashMap<unsigned, Image> images;
-
- private:
- friend class base::RefCountedThreadSafe<Namespace>;
- ~Namespace();
- DISALLOW_COPY_AND_ASSIGN(Namespace);
- };
-
- TestWebGraphicsContext3D();
- TestWebGraphicsContext3D(
- const WebKit::WebGraphicsContext3D::Attributes& attributes);
-
- void CallAllSyncPointCallbacks();
- void SwapBuffersComplete();
- void CreateNamespace();
-
- unsigned context_id_;
- Attributes attributes_;
- bool support_swapbuffers_complete_callback_;
- bool have_extension_io_surface_;
- bool have_extension_egl_image_;
- int times_make_current_succeeds_;
- int times_bind_texture_succeeds_;
- int times_end_query_succeeds_;
- int times_gen_mailbox_succeeds_;
- bool context_lost_;
- int times_map_image_chromium_succeeds_;
- int times_map_buffer_chromium_succeeds_;
- WebGraphicsContextLostCallback* context_lost_callback_;
- WebGraphicsSwapBuffersCompleteCallbackCHROMIUM* swap_buffers_callback_;
- WebGraphicsMemoryAllocationChangedCallbackCHROMIUM*
- memory_allocation_changed_callback_;
- std::vector<WebGraphicsSyncPointCallback*> sync_point_callbacks_;
- base::hash_set<WebKit::WebGLId> used_textures_;
- std::vector<WebKit::WebGraphicsContext3D*> shared_contexts_;
- int max_texture_size_;
- int width_;
- int height_;
-
- unsigned bound_buffer_;
-
- scoped_refptr<Namespace> namespace_;
- static Namespace* shared_namespace_;
-
- base::WeakPtrFactory<TestWebGraphicsContext3D> weak_ptr_factory_;
-};
-
-} // namespace cc
-
-#endif // CC_DEBUG_TEST_WEB_GRAPHICS_CONTEXT_3D_H_
diff --git a/chromium/cc/layers/delegated_renderer_layer_impl_unittest.cc b/chromium/cc/layers/delegated_renderer_layer_impl_unittest.cc
index 2537c53053b..1584782f109 100644
--- a/chromium/cc/layers/delegated_renderer_layer_impl_unittest.cc
+++ b/chromium/cc/layers/delegated_renderer_layer_impl_unittest.cc
@@ -5,7 +5,6 @@
#include "cc/layers/delegated_renderer_layer_impl.h"
#include "cc/base/scoped_ptr_vector.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
#include "cc/layers/append_quads_data.h"
#include "cc/layers/quad_sink.h"
#include "cc/layers/solid_color_layer_impl.h"
@@ -21,6 +20,7 @@
#include "cc/test/mock_quad_culler.h"
#include "cc/test/render_pass_test_common.h"
#include "cc/test/render_pass_test_utils.h"
+#include "cc/test/test_web_graphics_context_3d.h"
#include "cc/trees/layer_tree_host_impl.h"
#include "cc/trees/layer_tree_impl.h"
#include "cc/trees/single_thread_proxy.h"
diff --git a/chromium/cc/layers/picture_layer_impl.cc b/chromium/cc/layers/picture_layer_impl.cc
index 4f6052f04fa..2f1878bc3a6 100644
--- a/chromium/cc/layers/picture_layer_impl.cc
+++ b/chromium/cc/layers/picture_layer_impl.cc
@@ -617,24 +617,27 @@ void PictureLayerImpl::SetIsMask(bool is_mask) {
ResourceProvider::ResourceId PictureLayerImpl::ContentsResourceId() const {
gfx::Rect content_rect(content_bounds());
float scale = contents_scale_x();
- PictureLayerTilingSet::CoverageIterator iter(
- tilings_.get(), scale, content_rect, ideal_contents_scale_);
-
- // Mask resource not ready yet.
- if (!iter || !*iter)
- return 0;
+ for (PictureLayerTilingSet::CoverageIterator
+ iter(tilings_.get(), scale, content_rect, ideal_contents_scale_);
+ iter;
+ ++iter) {
+ // Mask resource not ready yet.
+ if (!*iter)
+ return 0;
- // Masks only supported if they fit on exactly one tile.
- if (iter.geometry_rect() != content_rect)
- return 0;
+ const ManagedTileState::TileVersion& tile_version =
+ iter->GetTileVersionForDrawing();
+ if (!tile_version.IsReadyToDraw() ||
+ tile_version.mode() != ManagedTileState::TileVersion::RESOURCE_MODE)
+ return 0;
- const ManagedTileState::TileVersion& tile_version =
- iter->GetTileVersionForDrawing();
- if (!tile_version.IsReadyToDraw() ||
- tile_version.mode() != ManagedTileState::TileVersion::RESOURCE_MODE)
- return 0;
+ // Masks only supported if they fit on exactly one tile.
+ if (iter.geometry_rect() != content_rect)
+ return 0;
- return tile_version.get_resource_id();
+ return tile_version.get_resource_id();
+ }
+ return 0;
}
void PictureLayerImpl::MarkVisibleResourcesAsRequired() const {
diff --git a/chromium/cc/layers/scrollbar_layer.cc b/chromium/cc/layers/scrollbar_layer.cc
index a2fdd58ee36..95eb6384732 100644
--- a/chromium/cc/layers/scrollbar_layer.cc
+++ b/chromium/cc/layers/scrollbar_layer.cc
@@ -1,3 +1,4 @@
+
// Copyright 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.
@@ -8,15 +9,12 @@
#include "base/basictypes.h"
#include "base/debug/trace_event.h"
#include "cc/layers/scrollbar_layer_impl.h"
-#include "cc/resources/ui_resource_bitmap.h"
+#include "cc/resources/caching_bitmap_content_layer_updater.h"
+#include "cc/resources/layer_painter.h"
+#include "cc/resources/prioritized_resource.h"
+#include "cc/resources/resource_update_queue.h"
#include "cc/trees/layer_tree_host.h"
-#include "cc/trees/layer_tree_impl.h"
-#include "skia/ext/platform_canvas.h"
-#include "skia/ext/refptr.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "third_party/skia/include/core/SkCanvas.h"
-#include "third_party/skia/include/core/SkSize.h"
-#include "ui/gfx/skia_util.h"
+#include "ui/gfx/rect_conversions.h"
namespace cc {
@@ -29,15 +27,16 @@ scoped_ptr<LayerImpl> ScrollbarLayer::CreateLayerImpl(
scoped_refptr<ScrollbarLayer> ScrollbarLayer::Create(
scoped_ptr<Scrollbar> scrollbar,
int scroll_layer_id) {
- return make_scoped_refptr(
- new ScrollbarLayer(scrollbar.Pass(), scroll_layer_id));
+ return make_scoped_refptr(new ScrollbarLayer(scrollbar.Pass(),
+ scroll_layer_id));
}
ScrollbarLayer::ScrollbarLayer(
scoped_ptr<Scrollbar> scrollbar,
int scroll_layer_id)
: scrollbar_(scrollbar.Pass()),
- scroll_layer_id_(scroll_layer_id) {
+ scroll_layer_id_(scroll_layer_id),
+ texture_format_(GL_INVALID_ENUM) {
if (!scrollbar_->IsOverlay())
SetShouldScrollOnMainThread(true);
}
@@ -122,17 +121,22 @@ void ScrollbarLayer::PushPropertiesTo(LayerImpl* layer) {
}
scrollbar_layer->SetThumbLength(thumb_length_);
if (Orientation() == HORIZONTAL) {
- scrollbar_layer->SetTrackStart(track_rect_.x());
+ scrollbar_layer->SetTrackStart(track_rect_.x() - location_.x());
scrollbar_layer->SetTrackLength(track_rect_.width());
} else {
- scrollbar_layer->SetTrackStart(track_rect_.y());
+ scrollbar_layer->SetTrackStart(track_rect_.y() - location_.y());
scrollbar_layer->SetTrackLength(track_rect_.height());
}
- if (track_resource_.get())
- scrollbar_layer->set_track_ui_resource_id(track_resource_->id());
- if (thumb_resource_.get())
- scrollbar_layer->set_thumb_ui_resource_id(thumb_resource_->id());
+ if (track_ && track_->texture()->have_backing_texture())
+ scrollbar_layer->set_track_resource_id(track_->texture()->resource_id());
+ else
+ scrollbar_layer->set_track_resource_id(0);
+
+ if (thumb_ && thumb_->texture()->have_backing_texture())
+ scrollbar_layer->set_thumb_resource_id(thumb_->texture()->resource_id());
+ else
+ scrollbar_layer->set_thumb_resource_id(0);
scrollbar_layer->set_is_overlay_scrollbar(scrollbar_->IsOverlay());
@@ -145,16 +149,113 @@ ScrollbarLayer* ScrollbarLayer::ToScrollbarLayer() {
}
void ScrollbarLayer::SetLayerTreeHost(LayerTreeHost* host) {
- // When the LTH is set to null or has changed, then this layer should remove
- // all of its associated resources.
if (!host || host != layer_tree_host()) {
- track_resource_.reset();
- thumb_resource_.reset();
+ track_updater_ = NULL;
+ track_.reset();
+ thumb_updater_ = NULL;
+ thumb_.reset();
}
ContentsScalingLayer::SetLayerTreeHost(host);
}
+class ScrollbarPartPainter : public LayerPainter {
+ public:
+ ScrollbarPartPainter(Scrollbar* scrollbar, ScrollbarPart part)
+ : scrollbar_(scrollbar),
+ part_(part) {}
+ virtual ~ScrollbarPartPainter() {}
+
+ // LayerPainter implementation
+ virtual void Paint(SkCanvas* canvas,
+ gfx::Rect content_rect,
+ gfx::RectF* opaque) OVERRIDE {
+ scrollbar_->PaintPart(canvas, part_, content_rect);
+ }
+
+ private:
+ Scrollbar* scrollbar_;
+ ScrollbarPart part_;
+};
+
+void ScrollbarLayer::CreateUpdaterIfNeeded() {
+ if (layer_tree_host()->settings().solid_color_scrollbars)
+ return;
+
+ texture_format_ =
+ layer_tree_host()->GetRendererCapabilities().best_texture_format;
+
+ if (!track_updater_.get()) {
+ track_updater_ = CachingBitmapContentLayerUpdater::Create(
+ scoped_ptr<LayerPainter>(
+ new ScrollbarPartPainter(scrollbar_.get(), TRACK))
+ .Pass(),
+ rendering_stats_instrumentation(),
+ id());
+ }
+ if (!track_) {
+ track_ = track_updater_->CreateResource(
+ layer_tree_host()->contents_texture_manager());
+ }
+
+ if (!thumb_updater_.get()) {
+ thumb_updater_ = CachingBitmapContentLayerUpdater::Create(
+ scoped_ptr<LayerPainter>(
+ new ScrollbarPartPainter(scrollbar_.get(), THUMB))
+ .Pass(),
+ rendering_stats_instrumentation(),
+ id());
+ }
+ if (!thumb_ && scrollbar_->HasThumb()) {
+ thumb_ = thumb_updater_->CreateResource(
+ layer_tree_host()->contents_texture_manager());
+ }
+}
+
+bool ScrollbarLayer::UpdatePart(CachingBitmapContentLayerUpdater* painter,
+ LayerUpdater::Resource* resource,
+ gfx::Rect rect,
+ ResourceUpdateQueue* queue) {
+ if (layer_tree_host()->settings().solid_color_scrollbars)
+ return false;
+
+ // Skip painting and uploading if there are no invalidations and
+ // we already have valid texture data.
+ if (resource->texture()->have_backing_texture() &&
+ resource->texture()->size() == rect.size() &&
+ !is_dirty())
+ return false;
+
+ // We should always have enough memory for UI.
+ DCHECK(resource->texture()->can_acquire_backing_texture());
+ if (!resource->texture()->can_acquire_backing_texture())
+ return false;
+
+ // Paint and upload the entire part.
+ gfx::Rect painted_opaque_rect;
+ painter->PrepareToUpdate(rect,
+ rect.size(),
+ contents_scale_x(),
+ contents_scale_y(),
+ &painted_opaque_rect);
+ if (!painter->pixels_did_change() &&
+ resource->texture()->have_backing_texture()) {
+ TRACE_EVENT_INSTANT0("cc",
+ "ScrollbarLayer::UpdatePart no texture upload needed",
+ TRACE_EVENT_SCOPE_THREAD);
+ return false;
+ }
+
+ bool partial_updates_allowed =
+ layer_tree_host()->settings().max_partial_texture_updates > 0;
+ if (!partial_updates_allowed)
+ resource->texture()->ReturnBackingTexture();
+
+ gfx::Vector2d dest_offset(0, 0);
+ resource->Update(queue, rect, dest_offset, partial_updates_allowed);
+ return true;
+}
+
gfx::Rect ScrollbarLayer::ScrollbarLayerRectToContentRect(
gfx::Rect layer_rect) const {
// Don't intersect with the bounds as in LayerRectToContentRect() because
@@ -168,80 +269,85 @@ gfx::Rect ScrollbarLayer::ScrollbarLayerRectToContentRect(
return expanded_rect;
}
-gfx::Rect ScrollbarLayer::OriginThumbRect() const {
- gfx::Size thumb_size;
- if (Orientation() == HORIZONTAL) {
- thumb_size =
- gfx::Size(scrollbar_->ThumbLength(), scrollbar_->ThumbThickness());
- } else {
- thumb_size =
- gfx::Size(scrollbar_->ThumbThickness(), scrollbar_->ThumbLength());
+void ScrollbarLayer::SetTexturePriorities(
+ const PriorityCalculator& priority_calc) {
+ if (layer_tree_host()->settings().solid_color_scrollbars)
+ return;
+
+ if (content_bounds().IsEmpty())
+ return;
+ DCHECK_LE(content_bounds().width(), MaxTextureSize());
+ DCHECK_LE(content_bounds().height(), MaxTextureSize());
+
+ CreateUpdaterIfNeeded();
+
+ bool draws_to_root = !render_target()->parent();
+ if (track_) {
+ track_->texture()->SetDimensions(content_bounds(), texture_format_);
+ track_->texture()->set_request_priority(
+ PriorityCalculator::UIPriority(draws_to_root));
+ }
+ if (thumb_) {
+ gfx::Size thumb_size = OriginThumbRect().size();
+ thumb_->texture()->SetDimensions(thumb_size, texture_format_);
+ thumb_->texture()->set_request_priority(
+ PriorityCalculator::UIPriority(draws_to_root));
}
- return ScrollbarLayerRectToContentRect(gfx::Rect(thumb_size));
}
bool ScrollbarLayer::Update(ResourceUpdateQueue* queue,
const OcclusionTracker* occlusion) {
track_rect_ = scrollbar_->TrackRect();
- gfx::Rect scaled_track_rect = ScrollbarLayerRectToContentRect(
- gfx::Rect(scrollbar_->Location(), bounds()));
+ location_ = scrollbar_->Location();
- if (layer_tree_host()->settings().solid_color_scrollbars ||
- track_rect_.IsEmpty() || scaled_track_rect.IsEmpty())
+ if (layer_tree_host()->settings().solid_color_scrollbars)
return false;
+ bool updated = false;
+
{
base::AutoReset<bool> ignore_set_needs_commit(&ignore_set_needs_commit_,
true);
- ContentsScalingLayer::Update(queue, occlusion);
+ updated = ContentsScalingLayer::Update(queue, occlusion);
}
- track_resource_ = ScopedUIResource::Create(
- layer_tree_host(), RasterizeScrollbarPart(scaled_track_rect, TRACK));
- gfx::Rect thumb_rect = OriginThumbRect();
+ dirty_rect_.Union(update_rect_);
+ if (content_bounds().IsEmpty())
+ return false;
+ if (visible_content_rect().IsEmpty())
+ return false;
+
+ CreateUpdaterIfNeeded();
- if (scrollbar_->HasThumb() && !thumb_rect.IsEmpty()) {
+ gfx::Rect content_rect = ScrollbarLayerRectToContentRect(
+ gfx::Rect(scrollbar_->Location(), bounds()));
+ updated |= UpdatePart(track_updater_.get(), track_.get(), content_rect,
+ queue);
+
+ if (scrollbar_->HasThumb()) {
thumb_thickness_ = scrollbar_->ThumbThickness();
thumb_length_ = scrollbar_->ThumbLength();
- thumb_resource_ = ScopedUIResource::Create(
- layer_tree_host(), RasterizeScrollbarPart(thumb_rect, THUMB));
+ gfx::Rect origin_thumb_rect = OriginThumbRect();
+ if (!origin_thumb_rect.IsEmpty()) {
+ updated |= UpdatePart(thumb_updater_.get(), thumb_.get(),
+ origin_thumb_rect, queue);
+ }
}
- return true;
+ dirty_rect_ = gfx::RectF();
+ return updated;
}
-scoped_refptr<UIResourceBitmap> ScrollbarLayer::RasterizeScrollbarPart(
- gfx::Rect rect,
- ScrollbarPart part) {
- DCHECK(!layer_tree_host()->settings().solid_color_scrollbars);
- DCHECK(!rect.size().IsEmpty());
-
- scoped_refptr<UIResourceBitmap> bitmap =
- UIResourceBitmap::Create(new uint8_t[rect.width() * rect.height() * 4],
- UIResourceBitmap::RGBA8,
- rect.size());
-
- SkBitmap skbitmap;
- skbitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height());
- skbitmap.setPixels(bitmap->GetPixels());
-
- SkCanvas skcanvas(skbitmap);
- skcanvas.translate(SkFloatToScalar(-rect.x()), SkFloatToScalar(-rect.y()));
- skcanvas.scale(SkFloatToScalar(contents_scale_x()),
- SkFloatToScalar(contents_scale_y()));
-
- gfx::Rect layer_rect = gfx::ScaleToEnclosingRect(
- rect, 1.f / contents_scale_x(), 1.f / contents_scale_y());
- SkRect layer_skrect = RectToSkRect(layer_rect);
- SkPaint paint;
- paint.setAntiAlias(false);
- paint.setXfermodeMode(SkXfermode::kClear_Mode);
- skcanvas.drawRect(layer_skrect, paint);
- skcanvas.clipRect(layer_skrect);
-
- scrollbar_->PaintPart(&skcanvas, part, layer_rect);
-
- return bitmap;
+gfx::Rect ScrollbarLayer::OriginThumbRect() const {
+ gfx::Size thumb_size;
+ if (Orientation() == HORIZONTAL) {
+ thumb_size = gfx::Size(scrollbar_->ThumbLength(),
+ scrollbar_->ThumbThickness());
+ } else {
+ thumb_size = gfx::Size(scrollbar_->ThumbThickness(),
+ scrollbar_->ThumbLength());
+ }
+ return ScrollbarLayerRectToContentRect(gfx::Rect(thumb_size));
}
} // namespace cc
diff --git a/chromium/cc/layers/scrollbar_layer.h b/chromium/cc/layers/scrollbar_layer.h
index a162a7f00f5..6d0e58f7a4e 100644
--- a/chromium/cc/layers/scrollbar_layer.h
+++ b/chromium/cc/layers/scrollbar_layer.h
@@ -10,9 +10,10 @@
#include "cc/layers/contents_scaling_layer.h"
#include "cc/layers/scrollbar_theme_painter.h"
#include "cc/resources/layer_updater.h"
-#include "cc/resources/scoped_ui_resource.h"
namespace cc {
+class CachingBitmapContentLayerUpdater;
+class ResourceUpdateQueue;
class ScrollbarThemeComposite;
class CC_EXPORT ScrollbarLayer : public ContentsScalingLayer {
@@ -32,6 +33,8 @@ class CC_EXPORT ScrollbarLayer : public ContentsScalingLayer {
ScrollbarOrientation Orientation() const;
// Layer interface
+ virtual void SetTexturePriorities(const PriorityCalculator& priority_calc)
+ OVERRIDE;
virtual bool Update(ResourceUpdateQueue* queue,
const OcclusionTracker* occlusion) OVERRIDE;
virtual void SetLayerTreeHost(LayerTreeHost* host) OVERRIDE;
@@ -47,36 +50,42 @@ class CC_EXPORT ScrollbarLayer : public ContentsScalingLayer {
virtual ScrollbarLayer* ToScrollbarLayer() OVERRIDE;
protected:
- ScrollbarLayer(scoped_ptr<Scrollbar> scrollbar, int scroll_layer_id);
+ ScrollbarLayer(scoped_ptr<Scrollbar> scrollbar,
+ int scroll_layer_id);
virtual ~ScrollbarLayer();
- // For unit tests
- UIResourceId track_resource_id() {
- return track_resource_.get() ? track_resource_->id() : 0;
- }
- UIResourceId thumb_resource_id() {
- return thumb_resource_.get() ? thumb_resource_->id() : 0;
- }
-
private:
+ bool UpdatePart(CachingBitmapContentLayerUpdater* painter,
+ LayerUpdater::Resource* resource,
+ gfx::Rect rect,
+ ResourceUpdateQueue* queue);
+ void CreateUpdaterIfNeeded();
gfx::Rect ScrollbarLayerRectToContentRect(gfx::Rect layer_rect) const;
gfx::Rect OriginThumbRect() const;
+ bool is_dirty() const { return !dirty_rect_.IsEmpty(); }
+
int MaxTextureSize();
float ClampScaleToMaxTextureSize(float scale);
- scoped_refptr<UIResourceBitmap> RasterizeScrollbarPart(gfx::Rect rect,
- ScrollbarPart part);
-
scoped_ptr<Scrollbar> scrollbar_;
int thumb_thickness_;
int thumb_length_;
gfx::Rect track_rect_;
+ gfx::Point location_;
int scroll_layer_id_;
- scoped_ptr<ScopedUIResource> track_resource_;
- scoped_ptr<ScopedUIResource> thumb_resource_;
+ unsigned texture_format_;
+
+ gfx::RectF dirty_rect_;
+
+ scoped_refptr<CachingBitmapContentLayerUpdater> track_updater_;
+ scoped_refptr<CachingBitmapContentLayerUpdater> thumb_updater_;
+
+ // All the parts of the scrollbar except the thumb
+ scoped_ptr<LayerUpdater::Resource> track_;
+ scoped_ptr<LayerUpdater::Resource> thumb_;
DISALLOW_COPY_AND_ASSIGN(ScrollbarLayer);
};
diff --git a/chromium/cc/layers/scrollbar_layer_impl.cc b/chromium/cc/layers/scrollbar_layer_impl.cc
index c326d42ff24..1de185a77dd 100644
--- a/chromium/cc/layers/scrollbar_layer_impl.cc
+++ b/chromium/cc/layers/scrollbar_layer_impl.cc
@@ -31,8 +31,8 @@ ScrollbarLayerImpl::ScrollbarLayerImpl(
int id,
ScrollbarOrientation orientation)
: LayerImpl(tree_impl, id),
- track_ui_resource_id_(0),
- thumb_ui_resource_id_(0),
+ track_resource_id_(0),
+ thumb_resource_id_(0),
current_pos_(0.f),
maximum_(0),
thumb_thickness_(0),
@@ -69,8 +69,8 @@ void ScrollbarLayerImpl::PushPropertiesTo(LayerImpl* layer) {
scrollbar_layer->SetTrackLength(track_length_);
scrollbar_layer->set_is_overlay_scrollbar(is_overlay_scrollbar_);
- scrollbar_layer->set_track_ui_resource_id(track_ui_resource_id_);
- scrollbar_layer->set_thumb_ui_resource_id(thumb_ui_resource_id_);
+ scrollbar_layer->set_track_resource_id(track_resource_id_);
+ scrollbar_layer->set_thumb_resource_id(thumb_resource_id_);
}
bool ScrollbarLayerImpl::WillDraw(DrawMode draw_mode,
@@ -106,19 +106,14 @@ void ScrollbarLayerImpl::AppendQuads(QuadSink* quad_sink,
return;
}
- ResourceProvider::ResourceId thumb_resource_id =
- layer_tree_impl()->ResourceIdForUIResource(thumb_ui_resource_id_);
- ResourceProvider::ResourceId track_resource_id =
- layer_tree_impl()->ResourceIdForUIResource(track_ui_resource_id_);
-
- if (thumb_resource_id && !thumb_quad_rect.IsEmpty()) {
+ if (thumb_resource_id_ && !thumb_quad_rect.IsEmpty()) {
gfx::Rect opaque_rect;
const float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f};
scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create();
quad->SetNew(shared_quad_state,
thumb_quad_rect,
opaque_rect,
- thumb_resource_id,
+ thumb_resource_id_,
premultipled_alpha,
uv_top_left,
uv_bottom_right,
@@ -128,15 +123,21 @@ void ScrollbarLayerImpl::AppendQuads(QuadSink* quad_sink,
quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data);
}
- gfx::Rect track_quad_rect = content_bounds_rect;
- if (track_resource_id && !track_quad_rect.IsEmpty()) {
- gfx::Rect opaque_rect(contents_opaque() ? track_quad_rect : gfx::Rect());
+ if (!track_resource_id_)
+ return;
+
+ // Order matters here: since the back track texture is being drawn to the
+ // entire contents rect, we must append it after the thumb and fore track
+ // quads. The back track texture contains (and displays) the buttons.
+ if (!content_bounds_rect.IsEmpty()) {
+ gfx::Rect quad_rect(content_bounds_rect);
+ gfx::Rect opaque_rect(contents_opaque() ? quad_rect : gfx::Rect());
const float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f};
scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create();
quad->SetNew(shared_quad_state,
- track_quad_rect,
+ quad_rect,
opaque_rect,
- track_resource_id,
+ track_resource_id_,
premultipled_alpha,
uv_top_left,
uv_bottom_right,
@@ -315,6 +316,11 @@ gfx::Rect ScrollbarLayerImpl::ComputeThumbQuadRect() const {
return ScrollbarLayerRectToContentRect(thumb_rect);
}
+void ScrollbarLayerImpl::DidLoseOutputSurface() {
+ track_resource_id_ = 0;
+ thumb_resource_id_ = 0;
+}
+
const char* ScrollbarLayerImpl::LayerTypeAsString() const {
return "cc::ScrollbarLayerImpl";
}
diff --git a/chromium/cc/layers/scrollbar_layer_impl.h b/chromium/cc/layers/scrollbar_layer_impl.h
index 86bf25558a0..6347c413dfc 100644
--- a/chromium/cc/layers/scrollbar_layer_impl.h
+++ b/chromium/cc/layers/scrollbar_layer_impl.h
@@ -8,7 +8,6 @@
#include "cc/base/cc_export.h"
#include "cc/input/scrollbar.h"
#include "cc/layers/layer_impl.h"
-#include "cc/resources/ui_resource_client.h"
namespace cc {
@@ -34,6 +33,8 @@ class CC_EXPORT ScrollbarLayerImpl : public LayerImpl {
virtual void AppendQuads(QuadSink* quad_sink,
AppendQuadsData* append_quads_data) OVERRIDE;
+ virtual void DidLoseOutputSurface() OVERRIDE;
+
int scroll_layer_id() const { return scroll_layer_id_; }
void set_scroll_layer_id(int id) { scroll_layer_id_ = id; }
@@ -47,11 +48,11 @@ class CC_EXPORT ScrollbarLayerImpl : public LayerImpl {
void SetTrackStart(int track_start);
void SetTrackLength(int track_length);
void SetVerticalAdjust(float vertical_adjust);
- void set_track_ui_resource_id(UIResourceId uid) {
- track_ui_resource_id_ = uid;
+ void set_track_resource_id(ResourceProvider::ResourceId id) {
+ track_resource_id_ = id;
}
- void set_thumb_ui_resource_id(UIResourceId uid) {
- thumb_ui_resource_id_ = uid;
+ void set_thumb_resource_id(ResourceProvider::ResourceId id) {
+ thumb_resource_id_ = id;
}
void SetVisibleToTotalLengthRatio(float ratio);
void set_is_overlay_scrollbar(bool is_overlay_scrollbar) {
@@ -74,8 +75,8 @@ class CC_EXPORT ScrollbarLayerImpl : public LayerImpl {
gfx::Rect ScrollbarLayerRectToContentRect(gfx::RectF layer_rect) const;
- UIResourceId track_ui_resource_id_;
- UIResourceId thumb_ui_resource_id_;
+ ResourceProvider::ResourceId track_resource_id_;
+ ResourceProvider::ResourceId thumb_resource_id_;
float current_pos_;
int maximum_;
diff --git a/chromium/cc/layers/scrollbar_layer_unittest.cc b/chromium/cc/layers/scrollbar_layer_unittest.cc
index 79cfbb1f26d..b7981041f09 100644
--- a/chromium/cc/layers/scrollbar_layer_unittest.cc
+++ b/chromium/cc/layers/scrollbar_layer_unittest.cc
@@ -4,23 +4,22 @@
#include "cc/layers/scrollbar_layer.h"
-#include "base/containers/hash_tables.h"
#include "cc/animation/scrollbar_animation_controller.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
#include "cc/layers/append_quads_data.h"
#include "cc/layers/scrollbar_layer_impl.h"
#include "cc/quads/solid_color_draw_quad.h"
+#include "cc/resources/prioritized_resource_manager.h"
+#include "cc/resources/priority_calculator.h"
#include "cc/resources/resource_update_queue.h"
#include "cc/test/fake_impl_proxy.h"
#include "cc/test/fake_layer_tree_host.h"
#include "cc/test/fake_layer_tree_host_client.h"
#include "cc/test/fake_layer_tree_host_impl.h"
#include "cc/test/fake_scrollbar.h"
-#include "cc/test/fake_scrollbar_layer.h"
#include "cc/test/geometry_test_utils.h"
#include "cc/test/layer_tree_test.h"
#include "cc/test/mock_quad_culler.h"
-#include "cc/trees/layer_tree_host.h"
+#include "cc/test/test_web_graphics_context_3d.h"
#include "cc/trees/layer_tree_impl.h"
#include "cc/trees/single_thread_proxy.h"
#include "cc/trees/tree_synchronizer.h"
@@ -405,48 +404,9 @@ class MockLayerTreeHost : public LayerTreeHost {
public:
MockLayerTreeHost(LayerTreeHostClient* client,
const LayerTreeSettings& settings)
- : LayerTreeHost(client, settings),
- next_id_(1),
- total_ui_resource_created_(0),
- total_ui_resource_deleted_(0) {
+ : LayerTreeHost(client, settings) {
Initialize(NULL);
}
-
- virtual UIResourceId CreateUIResource(UIResourceClient* content) OVERRIDE {
- total_ui_resource_created_++;
- UIResourceId nid = next_id_++;
- ui_resource_bitmap_map_[nid] = content->GetBitmap(nid, false);
- return nid;
- }
-
- // Deletes a UI resource. May safely be called more than once.
- virtual void DeleteUIResource(UIResourceId id) OVERRIDE {
- UIResourceBitmapMap::iterator iter = ui_resource_bitmap_map_.find(id);
- if (iter != ui_resource_bitmap_map_.end()) {
- ui_resource_bitmap_map_.erase(iter);
- total_ui_resource_deleted_++;
- }
- }
-
- size_t UIResourceCount() { return ui_resource_bitmap_map_.size(); }
- int TotalUIResourceDeleted() { return total_ui_resource_deleted_; }
- int TotalUIResourceCreated() { return total_ui_resource_created_; }
-
- gfx::Size ui_resource_size(UIResourceId id) {
- UIResourceBitmapMap::iterator iter = ui_resource_bitmap_map_.find(id);
- if (iter != ui_resource_bitmap_map_.end() && iter->second.get())
- return iter->second->GetSize();
- return gfx::Size();
- }
-
- private:
- typedef base::hash_map<UIResourceId, scoped_refptr<UIResourceBitmap> >
- UIResourceBitmapMap;
- UIResourceBitmapMap ui_resource_bitmap_map_;
-
- int next_id_;
- int total_ui_resource_created_;
- int total_ui_resource_deleted_;
};
@@ -455,10 +415,7 @@ class ScrollbarLayerTestResourceCreation : public testing::Test {
ScrollbarLayerTestResourceCreation()
: fake_client_(FakeLayerTreeHostClient::DIRECT_3D) {}
- void TestResourceUpload(int num_updates,
- size_t expected_resources,
- int expected_created,
- int expected_deleted) {
+ void TestResourceUpload(size_t expected_resources) {
layer_tree_host_.reset(
new MockLayerTreeHost(&fake_client_, layer_tree_settings_));
@@ -466,11 +423,13 @@ class ScrollbarLayerTestResourceCreation : public testing::Test {
scoped_refptr<Layer> layer_tree_root = Layer::Create();
scoped_refptr<Layer> content_layer = Layer::Create();
scoped_refptr<Layer> scrollbar_layer =
- ScrollbarLayer::Create(scrollbar.Pass(), layer_tree_root->id());
+ ScrollbarLayer::Create(scrollbar.Pass(), layer_tree_root->id());
layer_tree_root->AddChild(content_layer);
layer_tree_root->AddChild(scrollbar_layer);
layer_tree_host_->InitializeOutputSurfaceIfNeeded();
+ layer_tree_host_->contents_texture_manager()->
+ SetMaxMemoryLimitBytes(1024 * 1024);
layer_tree_host_->SetRootLayer(layer_tree_root);
scrollbar_layer->SetIsDrawable(true);
@@ -488,17 +447,16 @@ class ScrollbarLayerTestResourceCreation : public testing::Test {
testing::Mock::VerifyAndClearExpectations(layer_tree_host_.get());
EXPECT_EQ(scrollbar_layer->layer_tree_host(), layer_tree_host_.get());
+ PriorityCalculator calculator;
ResourceUpdateQueue queue;
OcclusionTracker occlusion_tracker(gfx::Rect(), false);
scrollbar_layer->SavePaintProperties();
- for (int update_counter = 0; update_counter < num_updates; update_counter++)
- scrollbar_layer->Update(&queue, &occlusion_tracker);
-
- // A non-solid-color scrollbar should have requested two textures.
- EXPECT_EQ(expected_resources, layer_tree_host_->UIResourceCount());
- EXPECT_EQ(expected_created, layer_tree_host_->TotalUIResourceCreated());
- EXPECT_EQ(expected_deleted, layer_tree_host_->TotalUIResourceDeleted());
+ scrollbar_layer->SetTexturePriorities(calculator);
+ layer_tree_host_->contents_texture_manager()->PrioritizeTextures();
+ scrollbar_layer->Update(&queue, &occlusion_tracker);
+ EXPECT_EQ(0u, queue.FullUploadSize());
+ EXPECT_EQ(expected_resources, queue.PartialUploadSize());
testing::Mock::VerifyAndClearExpectations(layer_tree_host_.get());
@@ -513,18 +471,12 @@ class ScrollbarLayerTestResourceCreation : public testing::Test {
TEST_F(ScrollbarLayerTestResourceCreation, ResourceUpload) {
layer_tree_settings_.solid_color_scrollbars = false;
- TestResourceUpload(0, 0, 0, 0);
- int num_updates[3] = {1, 5, 10};
- for (int j = 0; j < 3; j++) {
- TestResourceUpload(
- num_updates[j], 2, num_updates[j] * 2, (num_updates[j] - 1) * 2);
- }
+ TestResourceUpload(2);
}
TEST_F(ScrollbarLayerTestResourceCreation, SolidColorNoResourceUpload) {
layer_tree_settings_.solid_color_scrollbars = true;
- TestResourceUpload(0, 0, 0, 0);
- TestResourceUpload(1, 0, 0, 0);
+ TestResourceUpload(0);
}
class ScaledScrollbarLayerTestResourceCreation : public testing::Test {
@@ -532,20 +484,25 @@ class ScaledScrollbarLayerTestResourceCreation : public testing::Test {
ScaledScrollbarLayerTestResourceCreation()
: fake_client_(FakeLayerTreeHostClient::DIRECT_3D) {}
- void TestResourceUpload(const float test_scale) {
+ void TestResourceUpload(size_t expected_resources, const float test_scale) {
layer_tree_host_.reset(
new MockLayerTreeHost(&fake_client_, layer_tree_settings_));
gfx::Point scrollbar_location(0, 185);
+ scoped_ptr<FakeScrollbar> scrollbar(new FakeScrollbar(false, true, false));
+ scrollbar->set_location(scrollbar_location);
+
scoped_refptr<Layer> layer_tree_root = Layer::Create();
scoped_refptr<Layer> content_layer = Layer::Create();
- scoped_refptr<FakeScrollbarLayer> scrollbar_layer =
- FakeScrollbarLayer::Create(false, true, layer_tree_root->id());
-
+ scoped_refptr<Layer> scrollbar_layer =
+ ScrollbarLayer::Create(scrollbar.PassAs<cc::Scrollbar>(),
+ layer_tree_root->id());
layer_tree_root->AddChild(content_layer);
layer_tree_root->AddChild(scrollbar_layer);
layer_tree_host_->InitializeOutputSurfaceIfNeeded();
+ layer_tree_host_->contents_texture_manager()->
+ SetMaxMemoryLimitBytes(1024 * 1024);
layer_tree_host_->SetRootLayer(layer_tree_root);
scrollbar_layer->SetIsDrawable(true);
@@ -572,23 +529,30 @@ class ScaledScrollbarLayerTestResourceCreation : public testing::Test {
testing::Mock::VerifyAndClearExpectations(layer_tree_host_.get());
EXPECT_EQ(scrollbar_layer->layer_tree_host(), layer_tree_host_.get());
+ PriorityCalculator calculator;
ResourceUpdateQueue queue;
OcclusionTracker occlusion_tracker(gfx::Rect(), false);
+
scrollbar_layer->SavePaintProperties();
+ scrollbar_layer->SetTexturePriorities(calculator);
+ layer_tree_host_->contents_texture_manager()->PrioritizeTextures();
scrollbar_layer->Update(&queue, &occlusion_tracker);
+ EXPECT_EQ(expected_resources, queue.PartialUploadSize());
// Verify that we have not generated any content uploads that are larger
// than their destination textures.
-
- gfx::Size track_size = layer_tree_host_->ui_resource_size(
- scrollbar_layer->track_resource_id());
- gfx::Size thumb_size = layer_tree_host_->ui_resource_size(
- scrollbar_layer->thumb_resource_id());
-
- EXPECT_LE(track_size.width(), scrollbar_layer->content_bounds().width());
- EXPECT_LE(track_size.height(), scrollbar_layer->content_bounds().height());
- EXPECT_LE(thumb_size.width(), scrollbar_layer->content_bounds().width());
- EXPECT_LE(thumb_size.height(), scrollbar_layer->content_bounds().height());
+ while (queue.HasMoreUpdates()) {
+ ResourceUpdate update = queue.TakeFirstPartialUpload();
+ EXPECT_LE(update.texture->size().width(),
+ scrollbar_layer->content_bounds().width());
+ EXPECT_LE(update.texture->size().height(),
+ scrollbar_layer->content_bounds().height());
+
+ EXPECT_LE(update.dest_offset.x() + update.content_rect.width(),
+ update.texture->size().width());
+ EXPECT_LE(update.dest_offset.y() + update.content_rect.height(),
+ update.texture->size().height());
+ }
testing::Mock::VerifyAndClearExpectations(layer_tree_host_.get());
@@ -605,9 +569,7 @@ TEST_F(ScaledScrollbarLayerTestResourceCreation, ScaledResourceUpload) {
layer_tree_settings_.solid_color_scrollbars = false;
// Pick a test scale that moves the scrollbar's (non-zero) position to
// a non-pixel-aligned location.
- TestResourceUpload(.041f);
- TestResourceUpload(1.41f);
- TestResourceUpload(4.1f);
+ TestResourceUpload(2, 1.41f);
}
} // namespace
diff --git a/chromium/cc/layers/texture_layer.cc b/chromium/cc/layers/texture_layer.cc
index 2325a80c793..11009fa1b68 100644
--- a/chromium/cc/layers/texture_layer.cc
+++ b/chromium/cc/layers/texture_layer.cc
@@ -196,6 +196,7 @@ bool TextureLayer::Update(ResourceUpdateQueue* queue,
client_->Context3d()->getGraphicsResetStatusARB() != GL_NO_ERROR)
texture_id_ = 0;
updated = true;
+ SetNeedsPushProperties();
}
}
diff --git a/chromium/cc/layers/texture_layer_unittest.cc b/chromium/cc/layers/texture_layer_unittest.cc
index 744bf004956..aa08e9f81ee 100644
--- a/chromium/cc/layers/texture_layer_unittest.cc
+++ b/chromium/cc/layers/texture_layer_unittest.cc
@@ -7,13 +7,11 @@
#include <string>
#include "base/callback.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
#include "cc/layers/texture_layer_client.h"
#include "cc/layers/texture_layer_impl.h"
#include "cc/test/fake_impl_proxy.h"
#include "cc/test/fake_layer_tree_host_client.h"
#include "cc/test/fake_layer_tree_host_impl.h"
-#include "cc/test/fake_output_surface.h"
#include "cc/test/layer_test_common.h"
#include "cc/test/layer_tree_test.h"
#include "cc/trees/layer_tree_host.h"
diff --git a/chromium/cc/output/gl_renderer.cc b/chromium/cc/output/gl_renderer.cc
index 61d0eaaafc4..2dc699104ab 100644
--- a/chromium/cc/output/gl_renderer.cc
+++ b/chromium/cc/output/gl_renderer.cc
@@ -2348,7 +2348,7 @@ void GLRenderer::DoGetFramebufferPixels(
if (is_async) {
query = context_->createQueryEXT();
GLC(context_, context_->beginQueryEXT(
- GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM,
+ GL_ASYNC_READ_PIXELS_COMPLETED_CHROMIUM,
query));
}
@@ -2389,7 +2389,7 @@ void GLRenderer::DoGetFramebufferPixels(
if (is_async) {
GLC(context_, context_->endQueryEXT(
- GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM));
+ GL_ASYNC_READ_PIXELS_COMPLETED_CHROMIUM));
SyncPointHelper::SignalQuery(
context_,
query,
diff --git a/chromium/cc/output/gl_renderer_unittest.cc b/chromium/cc/output/gl_renderer_unittest.cc
index 9e930ccd023..e4213d65842 100644
--- a/chromium/cc/output/gl_renderer_unittest.cc
+++ b/chromium/cc/output/gl_renderer_unittest.cc
@@ -7,7 +7,6 @@
#include <set>
#include "cc/base/math_util.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
#include "cc/output/compositor_frame_metadata.h"
#include "cc/resources/prioritized_resource_manager.h"
#include "cc/resources/resource_provider.h"
@@ -19,6 +18,7 @@
#include "cc/test/pixel_test.h"
#include "cc/test/render_pass_test_common.h"
#include "cc/test/render_pass_test_utils.h"
+#include "cc/test/test_web_graphics_context_3d.h"
#include "gpu/GLES2/gl2extchromium.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/cc/output/output_surface.cc b/chromium/cc/output/output_surface.cc
index 5d2c6bb6e9f..be990cc0cb7 100644
--- a/chromium/cc/output/output_surface.cc
+++ b/chromium/cc/output/output_surface.cc
@@ -219,7 +219,7 @@ void OutputSurface::BeginFrame(const BeginFrameArgs& args) {
}
}
-base::TimeDelta OutputSurface::AlternateRetroactiveBeginFramePeriod() {
+base::TimeDelta OutputSurface::RetroactiveBeginFramePeriod() {
return BeginFrameArgs::DefaultRetroactiveBeginFramePeriod();
}
@@ -239,11 +239,9 @@ void OutputSurface::CheckForRetroactiveBeginFrame() {
TRACE_EVENT0("cc", "OutputSurface::CheckForRetroactiveBeginFrame");
check_for_retroactive_begin_frame_pending_ = false;
base::TimeTicks now = base::TimeTicks::Now();
- // TODO(brianderson): Remove the alternative deadline once we have better
- // deadline estimations.
base::TimeTicks alternative_deadline =
skipped_begin_frame_args_.frame_time +
- AlternateRetroactiveBeginFramePeriod();
+ RetroactiveBeginFramePeriod();
if (now < skipped_begin_frame_args_.deadline ||
now < alternative_deadline) {
BeginFrame(skipped_begin_frame_args_);
diff --git a/chromium/cc/output/output_surface.h b/chromium/cc/output/output_surface.h
index 73f1c750851..86d4dc81dd3 100644
--- a/chromium/cc/output/output_surface.h
+++ b/chromium/cc/output/output_surface.h
@@ -174,7 +174,7 @@ class CC_EXPORT OutputSurface : public FrameRateControllerClient {
gfx::Rect viewport);
// virtual for testing.
- virtual base::TimeDelta AlternateRetroactiveBeginFramePeriod();
+ virtual base::TimeDelta RetroactiveBeginFramePeriod();
virtual void PostCheckForRetroactiveBeginFrame();
void CheckForRetroactiveBeginFrame();
diff --git a/chromium/cc/output/output_surface_unittest.cc b/chromium/cc/output/output_surface_unittest.cc
index 4f9e370e1f0..276828c04aa 100644
--- a/chromium/cc/output/output_surface_unittest.cc
+++ b/chromium/cc/output/output_surface_unittest.cc
@@ -5,13 +5,13 @@
#include "cc/output/output_surface.h"
#include "base/test/test_simple_task_runner.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
#include "cc/output/managed_memory_policy.h"
#include "cc/output/output_surface_client.h"
#include "cc/output/software_output_device.h"
#include "cc/test/fake_output_surface.h"
#include "cc/test/fake_output_surface_client.h"
#include "cc/test/scheduler_test_common.h"
+#include "cc/test/test_web_graphics_context_3d.h"
#include "gpu/GLES2/gl2extchromium.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/WebKit/public/platform/WebGraphicsMemoryAllocation.h"
@@ -67,8 +67,8 @@ class TestOutputSurface : public OutputSurface {
OnSwapBuffersComplete(NULL);
}
- void SetAlternateRetroactiveBeginFramePeriod(base::TimeDelta period) {
- alternate_retroactive_begin_frame_period_ = period;
+ void SetRetroactiveBeginFramePeriod(base::TimeDelta period) {
+ retroactive_begin_frame_period_ = period;
}
protected:
@@ -77,11 +77,11 @@ class TestOutputSurface : public OutputSurface {
CheckForRetroactiveBeginFrame();
}
- virtual base::TimeDelta AlternateRetroactiveBeginFramePeriod() OVERRIDE {
- return alternate_retroactive_begin_frame_period_;
+ virtual base::TimeDelta RetroactiveBeginFramePeriod() OVERRIDE {
+ return retroactive_begin_frame_period_;
}
- base::TimeDelta alternate_retroactive_begin_frame_period_;
+ base::TimeDelta retroactive_begin_frame_period_;
};
TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientSuccess) {
@@ -202,7 +202,7 @@ TEST(OutputSurfaceTest, BeginFrameEmulation) {
display_refresh_interval);
output_surface.SetMaxFramesPending(2);
- output_surface.SetAlternateRetroactiveBeginFramePeriod(
+ output_surface.SetRetroactiveBeginFramePeriod(
base::TimeDelta::FromSeconds(-1));
// We should start off with 0 BeginFrames
@@ -279,7 +279,7 @@ TEST(OutputSurfaceTest, OptimisticAndRetroactiveBeginFrames) {
output_surface.SetMaxFramesPending(2);
// Enable retroactive BeginFrames.
- output_surface.SetAlternateRetroactiveBeginFramePeriod(
+ output_surface.SetRetroactiveBeginFramePeriod(
base::TimeDelta::FromSeconds(100000));
// Optimistically injected BeginFrames should be throttled if
@@ -317,63 +317,6 @@ TEST(OutputSurfaceTest, OptimisticAndRetroactiveBeginFrames) {
EXPECT_EQ(client.begin_frame_count(), 4);
}
-TEST(OutputSurfaceTest, RetroactiveBeginFrameDoesNotDoubleTickWhenEmulating) {
- scoped_ptr<TestWebGraphicsContext3D> context3d =
- TestWebGraphicsContext3D::Create();
-
- TestOutputSurface output_surface(
- context3d.PassAs<WebKit::WebGraphicsContext3D>());
- EXPECT_FALSE(output_surface.HasClientForTesting());
-
- FakeOutputSurfaceClient client;
- EXPECT_TRUE(output_surface.BindToClient(&client));
- EXPECT_TRUE(output_surface.HasClientForTesting());
- EXPECT_FALSE(client.deferred_initialize_called());
-
- base::TimeDelta big_interval = base::TimeDelta::FromSeconds(1000);
-
- // Initialize BeginFrame emulation
- scoped_refptr<base::TestSimpleTaskRunner> task_runner =
- new base::TestSimpleTaskRunner;
- bool throttle_frame_production = true;
- const base::TimeDelta display_refresh_interval = big_interval;
-
- output_surface.InitializeBeginFrameEmulation(
- task_runner.get(),
- throttle_frame_production,
- display_refresh_interval);
-
- // We need to subtract an epsilon from Now() because some platforms have
- // a slow clock.
- output_surface.OnVSyncParametersChangedForTesting(
- base::TimeTicks::Now() - base::TimeDelta::FromMilliseconds(1),
- display_refresh_interval);
-
- output_surface.SetMaxFramesPending(2);
- output_surface.SetAlternateRetroactiveBeginFramePeriod(
- base::TimeDelta::FromSeconds(-1));
-
- // We should start off with 0 BeginFrames
- EXPECT_EQ(client.begin_frame_count(), 0);
- EXPECT_EQ(output_surface.pending_swap_buffers(), 0);
-
- // The first SetNeedsBeginFrame(true) should start a retroactive BeginFrame.
- output_surface.SetNeedsBeginFrame(true);
- EXPECT_TRUE(task_runner->HasPendingTask());
- EXPECT_GT(task_runner->NextPendingTaskDelay(), big_interval / 2);
- EXPECT_EQ(client.begin_frame_count(), 1);
-
- output_surface.SetNeedsBeginFrame(false);
- EXPECT_TRUE(task_runner->HasPendingTask());
- EXPECT_EQ(client.begin_frame_count(), 1);
-
- // The second SetNeedBeginFrame(true) should not retroactively start a
- // BeginFrame if the timestamp would be the same as the previous BeginFrame.
- output_surface.SetNeedsBeginFrame(true);
- EXPECT_TRUE(task_runner->HasPendingTask());
- EXPECT_EQ(client.begin_frame_count(), 1);
-}
-
TEST(OutputSurfaceTest, MemoryAllocation) {
scoped_ptr<TestWebGraphicsContext3D> scoped_context =
TestWebGraphicsContext3D::Create();
diff --git a/chromium/cc/output/software_renderer.cc b/chromium/cc/output/software_renderer.cc
index 7735e3c8c10..9bf2efef39f 100644
--- a/chromium/cc/output/software_renderer.cc
+++ b/chromium/cc/output/software_renderer.cc
@@ -19,6 +19,7 @@
#include "cc/quads/solid_color_draw_quad.h"
#include "cc/quads/texture_draw_quad.h"
#include "cc/quads/tile_draw_quad.h"
+#include "skia/ext/opacity_draw_filter.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkDevice.h"
@@ -310,27 +311,20 @@ void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame,
SkMatrix::kFill_ScaleToFit);
current_canvas_->concat(content_matrix);
- if (quad->ShouldDrawWithBlending()) {
- TRACE_EVENT0("cc", "SoftwareRenderer::DrawPictureQuad with blending");
- SkBitmap temp_bitmap;
- temp_bitmap.setConfig(SkBitmap::kARGB_8888_Config,
- quad->texture_size.width(),
- quad->texture_size.height());
- temp_bitmap.allocPixels();
- SkDevice temp_device(temp_bitmap);
- SkCanvas temp_canvas(&temp_device);
-
- quad->picture_pile->RasterToBitmap(
- &temp_canvas, quad->content_rect, quad->contents_scale, NULL);
+ // TODO(aelias): This isn't correct in all cases. We should detect these
+ // cases and fall back to a persistent bitmap backing
+ // (http://crbug.com/280374).
+ skia::RefPtr<SkDrawFilter> opacity_filter =
+ skia::AdoptRef(new skia::OpacityDrawFilter(quad->opacity(), true));
+ DCHECK(!current_canvas_->getDrawFilter());
+ current_canvas_->setDrawFilter(opacity_filter.get());
- current_paint_.setFilterBitmap(true);
- current_canvas_->drawBitmap(temp_bitmap, 0, 0, &current_paint_);
- } else {
- TRACE_EVENT0("cc",
- "SoftwareRenderer::DrawPictureQuad direct from PicturePile");
- quad->picture_pile->RasterDirect(
- current_canvas_, quad->content_rect, quad->contents_scale, NULL);
- }
+ TRACE_EVENT0("cc",
+ "SoftwareRenderer::DrawPictureQuad");
+ quad->picture_pile->RasterDirect(
+ current_canvas_, quad->content_rect, quad->contents_scale, NULL);
+
+ current_canvas_->setDrawFilter(NULL);
}
void SoftwareRenderer::DrawSolidColorQuad(const DrawingFrame* frame,
diff --git a/chromium/cc/resources/prioritized_tile_set.cc b/chromium/cc/resources/prioritized_tile_set.cc
index 6255be94137..5b40945e559 100644
--- a/chromium/cc/resources/prioritized_tile_set.cc
+++ b/chromium/cc/resources/prioritized_tile_set.cc
@@ -67,52 +67,37 @@ void SortBinTiles(ManagedTileBin bin, TileVector* tiles) {
} // namespace
-PrioritizedTileSet::PrioritizedTileSet() {
- for (int bin = 0; bin < NUM_BINS; ++bin)
- bin_sorted_[bin] = true;
-}
+PrioritizedTileSet::PrioritizedTileSet() {}
PrioritizedTileSet::~PrioritizedTileSet() {}
void PrioritizedTileSet::InsertTile(Tile* tile, ManagedTileBin bin) {
tiles_[bin].push_back(make_scoped_refptr(tile));
- bin_sorted_[bin] = false;
}
void PrioritizedTileSet::Clear() {
- for (int bin = 0; bin < NUM_BINS; ++bin) {
+ for (int bin = 0; bin < NUM_BINS; ++bin)
tiles_[bin].clear();
- bin_sorted_[bin] = true;
- }
}
-void PrioritizedTileSet::SortBinIfNeeded(ManagedTileBin bin) {
- if (!bin_sorted_[bin]) {
- SortBinTiles(bin, &tiles_[bin]);
- bin_sorted_[bin] = true;
- }
+void PrioritizedTileSet::Sort() {
+ for (int bin = 0; bin < NUM_BINS; ++bin)
+ SortBinTiles(static_cast<ManagedTileBin>(bin), &tiles_[bin]);
}
-PrioritizedTileSet::Iterator::Iterator(
- PrioritizedTileSet* tile_set, bool use_priority_ordering)
+PrioritizedTileSet::PriorityIterator::PriorityIterator(
+ PrioritizedTileSet* tile_set)
: tile_set_(tile_set),
current_bin_(NOW_AND_READY_TO_DRAW_BIN),
- use_priority_ordering_(use_priority_ordering) {
- if (use_priority_ordering_)
- tile_set_->SortBinIfNeeded(current_bin_);
- iterator_ = tile_set->tiles_[current_bin_].begin();
+ iterator_(tile_set->tiles_[current_bin_].begin()) {
if (iterator_ == tile_set_->tiles_[current_bin_].end())
AdvanceList();
}
-PrioritizedTileSet::Iterator::~Iterator() {}
-
-void PrioritizedTileSet::Iterator::DisablePriorityOrdering() {
- use_priority_ordering_ = false;
-}
+PrioritizedTileSet::PriorityIterator::~PriorityIterator() {}
-PrioritizedTileSet::Iterator&
-PrioritizedTileSet::Iterator::operator++() {
+PrioritizedTileSet::PriorityIterator&
+PrioritizedTileSet::PriorityIterator::operator++() {
// We can't increment past the end of the tiles.
DCHECK(iterator_ != tile_set_->tiles_[current_bin_].end());
@@ -122,20 +107,16 @@ PrioritizedTileSet::Iterator::operator++() {
return *this;
}
-Tile* PrioritizedTileSet::Iterator::operator*() {
+Tile* PrioritizedTileSet::PriorityIterator::operator*() {
DCHECK(iterator_ != tile_set_->tiles_[current_bin_].end());
return iterator_->get();
}
-void PrioritizedTileSet::Iterator::AdvanceList() {
+void PrioritizedTileSet::PriorityIterator::AdvanceList() {
DCHECK(iterator_ == tile_set_->tiles_[current_bin_].end());
while (current_bin_ != NEVER_BIN) {
current_bin_ = static_cast<ManagedTileBin>(current_bin_ + 1);
-
- if (use_priority_ordering_)
- tile_set_->SortBinIfNeeded(current_bin_);
-
iterator_ = tile_set_->tiles_[current_bin_].begin();
if (iterator_ != tile_set_->tiles_[current_bin_].end())
break;
diff --git a/chromium/cc/resources/prioritized_tile_set.h b/chromium/cc/resources/prioritized_tile_set.h
index 366179b05c8..fe1b2a0a941 100644
--- a/chromium/cc/resources/prioritized_tile_set.h
+++ b/chromium/cc/resources/prioritized_tile_set.h
@@ -22,16 +22,14 @@ class CC_EXPORT PrioritizedTileSet {
void InsertTile(Tile* tile, ManagedTileBin bin);
void Clear();
+ void Sort();
- class CC_EXPORT Iterator {
+ class CC_EXPORT PriorityIterator {
public:
- Iterator(PrioritizedTileSet* set, bool use_priority_ordering);
+ explicit PriorityIterator(PrioritizedTileSet* set);
+ ~PriorityIterator();
- ~Iterator();
-
- void DisablePriorityOrdering();
-
- Iterator& operator++();
+ PriorityIterator& operator++();
Tile* operator->() { return *(*this); }
Tile* operator*();
operator bool() const {
@@ -44,17 +42,13 @@ class CC_EXPORT PrioritizedTileSet {
PrioritizedTileSet* tile_set_;
ManagedTileBin current_bin_;
std::vector<scoped_refptr<Tile> >::iterator iterator_;
- bool use_priority_ordering_;
};
private:
- friend class Iterator;
-
- void SortBinIfNeeded(ManagedTileBin bin);
+ friend class PriorityIterator;
typedef scoped_refptr<Tile> TileRef;
std::vector<TileRef> tiles_[NUM_BINS];
- bool bin_sorted_[NUM_BINS];
};
} // namespace cc
diff --git a/chromium/cc/resources/prioritized_tile_set_unittest.cc b/chromium/cc/resources/prioritized_tile_set_unittest.cc
index e244aefdbb9..645fa04d497 100644
--- a/chromium/cc/resources/prioritized_tile_set_unittest.cc
+++ b/chromium/cc/resources/prioritized_tile_set_unittest.cc
@@ -83,12 +83,10 @@ class PrioritizedTileSetTest : public testing::Test {
};
TEST_F(PrioritizedTileSetTest, EmptyIterator) {
- // Creating an iterator to an empty set should work (but create iterator that
- // isn't valid).
-
PrioritizedTileSet set;
+ set.Sort();
- PrioritizedTileSet::Iterator it(&set, true);
+ PrioritizedTileSet::PriorityIterator it(&set);
EXPECT_FALSE(it);
}
@@ -96,8 +94,9 @@ TEST_F(PrioritizedTileSetTest, NonEmptyIterator) {
PrioritizedTileSet set;
scoped_refptr<Tile> tile = CreateTile();
set.InsertTile(tile, NOW_BIN);
+ set.Sort();
- PrioritizedTileSet::Iterator it(&set, true);
+ PrioritizedTileSet::PriorityIterator it(&set);
EXPECT_TRUE(it);
EXPECT_TRUE(*it == tile.get());
++it;
@@ -105,8 +104,6 @@ TEST_F(PrioritizedTileSetTest, NonEmptyIterator) {
}
TEST_F(PrioritizedTileSetTest, NowAndReadyToDrawBin) {
- // Ensure that tiles in NOW_AND_READY_TO_DRAW_BIN aren't sorted.
-
PrioritizedTileSet set;
TilePriority priorities[4] = {
TilePriorityForEventualBin(),
@@ -125,9 +122,11 @@ TEST_F(PrioritizedTileSetTest, NowAndReadyToDrawBin) {
}
}
+ set.Sort();
+
// Tiles should appear in the same order as inserted.
int i = 0;
- for (PrioritizedTileSet::Iterator it(&set, true);
+ for (PrioritizedTileSet::PriorityIterator it(&set);
it;
++it) {
EXPECT_TRUE(*it == tiles[i].get());
@@ -137,8 +136,6 @@ TEST_F(PrioritizedTileSetTest, NowAndReadyToDrawBin) {
}
TEST_F(PrioritizedTileSetTest, NowBin) {
- // Ensure that tiles in NOW_BIN are sorted according to BinComparator.
-
PrioritizedTileSet set;
TilePriority priorities[4] = {
TilePriorityForEventualBin(),
@@ -157,11 +154,13 @@ TEST_F(PrioritizedTileSetTest, NowBin) {
}
}
+ set.Sort();
+
// Tiles should appear in BinComparator order.
std::sort(tiles.begin(), tiles.end(), BinComparator());
int i = 0;
- for (PrioritizedTileSet::Iterator it(&set, true);
+ for (PrioritizedTileSet::PriorityIterator it(&set);
it;
++it) {
EXPECT_TRUE(*it == tiles[i].get());
@@ -171,8 +170,6 @@ TEST_F(PrioritizedTileSetTest, NowBin) {
}
TEST_F(PrioritizedTileSetTest, SoonBin) {
- // Ensure that tiles in SOON_BIN are sorted according to BinComparator.
-
PrioritizedTileSet set;
TilePriority priorities[4] = {
TilePriorityForEventualBin(),
@@ -191,43 +188,13 @@ TEST_F(PrioritizedTileSetTest, SoonBin) {
}
}
+ set.Sort();
+
// Tiles should appear in BinComparator order.
std::sort(tiles.begin(), tiles.end(), BinComparator());
int i = 0;
- for (PrioritizedTileSet::Iterator it(&set, true);
- it;
- ++it) {
- EXPECT_TRUE(*it == tiles[i].get());
- ++i;
- }
- EXPECT_EQ(20, i);
-}
-
-TEST_F(PrioritizedTileSetTest, SoonBinNoPriority) {
- // Ensure that when not using priority iterator, SOON_BIN tiles
- // are not sorted.
-
- PrioritizedTileSet set;
- TilePriority priorities[4] = {
- TilePriorityForEventualBin(),
- TilePriorityForNowBin(),
- TilePriority(),
- TilePriorityForSoonBin()};
-
- std::vector<scoped_refptr<Tile> > tiles;
- for (int priority = 0; priority < 4; ++priority) {
- for (int i = 0; i < 5; ++i) {
- scoped_refptr<Tile> tile = CreateTile();
- tile->SetPriority(ACTIVE_TREE, priorities[priority]);
- tile->SetPriority(PENDING_TREE, priorities[priority]);
- tiles.push_back(tile);
- set.InsertTile(tile, SOON_BIN);
- }
- }
-
- int i = 0;
- for (PrioritizedTileSet::Iterator it(&set, false);
+ for (PrioritizedTileSet::PriorityIterator it(&set);
it;
++it) {
EXPECT_TRUE(*it == tiles[i].get());
@@ -237,8 +204,6 @@ TEST_F(PrioritizedTileSetTest, SoonBinNoPriority) {
}
TEST_F(PrioritizedTileSetTest, EventuallyAndActiveBin) {
- // Ensure that EVENTUALLY_AND_ACTIVE_BIN tiles are sorted.
-
PrioritizedTileSet set;
TilePriority priorities[4] = {
TilePriorityForEventualBin(),
@@ -257,11 +222,13 @@ TEST_F(PrioritizedTileSetTest, EventuallyAndActiveBin) {
}
}
+ set.Sort();
+
// Tiles should appear in BinComparator order.
std::sort(tiles.begin(), tiles.end(), BinComparator());
int i = 0;
- for (PrioritizedTileSet::Iterator it(&set, true);
+ for (PrioritizedTileSet::PriorityIterator it(&set);
it;
++it) {
EXPECT_TRUE(*it == tiles[i].get());
@@ -271,8 +238,6 @@ TEST_F(PrioritizedTileSetTest, EventuallyAndActiveBin) {
}
TEST_F(PrioritizedTileSetTest, EventuallyBin) {
- // Ensure that EVENTUALLY_BIN tiles are sorted.
-
PrioritizedTileSet set;
TilePriority priorities[4] = {
TilePriorityForEventualBin(),
@@ -291,11 +256,13 @@ TEST_F(PrioritizedTileSetTest, EventuallyBin) {
}
}
+ set.Sort();
+
// Tiles should appear in BinComparator order.
std::sort(tiles.begin(), tiles.end(), BinComparator());
int i = 0;
- for (PrioritizedTileSet::Iterator it(&set, true);
+ for (PrioritizedTileSet::PriorityIterator it(&set);
it;
++it) {
EXPECT_TRUE(*it == tiles[i].get());
@@ -305,8 +272,6 @@ TEST_F(PrioritizedTileSetTest, EventuallyBin) {
}
TEST_F(PrioritizedTileSetTest, NeverAndActiveBin) {
- // Ensure that NEVER_AND_ACTIVE_BIN tiles are sorted.
-
PrioritizedTileSet set;
TilePriority priorities[4] = {
TilePriorityForEventualBin(),
@@ -325,11 +290,13 @@ TEST_F(PrioritizedTileSetTest, NeverAndActiveBin) {
}
}
+ set.Sort();
+
// Tiles should appear in BinComparator order.
std::sort(tiles.begin(), tiles.end(), BinComparator());
int i = 0;
- for (PrioritizedTileSet::Iterator it(&set, true);
+ for (PrioritizedTileSet::PriorityIterator it(&set);
it;
++it) {
EXPECT_TRUE(*it == tiles[i].get());
@@ -339,9 +306,6 @@ TEST_F(PrioritizedTileSetTest, NeverAndActiveBin) {
}
TEST_F(PrioritizedTileSetTest, NeverBin) {
- // Ensure that NEVER_BIN tiles are sorted, since they might not
- // be NEVER_BIN on a LOW_PRIORITY tree.
-
PrioritizedTileSet set;
TilePriority priorities[4] = {
TilePriorityForEventualBin(),
@@ -360,11 +324,13 @@ TEST_F(PrioritizedTileSetTest, NeverBin) {
}
}
+ set.Sort();
+
// Tiles should appear in BinComparator order.
std::sort(tiles.begin(), tiles.end(), BinComparator());
int i = 0;
- for (PrioritizedTileSet::Iterator it(&set, true);
+ for (PrioritizedTileSet::PriorityIterator it(&set);
it;
++it) {
EXPECT_TRUE(*it == tiles[i].get());
@@ -374,9 +340,6 @@ TEST_F(PrioritizedTileSetTest, NeverBin) {
}
TEST_F(PrioritizedTileSetTest, TilesForEachBin) {
- // Aggregate test with one tile for each of the bins, which
- // should appear in order of the bins.
-
scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
scoped_refptr<Tile> now_bin = CreateTile();
scoped_refptr<Tile> soon_bin = CreateTile();
@@ -394,8 +357,10 @@ TEST_F(PrioritizedTileSetTest, TilesForEachBin) {
set.InsertTile(never_bin, NEVER_BIN);
set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
+ set.Sort();
+
// Tiles should appear in order.
- PrioritizedTileSet::Iterator it(&set, true);
+ PrioritizedTileSet::PriorityIterator it(&set);
EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
++it;
EXPECT_TRUE(*it == now_bin.get());
@@ -413,229 +378,7 @@ TEST_F(PrioritizedTileSetTest, TilesForEachBin) {
EXPECT_FALSE(it);
}
-TEST_F(PrioritizedTileSetTest, ManyTilesForEachBin) {
- // Aggregate test with many tiles in each of the bins of various
- // priorities. Ensure that they are all returned in a sorted order.
-
- std::vector<scoped_refptr<Tile> > now_and_ready_to_draw_bins;
- std::vector<scoped_refptr<Tile> > now_bins;
- std::vector<scoped_refptr<Tile> > soon_bins;
- std::vector<scoped_refptr<Tile> > eventually_and_active_bins;
- std::vector<scoped_refptr<Tile> > eventually_bins;
- std::vector<scoped_refptr<Tile> > never_bins;
- std::vector<scoped_refptr<Tile> > never_and_active_bins;
-
- TilePriority priorities[4] = {
- TilePriorityForEventualBin(),
- TilePriorityForNowBin(),
- TilePriority(),
- TilePriorityForSoonBin()};
-
- PrioritizedTileSet set;
- for (int priority = 0; priority < 4; ++priority) {
- for (int i = 0; i < 5; ++i) {
- scoped_refptr<Tile> tile = CreateTile();
- tile->SetPriority(ACTIVE_TREE, priorities[priority]);
- tile->SetPriority(PENDING_TREE, priorities[priority]);
-
- now_and_ready_to_draw_bins.push_back(tile);
- now_bins.push_back(tile);
- soon_bins.push_back(tile);
- eventually_and_active_bins.push_back(tile);
- eventually_bins.push_back(tile);
- never_bins.push_back(tile);
- never_and_active_bins.push_back(tile);
-
- set.InsertTile(tile, NOW_AND_READY_TO_DRAW_BIN);
- set.InsertTile(tile, NOW_BIN);
- set.InsertTile(tile, SOON_BIN);
- set.InsertTile(tile, EVENTUALLY_AND_ACTIVE_BIN);
- set.InsertTile(tile, EVENTUALLY_BIN);
- set.InsertTile(tile, NEVER_BIN);
- set.InsertTile(tile, NEVER_AND_ACTIVE_BIN);
- }
- }
-
- PrioritizedTileSet::Iterator it(&set, true);
- std::vector<scoped_refptr<Tile> >::iterator vector_it;
-
- // Now and ready are not sorted.
- for (vector_it = now_and_ready_to_draw_bins.begin();
- vector_it != now_and_ready_to_draw_bins.end();
- ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- // Now bins are sorted.
- std::sort(now_bins.begin(), now_bins.end(), BinComparator());
- for (vector_it = now_bins.begin(); vector_it != now_bins.end(); ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- // Soon bins are sorted.
- std::sort(soon_bins.begin(), soon_bins.end(), BinComparator());
- for (vector_it = soon_bins.begin(); vector_it != soon_bins.end();
- ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- // Eventually and active bins are sorted.
- std::sort(eventually_and_active_bins.begin(),
- eventually_and_active_bins.end(),
- BinComparator());
- for (vector_it = eventually_and_active_bins.begin();
- vector_it != eventually_and_active_bins.end();
- ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- // Eventually bins are sorted.
- std::sort(eventually_bins.begin(), eventually_bins.end(), BinComparator());
- for (vector_it = eventually_bins.begin(); vector_it != eventually_bins.end();
- ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- // Never and active bins are sorted.
- std::sort(never_and_active_bins.begin(),
- never_and_active_bins.end(),
- BinComparator());
- for (vector_it = never_and_active_bins.begin();
- vector_it != never_and_active_bins.end();
- ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- // Never bins are sorted.
- std::sort(never_bins.begin(), never_bins.end(), BinComparator());
- for (vector_it = never_bins.begin(); vector_it != never_bins.end();
- ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- EXPECT_FALSE(it);
-}
-
-TEST_F(PrioritizedTileSetTest, ManyTilesForEachBinDisablePriority) {
- // Aggregate test with many tiles for each of the bins. Tiles should
- // appear in order, until DisablePriorityOrdering is called. After that
- // tiles should appear in the order they were inserted.
-
- std::vector<scoped_refptr<Tile> > now_and_ready_to_draw_bins;
- std::vector<scoped_refptr<Tile> > now_bins;
- std::vector<scoped_refptr<Tile> > soon_bins;
- std::vector<scoped_refptr<Tile> > eventually_and_active_bins;
- std::vector<scoped_refptr<Tile> > eventually_bins;
- std::vector<scoped_refptr<Tile> > never_bins;
- std::vector<scoped_refptr<Tile> > never_and_active_bins;
-
- TilePriority priorities[4] = {
- TilePriorityForEventualBin(),
- TilePriorityForNowBin(),
- TilePriority(),
- TilePriorityForSoonBin()};
-
- PrioritizedTileSet set;
- for (int priority = 0; priority < 4; ++priority) {
- for (int i = 0; i < 5; ++i) {
- scoped_refptr<Tile> tile = CreateTile();
- tile->SetPriority(ACTIVE_TREE, priorities[priority]);
- tile->SetPriority(PENDING_TREE, priorities[priority]);
-
- now_and_ready_to_draw_bins.push_back(tile);
- now_bins.push_back(tile);
- soon_bins.push_back(tile);
- eventually_and_active_bins.push_back(tile);
- eventually_bins.push_back(tile);
- never_bins.push_back(tile);
- never_and_active_bins.push_back(tile);
-
- set.InsertTile(tile, NOW_AND_READY_TO_DRAW_BIN);
- set.InsertTile(tile, NOW_BIN);
- set.InsertTile(tile, SOON_BIN);
- set.InsertTile(tile, EVENTUALLY_AND_ACTIVE_BIN);
- set.InsertTile(tile, EVENTUALLY_BIN);
- set.InsertTile(tile, NEVER_BIN);
- set.InsertTile(tile, NEVER_AND_ACTIVE_BIN);
- }
- }
-
- PrioritizedTileSet::Iterator it(&set, true);
- std::vector<scoped_refptr<Tile> >::iterator vector_it;
-
- // Now and ready are not sorted.
- for (vector_it = now_and_ready_to_draw_bins.begin();
- vector_it != now_and_ready_to_draw_bins.end();
- ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- // Now bins are sorted.
- std::sort(now_bins.begin(), now_bins.end(), BinComparator());
- for (vector_it = now_bins.begin(); vector_it != now_bins.end(); ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- // Soon bins are sorted.
- std::sort(soon_bins.begin(), soon_bins.end(), BinComparator());
- for (vector_it = soon_bins.begin(); vector_it != soon_bins.end();
- ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- // After we disable priority ordering, we already have sorted the next vector.
- it.DisablePriorityOrdering();
-
- // Eventually and active bins are sorted.
- std::sort(eventually_and_active_bins.begin(),
- eventually_and_active_bins.end(),
- BinComparator());
- for (vector_it = eventually_and_active_bins.begin();
- vector_it != eventually_and_active_bins.end();
- ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- // Eventually bins are not sorted.
- for (vector_it = eventually_bins.begin(); vector_it != eventually_bins.end();
- ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- // Never and active bins are not sorted.
- for (vector_it = never_and_active_bins.begin();
- vector_it != never_and_active_bins.end();
- ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- // Never bins are not sorted.
- for (vector_it = never_bins.begin(); vector_it != never_bins.end();
- ++vector_it) {
- EXPECT_TRUE(*vector_it == *it);
- ++it;
- }
-
- EXPECT_FALSE(it);
-}
-
TEST_F(PrioritizedTileSetTest, TilesForFirstAndLastBins) {
- // Make sure that if we have empty lists between two non-empty lists,
- // we just get two tiles from the iterator.
-
scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
scoped_refptr<Tile> never_bin = CreateTile();
@@ -643,8 +386,10 @@ TEST_F(PrioritizedTileSetTest, TilesForFirstAndLastBins) {
set.InsertTile(never_bin, NEVER_BIN);
set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
+ set.Sort();
+
// Only two tiles should appear and they should appear in order.
- PrioritizedTileSet::Iterator it(&set, true);
+ PrioritizedTileSet::PriorityIterator it(&set);
EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
++it;
EXPECT_TRUE(*it == never_bin.get());
@@ -653,8 +398,6 @@ TEST_F(PrioritizedTileSetTest, TilesForFirstAndLastBins) {
}
TEST_F(PrioritizedTileSetTest, MultipleIterators) {
- // Ensure that multiple iterators don't interfere with each other.
-
scoped_refptr<Tile> now_and_ready_to_draw_bin = CreateTile();
scoped_refptr<Tile> now_bin = CreateTile();
scoped_refptr<Tile> soon_bin = CreateTile();
@@ -668,8 +411,10 @@ TEST_F(PrioritizedTileSetTest, MultipleIterators) {
set.InsertTile(never_bin, NEVER_BIN);
set.InsertTile(now_and_ready_to_draw_bin, NOW_AND_READY_TO_DRAW_BIN);
+ set.Sort();
+
// Tiles should appear in order.
- PrioritizedTileSet::Iterator it(&set, true);
+ PrioritizedTileSet::PriorityIterator it(&set);
EXPECT_TRUE(*it == now_and_ready_to_draw_bin.get());
++it;
EXPECT_TRUE(*it == now_bin.get());
@@ -683,7 +428,7 @@ TEST_F(PrioritizedTileSetTest, MultipleIterators) {
EXPECT_FALSE(it);
// Creating multiple iterators shouldn't affect old iterators.
- PrioritizedTileSet::Iterator second_it(&set, true);
+ PrioritizedTileSet::PriorityIterator second_it(&set);
EXPECT_TRUE(second_it);
EXPECT_FALSE(it);
@@ -693,7 +438,7 @@ TEST_F(PrioritizedTileSetTest, MultipleIterators) {
EXPECT_TRUE(second_it);
EXPECT_FALSE(it);
- PrioritizedTileSet::Iterator third_it(&set, true);
+ PrioritizedTileSet::PriorityIterator third_it(&set);
EXPECT_TRUE(third_it);
++second_it;
++second_it;
@@ -716,7 +461,7 @@ TEST_F(PrioritizedTileSetTest, MultipleIterators) {
set.Clear();
- PrioritizedTileSet::Iterator empty_it(&set, true);
+ PrioritizedTileSet::PriorityIterator empty_it(&set);
EXPECT_FALSE(empty_it);
}
diff --git a/chromium/cc/resources/resource_pool.cc b/chromium/cc/resources/resource_pool.cc
index 5835db565d3..06bc1fbe8fd 100644
--- a/chromium/cc/resources/resource_pool.cc
+++ b/chromium/cc/resources/resource_pool.cc
@@ -31,19 +31,20 @@ ResourcePool::ResourcePool(ResourceProvider* resource_provider)
: resource_provider_(resource_provider),
max_memory_usage_bytes_(0),
max_unused_memory_usage_bytes_(0),
+ max_resource_count_(0),
memory_usage_bytes_(0),
unused_memory_usage_bytes_(0),
- num_resources_limit_(0) {
+ resource_count_(0) {
}
ResourcePool::~ResourcePool() {
- SetMemoryUsageLimits(0, 0, 0);
+ SetResourceUsageLimits(0, 0, 0);
}
scoped_ptr<ResourcePool::Resource> ResourcePool::AcquireResource(
gfx::Size size, GLenum format) {
- for (ResourceList::iterator it = resources_.begin();
- it != resources_.end(); ++it) {
+ for (ResourceList::iterator it = unused_resources_.begin();
+ it != unused_resources_.end(); ++it) {
Resource* resource = *it;
// TODO(epenner): It would be nice to DCHECK that this
@@ -57,14 +58,13 @@ scoped_ptr<ResourcePool::Resource> ResourcePool::AcquireResource(
if (resource->format() != format)
continue;
- resources_.erase(it);
+ unused_resources_.erase(it);
unused_memory_usage_bytes_ -= resource->bytes();
return make_scoped_ptr(resource);
}
// Create new resource.
- Resource* resource = new Resource(
- resource_provider_, size, format);
+ Resource* resource = new Resource(resource_provider_, size, format);
// Extend all read locks on all resources until the resource is
// finished being used, such that we know when resources are
@@ -72,44 +72,51 @@ scoped_ptr<ResourcePool::Resource> ResourcePool::AcquireResource(
resource_provider_->EnableReadLockFences(resource->id(), true);
memory_usage_bytes_ += resource->bytes();
+ ++resource_count_;
return make_scoped_ptr(resource);
}
void ResourcePool::ReleaseResource(
scoped_ptr<ResourcePool::Resource> resource) {
- if (MemoryUsageTooHigh()) {
+ if (ResourceUsageTooHigh()) {
memory_usage_bytes_ -= resource->bytes();
+ --resource_count_;
return;
}
unused_memory_usage_bytes_ += resource->bytes();
- resources_.push_back(resource.release());
+ unused_resources_.push_back(resource.release());
}
-void ResourcePool::SetMemoryUsageLimits(
+void ResourcePool::SetResourceUsageLimits(
size_t max_memory_usage_bytes,
size_t max_unused_memory_usage_bytes,
- size_t num_resources_limit) {
+ size_t max_resource_count) {
max_memory_usage_bytes_ = max_memory_usage_bytes;
max_unused_memory_usage_bytes_ = max_unused_memory_usage_bytes;
- num_resources_limit_ = num_resources_limit;
+ max_resource_count_ = max_resource_count;
- while (!resources_.empty()) {
- if (!MemoryUsageTooHigh())
+ ReduceResourceUsage();
+}
+
+void ResourcePool::ReduceResourceUsage() {
+ while (!unused_resources_.empty()) {
+ if (!ResourceUsageTooHigh())
break;
// MRU eviction pattern as least recently used is less likely to
// be blocked by read lock fence.
- Resource* resource = resources_.back();
- resources_.pop_back();
+ Resource* resource = unused_resources_.back();
+ unused_resources_.pop_back();
memory_usage_bytes_ -= resource->bytes();
unused_memory_usage_bytes_ -= resource->bytes();
+ --resource_count_;
delete resource;
}
}
-bool ResourcePool::MemoryUsageTooHigh() {
- if (resources_.size() > num_resources_limit_)
+bool ResourcePool::ResourceUsageTooHigh() {
+ if (resource_count_ > max_resource_count_)
return true;
if (memory_usage_bytes_ > max_memory_usage_bytes_)
return true;
diff --git a/chromium/cc/resources/resource_pool.h b/chromium/cc/resources/resource_pool.h
index 309bf33f30b..f6bb8652476 100644
--- a/chromium/cc/resources/resource_pool.h
+++ b/chromium/cc/resources/resource_pool.h
@@ -40,33 +40,35 @@ class CC_EXPORT ResourcePool {
GLenum format);
void ReleaseResource(scoped_ptr<ResourcePool::Resource>);
- void SetMemoryUsageLimits(size_t max_memory_usage_bytes,
- size_t max_unused_memory_usage_bytes,
- size_t num_resources_limit);
+ void SetResourceUsageLimits(size_t max_memory_usage_bytes,
+ size_t max_unused_memory_usage_bytes,
+ size_t max_resource_count);
+
+ void ReduceResourceUsage();
- size_t total_memory_usage_bytes() const {
- return memory_usage_bytes_;
- }
size_t acquired_memory_usage_bytes() const {
return memory_usage_bytes_ - unused_memory_usage_bytes_;
}
- size_t NumResources() const { return resources_.size(); }
+ size_t acquired_resource_count() const {
+ return resource_count_ - unused_resources_.size();
+ }
protected:
explicit ResourcePool(ResourceProvider* resource_provider);
- bool MemoryUsageTooHigh();
+ bool ResourceUsageTooHigh();
private:
ResourceProvider* resource_provider_;
size_t max_memory_usage_bytes_;
size_t max_unused_memory_usage_bytes_;
+ size_t max_resource_count_;
size_t memory_usage_bytes_;
size_t unused_memory_usage_bytes_;
- size_t num_resources_limit_;
+ size_t resource_count_;
typedef std::list<Resource*> ResourceList;
- ResourceList resources_;
+ ResourceList unused_resources_;
DISALLOW_COPY_AND_ASSIGN(ResourcePool);
};
diff --git a/chromium/cc/resources/resource_provider_unittest.cc b/chromium/cc/resources/resource_provider_unittest.cc
index ad6b3d36f2a..a23af0b577c 100644
--- a/chromium/cc/resources/resource_provider_unittest.cc
+++ b/chromium/cc/resources/resource_provider_unittest.cc
@@ -11,10 +11,10 @@
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "cc/base/scoped_ptr_deque.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
#include "cc/output/output_surface.h"
#include "cc/test/fake_output_surface.h"
#include "cc/test/fake_output_surface_client.h"
+#include "cc/test/test_web_graphics_context_3d.h"
#include "gpu/GLES2/gl2extchromium.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/cc/resources/resource_update_controller_unittest.cc b/chromium/cc/resources/resource_update_controller_unittest.cc
index 9dcb23ca124..1060801934b 100644
--- a/chromium/cc/resources/resource_update_controller_unittest.cc
+++ b/chromium/cc/resources/resource_update_controller_unittest.cc
@@ -5,11 +5,11 @@
#include "cc/resources/resource_update_controller.h"
#include "base/test/test_simple_task_runner.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
#include "cc/resources/prioritized_resource_manager.h"
#include "cc/test/fake_output_surface.h"
#include "cc/test/fake_proxy.h"
#include "cc/test/scheduler_test_common.h"
+#include "cc/test/test_web_graphics_context_3d.h"
#include "cc/test/tiled_layer_test_common.h"
#include "cc/trees/single_thread_proxy.h" // For DebugScopedSetImplThread
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/cc/resources/tile_manager.cc b/chromium/cc/resources/tile_manager.cc
index 7cf5096ce3b..e6850bcfd84 100644
--- a/chromium/cc/resources/tile_manager.cc
+++ b/chromium/cc/resources/tile_manager.cc
@@ -175,7 +175,7 @@ TileManager::~TileManager() {
void TileManager::SetGlobalState(
const GlobalStateThatImpactsTilePriority& global_state) {
global_state_ = global_state;
- resource_pool_->SetMemoryUsageLimits(
+ resource_pool_->SetResourceUsageLimits(
global_state_.memory_limit_in_bytes,
global_state_.unused_memory_limit_in_bytes,
global_state_.num_resources_limit);
@@ -347,6 +347,7 @@ void TileManager::GetPrioritizedTileSet(PrioritizedTileSet* tiles) {
TRACE_EVENT0("cc", "TileManager::GetPrioritizedTileSet");
GetTilesWithAssignedBins(tiles);
+ tiles->Sort();
}
void TileManager::ManageTiles() {
@@ -362,16 +363,12 @@ void TileManager::ManageTiles() {
&tiles_that_need_to_be_rasterized);
CleanUpUnusedImageDecodeTasks();
- // Finally, schedule rasterizer tasks.
- ScheduleTasks(tiles_that_need_to_be_rasterized);
-
TRACE_EVENT_INSTANT1(
"cc", "DidManage", TRACE_EVENT_SCOPE_THREAD,
"state", TracedValue::FromValue(BasicStateAsValue().release()));
- TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
- resource_pool_->total_memory_usage_bytes() -
- resource_pool_->acquired_memory_usage_bytes());
+ // Finally, schedule rasterizer tasks.
+ ScheduleTasks(tiles_that_need_to_be_rasterized);
}
bool TileManager::UpdateVisibleTiles() {
@@ -394,11 +391,9 @@ bool TileManager::UpdateVisibleTiles() {
void TileManager::GetMemoryStats(
size_t* memory_required_bytes,
size_t* memory_nice_to_have_bytes,
- size_t* memory_allocated_bytes,
size_t* memory_used_bytes) const {
*memory_required_bytes = 0;
*memory_nice_to_have_bytes = 0;
- *memory_allocated_bytes = resource_pool_->total_memory_usage_bytes();
*memory_used_bytes = resource_pool_->acquired_memory_usage_bytes();
for (TileMap::const_iterator it = tiles_.begin();
it != tiles_.end();
@@ -445,16 +440,13 @@ scoped_ptr<base::Value> TileManager::GetMemoryRequirementsAsValue() const {
size_t memory_required_bytes;
size_t memory_nice_to_have_bytes;
- size_t memory_allocated_bytes;
size_t memory_used_bytes;
GetMemoryStats(&memory_required_bytes,
&memory_nice_to_have_bytes,
- &memory_allocated_bytes,
&memory_used_bytes);
requirements->SetInteger("memory_required_bytes", memory_required_bytes);
requirements->SetInteger("memory_nice_to_have_bytes",
memory_nice_to_have_bytes);
- requirements->SetInteger("memory_allocated_bytes", memory_allocated_bytes);
requirements->SetInteger("memory_used_bytes", memory_used_bytes);
return requirements.PassAs<base::Value>();
}
@@ -487,7 +479,7 @@ void TileManager::AssignGpuMemoryToTiles(
// the needs-to-be-rasterized queue.
size_t bytes_releasable = 0;
size_t resources_releasable = 0;
- for (PrioritizedTileSet::Iterator it(tiles, false);
+ for (PrioritizedTileSet::PriorityIterator it(tiles);
it;
++it) {
const Tile* tile = *it;
@@ -509,9 +501,10 @@ void TileManager::AssignGpuMemoryToTiles(
static_cast<int64>(bytes_releasable) +
static_cast<int64>(global_state_.memory_limit_in_bytes) -
static_cast<int64>(resource_pool_->acquired_memory_usage_bytes());
- int resources_available = resources_releasable +
- global_state_.num_resources_limit -
- resource_pool_->NumResources();
+ int resources_available =
+ resources_releasable +
+ global_state_.num_resources_limit -
+ resource_pool_->acquired_resource_count();
size_t bytes_allocatable =
std::max(static_cast<int64>(0), bytes_available);
@@ -523,7 +516,7 @@ void TileManager::AssignGpuMemoryToTiles(
bool oomed = false;
unsigned schedule_priority = 1u;
- for (PrioritizedTileSet::Iterator it(tiles, true);
+ for (PrioritizedTileSet::PriorityIterator it(tiles);
it;
++it) {
Tile* tile = *it;
@@ -606,7 +599,6 @@ void TileManager::AssignGpuMemoryToTiles(
all_tiles_that_need_to_be_rasterized_have_memory_ = false;
if (tile->required_for_activation())
all_tiles_required_for_activation_have_memory_ = false;
- it.DisablePriorityOrdering();
continue;
}
@@ -709,6 +701,10 @@ void TileManager::ScheduleTasks(
tasks.Append(tile_version.raster_task_, tile->required_for_activation());
}
+ // We must reduce the amount of unused resoruces before calling
+ // ScheduleTasks to prevent usage from rising above limits.
+ resource_pool_->ReduceResourceUsage();
+
// Schedule running of |tasks|. This replaces any previously
// scheduled tasks and effectively cancels all tasks not present
// in |tasks|.
diff --git a/chromium/cc/resources/tile_manager.h b/chromium/cc/resources/tile_manager.h
index 7957fc823f2..2e226c9999d 100644
--- a/chromium/cc/resources/tile_manager.h
+++ b/chromium/cc/resources/tile_manager.h
@@ -69,7 +69,6 @@ class CC_EXPORT TileManager : public RasterWorkerPoolClient {
scoped_ptr<base::Value> AllTilesAsValue() const;
void GetMemoryStats(size_t* memory_required_bytes,
size_t* memory_nice_to_have_bytes,
- size_t* memory_allocated_bytes,
size_t* memory_used_bytes) const;
const MemoryHistory::Entry& memory_stats_from_last_assign() const {
diff --git a/chromium/cc/resources/video_resource_updater_unittest.cc b/chromium/cc/resources/video_resource_updater_unittest.cc
index ca6ebd0d117..ff574fff7fb 100644
--- a/chromium/cc/resources/video_resource_updater_unittest.cc
+++ b/chromium/cc/resources/video_resource_updater_unittest.cc
@@ -5,9 +5,9 @@
#include "cc/resources/video_resource_updater.h"
#include "base/memory/shared_memory.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
#include "cc/resources/resource_provider.h"
#include "cc/test/fake_output_surface.h"
+#include "cc/test/test_web_graphics_context_3d.h"
#include "media/base/video_frame.h"
#include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromium/cc/scheduler/delay_based_time_source.cc b/chromium/cc/scheduler/delay_based_time_source.cc
index a5b6f738df8..44003970b35 100644
--- a/chromium/cc/scheduler/delay_based_time_source.cc
+++ b/chromium/cc/scheduler/delay_based_time_source.cc
@@ -17,10 +17,10 @@ namespace cc {
namespace {
-// kDoubleTickDivisor prevents ticks from running within the specified
+// kDoubleTickThreshold prevents ticks from running within the specified
// fraction of an interval. This helps account for jitter in the timebase as
// well as quick timer reactivation.
-static const int kDoubleTickDivisor = 2;
+static const double kDoubleTickThreshold = 0.25;
// kIntervalChangeThreshold is the fraction of the interval that will trigger an
// immediate interval change. kPhaseChangeThreshold is the fraction of the
@@ -42,42 +42,43 @@ scoped_refptr<DelayBasedTimeSource> DelayBasedTimeSource::Create(
DelayBasedTimeSource::DelayBasedTimeSource(
base::TimeDelta interval, base::SingleThreadTaskRunner* task_runner)
: client_(NULL),
- last_tick_time_(base::TimeTicks() - interval),
+ has_tick_target_(false),
current_parameters_(interval, base::TimeTicks()),
next_parameters_(interval, base::TimeTicks()),
- active_(false),
+ state_(STATE_INACTIVE),
task_runner_(task_runner),
weak_factory_(this) {}
DelayBasedTimeSource::~DelayBasedTimeSource() {}
-base::TimeTicks DelayBasedTimeSource::SetActive(bool active) {
+void DelayBasedTimeSource::SetActive(bool active) {
TRACE_EVENT1("cc", "DelayBasedTimeSource::SetActive", "active", active);
- if (active == active_)
- return base::TimeTicks();
- active_ = active;
-
- if (!active_) {
+ if (!active) {
+ state_ = STATE_INACTIVE;
weak_factory_.InvalidateWeakPtrs();
- return base::TimeTicks();
+ return;
}
- PostNextTickTask(Now());
+ if (state_ == STATE_STARTING || state_ == STATE_ACTIVE)
+ return;
- // Determine if there was a tick that was missed while not active.
- base::TimeTicks last_tick_time_if_always_active =
- current_parameters_.tick_target - current_parameters_.interval;
- base::TimeTicks new_tick_time_threshold =
- last_tick_time_ + current_parameters_.interval / kDoubleTickDivisor;
- if (last_tick_time_if_always_active > new_tick_time_threshold) {
- last_tick_time_ = last_tick_time_if_always_active;
- return last_tick_time_;
+ if (!has_tick_target_) {
+ // Becoming active the first time is deferred: we post a 0-delay task.
+ // When it runs, we use that to establish the timebase, become truly
+ // active, and fire the first tick.
+ state_ = STATE_STARTING;
+ task_runner_->PostTask(FROM_HERE,
+ base::Bind(&DelayBasedTimeSource::OnTimerFired,
+ weak_factory_.GetWeakPtr()));
+ return;
}
- return base::TimeTicks();
+ state_ = STATE_ACTIVE;
+
+ PostNextTickTask(Now());
}
-bool DelayBasedTimeSource::Active() const { return active_; }
+bool DelayBasedTimeSource::Active() const { return state_ != STATE_INACTIVE; }
base::TimeTicks DelayBasedTimeSource::LastTickTime() { return last_tick_time_; }
@@ -86,11 +87,17 @@ base::TimeTicks DelayBasedTimeSource::NextTickTime() {
}
void DelayBasedTimeSource::OnTimerFired() {
- DCHECK(active_);
+ DCHECK(state_ != STATE_INACTIVE);
- last_tick_time_ = current_parameters_.tick_target;
+ base::TimeTicks now = this->Now();
+ last_tick_time_ = now;
- PostNextTickTask(Now());
+ if (state_ == STATE_STARTING) {
+ SetTimebaseAndInterval(now, current_parameters_.interval);
+ state_ = STATE_ACTIVE;
+ }
+
+ PostNextTickTask(now);
// Fire the tick.
if (client_)
@@ -105,8 +112,9 @@ void DelayBasedTimeSource::SetTimebaseAndInterval(base::TimeTicks timebase,
base::TimeDelta interval) {
next_parameters_.interval = interval;
next_parameters_.tick_target = timebase;
+ has_tick_target_ = true;
- if (!active_) {
+ if (state_ != STATE_ACTIVE) {
// If we aren't active, there's no need to reset the timer.
return;
}
@@ -117,8 +125,6 @@ void DelayBasedTimeSource::SetTimebaseAndInterval(base::TimeTicks timebase,
std::abs((interval - current_parameters_.interval).InSecondsF());
double interval_change = interval_delta / interval.InSecondsF();
if (interval_change > kIntervalChangeThreshold) {
- TRACE_EVENT_INSTANT0("cc", "DelayBasedTimeSource::IntervalChanged",
- TRACE_EVENT_SCOPE_THREAD);
SetActive(false);
SetActive(true);
return;
@@ -136,8 +142,6 @@ void DelayBasedTimeSource::SetTimebaseAndInterval(base::TimeTicks timebase,
fmod(target_delta, interval.InSecondsF()) / interval.InSecondsF();
if (phase_change > kPhaseChangeThreshold &&
phase_change < (1.0 - kPhaseChangeThreshold)) {
- TRACE_EVENT_INSTANT0("cc", "DelayBasedTimeSource::PhaseChanged",
- TRACE_EVENT_SCOPE_THREAD);
SetActive(false);
SetActive(true);
return;
@@ -203,32 +207,26 @@ base::TimeTicks DelayBasedTimeSource::Now() const {
// now=37 tick_target=16.667 new_target=50.000 -->
// tick(), PostDelayedTask(floor(50.000-37)) --> PostDelayedTask(13)
base::TimeTicks DelayBasedTimeSource::NextTickTarget(base::TimeTicks now) {
- const base::TimeDelta epsilon(base::TimeDelta::FromMicroseconds(1));
base::TimeDelta new_interval = next_parameters_.interval;
-
- // Integer division rounds towards 0, but we always want to round down the
- // number of intervals_elapsed, so we need the extra condition here.
- int intervals_elapsed;
- if (next_parameters_.tick_target < now) {
- intervals_elapsed =
- (now - next_parameters_.tick_target + new_interval - epsilon) /
- new_interval;
- } else {
- intervals_elapsed = (now - next_parameters_.tick_target) / new_interval;
- }
- base::TimeTicks new_tick_target =
+ int intervals_elapsed =
+ static_cast<int>(floor((now - next_parameters_.tick_target).InSecondsF() /
+ new_interval.InSecondsF()));
+ base::TimeTicks last_effective_tick =
next_parameters_.tick_target + new_interval * intervals_elapsed;
- DCHECK(now <= new_tick_target)
+ base::TimeTicks new_tick_target = last_effective_tick + new_interval;
+ DCHECK(now < new_tick_target)
<< "now = " << now.ToInternalValue()
<< "; new_tick_target = " << new_tick_target.ToInternalValue()
<< "; new_interval = " << new_interval.InMicroseconds()
<< "; tick_target = " << next_parameters_.tick_target.ToInternalValue()
- << "; intervals_elapsed = " << intervals_elapsed;
+ << "; intervals_elapsed = " << intervals_elapsed
+ << "; last_effective_tick = " << last_effective_tick.ToInternalValue();
// Avoid double ticks when:
// 1) Turning off the timer and turning it right back on.
// 2) Jittery data is passed to SetTimebaseAndInterval().
- if (new_tick_target - last_tick_time_ <= new_interval / kDoubleTickDivisor)
+ if (new_tick_target - last_tick_time_ <=
+ new_interval / static_cast<int>(1.0 / kDoubleTickThreshold))
new_tick_target += new_interval;
return new_tick_target;
@@ -238,9 +236,10 @@ void DelayBasedTimeSource::PostNextTickTask(base::TimeTicks now) {
base::TimeTicks new_tick_target = NextTickTarget(now);
// Post another task *before* the tick and update state
- base::TimeDelta delay;
- if (now <= new_tick_target)
- delay = new_tick_target - now;
+ base::TimeDelta delay = new_tick_target - now;
+ DCHECK(delay.InMillisecondsF() <=
+ next_parameters_.interval.InMillisecondsF() *
+ (1.0 + kDoubleTickThreshold));
task_runner_->PostDelayedTask(FROM_HERE,
base::Bind(&DelayBasedTimeSource::OnTimerFired,
weak_factory_.GetWeakPtr()),
diff --git a/chromium/cc/scheduler/delay_based_time_source.h b/chromium/cc/scheduler/delay_based_time_source.h
index 55aac5a97fb..1dc4d6fff11 100644
--- a/chromium/cc/scheduler/delay_based_time_source.h
+++ b/chromium/cc/scheduler/delay_based_time_source.h
@@ -27,7 +27,7 @@ class CC_EXPORT DelayBasedTimeSource : public TimeSource {
virtual void SetTimebaseAndInterval(base::TimeTicks timebase,
base::TimeDelta interval) OVERRIDE;
- virtual base::TimeTicks SetActive(bool active) OVERRIDE;
+ virtual void SetActive(bool active) OVERRIDE;
virtual bool Active() const OVERRIDE;
// Get the last and next tick times. nextTimeTime() returns null when
@@ -47,6 +47,12 @@ class CC_EXPORT DelayBasedTimeSource : public TimeSource {
void PostNextTickTask(base::TimeTicks now);
void OnTimerFired();
+ enum State {
+ STATE_INACTIVE,
+ STATE_STARTING,
+ STATE_ACTIVE,
+ };
+
struct Parameters {
Parameters(base::TimeDelta interval, base::TimeTicks tick_target)
: interval(interval), tick_target(tick_target) {}
@@ -55,6 +61,7 @@ class CC_EXPORT DelayBasedTimeSource : public TimeSource {
};
TimeSourceClient* client_;
+ bool has_tick_target_;
base::TimeTicks last_tick_time_;
// current_parameters_ should only be written by PostNextTickTask.
@@ -64,7 +71,7 @@ class CC_EXPORT DelayBasedTimeSource : public TimeSource {
Parameters current_parameters_;
Parameters next_parameters_;
- bool active_;
+ State state_;
base::SingleThreadTaskRunner* task_runner_;
base::WeakPtrFactory<DelayBasedTimeSource> weak_factory_;
diff --git a/chromium/cc/scheduler/delay_based_time_source_unittest.cc b/chromium/cc/scheduler/delay_based_time_source_unittest.cc
index 77d570f1d92..df84c978e57 100644
--- a/chromium/cc/scheduler/delay_based_time_source_unittest.cc
+++ b/chromium/cc/scheduler/delay_based_time_source_unittest.cc
@@ -88,7 +88,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenExactlyOnRequestedTime) {
FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
timer->SetClient(&client);
timer->SetActive(true);
- // Run the first tick.
+ // Run the first task, as that activates the timer and picks up a timebase.
task_runner->RunPendingTasks();
EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
@@ -109,7 +109,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenSlightlyAfterRequestedTime) {
FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
timer->SetClient(&client);
timer->SetActive(true);
- // Run the first tick.
+ // Run the first task, as that activates the timer and picks up a timebase.
task_runner->RunPendingTasks();
EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
@@ -122,7 +122,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenSlightlyAfterRequestedTime) {
}
// At 60Hz, when the tick returns at exactly 2*interval after the requested next
-// time, make sure a 0ms next delay is posted.
+// time, make sure a 16ms next delay is posted.
TEST(DelayBasedTimeSource, NextDelaySaneWhenExactlyTwiceAfterRequestedTime) {
scoped_refptr<base::TestSimpleTaskRunner> task_runner =
new base::TestSimpleTaskRunner;
@@ -131,7 +131,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenExactlyTwiceAfterRequestedTime) {
FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
timer->SetClient(&client);
timer->SetActive(true);
- // Run the first tick.
+ // Run the first task, as that activates the timer and picks up a timebase.
task_runner->RunPendingTasks();
EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
@@ -139,7 +139,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenExactlyTwiceAfterRequestedTime) {
timer->SetNow(timer->Now() + 2 * Interval());
task_runner->RunPendingTasks();
- EXPECT_EQ(0, task_runner->NextPendingTaskDelay().InMilliseconds());
+ EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
}
// At 60Hz, when the tick returns at 2*interval and a bit after the requested
@@ -152,7 +152,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenSlightlyAfterTwiceRequestedTime) {
FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
timer->SetClient(&client);
timer->SetActive(true);
- // Run the first tick.
+ // Run the first task, as that activates the timer and picks up a timebase.
task_runner->RunPendingTasks();
EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
@@ -174,7 +174,7 @@ TEST(DelayBasedTimeSource, NextDelaySaneWhenHalfAfterRequestedTime) {
FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
timer->SetClient(&client);
timer->SetActive(true);
- // Run the first tick.
+ // Run the first task, as that activates the timer and picks up a timebase.
task_runner->RunPendingTasks();
EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
@@ -196,7 +196,7 @@ TEST(DelayBasedTimeSource, SaneHandlingOfJitteryTimebase) {
FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
timer->SetClient(&client);
timer->SetActive(true);
- // Run the first tick.
+ // Run the first task, as that activates the timer and picks up a timebase.
task_runner->RunPendingTasks();
EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
@@ -227,7 +227,7 @@ TEST(DelayBasedTimeSource, HandlesSignificantTimebaseChangesImmediately) {
FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
timer->SetClient(&client);
timer->SetActive(true);
- // Run the first tick.
+ // Run the first task, as that activates the timer and picks up a timebase.
task_runner->RunPendingTasks();
EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
@@ -246,10 +246,10 @@ TEST(DelayBasedTimeSource, HandlesSignificantTimebaseChangesImmediately) {
timer->SetTimebaseAndInterval(timer->Now() + jitter, Interval());
EXPECT_FALSE(client.TickCalled()); // Make sure pending tasks were canceled.
- EXPECT_EQ(16 + 7, task_runner->NextPendingTaskDelay().InMilliseconds());
+ EXPECT_EQ(7, task_runner->NextPendingTaskDelay().InMilliseconds());
// Tick, then shift timebase by -7ms.
- timer->SetNow(timer->Now() + Interval() + jitter);
+ timer->SetNow(timer->Now() + jitter);
task_runner->RunPendingTasks();
EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
@@ -271,7 +271,7 @@ TEST(DelayBasedTimeSource, HanldlesSignificantIntervalChangesImmediately) {
FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
timer->SetClient(&client);
timer->SetActive(true);
- // Run the first tick.
+ // Run the first task, as that activates the timer and picks up a timebase.
task_runner->RunPendingTasks();
EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
@@ -305,115 +305,6 @@ TEST(DelayBasedTimeSource, HanldlesSignificantIntervalChangesImmediately) {
EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
}
-TEST(DelayBasedTimeSource, JitteryRuntimeWithFutureTimebases) {
- scoped_refptr<base::TestSimpleTaskRunner> task_runner =
- new base::TestSimpleTaskRunner;
- FakeTimeSourceClient client;
- scoped_refptr<FakeDelayBasedTimeSource> timer =
- FakeDelayBasedTimeSource::Create(Interval(), task_runner.get());
- timer->SetClient(&client);
- timer->SetActive(true);
-
- // Run the first tick.
- task_runner->RunPendingTasks();
- EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
-
- base::TimeTicks future_timebase = timer->Now() + Interval() * 10;
-
- // 1ms jitter
- base::TimeDelta jitter1 = base::TimeDelta::FromMilliseconds(1);
-
- // Tick with +1ms of jitter
- future_timebase += Interval();
- timer->SetTimebaseAndInterval(future_timebase, Interval());
- timer->SetNow(timer->Now() + Interval() + jitter1);
- task_runner->RunPendingTasks();
- EXPECT_EQ(15, task_runner->NextPendingTaskDelay().InMilliseconds());
-
- // Tick with 0ms of jitter
- future_timebase += Interval();
- timer->SetTimebaseAndInterval(future_timebase, Interval());
- timer->SetNow(timer->Now() + Interval() - jitter1);
- task_runner->RunPendingTasks();
- EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
-
- // Tick with -1ms of jitter
- future_timebase += Interval();
- timer->SetTimebaseAndInterval(future_timebase, Interval());
- timer->SetNow(timer->Now() + Interval() - jitter1);
- task_runner->RunPendingTasks();
- EXPECT_EQ(17, task_runner->NextPendingTaskDelay().InMilliseconds());
-
- // Tick with 0ms of jitter
- future_timebase += Interval();
- timer->SetTimebaseAndInterval(future_timebase, Interval());
- timer->SetNow(timer->Now() + Interval() + jitter1);
- task_runner->RunPendingTasks();
- EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
-
- // 8 ms jitter
- base::TimeDelta jitter8 = base::TimeDelta::FromMilliseconds(8);
-
- // Tick with +8ms of jitter
- future_timebase += Interval();
- timer->SetTimebaseAndInterval(future_timebase, Interval());
- timer->SetNow(timer->Now() + Interval() + jitter8);
- task_runner->RunPendingTasks();
- EXPECT_EQ(8, task_runner->NextPendingTaskDelay().InMilliseconds());
-
- // Tick with 0ms of jitter
- future_timebase += Interval();
- timer->SetTimebaseAndInterval(future_timebase, Interval());
- timer->SetNow(timer->Now() + Interval() - jitter8);
- task_runner->RunPendingTasks();
- EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
-
- // Tick with -8ms of jitter
- future_timebase += Interval();
- timer->SetTimebaseAndInterval(future_timebase, Interval());
- timer->SetNow(timer->Now() + Interval() - jitter8);
- task_runner->RunPendingTasks();
- EXPECT_EQ(24, task_runner->NextPendingTaskDelay().InMilliseconds());
-
- // Tick with 0ms of jitter
- future_timebase += Interval();
- timer->SetTimebaseAndInterval(future_timebase, Interval());
- timer->SetNow(timer->Now() + Interval() + jitter8);
- task_runner->RunPendingTasks();
- EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
-
- // 15 ms jitter
- base::TimeDelta jitter15 = base::TimeDelta::FromMilliseconds(15);
-
- // Tick with +15ms jitter
- future_timebase += Interval();
- timer->SetTimebaseAndInterval(future_timebase, Interval());
- timer->SetNow(timer->Now() + Interval() + jitter15);
- task_runner->RunPendingTasks();
- EXPECT_EQ(1, task_runner->NextPendingTaskDelay().InMilliseconds());
-
- // Tick with 0ms of jitter
- future_timebase += Interval();
- timer->SetTimebaseAndInterval(future_timebase, Interval());
- timer->SetNow(timer->Now() + Interval() - jitter15);
- task_runner->RunPendingTasks();
- EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
-
- // Tick with -15ms of jitter
- future_timebase += Interval();
- timer->SetTimebaseAndInterval(future_timebase, Interval());
- timer->SetNow(timer->Now() + Interval() - jitter15);
- task_runner->RunPendingTasks();
- EXPECT_EQ(31, task_runner->NextPendingTaskDelay().InMilliseconds());
-
- // Tick with 0ms of jitter
- future_timebase += Interval();
- timer->SetTimebaseAndInterval(future_timebase, Interval());
- timer->SetNow(timer->Now() + Interval() + jitter15);
- task_runner->RunPendingTasks();
- EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds());
-}
-
TEST(DelayBasedTimeSourceTest, AchievesTargetRateWithNoNoise) {
int num_iterations = 10;
diff --git a/chromium/cc/scheduler/frame_rate_controller.cc b/chromium/cc/scheduler/frame_rate_controller.cc
index 54c1bdaf48f..4844b16faee 100644
--- a/chromium/cc/scheduler/frame_rate_controller.cc
+++ b/chromium/cc/scheduler/frame_rate_controller.cc
@@ -70,16 +70,11 @@ BeginFrameArgs FrameRateController::SetActive(bool active) {
if (active_ == active)
return BeginFrameArgs();
TRACE_EVENT1("cc", "FrameRateController::SetActive", "active", active);
+ bool just_activated = active && !active_;
active_ = active;
if (is_time_source_throttling_) {
- base::TimeTicks missed_tick_time = time_source_->SetActive(active);
- if (!missed_tick_time.is_null()) {
- base::TimeTicks deadline = NextTickTime();
- return BeginFrameArgs::Create(missed_tick_time,
- deadline,
- interval_);
- }
+ time_source_->SetActive(active);
} else {
if (active)
PostManualTick();
@@ -87,6 +82,12 @@ BeginFrameArgs FrameRateController::SetActive(bool active) {
weak_factory_.InvalidateWeakPtrs();
}
+ if (just_activated) {
+ // TODO(brianderson): Use an adaptive parent compositor deadline.
+ base::TimeTicks frame_time = NextTickTime() - interval_;
+ base::TimeTicks deadline = NextTickTime();
+ return BeginFrameArgs::Create(frame_time, deadline, interval_);
+ }
return BeginFrameArgs();
}
diff --git a/chromium/cc/scheduler/frame_rate_controller.h b/chromium/cc/scheduler/frame_rate_controller.h
index b68c73db0c8..ed769238fe3 100644
--- a/chromium/cc/scheduler/frame_rate_controller.h
+++ b/chromium/cc/scheduler/frame_rate_controller.h
@@ -61,6 +61,12 @@ class CC_EXPORT FrameRateController {
int MaxSwapsPending() const { return max_swaps_pending_; }
int NumSwapsPendingForTesting() const { return num_frames_pending_; }
+ // This returns null for unthrottled frame-rate.
+ base::TimeTicks NextTickTime();
+
+ // This returns now for unthrottled frame-rate.
+ base::TimeTicks LastTickTime();
+
void SetTimebaseAndInterval(base::TimeTicks timebase,
base::TimeDelta interval);
void SetDeadlineAdjustment(base::TimeDelta delta);
@@ -72,11 +78,6 @@ class CC_EXPORT FrameRateController {
void PostManualTick();
void ManualTick();
- // This returns null for unthrottled frame-rate.
- base::TimeTicks NextTickTime();
- // This returns now for unthrottled frame-rate.
- base::TimeTicks LastTickTime();
-
FrameRateControllerClient* client_;
int num_frames_pending_;
int max_swaps_pending_;
diff --git a/chromium/cc/scheduler/texture_uploader_unittest.cc b/chromium/cc/scheduler/texture_uploader_unittest.cc
index 05959172f50..f4b4ce69b2e 100644
--- a/chromium/cc/scheduler/texture_uploader_unittest.cc
+++ b/chromium/cc/scheduler/texture_uploader_unittest.cc
@@ -5,8 +5,8 @@
#include "cc/scheduler/texture_uploader.h"
#include "cc/base/util.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
#include "cc/resources/prioritized_resource.h"
+#include "cc/test/test_web_graphics_context_3d.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/khronos/GLES2/gl2.h"
diff --git a/chromium/cc/scheduler/time_source.h b/chromium/cc/scheduler/time_source.h
index e45ffbb95aa..c02d4901a97 100644
--- a/chromium/cc/scheduler/time_source.h
+++ b/chromium/cc/scheduler/time_source.h
@@ -27,12 +27,7 @@ class TimeSourceClient {
class CC_EXPORT TimeSource : public base::RefCounted<TimeSource> {
public:
virtual void SetClient(TimeSourceClient* client) = 0;
-
- // If transitioning from not active to active, SetActive will return the
- // timestamp of the most recenly missed tick that did not have OnTimerTick
- // called.
- virtual base::TimeTicks SetActive(bool active) = 0;
-
+ virtual void SetActive(bool active) = 0;
virtual bool Active() const = 0;
virtual void SetTimebaseAndInterval(base::TimeTicks timebase,
base::TimeDelta interval) = 0;
diff --git a/chromium/cc/trees/layer_tree_host_impl.cc b/chromium/cc/trees/layer_tree_host_impl.cc
index 720febd7fc7..9519e745af4 100644
--- a/chromium/cc/trees/layer_tree_host_impl.cc
+++ b/chromium/cc/trees/layer_tree_host_impl.cc
@@ -327,11 +327,9 @@ void LayerTreeHostImpl::ManageTiles() {
size_t memory_required_bytes;
size_t memory_nice_to_have_bytes;
- size_t memory_allocated_bytes;
size_t memory_used_bytes;
tile_manager_->GetMemoryStats(&memory_required_bytes,
&memory_nice_to_have_bytes,
- &memory_allocated_bytes,
&memory_used_bytes);
SendManagedMemoryStats(memory_required_bytes,
memory_nice_to_have_bytes,
@@ -1529,6 +1527,11 @@ void LayerTreeHostImpl::SetVisible(bool visible) {
DidVisibilityChange(this, visible_);
EnforceManagedMemoryPolicy(ActualManagedMemoryPolicy());
+ // Evict tiles immediately if invisible since this tab may never get another
+ // draw or timer tick.
+ if (!visible_)
+ ManageTiles();
+
if (!renderer_)
return;
@@ -2502,9 +2505,7 @@ void LayerTreeHostImpl::CreateUIResource(
if (id)
DeleteUIResource(uid);
id = resource_provider_->CreateResource(
- bitmap->GetSize(),
- resource_provider_->best_texture_format(),
- ResourceProvider::TextureUsageAny);
+ bitmap->GetSize(), GL_RGBA, ResourceProvider::TextureUsageAny);
ui_resource_map_[uid] = id;
resource_provider_->SetPixels(id,
diff --git a/chromium/cc/trees/layer_tree_host_impl_unittest.cc b/chromium/cc/trees/layer_tree_host_impl_unittest.cc
index 764a9cf93de..ab81c672b8c 100644
--- a/chromium/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/chromium/cc/trees/layer_tree_host_impl_unittest.cc
@@ -10,7 +10,6 @@
#include "base/command_line.h"
#include "base/containers/hash_tables.h"
#include "cc/base/math_util.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
#include "cc/input/top_controls_manager.h"
#include "cc/layers/delegated_renderer_layer_impl.h"
#include "cc/layers/heads_up_display_layer_impl.h"
@@ -40,6 +39,7 @@
#include "cc/test/geometry_test_utils.h"
#include "cc/test/layer_test_common.h"
#include "cc/test/render_pass_test_common.h"
+#include "cc/test/test_web_graphics_context_3d.h"
#include "cc/trees/layer_tree_impl.h"
#include "cc/trees/single_thread_proxy.h"
#include "media/base/media.h"
diff --git a/chromium/cc/trees/layer_tree_host_unittest.cc b/chromium/cc/trees/layer_tree_host_unittest.cc
index 55841e52e70..b18a88a7865 100644
--- a/chromium/cc/trees/layer_tree_host_unittest.cc
+++ b/chromium/cc/trees/layer_tree_host_unittest.cc
@@ -1111,7 +1111,7 @@ class LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers
MULTI_THREAD_TEST_F(LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers);
// Verify atomicity of commits and reuse of textures.
-class LayerTreeHostTestDirectRendererAtomicCommit : public LayerTreeHostTest {
+class LayerTreeHostTestAtomicCommit : public LayerTreeHostTest {
public:
virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
// Make sure partial texture updates are turned off.
@@ -1162,18 +1162,19 @@ class LayerTreeHostTestDirectRendererAtomicCommit : public LayerTreeHostTest {
PostSetNeedsCommitToMainThread();
break;
case 1:
- // Number of textures should be one for scrollbar layer since it was
- // requested and deleted on the impl-thread, and double for the content
- // layer since its first texture is used by impl thread and cannot by
- // used for update.
- ASSERT_EQ(3u, context->NumTextures());
- // Number of textures used for commit should be one for each layer.
+ // Number of textures should be doubled as the first textures
+ // are used by impl thread and cannot by used for update.
+ ASSERT_EQ(4u, context->NumTextures());
+ // Number of textures used for commit should still be
+ // one for each layer.
EXPECT_EQ(2u, context->NumUsedTextures());
// First textures should not have been used.
EXPECT_FALSE(context->UsedTexture(context->TextureAt(0)));
- EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
+ EXPECT_FALSE(context->UsedTexture(context->TextureAt(1)));
// New textures should have been used.
EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
+ EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
+
context->ResetUsedTextures();
PostSetNeedsCommitToMainThread();
break;
@@ -1208,68 +1209,14 @@ class LayerTreeHostTestDirectRendererAtomicCommit : public LayerTreeHostTest {
virtual void AfterTest() OVERRIDE {}
- protected:
+ private:
FakeContentLayerClient client_;
scoped_refptr<FakeContentLayer> layer_;
scoped_refptr<FakeScrollbarLayer> scrollbar_;
int drew_frame_;
};
-MULTI_THREAD_DIRECT_RENDERER_TEST_F(
- LayerTreeHostTestDirectRendererAtomicCommit);
-
-class LayerTreeHostTestDelegatingRendererAtomicCommit
- : public LayerTreeHostTestDirectRendererAtomicCommit {
- public:
- virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
- ASSERT_EQ(0u, layer_tree_host()->settings().max_partial_texture_updates);
-
- TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(
- impl->output_surface()->context3d());
-
- switch (impl->active_tree()->source_frame_number()) {
- case 0:
- // Number of textures should be one for each layer
- ASSERT_EQ(2u, context->NumTextures());
- // Number of textures used for commit should be one for each layer.
- EXPECT_EQ(2u, context->NumUsedTextures());
- // Verify that used texture is correct.
- EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
- EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
- context->ResetUsedTextures();
- PostSetNeedsCommitToMainThread();
- break;
- case 1:
- // Number of textures should be doubled as the first context layer
- // texture is being used by the impl-thread and cannot be used for
- // update. The scrollbar behavior is different direct renderer because
- // UI resource deletion with delegating renderer occurs after tree
- // activation.
- ASSERT_EQ(4u, context->NumTextures());
- // Number of textures used for commit should still be
- // one for each layer.
- EXPECT_EQ(2u, context->NumUsedTextures());
- // First textures should not have been used.
- EXPECT_FALSE(context->UsedTexture(context->TextureAt(0)));
- EXPECT_FALSE(context->UsedTexture(context->TextureAt(1)));
- // New textures should have been used.
- EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
- EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
- context->ResetUsedTextures();
- PostSetNeedsCommitToMainThread();
- break;
- case 2:
- EndTest();
- break;
- default:
- NOTREACHED();
- break;
- }
- }
-};
-
-MULTI_THREAD_DELEGATING_RENDERER_TEST_F(
- LayerTreeHostTestDelegatingRendererAtomicCommit);
+MULTI_THREAD_TEST_F(LayerTreeHostTestAtomicCommit);
static void SetLayerPropertiesForTesting(Layer* layer,
Layer* parent,
diff --git a/chromium/cc/trees/layer_tree_host_unittest_context.cc b/chromium/cc/trees/layer_tree_host_unittest_context.cc
index 3404c1ea9df..1787d31ddf3 100644
--- a/chromium/cc/trees/layer_tree_host_unittest_context.cc
+++ b/chromium/cc/trees/layer_tree_host_unittest_context.cc
@@ -5,8 +5,6 @@
#include "cc/trees/layer_tree_host.h"
#include "base/basictypes.h"
-#include "cc/debug/test_context_provider.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
#include "cc/layers/content_layer.h"
#include "cc/layers/heads_up_display_layer.h"
#include "cc/layers/io_surface_layer.h"
@@ -21,6 +19,7 @@
#include "cc/test/fake_content_layer.h"
#include "cc/test/fake_content_layer_client.h"
#include "cc/test/fake_content_layer_impl.h"
+#include "cc/test/fake_context_provider.h"
#include "cc/test/fake_delegated_renderer_layer.h"
#include "cc/test/fake_delegated_renderer_layer_impl.h"
#include "cc/test/fake_layer_tree_host_client.h"
@@ -31,6 +30,7 @@
#include "cc/test/fake_video_frame_provider.h"
#include "cc/test/layer_tree_test.h"
#include "cc/test/render_pass_test_common.h"
+#include "cc/test/test_web_graphics_context_3d.h"
#include "cc/trees/layer_tree_host_impl.h"
#include "cc/trees/layer_tree_impl.h"
#include "cc/trees/single_thread_proxy.h"
@@ -141,7 +141,7 @@ class LayerTreeHostContextTest : public LayerTreeTest {
if (!offscreen_contexts_main_thread_.get() ||
offscreen_contexts_main_thread_->DestroyedOnMainThread()) {
- offscreen_contexts_main_thread_ = TestContextProvider::Create(
+ offscreen_contexts_main_thread_ = FakeContextProvider::Create(
base::Bind(&LayerTreeHostContextTest::CreateOffscreenContext3d,
base::Unretained(this)));
if (offscreen_contexts_main_thread_.get() &&
@@ -157,7 +157,7 @@ class LayerTreeHostContextTest : public LayerTreeTest {
if (!offscreen_contexts_compositor_thread_.get() ||
offscreen_contexts_compositor_thread_->DestroyedOnMainThread()) {
- offscreen_contexts_compositor_thread_ = TestContextProvider::Create(
+ offscreen_contexts_compositor_thread_ = FakeContextProvider::Create(
base::Bind(&LayerTreeHostContextTest::CreateOffscreenContext3d,
base::Unretained(this)));
}
@@ -236,8 +236,8 @@ class LayerTreeHostContextTest : public LayerTreeTest {
bool context_should_support_io_surface_;
bool fallback_context_works_;
- scoped_refptr<TestContextProvider> offscreen_contexts_main_thread_;
- scoped_refptr<TestContextProvider> offscreen_contexts_compositor_thread_;
+ scoped_refptr<FakeContextProvider> offscreen_contexts_main_thread_;
+ scoped_refptr<FakeContextProvider> offscreen_contexts_compositor_thread_;
};
class LayerTreeHostContextTestLostContextSucceeds
diff --git a/chromium/chrome/chrome_browser.gypi b/chromium/chrome/chrome_browser.gypi
index 25e053faa72..b31118d7de3 100644
--- a/chromium/chrome/chrome_browser.gypi
+++ b/chromium/chrome/chrome_browser.gypi
@@ -770,6 +770,8 @@
'browser/history/in_memory_url_index_types.h',
'browser/history/most_visited_tiles_experiment.cc',
'browser/history/most_visited_tiles_experiment.h',
+ 'browser/history/page_collector.cc',
+ 'browser/history/page_collector.h',
'browser/history/page_usage_data.cc',
'browser/history/page_usage_data.h',
'browser/history/query_parser.cc',
@@ -970,8 +972,6 @@
'browser/media/chrome_midi_permission_context.h',
'browser/media/chrome_midi_permission_context_factory.cc',
'browser/media/chrome_midi_permission_context_factory.h',
- 'browser/media/desktop_streams_registry.cc',
- 'browser/media/desktop_streams_registry.h',
'browser/media/desktop_media_picker.h',
'browser/media/desktop_media_picker_model.cc',
'browser/media/desktop_media_picker_model.h',
@@ -1641,6 +1641,8 @@
'browser/profiles/chrome_browser_main_extra_parts_profiles.h',
'browser/profiles/chrome_version_service.cc',
'browser/profiles/chrome_version_service.h',
+ 'browser/profiles/file_path_verifier_win.cc',
+ 'browser/profiles/file_path_verifier_win.h',
'browser/profiles/gaia_info_update_service.cc',
'browser/profiles/gaia_info_update_service.h',
'browser/profiles/gaia_info_update_service_factory.cc',
diff --git a/chromium/chrome/chrome_browser_chromeos.gypi b/chromium/chrome/chrome_browser_chromeos.gypi
index 6a8668be57c..982b46c3ed7 100644
--- a/chromium/chrome/chrome_browser_chromeos.gypi
+++ b/chromium/chrome/chrome_browser_chromeos.gypi
@@ -319,7 +319,6 @@
'browser/chromeos/extensions/external_cache.h',
'browser/chromeos/extensions/external_pref_cache_loader.cc',
'browser/chromeos/extensions/external_pref_cache_loader.h',
- 'browser/chromeos/extensions/file_manager/app_id.h',
'browser/chromeos/extensions/file_manager/desktop_notifications.cc',
'browser/chromeos/extensions/file_manager/desktop_notifications.h',
'browser/chromeos/extensions/file_manager/event_router.cc',
@@ -336,8 +335,6 @@
'browser/chromeos/extensions/file_manager/fileapi_util.h',
'browser/chromeos/extensions/file_manager/mounted_disk_monitor.cc',
'browser/chromeos/extensions/file_manager/mounted_disk_monitor.h',
- 'browser/chromeos/extensions/file_manager/url_util.cc',
- 'browser/chromeos/extensions/file_manager/url_util.h',
'browser/chromeos/extensions/file_manager/zip_file_creator.cc',
'browser/chromeos/extensions/file_manager/zip_file_creator.h',
'browser/chromeos/extensions/info_private_api.cc',
@@ -575,8 +572,6 @@
'browser/chromeos/login/user_image_manager.cc',
'browser/chromeos/login/user_image_manager_impl.cc',
'browser/chromeos/login/user_image_manager_impl.h',
- 'browser/chromeos/login/user_image_sync_observer.cc',
- 'browser/chromeos/login/user_image_sync_observer.h',
'browser/chromeos/login/user_flow.cc',
'browser/chromeos/login/user_flow.h',
'browser/chromeos/login/user_manager.cc',
@@ -761,6 +756,8 @@
'browser/chromeos/settings/system_settings_provider.h',
'browser/chromeos/sim_dialog_delegate.cc',
'browser/chromeos/sim_dialog_delegate.h',
+ 'browser/chromeos/sms_observer.cc',
+ 'browser/chromeos/sms_observer.h',
'browser/chromeos/status/data_promo_notification.cc',
'browser/chromeos/status/data_promo_notification.h',
'browser/chromeos/status/network_menu.cc',
diff --git a/chromium/chrome/chrome_browser_extensions.gypi b/chromium/chrome/chrome_browser_extensions.gypi
index c477498338d..e61183b56fb 100644
--- a/chromium/chrome/chrome_browser_extensions.gypi
+++ b/chromium/chrome/chrome_browser_extensions.gypi
@@ -197,8 +197,6 @@
'browser/extensions/api/declarative_webrequest/webrequest_constants.h',
'browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc',
'browser/extensions/api/declarative_webrequest/webrequest_rules_registry.h',
- 'browser/extensions/api/desktop_capture/desktop_capture_api.cc',
- 'browser/extensions/api/desktop_capture/desktop_capture_api.h',
'browser/extensions/api/developer_private/developer_private_api.cc',
'browser/extensions/api/developer_private/developer_private_api.h',
'browser/extensions/api/developer_private/developer_private_api_factory.cc',
diff --git a/chromium/chrome/chrome_browser_ui.gypi b/chromium/chrome/chrome_browser_ui.gypi
index da33a8efeeb..a869a13bfbc 100644
--- a/chromium/chrome/chrome_browser_ui.gypi
+++ b/chromium/chrome/chrome_browser_ui.gypi
@@ -182,10 +182,6 @@
'browser/ui/app_modal_dialogs/javascript_dialog_manager.cc',
'browser/ui/app_modal_dialogs/javascript_dialog_manager.h',
'browser/ui/app_modal_dialogs/native_app_modal_dialog.h',
- 'browser/ui/apps/app_metro_infobar_delegate_win.cc',
- 'browser/ui/apps/app_metro_infobar_delegate_win.h',
- 'browser/ui/apps/apps_metro_handler_win.cc',
- 'browser/ui/apps/apps_metro_handler_win.h',
'browser/ui/apps/chrome_shell_window_delegate.cc',
'browser/ui/apps/chrome_shell_window_delegate.h',
'browser/ui/ash/ash_keyboard_controller_proxy.cc',
@@ -696,8 +692,6 @@
'browser/ui/cocoa/fullscreen_exit_bubble_controller.mm',
'browser/ui/cocoa/fullscreen_exit_bubble_view.h',
'browser/ui/cocoa/fullscreen_exit_bubble_view.mm',
- 'browser/ui/cocoa/fullscreen_mode_controller.h',
- 'browser/ui/cocoa/fullscreen_mode_controller.mm',
'browser/ui/cocoa/fullscreen_window.h',
'browser/ui/cocoa/fullscreen_window.mm',
'browser/ui/cocoa/global_error_bubble_controller.h',
@@ -782,8 +776,6 @@
'browser/ui/cocoa/location_bar/location_bar_view_mac.mm',
'browser/ui/cocoa/location_bar/location_icon_decoration.h',
'browser/ui/cocoa/location_bar/location_icon_decoration.mm',
- 'browser/ui/cocoa/location_bar/mic_search_decoration.h',
- 'browser/ui/cocoa/location_bar/mic_search_decoration.mm',
'browser/ui/cocoa/location_bar/page_action_decoration.h',
'browser/ui/cocoa/location_bar/page_action_decoration.mm',
'browser/ui/cocoa/location_bar/selected_keyword_decoration.h',
@@ -986,8 +978,12 @@
'browser/ui/crypto_module_password_dialog.h',
'browser/ui/crypto_module_password_dialog_nss.cc',
'browser/ui/crypto_module_password_dialog_openssl.cc',
+ 'browser/ui/extensions/app_metro_infobar_delegate_win.cc',
+ 'browser/ui/extensions/app_metro_infobar_delegate_win.h',
'browser/ui/extensions/application_launch.cc',
'browser/ui/extensions/application_launch.h',
+ 'browser/ui/extensions/apps_metro_handler_win.cc',
+ 'browser/ui/extensions/apps_metro_handler_win.h',
'browser/ui/extensions/extension_install_ui_default.cc',
'browser/ui/extensions/extension_install_ui_default.h',
'browser/ui/extensions/extension_enable_flow.cc',
@@ -1989,6 +1985,8 @@
'browser/ui/webui/chrome_web_contents_handler.h',
'browser/ui/webui/chrome_web_ui_controller_factory.cc',
'browser/ui/webui/chrome_web_ui_controller_factory.h',
+ 'browser/ui/webui/chromeos/about_network.cc',
+ 'browser/ui/webui/chromeos/about_network.h',
'browser/ui/webui/chromeos/app_launch_ui.cc',
'browser/ui/webui/chromeos/app_launch_ui.h',
'browser/ui/webui/chromeos/bluetooth_pairing_ui.cc',
@@ -2054,8 +2052,6 @@
'browser/ui/webui/chromeos/mobile_setup_dialog.h',
'browser/ui/webui/chromeos/mobile_setup_ui.cc',
'browser/ui/webui/chromeos/mobile_setup_ui.h',
- 'browser/ui/webui/chromeos/network_ui.cc',
- 'browser/ui/webui/chromeos/network_ui.h',
'browser/ui/webui/chromeos/proxy_settings_ui.cc',
'browser/ui/webui/chromeos/proxy_settings_ui.h',
'browser/ui/webui/chromeos/sim_unlock_ui.cc',
@@ -2136,6 +2132,10 @@
'browser/ui/webui/inspect_ui.h',
'browser/ui/webui/instant_ui.cc',
'browser/ui/webui/instant_ui.h',
+ 'browser/ui/webui/local_discovery/local_discovery_ui.cc',
+ 'browser/ui/webui/local_discovery/local_discovery_ui.h',
+ 'browser/ui/webui/local_discovery/local_discovery_ui_handler.cc',
+ 'browser/ui/webui/local_discovery/local_discovery_ui_handler.h',
'browser/ui/webui/media/webrtc_logs_ui.cc',
'browser/ui/webui/media/webrtc_logs_ui.h',
'browser/ui/webui/memory_internals/memory_internals_handler.cc',
@@ -3110,14 +3110,6 @@
'browser/ui/webui/media/webrtc_logs_ui.h',
],
}],
- ['enable_mdns==1', {
- 'sources': [
- 'browser/ui/webui/local_discovery/local_discovery_ui.cc',
- 'browser/ui/webui/local_discovery/local_discovery_ui.h',
- 'browser/ui/webui/local_discovery/local_discovery_ui_handler.cc',
- 'browser/ui/webui/local_discovery/local_discovery_ui_handler.h',
- ],
- }],
],
},
],
diff --git a/chromium/chrome/chrome_common.gypi b/chromium/chrome/chrome_common.gypi
index ed7b021f152..c29bd660305 100644
--- a/chromium/chrome/chrome_common.gypi
+++ b/chromium/chrome/chrome_common.gypi
@@ -37,8 +37,6 @@
'<(DEPTH)/chrome/chrome_resources.gyp:chrome_strings',
'<(DEPTH)/chrome/chrome_resources.gyp:theme_resources',
'<(DEPTH)/chrome/common_constants.gyp:common_constants',
- '<(DEPTH)/components/components.gyp:json_schema',
- '<(DEPTH)/components/components.gyp:policy_component',
'<(DEPTH)/components/components.gyp:visitedlink_common',
'<(DEPTH)/content/content.gyp:content_common',
'<(DEPTH)/net/net.gyp:net',
@@ -80,8 +78,6 @@
'../extensions/common/id_util.h',
'../extensions/common/install_warning.cc',
'../extensions/common/install_warning.h',
- '../extensions/common/manifest_constants.cc',
- '../extensions/common/manifest_constants.h',
'../extensions/common/matcher/regex_set_matcher.cc',
'../extensions/common/matcher/regex_set_matcher.h',
'../extensions/common/matcher/string_pattern.cc',
@@ -377,6 +373,10 @@
'common/instant_restricted_id_cache.h',
'common/instant_types.cc',
'common/instant_types.h',
+ 'common/json_schema/json_schema_constants.cc',
+ 'common/json_schema/json_schema_constants.h',
+ 'common/json_schema/json_schema_validator.cc',
+ 'common/json_schema/json_schema_validator.h',
'common/localized_error.cc',
'common/localized_error.h',
'common/logging_chrome.cc',
@@ -426,6 +426,8 @@
'common/pepper_flash.h',
'common/pepper_permission_util.cc',
'common/pepper_permission_util.h',
+ 'common/policy/policy_schema.cc',
+ 'common/policy/policy_schema.h',
'common/pref_names_util.cc',
'common/pref_names_util.h',
'common/print_messages.cc',
@@ -591,9 +593,12 @@
}],
['OS=="win"', {
'include_dirs': [
- '<(DEPTH)/breakpad/src',
'<(DEPTH)/third_party/wtl/include',
],
+ 'sources!': [
+ 'common/crash_keys.cc',
+ 'common/crash_keys.h',
+ ],
}],
['enable_mdns == 1', {
'sources': [
diff --git a/chromium/chrome/chrome_renderer.gypi b/chromium/chrome/chrome_renderer.gypi
index 5b0d88cdd73..2fe5126e612 100644
--- a/chromium/chrome/chrome_renderer.gypi
+++ b/chromium/chrome/chrome_renderer.gypi
@@ -278,6 +278,7 @@
'renderer/prerender/prerenderer_client.h',
'renderer/printing/print_web_view_helper.cc',
'renderer/printing/print_web_view_helper.h',
+ 'renderer/printing/print_web_view_helper_android.cc',
'renderer/printing/print_web_view_helper_linux.cc',
'renderer/printing/print_web_view_helper_mac.mm',
'renderer/printing/print_web_view_helper_win.cc',
diff --git a/chromium/chrome/chrome_tests.gypi b/chromium/chrome/chrome_tests.gypi
index 4a43df7a317..1a5ef06fb85 100644
--- a/chromium/chrome/chrome_tests.gypi
+++ b/chromium/chrome/chrome_tests.gypi
@@ -391,7 +391,6 @@
'sources': [
'browser/chromeos/cros/cros_in_process_browser_test.cc',
'browser/chromeos/cros/cros_in_process_browser_test.h',
- 'browser/chromeos/input_method/keyboard_browsertest.cc',
'browser/chromeos/input_method/textinput_browsertest.cc',
'browser/chromeos/input_method/textinput_surroundingtext_browsertest.cc',
'browser/chromeos/input_method/textinput_test_helper.cc',
@@ -1210,8 +1209,11 @@
'browser/chromeos/login/existing_user_controller_browsertest.cc',
'browser/chromeos/login/kiosk_browsertest.cc',
'browser/chromeos/login/login_utils_browsertest.cc',
+ 'browser/chromeos/login/login_manager_test.cc',
+ 'browser/chromeos/login/login_manager_test.h',
'browser/chromeos/login/mock_authenticator.cc',
'browser/chromeos/login/mock_authenticator.h',
+ 'browser/chromeos/login/session_login_browsertest.cc',
'browser/chromeos/login/screen_locker_tester.cc',
'browser/chromeos/login/screen_locker_tester.h',
'browser/chromeos/login/screens/mock_error_screen.cc',
@@ -2089,11 +2091,6 @@
['exclude', '^test/data/webui/print_preview.js'],
],
}],
- ['enable_mdns==1', {
- 'sources' : [
- 'browser/ui/webui/local_discovery/local_discovery_ui_browsertest.cc',
- ]
- }],
], # conditions
}, # target browser_tests
{
@@ -3276,6 +3273,7 @@
'../base/base.gyp:base_java_test_support',
'../content/content.gyp:content_java_test_support',
'../sync/sync.gyp:sync_javatests',
+ '../tools/android/forwarder/forwarder.gyp:forwarder',
],
'variables': {
'apk_name': 'ChromiumTestShellTest',
diff --git a/chromium/chrome/chrome_tests_unit.gypi b/chromium/chrome/chrome_tests_unit.gypi
index 1cc82a06476..f7394c85850 100644
--- a/chromium/chrome/chrome_tests_unit.gypi
+++ b/chromium/chrome/chrome_tests_unit.gypi
@@ -655,7 +655,6 @@
'browser/chromeos/extensions/file_manager/desktop_notifications_unittest.cc',
'browser/chromeos/extensions/file_manager/file_tasks_unittest.cc',
'browser/chromeos/extensions/file_manager/file_watcher_unittest.cc',
- 'browser/chromeos/extensions/file_manager/url_util_unittest.cc',
'browser/chromeos/extensions/wallpaper_private_api_unittest.cc',
'browser/chromeos/external_metrics_unittest.cc',
'browser/chromeos/fileapi/file_access_permissions_unittest.cc',
@@ -767,7 +766,6 @@
'browser/enumerate_modules_model_unittest_win.cc',
'browser/extensions/active_tab_unittest.cc',
'browser/extensions/activity_log/activity_database_unittest.cc',
- 'browser/extensions/activity_log/activity_log_enabled_unittest.cc',
'browser/extensions/activity_log/activity_log_unittest.cc',
'browser/extensions/activity_log/activity_log_policy_unittest.cc',
'browser/extensions/activity_log/counting_policy_unittest.cc',
@@ -1090,6 +1088,7 @@
'browser/prefs/chrome_pref_service_unittest.cc',
'browser/prefs/command_line_pref_store_unittest.cc',
'browser/prefs/incognito_mode_prefs_unittest.cc',
+ 'browser/prefs/pref_metrics_service_unittest.cc',
'browser/prefs/pref_model_associator_unittest.cc',
'browser/prefs/proxy_config_dictionary_unittest.cc',
'browser/prefs/proxy_policy_unittest.cc',
@@ -1112,6 +1111,7 @@
'browser/process_singleton_mac_unittest.cc',
'browser/profile_resetter/profile_resetter_unittest.cc',
'browser/profiles/avatar_menu_model_unittest.cc',
+ 'browser/profiles/file_path_verifier_win_unittest.cc',
'browser/profiles/gaia_info_update_service_unittest.cc',
'browser/profiles/off_the_record_profile_impl_unittest.cc',
'browser/profiles/profile_downloader_unittest.cc',
@@ -1757,6 +1757,9 @@
'common/favicon/favicon_url_parser_unittest.cc',
'common/importer/firefox_importer_utils_unittest.cc',
'common/instant_restricted_id_cache_unittest.cc',
+ 'common/json_schema/json_schema_validator_unittest.cc',
+ 'common/json_schema/json_schema_validator_unittest_base.cc',
+ 'common/json_schema/json_schema_validator_unittest_base.h',
'common/mac/cfbundle_blocker_unittest.mm',
'common/mac/mock_launchd.cc',
'common/mac/mock_launchd.h',
@@ -1774,6 +1777,7 @@
'common/net/url_fixer_upper_unittest.cc',
'common/net/x509_certificate_model_unittest.cc',
'common/partial_circular_buffer_unittest.cc',
+ 'common/policy/policy_schema_unittest.cc',
'common/pref_names_util_unittest.cc',
'common/service_process_util_unittest.cc',
'common/switch_utils_unittest.cc',
diff --git a/chromium/chrome/common/extensions/api/api.gyp b/chromium/chrome/common/extensions/api/api.gyp
index 5c84ab1b881..465021ae042 100644
--- a/chromium/chrome/common/extensions/api/api.gyp
+++ b/chromium/chrome/common/extensions/api/api.gyp
@@ -39,7 +39,6 @@
'cookies.json',
'debugger.json',
'developer_private.idl',
- 'desktop_capture.idl',
'diagnostics.idl',
'dial.idl',
'downloads.idl',
diff --git a/chromium/chrome/installer/mini_installer.gyp b/chromium/chrome/installer/mini_installer.gyp
index 05d54d2875c..619c70e7b81 100644
--- a/chromium/chrome/installer/mini_installer.gyp
+++ b/chromium/chrome/installer/mini_installer.gyp
@@ -177,7 +177,13 @@
# TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
'msvs_disabled_warnings': [ 4267, ],
-
+
+ 'variables': {
+ # Opt out the common compatibility manifest to work around
+ # crbug.com/272660.
+ # TODO(yukawa): Enable the common compatibility manifest again.
+ 'win_exe_compatibility_manifest': '',
+ },
'sources': [
'mini_installer/chrome.release',
'mini_installer/chrome_appid.cc',
diff --git a/chromium/chrome/test/data/nacl/nacl_test_data.gyp b/chromium/chrome/test/data/nacl/nacl_test_data.gyp
index 52f4fca8829..4d8e4ecff20 100644
--- a/chromium/chrome/test/data/nacl/nacl_test_data.gyp
+++ b/chromium/chrome/test/data/nacl/nacl_test_data.gyp
@@ -146,7 +146,6 @@
'pnacl_error_handling/bad.pexe',
'pnacl_error_handling/pnacl_bad_pexe.nmf',
'pnacl_error_handling/pnacl_bad_doesnotexist.nmf',
- 'pnacl_error_handling/pnacl_illformed_manifest.nmf',
],
},
'dependencies': [
diff --git a/chromium/chromeos/chromeos.gyp b/chromium/chromeos/chromeos.gyp
index 83acb203167..00dd7787217 100644
--- a/chromium/chromeos/chromeos.gyp
+++ b/chromium/chromeos/chromeos.gyp
@@ -217,8 +217,6 @@
'login/login_state.h',
'network/certificate_pattern.cc',
'network/certificate_pattern.h',
- 'network/client_cert_resolver.cc',
- 'network/client_cert_resolver.h',
'network/client_cert_util.cc',
'network/client_cert_util.h',
'network/cros_network_functions.cc',
@@ -501,7 +499,6 @@
'ime/input_method_whitelist_unittest.cc',
'ime/xkeyboard_unittest.cc',
'login/login_state_unittest.cc',
- 'network/client_cert_resolver_unittest.cc',
'network/cros_network_functions_unittest.cc',
'network/geolocation_handler_unittest.cc',
'network/managed_network_configuration_handler_unittest.cc',
diff --git a/chromium/components/OWNERS b/chromium/components/OWNERS
index ff02f9e3125..7884fe2f806 100644
--- a/chromium/components/OWNERS
+++ b/chromium/components/OWNERS
@@ -8,11 +8,8 @@ per-file breakpad.gypi=jochen@chromium.org
per-file breakpad.gypi=rsesek@chromium.org
per-file breakpad.gypi=thestig@chromium.org
-per-file json_schema.gypi=asargent@chromium.org
-per-file json_schema.gypi=calamity@chromium.org
-per-file json_schema.gypi=kalman@chromium.org
-per-file json_schema.gypi=koz@chromium.org
-per-file json_schema.gypi=mpcomplete@chromium.org
+per-file tracing*=jbauman@chromium.org
+per-file tracing*=nduca@chromium.org
per-file nacl*=bradchen@chromium.org
per-file nacl*=bradnelson@chromium.org
@@ -24,19 +21,9 @@ per-file nacl*=sehr@chromium.org
per-file navigation_interception.gypi=joth@chromium.org
per-file navigation_interception.gypi=mkosiba@chromium.org
-per-file policy.gypi=mnissler@chromium.org
-per-file policy.gypi=pastarmovj@chromium.org
-per-file policy.gypi=joaodasilva@chromium.org
-per-file policy.gypi=bartfab@chromium.org
-per-file policy.gypi=atwilson@chromium.org
-per-file policy.gypi=pneubeck@chromium.org
-
per-file sessions.gypi=marja@chromium.org
per-file sessions.gypi=sky@chromium.org
-per-file tracing*=jbauman@chromium.org
-per-file tracing*=nduca@chromium.org
-
per-file user_prefs.gypi=battre@chromium.org
per-file user_prefs.gypi=bauerb@chromium.org
per-file user_prefs.gypi=mnissler@chromium.org
diff --git a/chromium/components/autofill/core/common/autofill_messages.h b/chromium/components/autofill/core/common/autofill_messages.h
index 13524dfd7d2..a432887af6f 100644
--- a/chromium/components/autofill/core/common/autofill_messages.h
+++ b/chromium/components/autofill/core/common/autofill_messages.h
@@ -38,8 +38,7 @@ IPC_STRUCT_TRAITS_BEGIN(autofill::WebElementDescriptor)
IPC_STRUCT_TRAITS_MEMBER(retrieval_method)
IPC_STRUCT_TRAITS_END()
-IPC_ENUM_TRAITS_MAX_VALUE(autofill::WebElementDescriptor::RetrievalMethod,
- autofill::WebElementDescriptor::NONE)
+IPC_ENUM_TRAITS(autofill::WebElementDescriptor::RetrievalMethod)
IPC_STRUCT_TRAITS_BEGIN(autofill::FormFieldData)
IPC_STRUCT_TRAITS_MEMBER(label)
@@ -100,9 +99,7 @@ IPC_STRUCT_TRAITS_BEGIN(autofill::PasswordAndRealm)
IPC_STRUCT_TRAITS_MEMBER(realm)
IPC_STRUCT_TRAITS_END()
-IPC_ENUM_TRAITS_MAX_VALUE(
- WebKit::WebFormElement::AutocompleteResult,
- WebKit::WebFormElement::AutocompleteResultErrorInvalid)
+IPC_ENUM_TRAITS(WebKit::WebFormElement::AutocompleteResult)
// Autofill messages sent from the browser to the renderer.
diff --git a/chromium/components/components.gyp b/chromium/components/components.gyp
index 602650c37d0..61c496c19d6 100644
--- a/chromium/components/components.gyp
+++ b/chromium/components/components.gyp
@@ -15,9 +15,7 @@
'breakpad.gypi',
'browser_context_keyed_service.gypi',
'components_tests.gypi',
- 'json_schema.gypi',
'navigation_interception.gypi',
- 'policy.gypi',
'sessions.gypi',
'user_prefs.gypi',
'visitedlink.gypi',
diff --git a/chromium/components/components_tests.gypi b/chromium/components/components_tests.gypi
index 61346d07a88..b8e560008b9 100644
--- a/chromium/components/components_tests.gypi
+++ b/chromium/components/components_tests.gypi
@@ -13,9 +13,6 @@
'auto_login_parser/auto_login_parser_unittest.cc',
'browser_context_keyed_service/browser_context_dependency_manager_unittest.cc',
'browser_context_keyed_service/dependency_graph_unittest.cc',
- 'json_schema/json_schema_validator_unittest.cc',
- 'json_schema/json_schema_validator_unittest_base.cc',
- 'json_schema/json_schema_validator_unittest_base.h',
'navigation_interception/intercept_navigation_resource_throttle_unittest.cc',
'sessions/serialized_navigation_entry_unittest.cc',
'test/run_all_unittests.cc',
@@ -41,17 +38,11 @@
# Dependencies of encryptor
'encryptor',
- # Dependencies of json_schema
- 'json_schema',
-
# Dependencies of intercept_navigation_resource_throttle_unittest.cc
'../content/content.gyp:test_support_content',
'../skia/skia.gyp:skia',
'navigation_interception',
- # Dependencies of policy
- 'policy_component',
-
# Dependencies of sessions
'../third_party/protobuf/protobuf.gyp:protobuf_lite',
'sessions',
@@ -96,11 +87,6 @@
'ldflags': ['-rdynamic'],
},
}],
- ['configuration_policy==1', {
- 'sources': [
- 'policy/core/common/policy_schema_unittest.cc',
- ],
- }],
],
# TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
'msvs_disabled_warnings': [4267, ],
diff --git a/chromium/components/components_unittests.isolate b/chromium/components/components_unittests.isolate
index f60a380f60d..0c18d8fe838 100644
--- a/chromium/components/components_unittests.isolate
+++ b/chromium/components/components_unittests.isolate
@@ -8,9 +8,6 @@
'isolate_dependency_tracked': [
'<(PRODUCT_DIR)/content_resources.pak',
],
- 'isolate_dependency_untracked': [
- 'test/data/',
- ],
},
}],
],
diff --git a/chromium/components/json_schema.gypi b/chromium/components/json_schema.gypi
deleted file mode 100644
index 510f97d6fe4..00000000000
--- a/chromium/components/json_schema.gypi
+++ /dev/null
@@ -1,25 +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.
-
-{
- 'targets': [
- {
- 'target_name': 'json_schema',
- 'type': 'static_library',
- 'dependencies': [
- '../base/base.gyp:base',
- '../ui/ui.gyp:ui',
- ],
- 'include_dirs': [
- '..',
- ],
- 'sources': [
- 'json_schema/json_schema_constants.cc',
- 'json_schema/json_schema_constants.h',
- 'json_schema/json_schema_validator.cc',
- 'json_schema/json_schema_validator.h',
- ],
- },
- ],
-}
diff --git a/chromium/components/json_schema/DEPS b/chromium/components/json_schema/DEPS
deleted file mode 100644
index e7cf2c6ff61..00000000000
--- a/chromium/components/json_schema/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
- "+ui/base",
-]
diff --git a/chromium/components/json_schema/OWNERS b/chromium/components/json_schema/OWNERS
deleted file mode 100644
index f7e95c9f18f..00000000000
--- a/chromium/components/json_schema/OWNERS
+++ /dev/null
@@ -1,5 +0,0 @@
-asargent@chromium.org
-calamity@chromium.org
-kalman@chromium.org
-koz@chromium.org
-mpcomplete@chromium.org
diff --git a/chromium/components/json_schema/README b/chromium/components/json_schema/README
deleted file mode 100644
index c7453db06dc..00000000000
--- a/chromium/components/json_schema/README
+++ /dev/null
@@ -1,6 +0,0 @@
-The //components/json_schema component provides:
-
-a) JSON schema constants, which can be used to inspect schema objects.
-
-b) The JSONSchemaValidator class, which can be used to parse and validate JSON
-schemas, and to validate JSON objects against the parsed schema.
diff --git a/chromium/components/json_schema/json_schema_constants.cc b/chromium/components/json_schema/json_schema_constants.cc
deleted file mode 100644
index 0152cfc054d..00000000000
--- a/chromium/components/json_schema/json_schema_constants.cc
+++ /dev/null
@@ -1,38 +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 "components/json_schema/json_schema_constants.h"
-
-namespace json_schema_constants {
-
-const char kAdditionalProperties[] = "additionalProperties";
-const char kAny[] = "any";
-const char kArray[] = "array";
-const char kBoolean[] = "boolean";
-const char kChoices[] = "choices";
-const char kDescription[] = "description";
-const char kEnum[] = "enum";
-const char kId[] = "id";
-const char kInteger[] = "integer";
-const char kItems[] = "items";
-const char kMaximum[] = "maximum";
-const char kMaxItems[] = "maxItems";
-const char kMaxLength[] = "maxLength";
-const char kMinimum[] = "minimum";
-const char kMinItems[] = "minItems";
-const char kMinLength[] = "minLength";
-const char kNull[] = "null";
-const char kNumber[] = "number";
-const char kObject[] = "object";
-const char kOptional[] = "optional";
-const char kPattern[] = "pattern";
-const char kPatternProperties[] = "patternProperties";
-const char kProperties[] = "properties";
-const char kRef[] = "$ref";
-const char kSchema[] = "$schema";
-const char kString[] = "string";
-const char kTitle[] = "title";
-const char kType[] = "type";
-
-} // namespace json_schema_constants
diff --git a/chromium/components/json_schema/json_schema_constants.h b/chromium/components/json_schema/json_schema_constants.h
deleted file mode 100644
index 5c64ebb5606..00000000000
--- a/chromium/components/json_schema/json_schema_constants.h
+++ /dev/null
@@ -1,42 +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 COMPONENTS_JSON_SCHEMA_JSON_SCHEMA_CONSTANTS_H_
-#define COMPONENTS_JSON_SCHEMA_JSON_SCHEMA_CONSTANTS_H_
-
-// These constants are shared by code that uses JSON schemas.
-namespace json_schema_constants {
-
-extern const char kAdditionalProperties[];
-extern const char kAny[];
-extern const char kArray[];
-extern const char kBoolean[];
-extern const char kChoices[];
-extern const char kDescription[];
-extern const char kEnum[];
-extern const char kId[];
-extern const char kInteger[];
-extern const char kItems[];
-extern const char kMaximum[];
-extern const char kMaxItems[];
-extern const char kMaxLength[];
-extern const char kMinimum[];
-extern const char kMinItems[];
-extern const char kMinLength[];
-extern const char kNull[];
-extern const char kNumber[];
-extern const char kObject[];
-extern const char kOptional[];
-extern const char kPattern[];
-extern const char kPatternProperties[];
-extern const char kProperties[];
-extern const char kRef[];
-extern const char kSchema[];
-extern const char kString[];
-extern const char kTitle[];
-extern const char kType[];
-
-} // namespace json_schema_constants
-
-#endif // COMPONENTS_JSON_SCHEMA_JSON_SCHEMA_CONSTANTS_H_
diff --git a/chromium/components/json_schema/json_schema_validator.cc b/chromium/components/json_schema/json_schema_validator.cc
deleted file mode 100644
index 3816a760970..00000000000
--- a/chromium/components/json_schema/json_schema_validator.cc
+++ /dev/null
@@ -1,727 +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 "components/json_schema/json_schema_validator.h"
-
-#include <algorithm>
-#include <cfloat>
-#include <cmath>
-
-#include "base/json/json_reader.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/values.h"
-#include "components/json_schema/json_schema_constants.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace schema = json_schema_constants;
-
-namespace {
-
-double GetNumberValue(const base::Value* value) {
- double result = 0;
- CHECK(value->GetAsDouble(&result))
- << "Unexpected value type: " << value->GetType();
- return result;
-}
-
-bool IsValidType(const std::string& type) {
- static const char* kValidTypes[] = {
- schema::kAny,
- schema::kArray,
- schema::kBoolean,
- schema::kInteger,
- schema::kNull,
- schema::kNumber,
- schema::kObject,
- schema::kString,
- };
- const char** end = kValidTypes + arraysize(kValidTypes);
- return std::find(kValidTypes, end, type) != end;
-}
-
-// Maps a schema attribute name to its expected type.
-struct ExpectedType {
- const char* key;
- base::Value::Type type;
-};
-
-// Helper for std::lower_bound.
-bool CompareToString(const ExpectedType& entry, const std::string& key) {
- return entry.key < key;
-}
-
-bool IsValidSchema(const base::DictionaryValue* dict, std::string* error) {
- // This array must be sorted, so that std::lower_bound can perform a
- // binary search.
- static const ExpectedType kExpectedTypes[] = {
- // Note: kRef == "$ref", kSchema == "$schema"
- { schema::kRef, base::Value::TYPE_STRING },
- { schema::kSchema, base::Value::TYPE_STRING },
-
- { schema::kAdditionalProperties, base::Value::TYPE_DICTIONARY },
- { schema::kChoices, base::Value::TYPE_LIST },
- { schema::kDescription, base::Value::TYPE_STRING },
- { schema::kEnum, base::Value::TYPE_LIST },
- { schema::kId, base::Value::TYPE_STRING },
- { schema::kMaxItems, base::Value::TYPE_INTEGER },
- { schema::kMaxLength, base::Value::TYPE_INTEGER },
- { schema::kMaximum, base::Value::TYPE_DOUBLE },
- { schema::kMinItems, base::Value::TYPE_INTEGER },
- { schema::kMinLength, base::Value::TYPE_INTEGER },
- { schema::kMinimum, base::Value::TYPE_DOUBLE },
- { schema::kOptional, base::Value::TYPE_BOOLEAN },
- { schema::kProperties, base::Value::TYPE_DICTIONARY },
- { schema::kTitle, base::Value::TYPE_STRING },
- };
-
- bool has_type = false;
- const base::ListValue* list_value = NULL;
- const base::DictionaryValue* dictionary_value = NULL;
- std::string string_value;
-
- for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) {
- // Validate the "type" attribute, which may be a string or a list.
- if (it.key() == schema::kType) {
- switch (it.value().GetType()) {
- case base::Value::TYPE_STRING:
- it.value().GetAsString(&string_value);
- if (!IsValidType(string_value)) {
- *error = "Invalid value for type attribute";
- return false;
- }
- break;
- case base::Value::TYPE_LIST:
- it.value().GetAsList(&list_value);
- for (size_t i = 0; i < list_value->GetSize(); ++i) {
- if (!list_value->GetString(i, &string_value) ||
- !IsValidType(string_value)) {
- *error = "Invalid value for type attribute";
- return false;
- }
- }
- break;
- default:
- *error = "Invalid value for type attribute";
- return false;
- }
- has_type = true;
- continue;
- }
-
- // Validate the "items" attribute, which is a schema or a list of schemas.
- if (it.key() == schema::kItems) {
- if (it.value().GetAsDictionary(&dictionary_value)) {
- if (!IsValidSchema(dictionary_value, error)) {
- DCHECK(!error->empty());
- return false;
- }
- } else if (it.value().GetAsList(&list_value)) {
- for (size_t i = 0; i < list_value->GetSize(); ++i) {
- if (!list_value->GetDictionary(i, &dictionary_value)) {
- *error = base::StringPrintf(
- "Invalid entry in items attribute at index %d",
- static_cast<int>(i));
- return false;
- }
- if (!IsValidSchema(dictionary_value, error)) {
- DCHECK(!error->empty());
- return false;
- }
- }
- } else {
- *error = "Invalid value for items attribute";
- return false;
- }
- continue;
- }
-
- // All the other attributes have a single valid type.
- const ExpectedType* end = kExpectedTypes + arraysize(kExpectedTypes);
- const ExpectedType* entry = std::lower_bound(
- kExpectedTypes, end, it.key(), CompareToString);
- if (entry == end || entry->key != it.key()) {
- *error = base::StringPrintf("Invalid attribute %s", it.key().c_str());
- return false;
- }
- if (!it.value().IsType(entry->type)) {
- *error = base::StringPrintf("Invalid value for %s attribute",
- it.key().c_str());
- return false;
- }
-
- // base::Value::TYPE_INTEGER attributes must be >= 0.
- // This applies to "minItems", "maxItems", "minLength" and "maxLength".
- if (it.value().IsType(base::Value::TYPE_INTEGER)) {
- int integer_value;
- it.value().GetAsInteger(&integer_value);
- if (integer_value < 0) {
- *error = base::StringPrintf("Value of %s must be >= 0, got %d",
- it.key().c_str(), integer_value);
- return false;
- }
- }
-
- // Validate the "properties" attribute. Each entry maps a key to a schema.
- if (it.key() == schema::kProperties) {
- it.value().GetAsDictionary(&dictionary_value);
- for (base::DictionaryValue::Iterator it(*dictionary_value);
- !it.IsAtEnd(); it.Advance()) {
- if (!it.value().GetAsDictionary(&dictionary_value)) {
- *error = "Invalid value for properties attribute";
- return false;
- }
- if (!IsValidSchema(dictionary_value, error)) {
- DCHECK(!error->empty());
- return false;
- }
- }
- }
-
- // Validate "additionalProperties" attribute, which is a schema.
- if (it.key() == schema::kAdditionalProperties) {
- it.value().GetAsDictionary(&dictionary_value);
- if (!IsValidSchema(dictionary_value, error)) {
- DCHECK(!error->empty());
- return false;
- }
- }
-
- // Validate the values contained in an "enum" attribute.
- if (it.key() == schema::kEnum) {
- it.value().GetAsList(&list_value);
- for (size_t i = 0; i < list_value->GetSize(); ++i) {
- const base::Value* value = NULL;
- list_value->Get(i, &value);
- switch (value->GetType()) {
- case base::Value::TYPE_NULL:
- case base::Value::TYPE_BOOLEAN:
- case base::Value::TYPE_INTEGER:
- case base::Value::TYPE_DOUBLE:
- case base::Value::TYPE_STRING:
- break;
- default:
- *error = "Invalid value in enum attribute";
- return false;
- }
- }
- }
-
- // Validate the schemas contained in a "choices" attribute.
- if (it.key() == schema::kChoices) {
- it.value().GetAsList(&list_value);
- for (size_t i = 0; i < list_value->GetSize(); ++i) {
- if (!list_value->GetDictionary(i, &dictionary_value)) {
- *error = "Invalid choices attribute";
- return false;
- }
- if (!IsValidSchema(dictionary_value, error)) {
- DCHECK(!error->empty());
- return false;
- }
- }
- }
- }
-
- if (!has_type) {
- *error = "Schema must have a type attribute";
- return false;
- }
-
- return true;
-}
-
-} // namespace
-
-
-JSONSchemaValidator::Error::Error() {
-}
-
-JSONSchemaValidator::Error::Error(const std::string& message)
- : path(message) {
-}
-
-JSONSchemaValidator::Error::Error(const std::string& path,
- const std::string& message)
- : path(path), message(message) {
-}
-
-
-const char JSONSchemaValidator::kUnknownTypeReference[] =
- "Unknown schema reference: *.";
-const char JSONSchemaValidator::kInvalidChoice[] =
- "Value does not match any valid type choices.";
-const char JSONSchemaValidator::kInvalidEnum[] =
- "Value does not match any valid enum choices.";
-const char JSONSchemaValidator::kObjectPropertyIsRequired[] =
- "Property is required.";
-const char JSONSchemaValidator::kUnexpectedProperty[] =
- "Unexpected property.";
-const char JSONSchemaValidator::kArrayMinItems[] =
- "Array must have at least * items.";
-const char JSONSchemaValidator::kArrayMaxItems[] =
- "Array must not have more than * items.";
-const char JSONSchemaValidator::kArrayItemRequired[] =
- "Item is required.";
-const char JSONSchemaValidator::kStringMinLength[] =
- "String must be at least * characters long.";
-const char JSONSchemaValidator::kStringMaxLength[] =
- "String must not be more than * characters long.";
-const char JSONSchemaValidator::kStringPattern[] =
- "String must match the pattern: *.";
-const char JSONSchemaValidator::kNumberMinimum[] =
- "Value must not be less than *.";
-const char JSONSchemaValidator::kNumberMaximum[] =
- "Value must not be greater than *.";
-const char JSONSchemaValidator::kInvalidType[] =
- "Expected '*' but got '*'.";
-const char JSONSchemaValidator::kInvalidTypeIntegerNumber[] =
- "Expected 'integer' but got 'number', consider using Math.round().";
-
-
-// static
-std::string JSONSchemaValidator::GetJSONSchemaType(const base::Value* value) {
- switch (value->GetType()) {
- case base::Value::TYPE_NULL:
- return schema::kNull;
- case base::Value::TYPE_BOOLEAN:
- return schema::kBoolean;
- case base::Value::TYPE_INTEGER:
- return schema::kInteger;
- case base::Value::TYPE_DOUBLE: {
- double double_value = 0;
- value->GetAsDouble(&double_value);
- if (std::abs(double_value) <= std::pow(2.0, DBL_MANT_DIG) &&
- double_value == floor(double_value)) {
- return schema::kInteger;
- } else {
- return schema::kNumber;
- }
- }
- case base::Value::TYPE_STRING:
- return schema::kString;
- case base::Value::TYPE_DICTIONARY:
- return schema::kObject;
- case base::Value::TYPE_LIST:
- return schema::kArray;
- default:
- NOTREACHED() << "Unexpected value type: " << value->GetType();
- return std::string();
- }
-}
-
-// static
-std::string JSONSchemaValidator::FormatErrorMessage(const std::string& format,
- const std::string& s1) {
- std::string ret_val = format;
- ReplaceFirstSubstringAfterOffset(&ret_val, 0, "*", s1);
- return ret_val;
-}
-
-// static
-std::string JSONSchemaValidator::FormatErrorMessage(const std::string& format,
- const std::string& s1,
- const std::string& s2) {
- std::string ret_val = format;
- ReplaceFirstSubstringAfterOffset(&ret_val, 0, "*", s1);
- ReplaceFirstSubstringAfterOffset(&ret_val, 0, "*", s2);
- return ret_val;
-}
-
-// static
-scoped_ptr<base::DictionaryValue> JSONSchemaValidator::IsValidSchema(
- const std::string& schema,
- std::string* error) {
- base::JSONParserOptions options = base::JSON_PARSE_RFC;
- scoped_ptr<base::Value> json(
- base::JSONReader::ReadAndReturnError(schema, options, NULL, error));
- if (!json)
- return scoped_ptr<base::DictionaryValue>();
- base::DictionaryValue* dict = NULL;
- if (!json->GetAsDictionary(&dict)) {
- *error = "Schema must be a JSON object";
- return scoped_ptr<base::DictionaryValue>();
- }
- if (!::IsValidSchema(dict, error))
- return scoped_ptr<base::DictionaryValue>();
- ignore_result(json.release());
- return make_scoped_ptr(dict);
-}
-
-JSONSchemaValidator::JSONSchemaValidator(base::DictionaryValue* schema)
- : schema_root_(schema), default_allow_additional_properties_(false) {
-}
-
-JSONSchemaValidator::JSONSchemaValidator(base::DictionaryValue* schema,
- base::ListValue* types)
- : schema_root_(schema), default_allow_additional_properties_(false) {
- if (!types)
- return;
-
- for (size_t i = 0; i < types->GetSize(); ++i) {
- base::DictionaryValue* type = NULL;
- CHECK(types->GetDictionary(i, &type));
-
- std::string id;
- CHECK(type->GetString(schema::kId, &id));
-
- CHECK(types_.find(id) == types_.end());
- types_[id] = type;
- }
-}
-
-JSONSchemaValidator::~JSONSchemaValidator() {}
-
-bool JSONSchemaValidator::Validate(const base::Value* instance) {
- errors_.clear();
- Validate(instance, schema_root_, std::string());
- return errors_.empty();
-}
-
-void JSONSchemaValidator::Validate(const base::Value* instance,
- const base::DictionaryValue* schema,
- const std::string& path) {
- // If this schema defines itself as reference type, save it in this.types.
- std::string id;
- if (schema->GetString(schema::kId, &id)) {
- TypeMap::iterator iter = types_.find(id);
- if (iter == types_.end())
- types_[id] = schema;
- else
- DCHECK(iter->second == schema);
- }
-
- // If the schema has a $ref property, the instance must validate against
- // that schema. It must be present in types_ to be referenced.
- std::string ref;
- if (schema->GetString(schema::kRef, &ref)) {
- TypeMap::iterator type = types_.find(ref);
- if (type == types_.end()) {
- errors_.push_back(
- Error(path, FormatErrorMessage(kUnknownTypeReference, ref)));
- } else {
- Validate(instance, type->second, path);
- }
- return;
- }
-
- // If the schema has a choices property, the instance must validate against at
- // least one of the items in that array.
- const base::ListValue* choices = NULL;
- if (schema->GetList(schema::kChoices, &choices)) {
- ValidateChoices(instance, choices, path);
- return;
- }
-
- // If the schema has an enum property, the instance must be one of those
- // values.
- const base::ListValue* enumeration = NULL;
- if (schema->GetList(schema::kEnum, &enumeration)) {
- ValidateEnum(instance, enumeration, path);
- return;
- }
-
- std::string type;
- schema->GetString(schema::kType, &type);
- CHECK(!type.empty());
- if (type != schema::kAny) {
- if (!ValidateType(instance, type, path))
- return;
-
- // These casts are safe because of checks in ValidateType().
- if (type == schema::kObject) {
- ValidateObject(static_cast<const base::DictionaryValue*>(instance),
- schema,
- path);
- } else if (type == schema::kArray) {
- ValidateArray(static_cast<const base::ListValue*>(instance),
- schema, path);
- } else if (type == schema::kString) {
- // Intentionally NOT downcasting to StringValue*. TYPE_STRING only implies
- // GetAsString() can safely be carried out, not that it's a StringValue.
- ValidateString(instance, schema, path);
- } else if (type == schema::kNumber || type == schema::kInteger) {
- ValidateNumber(instance, schema, path);
- } else if (type != schema::kBoolean && type != schema::kNull) {
- NOTREACHED() << "Unexpected type: " << type;
- }
- }
-}
-
-void JSONSchemaValidator::ValidateChoices(const base::Value* instance,
- const base::ListValue* choices,
- const std::string& path) {
- size_t original_num_errors = errors_.size();
-
- for (size_t i = 0; i < choices->GetSize(); ++i) {
- const base::DictionaryValue* choice = NULL;
- CHECK(choices->GetDictionary(i, &choice));
-
- Validate(instance, choice, path);
- if (errors_.size() == original_num_errors)
- return;
-
- // We discard the error from each choice. We only want to know if any of the
- // validations succeeded.
- errors_.resize(original_num_errors);
- }
-
- // Now add a generic error that no choices matched.
- errors_.push_back(Error(path, kInvalidChoice));
- return;
-}
-
-void JSONSchemaValidator::ValidateEnum(const base::Value* instance,
- const base::ListValue* choices,
- const std::string& path) {
- for (size_t i = 0; i < choices->GetSize(); ++i) {
- const base::Value* choice = NULL;
- CHECK(choices->Get(i, &choice));
- switch (choice->GetType()) {
- case base::Value::TYPE_NULL:
- case base::Value::TYPE_BOOLEAN:
- case base::Value::TYPE_STRING:
- if (instance->Equals(choice))
- return;
- break;
-
- case base::Value::TYPE_INTEGER:
- case base::Value::TYPE_DOUBLE:
- if (instance->IsType(base::Value::TYPE_INTEGER) ||
- instance->IsType(base::Value::TYPE_DOUBLE)) {
- if (GetNumberValue(choice) == GetNumberValue(instance))
- return;
- }
- break;
-
- default:
- NOTREACHED() << "Unexpected type in enum: " << choice->GetType();
- }
- }
-
- errors_.push_back(Error(path, kInvalidEnum));
-}
-
-void JSONSchemaValidator::ValidateObject(const base::DictionaryValue* instance,
- const base::DictionaryValue* schema,
- const std::string& path) {
- const base::DictionaryValue* properties = NULL;
- schema->GetDictionary(schema::kProperties, &properties);
- if (properties) {
- for (base::DictionaryValue::Iterator it(*properties); !it.IsAtEnd();
- it.Advance()) {
- std::string prop_path = path.empty() ? it.key() : (path + "." + it.key());
- const base::DictionaryValue* prop_schema = NULL;
- CHECK(it.value().GetAsDictionary(&prop_schema));
-
- const base::Value* prop_value = NULL;
- if (instance->Get(it.key(), &prop_value)) {
- Validate(prop_value, prop_schema, prop_path);
- } else {
- // Properties are required unless there is an optional field set to
- // 'true'.
- bool is_optional = false;
- prop_schema->GetBoolean(schema::kOptional, &is_optional);
- if (!is_optional) {
- errors_.push_back(Error(prop_path, kObjectPropertyIsRequired));
- }
- }
- }
- }
-
- const base::DictionaryValue* additional_properties_schema = NULL;
- if (SchemaAllowsAnyAdditionalItems(schema, &additional_properties_schema))
- return;
-
- // Validate additional properties.
- for (base::DictionaryValue::Iterator it(*instance); !it.IsAtEnd();
- it.Advance()) {
- if (properties && properties->HasKey(it.key()))
- continue;
-
- std::string prop_path = path.empty() ? it.key() : path + "." + it.key();
- if (!additional_properties_schema) {
- errors_.push_back(Error(prop_path, kUnexpectedProperty));
- } else {
- Validate(&it.value(), additional_properties_schema, prop_path);
- }
- }
-}
-
-void JSONSchemaValidator::ValidateArray(const base::ListValue* instance,
- const base::DictionaryValue* schema,
- const std::string& path) {
- const base::DictionaryValue* single_type = NULL;
- size_t instance_size = instance->GetSize();
- if (schema->GetDictionary(schema::kItems, &single_type)) {
- int min_items = 0;
- if (schema->GetInteger(schema::kMinItems, &min_items)) {
- CHECK(min_items >= 0);
- if (instance_size < static_cast<size_t>(min_items)) {
- errors_.push_back(Error(path, FormatErrorMessage(
- kArrayMinItems, base::IntToString(min_items))));
- }
- }
-
- int max_items = 0;
- if (schema->GetInteger(schema::kMaxItems, &max_items)) {
- CHECK(max_items >= 0);
- if (instance_size > static_cast<size_t>(max_items)) {
- errors_.push_back(Error(path, FormatErrorMessage(
- kArrayMaxItems, base::IntToString(max_items))));
- }
- }
-
- // If the items property is a single schema, each item in the array must
- // validate against that schema.
- for (size_t i = 0; i < instance_size; ++i) {
- const base::Value* item = NULL;
- CHECK(instance->Get(i, &item));
- std::string i_str = base::Uint64ToString(i);
- std::string item_path = path.empty() ? i_str : (path + "." + i_str);
- Validate(item, single_type, item_path);
- }
-
- return;
- }
-
- // Otherwise, the list must be a tuple type, where each item in the list has a
- // particular schema.
- ValidateTuple(instance, schema, path);
-}
-
-void JSONSchemaValidator::ValidateTuple(const base::ListValue* instance,
- const base::DictionaryValue* schema,
- const std::string& path) {
- const base::ListValue* tuple_type = NULL;
- schema->GetList(schema::kItems, &tuple_type);
- size_t tuple_size = tuple_type ? tuple_type->GetSize() : 0;
- if (tuple_type) {
- for (size_t i = 0; i < tuple_size; ++i) {
- std::string i_str = base::Uint64ToString(i);
- std::string item_path = path.empty() ? i_str : (path + "." + i_str);
- const base::DictionaryValue* item_schema = NULL;
- CHECK(tuple_type->GetDictionary(i, &item_schema));
- const base::Value* item_value = NULL;
- instance->Get(i, &item_value);
- if (item_value && item_value->GetType() != base::Value::TYPE_NULL) {
- Validate(item_value, item_schema, item_path);
- } else {
- bool is_optional = false;
- item_schema->GetBoolean(schema::kOptional, &is_optional);
- if (!is_optional) {
- errors_.push_back(Error(item_path, kArrayItemRequired));
- return;
- }
- }
- }
- }
-
- const base::DictionaryValue* additional_properties_schema = NULL;
- if (SchemaAllowsAnyAdditionalItems(schema, &additional_properties_schema))
- return;
-
- size_t instance_size = instance->GetSize();
- if (additional_properties_schema) {
- // Any additional properties must validate against the additionalProperties
- // schema.
- for (size_t i = tuple_size; i < instance_size; ++i) {
- std::string i_str = base::Uint64ToString(i);
- std::string item_path = path.empty() ? i_str : (path + "." + i_str);
- const base::Value* item_value = NULL;
- CHECK(instance->Get(i, &item_value));
- Validate(item_value, additional_properties_schema, item_path);
- }
- } else if (instance_size > tuple_size) {
- errors_.push_back(Error(path, FormatErrorMessage(
- kArrayMaxItems, base::Uint64ToString(tuple_size))));
- }
-}
-
-void JSONSchemaValidator::ValidateString(const base::Value* instance,
- const base::DictionaryValue* schema,
- const std::string& path) {
- std::string value;
- CHECK(instance->GetAsString(&value));
-
- int min_length = 0;
- if (schema->GetInteger(schema::kMinLength, &min_length)) {
- CHECK(min_length >= 0);
- if (value.size() < static_cast<size_t>(min_length)) {
- errors_.push_back(Error(path, FormatErrorMessage(
- kStringMinLength, base::IntToString(min_length))));
- }
- }
-
- int max_length = 0;
- if (schema->GetInteger(schema::kMaxLength, &max_length)) {
- CHECK(max_length >= 0);
- if (value.size() > static_cast<size_t>(max_length)) {
- errors_.push_back(Error(path, FormatErrorMessage(
- kStringMaxLength, base::IntToString(max_length))));
- }
- }
-
- CHECK(!schema->HasKey(schema::kPattern)) << "Pattern is not supported.";
-}
-
-void JSONSchemaValidator::ValidateNumber(const base::Value* instance,
- const base::DictionaryValue* schema,
- const std::string& path) {
- double value = GetNumberValue(instance);
-
- // TODO(aa): It would be good to test that the double is not infinity or nan,
- // but isnan and isinf aren't defined on Windows.
-
- double minimum = 0;
- if (schema->GetDouble(schema::kMinimum, &minimum)) {
- if (value < minimum)
- errors_.push_back(Error(path, FormatErrorMessage(
- kNumberMinimum, base::DoubleToString(minimum))));
- }
-
- double maximum = 0;
- if (schema->GetDouble(schema::kMaximum, &maximum)) {
- if (value > maximum)
- errors_.push_back(Error(path, FormatErrorMessage(
- kNumberMaximum, base::DoubleToString(maximum))));
- }
-}
-
-bool JSONSchemaValidator::ValidateType(const base::Value* instance,
- const std::string& expected_type,
- const std::string& path) {
- std::string actual_type = GetJSONSchemaType(instance);
- if (expected_type == actual_type ||
- (expected_type == schema::kNumber && actual_type == schema::kInteger)) {
- return true;
- } else if (expected_type == schema::kInteger &&
- actual_type == schema::kNumber) {
- errors_.push_back(Error(path, kInvalidTypeIntegerNumber));
- return false;
- } else {
- errors_.push_back(Error(path, FormatErrorMessage(
- kInvalidType, expected_type, actual_type)));
- return false;
- }
-}
-
-bool JSONSchemaValidator::SchemaAllowsAnyAdditionalItems(
- const base::DictionaryValue* schema,
- const base::DictionaryValue** additional_properties_schema) {
- // If the validator allows additional properties globally, and this schema
- // doesn't override, then we can exit early.
- schema->GetDictionary(schema::kAdditionalProperties,
- additional_properties_schema);
-
- if (*additional_properties_schema) {
- std::string additional_properties_type(schema::kAny);
- CHECK((*additional_properties_schema)->GetString(
- schema::kType, &additional_properties_type));
- return additional_properties_type == schema::kAny;
- } else {
- return default_allow_additional_properties_;
- }
-}
diff --git a/chromium/components/json_schema/json_schema_validator.h b/chromium/components/json_schema/json_schema_validator.h
deleted file mode 100644
index 4584a9da77a..00000000000
--- a/chromium/components/json_schema/json_schema_validator.h
+++ /dev/null
@@ -1,235 +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 COMPONENTS_JSON_SCHEMA_JSON_SCHEMA_VALIDATOR_H_
-#define COMPONENTS_JSON_SCHEMA_JSON_SCHEMA_VALIDATOR_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/memory/scoped_ptr.h"
-
-namespace base {
-class DictionaryValue;
-class ListValue;
-class StringValue;
-class Value;
-}
-
-//==============================================================================
-// This class implements a subset of JSON Schema.
-// See: http://www.json.com/json-schema-proposal/ for more details.
-//
-// There is also an older JavaScript implementation of the same functionality in
-// chrome/renderer/resources/json_schema.js.
-//
-// The following features of JSON Schema are not implemented:
-// - requires
-// - unique
-// - disallow
-// - union types (but replaced with 'choices')
-// - number.maxDecimal
-// - string.pattern
-//
-// The following properties are not applicable to the interface exposed by
-// this class:
-// - options
-// - readonly
-// - title
-// - description
-// - format
-// - default
-// - transient
-// - hidden
-//
-// There are also these departures from the JSON Schema proposal:
-// - null counts as 'unspecified' for optional values
-// - added the 'choices' property, to allow specifying a list of possible types
-// for a value
-// - by default an "object" typed schema does not allow additional properties.
-// if present, "additionalProperties" is to be a schema against which all
-// additional properties will be validated.
-//==============================================================================
-class JSONSchemaValidator {
- public:
- // Details about a validation error.
- struct Error {
- Error();
-
- explicit Error(const std::string& message);
-
- Error(const std::string& path, const std::string& message);
-
- // The path to the location of the error in the JSON structure.
- std::string path;
-
- // An english message describing the error.
- std::string message;
- };
-
- // Error messages.
- static const char kUnknownTypeReference[];
- static const char kInvalidChoice[];
- static const char kInvalidEnum[];
- static const char kObjectPropertyIsRequired[];
- static const char kUnexpectedProperty[];
- static const char kArrayMinItems[];
- static const char kArrayMaxItems[];
- static const char kArrayItemRequired[];
- static const char kStringMinLength[];
- static const char kStringMaxLength[];
- static const char kStringPattern[];
- static const char kNumberMinimum[];
- static const char kNumberMaximum[];
- static const char kInvalidType[];
- static const char kInvalidTypeIntegerNumber[];
-
- // Classifies a Value as one of the JSON schema primitive types.
- static std::string GetJSONSchemaType(const base::Value* value);
-
- // Utility methods to format error messages. The first method can have one
- // wildcard represented by '*', which is replaced with s1. The second method
- // can have two, which are replaced by s1 and s2.
- static std::string FormatErrorMessage(const std::string& format,
- const std::string& s1);
- static std::string FormatErrorMessage(const std::string& format,
- const std::string& s1,
- const std::string& s2);
-
- // Verifies if |schema| is a valid JSON v3 schema. When this validation passes
- // then |schema| is valid JSON that can be parsed into a DictionaryValue,
- // and that DictionaryValue can be used to build a JSONSchemaValidator.
- // Returns the parsed DictionaryValue when |schema| validated, otherwise
- // returns NULL. In that case, |error| contains an error description.
- static scoped_ptr<base::DictionaryValue> IsValidSchema(
- const std::string& schema,
- std::string* error);
-
- // Creates a validator for the specified schema.
- //
- // NOTE: This constructor assumes that |schema| is well formed and valid.
- // Errors will result in CHECK at runtime; this constructor should not be used
- // with untrusted schemas.
- explicit JSONSchemaValidator(base::DictionaryValue* schema);
-
- // Creates a validator for the specified schema and user-defined types. Each
- // type must be a valid JSONSchema type description with an additional "id"
- // field. Schema objects in |schema| can refer to these types with the "$ref"
- // property.
- //
- // NOTE: This constructor assumes that |schema| and |types| are well-formed
- // and valid. Errors will result in CHECK at runtime; this constructor should
- // not be used with untrusted schemas.
- JSONSchemaValidator(base::DictionaryValue* schema, base::ListValue* types);
-
- ~JSONSchemaValidator();
-
- // Whether the validator allows additional items for objects and lists, beyond
- // those defined by their schema, by default.
- //
- // This setting defaults to false: all items in an instance list or object
- // must be defined by the corresponding schema.
- //
- // This setting can be overridden on individual object and list schemas by
- // setting the "additionalProperties" field.
- bool default_allow_additional_properties() const {
- return default_allow_additional_properties_;
- }
-
- void set_default_allow_additional_properties(bool val) {
- default_allow_additional_properties_ = val;
- }
-
- // Returns any errors from the last call to to Validate().
- const std::vector<Error>& errors() const {
- return errors_;
- }
-
- // Validates a JSON value. Returns true if the instance is valid, false
- // otherwise. If false is returned any errors are available from the errors()
- // getter.
- bool Validate(const base::Value* instance);
-
- private:
- typedef std::map<std::string, const base::DictionaryValue*> TypeMap;
-
- // Each of the below methods handle a subset of the validation process. The
- // path paramater is the path to |instance| from the root of the instance tree
- // and is used in error messages.
-
- // Validates any instance node against any schema node. This is called for
- // every node in the instance tree, and it just decides which of the more
- // detailed methods to call.
- void Validate(const base::Value* instance,
- const base::DictionaryValue* schema,
- const std::string& path);
-
- // Validates a node against a list of possible schemas. If any one of the
- // schemas match, the node is valid.
- void ValidateChoices(const base::Value* instance,
- const base::ListValue* choices,
- const std::string& path);
-
- // Validates a node against a list of exact primitive values, eg 42, "foobar".
- void ValidateEnum(const base::Value* instance,
- const base::ListValue* choices,
- const std::string& path);
-
- // Validates a JSON object against an object schema node.
- void ValidateObject(const base::DictionaryValue* instance,
- const base::DictionaryValue* schema,
- const std::string& path);
-
- // Validates a JSON array against an array schema node.
- void ValidateArray(const base::ListValue* instance,
- const base::DictionaryValue* schema,
- const std::string& path);
-
- // Validates a JSON array against an array schema node configured to be a
- // tuple. In a tuple, there is one schema node for each item expected in the
- // array.
- void ValidateTuple(const base::ListValue* instance,
- const base::DictionaryValue* schema,
- const std::string& path);
-
- // Validate a JSON string against a string schema node.
- void ValidateString(const base::Value* instance,
- const base::DictionaryValue* schema,
- const std::string& path);
-
- // Validate a JSON number against a number schema node.
- void ValidateNumber(const base::Value* instance,
- const base::DictionaryValue* schema,
- const std::string& path);
-
- // Validates that the JSON node |instance| has |expected_type|.
- bool ValidateType(const base::Value* instance,
- const std::string& expected_type,
- const std::string& path);
-
- // Returns true if |schema| will allow additional items of any type.
- bool SchemaAllowsAnyAdditionalItems(
- const base::DictionaryValue* schema,
- const base::DictionaryValue** addition_items_schema);
-
- // The root schema node.
- base::DictionaryValue* schema_root_;
-
- // Map of user-defined name to type.
- TypeMap types_;
-
- // Whether we allow additional properties on objects by default. This can be
- // overridden by the allow_additional_properties flag on an Object schema.
- bool default_allow_additional_properties_;
-
- // Errors accumulated since the last call to Validate().
- std::vector<Error> errors_;
-
-
- DISALLOW_COPY_AND_ASSIGN(JSONSchemaValidator);
-};
-
-#endif // COMPONENTS_JSON_SCHEMA_JSON_SCHEMA_VALIDATOR_H_
diff --git a/chromium/components/json_schema/json_schema_validator_unittest.cc b/chromium/components/json_schema/json_schema_validator_unittest.cc
deleted file mode 100644
index 4844ed1a888..00000000000
--- a/chromium/components/json_schema/json_schema_validator_unittest.cc
+++ /dev/null
@@ -1,129 +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 "base/values.h"
-#include "components/json_schema/json_schema_validator.h"
-#include "components/json_schema/json_schema_validator_unittest_base.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-class JSONSchemaValidatorCPPTest : public JSONSchemaValidatorTestBase {
- public:
- JSONSchemaValidatorCPPTest()
- : JSONSchemaValidatorTestBase(JSONSchemaValidatorTestBase::CPP) {
- }
-
- protected:
- virtual void ExpectValid(const std::string& test_source,
- base::Value* instance,
- base::DictionaryValue* schema,
- base::ListValue* types) OVERRIDE {
- JSONSchemaValidator validator(schema, types);
- if (validator.Validate(instance))
- return;
-
- for (size_t i = 0; i < validator.errors().size(); ++i) {
- ADD_FAILURE() << test_source << ": "
- << validator.errors()[i].path << ": "
- << validator.errors()[i].message;
- }
- }
-
- virtual void ExpectNotValid(
- const std::string& test_source,
- base::Value* instance, base::DictionaryValue* schema,
- base::ListValue* types,
- const std::string& expected_error_path,
- const std::string& expected_error_message) OVERRIDE {
- JSONSchemaValidator validator(schema, types);
- if (validator.Validate(instance)) {
- ADD_FAILURE() << test_source;
- return;
- }
-
- ASSERT_EQ(1u, validator.errors().size()) << test_source;
- EXPECT_EQ(expected_error_path, validator.errors()[0].path) << test_source;
- EXPECT_EQ(expected_error_message, validator.errors()[0].message)
- << test_source;
- }
-};
-
-TEST_F(JSONSchemaValidatorCPPTest, Test) {
- RunTests();
-}
-
-TEST(JSONSchemaValidator, IsValidSchema) {
- std::string error;
- EXPECT_FALSE(JSONSchemaValidator::IsValidSchema("", &error));
- EXPECT_FALSE(JSONSchemaValidator::IsValidSchema("\0", &error));
- EXPECT_FALSE(JSONSchemaValidator::IsValidSchema("string", &error));
- EXPECT_FALSE(JSONSchemaValidator::IsValidSchema("\"string\"", &error));
- EXPECT_FALSE(JSONSchemaValidator::IsValidSchema("[]", &error));
- EXPECT_FALSE(JSONSchemaValidator::IsValidSchema("{}", &error));
- EXPECT_FALSE(JSONSchemaValidator::IsValidSchema(
- "{ \"type\": 123 }", &error));
- EXPECT_FALSE(JSONSchemaValidator::IsValidSchema(
- "{ \"type\": \"invalid\" }", &error));
- EXPECT_FALSE(JSONSchemaValidator::IsValidSchema(
- "{"
- " \"type\": \"object\","
- " \"properties\": []" // Invalid properties type.
- "}", &error));
- EXPECT_FALSE(JSONSchemaValidator::IsValidSchema(
- "{"
- " \"type\": \"string\","
- " \"maxLength\": -1" // Must be >= 0.
- "}", &error));
- EXPECT_FALSE(JSONSchemaValidator::IsValidSchema(
- "{"
- " \"type\": \"string\","
- " \"enum\": [ {} ]," // "enum" must contain simple values.
- "}", &error));
- EXPECT_FALSE(JSONSchemaValidator::IsValidSchema(
- "{"
- " \"type\": \"array\","
- " \"items\": [ 123 ]," // "items" must contain a schema or schemas.
- "}", &error));
- EXPECT_TRUE(JSONSchemaValidator::IsValidSchema(
- "{ \"type\": \"object\" }", &error)) << error;
- EXPECT_TRUE(JSONSchemaValidator::IsValidSchema(
- "{ \"type\": [\"object\", \"array\"] }", &error)) << error;
- EXPECT_TRUE(JSONSchemaValidator::IsValidSchema(
- "{"
- " \"type\": [\"object\", \"array\"],"
- " \"properties\": {"
- " \"string-property\": {"
- " \"type\": \"string\","
- " \"minLength\": 1,"
- " \"maxLength\": 100,"
- " \"title\": \"The String Policy\","
- " \"description\": \"This policy controls the String widget.\""
- " },"
- " \"integer-property\": {"
- " \"type\": \"number\","
- " \"minimum\": 1000.0,"
- " \"maximum\": 9999.0"
- " },"
- " \"enum-property\": {"
- " \"type\": \"integer\","
- " \"enum\": [0, 1, 10, 100]"
- " },"
- " \"items-property\": {"
- " \"type\": \"array\","
- " \"items\": {"
- " \"type\": \"string\""
- " }"
- " },"
- " \"items-list-property\": {"
- " \"type\": \"array\","
- " \"items\": ["
- " { \"type\": \"string\" },"
- " { \"type\": \"integer\" }"
- " ]"
- " }"
- " },"
- " \"additionalProperties\": {"
- " \"type\": \"any\""
- " }"
- "}", &error)) << error;
-}
diff --git a/chromium/components/json_schema/json_schema_validator_unittest_base.cc b/chromium/components/json_schema/json_schema_validator_unittest_base.cc
deleted file mode 100644
index 2e936a2eb9a..00000000000
--- a/chromium/components/json_schema/json_schema_validator_unittest_base.cc
+++ /dev/null
@@ -1,730 +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 "components/json_schema/json_schema_validator_unittest_base.h"
-
-#include <cfloat>
-#include <cmath>
-#include <limits>
-
-#include "base/base_paths.h"
-#include "base/file_util.h"
-#include "base/json/json_file_value_serializer.h"
-#include "base/logging.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/path_service.h"
-#include "base/strings/stringprintf.h"
-#include "base/values.h"
-#include "components/json_schema/json_schema_constants.h"
-#include "components/json_schema/json_schema_validator.h"
-
-namespace schema = json_schema_constants;
-
-namespace {
-
-#define TEST_SOURCE base::StringPrintf("%s:%i", __FILE__, __LINE__)
-
-base::Value* LoadValue(const std::string& filename) {
- base::FilePath path;
- PathService::Get(base::DIR_SOURCE_ROOT, &path);
- path = path.AppendASCII("components")
- .AppendASCII("test")
- .AppendASCII("data")
- .AppendASCII("json_schema")
- .AppendASCII(filename);
- EXPECT_TRUE(base::PathExists(path));
-
- std::string error_message;
- JSONFileValueSerializer serializer(path);
- base::Value* result = serializer.Deserialize(NULL, &error_message);
- if (!result)
- ADD_FAILURE() << "Could not parse JSON: " << error_message;
- return result;
-}
-
-base::Value* LoadValue(const std::string& filename, base::Value::Type type) {
- scoped_ptr<base::Value> result(LoadValue(filename));
- if (!result.get())
- return NULL;
- if (!result->IsType(type)) {
- ADD_FAILURE() << "Expected type " << type << ", got: " << result->GetType();
- return NULL;
- }
- return result.release();
-}
-
-base::ListValue* LoadList(const std::string& filename) {
- return static_cast<base::ListValue*>(
- LoadValue(filename, base::Value::TYPE_LIST));
-}
-
-base::DictionaryValue* LoadDictionary(const std::string& filename) {
- return static_cast<base::DictionaryValue*>(
- LoadValue(filename, base::Value::TYPE_DICTIONARY));
-}
-
-} // namespace
-
-
-JSONSchemaValidatorTestBase::JSONSchemaValidatorTestBase(
- JSONSchemaValidatorTestBase::ValidatorType type)
- : type_(type) {
-}
-
-void JSONSchemaValidatorTestBase::RunTests() {
- TestComplex();
- TestStringPattern();
- TestEnum();
- TestChoices();
- TestExtends();
- TestObject();
- TestTypeReference();
- TestArrayTuple();
- TestArrayNonTuple();
- TestString();
- TestNumber();
- TestTypeClassifier();
- TestTypes();
-}
-
-void JSONSchemaValidatorTestBase::TestComplex() {
- scoped_ptr<base::DictionaryValue> schema(
- LoadDictionary("complex_schema.json"));
- scoped_ptr<base::ListValue> instance(LoadList("complex_instance.json"));
-
- ASSERT_TRUE(schema.get());
- ASSERT_TRUE(instance.get());
-
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
- instance->Remove(instance->GetSize() - 1, NULL);
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
- instance->Append(new base::DictionaryValue());
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "1",
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType,
- schema::kNumber,
- schema::kObject));
- instance->Remove(instance->GetSize() - 1, NULL);
-
- base::DictionaryValue* item = NULL;
- ASSERT_TRUE(instance->GetDictionary(0, &item));
- item->SetString("url", "xxxxxxxxxxx");
-
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL,
- "0.url",
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kStringMaxLength, "10"));
-}
-
-void JSONSchemaValidatorTestBase::TestStringPattern() {
- // Regex patterns not supported in CPP validator.
- if (type_ == CPP)
- return;
-
- scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue());
- schema->SetString(schema::kType, schema::kString);
- schema->SetString(schema::kPattern, "foo+");
-
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::StringValue("foo")).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::StringValue("foooooo")).get(),
- schema.get(), NULL);
- ExpectNotValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::StringValue("bar")).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kStringPattern, "foo+"));
-}
-
-void JSONSchemaValidatorTestBase::TestEnum() {
- scoped_ptr<base::DictionaryValue> schema(LoadDictionary("enum_schema.json"));
-
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::StringValue("foo")).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(false)).get(),
- schema.get(), NULL);
-
- ExpectNotValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::StringValue("42")).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::kInvalidEnum);
- ExpectNotValid(TEST_SOURCE,
- scoped_ptr<base::Value>(base::Value::CreateNullValue()).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::kInvalidEnum);
-}
-
-void JSONSchemaValidatorTestBase::TestChoices() {
- scoped_ptr<base::DictionaryValue> schema(
- LoadDictionary("choices_schema.json"));
-
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(base::Value::CreateNullValue()).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(),
- schema.get(), NULL);
-
- scoped_ptr<base::DictionaryValue> instance(new base::DictionaryValue());
- instance->SetString("foo", "bar");
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
-
- ExpectNotValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::StringValue("foo")).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::kInvalidChoice);
- ExpectNotValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::ListValue()).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::kInvalidChoice);
-
- instance->SetInteger("foo", 42);
- ExpectNotValid(TEST_SOURCE,
- instance.get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::kInvalidChoice);
-}
-
-void JSONSchemaValidatorTestBase::TestExtends() {
- // TODO(aa): JS only
-}
-
-void JSONSchemaValidatorTestBase::TestObject() {
- scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue());
- schema->SetString(schema::kType, schema::kObject);
- schema->SetString("properties.foo.type", schema::kString);
- schema->SetString("properties.bar.type", schema::kInteger);
-
- scoped_ptr<base::DictionaryValue> instance(new base::DictionaryValue());
- instance->SetString("foo", "foo");
- instance->SetInteger("bar", 42);
-
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
-
- instance->SetBoolean("extra", true);
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL,
- "extra", JSONSchemaValidator::kUnexpectedProperty);
-
- instance->Remove("extra", NULL);
- instance->Remove("bar", NULL);
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "bar",
- JSONSchemaValidator::kObjectPropertyIsRequired);
-
- instance->SetString("bar", "42");
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "bar",
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType,
- schema::kInteger,
- schema::kString));
-
- base::DictionaryValue* additional_properties = new base::DictionaryValue();
- additional_properties->SetString(schema::kType, schema::kAny);
- schema->Set(schema::kAdditionalProperties, additional_properties);
-
- instance->SetInteger("bar", 42);
- instance->SetBoolean("extra", true);
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
-
- instance->SetString("extra", "foo");
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
-
- additional_properties->SetString(schema::kType, schema::kBoolean);
- instance->SetBoolean("extra", true);
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
-
- instance->SetString("extra", "foo");
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL,
- "extra", JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType,
- schema::kBoolean,
- schema::kString));
-
- base::DictionaryValue* properties = NULL;
- base::DictionaryValue* bar_property = NULL;
- ASSERT_TRUE(schema->GetDictionary(schema::kProperties, &properties));
- ASSERT_TRUE(properties->GetDictionary("bar", &bar_property));
-
- bar_property->SetBoolean(schema::kOptional, true);
- instance->Remove("extra", NULL);
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
- instance->Remove("bar", NULL);
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
- instance->Set("bar", base::Value::CreateNullValue());
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL,
- "bar", JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType,
- schema::kInteger,
- schema::kNull));
- instance->SetString("bar", "42");
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL,
- "bar", JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType,
- schema::kInteger,
- schema::kString));
-}
-
-void JSONSchemaValidatorTestBase::TestTypeReference() {
- scoped_ptr<base::ListValue> types(LoadList("reference_types.json"));
- ASSERT_TRUE(types.get());
-
- scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue());
- schema->SetString(schema::kType, schema::kObject);
- schema->SetString("properties.foo.type", schema::kString);
- schema->SetString("properties.bar.$ref", "Max10Int");
- schema->SetString("properties.baz.$ref", "MinLengthString");
-
- scoped_ptr<base::DictionaryValue> schema_inline(new base::DictionaryValue());
- schema_inline->SetString(schema::kType, schema::kObject);
- schema_inline->SetString("properties.foo.type", schema::kString);
- schema_inline->SetString("properties.bar.id", "NegativeInt");
- schema_inline->SetString("properties.bar.type", schema::kInteger);
- schema_inline->SetInteger("properties.bar.maximum", 0);
- schema_inline->SetString("properties.baz.$ref", "NegativeInt");
-
- scoped_ptr<base::DictionaryValue> instance(new base::DictionaryValue());
- instance->SetString("foo", "foo");
- instance->SetInteger("bar", 4);
- instance->SetString("baz", "ab");
-
- scoped_ptr<base::DictionaryValue> instance_inline(
- new base::DictionaryValue());
- instance_inline->SetString("foo", "foo");
- instance_inline->SetInteger("bar", -4);
- instance_inline->SetInteger("baz", -2);
-
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), types.get());
- ExpectValid(TEST_SOURCE, instance_inline.get(), schema_inline.get(), NULL);
-
- // Validation failure, but successful schema reference.
- instance->SetString("baz", "a");
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), types.get(),
- "baz", JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kStringMinLength, "2"));
-
- instance_inline->SetInteger("bar", 20);
- ExpectNotValid(TEST_SOURCE, instance_inline.get(), schema_inline.get(), NULL,
- "bar", JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kNumberMaximum, "0"));
-
- // Remove MinLengthString type.
- types->Remove(types->GetSize() - 1, NULL);
- instance->SetString("baz", "ab");
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), types.get(),
- "bar", JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kUnknownTypeReference,
- "Max10Int"));
-
- // Remove internal type "NegativeInt".
- schema_inline->Remove("properties.bar", NULL);
- instance_inline->Remove("bar", NULL);
- ExpectNotValid(TEST_SOURCE, instance_inline.get(), schema_inline.get(), NULL,
- "baz", JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kUnknownTypeReference,
- "NegativeInt"));
-}
-
-void JSONSchemaValidatorTestBase::TestArrayTuple() {
- scoped_ptr<base::DictionaryValue> schema(
- LoadDictionary("array_tuple_schema.json"));
- ASSERT_TRUE(schema.get());
-
- scoped_ptr<base::ListValue> instance(new base::ListValue());
- instance->Append(new base::StringValue("42"));
- instance->Append(new base::FundamentalValue(42));
-
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
-
- instance->Append(new base::StringValue("anything"));
- ExpectNotValid(TEST_SOURCE,
- instance.get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kArrayMaxItems, "2"));
-
- instance->Remove(1, NULL);
- instance->Remove(1, NULL);
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "1",
- JSONSchemaValidator::kArrayItemRequired);
-
- instance->Set(0, new base::FundamentalValue(42));
- instance->Append(new base::FundamentalValue(42));
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "0",
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType,
- schema::kString,
- schema::kInteger));
-
- base::DictionaryValue* additional_properties = new base::DictionaryValue();
- additional_properties->SetString(schema::kType, schema::kAny);
- schema->Set(schema::kAdditionalProperties, additional_properties);
- instance->Set(0, new base::StringValue("42"));
- instance->Append(new base::StringValue("anything"));
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
- instance->Set(2, new base::ListValue());
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
-
- additional_properties->SetString(schema::kType, schema::kBoolean);
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "2",
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType,
- schema::kBoolean,
- schema::kArray));
- instance->Set(2, new base::FundamentalValue(false));
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
-
- base::ListValue* items_schema = NULL;
- base::DictionaryValue* item0_schema = NULL;
- ASSERT_TRUE(schema->GetList(schema::kItems, &items_schema));
- ASSERT_TRUE(items_schema->GetDictionary(0, &item0_schema));
- item0_schema->SetBoolean(schema::kOptional, true);
- instance->Remove(2, NULL);
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
- // TODO(aa): I think this is inconsistent with the handling of NULL+optional
- // for objects.
- instance->Set(0, base::Value::CreateNullValue());
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
- instance->Set(0, new base::FundamentalValue(42));
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "0",
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType,
- schema::kString,
- schema::kInteger));
-}
-
-void JSONSchemaValidatorTestBase::TestArrayNonTuple() {
- scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue());
- schema->SetString(schema::kType, schema::kArray);
- schema->SetString("items.type", schema::kString);
- schema->SetInteger(schema::kMinItems, 2);
- schema->SetInteger(schema::kMaxItems, 3);
-
- scoped_ptr<base::ListValue> instance(new base::ListValue());
- instance->Append(new base::StringValue("x"));
- instance->Append(new base::StringValue("x"));
-
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
- instance->Append(new base::StringValue("x"));
- ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL);
-
- instance->Append(new base::StringValue("x"));
- ExpectNotValid(TEST_SOURCE,
- instance.get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kArrayMaxItems, "3"));
- instance->Remove(1, NULL);
- instance->Remove(1, NULL);
- instance->Remove(1, NULL);
- ExpectNotValid(TEST_SOURCE,
- instance.get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kArrayMinItems, "2"));
-
- instance->Remove(1, NULL);
- instance->Append(new base::FundamentalValue(42));
- ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "1",
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType,
- schema::kString,
- schema::kInteger));
-}
-
-void JSONSchemaValidatorTestBase::TestString() {
- scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue());
- schema->SetString(schema::kType, schema::kString);
- schema->SetInteger(schema::kMinLength, 1);
- schema->SetInteger(schema::kMaxLength, 10);
-
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::StringValue("x")).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(
- new base::StringValue("xxxxxxxxxx")).get(),
- schema.get(), NULL);
-
- ExpectNotValid(
- TEST_SOURCE,
- scoped_ptr<base::Value>(new base::StringValue(std::string())).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kStringMinLength, "1"));
- ExpectNotValid(
- TEST_SOURCE,
- scoped_ptr<base::Value>(new base::StringValue("xxxxxxxxxxx")).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kStringMaxLength, "10"));
-}
-
-void JSONSchemaValidatorTestBase::TestNumber() {
- scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue());
- schema->SetString(schema::kType, schema::kNumber);
- schema->SetInteger(schema::kMinimum, 1);
- schema->SetInteger(schema::kMaximum, 100);
- schema->SetInteger("maxDecimal", 2);
-
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(1)).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(50)).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(100)).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(88.88)).get(),
- schema.get(), NULL);
-
- ExpectNotValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(0.5)).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kNumberMinimum, "1"));
- ExpectNotValid(
- TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(100.1)).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kNumberMaximum, "100"));
-}
-
-void JSONSchemaValidatorTestBase::TestTypeClassifier() {
- EXPECT_EQ(std::string(schema::kBoolean),
- JSONSchemaValidator::GetJSONSchemaType(
- scoped_ptr<base::Value>(
- new base::FundamentalValue(true)).get()));
- EXPECT_EQ(std::string(schema::kBoolean),
- JSONSchemaValidator::GetJSONSchemaType(
- scoped_ptr<base::Value>(
- new base::FundamentalValue(false)).get()));
-
- // It doesn't matter whether the C++ type is 'integer' or 'real'. If the
- // number is integral and within the representable range of integers in
- // double, it's classified as 'integer'.
- EXPECT_EQ(std::string(schema::kInteger),
- JSONSchemaValidator::GetJSONSchemaType(
- scoped_ptr<base::Value>(new base::FundamentalValue(42)).get()));
- EXPECT_EQ(std::string(schema::kInteger),
- JSONSchemaValidator::GetJSONSchemaType(
- scoped_ptr<base::Value>(new base::FundamentalValue(0)).get()));
- EXPECT_EQ(std::string(schema::kInteger),
- JSONSchemaValidator::GetJSONSchemaType(
- scoped_ptr<base::Value>(new base::FundamentalValue(42)).get()));
- EXPECT_EQ(std::string(schema::kInteger),
- JSONSchemaValidator::GetJSONSchemaType(scoped_ptr<base::Value>(
- new base::FundamentalValue(pow(2.0, DBL_MANT_DIG))).get()));
- EXPECT_EQ(std::string(schema::kInteger),
- JSONSchemaValidator::GetJSONSchemaType(scoped_ptr<base::Value>(
- new base::FundamentalValue(pow(-2.0, DBL_MANT_DIG))).get()));
-
- // "number" is only used for non-integral numbers, or numbers beyond what
- // double can accurately represent.
- EXPECT_EQ(std::string(schema::kNumber),
- JSONSchemaValidator::GetJSONSchemaType(
- scoped_ptr<base::Value>(
- new base::FundamentalValue(88.8)).get()));
- EXPECT_EQ(std::string(schema::kNumber),
- JSONSchemaValidator::GetJSONSchemaType(scoped_ptr<base::Value>(
- new base::FundamentalValue(pow(2.0, DBL_MANT_DIG) * 2)).get()));
- EXPECT_EQ(std::string(schema::kNumber),
- JSONSchemaValidator::GetJSONSchemaType(scoped_ptr<base::Value>(
- new base::FundamentalValue(
- pow(-2.0, DBL_MANT_DIG) * 2)).get()));
-
- EXPECT_EQ(std::string(schema::kString),
- JSONSchemaValidator::GetJSONSchemaType(
- scoped_ptr<base::Value>(new base::StringValue("foo")).get()));
- EXPECT_EQ(std::string(schema::kArray),
- JSONSchemaValidator::GetJSONSchemaType(
- scoped_ptr<base::Value>(new base::ListValue()).get()));
- EXPECT_EQ(std::string(schema::kObject),
- JSONSchemaValidator::GetJSONSchemaType(
- scoped_ptr<base::Value>(new base::DictionaryValue()).get()));
- EXPECT_EQ(std::string(schema::kNull),
- JSONSchemaValidator::GetJSONSchemaType(
- scoped_ptr<base::Value>(base::Value::CreateNullValue()).get()));
-}
-
-void JSONSchemaValidatorTestBase::TestTypes() {
- scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue());
-
- // valid
- schema->SetString(schema::kType, schema::kObject);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::DictionaryValue()).get(),
- schema.get(), NULL);
-
- schema->SetString(schema::kType, schema::kArray);
- ExpectValid(TEST_SOURCE, scoped_ptr<base::Value>(new base::ListValue()).get(),
- schema.get(), NULL);
-
- schema->SetString(schema::kType, schema::kString);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::StringValue("foobar")).get(),
- schema.get(), NULL);
-
- schema->SetString(schema::kType, schema::kNumber);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(88.8)).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(0)).get(),
- schema.get(), NULL);
-
- schema->SetString(schema::kType, schema::kInteger);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(0)).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(
- new base::FundamentalValue(pow(2.0, DBL_MANT_DIG))).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(
- new base::FundamentalValue(pow(-2.0, DBL_MANT_DIG))).get(),
- schema.get(), NULL);
-
- schema->SetString(schema::kType, schema::kBoolean);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(false)).get(),
- schema.get(), NULL);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(true)).get(),
- schema.get(), NULL);
-
- schema->SetString(schema::kType, schema::kNull);
- ExpectValid(TEST_SOURCE,
- scoped_ptr<base::Value>(base::Value::CreateNullValue()).get(),
- schema.get(), NULL);
-
- // not valid
- schema->SetString(schema::kType, schema::kObject);
- ExpectNotValid(
- TEST_SOURCE,
- scoped_ptr<base::Value>(new base::ListValue()).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType, schema::kObject, schema::kArray));
-
- schema->SetString(schema::kType, schema::kObject);
- ExpectNotValid(
- TEST_SOURCE,
- scoped_ptr<base::Value>(base::Value::CreateNullValue()).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType, schema::kObject, schema::kNull));
-
- schema->SetString(schema::kType, schema::kArray);
- ExpectNotValid(
- TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType, schema::kArray, schema::kInteger));
-
- schema->SetString(schema::kType, schema::kString);
- ExpectNotValid(
- TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(JSONSchemaValidator::kInvalidType,
- schema::kString,
- schema::kInteger));
-
- schema->SetString(schema::kType, schema::kNumber);
- ExpectNotValid(
- TEST_SOURCE,
- scoped_ptr<base::Value>(new base::StringValue("42")).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType, schema::kNumber, schema::kString));
-
- schema->SetString(schema::kType, schema::kInteger);
- ExpectNotValid(
- TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(88.8)).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::kInvalidTypeIntegerNumber);
-
- schema->SetString(schema::kType, schema::kBoolean);
- ExpectNotValid(
- TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(1)).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(JSONSchemaValidator::kInvalidType,
- schema::kBoolean,
- schema::kInteger));
-
- schema->SetString(schema::kType, schema::kNull);
- ExpectNotValid(
- TEST_SOURCE,
- scoped_ptr<base::Value>(new base::FundamentalValue(false)).get(),
- schema.get(),
- NULL,
- std::string(),
- JSONSchemaValidator::FormatErrorMessage(
- JSONSchemaValidator::kInvalidType, schema::kNull, schema::kBoolean));
-}
diff --git a/chromium/components/json_schema/json_schema_validator_unittest_base.h b/chromium/components/json_schema/json_schema_validator_unittest_base.h
deleted file mode 100644
index 7b4854e21e8..00000000000
--- a/chromium/components/json_schema/json_schema_validator_unittest_base.h
+++ /dev/null
@@ -1,63 +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 COMPONENTS_JSON_SCHEMA_JSON_SCHEMA_VALIDATOR_UNITTEST_BASE_H_
-#define COMPONENTS_JSON_SCHEMA_JSON_SCHEMA_VALIDATOR_UNITTEST_BASE_H_
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-class DictionaryValue;
-class ListValue;
-class Value;
-}
-
-// Base class for unit tests for JSONSchemaValidator. There is currently only
-// one implementation, JSONSchemaValidatorCPPTest.
-//
-// TODO(aa): Refactor chrome/test/data/json_schema_test.js into
-// JSONSchemaValidatorJSTest that inherits from this.
-class JSONSchemaValidatorTestBase : public testing::Test {
- public:
- enum ValidatorType {
- CPP = 1,
- JS = 2
- };
-
- explicit JSONSchemaValidatorTestBase(ValidatorType type);
-
- void RunTests();
-
- protected:
- virtual void ExpectValid(const std::string& test_source,
- base::Value* instance,
- base::DictionaryValue* schema,
- base::ListValue* types) = 0;
-
- virtual void ExpectNotValid(const std::string& test_source,
- base::Value* instance,
- base::DictionaryValue* schema,
- base::ListValue* types,
- const std::string& expected_error_path,
- const std::string& expected_error_message) = 0;
-
- private:
- void TestComplex();
- void TestStringPattern();
- void TestEnum();
- void TestChoices();
- void TestExtends();
- void TestObject();
- void TestTypeReference();
- void TestArrayTuple();
- void TestArrayNonTuple();
- void TestString();
- void TestNumber();
- void TestTypeClassifier();
- void TestTypes();
-
- ValidatorType type_;
-};
-
-#endif // COMPONENTS_JSON_SCHEMA_JSON_SCHEMA_VALIDATOR_UNITTEST_BASE_H_
diff --git a/chromium/components/nacl/common/nacl_cmd_line.cc b/chromium/components/nacl/common/nacl_cmd_line.cc
index d9bbd6557f4..b21a671ae1d 100644
--- a/chromium/components/nacl/common/nacl_cmd_line.cc
+++ b/chromium/components/nacl/common/nacl_cmd_line.cc
@@ -18,6 +18,7 @@ void CopyNaClCommandLineArguments(CommandLine* cmd_line) {
// TODO(gregoryd): check which flags of those below can be supported.
static const char* const kSwitchNames[] = {
switches::kNoSandbox,
+ switches::kTestNaClSandbox,
switches::kDisableBreakpad,
switches::kFullMemoryCrashReport,
switches::kEnableLogging,
diff --git a/chromium/components/nacl/common/nacl_switches.cc b/chromium/components/nacl/common/nacl_switches.cc
index 0dfdc949857..b9db537b252 100644
--- a/chromium/components/nacl/common/nacl_switches.cc
+++ b/chromium/components/nacl/common/nacl_switches.cc
@@ -36,4 +36,7 @@ const char kNaClLoaderCmdPrefix[] = "nacl-loader-cmd-prefix";
// Causes the process to run as a NativeClient loader.
const char kNaClLoaderProcess[] = "nacl-loader";
+// Runs the security test for the NaCl loader sandbox.
+const char kTestNaClSandbox[] = "test-nacl-sandbox";
+
} // namespace switches
diff --git a/chromium/components/nacl/common/nacl_switches.h b/chromium/components/nacl/common/nacl_switches.h
index 9bc1bcb4697..8b12206a21a 100644
--- a/chromium/components/nacl/common/nacl_switches.h
+++ b/chromium/components/nacl/common/nacl_switches.h
@@ -18,6 +18,7 @@ extern const char kNaClGdb[];
extern const char kNaClGdbScript[];
extern const char kNaClLoaderCmdPrefix[];
extern const char kNaClLoaderProcess[];
+extern const char kTestNaClSandbox[];
} // namespace switches
diff --git a/chromium/components/nacl/loader/nacl_main.cc b/chromium/components/nacl/loader/nacl_main.cc
index 15b6fd2dc8c..a9ec5c93c37 100644
--- a/chromium/components/nacl/loader/nacl_main.cc
+++ b/chromium/components/nacl/loader/nacl_main.cc
@@ -29,7 +29,10 @@ int NaClMain(const content::MainFunctionParams& parameters) {
#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
NaClMainPlatformDelegate platform(parameters);
+
+ platform.PlatformInitialize();
bool no_sandbox = parsed_command_line.HasSwitch(switches::kNoSandbox);
+ platform.InitSandboxTests(no_sandbox);
#if defined(OS_POSIX)
// The number of cores must be obtained before the invocation of
@@ -40,14 +43,25 @@ int NaClMain(const content::MainFunctionParams& parameters) {
if (!no_sandbox) {
platform.EnableSandbox();
}
- NaClListener listener;
+ bool sandbox_test_result = platform.RunSandboxTests();
+
+ if (sandbox_test_result) {
+ NaClListener listener;
#if defined(OS_POSIX)
- listener.set_number_of_cores(number_of_cores);
+ listener.set_number_of_cores(number_of_cores);
#endif
-
- listener.Listen();
+ listener.Listen();
+ } else {
+ // This indirectly prevents the test-harness-success-cookie from being set,
+ // as a way of communicating test failure, because the nexe won't reply.
+ // TODO(jvoung): find a better way to indicate failure that doesn't
+ // require waiting for a timeout.
+ VLOG(1) << "Sandbox test failed: Not launching NaCl process";
+ }
#else
NOTIMPLEMENTED() << " not implemented startup, plugin startup dialog etc.";
#endif
+
+ platform.PlatformUninitialize();
return 0;
}
diff --git a/chromium/components/nacl/loader/nacl_main_platform_delegate.h b/chromium/components/nacl/loader/nacl_main_platform_delegate.h
index ca740b85bcd..191831cfefe 100644
--- a/chromium/components/nacl/loader/nacl_main_platform_delegate.h
+++ b/chromium/components/nacl/loader/nacl_main_platform_delegate.h
@@ -5,20 +5,38 @@
#ifndef CHROME_NACL_NACL_MAIN_PLATFORM_DELEGATE_H_
#define CHROME_NACL_NACL_MAIN_PLATFORM_DELEGATE_H_
-#include "base/basictypes.h"
+#include "base/native_library.h"
#include "content/public/common/main_function_params.h"
+typedef bool (*RunNaClLoaderTests)(void);
+const char kNaClLoaderTestCall[] = "RunNaClLoaderTests";
+
class NaClMainPlatformDelegate {
public:
explicit NaClMainPlatformDelegate(
const content::MainFunctionParams& parameters);
~NaClMainPlatformDelegate();
+ // Called first thing and last thing in the process' lifecycle, i.e. before
+ // the sandbox is enabled.
+ void PlatformInitialize();
+ void PlatformUninitialize();
+
+ // Gives us an opportunity to initialize state used for tests before enabling
+ // the sandbox.
+ void InitSandboxTests(bool no_sandbox);
+
// Initiate Lockdown.
void EnableSandbox();
+ // Runs the sandbox tests for the NaCl Loader, if tests supplied.
+ // Cannot run again, after this (resources freed).
+ // Returns false if the tests are supplied and fail.
+ bool RunSandboxTests();
+
private:
const content::MainFunctionParams& parameters_;
+ base::NativeLibrary sandbox_test_module_;
DISALLOW_COPY_AND_ASSIGN(NaClMainPlatformDelegate);
};
diff --git a/chromium/components/nacl/loader/nacl_main_platform_delegate_linux.cc b/chromium/components/nacl/loader/nacl_main_platform_delegate_linux.cc
index cbe886bc006..e9d2f731787 100644
--- a/chromium/components/nacl/loader/nacl_main_platform_delegate_linux.cc
+++ b/chromium/components/nacl/loader/nacl_main_platform_delegate_linux.cc
@@ -4,14 +4,28 @@
#include "components/nacl/loader/nacl_main_platform_delegate.h"
+#include "base/command_line.h"
+
NaClMainPlatformDelegate::NaClMainPlatformDelegate(
const content::MainFunctionParams& parameters)
- : parameters_(parameters) {
+ : parameters_(parameters), sandbox_test_module_(NULL) {
}
NaClMainPlatformDelegate::~NaClMainPlatformDelegate() {
}
+void NaClMainPlatformDelegate::PlatformInitialize() {
+}
+
+void NaClMainPlatformDelegate::PlatformUninitialize() {
+}
+
+void NaClMainPlatformDelegate::InitSandboxTests(bool no_sandbox) {
+ // The sandbox is started in the zygote process: zygote_main_linux.cc
+ // http://code.google.com/p/chromium/wiki/LinuxSUIDSandbox
+ return;
+}
+
void NaClMainPlatformDelegate::EnableSandbox() {
// The setuid sandbox is started in the zygote process: zygote_main_linux.cc
// http://code.google.com/p/chromium/wiki/LinuxSUIDSandbox
@@ -29,3 +43,9 @@ void NaClMainPlatformDelegate::EnableSandbox() {
// At best, NaCl will not work. At worst, enabling the seccomp sandbox
// could create a hole in the NaCl sandbox.
}
+
+bool NaClMainPlatformDelegate::RunSandboxTests() {
+ // The sandbox is started in the zygote process: zygote_main_linux.cc
+ // http://code.google.com/p/chromium/wiki/LinuxSUIDSandbox
+ return true;
+}
diff --git a/chromium/components/nacl/loader/nacl_main_platform_delegate_mac.mm b/chromium/components/nacl/loader/nacl_main_platform_delegate_mac.mm
index 78fa5390454..67ddced4396 100644
--- a/chromium/components/nacl/loader/nacl_main_platform_delegate_mac.mm
+++ b/chromium/components/nacl/loader/nacl_main_platform_delegate_mac.mm
@@ -5,22 +5,78 @@
#include "components/nacl/loader/nacl_main_platform_delegate.h"
#import <Cocoa/Cocoa.h>
+#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/logging.h"
+#include "base/native_library.h"
#include "components/nacl/common/nacl_sandbox_type_mac.h"
#include "components/nacl/common/nacl_switches.h"
#include "content/public/common/sandbox_init.h"
NaClMainPlatformDelegate::NaClMainPlatformDelegate(
const content::MainFunctionParams& parameters)
- : parameters_(parameters) {
+ : parameters_(parameters), sandbox_test_module_(NULL) {
}
NaClMainPlatformDelegate::~NaClMainPlatformDelegate() {
}
+// TODO(jvoung): see if this old comment (from renderer_main_platform...)
+// is relevant to the nacl loader.
+// TODO(mac-port): Any code needed to initialize a process for purposes of
+// running a NaClLoader needs to also be reflected in chrome_main.cc for
+// --single-process support.
+void NaClMainPlatformDelegate::PlatformInitialize() {
+}
+
+void NaClMainPlatformDelegate::PlatformUninitialize() {
+}
+
+void NaClMainPlatformDelegate::InitSandboxTests(bool no_sandbox) {
+ const CommandLine& command_line = parameters_.command_line;
+
+ DVLOG(1) << "Started NaClLdr with ";
+ const std::vector<std::string>& argstrings = command_line.argv();
+ for (std::vector<std::string>::const_iterator ii = argstrings.begin();
+ ii != argstrings.end(); ++ii)
+ DVLOG(1) << *ii;
+
+ // Be sure not to load the sandbox test DLL if the sandbox isn't on.
+ // Comment-out guard and recompile if you REALLY want to test w/out the SB.
+ // TODO(jvoung): allow testing without sandbox, but change expected ret vals.
+ if (!no_sandbox) {
+ base::FilePath test_dll_name =
+ command_line.GetSwitchValuePath(switches::kTestNaClSandbox);
+ if (!test_dll_name.empty()) {
+ sandbox_test_module_ = base::LoadNativeLibrary(test_dll_name, NULL);
+ CHECK(sandbox_test_module_);
+ }
+ }
+}
+
void NaClMainPlatformDelegate::EnableSandbox() {
CHECK(content::InitializeSandbox(NACL_SANDBOX_TYPE_NACL_LOADER,
base::FilePath()))
<< "Error initializing sandbox for " << switches::kNaClLoaderProcess;
}
+
+bool NaClMainPlatformDelegate::RunSandboxTests() {
+ // TODO(jvoung): Win and mac should share this identical code.
+ bool result = true;
+ if (sandbox_test_module_) {
+ RunNaClLoaderTests run_security_tests =
+ reinterpret_cast<RunNaClLoaderTests>(
+ base::GetFunctionPointerFromNativeLibrary(sandbox_test_module_,
+ kNaClLoaderTestCall));
+ if (run_security_tests) {
+ DVLOG(1) << "Running NaCl Loader security tests";
+ result = (*run_security_tests)();
+ } else {
+ VLOG(1) << "Failed to get NaCl sandbox test function";
+ result = false;
+ }
+ base::UnloadNativeLibrary(sandbox_test_module_);
+ sandbox_test_module_ = NULL;
+ }
+ return result;
+}
diff --git a/chromium/components/nacl/loader/nacl_main_platform_delegate_win.cc b/chromium/components/nacl/loader/nacl_main_platform_delegate_win.cc
index f530961700f..e79fe17725c 100644
--- a/chromium/components/nacl/loader/nacl_main_platform_delegate_win.cc
+++ b/chromium/components/nacl/loader/nacl_main_platform_delegate_win.cc
@@ -4,17 +4,59 @@
#include "components/nacl/loader/nacl_main_platform_delegate.h"
+#include "base/command_line.h"
+#include "base/files/file_path.h"
#include "base/logging.h"
+#include "base/native_library.h"
+#include "components/nacl/common/nacl_switches.h"
#include "sandbox/win/src/sandbox.h"
NaClMainPlatformDelegate::NaClMainPlatformDelegate(
const content::MainFunctionParams& parameters)
- : parameters_(parameters) {
+ : parameters_(parameters), sandbox_test_module_(NULL) {
}
NaClMainPlatformDelegate::~NaClMainPlatformDelegate() {
}
+void NaClMainPlatformDelegate::PlatformInitialize() {
+ // Be mindful of what resources you acquire here. They can be used by
+ // malicious code if the renderer gets compromised.
+}
+
+void NaClMainPlatformDelegate::PlatformUninitialize() {
+}
+
+void NaClMainPlatformDelegate::InitSandboxTests(bool no_sandbox) {
+ const CommandLine& command_line = parameters_.command_line;
+
+ DVLOG(1) << "Started NaClLdr with " << command_line.GetCommandLineString();
+
+ sandbox::TargetServices* target_services =
+ parameters_.sandbox_info->target_services;
+
+ if (target_services && !no_sandbox) {
+ base::FilePath test_dll_name =
+ command_line.GetSwitchValuePath(switches::kTestNaClSandbox);
+ if (!test_dll_name.empty()) {
+ // At this point, hack on the suffix according to with bitness
+ // of your windows process.
+#if defined(_WIN64)
+ DVLOG(1) << "Using 64-bit test dll\n";
+ test_dll_name = test_dll_name.InsertBeforeExtension(L"64");
+ test_dll_name = test_dll_name.ReplaceExtension(L"dll");
+#else
+ DVLOG(1) << "Using 32-bit test dll\n";
+ test_dll_name = test_dll_name.ReplaceExtension(L"dll");
+#endif
+ DVLOG(1) << "Loading test lib " << test_dll_name.value() << "\n";
+ sandbox_test_module_ = base::LoadNativeLibrary(test_dll_name, NULL);
+ CHECK(sandbox_test_module_);
+ VLOG(1) << "Testing NaCl sandbox\n";
+ }
+ }
+}
+
void NaClMainPlatformDelegate::EnableSandbox() {
sandbox::TargetServices* target_services =
parameters_.sandbox_info->target_services;
@@ -29,3 +71,24 @@ void NaClMainPlatformDelegate::EnableSandbox() {
// Turn the sandbox on.
target_services->LowerToken();
}
+
+bool NaClMainPlatformDelegate::RunSandboxTests() {
+ // TODO(jvoung): Win and mac should share this code.
+ bool result = true;
+ if (sandbox_test_module_) {
+ RunNaClLoaderTests run_security_tests =
+ reinterpret_cast<RunNaClLoaderTests>(
+ base::GetFunctionPointerFromNativeLibrary(sandbox_test_module_,
+ kNaClLoaderTestCall));
+ if (run_security_tests) {
+ DVLOG(1) << "Running NaCl Loader security tests";
+ result = (*run_security_tests)();
+ } else {
+ VLOG(1) << "Failed to get NaCl sandbox test function";
+ result = false;
+ }
+ base::UnloadNativeLibrary(sandbox_test_module_);
+ sandbox_test_module_ = NULL;
+ }
+ return result;
+}
diff --git a/chromium/components/policy.gypi b/chromium/components/policy.gypi
deleted file mode 100644
index 5295ba46e96..00000000000
--- a/chromium/components/policy.gypi
+++ /dev/null
@@ -1,41 +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.
-
-{
- 'targets': [
- {
- 'target_name': 'policy_component',
- 'type': '<(component)',
- 'dependencies': [
- '../base/base.gyp:base',
- 'json_schema',
- ],
- 'defines': [
- 'POLICY_COMPONENT_IMPLEMENTATION',
- ],
- 'include_dirs': [
- '..',
- ],
- 'conditions': [
- ['configuration_policy==1', {
- 'sources': [
- 'policy/core/common/policy_schema.cc',
- 'policy/core/common/policy_schema.h',
- 'policy/policy_export.h',
- ],
- }, { # configuration_policy==0
- # The target 'policy_component' always exists. Later it will include
- # some stubs when configuration_policy==0. For now this stub file is
- # compiled so that an output is produced, otherwise the shared build
- # breaks on iOS.
- # TODO(joaodasilva): remove this comment and the temporary stub after
- # moving one of the real stubs. http://crbug.com/271392
- 'sources': [
- 'policy/stub_to_remove.cc',
- ],
- }],
- ],
- },
- ],
-}
diff --git a/chromium/components/policy/OWNERS b/chromium/components/policy/OWNERS
deleted file mode 100644
index dbccb7c3a0c..00000000000
--- a/chromium/components/policy/OWNERS
+++ /dev/null
@@ -1,6 +0,0 @@
-mnissler@chromium.org
-pastarmovj@chromium.org
-joaodasilva@chromium.org
-bartfab@chromium.org
-atwilson@chromium.org
-pneubeck@chromium.org
diff --git a/chromium/components/policy/core/common/policy_schema.cc b/chromium/components/policy/core/common/policy_schema.cc
deleted file mode 100644
index 8c3145ce43a..00000000000
--- a/chromium/components/policy/core/common/policy_schema.cc
+++ /dev/null
@@ -1,244 +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 "components/policy/core/common/policy_schema.h"
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/stl_util.h"
-#include "components/json_schema/json_schema_constants.h"
-#include "components/json_schema/json_schema_validator.h"
-
-namespace policy {
-
-namespace {
-
-const char kJSONSchemaVersion[] = "http://json-schema.org/draft-03/schema#";
-
-// Describes the properties of a TYPE_DICTIONARY policy schema.
-class DictionaryPolicySchema : public PolicySchema {
- public:
- static scoped_ptr<PolicySchema> Parse(const base::DictionaryValue& schema,
- std::string* error);
-
- virtual ~DictionaryPolicySchema();
-
- virtual const PolicySchemaMap* GetProperties() const OVERRIDE;
- virtual const PolicySchema* GetSchemaForAdditionalProperties() const OVERRIDE;
-
- private:
- DictionaryPolicySchema();
-
- PolicySchemaMap properties_;
- scoped_ptr<PolicySchema> additional_properties_;
-
- DISALLOW_COPY_AND_ASSIGN(DictionaryPolicySchema);
-};
-
-// Describes the items of a TYPE_LIST policy schema.
-class ListPolicySchema : public PolicySchema {
- public:
- static scoped_ptr<PolicySchema> Parse(const base::DictionaryValue& schema,
- std::string* error);
-
- virtual ~ListPolicySchema();
-
- virtual const PolicySchema* GetSchemaForItems() const OVERRIDE;
-
- private:
- ListPolicySchema();
-
- scoped_ptr<PolicySchema> items_schema_;
-
- DISALLOW_COPY_AND_ASSIGN(ListPolicySchema);
-};
-
-bool SchemaTypeToValueType(const std::string& type_string,
- base::Value::Type* type) {
- // Note: "any" is not an accepted type.
- static const struct {
- const char* schema_type;
- base::Value::Type value_type;
- } kSchemaToValueTypeMap[] = {
- { json_schema_constants::kArray, base::Value::TYPE_LIST },
- { json_schema_constants::kBoolean, base::Value::TYPE_BOOLEAN },
- { json_schema_constants::kInteger, base::Value::TYPE_INTEGER },
- { json_schema_constants::kNull, base::Value::TYPE_NULL },
- { json_schema_constants::kNumber, base::Value::TYPE_DOUBLE },
- { json_schema_constants::kObject, base::Value::TYPE_DICTIONARY },
- { json_schema_constants::kString, base::Value::TYPE_STRING },
- };
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kSchemaToValueTypeMap); ++i) {
- if (kSchemaToValueTypeMap[i].schema_type == type_string) {
- *type = kSchemaToValueTypeMap[i].value_type;
- return true;
- }
- }
- return false;
-}
-
-scoped_ptr<PolicySchema> ParseSchema(const base::DictionaryValue& schema,
- std::string* error) {
- std::string type_string;
- if (!schema.GetString(json_schema_constants::kType, &type_string)) {
- *error = "The schema type must be declared.";
- return scoped_ptr<PolicySchema>();
- }
-
- base::Value::Type type = base::Value::TYPE_NULL;
- if (!SchemaTypeToValueType(type_string, &type)) {
- *error = "The \"any\" type can't be used.";
- return scoped_ptr<PolicySchema>();
- }
-
- switch (type) {
- case base::Value::TYPE_DICTIONARY:
- return DictionaryPolicySchema::Parse(schema, error);
- case base::Value::TYPE_LIST:
- return ListPolicySchema::Parse(schema, error);
- default:
- return make_scoped_ptr(new PolicySchema(type));
- }
-}
-
-DictionaryPolicySchema::DictionaryPolicySchema()
- : PolicySchema(base::Value::TYPE_DICTIONARY) {}
-
-DictionaryPolicySchema::~DictionaryPolicySchema() {
- STLDeleteValues(&properties_);
-}
-
-const PolicySchemaMap* DictionaryPolicySchema::GetProperties() const {
- return &properties_;
-}
-
-const PolicySchema*
- DictionaryPolicySchema::GetSchemaForAdditionalProperties() const {
- return additional_properties_.get();
-}
-
-// static
-scoped_ptr<PolicySchema> DictionaryPolicySchema::Parse(
- const base::DictionaryValue& schema,
- std::string* error) {
- scoped_ptr<DictionaryPolicySchema> dict_schema(new DictionaryPolicySchema());
-
- const base::DictionaryValue* dict = NULL;
- const base::DictionaryValue* properties = NULL;
- if (schema.GetDictionary(json_schema_constants::kProperties, &properties)) {
- for (base::DictionaryValue::Iterator it(*properties);
- !it.IsAtEnd(); it.Advance()) {
- // This should have been verified by the JSONSchemaValidator.
- CHECK(it.value().GetAsDictionary(&dict));
- scoped_ptr<PolicySchema> sub_schema = ParseSchema(*dict, error);
- if (!sub_schema)
- return scoped_ptr<PolicySchema>();
- dict_schema->properties_[it.key()] = sub_schema.release();
- }
- }
-
- if (schema.GetDictionary(json_schema_constants::kAdditionalProperties,
- &dict)) {
- scoped_ptr<PolicySchema> sub_schema = ParseSchema(*dict, error);
- if (!sub_schema)
- return scoped_ptr<PolicySchema>();
- dict_schema->additional_properties_ = sub_schema.Pass();
- }
-
- return dict_schema.PassAs<PolicySchema>();
-}
-
-ListPolicySchema::ListPolicySchema()
- : PolicySchema(base::Value::TYPE_LIST) {}
-
-ListPolicySchema::~ListPolicySchema() {}
-
-const PolicySchema* ListPolicySchema::GetSchemaForItems() const {
- return items_schema_.get();
-}
-
-scoped_ptr<PolicySchema> ListPolicySchema::Parse(
- const base::DictionaryValue& schema,
- std::string* error) {
- const base::DictionaryValue* dict = NULL;
- if (!schema.GetDictionary(json_schema_constants::kItems, &dict)) {
- *error = "Arrays must declare a single schema for their items.";
- return scoped_ptr<PolicySchema>();
- }
- scoped_ptr<PolicySchema> items_schema = ParseSchema(*dict, error);
- if (!items_schema)
- return scoped_ptr<PolicySchema>();
-
- scoped_ptr<ListPolicySchema> list_schema(new ListPolicySchema());
- list_schema->items_schema_ = items_schema.Pass();
- return list_schema.PassAs<PolicySchema>();
-}
-
-} // namespace
-
-PolicySchema::PolicySchema(base::Value::Type type)
- : type_(type) {}
-
-PolicySchema::~PolicySchema() {}
-
-const PolicySchemaMap* PolicySchema::GetProperties() const {
- NOTREACHED();
- return NULL;
-}
-
-const PolicySchema* PolicySchema::GetSchemaForAdditionalProperties() const {
- NOTREACHED();
- return NULL;
-}
-
-const PolicySchema* PolicySchema::GetSchemaForProperty(
- const std::string& key) const {
- const PolicySchemaMap* properties = GetProperties();
- PolicySchemaMap::const_iterator it = properties->find(key);
- return it == properties->end() ? GetSchemaForAdditionalProperties()
- : it->second;
-}
-
-const PolicySchema* PolicySchema::GetSchemaForItems() const {
- NOTREACHED();
- return NULL;
-}
-
-// static
-scoped_ptr<PolicySchema> PolicySchema::Parse(const std::string& content,
- std::string* error) {
- // Validate as a generic JSON schema.
- scoped_ptr<base::DictionaryValue> dict =
- JSONSchemaValidator::IsValidSchema(content, error);
- if (!dict)
- return scoped_ptr<PolicySchema>();
-
- // Validate the schema version.
- std::string string_value;
- if (!dict->GetString(json_schema_constants::kSchema, &string_value) ||
- string_value != kJSONSchemaVersion) {
- *error = "Must declare JSON Schema v3 version in \"$schema\".";
- return scoped_ptr<PolicySchema>();
- }
-
- // Validate the main type.
- if (!dict->GetString(json_schema_constants::kType, &string_value) ||
- string_value != json_schema_constants::kObject) {
- *error =
- "The main schema must have a type attribute with \"object\" value.";
- return scoped_ptr<PolicySchema>();
- }
-
- // Checks for invalid attributes at the top-level.
- if (dict->HasKey(json_schema_constants::kAdditionalProperties) ||
- dict->HasKey(json_schema_constants::kPatternProperties)) {
- *error = "\"additionalProperties\" and \"patternProperties\" are not "
- "supported at the main schema.";
- return scoped_ptr<PolicySchema>();
- }
-
- return ParseSchema(*dict, error);
-}
-
-} // namespace policy
diff --git a/chromium/components/policy/core/common/policy_schema.h b/chromium/components/policy/core/common/policy_schema.h
deleted file mode 100644
index c48ee6fc2b9..00000000000
--- a/chromium/components/policy/core/common/policy_schema.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 COMPONENTS_POLICY_CORE_COMMON_POLICY_SCHEMA_H_
-#define COMPONENTS_POLICY_CORE_COMMON_POLICY_SCHEMA_H_
-
-#include <map>
-#include <string>
-
-#include "base/basictypes.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/values.h"
-#include "components/policy/policy_export.h"
-
-namespace policy {
-
-class PolicySchema;
-typedef std::map<std::string, PolicySchema*> PolicySchemaMap;
-
-// Maps known policy keys to their expected types, and recursively describes
-// the known keys within dictionary or list types.
-class POLICY_EXPORT PolicySchema {
- public:
-
- // Parses |schema| as a JSON v3 schema, and additionally verifies that:
- // - the version is JSON schema v3;
- // - the top-level entry is of type "object";
- // - the top-level object doesn't contain "additionalProperties" nor
- // "patternProperties";
- // - each "property" maps to a schema with one "type";
- // - the type "any" is not used.
- // If all the checks pass then the parsed PolicySchema is returned; otherwise
- // returns NULL.
- static scoped_ptr<PolicySchema> Parse(const std::string& schema,
- std::string* error);
-
- explicit PolicySchema(base::Value::Type type);
- virtual ~PolicySchema();
-
- // Returns the expected type for this policy. At the top-level PolicySchema
- // this is always TYPE_DICTIONARY.
- base::Value::Type type() const { return type_; }
-
- // It is invalid to call these methods when type() is not TYPE_DICTIONARY.
- //
- // GetProperties() returns a map of the known property names to their schemas;
- // the map is never NULL.
- // GetSchemaForAdditionalProperties() returns the schema that should be used
- // for keys not found in the map, and may be NULL.
- // GetSchemaForProperty() is a utility method that combines both, returning
- // the mapped schema if found in GetProperties(), otherwise returning
- // GetSchemaForAdditionalProperties().
- virtual const PolicySchemaMap* GetProperties() const;
- virtual const PolicySchema* GetSchemaForAdditionalProperties() const;
- const PolicySchema* GetSchemaForProperty(const std::string& key) const;
-
- // It is invalid to call this method when type() is not TYPE_LIST.
- // Returns the type of the entries of this "array", which is never NULL.
- virtual const PolicySchema* GetSchemaForItems() const;
-
- private:
- const base::Value::Type type_;
-
- DISALLOW_COPY_AND_ASSIGN(PolicySchema);
-};
-
-} // namespace policy
-
-#endif // COMPONENTS_POLICY_CORE_COMMON_POLICY_SCHEMA_H_
diff --git a/chromium/components/policy/core/common/policy_schema_unittest.cc b/chromium/components/policy/core/common/policy_schema_unittest.cc
deleted file mode 100644
index bfbdd652159..00000000000
--- a/chromium/components/policy/core/common/policy_schema_unittest.cc
+++ /dev/null
@@ -1,193 +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 "components/policy/core/common/policy_schema.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace policy {
-
-namespace {
-
-#define SCHEMA_VERSION "\"$schema\":\"http://json-schema.org/draft-03/schema#\""
-#define OBJECT_TYPE "\"type\":\"object\""
-
-bool ParseFails(const std::string& content) {
- std::string error;
- scoped_ptr<PolicySchema> schema = PolicySchema::Parse(content, &error);
- EXPECT_TRUE(schema || !error.empty());
- return !schema;
-}
-
-} // namespace
-
-TEST(PolicySchemaTest, MinimalSchema) {
- EXPECT_FALSE(ParseFails(
- "{"
- SCHEMA_VERSION ","
- OBJECT_TYPE
- "}"));
-}
-
-TEST(PolicySchemaTest, InvalidSchemas) {
- EXPECT_TRUE(ParseFails(""));
- EXPECT_TRUE(ParseFails("omg"));
- EXPECT_TRUE(ParseFails("\"omg\""));
- EXPECT_TRUE(ParseFails("123"));
- EXPECT_TRUE(ParseFails("[]"));
- EXPECT_TRUE(ParseFails("null"));
- EXPECT_TRUE(ParseFails("{}"));
- EXPECT_TRUE(ParseFails("{" SCHEMA_VERSION "}"));
- EXPECT_TRUE(ParseFails("{" OBJECT_TYPE "}"));
-
- EXPECT_TRUE(ParseFails(
- "{"
- SCHEMA_VERSION ","
- OBJECT_TYPE ","
- "\"additionalProperties\": { \"type\":\"object\" }"
- "}"));
-
- EXPECT_TRUE(ParseFails(
- "{"
- SCHEMA_VERSION ","
- OBJECT_TYPE ","
- "\"patternProperties\": { \"a+b*\": { \"type\": \"object\" } }"
- "}"));
-
- EXPECT_TRUE(ParseFails(
- "{"
- SCHEMA_VERSION ","
- OBJECT_TYPE ","
- "\"properties\": { \"Policy\": { \"type\": \"bogus\" } }"
- "}"));
-
- EXPECT_TRUE(ParseFails(
- "{"
- SCHEMA_VERSION ","
- OBJECT_TYPE ","
- "\"properties\": { \"Policy\": { \"type\": [\"string\", \"number\"] } }"
- "}"));
-
- EXPECT_TRUE(ParseFails(
- "{"
- SCHEMA_VERSION ","
- OBJECT_TYPE ","
- "\"properties\": { \"Policy\": { \"type\": \"any\" } }"
- "}"));
-}
-
-TEST(PolicySchemaTest, ValidSchema) {
- std::string error;
- scoped_ptr<PolicySchema> schema = PolicySchema::Parse(
- "{"
- SCHEMA_VERSION ","
- OBJECT_TYPE ","
- "\"properties\": {"
- " \"Boolean\": { \"type\": \"boolean\" },"
- " \"Integer\": { \"type\": \"integer\" },"
- " \"Null\": { \"type\": \"null\" },"
- " \"Number\": { \"type\": \"number\" },"
- " \"String\": { \"type\": \"string\" },"
- " \"Array\": {"
- " \"type\": \"array\","
- " \"items\": { \"type\": \"string\" }"
- " },"
- " \"ArrayOfObjects\": {"
- " \"type\": \"array\","
- " \"items\": {"
- " \"type\": \"object\","
- " \"properties\": {"
- " \"one\": { \"type\": \"string\" },"
- " \"two\": { \"type\": \"integer\" }"
- " }"
- " }"
- " },"
- " \"ArrayOfArray\": {"
- " \"type\": \"array\","
- " \"items\": {"
- " \"type\": \"array\","
- " \"items\": { \"type\": \"string\" }"
- " }"
- " },"
- " \"Object\": {"
- " \"type\": \"object\","
- " \"properties\": {"
- " \"one\": { \"type\": \"boolean\" },"
- " \"two\": { \"type\": \"integer\" }"
- " },"
- " \"additionalProperties\": { \"type\": \"string\" }"
- " }"
- "}"
- "}", &error);
- ASSERT_TRUE(schema) << error;
-
- ASSERT_EQ(base::Value::TYPE_DICTIONARY, schema->type());
- EXPECT_FALSE(schema->GetSchemaForProperty("invalid"));
-
- const PolicySchema* sub = schema->GetSchemaForProperty("Boolean");
- ASSERT_TRUE(sub);
- EXPECT_EQ(base::Value::TYPE_BOOLEAN, sub->type());
-
- sub = schema->GetSchemaForProperty("Integer");
- ASSERT_TRUE(sub);
- EXPECT_EQ(base::Value::TYPE_INTEGER, sub->type());
-
- sub = schema->GetSchemaForProperty("Null");
- ASSERT_TRUE(sub);
- EXPECT_EQ(base::Value::TYPE_NULL, sub->type());
-
- sub = schema->GetSchemaForProperty("Number");
- ASSERT_TRUE(sub);
- EXPECT_EQ(base::Value::TYPE_DOUBLE, sub->type());
- sub = schema->GetSchemaForProperty("String");
- ASSERT_TRUE(sub);
- EXPECT_EQ(base::Value::TYPE_STRING, sub->type());
-
- sub = schema->GetSchemaForProperty("Array");
- ASSERT_TRUE(sub);
- ASSERT_EQ(base::Value::TYPE_LIST, sub->type());
- sub = sub->GetSchemaForItems();
- ASSERT_TRUE(sub);
- EXPECT_EQ(base::Value::TYPE_STRING, sub->type());
-
- sub = schema->GetSchemaForProperty("ArrayOfObjects");
- ASSERT_TRUE(sub);
- ASSERT_EQ(base::Value::TYPE_LIST, sub->type());
- sub = sub->GetSchemaForItems();
- ASSERT_TRUE(sub);
- EXPECT_EQ(base::Value::TYPE_DICTIONARY, sub->type());
- const PolicySchema* subsub = sub->GetSchemaForProperty("one");
- ASSERT_TRUE(subsub);
- EXPECT_EQ(base::Value::TYPE_STRING, subsub->type());
- subsub = sub->GetSchemaForProperty("two");
- ASSERT_TRUE(subsub);
- EXPECT_EQ(base::Value::TYPE_INTEGER, subsub->type());
- subsub = sub->GetSchemaForProperty("invalid");
- EXPECT_FALSE(subsub);
-
- sub = schema->GetSchemaForProperty("ArrayOfArray");
- ASSERT_TRUE(sub);
- ASSERT_EQ(base::Value::TYPE_LIST, sub->type());
- sub = sub->GetSchemaForItems();
- ASSERT_TRUE(sub);
- ASSERT_EQ(base::Value::TYPE_LIST, sub->type());
- sub = sub->GetSchemaForItems();
- ASSERT_TRUE(sub);
- EXPECT_EQ(base::Value::TYPE_STRING, sub->type());
-
- sub = schema->GetSchemaForProperty("Object");
- ASSERT_TRUE(sub);
- ASSERT_EQ(base::Value::TYPE_DICTIONARY, sub->type());
- subsub = sub->GetSchemaForProperty("one");
- ASSERT_TRUE(subsub);
- EXPECT_EQ(base::Value::TYPE_BOOLEAN, subsub->type());
- subsub = sub->GetSchemaForProperty("two");
- ASSERT_TRUE(subsub);
- EXPECT_EQ(base::Value::TYPE_INTEGER, subsub->type());
- subsub = sub->GetSchemaForProperty("undeclared");
- ASSERT_TRUE(subsub);
- EXPECT_EQ(base::Value::TYPE_STRING, subsub->type());
-}
-
-} // namespace policy
diff --git a/chromium/components/policy/policy_export.h b/chromium/components/policy/policy_export.h
deleted file mode 100644
index 47376acaa85..00000000000
--- a/chromium/components/policy/policy_export.h
+++ /dev/null
@@ -1,29 +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 COMPONENTS_POLICY_POLICY_EXPORT_H_
-#define COMPONENTS_POLICY_POLICY_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(POLICY_COMPONENT_IMPLEMENTATION)
-#define POLICY_EXPORT __declspec(dllexport)
-#else
-#define POLICY_EXPORT __declspec(dllimport)
-#endif // defined(BASE_PREFS_IMPLEMENTATION)
-
-#else // defined(WIN32)
-#if defined(POLICY_COMPONENT_IMPLEMENTATION)
-#define POLICY_EXPORT __attribute__((visibility("default")))
-#else
-#define POLICY_EXPORT
-#endif
-#endif
-
-#else // defined(COMPONENT_BUILD)
-#define POLICY_EXPORT
-#endif
-
-#endif // COMPONENTS_POLICY_POLICY_EXPORT_H_
diff --git a/chromium/content/browser/accessibility/browser_accessibility_manager_android.cc b/chromium/content/browser/accessibility/browser_accessibility_manager_android.cc
index e14aa0bb977..2da686af934 100644
--- a/chromium/content/browser/accessibility/browser_accessibility_manager_android.cc
+++ b/chromium/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -90,6 +90,12 @@ void BrowserAccessibilityManagerAndroid::NotifyAccessibilityEvent(
if (obj.is_null())
return;
+ // Always send AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED to notify
+ // the Android system that the accessibility hierarchy rooted at this
+ // node has changed.
+ Java_BrowserAccessibilityManager_handleContentChanged(
+ env, obj.obj(), node->renderer_id());
+
switch (type) {
case AccessibilityNotificationLoadComplete:
Java_BrowserAccessibilityManager_handlePageLoaded(
@@ -131,9 +137,6 @@ void BrowserAccessibilityManagerAndroid::NotifyAccessibilityEvent(
if (node->IsEditableText()) {
Java_BrowserAccessibilityManager_handleEditableTextChanged(
env, obj.obj(), node->renderer_id());
- } else {
- Java_BrowserAccessibilityManager_handleContentChanged(
- env, obj.obj(), node->renderer_id());
}
break;
default:
diff --git a/chromium/content/browser/android/content_view_core_impl.cc b/chromium/content/browser/android/content_view_core_impl.cc
index 80fe628dd02..33b3f068d2a 100644
--- a/chromium/content/browser/android/content_view_core_impl.cc
+++ b/chromium/content/browser/android/content_view_core_impl.cc
@@ -350,17 +350,17 @@ void ContentViewCoreImpl::OnTabCrashed() {
return;
Java_ContentViewCore_resetVSyncNotification(env, obj.obj());
- // If |tab_crashed_| is already true, just return. e.g. if two tabs share the
- // render process, this will be called for each tab when the render process
- // crashed. If user reload one tab, a new render process is created. It can be
- // shared by the other tab. But if user closes the tab before reload the other
+ // Note that we might reach this place multiple times while the
+ // ContentViewCore remains crashed. E.g. if two tabs share the render process
+ // and the process crashes, this will be called for each tab. If the user
+ // reload one tab, a new render process is created and it can be shared by the
+ // other tab. But if user closes the reloaded tab before reloading the other
// tab, the new render process will be shut down. This will trigger the other
// tab's OnTabCrashed() called again as two tabs share the same
- // BrowserRenderProcessHost.
- if (tab_crashed_)
- return;
+ // BrowserRenderProcessHost. The Java side will distinguish this case using
+ // tab_crashed_ passed below.
+ Java_ContentViewCore_onTabCrash(env, obj.obj(), tab_crashed_);
tab_crashed_ = true;
- Java_ContentViewCore_onTabCrash(env, obj.obj());
}
// All positions and sizes are in CSS pixels.
@@ -800,12 +800,7 @@ jint ContentViewCoreImpl::GetCurrentRenderProcessId(JNIEnv* env, jobject obj) {
ScopedJavaLocalRef<jstring> ContentViewCoreImpl::GetURL(
JNIEnv* env, jobject) const {
- // The current users of the Java API expect to use the active entry
- // rather than the visible entry, which is exposed by WebContents::GetURL.
- content::NavigationEntry* entry =
- web_contents_->GetController().GetActiveEntry();
- GURL url = entry ? entry->GetVirtualURL() : GURL::EmptyGURL();
- return ConvertUTF8ToJavaString(env, url.spec());
+ return ConvertUTF8ToJavaString(env, GetWebContents()->GetURL().spec());
}
ScopedJavaLocalRef<jstring> ContentViewCoreImpl::GetTitle(
@@ -1431,7 +1426,7 @@ void ContentViewCoreImpl::GetDirectedNavigationHistory(JNIEnv* env,
ScopedJavaLocalRef<jstring>
ContentViewCoreImpl::GetOriginalUrlForActiveNavigationEntry(JNIEnv* env,
jobject obj) {
- NavigationEntry* entry = web_contents_->GetController().GetActiveEntry();
+ NavigationEntry* entry = web_contents_->GetController().GetVisibleEntry();
if (entry == NULL)
return ScopedJavaLocalRef<jstring>(env, NULL);
return ConvertUTF8ToJavaString(env, entry->GetOriginalRequestURL().spec());
@@ -1472,14 +1467,22 @@ void JavaScriptResultCallback(const ScopedJavaGlobalRef<jobject>& callback,
void ContentViewCoreImpl::EvaluateJavaScript(JNIEnv* env,
jobject obj,
jstring script,
- jobject callback) {
- RenderViewHost* host = web_contents_->GetRenderViewHost();
- DCHECK(host);
+ jobject callback,
+ jboolean start_renderer) {
+ RenderViewHost* rvh = web_contents_->GetRenderViewHost();
+ DCHECK(rvh);
+
+ if (start_renderer && !rvh->IsRenderViewLive()) {
+ if (!web_contents_->CreateRenderViewForInitialEmptyDocument()) {
+ LOG(ERROR) << "Failed to create RenderView in EvaluateJavaScript";
+ return;
+ }
+ }
if (!callback) {
// No callback requested.
- host->ExecuteJavascriptInWebFrame(string16(), // frame_xpath
- ConvertJavaStringToUTF16(env, script));
+ rvh->ExecuteJavascriptInWebFrame(string16(), // frame_xpath
+ ConvertJavaStringToUTF16(env, script));
return;
}
@@ -1490,7 +1493,7 @@ void ContentViewCoreImpl::EvaluateJavaScript(JNIEnv* env,
content::RenderViewHost::JavascriptResultCallback c_callback =
base::Bind(&JavaScriptResultCallback, j_callback);
- host->ExecuteJavascriptInWebFrameCallbackResult(
+ rvh->ExecuteJavascriptInWebFrameCallbackResult(
string16(), // frame_xpath
ConvertJavaStringToUTF16(env, script),
c_callback);
@@ -1498,7 +1501,7 @@ void ContentViewCoreImpl::EvaluateJavaScript(JNIEnv* env,
bool ContentViewCoreImpl::GetUseDesktopUserAgent(
JNIEnv* env, jobject obj) {
- NavigationEntry* entry = web_contents_->GetController().GetActiveEntry();
+ NavigationEntry* entry = web_contents_->GetController().GetVisibleEntry();
return entry && entry->GetIsOverridingUserAgent();
}
@@ -1547,7 +1550,7 @@ void ContentViewCoreImpl::SetUseDesktopUserAgent(
return;
// Make sure the navigation entry actually exists.
- NavigationEntry* entry = web_contents_->GetController().GetActiveEntry();
+ NavigationEntry* entry = web_contents_->GetController().GetVisibleEntry();
if (!entry)
return;
@@ -1571,12 +1574,17 @@ void ContentViewCoreImpl::SetAccessibilityEnabled(JNIEnv* env, jobject obj,
return;
RenderWidgetHostImpl* host_impl = RenderWidgetHostImpl::From(
host_view->GetRenderWidgetHost());
+ BrowserAccessibilityState* accessibility_state =
+ BrowserAccessibilityState::GetInstance();
if (enabled) {
- BrowserAccessibilityState::GetInstance()->EnableAccessibility();
- if (host_impl)
+ // This enables accessibility globally unless it was explicitly disallowed
+ // by a command-line flag.
+ accessibility_state->OnScreenReaderDetected();
+ // If it was actually enabled globally, enable it for this RenderWidget now.
+ if (accessibility_state->IsAccessibleBrowser() && host_impl)
host_impl->SetAccessibilityMode(AccessibilityModeComplete);
} else {
- BrowserAccessibilityState::GetInstance()->DisableAccessibility();
+ accessibility_state->DisableAccessibility();
if (host_impl)
host_impl->SetAccessibilityMode(AccessibilityModeOff);
}
diff --git a/chromium/content/browser/android/content_view_core_impl.h b/chromium/content/browser/android/content_view_core_impl.h
index ab7da6d2439..f3cf755257a 100644
--- a/chromium/content/browser/android/content_view_core_impl.h
+++ b/chromium/content/browser/android/content_view_core_impl.h
@@ -155,7 +155,8 @@ class ContentViewCoreImpl : public ContentViewCore,
void EvaluateJavaScript(JNIEnv* env,
jobject obj,
jstring script,
- jobject callback);
+ jobject callback,
+ jboolean start_renderer);
int GetNativeImeAdapter(JNIEnv* env, jobject obj);
void SetFocus(JNIEnv* env, jobject obj, jboolean focused);
void ScrollFocusedEditableNodeIntoView(JNIEnv* env, jobject obj);
diff --git a/chromium/content/browser/android/in_process/synchronous_compositor_impl.cc b/chromium/content/browser/android/in_process/synchronous_compositor_impl.cc
index 678f622875b..5ab105b9a70 100644
--- a/chromium/content/browser/android/in_process/synchronous_compositor_impl.cc
+++ b/chromium/content/browser/android/in_process/synchronous_compositor_impl.cc
@@ -70,7 +70,7 @@ class SynchronousCompositorFactoryImpl : public SynchronousCompositorFactory {
if (!offscreen_context_for_main_thread_.get() ||
offscreen_context_for_main_thread_->DestroyedOnMainThread()) {
offscreen_context_for_main_thread_ =
- webkit::gpu::ContextProviderInProcess::CreateOffscreen();
+ webkit::gpu::ContextProviderInProcess::Create();
if (offscreen_context_for_main_thread_.get() &&
!offscreen_context_for_main_thread_->BindToCurrentThread())
offscreen_context_for_main_thread_ = NULL;
@@ -90,7 +90,7 @@ class SynchronousCompositorFactoryImpl : public SynchronousCompositorFactory {
if (!offscreen_context_for_compositor_thread_.get() ||
offscreen_context_for_compositor_thread_->DestroyedOnMainThread()) {
offscreen_context_for_compositor_thread_ =
- webkit::gpu::ContextProviderInProcess::CreateOffscreen();
+ webkit::gpu::ContextProviderInProcess::Create();
}
return offscreen_context_for_compositor_thread_;
}
@@ -228,7 +228,8 @@ void SynchronousCompositorImpl::SetInputHandler(
void SynchronousCompositorImpl::DidOverscroll(
const cc::DidOverscrollParams& params) {
if (compositor_client_) {
- compositor_client_->DidOverscroll(params.latest_overscroll_delta,
+ compositor_client_->DidOverscroll(params.accumulated_overscroll,
+ params.latest_overscroll_delta,
params.current_fling_velocity);
}
}
diff --git a/chromium/content/browser/android/web_contents_observer_android.cc b/chromium/content/browser/android/web_contents_observer_android.cc
index d9a150742d1..eac49b240ae 100644
--- a/chromium/content/browser/android/web_contents_observer_android.cc
+++ b/chromium/content/browser/android/web_contents_observer_android.cc
@@ -15,6 +15,7 @@
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "content/public/browser/navigation_details.h"
+#include "content/public/browser/navigation_entry.h"
#include "jni/WebContentsObserverAndroid_jni.h"
using base::android::AttachCurrentThread;
@@ -66,8 +67,8 @@ void WebContentsObserverAndroid::DidStartLoading(
ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
if (obj.is_null())
return;
- ScopedJavaLocalRef<jstring> jstring_url(ConvertUTF8ToJavaString(
- env, web_contents()->GetVisibleURL().spec()));
+ ScopedJavaLocalRef<jstring> jstring_url(
+ ConvertUTF8ToJavaString(env, web_contents()->GetURL().spec()));
Java_WebContentsObserverAndroid_didStartLoading(
env, obj.obj(), jstring_url.obj());
}
@@ -78,8 +79,19 @@ void WebContentsObserverAndroid::DidStopLoading(
ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
if (obj.is_null())
return;
- ScopedJavaLocalRef<jstring> jstring_url(ConvertUTF8ToJavaString(
- env, web_contents()->GetLastCommittedURL().spec()));
+
+ std::string url_string;
+ NavigationEntry* entry =
+ web_contents()->GetController().GetLastCommittedEntry();
+ // Not that GetBaseURLForDataURL is only used by the Android WebView
+ if (entry && !entry->GetBaseURLForDataURL().is_empty()) {
+ url_string = entry->GetBaseURLForDataURL().possibly_invalid_spec();
+ } else {
+ url_string = web_contents()->GetURL().spec();
+ }
+
+ ScopedJavaLocalRef<jstring> jstring_url(
+ ConvertUTF8ToJavaString(env, url_string));
Java_WebContentsObserverAndroid_didStopLoading(
env, obj.obj(), jstring_url.obj());
}
diff --git a/chromium/content/browser/aura/gpu_process_transport_factory.cc b/chromium/content/browser/aura/gpu_process_transport_factory.cc
index eeb6f3bc578..47b1533ae77 100644
--- a/chromium/content/browser/aura/gpu_process_transport_factory.cc
+++ b/chromium/content/browser/aura/gpu_process_transport_factory.cc
@@ -199,6 +199,12 @@ GpuProcessTransportFactory::CreateOffscreenCommandBufferContext() {
return CreateContextCommon(swap_client, 0);
}
+scoped_ptr<WebKit::WebGraphicsContext3D>
+GpuProcessTransportFactory::CreateOffscreenContext() {
+ return CreateOffscreenCommandBufferContext()
+ .PassAs<WebKit::WebGraphicsContext3D>();
+}
+
scoped_ptr<cc::SoftwareOutputDevice> CreateSoftwareOutputDevice(
ui::Compositor* compositor) {
#if defined(OS_WIN)
diff --git a/chromium/content/browser/aura/gpu_process_transport_factory.h b/chromium/content/browser/aura/gpu_process_transport_factory.h
index 56d3e55498a..72b88d532bb 100644
--- a/chromium/content/browser/aura/gpu_process_transport_factory.h
+++ b/chromium/content/browser/aura/gpu_process_transport_factory.h
@@ -35,7 +35,9 @@ class GpuProcessTransportFactory
scoped_ptr<WebGraphicsContext3DCommandBufferImpl>
CreateOffscreenCommandBufferContext();
- // ui::ContextFactory implementation.
+ // ContextFactory implementation.
+ virtual scoped_ptr<WebKit::WebGraphicsContext3D> CreateOffscreenContext()
+ OVERRIDE;
virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface(
ui::Compositor* compositor) OVERRIDE;
virtual scoped_refptr<ui::Reflector> CreateReflector(
@@ -44,10 +46,6 @@ class GpuProcessTransportFactory
virtual void RemoveReflector(
scoped_refptr<ui::Reflector> reflector) OVERRIDE;
virtual void RemoveCompositor(ui::Compositor* compositor) OVERRIDE;
- virtual scoped_refptr<cc::ContextProvider>
- OffscreenContextProviderForMainThread() OVERRIDE;
- virtual scoped_refptr<cc::ContextProvider>
- OffscreenContextProviderForCompositorThread() OVERRIDE;
virtual bool DoesCreateTestContexts() OVERRIDE;
// ImageTransportFactory implementation.
@@ -68,6 +66,12 @@ class GpuProcessTransportFactory
virtual void RemoveObserver(
ImageTransportFactoryObserver* observer) OVERRIDE;
+ // ui::ContextFactory implementation.
+ virtual scoped_refptr<cc::ContextProvider>
+ OffscreenContextProviderForMainThread() OVERRIDE;
+ virtual scoped_refptr<cc::ContextProvider>
+ OffscreenContextProviderForCompositorThread() OVERRIDE;
+
void OnLostContext(ui::Compositor* compositor);
private:
diff --git a/chromium/content/browser/aura/software_output_device_win.cc b/chromium/content/browser/aura/software_output_device_win.cc
index 1a5af467b4e..0332e3e936d 100644
--- a/chromium/content/browser/aura/software_output_device_win.cc
+++ b/chromium/content/browser/aura/software_output_device_win.cc
@@ -11,7 +11,6 @@
#include "ui/gfx/canvas.h"
#include "ui/gfx/canvas_skia_paint.h"
#include "ui/gfx/gdi_util.h"
-#include "ui/gfx/skia_util.h"
namespace content {
@@ -99,12 +98,4 @@ void SoftwareOutputDeviceWin::EndPaint(cc::SoftwareFrameData* frame_data) {
}
}
-void SoftwareOutputDeviceWin::CopyToBitmap(
- gfx::Rect rect, SkBitmap* output) {
- DCHECK(contents_);
- SkDevice* device = contents_->sk_canvas()->getDevice();
- const SkBitmap& bitmap = device->accessBitmap(false);
- bitmap.extractSubset(output, gfx::RectToSkIRect(rect));
-}
-
} // namespace content
diff --git a/chromium/content/browser/aura/software_output_device_win.h b/chromium/content/browser/aura/software_output_device_win.h
index 9c0655b6f67..93568c2bd5b 100644
--- a/chromium/content/browser/aura/software_output_device_win.h
+++ b/chromium/content/browser/aura/software_output_device_win.h
@@ -28,7 +28,6 @@ class SoftwareOutputDeviceWin : public cc::SoftwareOutputDevice {
virtual void Resize(gfx::Size viewport_size) OVERRIDE;
virtual SkCanvas* BeginPaint(gfx::Rect damage_rect) OVERRIDE;
virtual void EndPaint(cc::SoftwareFrameData* frame_data) OVERRIDE;
- virtual void CopyToBitmap(gfx::Rect rect, SkBitmap* output) OVERRIDE;
private:
HWND hwnd_;
diff --git a/chromium/content/browser/browser_plugin/browser_plugin_guest.cc b/chromium/content/browser/browser_plugin/browser_plugin_guest.cc
index 31250b7d626..5f1ec69e8af 100644
--- a/chromium/content/browser/browser_plugin/browser_plugin_guest.cc
+++ b/chromium/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -127,7 +127,7 @@ class BrowserPluginGuest::GeolocationRequest : public PermissionRequest {
// in the fact whether the embedder/app has geolocation
// permission. Therefore we use an invalid |bridge_id|.
-1 /* bridge_id */,
- web_contents->GetLastCommittedURL(),
+ web_contents->GetURL(),
geolocation_callback);
return;
}
@@ -348,7 +348,7 @@ BrowserPluginGuest::BrowserPluginGuest(
embedder_visible_(true),
next_permission_request_id_(browser_plugin::kInvalidPermissionRequestID),
has_render_view_(has_render_view),
- last_seen_auto_size_enabled_(false) {
+ is_in_destruction_(false) {
DCHECK(web_contents);
web_contents->SetDelegate(this);
if (opener)
@@ -422,6 +422,7 @@ int BrowserPluginGuest::RequestPermission(
}
void BrowserPluginGuest::Destroy() {
+ is_in_destruction_ = true;
if (!attached() && opener())
opener()->pending_new_windows_.erase(this);
DestroyUnattachedWindows();
@@ -765,10 +766,6 @@ WebContentsImpl* BrowserPluginGuest::GetWebContents() {
base::SharedMemory* BrowserPluginGuest::GetDamageBufferFromEmbedder(
const BrowserPluginHostMsg_ResizeGuest_Params& params) {
- if (!attached()) {
- LOG(WARNING) << "Attempting to map a damage buffer prior to attachment.";
- return NULL;
- }
#if defined(OS_WIN)
base::ProcessHandle handle =
embedder_web_contents_->GetRenderProcessHost()->GetHandle();
@@ -1264,7 +1261,7 @@ void BrowserPluginGuest::OnLockMouse(bool user_gesture,
base::Value::CreateBooleanValue(last_unlocked_by_target));
request_info.Set(browser_plugin::kURL,
base::Value::CreateStringValue(
- web_contents()->GetLastCommittedURL().spec()));
+ web_contents()->GetURL().spec()));
RequestPermission(BROWSER_PLUGIN_PERMISSION_TYPE_POINTER_LOCK,
new PointerLockRequest(this),
@@ -1321,13 +1318,6 @@ void BrowserPluginGuest::OnResizeGuest(
render_widget_host->NotifyScreenInfoChanged();
}
}
- // When autosize is turned off and as a result there is a layout change, we
- // send a sizechanged event.
- if (!auto_size_enabled_ && last_seen_auto_size_enabled_ &&
- !params.view_rect.size().IsEmpty() && delegate_) {
- delegate_->SizeChanged(last_seen_view_size_, params.view_rect.size());
- last_seen_auto_size_enabled_ = false;
- }
// Invalid damage buffer means we are in HW compositing mode,
// so just resize the WebContents and repaint if needed.
if (!base::SharedMemory::IsHandleValid(params.damage_buffer_handle)) {
@@ -1590,16 +1580,6 @@ void BrowserPluginGuest::OnUpdateRect(
params.flags);
relay_params.needs_ack = params.needs_ack;
- bool size_changed = last_seen_view_size_ != params.view_size;
- gfx::Size old_size = last_seen_view_size_;
- last_seen_view_size_ = params.view_size;
-
- if ((auto_size_enabled_ || last_seen_auto_size_enabled_) &&
- size_changed && delegate_) {
- delegate_->SizeChanged(old_size, last_seen_view_size_);
- }
- last_seen_auto_size_enabled_ = auto_size_enabled_;
-
// HW accelerated case, acknowledge resize only
if (!params.needs_ack || !damage_buffer_) {
relay_params.damage_buffer_sequence_id = 0;
diff --git a/chromium/content/browser/browser_plugin/browser_plugin_guest.h b/chromium/content/browser/browser_plugin/browser_plugin_guest.h
index ffe8d566145..6098cacca38 100644
--- a/chromium/content/browser/browser_plugin/browser_plugin_guest.h
+++ b/chromium/content/browser/browser_plugin/browser_plugin_guest.h
@@ -136,6 +136,7 @@ class CONTENT_EXPORT BrowserPluginGuest
bool focused() const { return focused_; }
bool visible() const { return guest_visible_; }
void clear_damage_buffer() { damage_buffer_.reset(); }
+ bool is_in_destruction() { return is_in_destruction_; }
BrowserPluginGuest* opener() const { return opener_.get(); }
@@ -515,10 +516,7 @@ class CONTENT_EXPORT BrowserPluginGuest
// this guest is attached.
bool has_render_view_;
- // Last seen size of guest contents (by OnUpdateRect).
- gfx::Size last_seen_view_size_;
- // Last seen autosize attribute state (by OnUpdateRect).
- bool last_seen_auto_size_enabled_;
+ bool is_in_destruction_;
// This is a queue of messages that are destined to be sent to the embedder
// once the guest is attached to a particular embedder.
diff --git a/chromium/content/browser/browser_plugin/browser_plugin_host_browsertest.cc b/chromium/content/browser/browser_plugin/browser_plugin_host_browsertest.cc
index c50e8cfa8a3..4fc2ae80335 100644
--- a/chromium/content/browser/browser_plugin/browser_plugin_host_browsertest.cc
+++ b/chromium/content/browser/browser_plugin/browser_plugin_host_browsertest.cc
@@ -786,6 +786,63 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, FocusTracksEmbedder) {
test_guest()->WaitForBlur();
}
+// This test verifies that if a browser plugin is in autosize mode before
+// navigation then the guest starts auto-sized.
+IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AutoSizeBeforeNavigation) {
+ const char* kEmbedderURL = "/browser_plugin_embedder.html";
+ const std::string embedder_code =
+ "document.getElementById('plugin').minwidth = 300;"
+ "document.getElementById('plugin').minheight = 200;"
+ "document.getElementById('plugin').maxwidth = 600;"
+ "document.getElementById('plugin').maxheight = 400;"
+ "document.getElementById('plugin').autosize = true;";
+ StartBrowserPluginTest(
+ kEmbedderURL, kHTMLForGuestWithSize, true, embedder_code);
+ // Verify that the guest has been auto-sized.
+ test_guest()->WaitForViewSize(gfx::Size(300, 400));
+}
+
+// This test verifies that enabling autosize resizes the guest and triggers
+// a 'sizechanged' event.
+IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AutoSizeAfterNavigation) {
+ const char* kEmbedderURL = "/browser_plugin_embedder.html";
+ StartBrowserPluginTest(
+ kEmbedderURL, kHTMLForGuestWithSize, true, std::string());
+ RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
+ test_embedder()->web_contents()->GetRenderViewHost());
+
+ {
+ const string16 expected_title = ASCIIToUTF16("AutoSize(300, 400)");
+ content::TitleWatcher title_watcher(test_embedder()->web_contents(),
+ expected_title);
+ ExecuteSyncJSFunction(
+ rvh,
+ "document.getElementById('plugin').minwidth = 300;"
+ "document.getElementById('plugin').minheight = 200;"
+ "document.getElementById('plugin').maxwidth = 600;"
+ "document.getElementById('plugin').maxheight = 400;"
+ "document.getElementById('plugin').autosize = true;");
+ string16 actual_title = title_watcher.WaitAndGetTitle();
+ EXPECT_EQ(expected_title, actual_title);
+ }
+ {
+ // Change the minwidth and verify that it causes relayout.
+ const string16 expected_title = ASCIIToUTF16("AutoSize(350, 400)");
+ content::TitleWatcher title_watcher(test_embedder()->web_contents(),
+ expected_title);
+ ExecuteSyncJSFunction(
+ rvh, "document.getElementById('plugin').minwidth = 350;");
+ string16 actual_title = title_watcher.WaitAndGetTitle();
+ EXPECT_EQ(expected_title, actual_title);
+ }
+ {
+ // Turn off autoSize and verify that the guest resizes to fit the container.
+ ExecuteSyncJSFunction(
+ rvh, "document.getElementById('plugin').autosize = null;");
+ test_guest()->WaitForViewSize(gfx::Size(640, 480));
+ }
+}
+
// Test for regression http://crbug.com/162961.
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, GetRenderViewHostAtPositionTest) {
const char kEmbedderURL[] = "/browser_plugin_embedder.html";
@@ -801,6 +858,79 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, GetRenderViewHostAtPositionTest) {
test_embedder()->last_rvh_at_position_response());
}
+// This test verifies that all autosize attributes can be removed
+// without crashing the plugin, or throwing errors.
+IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, RemoveAutosizeAttributes) {
+ const char* kEmbedderURL = "/browser_plugin_embedder.html";
+ const std::string embedder_code =
+ "document.getElementById('plugin').minwidth = 300;"
+ "document.getElementById('plugin').minheight = 200;"
+ "document.getElementById('plugin').maxwidth = 600;"
+ "document.getElementById('plugin').maxheight = 400;"
+ "document.getElementById('plugin').name = 'name';"
+ "document.getElementById('plugin').src = 'foo';"
+ "document.getElementById('plugin').autosize = '';";
+ StartBrowserPluginTest(
+ kEmbedderURL, kHTMLForGuestWithSize, true, embedder_code);
+ RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
+ test_embedder()->web_contents()->GetRenderViewHost());
+ RemoveAttributes(rvh, "maxheight, maxwidth, minheight, minwidth, autosize");
+
+ // Verify that the guest resizes to fit the container (and hasn't crashed).
+ test_guest()->WaitForViewSize(gfx::Size(640, 480));
+ EXPECT_TRUE(IsAttributeNull(rvh, "maxheight"));
+ EXPECT_TRUE(IsAttributeNull(rvh, "maxwidth"));
+ EXPECT_TRUE(IsAttributeNull(rvh, "minheight"));
+ EXPECT_TRUE(IsAttributeNull(rvh, "minwidth"));
+ EXPECT_TRUE(IsAttributeNull(rvh, "autosize"));
+}
+
+// This test verifies that autosize works when some of the parameters are unset.
+IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, PartialAutosizeAttributes) {
+ const char* kEmbedderURL = "/browser_plugin_embedder.html";
+ const std::string embedder_code =
+ "document.getElementById('plugin').minwidth = 300;"
+ "document.getElementById('plugin').minheight = 200;"
+ "document.getElementById('plugin').maxwidth = 700;"
+ "document.getElementById('plugin').maxheight = 600;"
+ "document.getElementById('plugin').autosize = '';";
+ StartBrowserPluginTest(
+ kEmbedderURL, kHTMLForGuestWithSize, true, embedder_code);
+ RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
+ test_embedder()->web_contents()->GetRenderViewHost());
+ {
+ // Remove an autosize attribute and verify that it causes relayout.
+ const string16 expected_title = ASCIIToUTF16("AutoSize(640, 400)");
+ content::TitleWatcher title_watcher(test_embedder()->web_contents(),
+ expected_title);
+ RemoveAttributes(rvh, "minwidth");
+ string16 actual_title = title_watcher.WaitAndGetTitle();
+ EXPECT_EQ(expected_title, actual_title);
+ }
+ {
+ // Remove an autosize attribute and verify that it causes relayout.
+ // Also tests that when minwidth > maxwidth, minwidth = maxwidth.
+ const string16 expected_title = ASCIIToUTF16("AutoSize(700, 480)");
+ content::TitleWatcher title_watcher(test_embedder()->web_contents(),
+ expected_title);
+ RemoveAttributes(rvh, "maxheight");
+ ExecuteSyncJSFunction(
+ rvh, "document.getElementById('plugin').minwidth = 800;"
+ "document.getElementById('plugin').minheight = 800;");
+ string16 actual_title = title_watcher.WaitAndGetTitle();
+ EXPECT_EQ(expected_title, actual_title);
+ }
+ {
+ // Remove maxwidth and make sure the size returns to plugin size.
+ const string16 expected_title = ASCIIToUTF16("AutoSize(640, 480)");
+ content::TitleWatcher title_watcher(test_embedder()->web_contents(),
+ expected_title);
+ RemoveAttributes(rvh, "maxwidth");
+ string16 actual_title = title_watcher.WaitAndGetTitle();
+ EXPECT_EQ(expected_title, actual_title);
+ }
+}
+
// This test verifies that if IME is enabled in the embedder, it is also enabled
// in the guest.
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, VerifyInputMethodActive) {
diff --git a/chromium/content/browser/browser_thread_impl.h b/chromium/content/browser/browser_thread_impl.h
index 167cc3b85a1..b16bb362351 100644
--- a/chromium/content/browser/browser_thread_impl.h
+++ b/chromium/content/browser/browser_thread_impl.h
@@ -60,7 +60,6 @@ class CONTENT_EXPORT BrowserThreadImpl : public BrowserThread,
// For testing.
friend class ContentTestSuiteBaseListener;
- friend class TestBrowserThreadBundle;
static void FlushThreadPoolHelper();
// The identifier of this thread. Only one thread can exist with a given
diff --git a/chromium/content/browser/child_process_security_policy_impl.cc b/chromium/content/browser/child_process_security_policy_impl.cc
index d7640d344df..aefbf71fa62 100644
--- a/chromium/content/browser/child_process_security_policy_impl.cc
+++ b/chromium/content/browser/child_process_security_policy_impl.cc
@@ -38,6 +38,7 @@ const int kReadFilePermissions =
const int kWriteFilePermissions =
base::PLATFORM_FILE_OPEN |
base::PLATFORM_FILE_WRITE |
+ base::PLATFORM_FILE_APPEND |
base::PLATFORM_FILE_EXCLUSIVE_WRITE |
base::PLATFORM_FILE_ASYNC |
base::PLATFORM_FILE_WRITE_ATTRIBUTES;
diff --git a/chromium/content/browser/device_orientation/device_orientation_browsertest.cc b/chromium/content/browser/device_orientation/device_orientation_browsertest.cc
index 095e85f310c..17d944614d7 100644
--- a/chromium/content/browser/device_orientation/device_orientation_browsertest.cc
+++ b/chromium/content/browser/device_orientation/device_orientation_browsertest.cc
@@ -71,7 +71,7 @@ IN_PROC_BROWSER_TEST_F(DeviceOrientationBrowserTest, BasicTest) {
// Check that the page got the event it expected and that the provider
// saw requests for adding and removing an observer.
- EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref());
+ EXPECT_EQ("pass", shell()->web_contents()->GetURL().ref());
EXPECT_TRUE(provider->added_observer_);
EXPECT_TRUE(provider->removed_observer_);
}
diff --git a/chromium/content/browser/devtools/devtools_protocol.cc b/chromium/content/browser/devtools/devtools_protocol.cc
index 948ed6be8a4..83980846556 100644
--- a/chromium/content/browser/devtools/devtools_protocol.cc
+++ b/chromium/content/browser/devtools/devtools_protocol.cc
@@ -190,11 +190,6 @@ void DevToolsProtocol::Handler::SendNotification(
SendRawMessage(notification->Serialize());
}
-void DevToolsProtocol::Handler::SendAsyncResponse(
- scoped_refptr<DevToolsProtocol::Response> response) {
- SendRawMessage(response->Serialize());
-}
-
void DevToolsProtocol::Handler::SendRawMessage(const std::string& message) {
if (!notifier_.is_null())
notifier_.Run(message);
diff --git a/chromium/content/browser/devtools/devtools_protocol.h b/chromium/content/browser/devtools/devtools_protocol.h
index 2f7ce0bfecb..0012947382c 100644
--- a/chromium/content/browser/devtools/devtools_protocol.h
+++ b/chromium/content/browser/devtools/devtools_protocol.h
@@ -141,8 +141,6 @@ class DevToolsProtocol {
void SendNotification(const std::string& method,
base::DictionaryValue* params);
- void SendAsyncResponse(scoped_refptr<DevToolsProtocol::Response> response);
-
// Sends message to client, the caller is presumed to properly
// format the message.
void SendRawMessage(const std::string& message);
diff --git a/chromium/content/browser/devtools/devtools_protocol_constants.cc b/chromium/content/browser/devtools/devtools_protocol_constants.cc
index 7fbec4b665b..c689ea1b7cb 100644
--- a/chromium/content/browser/devtools/devtools_protocol_constants.cc
+++ b/chromium/content/browser/devtools/devtools_protocol_constants.cc
@@ -8,40 +8,32 @@ namespace content {
namespace devtools {
namespace Inspector {
-
namespace detached {
const char kName[] = "Inspector.detached";
const char kParamReason[] = "reason";
} // detached
-
namespace targetCrashed {
const char kName[] = "Inspector.targetCrashed";
} // targetCrashed
-
} // Inspector
namespace DOM {
-
namespace setFileInputFiles {
const char kName[] = "DOM.setFileInputFiles";
const char kParamFiles[] = "files";
} // setFileInputFiles
-
} // DOM
namespace Page {
-
namespace handleJavaScriptDialog {
const char kName[] = "Page.handleJavaScriptDialog";
const char kParamAccept[] = "accept";
const char kParamPromptText[] = "promptText";
} // handleJavaScriptDialog
-
namespace navigate {
const char kName[] = "Page.navigate";
const char kParamUrl[] = "url";
} // navigate
-
namespace captureScreenshot {
const char kName[] = "Page.captureScreenshot";
const char kParamFormat[] = "format";
@@ -49,31 +41,12 @@ namespace captureScreenshot {
const char kParamScale[] = "scale";
const char kResponseData[] = "data";
} // captureScreenshot
-
-namespace startScreencast {
- const char kName[] = "Page.startScreencast";
- const char kParamFormat[] = "format";
- const char kParamQuality[] = "quality";
- const char kParamScale[] = "scale";
-} // startScreencast
-
-namespace stopScreencast {
- const char kName[] = "Page.stopScreencast";
-} // stopScreencast
-
-namespace screencastFrame {
- const char kName[] = "Page.screencastFrame";
- const char kResponseData[] = "data";
-} // screencastFrame
-
} // Page
namespace Worker {
-
namespace disconnectedFromWorker {
const char kName[] = "Worker.disconnectedFromWorker";
} // disconnectedFromWorker
-
} // Worker
namespace Tracing {
@@ -97,7 +70,6 @@ namespace dataCollected {
const char kName[] = "Tracing.dataCollected";
const char kValue[] = "value";
}
-
} // Tracing
} // devtools
diff --git a/chromium/content/browser/devtools/devtools_protocol_constants.h b/chromium/content/browser/devtools/devtools_protocol_constants.h
index fdf182a3dbb..a05493318e1 100644
--- a/chromium/content/browser/devtools/devtools_protocol_constants.h
+++ b/chromium/content/browser/devtools/devtools_protocol_constants.h
@@ -15,16 +15,13 @@ namespace content {
namespace devtools {
namespace Inspector {
-
namespace detached {
extern const char kName[];
extern const char kParamReason[];
} // detached
-
namespace targetCrashed {
extern const char kName[];
} // targetCrashed
-
} // Inspector
namespace DOM {
@@ -35,18 +32,15 @@ namespace setFileInputFiles {
} // DOM
namespace Page {
-
namespace handleJavaScriptDialog {
extern const char kName[];
extern const char kParamAccept[];
extern const char kParamPromptText[];
} // handleJavaScriptDialog
-
namespace navigate {
extern const char kName[];
extern const char kParamUrl[];
} // navigate
-
namespace captureScreenshot {
extern const char kName[];
extern const char kParamFormat[];
@@ -54,23 +48,6 @@ namespace captureScreenshot {
extern const char kParamScale[];
extern const char kResponseData[];
} // captureScreenshot
-
-namespace startScreencast {
- extern const char kName[];
- extern const char kParamFormat[];
- extern const char kParamQuality[];
- extern const char kParamScale[];
-} // startScreencast
-
-namespace stopScreencast {
- extern const char kName[];
-} // stopScreencast
-
-namespace screencastFrame {
- extern const char kName[];
- extern const char kResponseData[];
-} // screencastFrame
-
} // Page
namespace Tracing {
@@ -98,11 +75,9 @@ namespace dataCollected {
namespace Worker {
-
namespace disconnectedFromWorker {
extern const char kName[];
} // disconnectedFromWorker
-
} // Worker
} // devtools
diff --git a/chromium/content/browser/devtools/render_view_devtools_agent_host.cc b/chromium/content/browser/devtools/render_view_devtools_agent_host.cc
index 99686a00079..7455c160d8e 100644
--- a/chromium/content/browser/devtools/render_view_devtools_agent_host.cc
+++ b/chromium/content/browser/devtools/render_view_devtools_agent_host.cc
@@ -17,7 +17,6 @@
#include "content/browser/site_instance_impl.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "content/common/devtools_messages.h"
-#include "content/common/view_messages.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_types.h"
@@ -312,17 +311,11 @@ bool RenderViewDevToolsAgentHost::OnRvhMessageReceived(
IPC_MESSAGE_HANDLER(DevToolsHostMsg_ClearBrowserCache, OnClearBrowserCache)
IPC_MESSAGE_HANDLER(DevToolsHostMsg_ClearBrowserCookies,
OnClearBrowserCookies)
- IPC_MESSAGE_HANDLER_GENERIC(ViewHostMsg_SwapCompositorFrame,
- handled = false; OnSwapCompositorFrame())
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
}
-void RenderViewDevToolsAgentHost::OnSwapCompositorFrame() {
- overrides_handler_->OnSwapCompositorFrame();
-}
-
void RenderViewDevToolsAgentHost::OnSaveAgentRuntimeState(
const std::string& state) {
if (!render_view_host_)
diff --git a/chromium/content/browser/devtools/render_view_devtools_agent_host.h b/chromium/content/browser/devtools/render_view_devtools_agent_host.h
index 89855441146..00f73a6b2a0 100644
--- a/chromium/content/browser/devtools/render_view_devtools_agent_host.h
+++ b/chromium/content/browser/devtools/render_view_devtools_agent_host.h
@@ -59,7 +59,6 @@ class CONTENT_EXPORT RenderViewDevToolsAgentHost
void RenderViewHostDestroyed(RenderViewHost* rvh);
void RenderViewCrashed();
bool OnRvhMessageReceived(const IPC::Message& message);
- void OnSwapCompositorFrame();
void OnDispatchOnInspectorFrontend(const std::string& message);
void OnSaveAgentRuntimeState(const std::string& state);
diff --git a/chromium/content/browser/devtools/renderer_overrides_handler.cc b/chromium/content/browser/devtools/renderer_overrides_handler.cc
index f5d6c1cd546..57266676e87 100644
--- a/chromium/content/browser/devtools/renderer_overrides_handler.cc
+++ b/chromium/content/browser/devtools/renderer_overrides_handler.cc
@@ -34,7 +34,7 @@
#include "ui/snapshot/snapshot.h"
#include "url/gurl.h"
-namespace content {
+using base::TimeTicks;
namespace {
@@ -42,31 +42,10 @@ static const char kPng[] = "png";
static const char kJpeg[] = "jpeg";
static int kDefaultScreenshotQuality = 80;
-void ParseCaptureParameters(DevToolsProtocol::Command* command,
- std::string* format,
- int* quality,
- double* scale) {
- *quality = kDefaultScreenshotQuality;
- *scale = 1;
- base::DictionaryValue* params = command->params();
- if (params) {
- params->GetString(devtools::Page::captureScreenshot::kParamFormat,
- format);
- params->GetInteger(devtools::Page::captureScreenshot::kParamQuality,
- quality);
- params->GetDouble(devtools::Page::captureScreenshot::kParamScale,
- scale);
- }
- if (format->empty())
- *format = kPng;
- if (*quality < 0 || *quality > 100)
- *quality = kDefaultScreenshotQuality;
- if (*scale <= 0 || *scale > 1)
- *scale = 1;
-}
-
} // namespace
+namespace content {
+
RendererOverridesHandler::RendererOverridesHandler(DevToolsAgentHost* agent)
: agent_(agent),
weak_factory_(this) {
@@ -90,45 +69,10 @@ RendererOverridesHandler::RendererOverridesHandler(DevToolsAgentHost* agent)
base::Bind(
&RendererOverridesHandler::PageCaptureScreenshot,
base::Unretained(this)));
- RegisterCommandHandler(
- devtools::Page::startScreencast::kName,
- base::Bind(
- &RendererOverridesHandler::PageStartScreencast,
- base::Unretained(this)));
- RegisterCommandHandler(
- devtools::Page::stopScreencast::kName,
- base::Bind(
- &RendererOverridesHandler::PageStopScreencast,
- base::Unretained(this)));
}
RendererOverridesHandler::~RendererOverridesHandler() {}
-void RendererOverridesHandler::OnSwapCompositorFrame() {
- if (!screencast_command_)
- return;
-
- std::string format;
- int quality = kDefaultScreenshotQuality;
- double scale = 1;
- ParseCaptureParameters(screencast_command_.get(), &format, &quality, &scale);
-
- RenderViewHost* host = agent_->GetRenderViewHost();
- RenderWidgetHostViewPort* view_port =
- RenderWidgetHostViewPort::FromRWHV(host->GetView());
-
- gfx::Rect view_bounds = host->GetView()->GetViewBounds();
- gfx::Size snapshot_size = gfx::ToFlooredSize(
- gfx::ScaleSize(view_bounds.size(), scale));
-
- view_port->CopyFromCompositingSurface(
- view_bounds, snapshot_size,
- base::Bind(&RendererOverridesHandler::ScreenshotCaptured,
- weak_factory_.GetWeakPtr(),
- scoped_refptr<DevToolsProtocol::Command>(), format, quality,
- scale));
-}
-
scoped_refptr<DevToolsProtocol::Response>
RendererOverridesHandler::GrantPermissionsForSetFileInputFiles(
scoped_refptr<DevToolsProtocol::Command> command) {
@@ -211,10 +155,25 @@ RendererOverridesHandler::PageNavigate(
scoped_refptr<DevToolsProtocol::Response>
RendererOverridesHandler::PageCaptureScreenshot(
scoped_refptr<DevToolsProtocol::Command> command) {
+ // Parse input parameters.
std::string format;
int quality = kDefaultScreenshotQuality;
double scale = 1;
- ParseCaptureParameters(command.get(), &format, &quality, &scale);
+ base::DictionaryValue* params = command->params();
+ if (params) {
+ params->GetString(devtools::Page::captureScreenshot::kParamFormat,
+ &format);
+ params->GetInteger(devtools::Page::captureScreenshot::kParamQuality,
+ &quality);
+ params->GetDouble(devtools::Page::captureScreenshot::kParamScale,
+ &scale);
+ }
+ if (format.empty())
+ format = kPng;
+ if (quality < 0 || quality > 100)
+ quality = kDefaultScreenshotQuality;
+ if (scale <= 0 || scale > 1)
+ scale = 1;
RenderViewHost* host = agent_->GetRenderViewHost();
gfx::Rect view_bounds = host->GetView()->GetViewBounds();
@@ -251,21 +210,6 @@ RendererOverridesHandler::PageCaptureScreenshot(
return command->AsyncResponsePromise();
}
-scoped_refptr<DevToolsProtocol::Response>
-RendererOverridesHandler::PageStartScreencast(
- scoped_refptr<DevToolsProtocol::Command> command) {
- screencast_command_ = command;
- OnSwapCompositorFrame();
- return command->SuccessResponse(NULL);
-}
-
-scoped_refptr<DevToolsProtocol::Response>
-RendererOverridesHandler::PageStopScreencast(
- scoped_refptr<DevToolsProtocol::Command> command) {
- screencast_command_ = NULL;
- return command->SuccessResponse(NULL);
-}
-
void RendererOverridesHandler::ScreenshotCaptured(
scoped_refptr<DevToolsProtocol::Command> command,
const std::string& format,
@@ -274,10 +218,9 @@ void RendererOverridesHandler::ScreenshotCaptured(
bool success,
const SkBitmap& bitmap) {
if (!success) {
- if (command) {
- SendAsyncResponse(
- command->InternalErrorResponse("Unable to capture screenshot"));
- }
+ SendRawMessage(
+ command->InternalErrorResponse("Unable to capture screenshot")->
+ Serialize());
return;
}
@@ -304,35 +247,27 @@ void RendererOverridesHandler::ScreenshotCaptured(
}
if (!encoded) {
- if (command) {
- SendAsyncResponse(
- command->InternalErrorResponse("Unable to encode screenshot"));
- }
+ SendRawMessage(
+ command->InternalErrorResponse("Unable to encode screenshot")->
+ Serialize());
return;
}
std::string base_64_data;
if (!base::Base64Encode(base::StringPiece(
- reinterpret_cast<char*>(&data[0]),
- data.size()),
+ reinterpret_cast<char*>(&data[0]),
+ data.size()),
&base_64_data)) {
- if (command) {
- SendAsyncResponse(
- command->InternalErrorResponse("Unable to base64 encode"));
- }
+ SendRawMessage(
+ command->InternalErrorResponse("Unable to base64 encode screenshot")->
+ Serialize());
return;
}
base::DictionaryValue* response = new base::DictionaryValue();
- if (command) {
- response->SetString(
- devtools::Page::captureScreenshot::kResponseData, base_64_data);
- SendAsyncResponse(command->SuccessResponse(response));
- } else {
- response->SetString(
- devtools::Page::screencastFrame::kResponseData, base_64_data);
- SendNotification(devtools::Page::screencastFrame::kName, response);
- }
+ response->SetString(
+ devtools::Page::captureScreenshot::kResponseData, base_64_data);
+ SendRawMessage(command->SuccessResponse(response)->Serialize());
}
} // namespace content
diff --git a/chromium/content/browser/devtools/renderer_overrides_handler.h b/chromium/content/browser/devtools/renderer_overrides_handler.h
index 7e5814b9d28..1d4213d8be6 100644
--- a/chromium/content/browser/devtools/renderer_overrides_handler.h
+++ b/chromium/content/browser/devtools/renderer_overrides_handler.h
@@ -26,8 +26,6 @@ class RendererOverridesHandler : public DevToolsProtocol::Handler {
explicit RendererOverridesHandler(DevToolsAgentHost* agent);
virtual ~RendererOverridesHandler();
- void OnSwapCompositorFrame();
-
private:
scoped_refptr<DevToolsProtocol::Response>
GrantPermissionsForSetFileInputFiles(
@@ -38,10 +36,6 @@ class RendererOverridesHandler : public DevToolsProtocol::Handler {
scoped_refptr<DevToolsProtocol::Command> command);
scoped_refptr<DevToolsProtocol::Response> PageCaptureScreenshot(
scoped_refptr<DevToolsProtocol::Command> command);
- scoped_refptr<DevToolsProtocol::Response> PageStartScreencast(
- scoped_refptr<DevToolsProtocol::Command> command);
- scoped_refptr<DevToolsProtocol::Response> PageStopScreencast(
- scoped_refptr<DevToolsProtocol::Command> command);
void ScreenshotCaptured(
scoped_refptr<DevToolsProtocol::Command> command,
@@ -53,7 +47,6 @@ class RendererOverridesHandler : public DevToolsProtocol::Handler {
DevToolsAgentHost* agent_;
base::WeakPtrFactory<RendererOverridesHandler> weak_factory_;
- scoped_refptr<DevToolsProtocol::Command> screencast_command_;
DISALLOW_COPY_AND_ASSIGN(RendererOverridesHandler);
};
diff --git a/chromium/content/browser/dom_storage/dom_storage_browsertest.cc b/chromium/content/browser/dom_storage/dom_storage_browsertest.cc
index 79955a8bf17..54da50a7272 100644
--- a/chromium/content/browser/dom_storage/dom_storage_browsertest.cc
+++ b/chromium/content/browser/dom_storage/dom_storage_browsertest.cc
@@ -25,8 +25,7 @@ class DOMStorageBrowserTest : public ContentBrowserTest {
// a #pass or #fail ref.
Shell* the_browser = incognito ? CreateOffTheRecordBrowser() : shell();
NavigateToURLBlockUntilNavigationsComplete(the_browser, test_url, 2);
- std::string result =
- the_browser->web_contents()->GetLastCommittedURL().ref();
+ std::string result = the_browser->web_contents()->GetURL().ref();
if (result != "pass") {
std::string js_result;
ASSERT_TRUE(ExecuteScriptAndExtractString(
diff --git a/chromium/content/browser/dom_storage/dom_storage_host.cc b/chromium/content/browser/dom_storage/dom_storage_host.cc
index 14d288d8653..296d52ec6d7 100644
--- a/chromium/content/browser/dom_storage/dom_storage_host.cc
+++ b/chromium/content/browser/dom_storage/dom_storage_host.cc
@@ -30,8 +30,12 @@ bool DOMStorageHost::OpenStorageArea(int connection_id, int namespace_id,
return false; // Indicates the renderer gave us very bad data.
NamespaceAndArea references;
references.namespace_ = context_->GetStorageNamespace(namespace_id);
- if (!references.namespace_.get())
- return false;
+ if (!references.namespace_.get()) {
+ // TODO(michaeln): Fix crbug/134003 and return false here.
+ // Until then return true to avoid crashing the renderer for
+ // sending a bad message.
+ return true;
+ }
references.area_ = references.namespace_->OpenStorageArea(origin);
DCHECK(references.area_.get());
connections_[connection_id] = references;
@@ -50,8 +54,12 @@ bool DOMStorageHost::ExtractAreaValues(
int connection_id, DOMStorageValuesMap* map) {
map->clear();
DOMStorageArea* area = GetOpenArea(connection_id);
- if (!area)
- return false;
+ if (!area) {
+ // TODO(michaeln): Fix crbug/134003 and return false here.
+ // Until then return true to avoid crashing the renderer
+ // for sending a bad message.
+ return true;
+ }
if (!area->IsLoadedInMemory()) {
DOMStorageNamespace* ns = GetNamespace(connection_id);
DCHECK(ns);
@@ -93,8 +101,12 @@ bool DOMStorageHost::SetAreaItem(
const base::string16& value, const GURL& page_url,
base::NullableString16* old_value) {
DOMStorageArea* area = GetOpenArea(connection_id);
- if (!area)
- return false;
+ if (!area) {
+ // TODO(michaeln): Fix crbug/134003 and return false here.
+ // Until then return true to allow the renderer to operate
+ // to a limited degree out of its cache.
+ return true;
+ }
if (!area->SetItem(key, value, old_value))
return false;
if (old_value->is_null() || old_value->string() != value)
diff --git a/chromium/content/browser/dom_storage/dom_storage_namespace.h b/chromium/content/browser/dom_storage/dom_storage_namespace.h
index 8e67b032bb4..5860685f807 100644
--- a/chromium/content/browser/dom_storage/dom_storage_namespace.h
+++ b/chromium/content/browser/dom_storage/dom_storage_namespace.h
@@ -13,8 +13,6 @@
#include "content/common/content_export.h"
#include "url/gurl.h"
-class GURL;
-
namespace content {
class DOMStorageArea;
diff --git a/chromium/content/browser/dom_storage/session_storage_database.cc b/chromium/content/browser/dom_storage/session_storage_database.cc
index bac3df7a67b..5fb0c90da3b 100644
--- a/chromium/content/browser/dom_storage/session_storage_database.cc
+++ b/chromium/content/browser/dom_storage/session_storage_database.cc
@@ -326,7 +326,7 @@ leveldb::Status SessionStorageDatabase::TryToOpen(leveldb::DB** db) {
// The directory exists but a valid leveldb database might not exist inside it
// (e.g., a subset of the needed files might be missing). Handle this
// situation gracefully by creating the database now.
- options.max_open_files = 0; // Use minimum.
+ options.max_open_files = 64; // Use minimum.
options.create_if_missing = true;
#if defined(OS_WIN)
return leveldb::DB::Open(options, WideToUTF8(file_path_.value()), db);
diff --git a/chromium/content/browser/dom_storage/session_storage_database_unittest.cc b/chromium/content/browser/dom_storage/session_storage_database_unittest.cc
index 2f86c3b9918..9722d72925c 100644
--- a/chromium/content/browser/dom_storage/session_storage_database_unittest.cc
+++ b/chromium/content/browser/dom_storage/session_storage_database_unittest.cc
@@ -219,6 +219,7 @@ void SessionStorageDatabaseTest::CheckDatabaseConsistency() const {
for (DataMap::const_iterator it = data.begin(); it != data.end(); ++it) {
std::string namespace_id;
+ std::string origin;
if (IsNamespaceKey(it->first, &namespace_id)) {
found_namespace_ids.insert(namespace_id);
++valid_keys;
diff --git a/chromium/content/browser/download/download_browsertest.cc b/chromium/content/browser/download/download_browsertest.cc
index 516ae18d861..79ad19c9839 100644
--- a/chromium/content/browser/download/download_browsertest.cc
+++ b/chromium/content/browser/download/download_browsertest.cc
@@ -22,14 +22,12 @@
#include "content/public/browser/power_save_blocker.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/webplugininfo.h"
-#include "content/public/test/browser_test_utils.h"
#include "content/public/test/download_test_observer.h"
#include "content/public/test/test_file_error_injector.h"
#include "content/public/test/test_utils.h"
#include "content/shell/shell.h"
#include "content/shell/shell_browser_context.h"
#include "content/shell/shell_download_manager_delegate.h"
-#include "content/shell/shell_network_delegate.h"
#include "content/test/content_browser_test.h"
#include "content/test/content_browser_test_utils.h"
#include "content/test/net/url_request_mock_http_job.h"
@@ -1600,42 +1598,4 @@ IN_PROC_BROWSER_TEST_F(DownloadContentTest, CancelResumingDownload) {
EXPECT_TRUE(EnsureNoPendingDownloads());
}
-// Check that the cookie policy is correctly updated when downloading a file
-// that redirects cross origin.
-IN_PROC_BROWSER_TEST_F(DownloadContentTest, CookiePolicy) {
- ASSERT_TRUE(test_server()->Start());
- net::HostPortPair host_port = test_server()->host_port_pair();
- DCHECK_EQ(host_port.host(), std::string("127.0.0.1"));
-
- // Block third-party cookies.
- ShellNetworkDelegate::SetAcceptAllCookies(false);
-
- // |url| redirects to a different origin |download| which tries to set a
- // cookie.
- std::string download(base::StringPrintf(
- "http://localhost:%d/set-cookie?A=B", host_port.port()));
- GURL url(test_server()->GetURL("server-redirect?" + download));
-
- // Download the file.
- SetupEnsureNoPendingDownloads();
- scoped_ptr<DownloadUrlParameters> dl_params(
- DownloadUrlParameters::FromWebContents(shell()->web_contents(), url));
- scoped_ptr<DownloadTestObserver> observer(CreateWaiter(shell(), 1));
- DownloadManagerForShell(shell())->DownloadUrl(dl_params.Pass());
- observer->WaitForFinished();
-
- // Get the important info from other threads and check it.
- EXPECT_TRUE(EnsureNoPendingDownloads());
-
- std::vector<DownloadItem*> downloads;
- DownloadManagerForShell(shell())->GetAllDownloads(&downloads);
- ASSERT_EQ(1u, downloads.size());
- ASSERT_EQ(DownloadItem::COMPLETE, downloads[0]->GetState());
-
- // Check that the cookies were correctly set.
- EXPECT_EQ("A=B",
- content::GetCookies(shell()->web_contents()->GetBrowserContext(),
- GURL(download)));
-}
-
} // namespace content
diff --git a/chromium/content/browser/download/download_file_unittest.cc b/chromium/content/browser/download/download_file_unittest.cc
index 49e418c85bc..867b76f6fef 100644
--- a/chromium/content/browser/download/download_file_unittest.cc
+++ b/chromium/content/browser/download/download_file_unittest.cc
@@ -76,7 +76,6 @@ class DownloadFileTest : public testing::Test {
DownloadFileTest() :
observer_(new StrictMock<MockDownloadDestinationObserver>),
observer_factory_(observer_.get()),
- input_stream_(NULL),
bytes_(-1),
bytes_per_sec_(-1),
hash_state_("xyzzy"),
diff --git a/chromium/content/browser/download/download_manager_impl_unittest.cc b/chromium/content/browser/download/download_manager_impl_unittest.cc
index 0865c04b2fa..eba28339b51 100644
--- a/chromium/content/browser/download/download_manager_impl_unittest.cc
+++ b/chromium/content/browser/download/download_manager_impl_unittest.cc
@@ -435,8 +435,7 @@ class DownloadManagerTest : public testing::Test {
static const size_t kTestDataLen;
DownloadManagerTest()
- : callback_called_(false),
- ui_thread_(BrowserThread::UI, &message_loop_),
+ : ui_thread_(BrowserThread::UI, &message_loop_),
file_thread_(BrowserThread::FILE, &message_loop_),
next_download_id_(0) {
}
diff --git a/chromium/content/browser/download/download_resource_handler.cc b/chromium/content/browser/download/download_resource_handler.cc
index ed4edff67fe..3b4844e6e68 100644
--- a/chromium/content/browser/download/download_resource_handler.cc
+++ b/chromium/content/browser/download/download_resource_handler.cc
@@ -103,9 +103,6 @@ bool DownloadResourceHandler::OnRequestRedirected(
const GURL& url,
ResourceResponse* response,
bool* defer) {
- // We treat a download as a main frame load, and thus update the policy URL
- // on redirects.
- request_->set_first_party_for_cookies(url);
return true;
}
diff --git a/chromium/content/browser/download/download_resource_handler.h b/chromium/content/browser/download/download_resource_handler.h
index 60fbc944387..d38068d5482 100644
--- a/chromium/content/browser/download/download_resource_handler.h
+++ b/chromium/content/browser/download/download_resource_handler.h
@@ -49,6 +49,7 @@ class CONTENT_EXPORT DownloadResourceHandler
uint64 position,
uint64 size) OVERRIDE;
+ // Not needed, as this event handler ought to be the final resource.
virtual bool OnRequestRedirected(int request_id,
const GURL& url,
ResourceResponse* response,
diff --git a/chromium/content/browser/download/file_metadata_unittest_linux.cc b/chromium/content/browser/download/file_metadata_unittest_linux.cc
index 4a3ebca5a2c..bc8666e076c 100644
--- a/chromium/content/browser/download/file_metadata_unittest_linux.cc
+++ b/chromium/content/browser/download/file_metadata_unittest_linux.cc
@@ -30,8 +30,7 @@ class FileMetadataLinuxTest : public testing::Test {
public:
FileMetadataLinuxTest()
: source_url_("http://www.source.com"),
- referrer_url_("http://www.referrer.com"),
- is_xattr_supported_(false) {}
+ referrer_url_("http://www.referrer.com") {}
const base::FilePath& test_file() const {
return test_file_;
diff --git a/chromium/content/browser/download/save_package.cc b/chromium/content/browser/download/save_package.cc
index 8a9781d82b0..a386a2be0c3 100644
--- a/chromium/content/browser/download/save_package.cc
+++ b/chromium/content/browser/download/save_package.cc
@@ -971,11 +971,11 @@ void SavePackage::DoSavingProcess() {
// sub-resource's link can be replaced with local file path, which
// sub-resource's link need to be replaced with absolute URL which
// point to its internet address because it got error when saving its data.
-
+ SaveItem* save_item = NULL;
// Start a new SaveItem job if we still have job in waiting queue.
if (waiting_item_queue_.size()) {
DCHECK(wait_state_ == NET_FILES);
- SaveItem* save_item = waiting_item_queue_.front();
+ save_item = waiting_item_queue_.front();
if (save_item->save_source() != SaveFileCreateInfo::SAVE_FILE_FROM_DOM) {
SaveNextFile(false);
} else if (!in_process_count()) {
diff --git a/chromium/content/browser/download/save_package_unittest.cc b/chromium/content/browser/download/save_package_unittest.cc
index c0aa3f8862b..9c8f29f46be 100644
--- a/chromium/content/browser/download/save_package_unittest.cc
+++ b/chromium/content/browser/download/save_package_unittest.cc
@@ -434,7 +434,7 @@ TEST_F(SavePackageTest, TestGetUrlToBeSavedViewSource) {
base::FilePath(kTestDir).Append(file_name));
NavigateAndCommit(view_source_url);
EXPECT_EQ(actual_url, GetUrlToBeSaved());
- EXPECT_EQ(view_source_url, contents()->GetLastCommittedURL());
+ EXPECT_EQ(view_source_url, contents()->GetURL());
}
} // namespace content
diff --git a/chromium/content/browser/fileapi/file_system_browsertest.cc b/chromium/content/browser/fileapi/file_system_browsertest.cc
index 6a79a409bd9..7c464a36e9f 100644
--- a/chromium/content/browser/fileapi/file_system_browsertest.cc
+++ b/chromium/content/browser/fileapi/file_system_browsertest.cc
@@ -36,8 +36,7 @@ class FileSystemBrowserTest : public ContentBrowserTest {
LOG(INFO) << "Navigating to URL and blocking.";
NavigateToURLBlockUntilNavigationsComplete(the_browser, test_url, 2);
LOG(INFO) << "Navigation done.";
- std::string result =
- the_browser->web_contents()->GetLastCommittedURL().ref();
+ std::string result = the_browser->web_contents()->GetURL().ref();
if (result != "pass") {
std::string js_result;
ASSERT_TRUE(ExecuteScriptAndExtractString(
diff --git a/chromium/content/browser/fileapi/fileapi_message_filter.cc b/chromium/content/browser/fileapi/fileapi_message_filter.cc
index d5e903b3e9a..5641564cff9 100644
--- a/chromium/content/browser/fileapi/fileapi_message_filter.cc
+++ b/chromium/content/browser/fileapi/fileapi_message_filter.cc
@@ -441,8 +441,7 @@ void FileAPIMessageFilter::OnOpenFile(
int request_id, const GURL& path, int file_flags) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
base::PlatformFileError error;
- const int open_permissions = base::PLATFORM_FILE_OPEN |
- (file_flags & fileapi::kOpenFilePermissions);
+ const int open_permissions = file_flags & fileapi::kOpenPepperFilePermissions;
FileSystemURL url(context_->CrackURL(path));
if (!HasPermissionsForFile(url, open_permissions, &error)) {
Send(new FileSystemMsg_DidFail(request_id, error));
@@ -463,7 +462,7 @@ void FileAPIMessageFilter::OnOpenFile(
}
operations_[request_id] = operation_runner()->OpenFile(
- url, file_flags, PeerHandle(),
+ url, open_permissions, PeerHandle(),
base::Bind(&FileAPIMessageFilter::DidOpenFile, this, request_id,
quota_policy));
}
diff --git a/chromium/content/browser/geolocation/core_location_data_provider_mac.h b/chromium/content/browser/geolocation/core_location_data_provider_mac.h
new file mode 100644
index 00000000000..29204aa0d8c
--- /dev/null
+++ b/chromium/content/browser/geolocation/core_location_data_provider_mac.h
@@ -0,0 +1,54 @@
+// 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.
+
+// This file declares a CoreLocation data provider class that allows the
+// CoreLocation framework to run on the UI thread, since the Geolocation API's
+// providers all live on the IO thread
+
+#ifndef CONTENT_BROWSER_GEOLOCATION_CORE_LOCATION_DATA_PROVIDER_H_
+#define CONTENT_BROWSER_GEOLOCATION_CORE_LOCATION_DATA_PROVIDER_H_
+
+#include "base/mac/scoped_nsobject.h"
+#include "base/memory/ref_counted.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/common/geoposition.h"
+
+#import <Foundation/Foundation.h>
+
+@class CoreLocationWrapperMac;
+
+namespace content {
+class CoreLocationProviderMac;
+
+// Data provider class that allows CoreLocation to run in Chrome's UI thread
+// while existing on any of Chrome's threads (in this case the IO thread)
+class CoreLocationDataProviderMac
+ : public base::RefCountedThreadSafe<CoreLocationDataProviderMac> {
+ public:
+ CoreLocationDataProviderMac();
+
+ bool StartUpdating(CoreLocationProviderMac* provider);
+ void StopUpdating();
+
+ void UpdatePosition(Geoposition* position);
+
+ private:
+ friend class base::RefCountedThreadSafe<CoreLocationDataProviderMac>;
+ ~CoreLocationDataProviderMac();
+
+ // These must execute in BrowserThread::UI
+ void StartUpdatingTask();
+ void StopUpdatingTask();
+ // This must execute in the origin thread (IO thread)
+ void PositionUpdated(Geoposition position);
+
+ // The wrapper class that supplies this class with position data
+ base::scoped_nsobject<CoreLocationWrapperMac> wrapper_;
+ // The LocationProvider class that should receive position data
+ CoreLocationProviderMac* provider_;
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_GEOLOCATION_CORE_LOCATION_DATA_PROVIDER_H_
diff --git a/chromium/content/browser/geolocation/core_location_data_provider_mac.mm b/chromium/content/browser/geolocation/core_location_data_provider_mac.mm
new file mode 100644
index 00000000000..8b1cf82c28b
--- /dev/null
+++ b/chromium/content/browser/geolocation/core_location_data_provider_mac.mm
@@ -0,0 +1,256 @@
+// 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.
+
+// This file contains the class definitions for the CoreLocation data provider
+// class and the accompanying Objective C wrapper class. This data provider
+// is used to allow the CoreLocation wrapper to run on the UI thread, since
+// CLLocationManager's start and stop updating methods must be called from a
+// thread with an active NSRunLoop. Currently only the UI thread appears to
+// fill that requirement.
+
+#include "content/browser/geolocation/core_location_data_provider_mac.h"
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "base/time/time.h"
+#include "content/browser/geolocation/core_location_provider_mac.h"
+#include "content/browser/geolocation/geolocation_provider_impl.h"
+
+using content::CoreLocationDataProviderMac;
+using content::Geoposition;
+
+// A few required declarations since the CoreLocation headers are not available
+// with the Mac OS X 10.5 SDK.
+// TODO(jorgevillatoro): Remove these declarations when we build against 10.6
+
+// This idea was borrowed from wifi_data_provider_corewlan_mac.mm
+typedef double CLLocationDegrees;
+typedef double CLLocationAccuracy;
+typedef double CLLocationSpeed;
+typedef double CLLocationDirection;
+typedef double CLLocationDistance;
+typedef struct {
+ CLLocationDegrees latitude;
+ CLLocationDegrees longitude;
+} CLLocationCoordinate2D;
+
+enum {
+ kCLErrorLocationUnknown = 0,
+ kCLErrorDenied
+};
+
+@interface CLLocationManager : NSObject
++ (BOOL)locationServicesEnabled;
+@property(assign) id delegate;
+- (void)startUpdatingLocation;
+- (void)stopUpdatingLocation;
+@end
+
+@interface CLLocation : NSObject<NSCopying, NSCoding>
+@property(readonly) CLLocationCoordinate2D coordinate;
+@property(readonly) CLLocationDistance altitude;
+@property(readonly) CLLocationAccuracy horizontalAccuracy;
+@property(readonly) CLLocationAccuracy verticalAccuracy;
+@property(readonly) CLLocationDirection course;
+@property(readonly) CLLocationSpeed speed;
+@end
+
+@protocol CLLocationManagerDelegate
+- (void)locationManager:(CLLocationManager*)manager
+ didUpdateToLocation:(CLLocation*)newLocation
+ fromLocation:(CLLocation*)oldLocation;
+- (void)locationManager:(CLLocationManager*)manager
+ didFailWithError:(NSError*)error;
+@end
+
+// This wrapper class receives CLLocation objects from CoreLocation, converts
+// them to Geoposition objects, and passes them on to the data provider class
+// Note: This class has some specific threading requirements, inherited from
+// CLLocationManager. The location manaager's start and stop updating
+// methods must be called from a thread that has an active run loop (which
+// seems to only be the UI thread)
+@interface CoreLocationWrapperMac : NSObject<CLLocationManagerDelegate>
+{
+ @private
+ NSBundle* bundle_;
+ Class locationManagerClass_;
+ id locationManager_;
+ CoreLocationDataProviderMac* dataProvider_;
+}
+
+- (id)initWithDataProvider:(CoreLocationDataProviderMac*)dataProvider;
+- (void)dealloc;
+
+// Can be called from any thread since it does not require an NSRunLoop. However
+// it is not threadsafe to receive concurrent calls until after a first
+// successful call (to avoid |bundle_| being double initialized)
+- (BOOL)locationDataAvailable;
+
+// These should always be called from BrowserThread::UI
+- (void)startLocation;
+- (void)stopLocation;
+
+// These should only be called by CLLocationManager
+- (void)locationManager:(CLLocationManager*)manager
+ didUpdateToLocation:(CLLocation*)newLocation
+ fromLocation:(CLLocation*)oldLocation;
+- (void)locationManager:(CLLocationManager*)manager
+ didFailWithError:(NSError*)error;
+- (BOOL)loadCoreLocationBundle;
+
+@end
+
+@implementation CoreLocationWrapperMac
+
+- (id)initWithDataProvider:(CoreLocationDataProviderMac*)dataProvider {
+ DCHECK(dataProvider);
+ dataProvider_ = dataProvider;
+ self = [super init];
+ return self;
+}
+
+- (void)dealloc {
+ [locationManager_ setDelegate:nil];
+ [locationManager_ release];
+ [locationManagerClass_ release];
+ [bundle_ release];
+ [super dealloc];
+}
+
+// Load the bundle and check to see if location services are enabled
+// but don't do anything else
+- (BOOL)locationDataAvailable {
+ return ([self loadCoreLocationBundle] &&
+ [locationManagerClass_ locationServicesEnabled]);
+}
+
+- (void)startLocation {
+ if ([self locationDataAvailable]) {
+ if (!locationManager_) {
+ locationManager_ = [[locationManagerClass_ alloc] init];
+ [locationManager_ setDelegate:self];
+ }
+ [locationManager_ startUpdatingLocation];
+ }
+}
+
+- (void)stopLocation {
+ [locationManager_ stopUpdatingLocation];
+}
+
+- (void)locationManager:(CLLocationManager*)manager
+ didUpdateToLocation:(CLLocation*)newLocation
+ fromLocation:(CLLocation*)oldLocation {
+ Geoposition position;
+ position.latitude = [newLocation coordinate].latitude;
+ position.longitude = [newLocation coordinate].longitude;
+ position.altitude = [newLocation altitude];
+ position.accuracy = [newLocation horizontalAccuracy];
+ position.altitude_accuracy = [newLocation verticalAccuracy];
+ position.speed = [newLocation speed];
+ position.heading = [newLocation course];
+ position.timestamp = base::Time::Now();
+ position.error_code = Geoposition::ERROR_CODE_NONE;
+ dataProvider_->UpdatePosition(&position);
+}
+
+- (void)locationManager:(CLLocationManager*)manager
+ didFailWithError:(NSError*)error {
+ Geoposition position;
+ switch ([error code]) {
+ case kCLErrorLocationUnknown:
+ position.error_code = Geoposition::ERROR_CODE_POSITION_UNAVAILABLE;
+ break;
+ case kCLErrorDenied:
+ position.error_code = Geoposition::ERROR_CODE_PERMISSION_DENIED;
+ break;
+ default:
+ NOTREACHED() << "Unknown CoreLocation error: " << [error code];
+ return;
+ }
+ dataProvider_->UpdatePosition(&position);
+}
+
+- (BOOL)loadCoreLocationBundle {
+ if (!bundle_) {
+ bundle_ = [[NSBundle alloc]
+ initWithPath:@"/System/Library/Frameworks/CoreLocation.framework"];
+ if (!bundle_) {
+ DLOG(WARNING) << "Couldn't load CoreLocation Framework";
+ return NO;
+ }
+
+ locationManagerClass_ = [bundle_ classNamed:@"CLLocationManager"];
+ }
+
+ return YES;
+}
+
+@end
+
+namespace content {
+
+CoreLocationDataProviderMac::CoreLocationDataProviderMac() {
+ if (base::MessageLoop::current() !=
+ GeolocationProviderImpl::GetInstance()->message_loop()) {
+ NOTREACHED() << "CoreLocation data provider must be created on "
+ "the Geolocation thread.";
+ }
+ provider_ = NULL;
+ wrapper_.reset([[CoreLocationWrapperMac alloc] initWithDataProvider:this]);
+}
+
+CoreLocationDataProviderMac::~CoreLocationDataProviderMac() {
+}
+
+// Returns true if the CoreLocation wrapper can load the framework and
+// location services are enabled. The pointer argument will only be accessed
+// in the origin thread.
+bool CoreLocationDataProviderMac::
+ StartUpdating(CoreLocationProviderMac* provider) {
+ DCHECK(provider);
+ DCHECK(!provider_) << "StartUpdating called twice";
+ if (![wrapper_ locationDataAvailable]) return false;
+ provider_ = provider;
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&CoreLocationDataProviderMac::StartUpdatingTask, this));
+ return true;
+}
+
+// Clears provider_ so that any leftover messages from CoreLocation get ignored
+void CoreLocationDataProviderMac::StopUpdating() {
+ provider_ = NULL;
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&CoreLocationDataProviderMac::StopUpdatingTask, this));
+}
+
+void CoreLocationDataProviderMac::UpdatePosition(Geoposition *position) {
+ GeolocationProviderImpl::GetInstance()->message_loop()->PostTask(
+ FROM_HERE,
+ base::Bind(&CoreLocationDataProviderMac::PositionUpdated, this,
+ *position));
+}
+
+// Runs in BrowserThread::UI
+void CoreLocationDataProviderMac::StartUpdatingTask() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ [wrapper_ startLocation];
+}
+
+// Runs in BrowserThread::UI
+void CoreLocationDataProviderMac::StopUpdatingTask() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ [wrapper_ stopLocation];
+}
+
+void CoreLocationDataProviderMac::PositionUpdated(Geoposition position) {
+ DCHECK(base::MessageLoop::current() ==
+ GeolocationProviderImpl::GetInstance()->message_loop());
+ if (provider_)
+ provider_->SetPosition(&position);
+}
+
+} // namespace content
diff --git a/chromium/content/browser/geolocation/core_location_provider_mac.h b/chromium/content/browser/geolocation/core_location_provider_mac.h
new file mode 100644
index 00000000000..b4186d4ffb8
--- /dev/null
+++ b/chromium/content/browser/geolocation/core_location_provider_mac.h
@@ -0,0 +1,40 @@
+// 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.
+
+// This file declares a CoreLocation provider that runs on Mac OS X (10.6).
+// Public for testing only - for normal usage this header should not be
+// required, as location_provider.h declares the needed factory function.
+
+#ifndef CONTENT_BROWSER_GEOLOCATION_CORE_LOCATION_PROVIDER_MAC_H_
+#define CONTENT_BROWSER_GEOLOCATION_CORE_LOCATION_PROVIDER_MAC_H_
+
+#include "content/browser/geolocation/location_provider_base.h"
+#include "content/public/common/geoposition.h"
+
+namespace content {
+class CoreLocationDataProviderMac;
+
+class CoreLocationProviderMac : public LocationProviderBase {
+ public:
+ explicit CoreLocationProviderMac();
+ virtual ~CoreLocationProviderMac();
+
+ // LocationProvider
+ virtual bool StartProvider(bool high_accuracy) OVERRIDE;
+ virtual void StopProvider() OVERRIDE;
+ virtual void GetPosition(Geoposition* position) OVERRIDE;
+ virtual void OnPermissionGranted() OVERRIDE;
+
+ // Receives new positions and calls UpdateListeners
+ void SetPosition(Geoposition* position);
+
+ private:
+ bool is_updating_;
+ CoreLocationDataProviderMac* data_provider_;
+ Geoposition position_;
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_GEOLOCATION_CORE_LOCATION_PROVIDER_MAC_H_
diff --git a/chromium/content/browser/geolocation/core_location_provider_mac.mm b/chromium/content/browser/geolocation/core_location_provider_mac.mm
new file mode 100644
index 00000000000..1c3aca1195c
--- /dev/null
+++ b/chromium/content/browser/geolocation/core_location_provider_mac.mm
@@ -0,0 +1,68 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/geolocation/core_location_provider_mac.h"
+
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "content/browser/geolocation/core_location_data_provider_mac.h"
+#include "content/public/common/content_switches.h"
+
+namespace content {
+
+CoreLocationProviderMac::CoreLocationProviderMac()
+ : is_updating_(false) {
+ data_provider_ = new CoreLocationDataProviderMac();
+ data_provider_->AddRef();
+}
+
+CoreLocationProviderMac::~CoreLocationProviderMac() {
+ data_provider_->StopUpdating();
+ data_provider_->Release();
+}
+
+bool CoreLocationProviderMac::StartProvider(bool high_accuracy) {
+ // StartProvider maybe called multiple times. For example, to update the high
+ // accuracy hint.
+ // TODO(jknotten): Support high_accuracy hint in underlying data provider.
+ if (is_updating_)
+ return true;
+
+ is_updating_ = data_provider_->StartUpdating(this);
+ return true;
+}
+
+void CoreLocationProviderMac::StopProvider() {
+ data_provider_->StopUpdating();
+ is_updating_ = false;
+}
+
+void CoreLocationProviderMac::GetPosition(Geoposition* position) {
+ DCHECK(position);
+ *position = position_;
+ DCHECK(position->Validate() ||
+ position->error_code != Geoposition::ERROR_CODE_NONE);
+}
+
+void CoreLocationProviderMac::OnPermissionGranted() {
+}
+
+void CoreLocationProviderMac::SetPosition(Geoposition* position) {
+ DCHECK(position);
+ position_ = *position;
+ DCHECK(position->Validate() ||
+ position->error_code != Geoposition::ERROR_CODE_NONE);
+
+ NotifyCallback(position_);
+}
+
+LocationProvider* NewSystemLocationProvider() {
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kExperimentalLocationFeatures)) {
+ return new CoreLocationProviderMac;
+ }
+ return NULL;
+}
+
+} // namespace content
diff --git a/chromium/content/browser/geolocation/geolocation_provider_impl.h b/chromium/content/browser/geolocation/geolocation_provider_impl.h
index 68e83a87968..d4b5afb1074 100644
--- a/chromium/content/browser/geolocation/geolocation_provider_impl.h
+++ b/chromium/content/browser/geolocation/geolocation_provider_impl.h
@@ -25,8 +25,11 @@ class GeolocationProviderTest;
// This is the main API to the geolocation subsystem. The application will hold
// a single instance of this class and can register multiple clients to be
// notified of location changes:
-// * Callbacks are registered by AddLocationUpdateCallback() and will keep
-// receiving updates until unregistered by RemoveLocationUpdateCallback().
+// * Observers are registered by AddLocationUpdateCallback() and will keep
+// receiving updates
+// until unregistered by RemoveLocationUpdateCallback().
+// * Callbacks are registered by RequestCallback() and will be called exactly
+// once when the next update becomes available.
// The application must instantiate the GeolocationProvider on the IO thread and
// must communicate with it on the same thread.
// The underlying location arbitrator will only be enabled whilst there is at
diff --git a/chromium/content/browser/geolocation/location_arbitrator_impl.cc b/chromium/content/browser/geolocation/location_arbitrator_impl.cc
index 4befee2f4f8..49c1c10b85e 100644
--- a/chromium/content/browser/geolocation/location_arbitrator_impl.cc
+++ b/chromium/content/browser/geolocation/location_arbitrator_impl.cc
@@ -160,7 +160,7 @@ LocationProvider* GeolocationArbitratorImpl::NewNetworkLocationProvider(
}
LocationProvider* GeolocationArbitratorImpl::NewSystemLocationProvider() {
-#if defined(OS_WIN) || defined(OS_MACOSX)
+#if defined(OS_WIN)
return NULL;
#else
return content::NewSystemLocationProvider();
diff --git a/chromium/content/browser/gpu/gpu_data_manager_impl_private.cc b/chromium/content/browser/gpu/gpu_data_manager_impl_private.cc
index 8491508667d..654048847ec 100644
--- a/chromium/content/browser/gpu/gpu_data_manager_impl_private.cc
+++ b/chromium/content/browser/gpu/gpu_data_manager_impl_private.cc
@@ -42,6 +42,7 @@
#include "base/win/windows_version.h"
#endif // OS_WIN
#if defined(OS_ANDROID)
+#include "base/android/build_info.h"
#include "ui/gfx/android/device_display_info.h"
#endif // OS_ANDROID
@@ -278,12 +279,15 @@ void ApplyAndroidWorkarounds(const gpu::GPUInfo& gpu_info,
bool is_nexus10 =
gpu_info.machine_model.find("Nexus 10") != std::string::npos;
+ int sdk_int = base::android::BuildInfo::GetInstance()->sdk_int();
+
// IMG: avoid context switching perf problems, crashes with share groups
// Mali-T604: http://crbug.com/154715
// QualComm, NVIDIA: Crashes with share groups
- if (is_vivante || is_img || is_mali_t604 || is_nvidia || is_qualcomm ||
- is_broadcom)
+ if (is_vivante || is_img || is_mali_t604 || (is_nvidia && (sdk_int < 18)) ||
+ is_qualcomm || is_broadcom) {
command_line->AppendSwitch(switches::kEnableVirtualGLContexts);
+ }
gfx::DeviceDisplayInfo info;
int default_tile_size = 256;
@@ -736,11 +740,6 @@ void GpuDataManagerImplPrivate::AppendGpuCommandLine(
IntSetToString(gpu_driver_bugs_));
}
- if (IsFeatureBlacklisted(gpu::GPU_FEATURE_TYPE_ACCELERATED_VIDEO_DECODE) &&
- !command_line->HasSwitch(switches::kDisableAcceleratedVideoDecode)) {
- command_line->AppendSwitch(switches::kDisableAcceleratedVideoDecode);
- }
-
#if defined(OS_WIN)
// DisplayLink 7.1 and earlier can cause the GPU process to crash on startup.
// http://crbug.com/177611
diff --git a/chromium/content/browser/indexed_db/indexed_db_browsertest.cc b/chromium/content/browser/indexed_db/indexed_db_browsertest.cc
index ac541e761d3..ab010cbd92a 100644
--- a/chromium/content/browser/indexed_db/indexed_db_browsertest.cc
+++ b/chromium/content/browser/indexed_db/indexed_db_browsertest.cc
@@ -46,8 +46,7 @@ class IndexedDBBrowserTest : public ContentBrowserTest {
LOG(INFO) << "Navigating to URL and blocking.";
NavigateToURLBlockUntilNavigationsComplete(the_browser, test_url, 2);
LOG(INFO) << "Navigation done.";
- std::string result =
- the_browser->web_contents()->GetLastCommittedURL().ref();
+ std::string result = the_browser->web_contents()->GetURL().ref();
if (result != "pass") {
std::string js_result;
ASSERT_TRUE(ExecuteScriptAndExtractString(
diff --git a/chromium/content/browser/indexed_db/indexed_db_internals_ui.cc b/chromium/content/browser/indexed_db/indexed_db_internals_ui.cc
index 230b7887552..a5c90c4117f 100644
--- a/chromium/content/browser/indexed_db/indexed_db_internals_ui.cc
+++ b/chromium/content/browser/indexed_db/indexed_db_internals_ui.cc
@@ -257,6 +257,9 @@ void IndexedDBInternalsUI::ForceCloseOriginOnIndexedDBThread(
void IndexedDBInternalsUI::OnForcedClose(const base::FilePath& partition_path,
const GURL& origin_url,
size_t connection_count) {
+
+ scoped_refptr<IndexedDBContextImpl> context;
+
web_ui()->CallJavascriptFunction(
"indexeddb.onForcedClose",
base::StringValue(partition_path.value()),
@@ -278,7 +281,7 @@ void IndexedDBInternalsUI::OnDownloadDataReady(
DownloadUrlParameters::FromWebContents(web_ui()->GetWebContents(), url));
DownloadManager* dlm = BrowserContext::GetDownloadManager(browser_context);
- const GURL referrer(web_ui()->GetWebContents()->GetLastCommittedURL());
+ const GURL referrer(web_ui()->GetWebContents()->GetURL());
dl_params->set_referrer(
content::Referrer(referrer, WebKit::WebReferrerPolicyDefault));
diff --git a/chromium/content/browser/indexed_db/indexed_db_leveldb_coding.cc b/chromium/content/browser/indexed_db/indexed_db_leveldb_coding.cc
index 61d32db9047..0086b82390a 100644
--- a/chromium/content/browser/indexed_db/indexed_db_leveldb_coding.cc
+++ b/chromium/content/browser/indexed_db/indexed_db_leveldb_coding.cc
@@ -744,10 +744,7 @@ int CompareEncodedIDBKeys(const std::string& key_a,
namespace {
template <typename KeyType>
-int Compare(const StringPiece& a,
- const StringPiece& b,
- bool only_compare_index_keys,
- bool* ok) {
+int Compare(const StringPiece& a, const StringPiece& b, bool, bool* ok) {
KeyType key_a;
KeyType key_b;
@@ -769,7 +766,7 @@ int Compare(const StringPiece& a,
template <>
int Compare<ExistsEntryKey>(const StringPiece& a,
const StringPiece& b,
- bool only_compare_index_keys,
+ bool,
bool* ok) {
KeyPrefix prefix_a;
KeyPrefix prefix_b;
@@ -796,7 +793,7 @@ int Compare<ExistsEntryKey>(const StringPiece& a,
template <>
int Compare<ObjectStoreDataKey>(const StringPiece& a,
const StringPiece& b,
- bool only_compare_index_keys,
+ bool,
bool* ok) {
KeyPrefix prefix_a;
KeyPrefix prefix_b;
@@ -823,7 +820,7 @@ int Compare<ObjectStoreDataKey>(const StringPiece& a,
template <>
int Compare<IndexDataKey>(const StringPiece& a,
const StringPiece& b,
- bool only_compare_index_keys,
+ bool ignore_duplicates,
bool* ok) {
KeyPrefix prefix_a;
KeyPrefix prefix_b;
@@ -848,7 +845,7 @@ int Compare<IndexDataKey>(const StringPiece& a,
int result = CompareEncodedIDBKeys(&slice_a, &slice_b, ok);
if (!*ok || result)
return result;
- if (only_compare_index_keys)
+ if (ignore_duplicates)
return 0;
// sequence number [optional]
@@ -880,7 +877,7 @@ int Compare<IndexDataKey>(const StringPiece& a,
int Compare(const StringPiece& a,
const StringPiece& b,
- bool only_compare_index_keys,
+ bool index_keys,
bool* ok) {
StringPiece slice_a(a);
StringPiece slice_b(b);
@@ -921,12 +918,11 @@ int Compare(const StringPiece& a,
if (type_byte_a < kMaxSimpleGlobalMetaDataTypeByte)
return 0;
+ const bool ignore_duplicates = false;
if (type_byte_a == kDatabaseFreeListTypeByte)
- return Compare<DatabaseFreeListKey>(
- a, b, only_compare_index_keys, ok);
+ return Compare<DatabaseFreeListKey>(a, b, ignore_duplicates, ok);
if (type_byte_a == kDatabaseNameTypeByte)
- return Compare<DatabaseNameKey>(
- a, b, /*only_compare_index_keys*/ false, ok);
+ return Compare<DatabaseNameKey>(a, b, ignore_duplicates, ok);
break;
}
@@ -951,24 +947,19 @@ int Compare(const StringPiece& a,
if (type_byte_a < DatabaseMetaDataKey::MAX_SIMPLE_METADATA_TYPE)
return 0;
+ const bool ignore_duplicates = false;
if (type_byte_a == kObjectStoreMetaDataTypeByte)
- return Compare<ObjectStoreMetaDataKey>(
- a, b, only_compare_index_keys, ok);
+ return Compare<ObjectStoreMetaDataKey>(a, b, ignore_duplicates, ok);
if (type_byte_a == kIndexMetaDataTypeByte)
- return Compare<IndexMetaDataKey>(
- a, b, /*only_compare_index_keys*/ false, ok);
+ return Compare<IndexMetaDataKey>(a, b, ignore_duplicates, ok);
if (type_byte_a == kObjectStoreFreeListTypeByte)
- return Compare<ObjectStoreFreeListKey>(
- a, b, only_compare_index_keys, ok);
+ return Compare<ObjectStoreFreeListKey>(a, b, ignore_duplicates, ok);
if (type_byte_a == kIndexFreeListTypeByte)
- return Compare<IndexFreeListKey>(
- a, b, /*only_compare_index_keys*/ false, ok);
+ return Compare<IndexFreeListKey>(a, b, ignore_duplicates, ok);
if (type_byte_a == kObjectStoreNamesTypeByte)
- return Compare<ObjectStoreNamesKey>(
- a, b, only_compare_index_keys, ok);
+ return Compare<ObjectStoreNamesKey>(a, b, ignore_duplicates, ok);
if (type_byte_a == kIndexNamesKeyTypeByte)
- return Compare<IndexNamesKey>(
- a, b, /*only_compare_index_keys*/ false, ok);
+ return Compare<IndexNamesKey>(a, b, ignore_duplicates, ok);
break;
}
@@ -978,8 +969,8 @@ int Compare(const StringPiece& a,
// TODO(jsbell): This case of non-existing user keys should not have to be
// handled this way.
- return Compare<ObjectStoreDataKey>(
- a, b, /*only_compare_index_keys*/ false, ok);
+ const bool ignore_duplicates = false;
+ return Compare<ObjectStoreDataKey>(a, b, ignore_duplicates, ok);
}
case KeyPrefix::EXISTS_ENTRY: {
@@ -988,8 +979,8 @@ int Compare(const StringPiece& a,
// TODO(jsbell): This case of non-existing user keys should not have to be
// handled this way.
- return Compare<ExistsEntryKey>(
- a, b, /*only_compare_index_keys*/ false, ok);
+ const bool ignore_duplicates = false;
+ return Compare<ExistsEntryKey>(a, b, ignore_duplicates, ok);
}
case KeyPrefix::INDEX_DATA: {
@@ -998,7 +989,8 @@ int Compare(const StringPiece& a,
// TODO(jsbell): This case of non-existing user keys should not have to be
// handled this way.
- return Compare<IndexDataKey>(a, b, only_compare_index_keys, ok);
+ bool ignore_duplicates = index_keys;
+ return Compare<IndexDataKey>(a, b, ignore_duplicates, ok);
}
case KeyPrefix::INVALID_TYPE:
@@ -1012,11 +1004,9 @@ int Compare(const StringPiece& a,
} // namespace
-int Compare(const StringPiece& a,
- const StringPiece& b,
- bool only_compare_index_keys) {
+int Compare(const StringPiece& a, const StringPiece& b, bool index_keys) {
bool ok;
- int result = Compare(a, b, only_compare_index_keys, &ok);
+ int result = Compare(a, b, index_keys, &ok);
DCHECK(ok);
if (!ok)
return 0;
@@ -1792,7 +1782,7 @@ std::string IndexDataKey::EncodeMaxKey(int64 database_id,
}
int IndexDataKey::Compare(const IndexDataKey& other,
- bool only_compare_index_keys,
+ bool ignore_duplicates,
bool* ok) {
DCHECK_GE(database_id_, 0);
DCHECK_GE(object_store_id_, 0);
@@ -1801,7 +1791,7 @@ int IndexDataKey::Compare(const IndexDataKey& other,
CompareEncodedIDBKeys(encoded_user_key_, other.encoded_user_key_, ok);
if (!*ok || result)
return result;
- if (only_compare_index_keys)
+ if (ignore_duplicates)
return 0;
result = CompareEncodedIDBKeys(
encoded_primary_key_, other.encoded_primary_key_, ok);
diff --git a/chromium/content/browser/indexed_db/indexed_db_leveldb_coding.h b/chromium/content/browser/indexed_db/indexed_db_leveldb_coding.h
index 974c27a4fa2..ecd8b9b2d99 100644
--- a/chromium/content/browser/indexed_db/indexed_db_leveldb_coding.h
+++ b/chromium/content/browser/indexed_db/indexed_db_leveldb_coding.h
@@ -402,9 +402,7 @@ class IndexDataKey {
CONTENT_EXPORT static std::string EncodeMaxKey(int64 database_id,
int64 object_store_id,
int64 index_id);
- int Compare(const IndexDataKey& other,
- bool only_compare_index_keys,
- bool* ok);
+ int Compare(const IndexDataKey& other, bool ignore_duplicates, bool* ok);
int64 DatabaseId() const;
int64 ObjectStoreId() const;
int64 IndexId() const;
diff --git a/chromium/content/browser/media/webrtc_browsertest.cc b/chromium/content/browser/media/webrtc_browsertest.cc
index 7cf48b0ad77..58b3d3fdcfc 100644
--- a/chromium/content/browser/media/webrtc_browsertest.cc
+++ b/chromium/content/browser/media/webrtc_browsertest.cc
@@ -46,10 +46,6 @@ class WebrtcBrowserTest: public ContentBrowserTest {
virtual ~WebrtcBrowserTest() {}
virtual void SetUpOnMainThread() OVERRIDE {
- ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
- }
-
- virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
// We need fake devices in this test since we want to run on naked VMs. We
// assume these switches are set by default in content_browsertests.
ASSERT_TRUE(CommandLine::ForCurrentProcess()->HasSwitch(
@@ -57,9 +53,7 @@ class WebrtcBrowserTest: public ContentBrowserTest {
ASSERT_TRUE(CommandLine::ForCurrentProcess()->HasSwitch(
switches::kUseFakeUIForMediaStream));
- // The video playback will not work without a GPU, so force its use here.
- // This may not be available on all VMs though.
- command_line->AppendSwitch(switches::kUseGpuInTests);
+ ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
}
protected:
diff --git a/chromium/content/browser/media/webrtc_internals_browsertest.cc b/chromium/content/browser/media/webrtc_internals_browsertest.cc
index 71bbe53ed9f..19c25741822 100644
--- a/chromium/content/browser/media/webrtc_internals_browsertest.cc
+++ b/chromium/content/browser/media/webrtc_internals_browsertest.cc
@@ -575,11 +575,16 @@ IN_PROC_BROWSER_TEST_F(WebRTCInternalsBrowserTest, ConvertedGraphs) {
}
}
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
// Timing out on ARM linux bot: http://crbug.com/238490
-// Disabling due to failure on Linux, Mac, Win: http://crbug.com/272413
+#define MAYBE_WithRealPeerConnectionCall DISABLED_WithRealPeerConnectionCall
+#else
+#define MAYBE_WithRealPeerConnectionCall WithRealPeerConnectionCall
+#endif
+
// Sanity check of the page content under a real PeerConnection call.
IN_PROC_BROWSER_TEST_F(WebRTCInternalsBrowserTest,
- DISABLED_WithRealPeerConnectionCall) {
+ MAYBE_WithRealPeerConnectionCall) {
// Start a peerconnection call in the first window.
ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
GURL url(embedded_test_server()->GetURL("/media/peerconnection-call.html"));
diff --git a/chromium/content/browser/mime_registry_message_filter.cc b/chromium/content/browser/mime_registry_message_filter.cc
index f23cc004e4b..49a050084c9 100644
--- a/chromium/content/browser/mime_registry_message_filter.cc
+++ b/chromium/content/browser/mime_registry_message_filter.cc
@@ -30,6 +30,8 @@ bool MimeRegistryMessageFilter::OnMessageReceived(const IPC::Message& message,
OnGetMimeTypeFromExtension)
IPC_MESSAGE_HANDLER(MimeRegistryMsg_GetMimeTypeFromFile,
OnGetMimeTypeFromFile)
+ IPC_MESSAGE_HANDLER(MimeRegistryMsg_GetPreferredExtensionForMimeType,
+ OnGetPreferredExtensionForMimeType)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
@@ -45,4 +47,9 @@ void MimeRegistryMessageFilter::OnGetMimeTypeFromFile(
net::GetMimeTypeFromFile(file_path, mime_type);
}
+void MimeRegistryMessageFilter::OnGetPreferredExtensionForMimeType(
+ const std::string& mime_type, base::FilePath::StringType* extension) {
+ net::GetPreferredExtensionForMimeType(mime_type, extension);
+}
+
} // namespace content
diff --git a/chromium/content/browser/mime_registry_message_filter.h b/chromium/content/browser/mime_registry_message_filter.h
index e86fe190b1d..4a719a5f2f1 100644
--- a/chromium/content/browser/mime_registry_message_filter.h
+++ b/chromium/content/browser/mime_registry_message_filter.h
@@ -27,6 +27,9 @@ class MimeRegistryMessageFilter : public BrowserMessageFilter {
std::string* mime_type);
void OnGetMimeTypeFromFile(const base::FilePath& file_path,
std::string* mime_type);
+ void OnGetPreferredExtensionForMimeType(
+ const std::string& mime_type,
+ base::FilePath::StringType* extension);
};
} // namespace content
diff --git a/chromium/content/browser/quota_dispatcher_host.cc b/chromium/content/browser/quota_dispatcher_host.cc
index 89ee710fad1..f83ee3f7be9 100644
--- a/chromium/content/browser/quota_dispatcher_host.cc
+++ b/chromium/content/browser/quota_dispatcher_host.cc
@@ -24,9 +24,10 @@ namespace content {
// sends back the response to the renderer/worker.
class QuotaDispatcherHost::RequestDispatcher {
public:
- RequestDispatcher(QuotaDispatcherHost* dispatcher_host,
+ RequestDispatcher(base::WeakPtr<QuotaDispatcherHost> dispatcher_host,
int request_id)
: dispatcher_host_(dispatcher_host),
+ render_process_id_(dispatcher_host->process_id_),
request_id_(request_id) {
dispatcher_host_->outstanding_requests_.AddWithID(this, request_id_);
}
@@ -35,21 +36,26 @@ class QuotaDispatcherHost::RequestDispatcher {
protected:
// Subclass must call this when it's done with the request.
void Completed() {
- dispatcher_host_->outstanding_requests_.Remove(request_id_);
+ if (dispatcher_host_)
+ dispatcher_host_->outstanding_requests_.Remove(request_id_);
}
- QuotaDispatcherHost* dispatcher_host() const { return dispatcher_host_; }
+ QuotaDispatcherHost* dispatcher_host() const {
+ return dispatcher_host_.get();
+ }
quota::QuotaManager* quota_manager() const {
- return dispatcher_host_->quota_manager_;
+ return dispatcher_host_ ? dispatcher_host_->quota_manager_ : NULL;
}
QuotaPermissionContext* permission_context() const {
- return dispatcher_host_->permission_context_.get();
+ return dispatcher_host_ ?
+ dispatcher_host_->permission_context_.get() : NULL;
}
- int render_process_id() const { return dispatcher_host_->process_id_; }
+ int render_process_id() const { return render_process_id_; }
int request_id() const { return request_id_; }
private:
- QuotaDispatcherHost* dispatcher_host_;
+ base::WeakPtr<QuotaDispatcherHost> dispatcher_host_;
+ int render_process_id_;
int request_id_;
};
@@ -57,7 +63,7 @@ class QuotaDispatcherHost::QueryUsageAndQuotaDispatcher
: public RequestDispatcher {
public:
QueryUsageAndQuotaDispatcher(
- QuotaDispatcherHost* dispatcher_host,
+ base::WeakPtr<QuotaDispatcherHost> dispatcher_host,
int request_id)
: RequestDispatcher(dispatcher_host, request_id),
weak_factory_(this) {}
@@ -73,7 +79,8 @@ class QuotaDispatcherHost::QueryUsageAndQuotaDispatcher
private:
void DidQueryStorageUsageAndQuota(
QuotaStatusCode status, int64 usage, int64 quota) {
- DCHECK(dispatcher_host());
+ if (!dispatcher_host())
+ return;
if (status != quota::kQuotaStatusOk) {
dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status));
} else {
@@ -91,7 +98,7 @@ class QuotaDispatcherHost::RequestQuotaDispatcher
public:
typedef RequestQuotaDispatcher self_type;
- RequestQuotaDispatcher(QuotaDispatcherHost* dispatcher_host,
+ RequestQuotaDispatcher(base::WeakPtr<QuotaDispatcherHost> dispatcher_host,
int request_id,
const GURL& origin,
StorageType type,
@@ -108,6 +115,7 @@ class QuotaDispatcherHost::RequestQuotaDispatcher
virtual ~RequestQuotaDispatcher() {}
void Start() {
+ DCHECK(dispatcher_host());
DCHECK(type_ == quota::kStorageTypeTemporary ||
type_ == quota::kStorageTypePersistent ||
type_ == quota::kStorageTypeSyncable);
@@ -129,6 +137,8 @@ class QuotaDispatcherHost::RequestQuotaDispatcher
StorageType type,
QuotaStatusCode status,
int64 quota) {
+ if (!dispatcher_host())
+ return;
DCHECK_EQ(type_, type);
DCHECK_EQ(host_, host);
if (status != quota::kQuotaStatusOk) {
@@ -162,6 +172,8 @@ class QuotaDispatcherHost::RequestQuotaDispatcher
void DidGetPermissionResponse(
QuotaPermissionContext::QuotaPermissionResponse response) {
+ if (!dispatcher_host())
+ return;
if (response != QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_ALLOW) {
// User didn't allow the new quota. Just returning the current quota.
DidFinish(quota::kQuotaStatusOk, current_quota_);
@@ -178,6 +190,8 @@ class QuotaDispatcherHost::RequestQuotaDispatcher
}
void DidFinish(QuotaStatusCode status, int64 granted_quota) {
+ if (!dispatcher_host())
+ return;
DCHECK(dispatcher_host());
if (status != quota::kQuotaStatusOk) {
dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status));
@@ -203,7 +217,8 @@ QuotaDispatcherHost::QuotaDispatcherHost(
QuotaPermissionContext* permission_context)
: process_id_(process_id),
quota_manager_(quota_manager),
- permission_context_(permission_context) {
+ permission_context_(permission_context),
+ weak_factory_(this) {
}
bool QuotaDispatcherHost::OnMessageReceived(
@@ -227,7 +242,7 @@ void QuotaDispatcherHost::OnQueryStorageUsageAndQuota(
const GURL& origin,
StorageType type) {
QueryUsageAndQuotaDispatcher* dispatcher = new QueryUsageAndQuotaDispatcher(
- this, request_id);
+ weak_factory_.GetWeakPtr(), request_id);
dispatcher->QueryStorageUsageAndQuota(origin, type);
}
@@ -251,7 +266,8 @@ void QuotaDispatcherHost::OnRequestStorageQuota(
}
RequestQuotaDispatcher* dispatcher = new RequestQuotaDispatcher(
- this, request_id, origin, type, requested_size, render_view_id);
+ weak_factory_.GetWeakPtr(), request_id, origin, type,
+ requested_size, render_view_id);
dispatcher->Start();
}
diff --git a/chromium/content/browser/quota_dispatcher_host.h b/chromium/content/browser/quota_dispatcher_host.h
index 724b2ad975f..64469c1a49a 100644
--- a/chromium/content/browser/quota_dispatcher_host.h
+++ b/chromium/content/browser/quota_dispatcher_host.h
@@ -60,6 +60,8 @@ class QuotaDispatcherHost : public BrowserMessageFilter {
IDMap<RequestDispatcher, IDMapOwnPointer> outstanding_requests_;
+ base::WeakPtrFactory<QuotaDispatcherHost> weak_factory_;
+
DISALLOW_IMPLICIT_CONSTRUCTORS(QuotaDispatcherHost);
};
diff --git a/chromium/content/browser/renderer_host/clipboard_message_filter.cc b/chromium/content/browser/renderer_host/clipboard_message_filter.cc
index 2ad35468244..0e2426bf224 100644
--- a/chromium/content/browser/renderer_host/clipboard_message_filter.cc
+++ b/chromium/content/browser/renderer_host/clipboard_message_filter.cc
@@ -115,23 +115,24 @@ void ClipboardMessageFilter::OnWriteObjectsSync(
void ClipboardMessageFilter::OnWriteObjectsAsync(
const ui::Clipboard::ObjectMap& objects) {
+ // This async message doesn't support shared-memory based bitmaps; they must
+ // be removed otherwise we might dereference a rubbish pointer.
+ scoped_ptr<ui::Clipboard::ObjectMap> sanitized_objects(
+ new ui::Clipboard::ObjectMap(objects));
+ sanitized_objects->erase(ui::Clipboard::CBF_SMBITMAP);
+
#if defined(OS_WIN)
// We cannot write directly from the IO thread, and cannot service the IPC
// on the UI thread. We'll copy the relevant data and post a task to preform
// the write on the UI thread.
- ui::Clipboard::ObjectMap* long_living_objects =
- new ui::Clipboard::ObjectMap(objects);
-
- // This async message doesn't support shared-memory based bitmaps; they must
- // be removed otherwise we might dereference a rubbish pointer.
- long_living_objects->erase(ui::Clipboard::CBF_SMBITMAP);
-
BrowserThread::PostTask(
BrowserThread::UI,
FROM_HERE,
- base::Bind(&WriteObjectsOnUIThread, base::Owned(long_living_objects)));
+ base::Bind(
+ &WriteObjectsOnUIThread, base::Owned(sanitized_objects.release())));
#else
- GetClipboard()->WriteObjects(ui::Clipboard::BUFFER_STANDARD, objects);
+ GetClipboard()->WriteObjects(
+ ui::Clipboard::BUFFER_STANDARD, *sanitized_objects.get());
#endif
}
@@ -198,6 +199,7 @@ void ClipboardMessageFilter::OnReadImageReply(
const SkBitmap& bitmap, IPC::Message* reply_msg) {
base::SharedMemoryHandle image_handle = base::SharedMemory::NULLHandle();
uint32 image_size = 0;
+ std::string reply_data;
if (!bitmap.isNull()) {
std::vector<unsigned char> png_data;
SkAutoLockPixels lock(bitmap);
diff --git a/chromium/content/browser/renderer_host/compositor_impl_android.cc b/chromium/content/browser/renderer_host/compositor_impl_android.cc
index 94ab1393c84..53c42e4277a 100644
--- a/chromium/content/browser/renderer_host/compositor_impl_android.cc
+++ b/chromium/content/browser/renderer_host/compositor_impl_android.cc
@@ -394,9 +394,8 @@ scoped_ptr<cc::OutputSurface> CompositorImpl::CreateOutputSurface(
false,
CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE,
64 * 1024, // command buffer size
- std::min(full_screen_texture_size_in_bytes,
- kDefaultStartTransferBufferSize),
- kDefaultMinTransferBufferSize,
+ 64 * 1024, // start transfer buffer size
+ 64 * 1024, // min transfer buffer size
std::min(3 * full_screen_texture_size_in_bytes,
kDefaultMaxTransferBufferSize))) {
LOG(ERROR) << "Failed to create 3D context for compositor.";
diff --git a/chromium/content/browser/renderer_host/image_transport_factory_android.cc b/chromium/content/browser/renderer_host/image_transport_factory_android.cc
index efe9235f170..39071c9bec3 100644
--- a/chromium/content/browser/renderer_host/image_transport_factory_android.cc
+++ b/chromium/content/browser/renderer_host/image_transport_factory_android.cc
@@ -125,9 +125,8 @@ CmdBufferImageTransportFactory::CmdBufferImageTransportFactory() {
false,
CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE,
64 * 1024, // command buffer size
- std::min(full_screen_texture_size_in_bytes,
- kDefaultStartTransferBufferSize),
- kDefaultMinTransferBufferSize,
+ 64 * 1024, // starting buffer size
+ 64 * 1024, // min buffer size
std::min(3 * full_screen_texture_size_in_bytes,
kDefaultMaxTransferBufferSize));
diff --git a/chromium/content/browser/renderer_host/input/immediate_input_router.cc b/chromium/content/browser/renderer_host/input/immediate_input_router.cc
index 368619cc1e6..96e8bb9ac44 100644
--- a/chromium/content/browser/renderer_host/input/immediate_input_router.cc
+++ b/chromium/content/browser/renderer_host/input/immediate_input_router.cc
@@ -85,9 +85,6 @@ ImmediateInputRouter::ImmediateInputRouter(
has_touch_handler_(false),
touch_event_queue_(new TouchEventQueue(this)),
gesture_event_filter_(new GestureEventFilter(this)) {
- enable_no_touch_to_renderer_while_scrolling_ =
- CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
- switches::kNoTouchToRendererWhileScrolling) == "1";
DCHECK(process);
DCHECK(client);
}
@@ -202,7 +199,6 @@ void ImmediateInputRouter::SendKeyboardEvent(
void ImmediateInputRouter::SendGestureEvent(
const GestureEventWithLatencyInfo& gesture_event) {
- HandleGestureScroll(gesture_event);
if (!client_->OnSendGestureEvent(gesture_event))
return;
FilterAndSendWebInputEvent(gesture_event.event, gesture_event.latency, false);
@@ -256,7 +252,6 @@ void ImmediateInputRouter::SendTouchEventImmediately(
void ImmediateInputRouter::SendGestureEventImmediately(
const GestureEventWithLatencyInfo& gesture_event) {
- HandleGestureScroll(gesture_event);
if (!client_->OnSendGestureEventImmediately(gesture_event))
return;
FilterAndSendWebInputEvent(gesture_event.event, gesture_event.latency, false);
@@ -561,19 +556,4 @@ void ImmediateInputRouter::ProcessTouchAck(
touch_event_queue_->ProcessTouchAck(ack_result, latency_info);
}
-void ImmediateInputRouter::HandleGestureScroll(
- const GestureEventWithLatencyInfo& gesture_event) {
- if (!enable_no_touch_to_renderer_while_scrolling_)
- return;
-
- // Once scrolling is started stop forwarding touch move events to renderer.
- if (gesture_event.event.type == WebInputEvent::GestureScrollBegin)
- touch_event_queue_->set_no_touch_move_to_renderer(true);
-
- if (gesture_event.event.type == WebInputEvent::GestureScrollEnd ||
- gesture_event.event.type == WebInputEvent::GestureFlingStart) {
- touch_event_queue_->set_no_touch_move_to_renderer(false);
- }
-}
-
} // namespace content
diff --git a/chromium/content/browser/renderer_host/input/immediate_input_router.h b/chromium/content/browser/renderer_host/input/immediate_input_router.h
index 0bfa19f111e..270ca3dc67e 100644
--- a/chromium/content/browser/renderer_host/input/immediate_input_router.h
+++ b/chromium/content/browser/renderer_host/input/immediate_input_router.h
@@ -73,8 +73,6 @@ class CONTENT_EXPORT ImmediateInputRouter
}
private:
- friend class ImmediateInputRouterTest;
-
// TouchEventQueueClient
virtual void OnTouchEventAck(const TouchEventWithLatencyInfo& event,
InputEventAckState ack_result) OVERRIDE;
@@ -129,9 +127,6 @@ private:
void ProcessTouchAck(InputEventAckState ack_result,
const ui::LatencyInfo& latency_info);
- void HandleGestureScroll(
- const GestureEventWithLatencyInfo& gesture_event);
-
int routing_id() const { return routing_id_; }
@@ -191,10 +186,6 @@ private:
// not sent to the renderer.
bool has_touch_handler_;
- // Whether enabling the optimization that sending no touch move events to
- // renderer while scrolling.
- bool enable_no_touch_to_renderer_while_scrolling_;
-
scoped_ptr<TouchEventQueue> touch_event_queue_;
scoped_ptr<GestureEventFilter> gesture_event_filter_;
diff --git a/chromium/content/browser/renderer_host/input/immediate_input_router_unittest.cc b/chromium/content/browser/renderer_host/input/immediate_input_router_unittest.cc
index 371e02e01b3..ed725ee1a10 100644
--- a/chromium/content/browser/renderer_host/input/immediate_input_router_unittest.cc
+++ b/chromium/content/browser/renderer_host/input/immediate_input_router_unittest.cc
@@ -548,14 +548,6 @@ class ImmediateInputRouterTest : public testing::Test {
return touch_event_queue()->GetLatestEvent().event;
}
- void EnableNoTouchToRendererWhileScrolling() {
- input_router_->enable_no_touch_to_renderer_while_scrolling_ = true;
- }
-
- bool no_touch_move_to_renderer() {
- return touch_event_queue()->no_touch_move_to_renderer_;
- }
-
TouchEventQueue* touch_event_queue() const {
return input_router_->touch_event_queue();
}
@@ -2173,93 +2165,4 @@ TEST_F(ImmediateInputRouterTest, UnhandledWheelEvent) {
EXPECT_EQ(client_->acked_wheel_event().deltaY, -5);
}
-// Tests that no touch move events are sent to renderer during scrolling.
-TEST_F(ImmediateInputRouterTest, NoTouchMoveWhileScroll) {
- EnableNoTouchToRendererWhileScrolling();
- set_debounce_interval_time_ms(0);
- input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
- process_->sink().ClearMessages();
-
- // First touch press.
- PressTouchPoint(0, 1);
- SendTouchEvent();
- EXPECT_EQ(1U, process_->sink().message_count());
- process_->sink().ClearMessages();
- SendInputEventACK(WebInputEvent::TouchStart,
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-
- // Touch move will trigger scroll.
- MoveTouchPoint(0, 20, 5);
- SendTouchEvent();
- EXPECT_EQ(1U, process_->sink().message_count());
- process_->sink().ClearMessages();
- SendInputEventACK(WebInputEvent::TouchMove,
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-
- SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
- WebGestureEvent::Touchscreen);
- EXPECT_EQ(1U, process_->sink().message_count());
- EXPECT_TRUE(no_touch_move_to_renderer());
- process_->sink().ClearMessages();
- SendInputEventACK(WebInputEvent::GestureScrollBegin,
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-
- // Touch move should not be sent to renderer.
- MoveTouchPoint(0, 30, 5);
- SendTouchEvent();
- EXPECT_EQ(0U, process_->sink().message_count());
- process_->sink().ClearMessages();
-
- // Touch moves become ScrollUpdate.
- SimulateGestureScrollUpdateEvent(20, 4, 0);
- EXPECT_TRUE(no_touch_move_to_renderer());
- process_->sink().ClearMessages();
- SendInputEventACK(WebInputEvent::GestureScrollUpdate,
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-
- // Touch move should not be sent to renderer.
- MoveTouchPoint(0, 65, 10);
- SendTouchEvent();
- EXPECT_EQ(0U, process_->sink().message_count());
- process_->sink().ClearMessages();
-
- // Touch end should still be sent to renderer.
- ReleaseTouchPoint(0);
- SendTouchEvent();
- EXPECT_EQ(1U, process_->sink().message_count());
- process_->sink().ClearMessages();
- SendInputEventACK(WebInputEvent::TouchEnd,
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-
- // On GestureScrollEnd, resume sending touch moves to renderer.
- SimulateGestureEvent(WebKit::WebInputEvent::GestureScrollEnd,
- WebGestureEvent::Touchscreen);
- EXPECT_EQ(1U, process_->sink().message_count());
- EXPECT_FALSE(no_touch_move_to_renderer());
- process_->sink().ClearMessages();
- SendInputEventACK(WebInputEvent::GestureScrollEnd,
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-
- // Now touch events should come through to renderer.
- PressTouchPoint(80, 10);
- SendTouchEvent();
- EXPECT_EQ(1U, process_->sink().message_count());
- process_->sink().ClearMessages();
- SendInputEventACK(WebInputEvent::TouchStart,
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-
- MoveTouchPoint(0, 80, 20);
- SendTouchEvent();
- EXPECT_EQ(1U, process_->sink().message_count());
- process_->sink().ClearMessages();
- SendInputEventACK(WebInputEvent::TouchMove,
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-
- ReleaseTouchPoint(0);
- SendTouchEvent();
- EXPECT_EQ(1U, process_->sink().message_count());
- process_->sink().ClearMessages();
- SendInputEventACK(WebInputEvent::TouchEnd,
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
-}
} // namespace content
diff --git a/chromium/content/browser/renderer_host/input/touch_event_queue.cc b/chromium/content/browser/renderer_host/input/touch_event_queue.cc
index e22c05d0f80..c1675b9952d 100644
--- a/chromium/content/browser/renderer_host/input/touch_event_queue.cc
+++ b/chromium/content/browser/renderer_host/input/touch_event_queue.cc
@@ -91,8 +91,7 @@ class CoalescedWebTouchEvent {
TouchEventQueue::TouchEventQueue(TouchEventQueueClient* client)
: client_(client),
- dispatching_touch_ack_(false),
- no_touch_move_to_renderer_(false) {
+ dispatching_touch_ack_(false) {
DCHECK(client);
}
@@ -213,10 +212,6 @@ bool TouchEventQueue::ShouldForwardToRenderer(
if (event.type == WebKit::WebInputEvent::TouchStart)
return true;
- if (event.type == WebKit::WebInputEvent::TouchMove &&
- no_touch_move_to_renderer_)
- return false;
-
for (unsigned int i = 0; i < event.touchesLength; ++i) {
const WebKit::WebTouchPoint& point = event.touches[i];
// If a point has been stationary, then don't take it into account.
diff --git a/chromium/content/browser/renderer_host/input/touch_event_queue.h b/chromium/content/browser/renderer_host/input/touch_event_queue.h
index 358fae9c50d..23dda66c38b 100644
--- a/chromium/content/browser/renderer_host/input/touch_event_queue.h
+++ b/chromium/content/browser/renderer_host/input/touch_event_queue.h
@@ -61,10 +61,6 @@ class TouchEventQueue {
return touch_queue_.empty();
}
- void set_no_touch_move_to_renderer(bool value) {
- no_touch_move_to_renderer_ = value;
- }
-
private:
friend class MockRenderWidgetHost;
friend class ImmediateInputRouterTest;
@@ -92,11 +88,6 @@ class TouchEventQueue {
// Used to defer touch forwarding when ack dispatch triggers |QueueEvent()|.
bool dispatching_touch_ack_;
- // Don't send touch move events to renderer. This is enabled when the page
- // is scrolling. This behaviour is currently enabled only on aura behind a
- // flag.
- bool no_touch_move_to_renderer_;
-
DISALLOW_COPY_AND_ASSIGN(TouchEventQueue);
};
diff --git a/chromium/content/browser/renderer_host/input/web_input_event_builders_win.cc b/chromium/content/browser/renderer_host/input/web_input_event_builders_win.cc
index a5a9b20f615..ba081fd429b 100644
--- a/chromium/content/browser/renderer_host/input/web_input_event_builders_win.cc
+++ b/chromium/content/browser/renderer_host/input/web_input_event_builders_win.cc
@@ -428,20 +428,22 @@ WebMouseWheelEventBuilder::Build(HWND hwnd, UINT message,
// reading articles.
static const float kScrollbarPixelsPerLine = 100.0f / 3.0f;
wheel_delta /= WHEEL_DELTA;
- float scroll_delta = wheel_delta * kScrollbarPixelsPerLine;
+ float scroll_delta = wheel_delta;
if (horizontal_scroll) {
unsigned long scroll_chars = kDefaultScrollCharsPerWheelDelta;
SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &scroll_chars, 0);
// TODO(pkasting): Should probably have a different multiplier
// scrollbarPixelsPerChar here.
- scroll_delta *= static_cast<float>(scroll_chars);
+ scroll_delta *= static_cast<float>(scroll_chars) * kScrollbarPixelsPerLine;
} else {
unsigned long scroll_lines = kDefaultScrollLinesPerWheelDelta;
SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scroll_lines, 0);
if (scroll_lines == WHEEL_PAGESCROLL)
result.scrollByPage = true;
- if (!result.scrollByPage)
- scroll_delta *= static_cast<float>(scroll_lines);
+ if (!result.scrollByPage) {
+ scroll_delta *=
+ static_cast<float>(scroll_lines) * kScrollbarPixelsPerLine;
+ }
}
// Set scroll amount based on above calculations. WebKit expects positive
diff --git a/chromium/content/browser/renderer_host/media/desktop_capture_device.cc b/chromium/content/browser/renderer_host/media/desktop_capture_device.cc
index 9549633e80d..5a03e465533 100644
--- a/chromium/content/browser/renderer_host/media/desktop_capture_device.cc
+++ b/chromium/content/browser/renderer_host/media/desktop_capture_device.cc
@@ -23,19 +23,7 @@
namespace content {
namespace {
-
const int kBytesPerPixel = 4;
-
-webrtc::DesktopRect ComputeLetterboxRect(
- const webrtc::DesktopSize& max_size,
- const webrtc::DesktopSize& source_size) {
- gfx::Rect result = media::ComputeLetterboxRegion(
- gfx::Rect(0, 0, max_size.width(), max_size.height()),
- gfx::Size(source_size.width(), source_size.height()));
- return webrtc::DesktopRect::MakeLTRB(
- result.x(), result.y(), result.right(), result.bottom());
-}
-
} // namespace
class DesktopCaptureDevice::Core
@@ -46,7 +34,8 @@ class DesktopCaptureDevice::Core
scoped_ptr<webrtc::DesktopCapturer> capturer);
// Implementation of VideoCaptureDevice methods.
- void Allocate(const media::VideoCaptureCapability& capture_format,
+ void Allocate(int width, int height,
+ int frame_rate,
EventHandler* event_handler);
void Start();
void Stop();
@@ -62,16 +51,11 @@ class DesktopCaptureDevice::Core
// Helper methods that run on the |task_runner_|. Posted from the
// corresponding public methods.
- void DoAllocate(const media::VideoCaptureCapability& capture_format);
+ void DoAllocate(int width, int height, int frame_rate);
void DoStart();
void DoStop();
void DoDeAllocate();
- // Chooses new output properties based on the supplied source size and the
- // properties requested to Allocate(), and dispatches OnFrameInfo[Changed]
- // notifications.
- void RefreshCaptureFormat(const webrtc::DesktopSize& frame_size);
-
// Helper to schedule capture tasks.
void ScheduleCaptureTimer();
@@ -94,23 +78,24 @@ class DesktopCaptureDevice::Core
base::Lock event_handler_lock_;
EventHandler* event_handler_;
- // Requested video capture format (width, height, frame rate, etc).
- media::VideoCaptureCapability requested_format_;
+ // Requested size specified to Allocate().
+ webrtc::DesktopSize requested_size_;
- // Actual video capture format being generated.
- media::VideoCaptureCapability capture_format_;
+ // Frame rate specified to Allocate().
+ int frame_rate_;
- // Size of frame most recently captured from the source.
- webrtc::DesktopSize previous_frame_size_;
+ // Empty until the first frame has been captured, and the output dimensions
+ // chosen based on the capture frame's size, and any caller-supplied
+ // size constraints.
+ webrtc::DesktopSize output_size_;
- // DesktopFrame into which captured frames are down-scaled and/or letterboxed,
- // depending upon the caller's requested capture capabilities. If frames can
- // be returned to the caller directly then this is NULL.
- scoped_ptr<webrtc::DesktopFrame> output_frame_;
+ // Size of the most recently received frame.
+ webrtc::DesktopSize previous_frame_size_;
- // Sub-rectangle of |output_frame_| into which the source will be scaled
- // and/or letterboxed.
- webrtc::DesktopRect output_rect_;
+ // DesktopFrame into which captured frames are scaled, if the source size does
+ // not match |output_size_|. If the source and output have the same dimensions
+ // then this is NULL.
+ scoped_ptr<webrtc::DesktopFrame> scaled_frame_;
// True between DoStart() and DoStop(). Can't just check |event_handler_|
// because |event_handler_| is used on the caller thread.
@@ -140,12 +125,12 @@ DesktopCaptureDevice::Core::Core(
DesktopCaptureDevice::Core::~Core() {
}
-void DesktopCaptureDevice::Core::Allocate(
- const media::VideoCaptureCapability& capture_format,
- EventHandler* event_handler) {
- DCHECK_GT(capture_format.width, 0);
- DCHECK_GT(capture_format.height, 0);
- DCHECK_GT(capture_format.frame_rate, 0);
+void DesktopCaptureDevice::Core::Allocate(int width, int height,
+ int frame_rate,
+ EventHandler* event_handler) {
+ DCHECK_GT(width, 0);
+ DCHECK_GT(height, 0);
+ DCHECK_GT(frame_rate, 0);
{
base::AutoLock auto_lock(event_handler_lock_);
@@ -154,7 +139,7 @@ void DesktopCaptureDevice::Core::Allocate(
task_runner_->PostTask(
FROM_HERE,
- base::Bind(&Core::DoAllocate, this, capture_format));
+ base::Bind(&Core::DoAllocate, this, width, height, frame_rate));
}
void DesktopCaptureDevice::Core::Start() {
@@ -195,76 +180,95 @@ void DesktopCaptureDevice::Core::OnCaptureCompleted(
scoped_ptr<webrtc::DesktopFrame> owned_frame(frame);
- // Handle initial frame size and size changes.
- RefreshCaptureFormat(frame->size());
+ // If an |output_size_| hasn't yet been chosen then choose one, based upon
+ // the source frame size and the requested size supplied to Allocate().
+ if (output_size_.is_empty()) {
+ // Treat the requested size as upper bounds on width & height.
+ // TODO(wez): Constraints should be passed from getUserMedia to Allocate.
+ output_size_.set(
+ std::min(frame->size().width(), requested_size_.width()),
+ std::min(frame->size().height(), requested_size_.height()));
+
+ // Inform the EventHandler of the output dimensions, format and frame rate.
+ media::VideoCaptureCapability caps;
+ caps.width = output_size_.width();
+ caps.height = output_size_.height();
+ caps.frame_rate = frame_rate_;
+ caps.color = media::VideoCaptureCapability::kARGB;
+ caps.expected_capture_delay =
+ base::Time::kMillisecondsPerSecond / frame_rate_;
+ caps.interlaced = false;
+
+ base::AutoLock auto_lock(event_handler_lock_);
+ if (event_handler_)
+ event_handler_->OnFrameInfo(caps);
+ }
if (!started_)
return;
- webrtc::DesktopSize output_size(capture_format_.width,
- capture_format_.height);
- size_t output_bytes = output_size.width() * output_size.height() *
+ size_t output_bytes = output_size_.width() * output_size_.height() *
webrtc::DesktopFrame::kBytesPerPixel;
- const uint8_t* output_data = NULL;
- if (frame->size().equals(output_size)) {
+ if (frame->size().equals(output_size_)) {
// If the captured frame matches the output size, we can return the pixel
// data directly, without scaling.
- output_data = frame->data();
- } else {
- // Otherwise we need to down-scale and/or letterbox to the target format.
-
- // Allocate a buffer of the correct size to scale the frame into.
- // |output_frame_| is cleared whenever |output_rect_| changes, so we don't
- // need to worry about clearing out stale pixel data in letterboxed areas.
- if (!output_frame_) {
- output_frame_.reset(new webrtc::BasicDesktopFrame(output_size));
- memset(output_frame_->data(), 0, output_bytes);
+ scaled_frame_.reset();
+
+ base::AutoLock auto_lock(event_handler_lock_);
+ if (event_handler_) {
+ event_handler_->OnIncomingCapturedFrame(
+ frame->data(), output_bytes, base::Time::Now(), 0, false, false);
}
- DCHECK(output_frame_->size().equals(output_size));
-
- // TODO(wez): Optimize this to scale only changed portions of the output,
- // using ARGBScaleClip().
- uint8_t* output_rect_data = output_frame_->data() +
- output_frame_->stride() * output_rect_.top() +
- webrtc::DesktopFrame::kBytesPerPixel * output_rect_.left();
- libyuv::ARGBScale(frame->data(), frame->stride(),
- frame->size().width(), frame->size().height(),
- output_rect_data, output_frame_->stride(),
- output_rect_.width(), output_rect_.height(),
- libyuv::kFilterBilinear);
- output_data = output_frame_->data();
+ return;
+ }
+
+ // If the output size differs from the frame size (e.g. the source has changed
+ // from its original dimensions, or the caller specified size constraints)
+ // then we need to scale the image.
+ if (!scaled_frame_)
+ scaled_frame_.reset(new webrtc::BasicDesktopFrame(output_size_));
+ DCHECK(scaled_frame_->size().equals(output_size_));
+
+ // If the source frame size changed then clear |scaled_frame_|'s pixels.
+ if (!previous_frame_size_.equals(frame->size())) {
+ previous_frame_size_ = frame->size();
+ memset(scaled_frame_->data(), 0, output_bytes);
}
+ // Determine the output size preserving aspect, and center in output buffer.
+ gfx::Rect scaled_rect = media::ComputeLetterboxRegion(
+ gfx::Rect(0, 0, output_size_.width(), output_size_.height()),
+ gfx::Size(frame->size().width(), frame->size().height()));
+ uint8* scaled_data = scaled_frame_->data() +
+ scaled_frame_->stride() * scaled_rect.y() +
+ webrtc::DesktopFrame::kBytesPerPixel * scaled_rect.x();
+
+ // TODO(wez): Optimize this to scale only changed portions of the output,
+ // using ARGBScaleClip().
+ libyuv::ARGBScale(frame->data(), frame->stride(),
+ frame->size().width(), frame->size().height(),
+ scaled_data, scaled_frame_->stride(),
+ scaled_rect.width(), scaled_rect.height(),
+ libyuv::kFilterBilinear);
+
base::AutoLock auto_lock(event_handler_lock_);
if (event_handler_) {
- event_handler_->OnIncomingCapturedFrame(output_data, output_bytes,
- base::Time::Now(), 0, false, false);
+ event_handler_->OnIncomingCapturedFrame(
+ scaled_frame_->data(), output_bytes,
+ base::Time::Now(), 0, false, false);
}
}
-void DesktopCaptureDevice::Core::DoAllocate(
- const media::VideoCaptureCapability& capture_format) {
+void DesktopCaptureDevice::Core::DoAllocate(int width,
+ int height,
+ int frame_rate) {
DCHECK(task_runner_->RunsTasksOnCurrentThread());
DCHECK(desktop_capturer_);
- requested_format_ = capture_format;
-
- // Store requested frame rate and calculate expected delay.
- capture_format_.frame_rate = requested_format_.frame_rate;
- capture_format_.expected_capture_delay =
- base::Time::kMillisecondsPerSecond / requested_format_.frame_rate;
-
- // Support dynamic changes in resolution only if requester also does.
- if (requested_format_.frame_size_type ==
- media::VariableResolutionVideoCaptureDevice) {
- capture_format_.frame_size_type =
- media::VariableResolutionVideoCaptureDevice;
- }
-
- // This capturer always outputs ARGB, non-interlaced.
- capture_format_.color = media::VideoCaptureCapability::kARGB;
- capture_format_.interlaced = false;
+ requested_size_.set(width, height);
+ output_size_.set(0, 0);
+ frame_rate_ = frame_rate;
desktop_capturer_->Start(this);
@@ -284,63 +288,14 @@ void DesktopCaptureDevice::Core::DoStart() {
void DesktopCaptureDevice::Core::DoStop() {
DCHECK(task_runner_->RunsTasksOnCurrentThread());
started_ = false;
- output_frame_.reset();
- previous_frame_size_.set(0, 0);
+ scaled_frame_.reset();
}
void DesktopCaptureDevice::Core::DoDeAllocate() {
DCHECK(task_runner_->RunsTasksOnCurrentThread());
DoStop();
desktop_capturer_.reset();
-}
-
-void DesktopCaptureDevice::Core::RefreshCaptureFormat(
- const webrtc::DesktopSize& frame_size) {
- if (previous_frame_size_.equals(frame_size))
- return;
-
- // Clear the output frame, if any, since it will either need resizing, or
- // clearing of stale data in letterbox areas, anyway.
- output_frame_.reset();
-
- if (previous_frame_size_.is_empty() ||
- requested_format_.frame_size_type ==
- media::VariableResolutionVideoCaptureDevice) {
- // If this is the first frame, or the receiver supports variable resolution
- // then determine the output size by treating the requested width & height
- // as maxima.
- if (frame_size.width() > requested_format_.width ||
- frame_size.height() > requested_format_.height) {
- output_rect_ = ComputeLetterboxRect(
- webrtc::DesktopSize(requested_format_.width,
- requested_format_.height),
- frame_size);
- output_rect_.Translate(-output_rect_.left(), -output_rect_.top());
- } else {
- output_rect_ = webrtc::DesktopRect::MakeSize(frame_size);
- }
- capture_format_.width = output_rect_.width();
- capture_format_.height = output_rect_.height();
-
- {
- base::AutoLock auto_lock(event_handler_lock_);
- if (event_handler_) {
- if (previous_frame_size_.is_empty()) {
- event_handler_->OnFrameInfo(capture_format_);
- } else {
- event_handler_->OnFrameInfoChanged(capture_format_);
- }
- }
- }
- } else {
- // Otherwise the output frame size cannot change, so just scale and
- // letterbox.
- output_rect_ = ComputeLetterboxRect(
- webrtc::DesktopSize(capture_format_.width, capture_format_.height),
- frame_size);
- }
-
- previous_frame_size_ = frame_size;
+ output_size_.set(0, 0);
}
void DesktopCaptureDevice::Core::ScheduleCaptureTimer() {
@@ -348,7 +303,7 @@ void DesktopCaptureDevice::Core::ScheduleCaptureTimer() {
capture_task_posted_ = true;
task_runner_->PostDelayedTask(
FROM_HERE, base::Bind(&Core::OnCaptureTimer, this),
- base::TimeDelta::FromSeconds(1) / capture_format_.frame_rate);
+ base::TimeDelta::FromSeconds(1) / frame_rate_);
}
void DesktopCaptureDevice::Core::OnCaptureTimer() {
@@ -439,8 +394,11 @@ DesktopCaptureDevice::~DesktopCaptureDevice() {
void DesktopCaptureDevice::Allocate(
const media::VideoCaptureCapability& capture_format,
- EventHandler* event_handler) {
- core_->Allocate(capture_format, event_handler);
+ EventHandler* observer) {
+ core_->Allocate(capture_format.width,
+ capture_format.height,
+ capture_format.frame_rate,
+ observer);
}
void DesktopCaptureDevice::Start() {
diff --git a/chromium/content/browser/renderer_host/media/desktop_capture_device_unittest.cc b/chromium/content/browser/renderer_host/media/desktop_capture_device_unittest.cc
index cf050f5a210..0f14585ea90 100644
--- a/chromium/content/browser/renderer_host/media/desktop_capture_device_unittest.cc
+++ b/chromium/content/browser/renderer_host/media/desktop_capture_device_unittest.cc
@@ -17,9 +17,7 @@
#include "third_party/webrtc/modules/desktop_capture/screen_capturer.h"
using ::testing::_;
-using ::testing::AnyNumber;
using ::testing::DoAll;
-using ::testing::Expectation;
using ::testing::InvokeWithoutArgs;
using ::testing::SaveArg;
@@ -27,10 +25,6 @@ namespace content {
namespace {
-MATCHER_P2(EqualsCaptureCapability, width, height, "") {
- return arg.width == width && arg.height == height;
-}
-
const int kTestFrameWidth1 = 100;
const int kTestFrameHeight1 = 100;
const int kTestFrameWidth2 = 200;
@@ -44,8 +38,6 @@ class MockFrameObserver : public media::VideoCaptureDevice::EventHandler {
MOCK_METHOD0(ReserveOutputBuffer, scoped_refptr<media::VideoFrame>());
MOCK_METHOD0(OnError, void());
MOCK_METHOD1(OnFrameInfo, void(const media::VideoCaptureCapability& info));
- MOCK_METHOD1(OnFrameInfoChanged,
- void(const media::VideoCaptureCapability& info));
MOCK_METHOD6(OnIncomingCapturedFrame, void(const uint8* data,
int length,
base::Time timestamp,
@@ -149,9 +141,8 @@ TEST_F(DesktopCaptureDeviceTest, MAYBE_Capture) {
EXPECT_EQ(caps.width * caps.height * 4, frame_size);
}
-// Test that screen capturer behaves correctly if the source frame size changes
-// but the caller cannot cope with variable resolution output.
-TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeConstantResolution) {
+// Test that screen capturer can handle resolution change without crashing.
+TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChange) {
FakeScreenCapturer* mock_capturer = new FakeScreenCapturer();
DesktopCaptureDevice capture_device(
@@ -163,14 +154,11 @@ TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeConstantResolution) {
int frame_size;
MockFrameObserver frame_observer;
- Expectation frame_info_called = EXPECT_CALL(frame_observer, OnFrameInfo(_))
+ EXPECT_CALL(frame_observer, OnFrameInfo(_))
.WillOnce(SaveArg<0>(&caps));
- EXPECT_CALL(frame_observer, OnFrameInfoChanged(_))
- .Times(0);
EXPECT_CALL(frame_observer, OnError())
.Times(0);
EXPECT_CALL(frame_observer, OnIncomingCapturedFrame(_, _, _, _, _, _))
- .After(frame_info_called)
.WillRepeatedly(DoAll(
SaveArg<1>(&frame_size),
InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal)));
@@ -183,16 +171,13 @@ TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeConstantResolution) {
0,
false,
media::ConstantResolutionVideoCaptureDevice);
-
capture_device.Allocate(capture_format, &frame_observer);
capture_device.Start();
-
- // Capture at least two frames, to ensure that the source frame size has
- // changed while capturing.
+ // Capture first frame.
EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout()));
done_event.Reset();
+ // Capture second frame.
EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout()));
-
capture_device.Stop();
capture_device.DeAllocate();
@@ -205,67 +190,4 @@ TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeConstantResolution) {
EXPECT_EQ(caps.width * caps.height * 4, frame_size);
}
-// Test that screen capturer behaves correctly if the source frame size changes
-// and the caller can cope with variable resolution output.
-TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeVariableResolution) {
- FakeScreenCapturer* mock_capturer = new FakeScreenCapturer();
-
- DesktopCaptureDevice capture_device(
- worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()),
- scoped_ptr<webrtc::DesktopCapturer>(mock_capturer));
-
- media::VideoCaptureCapability caps;
- base::WaitableEvent done_event(false, false);
-
- MockFrameObserver frame_observer;
- Expectation frame_info_called = EXPECT_CALL(frame_observer, OnFrameInfo(_))
- .WillOnce(SaveArg<0>(&caps));
- Expectation first_info_changed = EXPECT_CALL(frame_observer,
- OnFrameInfoChanged(EqualsCaptureCapability(kTestFrameWidth2,
- kTestFrameHeight2)))
- .After(frame_info_called);
- Expectation second_info_changed = EXPECT_CALL(frame_observer,
- OnFrameInfoChanged(EqualsCaptureCapability(kTestFrameWidth1,
- kTestFrameHeight1)))
- .After(first_info_changed);
- EXPECT_CALL(frame_observer, OnFrameInfoChanged(_))
- .Times(AnyNumber())
- .After(second_info_changed);
- EXPECT_CALL(frame_observer, OnError())
- .Times(0);
- EXPECT_CALL(frame_observer, OnIncomingCapturedFrame(_, _, _, _, _, _))
- .After(frame_info_called)
- .WillRepeatedly(
- InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal));
-
- media::VideoCaptureCapability capture_format(
- kTestFrameWidth2,
- kTestFrameHeight2,
- kFrameRate,
- media::VideoCaptureCapability::kI420,
- 0,
- false,
- media::VariableResolutionVideoCaptureDevice);
-
- capture_device.Allocate(capture_format, &frame_observer);
- capture_device.Start();
-
- // Capture at least three frames, to ensure that the source frame size has
- // changed at least twice while capturing.
- EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout()));
- done_event.Reset();
- EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout()));
- done_event.Reset();
- EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout()));
-
- capture_device.Stop();
- capture_device.DeAllocate();
-
- EXPECT_EQ(kTestFrameWidth1, caps.width);
- EXPECT_EQ(kTestFrameHeight1, caps.height);
- EXPECT_EQ(kFrameRate, caps.frame_rate);
- EXPECT_EQ(media::VideoCaptureCapability::kARGB, caps.color);
- EXPECT_FALSE(caps.interlaced);
-}
-
} // namespace content
diff --git a/chromium/content/browser/renderer_host/p2p/OWNERS b/chromium/content/browser/renderer_host/p2p/OWNERS
index f12c2d60e83..17c3a1e6983 100644
--- a/chromium/content/browser/renderer_host/p2p/OWNERS
+++ b/chromium/content/browser/renderer_host/p2p/OWNERS
@@ -1,3 +1,2 @@
-hclam@chromium.org
-mallinath@chromium.org
sergeyu@chromium.org
+hclam@chromium.org
diff --git a/chromium/content/browser/renderer_host/p2p/socket_host_tcp.cc b/chromium/content/browser/renderer_host/p2p/socket_host_tcp.cc
index 314026e2438..8e13bf8f5b5 100644
--- a/chromium/content/browser/renderer_host/p2p/socket_host_tcp.cc
+++ b/chromium/content/browser/renderer_host/p2p/socket_host_tcp.cc
@@ -136,9 +136,7 @@ void P2PSocketHostTcpBase::OnConnected(int result) {
StartTls();
} else {
if (IsPseudoTlsClientSocket(type_)) {
- scoped_ptr<net::StreamSocket> transport_socket = socket_.Pass();
- socket_.reset(
- new jingle_glue::FakeSSLClientSocket(transport_socket.Pass()));
+ socket_.reset(new jingle_glue::FakeSSLClientSocket(socket_.release()));
}
// If we are not doing TLS, we are ready to send data now.
@@ -157,7 +155,7 @@ void P2PSocketHostTcpBase::StartTls() {
scoped_ptr<net::ClientSocketHandle> socket_handle(
new net::ClientSocketHandle());
- socket_handle->SetSocket(socket_.Pass());
+ socket_handle->set_socket(socket_.release());
net::SSLClientSocketContext context;
context.cert_verifier = url_context_->GetURLRequestContext()->cert_verifier();
@@ -173,8 +171,8 @@ void P2PSocketHostTcpBase::StartTls() {
net::ClientSocketFactory::GetDefaultFactory();
DCHECK(socket_factory);
- socket_ = socket_factory->CreateSSLClientSocket(
- socket_handle.Pass(), dest_host_port_pair, ssl_config, context);
+ socket_.reset(socket_factory->CreateSSLClientSocket(
+ socket_handle.release(), dest_host_port_pair, ssl_config, context));
int status = socket_->Connect(
base::Bind(&P2PSocketHostTcpBase::ProcessTlsConnectDone,
base::Unretained(this)));
diff --git a/chromium/content/browser/renderer_host/pepper/pepper_tcp_socket.cc b/chromium/content/browser/renderer_host/pepper/pepper_tcp_socket.cc
index 05b2e09993a..f05be8783ed 100644
--- a/chromium/content/browser/renderer_host/pepper/pepper_tcp_socket.cc
+++ b/chromium/content/browser/renderer_host/pepper/pepper_tcp_socket.cc
@@ -141,16 +141,16 @@ void PepperTCPSocket::SSLHandshake(
connection_state_ = SSL_HANDSHAKE_IN_PROGRESS;
// TODO(raymes,rsleevi): Use trusted/untrusted certificates when connecting.
- scoped_ptr<net::ClientSocketHandle> handle(new net::ClientSocketHandle());
- handle->SetSocket(socket_.Pass());
+ net::ClientSocketHandle* handle = new net::ClientSocketHandle();
+ handle->set_socket(socket_.release());
net::ClientSocketFactory* factory =
net::ClientSocketFactory::GetDefaultFactory();
net::HostPortPair host_port_pair(server_name, server_port);
net::SSLClientSocketContext ssl_context;
ssl_context.cert_verifier = manager_->GetCertVerifier();
ssl_context.transport_security_state = manager_->GetTransportSecurityState();
- socket_ = factory->CreateSSLClientSocket(
- handle.Pass(), host_port_pair, manager_->ssl_config(), ssl_context);
+ socket_.reset(factory->CreateSSLClientSocket(
+ handle, host_port_pair, manager_->ssl_config(), ssl_context));
if (!socket_) {
LOG(WARNING) << "Failed to create an SSL client socket.";
OnSSLHandshakeCompleted(net::ERR_UNEXPECTED);
diff --git a/chromium/content/browser/renderer_host/render_message_filter.cc b/chromium/content/browser/renderer_host/render_message_filter.cc
index fc84eabf2bd..29e1e1f199a 100644
--- a/chromium/content/browser/renderer_host/render_message_filter.cc
+++ b/chromium/content/browser/renderer_host/render_message_filter.cc
@@ -459,6 +459,7 @@ void RenderMessageFilter::OnCreateWindow(
bool can_create_window =
GetContentClient()->browser()->CanCreateWindow(
params.opener_url,
+ params.opener_top_level_frame_url,
params.opener_security_origin,
params.window_container_type,
params.target_url,
diff --git a/chromium/content/browser/renderer_host/render_process_host_impl.cc b/chromium/content/browser/renderer_host/render_process_host_impl.cc
index e31aff2afc6..2dd784a4e69 100644
--- a/chromium/content/browser/renderer_host/render_process_host_impl.cc
+++ b/chromium/content/browser/renderer_host/render_process_host_impl.cc
@@ -943,7 +943,6 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer(
switches::kEnableWebRtcAecRecordings,
switches::kEnableWebRtcTcpServerSocket,
switches::kEnableWebRtcHWDecoding,
- switches::kEnableWebRtcHWEncoding,
#endif
switches::kDisableWebKitMediaSource,
switches::kEnableOverscrollNotifications,
diff --git a/chromium/content/browser/renderer_host/render_view_host_manager_browsertest.cc b/chromium/content/browser/renderer_host/render_view_host_manager_browsertest.cc
index f5ebb76fc0a..4053d6593f2 100644
--- a/chromium/content/browser/renderer_host/render_view_host_manager_browsertest.cc
+++ b/chromium/content/browser/renderer_host/render_view_host_manager_browsertest.cc
@@ -86,7 +86,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
// Wait for the navigation in the new window to finish, if it hasn't.
WaitForLoadStop(new_shell->web_contents());
EXPECT_EQ("/files/navigate_opener.html",
- new_shell->web_contents()->GetLastCommittedURL().path());
+ new_shell->web_contents()->GetURL().path());
// Should have the same SiteInstance.
scoped_refptr<SiteInstance> blank_site_instance(
@@ -153,8 +153,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
// Wait for the window to open.
Shell* new_shell = new_shell_observer.GetShell();
- EXPECT_EQ("/files/title2.html",
- new_shell->web_contents()->GetVisibleURL().path());
+ EXPECT_EQ("/files/title2.html", new_shell->web_contents()->GetURL().path());
// Wait for the cross-site transition in the new tab to finish.
WaitForLoadStop(new_shell->web_contents());
@@ -208,8 +207,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
Shell* new_shell = new_shell_observer.GetShell();
// Opens in new window.
- EXPECT_EQ("/files/title2.html",
- new_shell->web_contents()->GetVisibleURL().path());
+ EXPECT_EQ("/files/title2.html", new_shell->web_contents()->GetURL().path());
// Wait for the cross-site transition in the new tab to finish.
WaitForLoadStop(new_shell->web_contents());
@@ -264,7 +262,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
// Wait for the cross-site transition in the new tab to finish.
WaitForLoadStop(new_shell->web_contents());
EXPECT_EQ("/files/title2.html",
- new_shell->web_contents()->GetLastCommittedURL().path());
+ new_shell->web_contents()->GetURL().path());
// Should have the same SiteInstance.
scoped_refptr<SiteInstance> blank_site_instance(
@@ -310,8 +308,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
// Opens in same window.
EXPECT_EQ(1u, Shell::windows().size());
- EXPECT_EQ("/files/title2.html",
- shell()->web_contents()->GetLastCommittedURL().path());
+ EXPECT_EQ("/files/title2.html", shell()->web_contents()->GetURL().path());
// Should have the same SiteInstance.
scoped_refptr<SiteInstance> noref_site_instance(
@@ -379,7 +376,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
// Wait for the navigation in the new tab to finish, if it hasn't.
WaitForLoadStop(new_shell->web_contents());
EXPECT_EQ("/files/navigate_opener.html",
- new_shell->web_contents()->GetLastCommittedURL().path());
+ new_shell->web_contents()->GetURL().path());
// Should have the same SiteInstance.
scoped_refptr<SiteInstance> blank_site_instance(
@@ -459,7 +456,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, DisownOpener) {
// Wait for the navigation in the new tab to finish, if it hasn't.
WaitForLoadStop(new_shell->web_contents());
EXPECT_EQ("/files/title2.html",
- new_shell->web_contents()->GetLastCommittedURL().path());
+ new_shell->web_contents()->GetURL().path());
// Should have the same SiteInstance.
scoped_refptr<SiteInstance> blank_site_instance(
@@ -565,8 +562,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
// send it to post_message.html on a different site.
WebContents* foo_contents = new_shell->web_contents();
WaitForLoadStop(foo_contents);
- EXPECT_EQ("/files/navigate_opener.html",
- foo_contents->GetLastCommittedURL().path());
+ EXPECT_EQ("/files/navigate_opener.html", foo_contents->GetURL().path());
NavigateToURL(new_shell, https_server.GetURL("files/post_message.html"));
scoped_refptr<SiteInstance> foo_site_instance(
foo_contents->GetSiteInstance());
@@ -585,7 +581,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
Shell* new_shell2 = new_shell_observer2.GetShell();
WebContents* new_contents = new_shell2->web_contents();
WaitForLoadStop(new_contents);
- EXPECT_EQ("/files/title2.html", new_contents->GetLastCommittedURL().path());
+ EXPECT_EQ("/files/title2.html", new_contents->GetURL().path());
NavigateToURL(new_shell2, test_server()->GetURL("files/post_message.html"));
EXPECT_EQ(orig_site_instance, new_contents->GetSiteInstance());
RenderViewHostManager* new_manager =
@@ -702,7 +698,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
// Wait for the navigation in the new window to finish, if it hasn't.
WaitForLoadStop(new_shell->web_contents());
EXPECT_EQ("/files/navigate_opener.html",
- new_shell->web_contents()->GetLastCommittedURL().path());
+ new_shell->web_contents()->GetURL().path());
// Should have the same SiteInstance.
scoped_refptr<SiteInstance> blank_site_instance(
@@ -769,7 +765,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
// Wait for the navigation in the new window to finish, if it hasn't.
WaitForLoadStop(new_shell->web_contents());
EXPECT_EQ("/files/navigate_opener.html",
- new_shell->web_contents()->GetLastCommittedURL().path());
+ new_shell->web_contents()->GetURL().path());
// Should have the same SiteInstance.
scoped_refptr<SiteInstance> opened_site_instance(
@@ -833,8 +829,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, ClickLinkAfter204Error) {
scoped_refptr<SiteInstance> post_nav_site_instance(
shell()->web_contents()->GetSiteInstance());
EXPECT_EQ(orig_site_instance, post_nav_site_instance);
- EXPECT_EQ("/nocontent",
- shell()->web_contents()->GetVisibleURL().path());
+ EXPECT_EQ("/nocontent", shell()->web_contents()->GetURL().path());
EXPECT_EQ("/files/click-noreferrer-links.html",
shell()->web_contents()->GetController().
GetLastCommittedEntry()->GetVirtualURL().path());
@@ -852,8 +847,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, ClickLinkAfter204Error) {
// Opens in same tab.
EXPECT_EQ(1u, Shell::windows().size());
- EXPECT_EQ("/files/title2.html",
- shell()->web_contents()->GetLastCommittedURL().path());
+ EXPECT_EQ("/files/title2.html", shell()->web_contents()->GetURL().path());
// Should have the same SiteInstance.
scoped_refptr<SiteInstance> noref_site_instance(
@@ -1079,7 +1073,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
// Wait for the navigation in the new tab to finish, if it hasn't.
WaitForLoadStop(new_shell->web_contents());
EXPECT_EQ("/files/navigate_opener.html",
- new_shell->web_contents()->GetLastCommittedURL().path());
+ new_shell->web_contents()->GetURL().path());
RenderViewHost* rvh = new_shell->web_contents()->GetRenderViewHost();
@@ -1110,7 +1104,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
}
EXPECT_EQ("/files/navigate_opener.html",
- new_shell->web_contents()->GetLastCommittedURL().path());
+ new_shell->web_contents()->GetURL().path());
EXPECT_EQ(rvh, new_shell->web_contents()->GetRenderViewHost());
@@ -1193,7 +1187,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, LeakingRenderViewHosts) {
// view-source URL, we create a new SiteInstance.
RenderViewHost* blank_rvh = shell()->web_contents()->GetRenderViewHost();
SiteInstance* blank_site_instance = blank_rvh->GetSiteInstance();
- EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), GURL::EmptyGURL());
+ EXPECT_EQ(shell()->web_contents()->GetURL(), GURL::EmptyGURL());
EXPECT_EQ(blank_site_instance->GetSiteURL(), GURL::EmptyGURL());
rvh_observers.AddObserverToRVH(blank_rvh);
@@ -1275,7 +1269,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
// Wait for the navigation in the new window to finish, if it hasn't.
WaitForLoadStop(new_shell->web_contents());
EXPECT_EQ("/files/title1.html",
- new_shell->web_contents()->GetLastCommittedURL().path());
+ new_shell->web_contents()->GetURL().path());
// Should have the same SiteInstance.
EXPECT_EQ(orig_site_instance, new_shell->web_contents()->GetSiteInstance());
@@ -1292,7 +1286,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
// Make sure it ends up at the right page.
WaitForLoadStop(shell()->web_contents());
EXPECT_EQ(https_server.GetURL("files/title1.html"),
- shell()->web_contents()->GetLastCommittedURL());
+ shell()->web_contents()->GetURL());
EXPECT_EQ(new_site_instance, shell()->web_contents()->GetSiteInstance());
}
diff --git a/chromium/content/browser/renderer_host/render_widget_host_browsertest.cc b/chromium/content/browser/renderer_host/render_widget_host_browsertest.cc
index 2a9ef56a7c9..9f11299b1a6 100644
--- a/chromium/content/browser/renderer_host/render_widget_host_browsertest.cc
+++ b/chromium/content/browser/renderer_host/render_widget_host_browsertest.cc
@@ -46,14 +46,8 @@ class RenderWidgetHostBrowserTest : public ContentBrowserTest {
base::FilePath test_dir_;
};
-// Disabled on Windows and CrOS because it is flaky: crbug.com/272379.
-#if defined(OS_WIN) || defined(OS_CHROMEOS)
-#define MAYBE_GetSnapshotFromRendererTest DISABLED_GetSnapshotFromRendererTest
-#else
-#define MAYBE_GetSnapshotFromRendererTest GetSnapshotFromRendererTest
-#endif
IN_PROC_BROWSER_TEST_F(RenderWidgetHostBrowserTest,
- MAYBE_GetSnapshotFromRendererTest) {
+ GetSnapshotFromRendererTest) {
base::RunLoop run_loop;
NavigateToURL(shell(), GURL(net::FilePathToFileURL(
diff --git a/chromium/content/browser/renderer_host/render_widget_host_view_aura.cc b/chromium/content/browser/renderer_host/render_widget_host_view_aura.cc
index 8c52017ed59..33ee9524e73 100644
--- a/chromium/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/chromium/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -2525,32 +2525,6 @@ void RenderWidgetHostViewAura::OnKeyEvent(ui::KeyEvent* event) {
host_->Shutdown();
}
} else {
- // Windows does not have a specific key code for AltGr and sends
- // left-Control and right-Alt when the AltGr key is pressed. Also
- // Windows translates AltGr modifier to Ctrl+Alt modifier. To be compatible
- // with this behavior, we re-write keyboard event from AltGr to Alt + Ctrl
- // key event here.
- if (event->key_code() == ui::VKEY_ALTGR) {
- // Synthesize Ctrl & Alt events.
- NativeWebKeyboardEvent ctrl_webkit_event(
- event->type(),
- false,
- ui::VKEY_CONTROL,
- event->flags(),
- ui::EventTimeForNow().InSecondsF());
- host_->ForwardKeyboardEvent(ctrl_webkit_event);
-
- NativeWebKeyboardEvent alt_webkit_event(
- event->type(),
- false,
- ui::VKEY_MENU,
- event->flags(),
- ui::EventTimeForNow().InSecondsF());
- host_->ForwardKeyboardEvent(alt_webkit_event);
- event->SetHandled();
- return;
- }
-
// We don't have to communicate with an input method here.
if (!event->HasNativeEvent()) {
NativeWebKeyboardEvent webkit_event(
diff --git a/chromium/content/browser/renderer_host/render_widget_host_view_guest.cc b/chromium/content/browser/renderer_host/render_widget_host_view_guest.cc
index 097468fb848..b49ca41054e 100644
--- a/chromium/content/browser/renderer_host/render_widget_host_view_guest.cc
+++ b/chromium/content/browser/renderer_host/render_widget_host_view_guest.cc
@@ -67,14 +67,22 @@ RenderWidgetHost* RenderWidgetHostViewGuest::GetRenderWidgetHost() const {
}
void RenderWidgetHostViewGuest::WasShown() {
- if (!is_hidden_)
+ // If the WebContents associated with us showed an interstitial page in the
+ // beginning, the teardown path might call WasShown() while |host_| is in
+ // the process of destruction. Avoid calling WasShown below in this case.
+ // TODO(lazyboy): We shouldn't be showing interstitial pages in guests in the
+ // first place: http://crbug.com/273089.
+ //
+ // |guest_| is NULL during test.
+ if (!is_hidden_ || (guest_ && guest_->is_in_destruction()))
return;
is_hidden_ = false;
host_->WasShown();
}
void RenderWidgetHostViewGuest::WasHidden() {
- if (is_hidden_)
+ // |guest_| is NULL during test.
+ if (is_hidden_ || (guest_ && guest_->is_in_destruction()))
return;
is_hidden_ = true;
host_->WasHidden();
diff --git a/chromium/content/browser/renderer_host/ui_events_helper.cc b/chromium/content/browser/renderer_host/ui_events_helper.cc
index afbbf990176..89242946cab 100644
--- a/chromium/content/browser/renderer_host/ui_events_helper.cc
+++ b/chromium/content/browser/renderer_host/ui_events_helper.cc
@@ -238,11 +238,6 @@ WebKit::WebGestureEvent MakeWebGestureEventFromUIEvent(
int EventFlagsToWebEventModifiers(int flags) {
int modifiers = 0;
- // Translate AltGr modifier to Ctrl+Alt first.
- if (flags & ui::EF_ALTGR_DOWN) {
- modifiers |= WebKit::WebInputEvent::ControlKey |
- WebKit::WebInputEvent::AltKey;
- }
if (flags & ui::EF_SHIFT_DOWN)
modifiers |= WebKit::WebInputEvent::ShiftKey;
if (flags & ui::EF_CONTROL_DOWN)
diff --git a/chromium/content/browser/session_history_browsertest.cc b/chromium/content/browser/session_history_browsertest.cc
index 966ccc7d941..d0bd95001a8 100644
--- a/chromium/content/browser/session_history_browsertest.cc
+++ b/chromium/content/browser/session_history_browsertest.cc
@@ -89,7 +89,7 @@ class SessionHistoryTest : public ContentBrowserTest {
}
GURL GetTabURL() {
- return shell()->web_contents()->GetLastCommittedURL();
+ return shell()->web_contents()->GetURL();
}
GURL GetURL(const std::string file) {
diff --git a/chromium/content/browser/speech/speech_recognition_browsertest.cc b/chromium/content/browser/speech/speech_recognition_browsertest.cc
index e532bc7a35b..8e4c7a84ed7 100644
--- a/chromium/content/browser/speech/speech_recognition_browsertest.cc
+++ b/chromium/content/browser/speech/speech_recognition_browsertest.cc
@@ -69,7 +69,7 @@ class SpeechRecognitionBrowserTest : public ContentBrowserTest {
// then sets the URL fragment as 'pass' if it received the expected string.
LoadAndStartSpeechRecognitionTest(filename);
- EXPECT_EQ("pass", shell()->web_contents()->GetLastCommittedURL().ref());
+ EXPECT_EQ("pass", shell()->web_contents()->GetURL().ref());
}
// ContentBrowserTest methods.
diff --git a/chromium/content/browser/streams/stream.cc b/chromium/content/browser/streams/stream.cc
index 6026df9e7c7..f5abe0276e8 100644
--- a/chromium/content/browser/streams/stream.cc
+++ b/chromium/content/browser/streams/stream.cc
@@ -90,9 +90,6 @@ void Stream::Finalize() {
Stream::StreamState Stream::ReadRawData(net::IOBuffer* buf,
int buf_size,
int* bytes_read) {
- DCHECK(buf);
- DCHECK(bytes_read);
-
*bytes_read = 0;
if (!data_.get()) {
data_length_ = 0;
diff --git a/chromium/content/browser/streams/stream_unittest.cc b/chromium/content/browser/streams/stream_unittest.cc
index c0077b7375b..36add1d649d 100644
--- a/chromium/content/browser/streams/stream_unittest.cc
+++ b/chromium/content/browser/streams/stream_unittest.cc
@@ -41,7 +41,7 @@ class StreamTest : public testing::Test {
class TestStreamReader : public StreamReadObserver {
public:
- TestStreamReader() : buffer_(new net::GrowableIOBuffer()), completed_(false) {
+ TestStreamReader() : buffer_(new net::GrowableIOBuffer()) {
}
virtual ~TestStreamReader() {}
@@ -50,22 +50,8 @@ class TestStreamReader : public StreamReadObserver {
scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kBufferSize));
int bytes_read = 0;
- while (true) {
- Stream::StreamState state =
- stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read);
- switch (state) {
- case Stream::STREAM_HAS_DATA:
- // TODO(tyoshino): Move these expectations to the beginning of Read()
- // method once Stream::Finalize() is fixed.
- EXPECT_FALSE(completed_);
- break;
- case Stream::STREAM_COMPLETE:
- completed_ = true;
- return;
- case Stream::STREAM_EMPTY:
- EXPECT_FALSE(completed_);
- return;
- }
+ while (stream->ReadRawData(buffer.get(), kBufferSize, &bytes_read) ==
+ Stream::STREAM_HAS_DATA) {
size_t old_capacity = buffer_->capacity();
buffer_->SetCapacity(old_capacity + bytes_read);
memcpy(buffer_->StartOfBuffer() + old_capacity,
@@ -79,13 +65,8 @@ class TestStreamReader : public StreamReadObserver {
scoped_refptr<net::GrowableIOBuffer> buffer() { return buffer_; }
- bool completed() const {
- return completed_;
- }
-
private:
scoped_refptr<net::GrowableIOBuffer> buffer_;
- bool completed_;
};
class TestStreamWriter : public StreamWriteObserver {
@@ -156,38 +137,14 @@ TEST_F(StreamTest, Stream) {
scoped_refptr<net::IOBuffer> buffer(NewIOBuffer(kBufferSize));
writer.Write(stream.get(), buffer, kBufferSize);
stream->Finalize();
+ reader.Read(stream.get());
base::MessageLoop::current()->RunUntilIdle();
- EXPECT_TRUE(reader.completed());
ASSERT_EQ(reader.buffer()->capacity(), kBufferSize);
for (int i = 0; i < kBufferSize; i++)
EXPECT_EQ(buffer->data()[i], reader.buffer()->data()[i]);
}
-// Test that even if a reader receives an empty buffer, once TransferData()
-// method is called on it with |source_complete| = true, following Read() calls
-// on it never returns STREAM_EMPTY. Together with StreamTest.Stream above, this
-// guarantees that Reader::Read() call returns only STREAM_HAS_DATA
-// or STREAM_COMPLETE in |data_available_callback_| call corresponding to
-// Writer::Close().
-TEST_F(StreamTest, ClosedReaderDoesNotReturnStreamEmpty) {
- TestStreamReader reader;
- TestStreamWriter writer;
-
- GURL url("blob://stream");
- scoped_refptr<Stream> stream(
- new Stream(registry_.get(), &writer, url));
- EXPECT_TRUE(stream->SetReadObserver(&reader));
-
- const int kBufferSize = 0;
- scoped_refptr<net::IOBuffer> buffer(NewIOBuffer(kBufferSize));
- stream->AddData(buffer, kBufferSize);
- stream->Finalize();
- base::MessageLoop::current()->RunUntilIdle();
- EXPECT_TRUE(reader.completed());
- EXPECT_EQ(0, reader.buffer()->capacity());
-}
-
TEST_F(StreamTest, GetStream) {
TestStreamWriter writer;
diff --git a/chromium/content/browser/streams/stream_url_request_job.cc b/chromium/content/browser/streams/stream_url_request_job.cc
index 0965178de2c..e36c5d49ae6 100644
--- a/chromium/content/browser/streams/stream_url_request_job.cc
+++ b/chromium/content/browser/streams/stream_url_request_job.cc
@@ -39,37 +39,19 @@ StreamURLRequestJob::~StreamURLRequestJob() {
void StreamURLRequestJob::OnDataAvailable(Stream* stream) {
// Clear the IO_PENDING status.
SetStatus(net::URLRequestStatus());
- // Do nothing if pending_buffer_ is empty, i.e. there's no ReadRawData()
- // operation waiting for IO completion.
- if (!pending_buffer_.get())
- return;
-
- // pending_buffer_ is set to the IOBuffer instance provided to ReadRawData()
- // by URLRequestJob.
-
- int bytes_read;
- switch (stream_->ReadRawData(
- pending_buffer_.get(), pending_buffer_size_, &bytes_read)) {
- case Stream::STREAM_HAS_DATA:
- DCHECK_GT(bytes_read, 0);
- break;
- case Stream::STREAM_COMPLETE:
- // Ensure this. Calling NotifyReadComplete call with 0 signals
- // completion.
- bytes_read = 0;
- break;
- case Stream::STREAM_EMPTY:
- NOTREACHED();
- break;
+ if (pending_buffer_.get()) {
+ int bytes_read;
+ stream_->ReadRawData(
+ pending_buffer_.get(), pending_buffer_size_, &bytes_read);
+
+ // Clear the buffers before notifying the read is complete, so that it is
+ // safe for the observer to read.
+ pending_buffer_ = NULL;
+ pending_buffer_size_ = 0;
+
+ total_bytes_read_ += bytes_read;
+ NotifyReadComplete(bytes_read);
}
-
- // Clear the buffers before notifying the read is complete, so that it is
- // safe for the observer to read.
- pending_buffer_ = NULL;
- pending_buffer_size_ = 0;
-
- total_bytes_read_ += bytes_read;
- NotifyReadComplete(bytes_read);
}
// net::URLRequestJob methods.
@@ -92,7 +74,6 @@ bool StreamURLRequestJob::ReadRawData(net::IOBuffer* buf,
if (request_failed_)
return true;
- DCHECK(buf);
DCHECK(bytes_read);
int to_read = buf_size;
if (max_range_ && to_read) {
@@ -186,6 +167,7 @@ void StreamURLRequestJob::NotifyFailure(int error_code) {
// TODO(zork): Share these with BlobURLRequestJob.
net::HttpStatusCode status_code = net::HTTP_INTERNAL_SERVER_ERROR;
+ std::string status_txt;
switch (error_code) {
case net::ERR_ACCESS_DENIED:
status_code = net::HTTP_FORBIDDEN;
diff --git a/chromium/content/browser/web_contents/navigation_controller_impl.cc b/chromium/content/browser/web_contents/navigation_controller_impl.cc
index c3e9140b48f..2c0596d9c83 100644
--- a/chromium/content/browser/web_contents/navigation_controller_impl.cc
+++ b/chromium/content/browser/web_contents/navigation_controller_impl.cc
@@ -1623,12 +1623,15 @@ void NavigationControllerImpl::FinishRestore(int selected_index,
}
void NavigationControllerImpl::DiscardNonCommittedEntriesInternal() {
+ DiscardPendingEntry();
+ DiscardTransientEntry();
+}
+
+void NavigationControllerImpl::DiscardPendingEntry() {
if (pending_entry_index_ == -1)
delete pending_entry_;
pending_entry_ = NULL;
pending_entry_index_ = -1;
-
- DiscardTransientEntry();
}
void NavigationControllerImpl::DiscardTransientEntry() {
diff --git a/chromium/content/browser/web_contents/navigation_controller_impl.h b/chromium/content/browser/web_contents/navigation_controller_impl.h
index bef3be2202f..2f0d71ea966 100644
--- a/chromium/content/browser/web_contents/navigation_controller_impl.h
+++ b/chromium/content/browser/web_contents/navigation_controller_impl.h
@@ -289,10 +289,13 @@ class CONTENT_EXPORT NavigationControllerImpl
// Removes the entry at |index|, as long as it is not the current entry.
void RemoveEntryAtIndexInternal(int index);
- // Discards the pending and transient entries.
+ // Discards both the pending and transient entries.
void DiscardNonCommittedEntriesInternal();
- // Discards the transient entry.
+ // Discards only the pending entry.
+ void DiscardPendingEntry();
+
+ // Discards only the transient entry.
void DiscardTransientEntry();
// If we have the maximum number of entries, remove the oldest one in
diff --git a/chromium/content/browser/web_contents/navigation_controller_impl_unittest.cc b/chromium/content/browser/web_contents/navigation_controller_impl_unittest.cc
index 7a0b03b2bf0..df6a47c1b13 100644
--- a/chromium/content/browser/web_contents/navigation_controller_impl_unittest.cc
+++ b/chromium/content/browser/web_contents/navigation_controller_impl_unittest.cc
@@ -1008,10 +1008,10 @@ TEST_F(NavigationControllerTest, LoadURL_RedirectAbortDoesntShowPendingURL) {
ViewHostMsg_DidFailProvisionalLoadWithError(0, // routing_id
params));
- // This should not clear the pending entry or notify of a navigation state
- // change.
+ // Because the pending entry is renderer initiated and not visible, we
+ // clear it when it fails.
EXPECT_EQ(-1, controller.GetPendingEntryIndex());
- EXPECT_TRUE(controller.GetPendingEntry());
+ EXPECT_FALSE(controller.GetPendingEntry());
EXPECT_EQ(0, controller.GetLastCommittedEntryIndex());
EXPECT_EQ(0, delegate->navigation_state_change_count());
diff --git a/chromium/content/browser/web_contents/touch_editable_impl_aura.cc b/chromium/content/browser/web_contents/touch_editable_impl_aura.cc
index fb430d092e0..d38f5f5c7f6 100644
--- a/chromium/content/browser/web_contents/touch_editable_impl_aura.cc
+++ b/chromium/content/browser/web_contents/touch_editable_impl_aura.cc
@@ -53,7 +53,7 @@ void TouchEditableImplAura::UpdateEditingController() {
// there is non-zero selection on the page. And the current event is a
// gesture event (we dont want to show handles if the user is selecting
// using mouse or keyboard).
- if (selection_gesture_in_process_ &&
+ if (selection_gesture_in_process_ && !scroll_in_progress_ &&
selection_anchor_rect_ != selection_focus_rect_)
StartTouchEditing();
@@ -66,6 +66,29 @@ void TouchEditableImplAura::UpdateEditingController() {
}
}
+void TouchEditableImplAura::OverscrollStarted() {
+ overscroll_in_progress_ = true;
+}
+
+void TouchEditableImplAura::OverscrollCompleted() {
+ // We might receive multiple OverscrollStarted() and OverscrollCompleted()
+ // during the same scroll session (for example, when the scroll direction
+ // changes). We want to show the handles only when:
+ // 1. Overscroll has completed
+ // 2. Scrolling session is over, i.e. we have received ET_GESTURE_SCROLL_END.
+ // 3. If we had hidden the handles when scrolling started
+ // 4. If there is still a need to show handles (there is a non-empty selection
+ // or non-NONE |text_input_type_|)
+ if (overscroll_in_progress_ && !scroll_in_progress_ &&
+ handles_hidden_due_to_scroll_ &&
+ (selection_anchor_rect_ != selection_focus_rect_ ||
+ text_input_type_ != ui::TEXT_INPUT_TYPE_NONE)) {
+ StartTouchEditing();
+ UpdateEditingController();
+ }
+ overscroll_in_progress_ = false;
+}
+
////////////////////////////////////////////////////////////////////////////////
// TouchEditableImplAura, RenderWidgetHostViewAura::TouchEditingClient
// implementation:
@@ -145,18 +168,24 @@ bool TouchEditableImplAura::HandleInputEvent(const ui::Event* event) {
// when scrolling ends. So we set |handles_hidden_due_to_scroll_| so that
// we can re-start touch editing when we call |UpdateEditingController()|
// on scroll end gesture.
+ scroll_in_progress_ = true;
handles_hidden_due_to_scroll_ = false;
if (touch_selection_controller_)
handles_hidden_due_to_scroll_ = true;
EndTouchEditing();
break;
case ui::ET_GESTURE_SCROLL_END:
- if (handles_hidden_due_to_scroll_ &&
+ // Scroll has ended, but we might still be in overscroll animation.
+ if (handles_hidden_due_to_scroll_ && !overscroll_in_progress_ &&
(selection_anchor_rect_ != selection_focus_rect_ ||
text_input_type_ != ui::TEXT_INPUT_TYPE_NONE)) {
StartTouchEditing();
UpdateEditingController();
}
+ // fall through to reset |scroll_in_progress_|.
+ case ui::ET_SCROLL_FLING_START:
+ selection_gesture_in_process_ = false;
+ scroll_in_progress_ = false;
break;
default:
break;
@@ -330,6 +359,8 @@ TouchEditableImplAura::TouchEditableImplAura()
rwhva_(NULL),
selection_gesture_in_process_(false),
handles_hidden_due_to_scroll_(false),
+ scroll_in_progress_(false),
+ overscroll_in_progress_(false),
is_tap_on_focused_textfield_(false) {
}
@@ -338,7 +369,11 @@ void TouchEditableImplAura::Cleanup() {
rwhva_->set_touch_editing_client(NULL);
rwhva_ = NULL;
}
+ text_input_type_ = ui::TEXT_INPUT_TYPE_NONE;
touch_selection_controller_.reset();
+ handles_hidden_due_to_scroll_ = false;
+ scroll_in_progress_ = false;
+ overscroll_in_progress_ = false;
}
} // namespace content
diff --git a/chromium/content/browser/web_contents/touch_editable_impl_aura.h b/chromium/content/browser/web_contents/touch_editable_impl_aura.h
index c31d86ae7a7..7f1ea845512 100644
--- a/chromium/content/browser/web_contents/touch_editable_impl_aura.h
+++ b/chromium/content/browser/web_contents/touch_editable_impl_aura.h
@@ -37,6 +37,9 @@ class CONTENT_EXPORT TouchEditableImplAura
// depending on the current selection and cursor state.
void UpdateEditingController();
+ void OverscrollStarted();
+ void OverscrollCompleted();
+
// Overridden from RenderWidgetHostViewAura::TouchEditingClient.
virtual void StartTouchEditing() OVERRIDE;
virtual void EndTouchEditing() OVERRIDE;
@@ -87,8 +90,16 @@ class CONTENT_EXPORT TouchEditableImplAura
// change in selection (long press, double tap or triple tap).
bool selection_gesture_in_process_;
+ // Set to true if handles are hidden when user is scrolling. Used to determine
+ // whether to re-show handles after a scrolling session.
bool handles_hidden_due_to_scroll_;
+ // Keeps track of when the user is scrolling.
+ bool scroll_in_progress_;
+
+ // Set to true when the page starts an overscroll.
+ bool overscroll_in_progress_;
+
// Used to track if the current tap gesture is on a focused textfield.
bool is_tap_on_focused_textfield_;
diff --git a/chromium/content/browser/web_contents/web_contents_drag_win.cc b/chromium/content/browser/web_contents/web_contents_drag_win.cc
index cb24210c3b9..68e27884475 100644
--- a/chromium/content/browser/web_contents/web_contents_drag_win.cc
+++ b/chromium/content/browser/web_contents/web_contents_drag_win.cc
@@ -163,7 +163,7 @@ void WebContentsDragWin::StartDragging(const DropData& drop_data,
drag_source_ = new WebDragSource(source_window_, web_contents_);
- const GURL& page_url = web_contents_->GetLastCommittedURL();
+ const GURL& page_url = web_contents_->GetURL();
const std::string& page_encoding = web_contents_->GetEncoding();
// If it is not drag-out, do the drag-and-drop in the current UI thread.
diff --git a/chromium/content/browser/web_contents/web_contents_impl.cc b/chromium/content/browser/web_contents/web_contents_impl.cc
index 157a17d6a8e..2d19b65e479 100644
--- a/chromium/content/browser/web_contents/web_contents_impl.cc
+++ b/chromium/content/browser/web_contents/web_contents_impl.cc
@@ -1422,6 +1422,23 @@ void WebContentsImpl::CreateNewWindow(
int main_frame_route_id,
const ViewHostMsg_CreateWindow_Params& params,
SessionStorageNamespace* session_storage_namespace) {
+ if (delegate_ &&
+ !delegate_->ShouldCreateWebContents(this,
+ route_id,
+ params.window_container_type,
+ params.frame_name,
+ params.target_url,
+ params.referrer,
+ params.disposition,
+ params.features,
+ params.user_gesture,
+ params.opener_suppressed)) {
+ GetRenderViewHost()->GetProcess()->ResumeRequestsForView(route_id);
+ GetRenderViewHost()->GetProcess()->ResumeRequestsForView(
+ main_frame_route_id);
+ return;
+ }
+
// We usually create the new window in the same BrowsingInstance (group of
// script-related windows), by passing in the current SiteInstance. However,
// if the opener is being suppressed (in a non-guest), we create a new
@@ -1433,6 +1450,12 @@ void WebContentsImpl::CreateNewWindow(
SiteInstance::CreateForURL(GetBrowserContext(), params.target_url) :
GetSiteInstance();
+ // Create the new web contents. This will automatically create the new
+ // WebContentsView. In the future, we may want to create the view separately.
+ WebContentsImpl* new_contents =
+ new WebContentsImpl(GetBrowserContext(),
+ params.opener_suppressed ? NULL : this);
+
// We must assign the SessionStorageNamespace before calling Init().
//
// http://crbug.com/142685
@@ -1447,27 +1470,6 @@ void WebContentsImpl::CreateNewWindow(
SessionStorageNamespaceImpl* session_storage_namespace_impl =
static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace);
CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context));
-
- if (delegate_ &&
- !delegate_->ShouldCreateWebContents(this,
- route_id,
- params.window_container_type,
- params.frame_name,
- params.target_url,
- partition_id,
- session_storage_namespace)) {
- GetRenderViewHost()->GetProcess()->ResumeRequestsForView(route_id);
- GetRenderViewHost()->GetProcess()->ResumeRequestsForView(
- main_frame_route_id);
- return;
- }
-
- // Create the new web contents. This will automatically create the new
- // WebContentsView. In the future, we may want to create the view separately.
- WebContentsImpl* new_contents =
- new WebContentsImpl(GetBrowserContext(),
- params.opener_suppressed ? NULL : this);
-
new_contents->GetController().SetSessionStorageNamespace(
partition_id,
session_storage_namespace);
@@ -2241,13 +2243,21 @@ void WebContentsImpl::DidFailProvisionalLoadWithError(
return;
}
- // Do not clear the pending entry if one exists, so that the user's typed
- // URL is not lost when a navigation fails or is aborted. We'll allow
- // the view to clear the pending entry and typed URL if the user requests.
-
render_manager_.RendererAbortedProvisionalLoad(render_view_host);
}
+ // Do not usually clear the pending entry if one exists, so that the user's
+ // typed URL is not lost when a navigation fails or is aborted. However, in
+ // cases that we don't show the pending entry (e.g., renderer-initiated
+ // navigations in an existing tab), we don't keep it around. That prevents
+ // spoofs on in-page navigations that don't go through
+ // DidStartProvisionalLoadForFrame.
+ // In general, we allow the view to clear the pending entry and typed URL if
+ // the user requests (e.g., hitting Escape with focus in the address bar).
+ // Note: don't touch the transient entry, since an interstitial may exist.
+ if (controller_.GetPendingEntry() != controller_.GetVisibleEntry())
+ controller_.DiscardPendingEntry();
+
FOR_EACH_OBSERVER(WebContentsObserver,
observers_,
DidFailProvisionalLoad(params.frame_id,
@@ -2863,16 +2873,14 @@ void WebContentsImpl::RenderViewCreated(RenderViewHost* render_view_host) {
NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED,
Source<WebContents>(this),
Details<RenderViewHost>(render_view_host));
- NavigationEntry* entry = controller_.GetActiveEntry();
- if (!entry)
- return;
// When we're creating views, we're still doing initial setup, so we always
// use the pending Web UI rather than any possibly existing committed one.
if (render_manager_.pending_web_ui())
render_manager_.pending_web_ui()->RenderViewCreated(render_view_host);
- if (entry->IsViewSourceMode()) {
+ NavigationEntry* entry = controller_.GetActiveEntry();
+ if (entry && entry->IsViewSourceMode()) {
// Put the renderer in view source mode.
render_view_host->Send(
new ViewMsg_EnableViewSourceMode(render_view_host->GetRoutingID()));
@@ -3652,6 +3660,13 @@ bool WebContentsImpl::CreateRenderViewForRenderManager(
return true;
}
+#if defined(OS_ANDROID)
+bool WebContentsImpl::CreateRenderViewForInitialEmptyDocument() {
+ return CreateRenderViewForRenderManager(GetRenderViewHost(),
+ MSG_ROUTING_NONE);
+}
+#endif
+
void WebContentsImpl::OnDialogClosed(RenderViewHost* rvh,
IPC::Message* reply_msg,
bool success,
diff --git a/chromium/content/browser/web_contents/web_contents_impl.h b/chromium/content/browser/web_contents/web_contents_impl.h
index 21ec675da5f..a5eaf7ddcbe 100644
--- a/chromium/content/browser/web_contents/web_contents_impl.h
+++ b/chromium/content/browser/web_contents/web_contents_impl.h
@@ -153,6 +153,13 @@ class CONTENT_EXPORT WebContentsImpl
JavaBridgeDispatcherHostManager* java_bridge_dispatcher_host_manager() const {
return java_bridge_dispatcher_host_manager_.get();
}
+
+ // In Android WebView, the RenderView needs created even there is no
+ // navigation entry, this allows Android WebViews to use
+ // javascript: URLs that load into the DOMWindow before the first page
+ // load. This is not safe to do in any context that a web page could get a
+ // reference to the DOMWindow before the first page load.
+ bool CreateRenderViewForInitialEmptyDocument();
#endif
// Expose the render manager for testing.
diff --git a/chromium/content/browser/web_contents/web_contents_impl_browsertest.cc b/chromium/content/browser/web_contents/web_contents_impl_browsertest.cc
index 0cb9fe258ea..5ea20a6affa 100644
--- a/chromium/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/chromium/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -119,6 +119,33 @@ IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
EXPECT_EQ(&shell()->web_contents()->GetController(),
load_observer.controller_);
}
+// Test that a renderer-initiated navigation to an invalid URL does not leave
+// around a pending entry that could be used in a URL spoof. We test this in
+// a browser test because our unit test framework incorrectly calls
+// DidStartProvisionalLoadForFrame for in-page navigations.
+// See http://crbug.com/280512.
+IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
+ ClearNonVisiblePendingOnFail) {
+ ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
+
+ NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html"));
+
+ // Navigate to an invalid URL and make sure it doesn't leave a pending entry.
+ LoadStopNotificationObserver load_observer1(
+ &shell()->web_contents()->GetController());
+ ASSERT_TRUE(ExecuteScript(shell()->web_contents(),
+ "window.location.href=\"nonexistent:12121\";"));
+ load_observer1.Wait();
+ EXPECT_FALSE(shell()->web_contents()->GetController().GetPendingEntry());
+
+ LoadStopNotificationObserver load_observer2(
+ &shell()->web_contents()->GetController());
+ ASSERT_TRUE(ExecuteScript(shell()->web_contents(),
+ "window.location.href=\"#foo\";"));
+ load_observer2.Wait();
+ EXPECT_EQ(embedded_test_server()->GetURL("/title1.html#foo"),
+ shell()->web_contents()->GetVisibleURL());
+}
// Test that the browser receives the proper frame attach/detach messages from
// the renderer and builds proper frame tree.
diff --git a/chromium/content/browser/web_contents/web_contents_view_aura.cc b/chromium/content/browser/web_contents/web_contents_view_aura.cc
index 043efca119a..013edc7fe3e 100644
--- a/chromium/content/browser/web_contents/web_contents_view_aura.cc
+++ b/chromium/content/browser/web_contents/web_contents_view_aura.cc
@@ -1362,6 +1362,9 @@ void WebContentsViewAura::OnOverscrollModeChange(OverscrollMode old_mode,
// Reset any in-progress overscroll animation first.
ResetOverscrollTransform();
+ if (new_mode != OVERSCROLL_NONE && touch_editable_)
+ touch_editable_->OverscrollStarted();
+
if (new_mode == OVERSCROLL_NONE ||
!GetContentNativeView() ||
((new_mode == OVERSCROLL_EAST || new_mode == OVERSCROLL_WEST) &&
@@ -1402,6 +1405,9 @@ void WebContentsViewAura::OnImplicitAnimationsCompleted() {
completed_overscroll_gesture_)) {
PrepareOverscrollNavigationOverlay();
web_contents_->GetController().GoBack();
+ } else {
+ if (touch_editable_)
+ touch_editable_->OverscrollCompleted();
}
aura::Window* content = GetContentNativeView();
diff --git a/chromium/content/browser/web_contents/web_drag_source_mac.mm b/chromium/content/browser/web_contents/web_drag_source_mac.mm
index 6a31fe26c46..0b44fd47930 100644
--- a/chromium/content/browser/web_contents/web_drag_source_mac.mm
+++ b/chromium/content/browser/web_contents/web_drag_source_mac.mm
@@ -10,6 +10,7 @@
#include "base/files/file_path.h"
#include "base/mac/mac_logging.h"
#include "base/mac/mac_util.h"
+#include "base/mac/scoped_aedesc.h"
#include "base/pickle.h"
#include "base/strings/string_util.h"
#include "base/strings/sys_string_conversions.h"
@@ -120,6 +121,87 @@ NSString* GetDropLocation(NSPasteboard* pboard) {
return drop_path;
}
+void SelectFileInFinder(const base::FilePath& file_path) {
+ DCHECK([NSThread isMainThread]);
+
+ // Create the target of this AppleEvent, the Finder.
+ base::mac::ScopedAEDesc<AEAddressDesc> address;
+ const OSType finder_creator_code = 'MACS';
+ OSErr status = AECreateDesc(typeApplSignature, // type
+ &finder_creator_code, // data
+ sizeof(finder_creator_code), // dataSize
+ address.OutPointer()); // result
+ if (status != noErr) {
+ OSSTATUS_LOG(WARNING, status) << "Could not create SelectFile() AE target";
+ return;
+ }
+
+ // Build the AppleEvent data structure that instructs Finder to select files.
+ base::mac::ScopedAEDesc<AppleEvent> the_event;
+ status = AECreateAppleEvent(kAEMiscStandards, // theAEEventClass
+ kAESelect, // theAEEventID
+ address, // target
+ kAutoGenerateReturnID, // returnID
+ kAnyTransactionID, // transactionID
+ the_event.OutPointer()); // result
+ if (status != noErr) {
+ OSSTATUS_LOG(WARNING, status) << "Could not create SelectFile() AE event";
+ return;
+ }
+
+ // Create the list of files (only ever one) to select.
+ base::mac::ScopedAEDesc<AEDescList> file_list;
+ status = AECreateList(NULL, // factoringPtr
+ 0, // factoredSize
+ false, // isRecord
+ file_list.OutPointer()); // resultList
+ if (status != noErr) {
+ OSSTATUS_LOG(WARNING, status)
+ << "Could not create SelectFile() AE file list";
+ return;
+ }
+
+ // Add the single path to the file list.
+ NSURL* url = [NSURL fileURLWithPath:SysUTF8ToNSString(file_path.value())];
+ base::ScopedCFTypeRef<CFDataRef> url_data(
+ CFURLCreateData(kCFAllocatorDefault, base::mac::NSToCFCast(url),
+ kCFStringEncodingUTF8, true));
+ status = AEPutPtr(file_list.OutPointer(), // theAEDescList
+ 0, // index
+ typeFileURL, // typeCode
+ CFDataGetBytePtr(url_data), // dataPtr
+ CFDataGetLength(url_data)); // dataSize
+ if (status != noErr) {
+ OSSTATUS_LOG(WARNING, status)
+ << "Could not add file path to AE list in SelectFile()";
+ return;
+ }
+
+ // Attach the file list to the AppleEvent.
+ status = AEPutParamDesc(the_event.OutPointer(), // theAppleEvent
+ keyDirectObject, // theAEKeyword
+ file_list); // theAEDesc
+ if (status != noErr) {
+ OSSTATUS_LOG(WARNING, status)
+ << "Could not put the AE file list the path in SelectFile()";
+ return;
+ }
+
+ // Send the actual event. Do not care about the reply.
+ base::mac::ScopedAEDesc<AppleEvent> reply;
+ status = AESend(the_event, // theAppleEvent
+ reply.OutPointer(), // reply
+ kAENoReply + kAEAlwaysInteract, // sendMode
+ kAENormalPriority, // sendPriority
+ kAEDefaultTimeout, // timeOutInTicks
+ NULL, // idleProc
+ NULL); // filterProc
+ if (status != noErr) {
+ OSSTATUS_LOG(WARNING, status)
+ << "Could not send AE to Finder in SelectFile()";
+ }
+}
+
} // namespace
@@ -383,8 +465,7 @@ NSString* GetDropLocation(NSPasteboard* pboard) {
filePath,
fileStream.Pass(),
downloadURL_,
- content::Referrer(contents_->GetLastCommittedURL(),
- dropData_->referrer_policy),
+ content::Referrer(contents_->GetURL(), dropData_->referrer_policy),
contents_->GetEncoding(),
contents_));
@@ -399,6 +480,7 @@ NSString* GetDropLocation(NSPasteboard* pboard) {
*dropData_,
base::Passed(&fileStream)));
}
+ SelectFileInFinder(filePath);
}
- (void)fillPasteboard {
diff --git a/chromium/content/child/fileapi/webfilesystem_impl.cc b/chromium/content/child/fileapi/webfilesystem_impl.cc
index ccb902e72f0..052bce489c9 100644
--- a/chromium/content/child/fileapi/webfilesystem_impl.cc
+++ b/chromium/content/child/fileapi/webfilesystem_impl.cc
@@ -9,11 +9,11 @@
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/message_loop/message_loop_proxy.h"
-#include "base/strings/utf_string_conversions.h"
#include "base/synchronization/waitable_event.h"
#include "base/threading/thread_local.h"
#include "content/child/child_thread.h"
#include "content/child/fileapi/file_system_dispatcher.h"
+#include "content/child/fileapi/webfilesystem_callback_adapters.h"
#include "content/child/fileapi/webfilewriter_impl.h"
#include "content/common/fileapi/file_system_messages.h"
#include "third_party/WebKit/public/platform/WebFileInfo.h"
@@ -43,9 +43,6 @@ class CallbacksMap;
base::LazyInstance<base::ThreadLocalPointer<CallbacksMap> >::Leaky
g_callbacks_map_tls = LAZY_INSTANCE_INITIALIZER;
-base::LazyInstance<base::ThreadLocalPointer<WebFileSystemImpl> >::Leaky
- g_webfilesystem_tls = LAZY_INSTANCE_INITIALIZER;
-
// TODO(kinuko): Integrate this into WebFileSystemImpl when blink side
// becomes ready to make WebFileSystemImpl thread-local.
class CallbacksMap : public WorkerTaskRunner::Observer {
@@ -196,21 +193,6 @@ void CallbackFileSystemCallbacks(
base::Bind(&RunCallbacks<Method, Params>, callbacks_id, method, params));
}
-//-----------------------------------------------------------------------------
-// Callback adapters. Callbacks must be called on the original calling thread,
-// so these callback adapters relay back the results to the calling thread
-// if necessary.
-
-void OpenFileSystemCallbackAdapter(
- int thread_id, int callbacks_id,
- WaitableCallbackResults* waitable_results,
- const std::string& name, const GURL& root) {
- CallbackFileSystemCallbacks(
- thread_id, callbacks_id, waitable_results,
- &WebFileSystemCallbacks::didOpenFileSystem,
- MakeTuple(UTF8ToUTF16(name), root));
-}
-
void StatusCallbackAdapter(int thread_id, int callbacks_id,
WaitableCallbackResults* waitable_results,
base::PlatformFileError error) {
@@ -330,77 +312,11 @@ void CreateSnapshotFileCallbackAdapter(
} // namespace
-//-----------------------------------------------------------------------------
-// WebFileSystemImpl
-
-WebFileSystemImpl* WebFileSystemImpl::ThreadSpecificInstance(
- base::MessageLoopProxy* main_thread_loop) {
- if (g_webfilesystem_tls.Pointer()->Get())
- return g_webfilesystem_tls.Pointer()->Get();
- WebFileSystemImpl* filesystem = new WebFileSystemImpl(main_thread_loop);
- if (WorkerTaskRunner::Instance()->CurrentWorkerId())
- WorkerTaskRunner::Instance()->AddStopObserver(filesystem);
- return filesystem;
-}
-
-void WebFileSystemImpl::DeleteThreadSpecificInstance() {
- DCHECK(!WorkerTaskRunner::Instance()->CurrentWorkerId());
- if (g_webfilesystem_tls.Pointer()->Get())
- delete g_webfilesystem_tls.Pointer()->Get();
+WebFileSystemImpl::~WebFileSystemImpl() {
}
WebFileSystemImpl::WebFileSystemImpl(base::MessageLoopProxy* main_thread_loop)
: main_thread_loop_(main_thread_loop) {
- g_webfilesystem_tls.Pointer()->Set(this);
-}
-
-WebFileSystemImpl::~WebFileSystemImpl() {
- g_webfilesystem_tls.Pointer()->Set(NULL);
-}
-
-void WebFileSystemImpl::OnWorkerRunLoopStopped() {
- delete this;
-}
-
-void WebFileSystemImpl::openFileSystem(
- const WebKit::WebURL& storage_partition,
- WebKit::WebFileSystemType type,
- bool create,
- WebKit::WebFileSystemCallbacks* callbacks) {
- int callbacks_id = CallbacksMap::GetOrCreate()->RegisterCallbacks(callbacks);
- WaitableCallbackResults* waitable_results =
- WaitableCallbackResults::MaybeCreate(callbacks);
- CallDispatcherOnMainThread(
- main_thread_loop_.get(),
- &FileSystemDispatcher::OpenFileSystem,
- MakeTuple(GURL(storage_partition),
- static_cast<fileapi::FileSystemType>(type),
- 0 /* size (not used) */, create,
- base::Bind(&OpenFileSystemCallbackAdapter,
- CurrentWorkerId(), callbacks_id,
- base::Unretained(waitable_results)),
- base::Bind(&StatusCallbackAdapter,
- CurrentWorkerId(), callbacks_id,
- base::Unretained(waitable_results))),
- make_scoped_ptr(waitable_results));
-}
-
-void WebFileSystemImpl::deleteFileSystem(
- const WebKit::WebURL& storage_partition,
- WebKit::WebFileSystemType type,
- WebKit::WebFileSystemCallbacks* callbacks) {
- int callbacks_id = CallbacksMap::GetOrCreate()->RegisterCallbacks(callbacks);
- WaitableCallbackResults* waitable_results =
- WaitableCallbackResults::MaybeCreate(callbacks);
- CallDispatcherOnMainThread(
- main_thread_loop_.get(),
- &FileSystemDispatcher::DeleteFileSystem,
- MakeTuple(GURL(storage_partition),
- static_cast<fileapi::FileSystemType>(type),
- base::Bind(&StatusCallbackAdapter,
- CurrentWorkerId(), callbacks_id,
- base::Unretained(waitable_results))),
- make_scoped_ptr(waitable_results));
}
void WebFileSystemImpl::move(
diff --git a/chromium/content/child/fileapi/webfilesystem_impl.h b/chromium/content/child/fileapi/webfilesystem_impl.h
index eec16e194cd..d9a25840cf1 100644
--- a/chromium/content/child/fileapi/webfilesystem_impl.h
+++ b/chromium/content/child/fileapi/webfilesystem_impl.h
@@ -9,7 +9,6 @@
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "third_party/WebKit/public/platform/WebFileSystem.h"
-#include "webkit/child/worker_task_runner.h"
namespace base {
class MessageLoopProxy;
@@ -23,35 +22,12 @@ class WebFileWriterClient;
namespace content {
-class WebFileSystemImpl
- : public WebKit::WebFileSystem,
- public webkit_glue::WorkerTaskRunner::Observer {
+class WebFileSystemImpl : public WebKit::WebFileSystem {
public:
- // Returns thread-specific instance.
- static WebFileSystemImpl* ThreadSpecificInstance(
- base::MessageLoopProxy* main_thread_loop);
-
- // Deletes thread-specific instance (if exists). For workers it deletes
- // itself in OnWorkerRunLoopStopped(), but for an instance created on the
- // main thread this method must be called.
- static void DeleteThreadSpecificInstance();
-
explicit WebFileSystemImpl(base::MessageLoopProxy* main_thread_loop);
virtual ~WebFileSystemImpl();
- // webkit_glue::WorkerTaskRunner::Observer implementation.
- virtual void OnWorkerRunLoopStopped() OVERRIDE;
-
// WebFileSystem implementation.
- virtual void openFileSystem(
- const WebKit::WebURL& storage_partition,
- const WebKit::WebFileSystemType type,
- bool create,
- WebKit::WebFileSystemCallbacks*);
- virtual void deleteFileSystem(
- const WebKit::WebURL& storage_partition,
- const WebKit::WebFileSystemType type,
- WebKit::WebFileSystemCallbacks*);
virtual void move(
const WebKit::WebURL& src_path,
const WebKit::WebURL& dest_path,
diff --git a/chromium/content/child/fileapi/webfilewriter_impl.h b/chromium/content/child/fileapi/webfilewriter_impl.h
index 69b979b020d..e7b49b67b3c 100644
--- a/chromium/content/child/fileapi/webfilewriter_impl.h
+++ b/chromium/content/child/fileapi/webfilewriter_impl.h
@@ -8,12 +8,12 @@
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop/message_loop_proxy.h"
-#include "content/child/fileapi/webfilewriter_base.h"
+#include "webkit/renderer/fileapi/webfilewriter_base.h"
namespace content {
// An implementation of WebFileWriter for use in chrome renderers and workers.
-class WebFileWriterImpl : public WebFileWriterBase,
+class WebFileWriterImpl : public fileapi::WebFileWriterBase,
public base::SupportsWeakPtr<WebFileWriterImpl> {
public:
enum Type {
diff --git a/chromium/content/child/runtime_features.cc b/chromium/content/child/runtime_features.cc
index 25804aeee0a..120c12886af 100644
--- a/chromium/content/child/runtime_features.cc
+++ b/chromium/content/child/runtime_features.cc
@@ -29,7 +29,10 @@ static void SetRuntimeFeatureDefaultsForPlatform() {
#endif // !defined(GOOGLE_TV)
bool enable_webaudio = false;
#if defined(ARCH_CPU_ARMEL)
+ // WebAudio needs Android MediaCodec API that was introduced in
+ // JellyBean, and also currently needs NEON support for the FFT.
enable_webaudio =
+ (base::android::BuildInfo::GetInstance()->sdk_int() >= 16) &&
((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0);
#endif // defined(ARCH_CPU_ARMEL)
WebRuntimeFeatures::enableWebAudio(enable_webaudio);
diff --git a/chromium/content/common/browser_plugin/browser_plugin_constants.cc b/chromium/content/common/browser_plugin/browser_plugin_constants.cc
index 6da58e96c53..9ba17bcaeec 100644
--- a/chromium/content/common/browser_plugin/browser_plugin_constants.cc
+++ b/chromium/content/common/browser_plugin/browser_plugin_constants.cc
@@ -54,6 +54,10 @@ const char kLastUnlockedBySelf[] = "lastUnlockedBySelf";
const char kMessageText[] = "messageText";
const char kMessageType[] = "messageType";
const char kName[] = "name";
+const char kNewHeight[] = "newHeight";
+const char kNewWidth[] = "newWidth";
+const char kOldHeight[] = "oldHeight";
+const char kOldWidth[] = "oldWidth";
const char kPermission[] = "permission";
const char kPermissionTypeDialog[] = "dialog";
const char kPermissionTypeDownload[] = "download";
diff --git a/chromium/content/common/browser_plugin/browser_plugin_constants.h b/chromium/content/common/browser_plugin/browser_plugin_constants.h
index 8e911f04ef2..7776a82c309 100644
--- a/chromium/content/common/browser_plugin/browser_plugin_constants.h
+++ b/chromium/content/common/browser_plugin/browser_plugin_constants.h
@@ -42,6 +42,9 @@ extern const char kAttributeName[];
extern const char kAttributePartition[];
extern const char kAttributeSrc[];
+// Events.
+extern const char kEventSizeChanged[];
+
// Parameters/properties on events.
extern const char kDefaultPromptText[];
extern const char kId[];
@@ -51,6 +54,10 @@ extern const char kLastUnlockedBySelf[];
extern const char kMessageText[];
extern const char kMessageType[];
extern const char kName[];
+extern const char kNewHeight[];
+extern const char kNewWidth[];
+extern const char kOldHeight[];
+extern const char kOldWidth[];
extern const char kPermission[];
extern const char kPermissionTypeDialog[];
extern const char kPermissionTypeDownload[];
diff --git a/chromium/content/common/gpu/DEPS b/chromium/content/common/gpu/DEPS
index 7d19c095cec..f42f973b19c 100644
--- a/chromium/content/common/gpu/DEPS
+++ b/chromium/content/common/gpu/DEPS
@@ -3,7 +3,6 @@ include_rules = [
"+libEGL",
"+libGLESv2",
"+media/video/video_decode_accelerator.h",
- "+media/video/video_encode_accelerator.h",
"+skia",
"+third_party/mesa",
diff --git a/chromium/content/common/gpu/client/gpu_channel_host.cc b/chromium/content/common/gpu/client/gpu_channel_host.cc
index 2ee9f8e2b5d..601c06d9dac 100644
--- a/chromium/content/common/gpu/client/gpu_channel_host.cc
+++ b/chromium/content/common/gpu/client/gpu_channel_host.cc
@@ -13,7 +13,6 @@
#include "base/posix/eintr_wrapper.h"
#include "base/threading/thread_restrictions.h"
#include "content/common/gpu/client/command_buffer_proxy_impl.h"
-#include "content/common/gpu/client/gpu_video_encode_accelerator_host.h"
#include "content/common/gpu/gpu_messages.h"
#include "gpu/command_buffer/common/mailbox.h"
#include "ipc/ipc_sync_message_filter.h"
@@ -185,21 +184,6 @@ scoped_ptr<media::VideoDecodeAccelerator> GpuChannelHost::CreateVideoDecoder(
return proxy->CreateVideoDecoder(profile, client).Pass();
}
-scoped_ptr<media::VideoEncodeAccelerator> GpuChannelHost::CreateVideoEncoder(
- media::VideoEncodeAccelerator::Client* client) {
- TRACE_EVENT0("gpu", "GpuChannelHost::CreateVideoEncoder");
-
- scoped_ptr<media::VideoEncodeAccelerator> vea;
- int32 route_id = MSG_ROUTING_NONE;
- if (!Send(new GpuChannelMsg_CreateVideoEncoder(&route_id)))
- return vea.Pass();
- if (route_id == MSG_ROUTING_NONE)
- return vea.Pass();
-
- vea.reset(new GpuVideoEncodeAcceleratorHost(client, this, route_id));
- return vea.Pass();
-}
-
void GpuChannelHost::DestroyCommandBuffer(
CommandBufferProxyImpl* command_buffer) {
TRACE_EVENT0("gpu", "GpuChannelHost::DestroyCommandBuffer");
diff --git a/chromium/content/common/gpu/client/gpu_channel_host.h b/chromium/content/common/gpu/client/gpu_channel_host.h
index 9aa3673bc73..6decd17931b 100644
--- a/chromium/content/common/gpu/client/gpu_channel_host.h
+++ b/chromium/content/common/gpu/client/gpu_channel_host.h
@@ -23,7 +23,6 @@
#include "ipc/ipc_channel_proxy.h"
#include "ipc/ipc_sync_channel.h"
#include "media/video/video_decode_accelerator.h"
-#include "media/video/video_encode_accelerator.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/size.h"
#include "ui/gl/gpu_preference.h"
@@ -129,10 +128,6 @@ class GpuChannelHost : public IPC::Sender,
media::VideoCodecProfile profile,
media::VideoDecodeAccelerator::Client* client);
- // Creates a video encoder in the GPU process.
- scoped_ptr<media::VideoEncodeAccelerator> CreateVideoEncoder(
- media::VideoEncodeAccelerator::Client* client);
-
// Destroy a command buffer created by this channel.
void DestroyCommandBuffer(CommandBufferProxyImpl* command_buffer);
diff --git a/chromium/content/common/gpu/client/gpu_video_decode_accelerator_host.cc b/chromium/content/common/gpu/client/gpu_video_decode_accelerator_host.cc
index 66c39f9bab6..fcf36bf4eb3 100644
--- a/chromium/content/common/gpu/client/gpu_video_decode_accelerator_host.cc
+++ b/chromium/content/common/gpu/client/gpu_video_decode_accelerator_host.cc
@@ -37,11 +37,13 @@ GpuVideoDecodeAcceleratorHost::GpuVideoDecodeAcceleratorHost(
void GpuVideoDecodeAcceleratorHost::OnChannelError() {
DLOG(ERROR) << "GpuVideoDecodeAcceleratorHost::OnChannelError()";
- OnErrorNotification(PLATFORM_FAILURE);
if (channel_) {
channel_->RemoveRoute(decoder_route_id_);
channel_ = NULL;
}
+ // See OnErrorNotification for why this needs to be the last thing in this
+ // function.
+ OnErrorNotification(PLATFORM_FAILURE);
}
bool GpuVideoDecodeAcceleratorHost::OnMessageReceived(const IPC::Message& msg) {
@@ -65,6 +67,8 @@ bool GpuVideoDecodeAcceleratorHost::OnMessageReceived(const IPC::Message& msg) {
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
DCHECK(handled);
+ // See OnErrorNotification for why |this| mustn't be used after
+ // OnErrorNotification might have been called above.
return handled;
}
@@ -165,6 +169,8 @@ void GpuVideoDecodeAcceleratorHost::Send(IPC::Message* message) {
DLOG(ERROR) << "Send(" << message_type << ") failed";
error = true;
}
+ // See OnErrorNotification for why this needs to be the last thing in this
+ // function.
if (error)
OnErrorNotification(PLATFORM_FAILURE);
}
@@ -219,9 +225,13 @@ void GpuVideoDecodeAcceleratorHost::OnErrorNotification(uint32 error) {
DCHECK(CalledOnValidThread());
if (!client_)
return;
- client_->NotifyError(
+
+ // Client::NotifyError() may Destroy() |this|, so calling it needs to be the
+ // last thing done on this stack!
+ media::VideoDecodeAccelerator::Client* client = NULL;
+ std::swap(client, client_);
+ client->NotifyError(
static_cast<media::VideoDecodeAccelerator::Error>(error));
- client_ = NULL;
}
} // namespace content
diff --git a/chromium/content/common/gpu/client/gpu_video_encode_accelerator_host.cc b/chromium/content/common/gpu/client/gpu_video_encode_accelerator_host.cc
deleted file mode 100644
index 64f07e5b081..00000000000
--- a/chromium/content/common/gpu/client/gpu_video_encode_accelerator_host.cc
+++ /dev/null
@@ -1,217 +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 "content/common/gpu/client/gpu_video_encode_accelerator_host.h"
-
-#include "base/logging.h"
-#include "base/message_loop/message_loop_proxy.h"
-#include "content/common/gpu/client/gpu_channel_host.h"
-#include "content/common/gpu/gpu_messages.h"
-#include "content/common/gpu/media/gpu_video_encode_accelerator.h"
-#include "media/base/video_frame.h"
-
-namespace content {
-
-GpuVideoEncodeAcceleratorHost::GpuVideoEncodeAcceleratorHost(
- media::VideoEncodeAccelerator::Client* client,
- const scoped_refptr<GpuChannelHost>& gpu_channel_host,
- int32 route_id)
- : client_(client),
- client_ptr_factory_(client_),
- channel_(gpu_channel_host),
- route_id_(route_id),
- next_frame_id_(0) {
- channel_->AddRoute(route_id_, AsWeakPtr());
-}
-
-GpuVideoEncodeAcceleratorHost::~GpuVideoEncodeAcceleratorHost() {
- if (channel_)
- channel_->RemoveRoute(route_id_);
-}
-
-// static
-std::vector<media::VideoEncodeAccelerator::SupportedProfile>
-GpuVideoEncodeAcceleratorHost::GetSupportedProfiles() {
- return GpuVideoEncodeAccelerator::GetSupportedProfiles();
-}
-
-bool GpuVideoEncodeAcceleratorHost::OnMessageReceived(
- const IPC::Message& message) {
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(GpuVideoEncodeAcceleratorHost, message)
- IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderHostMsg_NotifyInitializeDone,
- OnNotifyInitializeDone)
- IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderHostMsg_RequireBitstreamBuffers,
- OnRequireBitstreamBuffers)
- IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderHostMsg_NotifyInputDone,
- OnNotifyInputDone)
- IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderHostMsg_BitstreamBufferReady,
- OnBitstreamBufferReady)
- IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderHostMsg_NotifyError,
- OnNotifyError)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- DCHECK(handled);
- return handled;
-}
-
-void GpuVideoEncodeAcceleratorHost::OnChannelError() {
- DLOG(ERROR) << "OnChannelError()";
- OnNotifyError(kPlatformFailureError);
- if (channel_) {
- channel_->RemoveRoute(route_id_);
- channel_ = NULL;
- }
-}
-
-void GpuVideoEncodeAcceleratorHost::Initialize(
- media::VideoFrame::Format input_format,
- const gfx::Size& input_visible_size,
- media::VideoCodecProfile output_profile,
- uint32 initial_bitrate) {
- Send(new AcceleratedVideoEncoderMsg_Initialize(route_id_,
- input_format,
- input_visible_size,
- output_profile,
- initial_bitrate));
-}
-
-void GpuVideoEncodeAcceleratorHost::Encode(
- const scoped_refptr<media::VideoFrame>& frame,
- bool force_keyframe) {
- if (!channel_)
- return;
- if (!base::SharedMemory::IsHandleValid(frame->shared_memory_handle())) {
- DLOG(ERROR) << "Encode(): cannot encode frame not backed by shared memory";
- NotifyError(kPlatformFailureError);
- return;
- }
- base::SharedMemoryHandle handle =
- channel_->ShareToGpuProcess(frame->shared_memory_handle());
- if (!base::SharedMemory::IsHandleValid(handle)) {
- DLOG(ERROR) << "Encode(): failed to duplicate buffer handle for GPU "
- "process";
- NotifyError(kPlatformFailureError);
- return;
- }
-
- // We assume that planar frame data passed here is packed and contiguous.
- const size_t plane_count = media::VideoFrame::NumPlanes(frame->format());
- size_t frame_size = 0;
- for (size_t i = 0; i < plane_count; ++i) {
- // Cast DCHECK parameters to void* to avoid printing uint8* as a string.
- DCHECK_EQ(reinterpret_cast<void*>(frame->data(i)),
- reinterpret_cast<void*>((frame->data(0) + frame_size)))
- << "plane=" << i;
- frame_size += frame->stride(i) * frame->rows(i);
- }
-
- Send(new AcceleratedVideoEncoderMsg_Encode(
- route_id_, next_frame_id_, handle, frame_size, force_keyframe));
- frame_map_[next_frame_id_] = frame;
-
- // Mask against 30 bits, to avoid (undefined) wraparound on signed integer.
- next_frame_id_ = (next_frame_id_ + 1) & 0x3FFFFFFF;
-}
-
-void GpuVideoEncodeAcceleratorHost::UseOutputBitstreamBuffer(
- const media::BitstreamBuffer& buffer) {
- if (!channel_)
- return;
- base::SharedMemoryHandle handle =
- channel_->ShareToGpuProcess(buffer.handle());
- if (!base::SharedMemory::IsHandleValid(handle)) {
- DLOG(ERROR) << "UseOutputBitstreamBuffer(): failed to duplicate buffer "
- "handle for GPU process: buffer.id()=" << buffer.id();
- NotifyError(kPlatformFailureError);
- return;
- }
- Send(new AcceleratedVideoEncoderMsg_UseOutputBitstreamBuffer(
- route_id_, buffer.id(), handle, buffer.size()));
-}
-
-void GpuVideoEncodeAcceleratorHost::RequestEncodingParametersChange(
- uint32 bitrate,
- uint32 framerate) {
- Send(new AcceleratedVideoEncoderMsg_RequestEncodingParametersChange(
- route_id_, bitrate, framerate));
-}
-
-void GpuVideoEncodeAcceleratorHost::Destroy() {
- Send(new GpuChannelMsg_DestroyVideoEncoder(route_id_));
- delete this;
-}
-
-void GpuVideoEncodeAcceleratorHost::NotifyError(Error error) {
- DVLOG(2) << "NotifyError(): error=" << error;
- base::MessageLoopProxy::current()->PostTask(
- FROM_HERE,
- base::Bind(&media::VideoEncodeAccelerator::Client::NotifyError,
- client_ptr_factory_.GetWeakPtr(),
- error));
-}
-
-void GpuVideoEncodeAcceleratorHost::OnNotifyInitializeDone() {
- DVLOG(2) << "OnNotifyInitializeDone()";
- if (client_)
- client_->NotifyInitializeDone();
-}
-
-void GpuVideoEncodeAcceleratorHost::OnRequireBitstreamBuffers(
- uint32 input_count,
- const gfx::Size& input_coded_size,
- uint32 output_buffer_size) {
- DVLOG(2) << "OnRequireBitstreamBuffers(): input_count=" << input_count
- << ", input_coded_size=" << input_coded_size.ToString()
- << ", output_buffer_size=" << output_buffer_size;
- if (client_) {
- client_->RequireBitstreamBuffers(
- input_count, input_coded_size, output_buffer_size);
- }
-}
-
-void GpuVideoEncodeAcceleratorHost::OnNotifyInputDone(int32 frame_id) {
- DVLOG(3) << "OnNotifyInputDone(): frame_id=" << frame_id;
- if (!frame_map_.erase(frame_id)) {
- DLOG(ERROR) << "OnNotifyInputDone(): "
- "invalid frame_id=" << frame_id;
- OnNotifyError(kPlatformFailureError);
- return;
- }
-}
-
-void GpuVideoEncodeAcceleratorHost::OnBitstreamBufferReady(
- int32 bitstream_buffer_id,
- uint32 payload_size,
- bool key_frame) {
- DVLOG(3) << "OnBitstreamBufferReady(): "
- "bitstream_buffer_id=" << bitstream_buffer_id
- << ", payload_size=" << payload_size
- << ", key_frame=" << key_frame;
- if (client_)
- client_->BitstreamBufferReady(bitstream_buffer_id, payload_size, key_frame);
-}
-
-void GpuVideoEncodeAcceleratorHost::OnNotifyError(Error error) {
- DVLOG(2) << "OnNotifyError(): error=" << error;
- if (client_) {
- client_->NotifyError(error);
- client_ = NULL;
- client_ptr_factory_.InvalidateWeakPtrs();
- }
-}
-
-void GpuVideoEncodeAcceleratorHost::Send(IPC::Message* message) {
- if (!channel_) {
- DLOG(ERROR) << "Send(): no channel";
- delete message;
- NotifyError(kPlatformFailureError);
- } else if (!channel_->Send(message)) {
- DLOG(ERROR) << "Send(): sending failed: message->type()="
- << message->type();
- NotifyError(kPlatformFailureError);
- }
-}
-
-} // namespace content
diff --git a/chromium/content/common/gpu/client/gpu_video_encode_accelerator_host.h b/chromium/content/common/gpu/client/gpu_video_encode_accelerator_host.h
deleted file mode 100644
index 860955d1142..00000000000
--- a/chromium/content/common/gpu/client/gpu_video_encode_accelerator_host.h
+++ /dev/null
@@ -1,111 +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 CONTENT_COMMON_GPU_CLIENT_GPU_VIDEO_ENCODE_ACCELERATOR_HOST_H_
-#define CONTENT_COMMON_GPU_CLIENT_GPU_VIDEO_ENCODE_ACCELERATOR_HOST_H_
-
-#include <vector>
-
-#include "base/containers/hash_tables.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "ipc/ipc_listener.h"
-#include "media/video/video_encode_accelerator.h"
-
-namespace gfx {
-
-class Size;
-
-} // namespace gfx
-
-namespace media {
-
-class VideoFrame;
-
-} // namespace media
-
-namespace content {
-
-class GpuChannelHost;
-
-// This class is the renderer-side host for the VideoEncodeAccelerator in the
-// GPU process, coordinated over IPC.
-class GpuVideoEncodeAcceleratorHost
- : public IPC::Listener,
- public media::VideoEncodeAccelerator,
- public base::SupportsWeakPtr<GpuVideoEncodeAcceleratorHost> {
- public:
- // |client| is assumed to outlive this object. Since the GpuChannelHost does
- // _not_ own this object, a reference to |gpu_channel_host| is taken.
- GpuVideoEncodeAcceleratorHost(
- media::VideoEncodeAccelerator::Client* client,
- const scoped_refptr<GpuChannelHost>& gpu_channel_host,
- int32 route_id);
- virtual ~GpuVideoEncodeAcceleratorHost();
-
- // Static query for the supported profiles. This query proxies to
- // GpuVideoEncodeAccelerator::GetSupportedProfiles().
- static std::vector<SupportedProfile> GetSupportedProfiles();
-
- // IPC::Listener implementation.
- virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
- virtual void OnChannelError() OVERRIDE;
-
- // media::VideoEncodeAccelerator implementation.
- virtual void Initialize(media::VideoFrame::Format format,
- const gfx::Size& input_visible_size,
- media::VideoCodecProfile output_profile,
- uint32 initial_bitrate) OVERRIDE;
- virtual void Encode(const scoped_refptr<media::VideoFrame>& frame,
- bool force_keyframe) OVERRIDE;
- virtual void UseOutputBitstreamBuffer(
- const media::BitstreamBuffer& buffer) OVERRIDE;
- virtual void RequestEncodingParametersChange(uint32 bitrate,
- uint32 framerate_num) OVERRIDE;
- virtual void Destroy() OVERRIDE;
-
- private:
- // Notify |client_| when an error has occured. Used when notifying from
- // within a media::VideoEncodeAccelerator entry point, to avoid re-entrancy.
- void NotifyError(Error error);
-
- // IPC handlers, proxying media::VideoEncodeAccelerator::Client for the GPU
- // process.
- void OnNotifyInitializeDone();
- void OnRequireBitstreamBuffers(uint32 input_count,
- const gfx::Size& input_coded_size,
- uint32 output_buffer_size);
- void OnNotifyInputDone(int32 frame_id);
- void OnBitstreamBufferReady(int32 bitstream_buffer_id,
- uint32 payload_size,
- bool key_frame);
- void OnNotifyError(Error error);
-
- void Send(IPC::Message* message);
-
- // Weak pointer for client callbacks on the
- // media::VideoEncodeAccelerator::Client interface.
- media::VideoEncodeAccelerator::Client* client_;
- // |client_ptr_factory_| is used for callbacks that need to be done through
- // a PostTask() to avoid re-entrancy on the client.
- base::WeakPtrFactory<VideoEncodeAccelerator::Client> client_ptr_factory_;
-
- // IPC channel and route ID.
- scoped_refptr<GpuChannelHost> channel_;
- const int32 route_id_;
-
- // media::VideoFrames sent to the encoder.
- // base::IDMap not used here, since that takes pointers, not scoped_refptr.
- typedef base::hash_map<int32, scoped_refptr<media::VideoFrame> > FrameMap;
- FrameMap frame_map_;
-
- // ID serial number for the next frame to send to the GPU process.
- int32 next_frame_id_;
-
- DISALLOW_COPY_AND_ASSIGN(GpuVideoEncodeAcceleratorHost);
-};
-
-} // namespace content
-
-#endif // CONTENT_COMMON_GPU_CLIENT_GPU_VIDEO_ENCODE_ACCELERATOR_HOST_H_
diff --git a/chromium/content/common/gpu/gpu_channel.cc b/chromium/content/common/gpu/gpu_channel.cc
index 2b920d3a070..2e26fac38c8 100644
--- a/chromium/content/common/gpu/gpu_channel.cc
+++ b/chromium/content/common/gpu/gpu_channel.cc
@@ -20,7 +20,6 @@
#include "base/timer/timer.h"
#include "content/common/gpu/gpu_channel_manager.h"
#include "content/common/gpu/gpu_messages.h"
-#include "content/common/gpu/media/gpu_video_encode_accelerator.h"
#include "content/common/gpu/sync_point_manager.h"
#include "content/public/common/content_switches.h"
#include "crypto/hmac.h"
@@ -755,12 +754,9 @@ bool GpuChannel::OnControlMessageReceived(const IPC::Message& msg) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(GpuChannel, msg)
IPC_MESSAGE_HANDLER(GpuChannelMsg_CreateOffscreenCommandBuffer,
- OnCreateOffscreenCommandBuffer)
+ OnCreateOffscreenCommandBuffer)
IPC_MESSAGE_HANDLER(GpuChannelMsg_DestroyCommandBuffer,
- OnDestroyCommandBuffer)
- IPC_MESSAGE_HANDLER(GpuChannelMsg_CreateVideoEncoder, OnCreateVideoEncoder)
- IPC_MESSAGE_HANDLER(GpuChannelMsg_DestroyVideoEncoder,
- OnDestroyVideoEncoder)
+ OnDestroyCommandBuffer)
#if defined(OS_ANDROID)
IPC_MESSAGE_HANDLER(GpuChannelMsg_RegisterStreamTextureProxy,
OnRegisterStreamTextureProxy)
@@ -903,26 +899,6 @@ void GpuChannel::OnDestroyCommandBuffer(int32 route_id) {
}
}
-void GpuChannel::OnCreateVideoEncoder(int32* route_id) {
- TRACE_EVENT0("gpu", "GpuChannel::OnCreateVideoEncoder");
-
- *route_id = GenerateRouteID();
- GpuVideoEncodeAccelerator* encoder =
- new GpuVideoEncodeAccelerator(this, *route_id);
- router_.AddRoute(*route_id, encoder);
- video_encoders_.AddWithID(encoder, *route_id);
-}
-
-void GpuChannel::OnDestroyVideoEncoder(int32 route_id) {
- TRACE_EVENT1(
- "gpu", "GpuChannel::OnDestroyVideoEncoder", "route_id", route_id);
- GpuVideoEncodeAccelerator* encoder = video_encoders_.Lookup(route_id);
- if (!encoder)
- return;
- router_.RemoveRoute(route_id);
- video_encoders_.Remove(route_id);
-}
-
#if defined(OS_ANDROID)
void GpuChannel::OnRegisterStreamTextureProxy(
int32 stream_id, int32* route_id) {
diff --git a/chromium/content/common/gpu/gpu_channel.h b/chromium/content/common/gpu/gpu_channel.h
index 0692b903b4f..8d775f095fd 100644
--- a/chromium/content/common/gpu/gpu_channel.h
+++ b/chromium/content/common/gpu/gpu_channel.h
@@ -11,7 +11,6 @@
#include "base/id_map.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
-#include "base/memory/scoped_vector.h"
#include "base/memory/weak_ptr.h"
#include "base/process/process.h"
#include "build/build_config.h"
@@ -50,10 +49,9 @@ class StreamTextureManagerAndroid;
namespace content {
class GpuChannelManager;
-class GpuChannelMessageFilter;
struct GpuRenderingStats;
-class GpuVideoEncodeAccelerator;
class GpuWatchdog;
+class GpuChannelMessageFilter;
// Encapsulates an IPC channel between the GPU process and one renderer
// process. On the renderer side there's a corresponding GpuChannelHost.
@@ -175,8 +173,6 @@ class GpuChannel : public IPC::Listener,
const GPUCreateCommandBufferConfig& init_params,
int32* route_id);
void OnDestroyCommandBuffer(int32 route_id);
- void OnCreateVideoEncoder(int32* route_id);
- void OnDestroyVideoEncoder(int32 route_id);
#if defined(OS_ANDROID)
// Register the StreamTextureProxy class with the gpu process so that all
@@ -242,9 +238,6 @@ class GpuChannel : public IPC::Listener,
StubMap stubs_;
#endif // defined (ENABLE_GPU)
- typedef IDMap<GpuVideoEncodeAccelerator, IDMapOwnPointer> EncoderMap;
- EncoderMap video_encoders_;
-
bool log_messages_; // True if we should log sent and received messages.
gpu::gles2::DisallowedFeatures disallowed_features_;
GpuWatchdog* watchdog_;
diff --git a/chromium/content/common/gpu/gpu_messages.h b/chromium/content/common/gpu/gpu_messages.h
index 35c463517b1..fabc7a1a764 100644
--- a/chromium/content/common/gpu/gpu_messages.h
+++ b/chromium/content/common/gpu/gpu_messages.h
@@ -23,9 +23,7 @@
#include "gpu/ipc/gpu_command_buffer_traits.h"
#include "ipc/ipc_channel_handle.h"
#include "ipc/ipc_message_macros.h"
-#include "media/base/video_frame.h"
#include "media/video/video_decode_accelerator.h"
-#include "media/video/video_encode_accelerator.h"
#include "ui/base/latency_info.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/size.h"
@@ -221,10 +219,6 @@ IPC_STRUCT_TRAITS_BEGIN(content::GpuRenderingStats)
IPC_STRUCT_TRAITS_MEMBER(total_processing_commands_time)
IPC_STRUCT_TRAITS_END()
-IPC_ENUM_TRAITS(media::VideoFrame::Format)
-
-IPC_ENUM_TRAITS(media::VideoEncodeAccelerator::Error)
-
//------------------------------------------------------------------------------
// GPU Messages
// These are messages from the browser to the GPU process.
@@ -455,12 +449,6 @@ IPC_MESSAGE_CONTROL1(GpuChannelMsg_GenerateMailboxNamesAsync,
IPC_MESSAGE_CONTROL1(GpuChannelMsg_GenerateMailboxNamesReply,
std::vector<gpu::Mailbox> /* mailbox_names */)
-// Create a new GPU-accelerated video encoder.
-IPC_SYNC_MESSAGE_CONTROL0_1(GpuChannelMsg_CreateVideoEncoder,
- int32 /* route_id */)
-
-IPC_MESSAGE_CONTROL1(GpuChannelMsg_DestroyVideoEncoder, int32 /* route_id */)
-
#if defined(OS_ANDROID)
// Register the StreamTextureProxy class with the GPU process, so that
// the renderer process will get notified whenever a frame becomes available.
@@ -704,64 +692,3 @@ IPC_MESSAGE_ROUTED0(AcceleratedVideoDecoderHostMsg_ResetDone)
// Video decoder has encountered an error.
IPC_MESSAGE_ROUTED1(AcceleratedVideoDecoderHostMsg_ErrorNotification,
uint32) /* Error ID */
-
-//------------------------------------------------------------------------------
-// Accelerated Video Encoder Messages
-// These messages are sent from the Renderer process to GPU process.
-
-// Initialize the accelerated encoder.
-IPC_MESSAGE_ROUTED4(AcceleratedVideoEncoderMsg_Initialize,
- media::VideoFrame::Format /* input_format */,
- gfx::Size /* input_visible_size */,
- media::VideoCodecProfile /* output_profile */,
- uint32 /* initial_bitrate */)
-
-// Queue a input buffer to the encoder to encode. |frame_id| will be returned by
-// AcceleratedVideoEncoderHostMsg_NotifyEncodeDone.
-IPC_MESSAGE_ROUTED4(AcceleratedVideoEncoderMsg_Encode,
- int32 /* frame_id */,
- base::SharedMemoryHandle /* buffer_handle */,
- uint32 /* buffer_size */,
- bool /* force_keyframe */)
-
-// Queue a buffer to the encoder for use in returning output. |buffer_id| will
-// be returned by AcceleratedVideoEncoderHostMsg_BitstreamBufferReady.
-IPC_MESSAGE_ROUTED3(AcceleratedVideoEncoderMsg_UseOutputBitstreamBuffer,
- int32 /* buffer_id */,
- base::SharedMemoryHandle /* buffer_handle */,
- uint32 /* buffer_size */)
-
-// Request a runtime encoding parameter change.
-IPC_MESSAGE_ROUTED2(AcceleratedVideoEncoderMsg_RequestEncodingParametersChange,
- uint32 /* bitrate */,
- uint32 /* framerate */)
-
-//------------------------------------------------------------------------------
-// Accelerated Video Encoder Host Messages
-// These messages are sent from GPU process to Renderer process.
-
-// Notify of the completion of initialization.
-IPC_MESSAGE_ROUTED0(AcceleratedVideoEncoderHostMsg_NotifyInitializeDone)
-
-// Notify renderer of the input/output buffer requirements of the encoder.
-IPC_MESSAGE_ROUTED3(AcceleratedVideoEncoderHostMsg_RequireBitstreamBuffers,
- uint32 /* input_count */,
- gfx::Size /* input_coded_size */,
- uint32 /* output_buffer_size */)
-
-// Notify the renderer that the encoder has finished using an input buffer.
-// There is no congruent entry point in the media::VideoEncodeAccelerator
-// interface, in VEA this same done condition is indicated by dropping the
-// reference to the media::VideoFrame passed to VEA::Encode().
-IPC_MESSAGE_ROUTED1(AcceleratedVideoEncoderHostMsg_NotifyInputDone,
- int32 /* frame_id */)
-
-// Notify the renderer that an output buffer has been filled with encoded data.
-IPC_MESSAGE_ROUTED3(AcceleratedVideoEncoderHostMsg_BitstreamBufferReady,
- int32 /* bitstream_buffer_id */,
- uint32 /* payload_size */,
- bool /* key_frame */)
-
-// Report error condition.
-IPC_MESSAGE_ROUTED1(AcceleratedVideoEncoderHostMsg_NotifyError,
- media::VideoEncodeAccelerator::Error /* error */)
diff --git a/chromium/content/common/gpu/media/gpu_video_encode_accelerator.cc b/chromium/content/common/gpu/media/gpu_video_encode_accelerator.cc
deleted file mode 100644
index b15f04bc619..00000000000
--- a/chromium/content/common/gpu/media/gpu_video_encode_accelerator.cc
+++ /dev/null
@@ -1,232 +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 "content/common/gpu/media/gpu_video_encode_accelerator.h"
-
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/memory/shared_memory.h"
-#include "base/message_loop/message_loop_proxy.h"
-#include "content/common/gpu/gpu_channel.h"
-#include "content/common/gpu/gpu_messages.h"
-#include "ipc/ipc_message_macros.h"
-#include "media/base/video_frame.h"
-
-namespace content {
-
-GpuVideoEncodeAccelerator::GpuVideoEncodeAccelerator(GpuChannel* gpu_channel,
- int32 route_id)
- : weak_this_factory_(this),
- channel_(gpu_channel),
- route_id_(route_id),
- input_format_(media::VideoFrame::INVALID),
- output_buffer_size_(0) {}
-
-GpuVideoEncodeAccelerator::~GpuVideoEncodeAccelerator() {
- if (encoder_)
- encoder_.release()->Destroy();
-}
-
-bool GpuVideoEncodeAccelerator::OnMessageReceived(const IPC::Message& message) {
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(GpuVideoEncodeAccelerator, message)
- IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Initialize, OnInitialize)
- IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Encode, OnEncode)
- IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_UseOutputBitstreamBuffer,
- OnUseOutputBitstreamBuffer)
- IPC_MESSAGE_HANDLER(
- AcceleratedVideoEncoderMsg_RequestEncodingParametersChange,
- OnRequestEncodingParametersChange)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- return handled;
-}
-
-void GpuVideoEncodeAccelerator::OnChannelError() {
- NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
- if (channel_)
- channel_ = NULL;
-}
-
-void GpuVideoEncodeAccelerator::NotifyInitializeDone() {
- Send(new AcceleratedVideoEncoderHostMsg_NotifyInitializeDone(route_id_));
-}
-
-void GpuVideoEncodeAccelerator::RequireBitstreamBuffers(
- unsigned int input_count,
- const gfx::Size& input_coded_size,
- size_t output_buffer_size) {
- Send(new AcceleratedVideoEncoderHostMsg_RequireBitstreamBuffers(
- route_id_, input_count, input_coded_size, output_buffer_size));
- input_coded_size_ = input_coded_size;
- output_buffer_size_ = output_buffer_size;
-}
-
-void GpuVideoEncodeAccelerator::BitstreamBufferReady(int32 bitstream_buffer_id,
- size_t payload_size,
- bool key_frame) {
- Send(new AcceleratedVideoEncoderHostMsg_BitstreamBufferReady(
- route_id_, bitstream_buffer_id, payload_size, key_frame));
-}
-
-void GpuVideoEncodeAccelerator::NotifyError(
- media::VideoEncodeAccelerator::Error error) {
- Send(new AcceleratedVideoEncoderHostMsg_NotifyError(route_id_, error));
-}
-
-// static
-std::vector<media::VideoEncodeAccelerator::SupportedProfile>
-GpuVideoEncodeAccelerator::GetSupportedProfiles() {
- std::vector<media::VideoEncodeAccelerator::SupportedProfile> profiles;
-
- // TODO(sheu): return platform-specific profiles.
- return profiles;
-}
-
-void GpuVideoEncodeAccelerator::CreateEncoder() {
- // TODO(sheu): actual create the encoder.
-}
-
-void GpuVideoEncodeAccelerator::OnInitialize(
- media::VideoFrame::Format input_format,
- const gfx::Size& input_visible_size,
- media::VideoCodecProfile output_profile,
- uint32 initial_bitrate) {
- DVLOG(2) << "GpuVideoEncodeAccelerator::OnInitialize(): "
- "input_format=" << input_format
- << ", input_visible_size=" << input_visible_size.ToString()
- << ", output_profile=" << output_profile
- << ", initial_bitrate=" << initial_bitrate;
- DCHECK(!encoder_);
-
- if (input_visible_size.width() > kint32max / input_visible_size.height()) {
- DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnInitialize(): "
- "input_visible_size too large";
- NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
-
- CreateEncoder();
- if (!encoder_) {
- DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnInitialize(): VEA creation "
- "failed";
- NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
- encoder_->Initialize(
- input_format, input_visible_size, output_profile, initial_bitrate);
- input_format_ = input_format;
- input_visible_size_ = input_visible_size;
-}
-
-void GpuVideoEncodeAccelerator::OnEncode(int32 frame_id,
- base::SharedMemoryHandle buffer_handle,
- uint32 buffer_size,
- bool force_keyframe) {
- DVLOG(3) << "GpuVideoEncodeAccelerator::OnEncode(): frame_id=" << frame_id
- << ", buffer_size=" << buffer_size
- << ", force_keyframe=" << force_keyframe;
- if (!encoder_)
- return;
- if (frame_id < 0) {
- DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): invalid frame_id="
- << frame_id;
- NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
-
- scoped_ptr<base::SharedMemory> shm(
- new base::SharedMemory(buffer_handle, true));
- if (!shm->Map(buffer_size)) {
- DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): "
- "could not map frame_id=" << frame_id;
- NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
-
- scoped_refptr<media::VideoFrame> frame =
- media::VideoFrame::WrapExternalSharedMemory(
- media::VideoFrame::I420,
- input_coded_size_,
- gfx::Rect(input_visible_size_),
- input_visible_size_,
- reinterpret_cast<uint8*>(shm->memory()),
- buffer_handle,
- base::TimeDelta(),
- // It's turtles all the way down...
- base::Bind(base::IgnoreResult(&base::MessageLoopProxy::PostTask),
- base::MessageLoopProxy::current(),
- FROM_HERE,
- base::Bind(&GpuVideoEncodeAccelerator::EncodeFrameFinished,
- weak_this_factory_.GetWeakPtr(),
- frame_id,
- base::Passed(&shm))));
-
- if (!frame) {
- DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): "
- "could not create VideoFrame for frame_id=" << frame_id;
- NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
-
- encoder_->Encode(frame, force_keyframe);
-}
-
-void GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(
- int32 buffer_id,
- base::SharedMemoryHandle buffer_handle,
- uint32 buffer_size) {
- DVLOG(3) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): "
- "buffer_id=" << buffer_id
- << ", buffer_size=" << buffer_size;
- if (!encoder_)
- return;
- if (buffer_id < 0) {
- DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): "
- "invalid buffer_id=" << buffer_id;
- NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
- if (buffer_size < output_buffer_size_) {
- DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): "
- "buffer too small for buffer_id=" << buffer_id;
- NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
- encoder_->UseOutputBitstreamBuffer(
- media::BitstreamBuffer(buffer_id, buffer_handle, buffer_size));
-}
-
-void GpuVideoEncodeAccelerator::OnRequestEncodingParametersChange(
- uint32 bitrate,
- uint32 framerate) {
- DVLOG(2) << "GpuVideoEncodeAccelerator::OnRequestEncodingParametersChange(): "
- "bitrate=" << bitrate
- << ", framerate=" << framerate;
- if (!encoder_)
- return;
- encoder_->RequestEncodingParametersChange(bitrate, framerate);
-}
-
-void GpuVideoEncodeAccelerator::EncodeFrameFinished(
- int32 frame_id,
- scoped_ptr<base::SharedMemory> shm) {
- Send(new AcceleratedVideoEncoderHostMsg_NotifyInputDone(route_id_, frame_id));
- // Just let shm fall out of scope.
-}
-
-void GpuVideoEncodeAccelerator::Send(IPC::Message* message) {
- if (!channel_) {
- DLOG(ERROR) << "GpuVideoEncodeAccelerator::Send(): no channel";
- delete message;
- return;
- } else if (!channel_->Send(message)) {
- DLOG(ERROR) << "GpuVideoEncodeAccelerator::Send(): sending failed: "
- "message->type()=" << message->type();
- NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
-}
-
-} // namespace content
diff --git a/chromium/content/common/gpu/media/gpu_video_encode_accelerator.h b/chromium/content/common/gpu/media/gpu_video_encode_accelerator.h
deleted file mode 100644
index 5a48295e1e2..00000000000
--- a/chromium/content/common/gpu/media/gpu_video_encode_accelerator.h
+++ /dev/null
@@ -1,98 +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 CONTENT_COMMON_GPU_MEDIA_GPU_VIDEO_ENCODE_ACCELERATOR_H_
-#define CONTENT_COMMON_GPU_MEDIA_GPU_VIDEO_ENCODE_ACCELERATOR_H_
-
-#include <vector>
-
-#include "base/memory/scoped_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "ipc/ipc_listener.h"
-#include "media/video/video_encode_accelerator.h"
-#include "ui/gfx/size.h"
-
-namespace base {
-
-class SharedMemory;
-
-} // namespace base
-
-namespace content {
-
-class GpuChannel;
-
-// This class encapsulates the GPU process view of a VideoEncodeAccelerator,
-// wrapping the platform-specific VideoEncodeAccelerator instance. It handles
-// IPC coming in from the renderer and passes it to the underlying VEA.
-class GpuVideoEncodeAccelerator : public IPC::Listener,
- public media::VideoEncodeAccelerator::Client {
- public:
- GpuVideoEncodeAccelerator(GpuChannel* gpu_channel, int32 route_id);
- virtual ~GpuVideoEncodeAccelerator();
-
- // IPC::Listener implementation
- virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
- virtual void OnChannelError() OVERRIDE;
-
- // media::VideoEncodeAccelerator::Client implementation.
- virtual void NotifyInitializeDone() OVERRIDE;
- virtual void RequireBitstreamBuffers(unsigned int input_count,
- const gfx::Size& input_coded_size,
- size_t output_buffer_size) OVERRIDE;
- virtual void BitstreamBufferReady(int32 bitstream_buffer_id,
- size_t payload_size,
- bool key_frame) OVERRIDE;
- virtual void NotifyError(media::VideoEncodeAccelerator::Error error) OVERRIDE;
-
- // Static query for supported profiles. This query calls the appropriate
- // platform-specific version.
- static std::vector<media::VideoEncodeAccelerator::SupportedProfile>
- GetSupportedProfiles();
-
- private:
- // Create the appropriate platform-specific VEA.
- void CreateEncoder();
-
- // IPC handlers, proxying media::VideoEncodeAccelerator for the renderer
- // process.
- void OnInitialize(media::VideoFrame::Format input_format,
- const gfx::Size& input_visible_size,
- media::VideoCodecProfile output_profile,
- uint32 initial_bitrate);
- void OnEncode(int32 frame_id,
- base::SharedMemoryHandle buffer_handle,
- uint32 buffer_size,
- bool force_keyframe);
- void OnUseOutputBitstreamBuffer(int32 buffer_id,
- base::SharedMemoryHandle buffer_handle,
- uint32 buffer_size);
- void OnRequestEncodingParametersChange(uint32 bitrate, uint32 framerate);
-
- void EncodeFrameFinished(int32 frame_id, scoped_ptr<base::SharedMemory> shm);
-
- void Send(IPC::Message* message);
-
- // Weak pointer for media::VideoFrames that refer back to |this|.
- base::WeakPtrFactory<GpuVideoEncodeAccelerator> weak_this_factory_;
-
- // The GpuChannel owns this GpuVideoEncodeAccelerator and will outlive |this|.
- GpuChannel* channel_;
- const int32 route_id_;
-
- // Owned pointer to the underlying VideoEncodeAccelerator.
- scoped_ptr<media::VideoEncodeAccelerator> encoder_;
-
- // Video encoding parameters.
- media::VideoFrame::Format input_format_;
- gfx::Size input_visible_size_;
- gfx::Size input_coded_size_;
- size_t output_buffer_size_;
-
- DISALLOW_COPY_AND_ASSIGN(GpuVideoEncodeAccelerator);
-};
-
-} // namespace content
-
-#endif // CONTENT_COMMON_GPU_MEDIA_GPU_VIDEO_ENCODE_ACCELERATOR_H_
diff --git a/chromium/content/common/gpu/media/vaapi_h264_decoder.cc b/chromium/content/common/gpu/media/vaapi_h264_decoder.cc
index 77739ce434f..78570b17440 100644
--- a/chromium/content/common/gpu/media/vaapi_h264_decoder.cc
+++ b/chromium/content/common/gpu/media/vaapi_h264_decoder.cc
@@ -1441,10 +1441,6 @@ bool VaapiH264Decoder::ProcessSPS(int sps_id, bool* need_new_buffers) {
size_t max_dpb_size = std::min(max_dpb_mbs / (width_mb * height_mb),
static_cast<int>(H264DPB::kDPBMaxSize));
DVLOG(1) << "Codec level: " << level << ", DPB size: " << max_dpb_size;
- if (max_dpb_size == 0) {
- DVLOG(1) << "Invalid DPB Size";
- return false;
- }
dpb_.set_max_num_pics(max_dpb_size);
diff --git a/chromium/content/common/handle_enumerator_win.cc b/chromium/content/common/handle_enumerator_win.cc
index 4e17aa2ca7d..98e232e1d20 100644
--- a/chromium/content/common/handle_enumerator_win.cc
+++ b/chromium/content/common/handle_enumerator_win.cc
@@ -174,6 +174,8 @@ string16 GetAccessString(HandleType handle_type,
output.append(ASCIIToUTF16("\tFILE_WRITE_DATA\n"));
if (access & FILE_WRITE_EA)
output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
+ if (access & FILE_WRITE_EA)
+ output.append(ASCIIToUTF16("\tFILE_WRITE_EA\n"));
break;
case DirectoryHandle:
if (access & FILE_ADD_FILE)
diff --git a/chromium/content/common/media/media_stream_options.cc b/chromium/content/common/media/media_stream_options.cc
index e042d8c2d28..4a3ace519d3 100644
--- a/chromium/content/common/media/media_stream_options.cc
+++ b/chromium/content/common/media/media_stream_options.cc
@@ -13,7 +13,6 @@ const char kMediaStreamSourceId[] = "chromeMediaSourceId";
const char kMediaStreamSourceInfoId[] = "sourceId";
const char kMediaStreamSourceTab[] = "tab";
const char kMediaStreamSourceScreen[] = "screen";
-const char kMediaStreamSourceDesktop[] = "desktop";
const char kMediaStreamSourceSystem[] = "system";
StreamOptions::StreamOptions()
diff --git a/chromium/content/common/media/media_stream_options.h b/chromium/content/common/media/media_stream_options.h
index bbb1aa4b8cd..e3faf268e3c 100644
--- a/chromium/content/common/media/media_stream_options.h
+++ b/chromium/content/common/media/media_stream_options.h
@@ -19,7 +19,6 @@ CONTENT_EXPORT extern const char kMediaStreamSourceId[];
CONTENT_EXPORT extern const char kMediaStreamSourceInfoId[];
CONTENT_EXPORT extern const char kMediaStreamSourceTab[];
CONTENT_EXPORT extern const char kMediaStreamSourceScreen[];
-CONTENT_EXPORT extern const char kMediaStreamSourceDesktop[];
CONTENT_EXPORT extern const char kMediaStreamSourceSystem[];
// StreamOptions is a Chromium representation of WebKit's
diff --git a/chromium/content/common/mime_registry_messages.h b/chromium/content/common/mime_registry_messages.h
index 32467214b30..e698369709e 100644
--- a/chromium/content/common/mime_registry_messages.h
+++ b/chromium/content/common/mime_registry_messages.h
@@ -20,4 +20,7 @@ IPC_SYNC_MESSAGE_CONTROL1_1(MimeRegistryMsg_GetMimeTypeFromExtension,
IPC_SYNC_MESSAGE_CONTROL1_1(MimeRegistryMsg_GetMimeTypeFromFile,
base::FilePath /* file_path */,
std::string /* mime_type */)
+IPC_SYNC_MESSAGE_CONTROL1_1(MimeRegistryMsg_GetPreferredExtensionForMimeType,
+ std::string /* mime_type */,
+ base::FilePath::StringType /* extension */)
diff --git a/chromium/content/common/plugin_list.cc b/chromium/content/common/plugin_list.cc
index 69102c5c68f..d623fad337d 100644
--- a/chromium/content/common/plugin_list.cc
+++ b/chromium/content/common/plugin_list.cc
@@ -59,11 +59,7 @@ void PluginList::AddExtraPluginPath(const base::FilePath& plugin_path) {
void PluginList::RemoveExtraPluginPath(const base::FilePath& plugin_path) {
base::AutoLock lock(lock_);
- std::vector<base::FilePath>::iterator it =
- std::find(extra_plugin_paths_.begin(), extra_plugin_paths_.end(),
- plugin_path);
- if (it != extra_plugin_paths_.end())
- extra_plugin_paths_.erase(it);
+ RemoveExtraPluginPathLocked(plugin_path);
}
void PluginList::AddExtraPluginDir(const base::FilePath& plugin_dir) {
@@ -90,13 +86,16 @@ void PluginList::RegisterInternalPlugin(const WebPluginInfo& info,
void PluginList::UnregisterInternalPlugin(const base::FilePath& path) {
base::AutoLock lock(lock_);
+ bool found = false;
for (size_t i = 0; i < internal_plugins_.size(); i++) {
if (internal_plugins_[i].path == path) {
internal_plugins_.erase(internal_plugins_.begin() + i);
- return;
+ found = true;
+ break;
}
}
- NOTREACHED();
+ DCHECK(found);
+ RemoveExtraPluginPathLocked(path);
}
void PluginList::GetInternalPlugins(
@@ -399,6 +398,16 @@ bool PluginList::SupportsExtension(const WebPluginInfo& plugin,
return false;
}
+void PluginList::RemoveExtraPluginPathLocked(
+ const base::FilePath& plugin_path) {
+ lock_.AssertAcquired();
+ std::vector<base::FilePath>::iterator it =
+ std::find(extra_plugin_paths_.begin(), extra_plugin_paths_.end(),
+ plugin_path);
+ if (it != extra_plugin_paths_.end())
+ extra_plugin_paths_.erase(it);
+}
+
PluginList::~PluginList() {
}
diff --git a/chromium/content/common/plugin_list.h b/chromium/content/common/plugin_list.h
index 9a5ef863388..1205238706b 100644
--- a/chromium/content/common/plugin_list.h
+++ b/chromium/content/common/plugin_list.h
@@ -197,6 +197,11 @@ class CONTENT_EXPORT PluginList {
bool SupportsExtension(const WebPluginInfo& plugin,
const std::string& extension,
std::string* actual_mime_type);
+
+ // Removes |plugin_path| from the list of extra plugin paths. Should only be
+ // called while holding |lock_|.
+ void RemoveExtraPluginPathLocked(const base::FilePath& plugin_path);
+
//
// Command-line switches
//
diff --git a/chromium/content/common/sandbox_init_win.cc b/chromium/content/common/sandbox_init_win.cc
index dffb3344862..3afa12242a2 100644
--- a/chromium/content/common/sandbox_init_win.cc
+++ b/chromium/content/common/sandbox_init_win.cc
@@ -15,6 +15,8 @@ namespace content {
bool InitializeSandbox(sandbox::SandboxInterfaceInfo* sandbox_info) {
const CommandLine& command_line = *CommandLine::ForCurrentProcess();
+ std::string process_type =
+ command_line.GetSwitchValueASCII(switches::kProcessType);
sandbox::BrokerServices* broker_services = sandbox_info->broker_services;
if (broker_services) {
if (!InitBrokerServices(broker_services))
diff --git a/chromium/content/common/view_messages.h b/chromium/content/common/view_messages.h
index 9ab0e9928c9..537aef3d026 100644
--- a/chromium/content/common/view_messages.h
+++ b/chromium/content/common/view_messages.h
@@ -339,6 +339,9 @@ IPC_STRUCT_BEGIN(ViewHostMsg_CreateWindow_Params)
// The URL of the frame initiating the open.
IPC_STRUCT_MEMBER(GURL, opener_url)
+ // The URL of the top frame containing the opener.
+ IPC_STRUCT_MEMBER(GURL, opener_top_level_frame_url)
+
// The security origin of the frame initiating the open.
IPC_STRUCT_MEMBER(GURL, opener_security_origin)
diff --git a/chromium/content/content_browser.gypi b/chromium/content/content_browser.gypi
index 8a37d91ba24..441b2d0d027 100644
--- a/chromium/content/content_browser.gypi
+++ b/chromium/content/content_browser.gypi
@@ -528,6 +528,10 @@
'browser/gamepad/gamepad_standard_mappings_win.cc',
'browser/gamepad/xbox_data_fetcher_mac.cc',
'browser/gamepad/xbox_data_fetcher_mac.h',
+ 'browser/geolocation/core_location_data_provider_mac.h',
+ 'browser/geolocation/core_location_data_provider_mac.mm',
+ 'browser/geolocation/core_location_provider_mac.h',
+ 'browser/geolocation/core_location_provider_mac.mm',
'browser/geolocation/device_data_provider.cc',
'browser/geolocation/device_data_provider.h',
'browser/geolocation/empty_device_data_provider.cc',
diff --git a/chromium/content/content_child.gypi b/chromium/content/content_child.gypi
index 05232b6e352..dd980e3b526 100644
--- a/chromium/content/content_child.gypi
+++ b/chromium/content/content_child.gypi
@@ -47,8 +47,6 @@
'child/fileapi/webfilesystem_callback_adapters.h',
'child/fileapi/webfilesystem_impl.cc',
'child/fileapi/webfilesystem_impl.h',
- 'child/fileapi/webfilewriter_base.cc',
- 'child/fileapi/webfilewriter_base.h',
'child/fileapi/webfilewriter_impl.cc',
'child/fileapi/webfilewriter_impl.h',
'child/image_decoder.cc',
diff --git a/chromium/content/content_common.gypi b/chromium/content/content_common.gypi
index 0747f022076..057754837e3 100644
--- a/chromium/content/content_common.gypi
+++ b/chromium/content/content_common.gypi
@@ -197,8 +197,6 @@
'common/gpu/client/gpu_channel_host.h',
'common/gpu/client/gpu_video_decode_accelerator_host.cc',
'common/gpu/client/gpu_video_decode_accelerator_host.h',
- 'common/gpu/client/gpu_video_encode_accelerator_host.cc',
- 'common/gpu/client/gpu_video_encode_accelerator_host.h',
'common/gpu/client/webgraphicscontext3d_command_buffer_impl.cc',
'common/gpu/client/webgraphicscontext3d_command_buffer_impl.h',
'common/gpu/gpu_channel.cc',
@@ -237,8 +235,6 @@
'common/gpu/media/h264_parser.h',
'common/gpu/media/gpu_video_decode_accelerator.cc',
'common/gpu/media/gpu_video_decode_accelerator.h',
- 'common/gpu/media/gpu_video_encode_accelerator.cc',
- 'common/gpu/media/gpu_video_encode_accelerator.h',
'common/gpu/sync_point_manager.h',
'common/gpu/sync_point_manager.cc',
'common/gpu/texture_image_transport_surface.h',
diff --git a/chromium/content/content_renderer.gypi b/chromium/content/content_renderer.gypi
index 5c6358870b0..fc539f104dc 100644
--- a/chromium/content/content_renderer.gypi
+++ b/chromium/content/content_renderer.gypi
@@ -23,6 +23,7 @@
'../webkit/renderer/compositor_bindings/compositor_bindings.gyp:webkit_compositor_support',
'../webkit/renderer/webkit_renderer.gyp:webkit_renderer',
'../webkit/storage_common.gyp:webkit_storage_common',
+ '../webkit/storage_renderer.gyp:webkit_storage_renderer',
'../webkit/support/webkit_support.gyp:glue',
'../webkit/support/webkit_support.gyp:glue_child',
],
@@ -214,8 +215,8 @@
'renderer/media/preload.h',
'renderer/media/render_media_log.cc',
'renderer/media/render_media_log.h',
- 'renderer/media/renderer_gpu_video_accelerator_factories.cc',
- 'renderer/media/renderer_gpu_video_accelerator_factories.h',
+ 'renderer/media/renderer_gpu_video_decoder_factories.cc',
+ 'renderer/media/renderer_gpu_video_decoder_factories.h',
'renderer/media/renderer_webaudiodevice_impl.cc',
'renderer/media/renderer_webaudiodevice_impl.h',
'renderer/media/renderer_webmidiaccessor_impl.cc',
@@ -474,6 +475,8 @@
'renderer/renderer_webcolorchooser_impl.h',
'renderer/renderer_webkitplatformsupport_impl.cc',
'renderer/renderer_webkitplatformsupport_impl.h',
+ 'renderer/rendering_benchmark.cc',
+ 'renderer/rendering_benchmark.h',
'renderer/sad_plugin.cc',
'renderer/sad_plugin.h',
'renderer/savable_resources.cc',
@@ -609,10 +612,6 @@
'renderer/media/rtc_video_decoder.h',
'renderer/media/rtc_video_decoder_factory.cc',
'renderer/media/rtc_video_decoder_factory.h',
- 'renderer/media/rtc_video_encoder.cc',
- 'renderer/media/rtc_video_encoder.h',
- 'renderer/media/rtc_video_encoder_factory.cc',
- 'renderer/media/rtc_video_encoder_factory.h',
'renderer/media/video_destination_handler.cc',
'renderer/media/video_destination_handler.h',
'renderer/media/video_source_handler.cc',
diff --git a/chromium/content/content_shell.gypi b/chromium/content/content_shell.gypi
index 10cb53a2276..ae9012e96fd 100644
--- a/chromium/content/content_shell.gypi
+++ b/chromium/content/content_shell.gypi
@@ -723,8 +723,6 @@
'../base/base.gyp:base_java',
'../media/media.gyp:media_java',
'../net/net.gyp:net_java',
- '../tools/android/forwarder/forwarder.gyp:forwarder',
- '../tools/android/md5sum/md5sum.gyp:md5sum',
'../ui/ui.gyp:ui_java',
],
'variables': {
diff --git a/chromium/content/content_tests.gypi b/chromium/content/content_tests.gypi
index c66cb598476..59158ca7c97 100644
--- a/chromium/content/content_tests.gypi
+++ b/chromium/content/content_tests.gypi
@@ -182,6 +182,7 @@
'../webkit/support/webkit_support.gyp:webkit_support_common',
'../webkit/storage_browser.gyp:webkit_storage_browser',
'../webkit/storage_common.gyp:webkit_storage_common',
+ '../webkit/storage_renderer.gyp:webkit_storage_renderer',
],
}],
['OS == "win" or toolkit_uses_gtk == 1', {
@@ -389,7 +390,6 @@
'browser/web_contents/web_drag_source_mac_unittest.mm',
'browser/webui/web_ui_data_source_unittest.cc',
'browser/webui/web_ui_message_handler_unittest.cc',
- 'child/fileapi/webfilewriter_base_unittest.cc',
'child/indexed_db/indexed_db_dispatcher_unittest.cc',
'child/indexed_db/proxy_webidbcursor_impl_unittest.cc',
'child/npapi/plugin_lib_unittest.cc',
@@ -511,11 +511,11 @@
'../webkit/browser/fileapi/mock_file_system_options.h',
'../webkit/browser/fileapi/native_file_util_unittest.cc',
'../webkit/browser/fileapi/obfuscated_file_util_unittest.cc',
+ '../webkit/browser/fileapi/sandbox_context_unittest.cc',
'../webkit/browser/fileapi/sandbox_database_test_helper.cc',
'../webkit/browser/fileapi/sandbox_database_test_helper.h',
'../webkit/browser/fileapi/sandbox_directory_database_unittest.cc',
'../webkit/browser/fileapi/sandbox_file_system_backend_unittest.cc',
- '../webkit/browser/fileapi/sandbox_file_system_backend_delegate_unittest.cc',
'../webkit/browser/fileapi/sandbox_file_system_test_helper.cc',
'../webkit/browser/fileapi/sandbox_file_system_test_helper.h',
'../webkit/browser/fileapi/sandbox_isolated_origin_database_unittest.cc',
@@ -549,6 +549,7 @@
'../webkit/browser/quota/quota_temporary_storage_evictor_unittest.cc',
'../webkit/browser/quota/usage_tracker_unittest.cc',
'../webkit/renderer/cpp_variant_unittest.cc',
+ '../webkit/renderer/fileapi/webfilewriter_base_unittest.cc',
],
'conditions': [
['OS == "ios"', {
@@ -586,6 +587,7 @@
'../webkit/renderer/webkit_renderer.gyp:webkit_renderer',
'../webkit/storage_browser.gyp:webkit_storage_browser',
'../webkit/storage_common.gyp:webkit_storage_common',
+ '../webkit/storage_renderer.gyp:webkit_storage_renderer',
'../webkit/support/webkit_support.gyp:glue',
'../webkit/support/webkit_support.gyp:glue_child',
],
@@ -1236,6 +1238,7 @@
'../media/media.gyp:media_test_support',
'../net/net.gyp:net_java',
'../net/net.gyp:net_javatests',
+ '../tools/android/forwarder2/forwarder.gyp:forwarder2',
],
'variables': {
'apk_name': 'ContentShellTest',
diff --git a/chromium/content/public/android/java/res/values-v17/styles.xml b/chromium/content/public/android/java/res/values-v17/styles.xml
new file mode 100644
index 00000000000..aaeb6d759d6
--- /dev/null
+++ b/chromium/content/public/android/java/res/values-v17/styles.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-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.
+-->
+
+<resources>
+ <style name="ContentActionBar">
+ <item name="action_mode_share_drawable">@drawable/ic_menu_share_holo_light</item>
+ <item name="action_mode_web_search_drawable">@drawable/ic_menu_search_holo_light</item>
+ </style>
+ <style name="SelectPopupDialog">
+ <item name="select_dialog_singlechoice">@android:layout/select_dialog_singlechoice</item>
+ <item name="select_dialog_multichoice">@android:layout/select_dialog_multichoice</item>
+ </style>
+</resources>
diff --git a/chromium/content/public/android/java/res/values/attrs.xml b/chromium/content/public/android/java/res/values/attrs.xml
new file mode 100644
index 00000000000..8014143954b
--- /dev/null
+++ b/chromium/content/public/android/java/res/values/attrs.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-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.
+-->
+
+<resources>
+ <attr name="action_mode_share_drawable" format="reference" />
+ <attr name="action_mode_web_search_drawable" format="reference" />
+ <attr name="select_dialog_multichoice" format="reference" />
+ <attr name="select_dialog_singlechoice" format="reference" />
+</resources>
diff --git a/chromium/content/public/android/java/resource_map/org/chromium/content/R.java b/chromium/content/public/android/java/resource_map/org/chromium/content/R.java
index ea936839690..6204c72a058 100644
--- a/chromium/content/public/android/java/resource_map/org/chromium/content/R.java
+++ b/chromium/content/public/android/java/resource_map/org/chromium/content/R.java
@@ -16,12 +16,16 @@ package org.chromium.content;
* com.android.internal.R.
*/
public final class R {
+ public static final class attr {
+ public static int action_mode_share_drawable;
+ public static int action_mode_web_search_drawable;
+ public static int select_dialog_multichoice;
+ public static int select_dialog_singlechoice;
+ }
public static final class dimen {
public static int link_preview_overlay_radius;
}
public static final class drawable {
- public static int ic_menu_search_holo_light;
- public static int ic_menu_share_holo_light;
public static int ondemand_overlay;
}
public static final class id {
@@ -56,4 +60,8 @@ public final class R {
public static int month_picker_dialog_title;
public static int week_picker_dialog_title;
}
+ public static final class style {
+ public static int ContentActionBar;
+ public static int SelectPopupDialog;
+ }
}
diff --git a/chromium/content/public/android/java/src/org/chromium/content/browser/ContentView.java b/chromium/content/public/android/java/src/org/chromium/content/browser/ContentView.java
index c1d7b0aab00..f4c358bb0ad 100644
--- a/chromium/content/public/android/java/src/org/chromium/content/browser/ContentView.java
+++ b/chromium/content/public/android/java/src/org/chromium/content/browser/ContentView.java
@@ -101,6 +101,9 @@ public class ContentView extends FrameLayout
setVerticalScrollBarEnabled(false);
}
+ setFocusable(true);
+ setFocusableInTouchMode(true);
+
mContentViewCore = new ContentViewCore(context);
mContentViewCore.initialize(this, this, nativeWebContents, windowAndroid,
Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN ?
@@ -441,6 +444,12 @@ public class ContentView extends FrameLayout
}
@Override
+ public void onWindowFocusChanged(boolean hasWindowFocus) {
+ super.onWindowFocusChanged(hasWindowFocus);
+ mContentViewCore.onWindowFocusChanged(hasWindowFocus);
+ }
+
+ @Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
return mContentViewCore.onKeyUp(keyCode, event);
}
diff --git a/chromium/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/chromium/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
index 6b65a9c5774..531417fb419 100644
--- a/chromium/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
+++ b/chromium/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
@@ -27,6 +27,7 @@ import android.text.Editable;
import android.util.Log;
import android.util.Pair;
import android.view.ActionMode;
+import android.view.HapticFeedbackConstants;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
@@ -58,8 +59,8 @@ import org.chromium.content.browser.accessibility.BrowserAccessibilityManager;
import org.chromium.content.browser.input.AdapterInputConnection;
import org.chromium.content.browser.input.HandleView;
import org.chromium.content.browser.input.ImeAdapter;
-import org.chromium.content.browser.input.InputMethodManagerWrapper;
import org.chromium.content.browser.input.ImeAdapter.AdapterInputConnectionFactory;
+import org.chromium.content.browser.input.InputMethodManagerWrapper;
import org.chromium.content.browser.input.InsertionHandleController;
import org.chromium.content.browser.input.SelectPopupDialog;
import org.chromium.content.browser.input.SelectionHandleController;
@@ -71,7 +72,6 @@ import org.chromium.ui.gfx.DeviceDisplayInfo;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -403,6 +403,12 @@ import java.util.Map;
// The AccessibilityInjector that handles loading Accessibility scripts into the web page.
private AccessibilityInjector mAccessibilityInjector;
+ // Whether native accessibility, i.e. without any script injection, is allowed.
+ private boolean mNativeAccessibilityAllowed;
+
+ // Whether native accessibility, i.e. without any script injection, has been enabled.
+ private boolean mNativeAccessibilityEnabled;
+
// Handles native accessibility, i.e. without any script injection.
private BrowserAccessibilityManager mBrowserAccessibilityManager;
@@ -519,9 +525,9 @@ import java.util.Map;
// The anchor view should not go outside the bounds of the ContainerView.
int leftMargin = Math.round(x * scale);
int topMargin = Math.round(mRenderCoordinates.getContentOffsetYPix() + y * scale);
+ int scaledWidth = Math.round(width * scale);
// ContentViewCore currently only supports these two container view types.
if (mContainerView instanceof FrameLayout) {
- int scaledWidth = Math.round(width * scale);
if (scaledWidth + leftMargin > mContainerView.getWidth()) {
scaledWidth = mContainerView.getWidth() - leftMargin;
}
@@ -538,9 +544,10 @@ import java.util.Map;
// these models.
leftMargin += mRenderCoordinates.getScrollXPixInt();
topMargin += mRenderCoordinates.getScrollYPixInt();
+
android.widget.AbsoluteLayout.LayoutParams lp =
- new android.widget.AbsoluteLayout.LayoutParams((int)width,
- (int)(height * scale), leftMargin, topMargin);
+ new android.widget.AbsoluteLayout.LayoutParams(
+ scaledWidth, (int)(height * scale), leftMargin, topMargin);
view.setLayoutParams(lp);
} else {
Log.e(TAG, "Unknown layout " + mContainerView.getClass().getName());
@@ -757,8 +764,6 @@ import java.util.Map;
mContainerViewInternals = internalDispatcher;
mContainerView.setWillNotDraw(false);
- mContainerView.setFocusable(true);
- mContainerView.setFocusableInTouchMode(true);
mContainerView.setClickable(true);
mZoomManager = new ZoomManager(mContext, this);
@@ -1375,7 +1380,20 @@ import java.util.Map;
public void evaluateJavaScript(
String script, JavaScriptCallback callback) throws IllegalStateException {
checkIsAlive();
- nativeEvaluateJavaScript(mNativeContentViewCore, script, callback);
+ nativeEvaluateJavaScript(mNativeContentViewCore, script, callback, false);
+ }
+
+ /**
+ * Injects the passed Javascript code in the current page and evaluates it.
+ * If there is no page existing, a new one will be created.
+ *
+ * @param script The Javascript to execute.
+ * @throws IllegalStateException If the ContentView has been destroyed.
+ */
+ public void evaluateJavaScriptEvenIfNotYetNavigated(String script)
+ throws IllegalStateException {
+ checkIsAlive();
+ nativeEvaluateJavaScript(mNativeContentViewCore, script, null, true);
}
/**
@@ -1657,6 +1675,15 @@ import java.util.Map;
mScrolledAndZoomedFocusedEditableNode = false;
}
+ /**
+ * @see View#onWindowFocusChanged(boolean)
+ */
+ public void onWindowFocusChanged(boolean hasWindowFocus) {
+ if (!hasWindowFocus) {
+ mContentViewGestureHandler.onWindowFocusLost();
+ }
+ }
+
public void onFocusChanged(boolean gainFocus) {
if (!gainFocus) getContentViewClient().onImeStateChangeRequested(false);
if (mNativeContentViewCore != 0) nativeSetFocus(mNativeContentViewCore, gainFocus);
@@ -1860,17 +1887,32 @@ import java.util.Map;
}
}
+ /**
+ * Called by native side when the corresponding renderer crashes. Note that if a renderer is
+ * shared between tabs, this might be called multiple times while the tab is crashed. This is
+ * because the tabs sharing a renderer also share RenderProcessHost. When one of those tabs
+ * reloads and a new renderer is created for the shared RenderProcessHost, all tabs are notified
+ * in onRenderProcessSwap(), not only the one that reloads. If this renderer dies, all the other
+ * dead tabs are notified again.
+ * @param alreadyCrashed true iff this tab is already in crashed state but the shared renderer
+ * resurrected and died again since the last time this was called.
+ */
@SuppressWarnings("unused")
@CalledByNative
- private void onTabCrash() {
+ private void onTabCrash(boolean alreadyCrashed) {
assert mPid != 0;
- getContentViewClient().onRendererCrash(ChildProcessLauncher.isOomProtected(mPid));
+ if (!alreadyCrashed) {
+ getContentViewClient().onRendererCrash(ChildProcessLauncher.isOomProtected(mPid));
+ }
mPid = 0;
}
private void handleTapOrPress(
long timeMs, float xPix, float yPix, int isLongPressOrTap, boolean showPress) {
- if (!mContainerView.isFocused()) mContainerView.requestFocus();
+ if (mContainerView.isFocusable() && mContainerView.isFocusableInTouchMode()
+ && !mContainerView.isFocused()) {
+ mContainerView.requestFocus();
+ }
if (!mPopupZoomer.isShowing()) mPopupZoomer.setLastTouch(xPix, yPix);
@@ -1905,6 +1947,10 @@ import java.util.Map;
mZoomManager.updateMultiTouchSupport(supportsMultiTouchZoom);
}
+ public void updateDoubleTapDragSupport(boolean supportsDoubleTapDrag) {
+ mContentViewGestureHandler.updateDoubleTapDragSupport(supportsDoubleTapDrag);
+ }
+
public void selectPopupMenuItems(int[] indices) {
if (mNativeContentViewCore != 0) {
nativeSelectPopupMenuItems(mNativeContentViewCore, indices);
@@ -2403,9 +2449,18 @@ import java.util.Map;
mEndHandlePoint.setLocalDip(x1, y1);
}
+ boolean wereSelectionHandlesShowing = getSelectionHandleController().isShowing();
+
getSelectionHandleController().onSelectionChanged(anchorDir, focusDir);
updateHandleScreenPositions();
mHasSelection = true;
+
+ if (!wereSelectionHandlesShowing && getSelectionHandleController().isShowing()) {
+ // TODO(cjhopman): Remove this when there is a better signal that long press caused
+ // a selection. See http://crbug.com/150151.
+ mContainerView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
+ }
+
} else {
mUnselectAllOnActionModeDismiss = false;
hideSelectActionBar();
@@ -2472,15 +2527,19 @@ import java.util.Map;
@SuppressWarnings("unused")
@CalledByNative
private void onWebContentsConnected() {
- if (mImeAdapter != null &&
- !mImeAdapter.isNativeImeAdapterAttached() && mNativeContentViewCore != 0) {
- mImeAdapter.attach(nativeGetNativeImeAdapter(mNativeContentViewCore));
- }
+ attachImeAdapter();
}
@SuppressWarnings("unused")
@CalledByNative
private void onWebContentsSwapped() {
+ attachImeAdapter();
+ }
+
+ /**
+ * Attaches the native ImeAdapter object to the java ImeAdapter to allow communication via JNI.
+ */
+ public void attachImeAdapter() {
if (mImeAdapter != null && mNativeContentViewCore != 0) {
mImeAdapter.attach(nativeGetNativeImeAdapter(mNativeContentViewCore));
}
@@ -2751,14 +2810,23 @@ import java.util.Map;
* If native accessibility (not script injection) is enabled, and if this is
* running on JellyBean or later, returns an AccessibilityNodeProvider that
* implements native accessibility for this view. Returns null otherwise.
+ * Lazily initializes native accessibility here if it's allowed.
* @return The AccessibilityNodeProvider, if available, or null otherwise.
*/
public AccessibilityNodeProvider getAccessibilityNodeProvider() {
if (mBrowserAccessibilityManager != null) {
return mBrowserAccessibilityManager.getAccessibilityNodeProvider();
- } else {
- return null;
}
+
+ if (mNativeAccessibilityAllowed &&
+ !mNativeAccessibilityEnabled &&
+ mNativeContentViewCore != 0 &&
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ mNativeAccessibilityEnabled = true;
+ nativeSetAccessibilityEnabled(mNativeContentViewCore, true);
+ }
+
+ return null;
}
/**
@@ -2845,29 +2913,20 @@ import java.util.Map;
* Turns browser accessibility on or off.
* If |state| is |false|, this turns off both native and injected accessibility.
* Otherwise, if accessibility script injection is enabled, this will enable the injected
- * accessibility scripts, and if it is disabled this will enable the native accessibility.
+ * accessibility scripts. Native accessibility is enabled on demand.
*/
public void setAccessibilityState(boolean state) {
- boolean injectedAccessibility = false;
- boolean nativeAccessibility = false;
- if (state) {
- if (isDeviceAccessibilityScriptInjectionEnabled()) {
- injectedAccessibility = true;
- } else {
- nativeAccessibility = true;
- }
+ if (!state) {
+ setInjectedAccessibility(false);
+ return;
}
- setInjectedAccessibility(injectedAccessibility);
- setNativeAccessibilityState(nativeAccessibility);
- }
- /**
- * Enable or disable native accessibility features.
- */
- public void setNativeAccessibilityState(boolean enabled) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
- nativeSetAccessibilityEnabled(mNativeContentViewCore, enabled);
+ if (isDeviceAccessibilityScriptInjectionEnabled()) {
+ setInjectedAccessibility(true);
+ return;
}
+
+ mNativeAccessibilityAllowed = true;
}
/**
@@ -3121,7 +3180,7 @@ import java.util.Map;
private native void nativeClearHistory(int nativeContentViewCoreImpl);
private native void nativeEvaluateJavaScript(int nativeContentViewCoreImpl,
- String script, JavaScriptCallback callback);
+ String script, JavaScriptCallback callback, boolean startRenderer);
private native int nativeGetNativeImeAdapter(int nativeContentViewCoreImpl);
diff --git a/chromium/content/public/android/java/src/org/chromium/content/browser/ContentViewGestureHandler.java b/chromium/content/public/android/java/src/org/chromium/content/browser/ContentViewGestureHandler.java
index 053aa9a48a3..ddf433e3ac2 100644
--- a/chromium/content/public/android/java/src/org/chromium/content/browser/ContentViewGestureHandler.java
+++ b/chromium/content/public/android/java/src/org/chromium/content/browser/ContentViewGestureHandler.java
@@ -9,6 +9,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.util.Log;
+import android.view.InputDevice;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
@@ -143,6 +144,10 @@ class ContentViewGestureHandler implements LongPressDelegate {
// Whether input events are delivered right before vsync.
private final boolean mInputEventsDeliveredAtVSync;
+ // Keeps track of the last long press event, if we end up opening a context menu, we would need
+ // to potentially use the event to send GESTURE_SHOW_PRESS_CANCEL to remove ::active styling
+ private MotionEvent mLastLongPressEvent;
+
static final int GESTURE_SHOW_PRESSED_STATE = 0;
static final int GESTURE_DOUBLE_TAP = 1;
static final int GESTURE_SINGLE_TAP_UP = 2;
@@ -176,6 +181,7 @@ class ContentViewGestureHandler implements LongPressDelegate {
static final int DOUBLE_TAP_DRAG_MODE_NONE = 0;
static final int DOUBLE_TAP_DRAG_MODE_DETECTION_IN_PROGRESS = 1;
static final int DOUBLE_TAP_DRAG_MODE_ZOOM = 2;
+ static final int DOUBLE_TAP_DRAG_MODE_DISABLED = 3;
private class TouchEventTimeoutHandler implements Runnable {
private static final int TOUCH_EVENT_TIMEOUT = 200;
@@ -336,9 +342,9 @@ class ContentViewGestureHandler implements LongPressDelegate {
void setTestDependencies(
LongPressDetector longPressDetector, GestureDetector gestureDetector,
OnGestureListener listener) {
- mLongPressDetector = longPressDetector;
- mGestureDetector = gestureDetector;
- mListener = listener;
+ if (longPressDetector != null) mLongPressDetector = longPressDetector;
+ if (gestureDetector != null) mGestureDetector = gestureDetector;
+ if (listener != null) mListener = listener;
}
private void initGestureDetectors(final Context context) {
@@ -510,6 +516,7 @@ class ContentViewGestureHandler implements LongPressDelegate {
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
+ if (isDoubleTapDragDisabled()) return false;
switch (e.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
sendShowPressCancelIfNecessary(e);
@@ -543,7 +550,7 @@ class ContentViewGestureHandler implements LongPressDelegate {
pinchBy(e.getEventTime(),
Math.round(mDoubleTapDragZoomAnchorX),
Math.round(mDoubleTapDragZoomAnchorY),
- (float) Math.pow(dy < 0 ?
+ (float) Math.pow(dy > 0 ?
1.0f - DOUBLE_TAP_DRAG_ZOOM_SPEED :
1.0f + DOUBLE_TAP_DRAG_ZOOM_SPEED,
Math.abs(dy * mPxToDp)));
@@ -569,8 +576,9 @@ class ContentViewGestureHandler implements LongPressDelegate {
@Override
public void onLongPress(MotionEvent e) {
if (!mZoomManager.isScaleGestureDetectionInProgress() &&
- mDoubleTapDragMode == DOUBLE_TAP_DRAG_MODE_NONE) {
- sendShowPressCancelIfNecessary(e);
+ (mDoubleTapDragMode == DOUBLE_TAP_DRAG_MODE_NONE ||
+ isDoubleTapDragDisabled())) {
+ mLastLongPressEvent = e;
sendMotionEventAsGesture(GESTURE_LONG_PRESS, e, null);
}
}
@@ -664,6 +672,7 @@ class ContentViewGestureHandler implements LongPressDelegate {
* to send. This argument is an optional and can be null.
*/
void endDoubleTapDragMode(MotionEvent event) {
+ if (isDoubleTapDragDisabled()) return;
if (mDoubleTapDragMode == DOUBLE_TAP_DRAG_MODE_ZOOM) {
if (event == null) event = obtainActionCancelMotionEvent();
pinchEnd(event.getEventTime());
@@ -796,6 +805,15 @@ class ContentViewGestureHandler implements LongPressDelegate {
}
}
+ /**
+ * Handle content view losing focus -- ensure that any remaining active state is removed.
+ */
+ void onWindowFocusLost() {
+ if (mLongPressDetector.isInLongPress() && mLastLongPressEvent != null) {
+ sendShowPressCancelIfNecessary(mLastLongPressEvent);
+ }
+ }
+
private MotionEvent obtainActionCancelMotionEvent() {
return MotionEvent.obtain(
SystemClock.uptimeMillis(),
@@ -810,16 +828,11 @@ class ContentViewGestureHandler implements LongPressDelegate {
* FrameLoader::transitionToCommitted iff the page ever had touch handlers.
*/
void resetGestureHandlers() {
- {
- MotionEvent me = obtainActionCancelMotionEvent();
- mGestureDetector.onTouchEvent(me);
- me.recycle();
- }
- {
- MotionEvent me = obtainActionCancelMotionEvent();
- mZoomManager.processTouchEvent(me);
- me.recycle();
- }
+ MotionEvent me = obtainActionCancelMotionEvent();
+ me.setSource(InputDevice.SOURCE_CLASS_POINTER);
+ mGestureDetector.onTouchEvent(me);
+ mZoomManager.processTouchEvent(me);
+ me.recycle();
mLongPressDetector.cancelLongPress();
}
@@ -1081,6 +1094,7 @@ class ContentViewGestureHandler implements LongPressDelegate {
if (sendMotionEventAsGesture(GESTURE_SHOW_PRESS_CANCEL, e, null)) {
mShowPressIsCalled = false;
+ mLastLongPressEvent = null;
}
}
@@ -1148,4 +1162,15 @@ class ContentViewGestureHandler implements LongPressDelegate {
boolean hasScheduledTouchTimeoutEventForTesting() {
return mTouchEventTimeoutHandler.hasScheduledTimeoutEventForTesting();
}
+
+ public void updateDoubleTapDragSupport(boolean supportDoubleTapDrag) {
+ assert (mDoubleTapDragMode == DOUBLE_TAP_DRAG_MODE_DISABLED ||
+ mDoubleTapDragMode == DOUBLE_TAP_DRAG_MODE_NONE);
+ mDoubleTapDragMode = supportDoubleTapDrag ?
+ DOUBLE_TAP_DRAG_MODE_NONE : DOUBLE_TAP_DRAG_MODE_DISABLED;
+ }
+
+ private boolean isDoubleTapDragDisabled() {
+ return mDoubleTapDragMode == DOUBLE_TAP_DRAG_MODE_DISABLED;
+ }
}
diff --git a/chromium/content/public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java b/chromium/content/public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java
index 5d0de5ad95b..cab9de296b5 100644
--- a/chromium/content/public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java
+++ b/chromium/content/public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java
@@ -5,6 +5,7 @@
package org.chromium.content.browser;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.media.MediaMetadataRetriever;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
@@ -63,6 +64,12 @@ class MediaResourceGetter {
ConnectivityManager mConnectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (mConnectivityManager != null) {
+ if (context.checkCallingOrSelfPermission(
+ android.Manifest.permission.ACCESS_NETWORK_STATE) !=
+ PackageManager.PERMISSION_GRANTED) {
+ return new MediaMetadata(0, 0, 0, false);
+ }
+
NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
if (info == null) {
return new MediaMetadata(durationInMilliseconds, width, height, success);
diff --git a/chromium/content/public/android/java/src/org/chromium/content/browser/SelectActionModeCallback.java b/chromium/content/public/android/java/src/org/chromium/content/browser/SelectActionModeCallback.java
index 4ff58bd6bdc..6053448f554 100644
--- a/chromium/content/public/android/java/src/org/chromium/content/browser/SelectActionModeCallback.java
+++ b/chromium/content/public/android/java/src/org/chromium/content/browser/SelectActionModeCallback.java
@@ -4,6 +4,7 @@
package org.chromium.content.browser;
+import android.app.Activity;
import android.app.SearchManager;
import android.content.ClipboardManager;
import android.content.Context;
@@ -27,11 +28,15 @@ public class SelectActionModeCallback implements ActionMode.Callback {
private static final int CUT_ATTR_INDEX = 1;
private static final int COPY_ATTR_INDEX = 2;
private static final int PASTE_ATTR_INDEX = 3;
+ private static final int SHARE_ATTR_INDEX = 4;
+ private static final int WEB_SEARCH_ATTR_INDEX = 5;
private static final int[] ACTION_MODE_ATTRS = {
android.R.attr.actionModeSelectAllDrawable,
android.R.attr.actionModeCutDrawable,
android.R.attr.actionModeCopyDrawable,
android.R.attr.actionModePasteDrawable,
+ R.attr.action_mode_share_drawable,
+ R.attr.action_mode_web_search_drawable
};
private static final int ID_SELECTALL = 0;
@@ -124,7 +129,8 @@ public class SelectActionModeCallback implements ActionMode.Callback {
}
private void createActionMenu(ActionMode mode, Menu menu) {
- TypedArray styledAttributes = getContext().obtainStyledAttributes(ACTION_MODE_ATTRS);
+ TypedArray styledAttributes = getContext().obtainStyledAttributes(
+ R.style.ContentActionBar, ACTION_MODE_ATTRS);
menu.add(Menu.NONE, ID_SELECTALL, Menu.NONE, android.R.string.selectAll).
setAlphabeticShortcut('a').
@@ -157,14 +163,14 @@ public class SelectActionModeCallback implements ActionMode.Callback {
if (!mEditable) {
if (isShareHandlerAvailable()) {
menu.add(Menu.NONE, ID_SHARE, Menu.NONE, R.string.actionbar_share).
- setIcon(R.drawable.ic_menu_share_holo_light).
+ setIcon(styledAttributes.getResourceId(SHARE_ATTR_INDEX, 0)).
setShowAsAction(
MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
}
if (!mIncognito && isWebSearchAvailable()) {
menu.add(Menu.NONE, ID_SEARCH, Menu.NONE, R.string.actionbar_web_search).
- setIcon(R.drawable.ic_menu_search_holo_light).
+ setIcon(styledAttributes.getResourceId(WEB_SEARCH_ATTR_INDEX, 0)).
setShowAsAction(
MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
}
@@ -212,6 +218,9 @@ public class SelectActionModeCallback implements ActionMode.Callback {
i.putExtra(SearchManager.EXTRA_NEW_SEARCH, true);
i.putExtra(SearchManager.QUERY, selection);
i.putExtra(Browser.EXTRA_APPLICATION_ID, getContext().getPackageName());
+ if (!(getContext() instanceof Activity)) {
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
try {
getContext().startActivity(i);
} catch (android.content.ActivityNotFoundException ex) {
diff --git a/chromium/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java b/chromium/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
index f03ba9b79e7..2180b480e7f 100644
--- a/chromium/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
+++ b/chromium/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java
@@ -268,13 +268,11 @@ public class BrowserAccessibilityManager {
@CalledByNative
private void handleTextSelectionChanged(int id) {
- sendAccessibilityEvent(id, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED);
}
@CalledByNative
private void handleEditableTextChanged(int id) {
- sendAccessibilityEvent(id, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
}
diff --git a/chromium/content/public/android/java/src/org/chromium/content/browser/input/HandleView.java b/chromium/content/public/android/java/src/org/chromium/content/browser/input/HandleView.java
index a220894fd80..88a6deaefea 100644
--- a/chromium/content/public/android/java/src/org/chromium/content/browser/input/HandleView.java
+++ b/chromium/content/public/android/java/src/org/chromium/content/browser/input/HandleView.java
@@ -152,16 +152,20 @@ public class HandleView extends View {
mDrawable.getIntrinsicHeight());
}
+ private void updateContainerPosition() {
+ final int[] coords = mTempCoords;
+ mParent.getLocationInWindow(coords);
+ mContainerPositionX = coords[0] + mPositionX;
+ mContainerPositionY = coords[1] + mPositionY;
+ }
+
void show() {
if (!isPositionVisible()) {
hide();
return;
}
mContainer.setContentView(this);
- final int[] coords = mTempCoords;
- mParent.getLocationInWindow(coords);
- mContainerPositionX = coords[0] + mPositionX;
- mContainerPositionY = coords[1] + mPositionY;
+ updateContainerPosition();
mContainer.showAtLocation(mParent, 0, mContainerPositionX, mContainerPositionY);
// Hide paste view when handle is moved on screen.
@@ -261,6 +265,9 @@ public class HandleView extends View {
@Override
protected void onDraw(Canvas c) {
updateAlpha();
+ updateContainerPosition();
+ mContainer.update(mContainerPositionX, mContainerPositionY,
+ getRight() - getLeft(), getBottom() - getTop());
mDrawable.setBounds(0, 0, getRight() - getLeft(), getBottom() - getTop());
mDrawable.draw(c);
}
diff --git a/chromium/content/public/android/java/src/org/chromium/content/browser/input/MonthPicker.java b/chromium/content/public/android/java/src/org/chromium/content/browser/input/MonthPicker.java
index 3e06d75cf90..57cab667619 100644
--- a/chromium/content/public/android/java/src/org/chromium/content/browser/input/MonthPicker.java
+++ b/chromium/content/public/android/java/src/org/chromium/content/browser/input/MonthPicker.java
@@ -92,16 +92,16 @@ public class MonthPicker extends TwoFieldDatePicker {
@Override
- protected int getMaxPositionInYear() {
- if (getYear() == getMaxDate().get(Calendar.YEAR)) {
+ protected int getMaxPositionInYear(int year) {
+ if (year == getMaxDate().get(Calendar.YEAR)) {
return getMaxDate().get(Calendar.MONTH);
}
return MONTHS_NUMBER - 1;
}
@Override
- protected int getMinPositionInYear() {
- if (getYear() == getMinDate().get(Calendar.YEAR)) {
+ protected int getMinPositionInYear(int year) {
+ if (year == getMinDate().get(Calendar.YEAR)) {
return getMinDate().get(Calendar.MONTH);
}
return 0;
diff --git a/chromium/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDialog.java b/chromium/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDialog.java
index d32266b0f44..360f9282883 100644
--- a/chromium/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDialog.java
+++ b/chromium/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDialog.java
@@ -8,6 +8,7 @@ import org.chromium.content.browser.ContentViewCore;
import android.app.AlertDialog;
import android.content.DialogInterface;
+import android.content.res.TypedArray;
import android.util.SparseBooleanArray;
import android.view.View;
import android.view.ViewGroup;
@@ -17,6 +18,8 @@ import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
import android.widget.ListView;
+import org.chromium.content.R;
+
/**
* Handles the popup dialog for the <select> HTML tag support.
*/
@@ -24,6 +27,11 @@ public class SelectPopupDialog {
// The currently showing popup dialog, null if none is showing.
private static SelectPopupDialog sShownDialog;
+ private static final int[] SELECT_DIALOG_ATTRS = {
+ R.attr.select_dialog_multichoice,
+ R.attr.select_dialog_singlechoice
+ };
+
// The dialog hosting the popup list view.
private AlertDialog mListBoxPopup = null;
@@ -48,9 +56,7 @@ public class SelectPopupDialog {
private boolean mAreAllItemsEnabled;
public SelectPopupArrayAdapter(String[] labels, int[] enabled, boolean multiple) {
- super(mContentViewCore.getContext(), multiple ?
- android.R.layout.select_dialog_multichoice :
- android.R.layout.select_dialog_singlechoice, labels);
+ super(mContentViewCore.getContext(), getSelectDialogLayout(multiple), labels);
mItemEnabled = enabled;
mAreAllItemsEnabled = true;
for (int item : mItemEnabled) {
@@ -99,11 +105,21 @@ public class SelectPopupDialog {
}
}
+ private int getSelectDialogLayout(boolean isMultiChoice) {
+ int resource_id;
+ TypedArray styledAttributes = mContentViewCore.getContext().obtainStyledAttributes(
+ R.style.SelectPopupDialog, SELECT_DIALOG_ATTRS);
+ resource_id = styledAttributes.getResourceId(isMultiChoice ? 0 : 1, 0);
+ styledAttributes.recycle();
+ return resource_id;
+ }
+
private SelectPopupDialog(ContentViewCore contentViewCore, String[] labels, int[] enabled,
boolean multiple, int[] selected) {
mContentViewCore = contentViewCore;
final ListView listView = new ListView(mContentViewCore.getContext());
+ listView.setCacheColorHint(0);
AlertDialog.Builder b = new AlertDialog.Builder(mContentViewCore.getContext())
.setView(listView)
.setCancelable(true)
diff --git a/chromium/content/public/android/java/src/org/chromium/content/browser/input/TwoFieldDatePicker.java b/chromium/content/public/android/java/src/org/chromium/content/browser/input/TwoFieldDatePicker.java
index 4eaa0b787cb..c6dfd616c38 100644
--- a/chromium/content/public/android/java/src/org/chromium/content/browser/input/TwoFieldDatePicker.java
+++ b/chromium/content/public/android/java/src/org/chromium/content/browser/input/TwoFieldDatePicker.java
@@ -67,8 +67,10 @@ public abstract class TwoFieldDatePicker extends FrameLayout {
positionInYear = newVal;
if (oldVal == picker.getMaxValue() && newVal == picker.getMinValue()) {
year += 1;
+ positionInYear = getMinPositionInYear(year);
} else if (oldVal == picker.getMinValue() && newVal == picker.getMaxValue()) {
year -=1;
+ positionInYear = getMaxPositionInYear(year);
}
} else if (picker == mYearSpinner) {
year = newVal;
@@ -188,9 +190,9 @@ public abstract class TwoFieldDatePicker extends FrameLayout {
protected abstract int getMinYear();
- protected abstract int getMaxPositionInYear();
+ protected abstract int getMaxPositionInYear(int year);
- protected abstract int getMinPositionInYear();
+ protected abstract int getMinPositionInYear(int year);
protected Calendar getMaxDate() {
return mMaxDate;
@@ -219,8 +221,8 @@ public abstract class TwoFieldDatePicker extends FrameLayout {
mPositionInYearSpinner.setDisplayedValues(null);
// set the spinner ranges respecting the min and max dates
- mPositionInYearSpinner.setMinValue(getMinPositionInYear());
- mPositionInYearSpinner.setMaxValue(getMaxPositionInYear());
+ mPositionInYearSpinner.setMinValue(getMinPositionInYear(getYear()));
+ mPositionInYearSpinner.setMaxValue(getMaxPositionInYear(getYear()));
mPositionInYearSpinner.setWrapSelectorWheel(
!mCurrentDate.equals(mMinDate) && !mCurrentDate.equals(mMaxDate));
diff --git a/chromium/content/public/android/java/src/org/chromium/content/browser/input/WeekPicker.java b/chromium/content/public/android/java/src/org/chromium/content/browser/input/WeekPicker.java
index 117793b1978..efca4763a29 100644
--- a/chromium/content/public/android/java/src/org/chromium/content/browser/input/WeekPicker.java
+++ b/chromium/content/public/android/java/src/org/chromium/content/browser/input/WeekPicker.java
@@ -76,9 +76,9 @@ public class WeekPicker extends TwoFieldDatePicker {
}
}
- private int getNumberOfWeeks() {
+ private int getNumberOfWeeks(int year) {
// Create a date in the middle of the year, where the week year matches the year.
- Calendar date = createDateFromWeek(getYear(), 20);
+ Calendar date = createDateFromWeek(year, 20);
return date.getActualMaximum(Calendar.WEEK_OF_YEAR);
}
@@ -113,16 +113,16 @@ public class WeekPicker extends TwoFieldDatePicker {
}
@Override
- protected int getMaxPositionInYear() {
- if (getYear() == getISOWeekYearForDate(getMaxDate())) {
+ protected int getMaxPositionInYear(int year) {
+ if (year == getISOWeekYearForDate(getMaxDate())) {
return getWeekForDate(getMaxDate());
}
- return getNumberOfWeeks();
+ return getNumberOfWeeks(year);
}
@Override
- protected int getMinPositionInYear() {
- if (getYear() == getISOWeekYearForDate(getMinDate())) {
+ protected int getMinPositionInYear(int year) {
+ if (year == getISOWeekYearForDate(getMinDate())) {
return getWeekForDate(getMinDate());
}
return 1;
diff --git a/chromium/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java b/chromium/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java
index 2647b3a2f59..ce63defa32c 100644
--- a/chromium/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java
+++ b/chromium/content/public/android/javatests/src/org/chromium/content/browser/ContentViewGestureHandlerTest.java
@@ -639,6 +639,55 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase {
}
/**
+ * Verify that a show pressed state gesture followed by a long press followed by
+ * the focus
+ * loss in the window due to context menu cancels show pressed.
+ * @throws Exception
+ */
+ @SmallTest
+ @Feature({"Gestures"})
+ public void testShowPressCancelOnWindowFocusLost() throws Exception {
+ final long time = SystemClock.uptimeMillis();
+ GestureRecordingMotionEventDelegate mockDelegate =
+ new GestureRecordingMotionEventDelegate();
+ mGestureHandler = new ContentViewGestureHandler(
+ getInstrumentation().getTargetContext(), mockDelegate,
+ new MockZoomManager(getInstrumentation().getTargetContext(), null),
+ ContentViewCore.INPUT_EVENTS_DELIVERED_AT_VSYNC);
+ mLongPressDetector = new LongPressDetector(
+ getInstrumentation().getTargetContext(), mGestureHandler);
+ mGestureHandler.setTestDependencies(mLongPressDetector, null, null);
+
+ MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, time, time);
+ mGestureHandler.onTouchEvent(event);
+
+ mGestureHandler.sendShowPressedStateGestureForTesting();
+ assertEquals("A show pressed state event should have been sent",
+ ContentViewGestureHandler.GESTURE_SHOW_PRESSED_STATE,
+ mockDelegate.mMostRecentGestureEvent.mType);
+ assertEquals("Only showPressedState should have been sent",
+ 1, mockDelegate.mGestureTypeList.size());
+
+ mLongPressDetector.startLongPressTimerIfNeeded(event);
+ mLongPressDetector.sendLongPressGestureForTest();
+
+ assertEquals("Only should have sent only LONG_PRESS event",
+ 2, mockDelegate.mGestureTypeList.size());
+ assertEquals("Should have a long press event next",
+ ContentViewGestureHandler.GESTURE_LONG_PRESS,
+ mockDelegate.mGestureTypeList.get(1).intValue());
+
+ // The long press triggers window focus loss by opening a context menu
+ mGestureHandler.onWindowFocusLost();
+
+ assertEquals("Only should have sent only GESTURE_SHOW_PRESS_CANCEL event",
+ 3, mockDelegate.mGestureTypeList.size());
+ assertEquals("Should have a long press event next",
+ ContentViewGestureHandler.GESTURE_SHOW_PRESS_CANCEL,
+ mockDelegate.mGestureTypeList.get(2).intValue());
+ }
+
+ /**
* Verify that a recent show pressed state gesture is canceled when scrolling begins.
* @throws Exception
*/
@@ -890,6 +939,73 @@ public class ContentViewGestureHandlerTest extends InstrumentationTestCase {
}
/**
+ * Verify that double tap drag zoom feature is not invoked
+ * when it is disabled..
+ * @throws Exception
+ */
+ @SmallTest
+ @Feature({"Gestures"})
+ public void testDoubleTapDragZoomNothingWhenDisabled() throws Exception {
+ final long downTime1 = SystemClock.uptimeMillis();
+ final long downTime2 = downTime1 + 100;
+
+ GestureRecordingMotionEventDelegate mockDelegate =
+ new GestureRecordingMotionEventDelegate();
+ mGestureHandler = new ContentViewGestureHandler(
+ getInstrumentation().getTargetContext(), mockDelegate,
+ new MockZoomManager(getInstrumentation().getTargetContext(), null),
+ ContentViewCore.INPUT_EVENTS_DELIVERED_AT_VSYNC);
+
+ mGestureHandler.updateDoubleTapDragSupport(false);
+
+ MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime1, downTime1);
+ assertTrue(mGestureHandler.onTouchEvent(event));
+
+ event = MotionEvent.obtain(
+ downTime1, downTime1 + 5, MotionEvent.ACTION_UP,
+ FAKE_COORD_X, FAKE_COORD_Y, 0);
+ mGestureHandler.onTouchEvent(event);
+
+ event = MotionEvent.obtain(
+ downTime2, downTime2, MotionEvent.ACTION_DOWN,
+ FAKE_COORD_X, FAKE_COORD_Y, 0);
+ assertTrue(mGestureHandler.onTouchEvent(event));
+
+ event = MotionEvent.obtain(
+ downTime2, downTime2 + 5, MotionEvent.ACTION_MOVE,
+ FAKE_COORD_X, FAKE_COORD_Y + 100, 0);
+ // As double tap and drag to zoom is disabled, we won't handle
+ // the move event.
+ assertFalse(mGestureHandler.onTouchEvent(event));
+
+ assertFalse("No GESTURE_SCROLL_START should have been sent",
+ mockDelegate.mGestureTypeList.contains(
+ ContentViewGestureHandler.GESTURE_SCROLL_START));
+ assertTrue("No GESTURE_PINCH_BEGIN should have been sent",
+ ContentViewGestureHandler.GESTURE_PINCH_BEGIN !=
+ mockDelegate.mMostRecentGestureEvent.mType);
+
+ event = MotionEvent.obtain(
+ downTime2, downTime2 + 10, MotionEvent.ACTION_MOVE,
+ FAKE_COORD_X, FAKE_COORD_Y + 200, 0);
+ assertFalse(mGestureHandler.onTouchEvent(event));
+ assertFalse("No GESTURE_SCROLL_BY should have been sent",
+ mockDelegate.mGestureTypeList.contains(
+ ContentViewGestureHandler.GESTURE_SCROLL_BY));
+ assertTrue("No GESTURE_PINCH_BY should have been sent",
+ ContentViewGestureHandler.GESTURE_PINCH_BY !=
+ mockDelegate.mMostRecentGestureEvent.mType);
+
+ event = MotionEvent.obtain(
+ downTime2, downTime2 + 15, MotionEvent.ACTION_UP,
+ FAKE_COORD_X, FAKE_COORD_Y + 200, 0);
+ assertFalse(mGestureHandler.onTouchEvent(event));
+ assertFalse("No GESTURE_PINCH_END should have been sent",
+ mockDelegate.mGestureTypeList.contains(
+ ContentViewGestureHandler.GESTURE_PINCH_END));
+ }
+
+ /**
* Mock MotionEventDelegate that remembers the most recent gesture event.
*/
static class GestureRecordingMotionEventDelegate implements MotionEventDelegate {
diff --git a/chromium/content/public/android/javatests/src/org/chromium/content/browser/ContentViewScrollingTest.java b/chromium/content/public/android/javatests/src/org/chromium/content/browser/ContentViewScrollingTest.java
index 998f036d58a..d880a96b86b 100644
--- a/chromium/content/public/android/javatests/src/org/chromium/content/browser/ContentViewScrollingTest.java
+++ b/chromium/content/public/android/javatests/src/org/chromium/content/browser/ContentViewScrollingTest.java
@@ -26,6 +26,15 @@ public class ContentViewScrollingTest extends ContentShellTestBase {
"<body>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</body>" +
"</html>");
+ private void assertWaitForPageScaleFactor(final float scale) throws InterruptedException {
+ assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
+ @Override
+ public boolean isSatisfied() {
+ return getContentViewCore().getScale() == scale;
+ }
+ }));
+ }
+
private void assertWaitForScroll(final boolean hugLeft, final boolean hugTop)
throws InterruptedException {
assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
@@ -70,7 +79,7 @@ public class ContentViewScrollingTest extends ContentShellTestBase {
launchContentShellWithUrl(LARGE_PAGE);
assertTrue("Page failed to load", waitForActiveShellToBeDoneLoading());
- assertWaitForPageScaleFactorMatch(1.0f);
+ assertWaitForPageScaleFactor(1.0f);
assertEquals(0, getContentViewCore().getNativeScrollXForTest());
assertEquals(0, getContentViewCore().getNativeScrollYForTest());
diff --git a/chromium/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java b/chromium/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java
index e4c1a5f727f..a12007f3cc8 100644
--- a/chromium/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java
+++ b/chromium/content/public/android/javatests/src/org/chromium/content/browser/input/ImeTest.java
@@ -61,7 +61,7 @@ public class ImeTest extends ContentShellTestBase {
mContentView = getActivity().getActiveContentView();
mCallbackContainer = new TestCallbackHelperContainer(mContentView);
// TODO(aurimas) remove this wait once crbug.com/179511 is fixed.
- assertWaitForPageScaleFactorMatch(1);
+ assertWaitForPageScaleFactor(1);
DOMUtils.clickNode(this, mContentView, mCallbackContainer, "input_text");
assertWaitForKeyboardStatus(true);
@@ -286,6 +286,17 @@ public class ImeTest extends ContentShellTestBase {
});
}
+
+
+ private void assertWaitForPageScaleFactor(final float scale) throws InterruptedException {
+ assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
+ @Override
+ public boolean isSatisfied() {
+ return getContentViewCore().getScale() == scale;
+ }
+ }));
+ }
+
private void assertWaitForKeyboardStatus(final boolean show) throws InterruptedException {
assertTrue(CriteriaHelper.pollForCriteria(new Criteria() {
@Override
diff --git a/chromium/content/public/android/javatests/src/org/chromium/content/browser/input/InsertionHandleTest.java b/chromium/content/public/android/javatests/src/org/chromium/content/browser/input/InsertionHandleTest.java
index 91e61242d71..d2697b711f1 100644
--- a/chromium/content/public/android/javatests/src/org/chromium/content/browser/input/InsertionHandleTest.java
+++ b/chromium/content/public/android/javatests/src/org/chromium/content/browser/input/InsertionHandleTest.java
@@ -87,12 +87,8 @@ public class InsertionHandleTest extends ContentShellTestBase {
}
- /**
- * @MediumTest
- * @Feature({"TextSelection", "TextInput", "Main"})
- * http://crbug.com/169648
- */
- @DisabledTest
+ @MediumTest
+ @Feature({"TextSelection", "TextInput", "Main"})
public void testKeyEventHidesHandle() throws Throwable {
launchWithUrl(TEXTAREA_DATA_URL);
clickNodeToShowInsertionHandle(TEXTAREA_ID);
diff --git a/chromium/content/public/browser/android/synchronous_compositor_client.h b/chromium/content/public/browser/android/synchronous_compositor_client.h
index dbd6d33bdf4..bfd647b931d 100644
--- a/chromium/content/public/browser/android/synchronous_compositor_client.h
+++ b/chromium/content/public/browser/android/synchronous_compositor_client.h
@@ -27,7 +27,8 @@ class SynchronousCompositorClient {
// See LayerScrollOffsetDelegate for details.
virtual void SetTotalRootLayerScrollOffset(gfx::Vector2dF new_value) = 0;
virtual gfx::Vector2dF GetTotalRootLayerScrollOffset() = 0;
- virtual void DidOverscroll(gfx::Vector2dF latest_overscroll_delta,
+ virtual void DidOverscroll(gfx::Vector2dF accumulated_overscroll,
+ gfx::Vector2dF latest_overscroll_delta,
gfx::Vector2dF current_fling_velocity) = 0;
// When true, should periodically call
diff --git a/chromium/content/public/browser/browser_plugin_guest_delegate.h b/chromium/content/public/browser/browser_plugin_guest_delegate.h
index 73b477040cd..11facb9b5ed 100644
--- a/chromium/content/public/browser/browser_plugin_guest_delegate.h
+++ b/chromium/content/public/browser/browser_plugin_guest_delegate.h
@@ -11,7 +11,6 @@
#include "base/values.h"
#include "content/common/content_export.h"
#include "content/public/common/browser_plugin_permission_type.h"
-#include "ui/gfx/size.h"
namespace content {
@@ -58,10 +57,6 @@ class CONTENT_EXPORT BrowserPluginGuestDelegate {
BrowserPluginPermissionType permission_type,
const base::DictionaryValue& request_info,
const PermissionResponseCallback& callback);
-
- // Notifies that the content size of the guest has changed in autosize mode.
- virtual void SizeChanged(const gfx::Size& old_size,
- const gfx::Size& new_size) {}
};
} // namespace content
diff --git a/chromium/content/public/browser/content_browser_client.cc b/chromium/content/public/browser/content_browser_client.cc
index c2bf137b077..4337c2da772 100644
--- a/chromium/content/public/browser/content_browser_client.cc
+++ b/chromium/content/public/browser/content_browser_client.cc
@@ -208,6 +208,7 @@ WebKit::WebNotificationPresenter::Permission
bool ContentBrowserClient::CanCreateWindow(
const GURL& opener_url,
+ const GURL& opener_top_level_frame_url,
const GURL& source_origin,
WindowContainerType container_type,
const GURL& target_url,
diff --git a/chromium/content/public/browser/content_browser_client.h b/chromium/content/public/browser/content_browser_client.h
index 21687691706..56c01775e65 100644
--- a/chromium/content/public/browser/content_browser_client.h
+++ b/chromium/content/public/browser/content_browser_client.h
@@ -451,6 +451,7 @@ class CONTENT_EXPORT ContentBrowserClient {
// the window that is created should be scriptable/in the same process.
// This is called on the IO thread.
virtual bool CanCreateWindow(const GURL& opener_url,
+ const GURL& opener_top_level_frame_url,
const GURL& source_origin,
WindowContainerType container_type,
const GURL& target_url,
diff --git a/chromium/content/public/browser/web_contents_delegate.cc b/chromium/content/public/browser/web_contents_delegate.cc
index 47e30b2acba..964206d31e1 100644
--- a/chromium/content/public/browser/web_contents_delegate.cc
+++ b/chromium/content/public/browser/web_contents_delegate.cc
@@ -127,8 +127,11 @@ bool WebContentsDelegate::ShouldCreateWebContents(
WindowContainerType window_container_type,
const string16& frame_name,
const GURL& target_url,
- const std::string& partition_id,
- SessionStorageNamespace* session_storage_namespace) {
+ const Referrer& referrer,
+ WindowOpenDisposition disposition,
+ const WebKit::WebWindowFeatures& features,
+ bool user_gesture,
+ bool opener_suppressed) {
return true;
}
@@ -146,6 +149,13 @@ content::ColorChooser* WebContentsDelegate::OpenColorChooser(
return NULL;
}
+void WebContentsDelegate::RequestMediaAccessPermission(
+ WebContents* web_contents,
+ const MediaStreamRequest& request,
+ const MediaResponseCallback& callback) {
+ callback.Run(MediaStreamDevices(), scoped_ptr<MediaStreamUI>());
+}
+
bool WebContentsDelegate::RequestPpapiBrokerPermission(
WebContents* web_contents,
const GURL& url,
diff --git a/chromium/content/public/browser/web_contents_delegate.h b/chromium/content/public/browser/web_contents_delegate.h
index 69ac871c85e..aa1bb4e3472 100644
--- a/chromium/content/public/browser/web_contents_delegate.h
+++ b/chromium/content/public/browser/web_contents_delegate.h
@@ -37,7 +37,6 @@ class DownloadItem;
class JavaScriptDialogManager;
class PageState;
class RenderViewHost;
-class SessionStorageNamespace;
class WebContents;
class WebContentsImpl;
struct ContextMenuParams;
@@ -301,8 +300,11 @@ class CONTENT_EXPORT WebContentsDelegate {
WindowContainerType window_container_type,
const string16& frame_name,
const GURL& target_url,
- const std::string& partition_id,
- SessionStorageNamespace* session_storage_namespace);
+ const Referrer& referrer,
+ WindowOpenDisposition disposition,
+ const WebKit::WebWindowFeatures& features,
+ bool user_gesture,
+ bool opener_suppressed);
// Notifies the delegate about the creation of a new WebContents. This
// typically happens when popups are created.
@@ -422,7 +424,7 @@ class CONTENT_EXPORT WebContentsDelegate {
virtual void RequestMediaAccessPermission(
WebContents* web_contents,
const MediaStreamRequest& request,
- const MediaResponseCallback& callback) {}
+ const MediaResponseCallback& callback);
// Requests permission to access the PPAPI broker. The delegate should return
// true and call the passed in |callback| with the result, or return false
diff --git a/chromium/content/public/common/common_param_traits_macros.h b/chromium/content/public/common/common_param_traits_macros.h
index a77c4c4ec70..9b5226e2116 100644
--- a/chromium/content/public/common/common_param_traits_macros.h
+++ b/chromium/content/public/common/common_param_traits_macros.h
@@ -201,7 +201,11 @@ IPC_STRUCT_TRAITS_BEGIN(WebPreferences)
IPC_STRUCT_TRAITS_MEMBER(user_gesture_required_for_media_playback)
IPC_STRUCT_TRAITS_MEMBER(default_video_poster_url)
IPC_STRUCT_TRAITS_MEMBER(support_deprecated_target_density_dpi)
+ IPC_STRUCT_TRAITS_MEMBER(use_legacy_background_size_shorthand_behavior)
+ IPC_STRUCT_TRAITS_MEMBER(wide_viewport_quirk)
IPC_STRUCT_TRAITS_MEMBER(use_wide_viewport)
+ IPC_STRUCT_TRAITS_MEMBER(viewport_meta_layout_size_quirk)
+ IPC_STRUCT_TRAITS_MEMBER(viewport_meta_zero_values_quirk)
#endif
IPC_STRUCT_TRAITS_END()
diff --git a/chromium/content/public/common/content_switches.cc b/chromium/content/public/common/content_switches.cc
index 63e94dfdc90..5169ba47de4 100644
--- a/chromium/content/public/common/content_switches.cc
+++ b/chromium/content/public/common/content_switches.cc
@@ -531,6 +531,11 @@ const char kEnableWebMIDI[] = "enable-web-midi";
// Enable WebRTC to open TCP server sockets.
const char kEnableWebRtcTcpServerSocket[] = "enable-webrtc-tcp-server-socket";
+// Enables experimental features for the geolocation API.
+// Current features:
+// - CoreLocation support for Mac OS X 10.6
+const char kExperimentalLocationFeatures[] = "experimental-location-features";
+
// Load NPAPI plugins from the specified directory.
const char kExtraPluginDir[] = "extra-plugin-dir";
@@ -777,10 +782,6 @@ const char kTestingFixedHttpsPort[] = "testing-fixed-https-port";
// Runs the security test for the renderer sandbox.
const char kTestSandbox[] = "test-sandbox";
-// Enables not sending touch events to renderer while scrolling.
-const char kNoTouchToRendererWhileScrolling[] =
- "no-touch-to-renderer-while-scrolling";
-
// Causes TRACE_EVENT flags to be recorded from startup. Optionally, can
// specify the specific trace categories to include (e.g.
// --trace-startup=base,net) otherwise, all events are recorded. Setting this
@@ -872,9 +873,6 @@ const char kEnableWebRtcAecRecordings[] = "enable-webrtc-aec-recordings";
// Enables HW decode acceleration for WebRTC.
const char kEnableWebRtcHWDecoding[] = "enable-webrtc-hw-decoding";
-// Enables HW encode acceleration for WebRTC.
-const char kEnableWebRtcHWEncoding[] = "enable-webrtc-hw-encoding";
-
#endif
#if defined(OS_ANDROID)
diff --git a/chromium/content/public/common/content_switches.h b/chromium/content/public/common/content_switches.h
index c468139f903..949400af1b9 100644
--- a/chromium/content/public/common/content_switches.h
+++ b/chromium/content/public/common/content_switches.h
@@ -159,6 +159,7 @@ extern const char kEnableWebAnimationsSVG[];
CONTENT_EXPORT extern const char kEnableWebGLDraftExtensions[];
extern const char kEnableWebMIDI[];
extern const char kEnableWebRtcTcpServerSocket[];
+CONTENT_EXPORT extern const char kExperimentalLocationFeatures[];
CONTENT_EXPORT extern const char kExtraPluginDir[];
CONTENT_EXPORT extern const char kForceCompositingMode[];
extern const char kForceFieldTrials[];
@@ -223,7 +224,6 @@ extern const char kTapDownDeferralTimeMs[];
CONTENT_EXPORT extern const char kTestingFixedHttpPort[];
CONTENT_EXPORT extern const char kTestingFixedHttpsPort[];
CONTENT_EXPORT extern const char kTestSandbox[];
-CONTENT_EXPORT extern const char kNoTouchToRendererWhileScrolling[];
extern const char kTraceStartup[];
extern const char kTraceStartupDuration[];
extern const char kTraceStartupFile[];
@@ -248,7 +248,6 @@ CONTENT_EXPORT extern const char kDisableDeviceEnumeration[];
CONTENT_EXPORT extern const char kEnableSCTPDataChannels[];
extern const char kEnableWebRtcAecRecordings[];
extern const char kEnableWebRtcHWDecoding[];
-extern const char kEnableWebRtcHWEncoding[];
#endif
#if defined(OS_ANDROID)
diff --git a/chromium/content/public/common/renderer_preferences.h b/chromium/content/public/common/renderer_preferences.h
index bc5447a3e4f..0f141d21cc4 100644
--- a/chromium/content/public/common/renderer_preferences.h
+++ b/chromium/content/public/common/renderer_preferences.h
@@ -40,8 +40,9 @@ enum RendererPreferencesSubpixelRenderingEnum {
enum TapMultipleTargetsStrategy {
TAP_MULTIPLE_TARGETS_STRATEGY_ZOOM = 0,
TAP_MULTIPLE_TARGETS_STRATEGY_POPUP,
+ TAP_MULTIPLE_TARGETS_STRATEGY_NONE,
- TAP_MULTIPLE_TARGETS_STRATEGY_MAX = TAP_MULTIPLE_TARGETS_STRATEGY_POPUP,
+ TAP_MULTIPLE_TARGETS_STRATEGY_MAX = TAP_MULTIPLE_TARGETS_STRATEGY_NONE,
};
struct CONTENT_EXPORT RendererPreferences {
diff --git a/chromium/content/renderer/accessibility/renderer_accessibility_complete.cc b/chromium/content/renderer/accessibility/renderer_accessibility_complete.cc
index abce9c8b069..7f602ff7887 100644
--- a/chromium/content/renderer/accessibility/renderer_accessibility_complete.cc
+++ b/chromium/content/renderer/accessibility/renderer_accessibility_complete.cc
@@ -348,7 +348,8 @@ void RendererAccessibilityComplete::SendPendingAccessibilityNotifications() {
AccessibilityHostMsg_NotificationParams notification_msg;
notification_msg.notification_type = notification.notification_type;
notification_msg.id = notification.id;
- SerializeChangedNodes(obj, &notification_msg.nodes);
+ std::set<int> ids_serialized;
+ SerializeChangedNodes(obj, &notification_msg.nodes, &ids_serialized);
notification_msgs.push_back(notification_msg);
#ifndef NDEBUG
@@ -419,7 +420,12 @@ RendererAccessibilityComplete::CreateBrowserTreeNode() {
void RendererAccessibilityComplete::SerializeChangedNodes(
const WebKit::WebAccessibilityObject& obj,
- std::vector<AccessibilityNodeData>* dst) {
+ std::vector<AccessibilityNodeData>* dst,
+ std::set<int>* ids_serialized) {
+ if (ids_serialized->find(obj.axID()) != ids_serialized->end())
+ return;
+ ids_serialized->insert(obj.axID());
+
// This method has three responsibilities:
// 1. Serialize |obj| into an AccessibilityNodeData, and append it to
// the end of the |dst| vector to be send to the browser process.
@@ -474,6 +480,7 @@ void RendererAccessibilityComplete::SerializeChangedNodes(
WebAccessibilityObject parent_obj;
while (parent) {
parent_obj = document.accessibilityObjectFromID(parent->id);
+
if (!parent_obj.isDetached())
break;
parent = parent->parent;
@@ -483,7 +490,7 @@ void RendererAccessibilityComplete::SerializeChangedNodes(
// so that the update that clears |child| from its old parent
// occurs stricly before the update that adds |child| to its
// new parent.
- SerializeChangedNodes(parent_obj, dst);
+ SerializeChangedNodes(parent_obj, dst, ids_serialized);
}
}
}
@@ -556,7 +563,7 @@ void RendererAccessibilityComplete::SerializeChangedNodes(
// Serialize all of the new children, recursively.
for (size_t i = 0; i < children_to_serialize.size(); ++i)
- SerializeChangedNodes(children_to_serialize[i], dst);
+ SerializeChangedNodes(children_to_serialize[i], dst, ids_serialized);
}
void RendererAccessibilityComplete::ClearBrowserTreeNode(
diff --git a/chromium/content/renderer/accessibility/renderer_accessibility_complete.h b/chromium/content/renderer/accessibility/renderer_accessibility_complete.h
index 82fe4f81d44..4abdfb51311 100644
--- a/chromium/content/renderer/accessibility/renderer_accessibility_complete.h
+++ b/chromium/content/renderer/accessibility/renderer_accessibility_complete.h
@@ -5,6 +5,7 @@
#ifndef CONTENT_RENDERER_ACCESSIBILITY_RENDERER_ACCESSIBILITY_COMPLETE_H_
#define CONTENT_RENDERER_ACCESSIBILITY_RENDERER_ACCESSIBILITY_COMPLETE_H_
+#include <set>
#include <vector>
#include "base/containers/hash_tables.h"
@@ -81,8 +82,11 @@ class CONTENT_EXPORT RendererAccessibilityComplete
// Serialize the given accessibility object |obj| and append it to
// |dst|, and then recursively also serialize any *new* children of
// |obj|, based on what object ids we know the browser already has.
+ // The set of ids serialized is added to |ids_serialized|, and any
+ // ids previously in that set are not serialized again.
void SerializeChangedNodes(const WebKit::WebAccessibilityObject& obj,
- std::vector<AccessibilityNodeData>* dst);
+ std::vector<AccessibilityNodeData>* dst,
+ std::set<int>* ids_serialized);
// Clear the given node and recursively delete all of its descendants
// from the browser tree. (Does not delete |browser_node|).
diff --git a/chromium/content/renderer/browser_plugin/browser_plugin.cc b/chromium/content/renderer/browser_plugin/browser_plugin.cc
index cf0bdcc54b9..03fffc15ed5 100644
--- a/chromium/content/renderer/browser_plugin/browser_plugin.cc
+++ b/chromium/content/renderer/browser_plugin/browser_plugin.cc
@@ -71,7 +71,6 @@ BrowserPlugin::BrowserPlugin(
WebKit::WebFrame* frame,
const WebPluginParams& params)
: guest_instance_id_(browser_plugin::kInstanceIDNone),
- attached_(false),
render_view_(render_view->AsWeakPtr()),
render_view_routing_id_(render_view->GetRoutingID()),
container_(NULL),
@@ -86,6 +85,7 @@ BrowserPlugin::BrowserPlugin(
content_window_routing_id_(MSG_ROUTING_NONE),
plugin_focused_(false),
visible_(true),
+ size_changed_in_flight_(false),
before_first_navigation_(true),
mouse_locked_(false),
browser_plugin_manager_(render_view->GetBrowserPluginManager()),
@@ -330,6 +330,21 @@ void BrowserPlugin::UpdateGuestAutoSizeState(bool current_auto_size) {
resize_guest_params));
}
+void BrowserPlugin::SizeChangedDueToAutoSize(const gfx::Size& old_view_size) {
+ size_changed_in_flight_ = false;
+
+ std::map<std::string, base::Value*> props;
+ props[browser_plugin::kOldHeight] =
+ new base::FundamentalValue(old_view_size.height());
+ props[browser_plugin::kOldWidth] =
+ new base::FundamentalValue(old_view_size.width());
+ props[browser_plugin::kNewHeight] =
+ new base::FundamentalValue(last_view_size_.height());
+ props[browser_plugin::kNewWidth] =
+ new base::FundamentalValue(last_view_size_.width());
+ TriggerEvent(browser_plugin::kEventSizeChanged, &props);
+}
+
// static
bool BrowserPlugin::UsesDamageBuffer(
const BrowserPluginMsg_UpdateRect_Params& params) {
@@ -394,7 +409,6 @@ void BrowserPlugin::OnAttachACK(
params.storage_partition_id;
UpdateDOMAttribute(browser_plugin::kAttributePartition, partition_name);
}
- attached_ = true;
}
void BrowserPlugin::OnBuffersSwapped(
@@ -501,9 +515,8 @@ void BrowserPlugin::OnUpdateRect(
// In HW mode, we need to do it here so we can continue sending
// resize messages when needed.
if (params.is_resize_ack ||
- (!params.needs_ack && (auto_size || auto_size_ack_pending_))) {
+ (!params.needs_ack && (auto_size || auto_size_ack_pending_)))
resize_ack_received_ = true;
- }
auto_size_ack_pending_ = false;
@@ -546,7 +559,24 @@ void BrowserPlugin::OnUpdateRect(
if (auto_size && (params.view_size != last_view_size_)) {
if (backing_store_)
backing_store_->Clear(SK_ColorWHITE);
+ gfx::Size old_view_size = last_view_size_;
last_view_size_ = params.view_size;
+ // Schedule a SizeChanged instead of calling it directly to ensure that
+ // the backing store has been updated before the developer attempts to
+ // resize to avoid flicker. |size_changed_in_flight_| acts as a form of
+ // flow control for SizeChanged events. If the guest's view size is changing
+ // rapidly before a SizeChanged event fires, then we avoid scheduling
+ // another SizeChanged event. SizeChanged reads the new size from
+ // |last_view_size_| so we can be sure that it always fires an event
+ // with the last seen view size.
+ if (container_ && !size_changed_in_flight_) {
+ size_changed_in_flight_ = true;
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&BrowserPlugin::SizeChangedDueToAutoSize,
+ base::Unretained(this),
+ old_view_size));
+ }
}
if (UsesDamageBuffer(params)) {
@@ -1059,7 +1089,7 @@ void BrowserPlugin::updateGeometry(
int old_width = width();
int old_height = height();
plugin_rect_ = window_rect;
- if (!attached())
+ if (!HasGuestInstanceID())
return;
// In AutoSize mode, guests don't care when the BrowserPlugin container is
diff --git a/chromium/content/renderer/browser_plugin/browser_plugin.h b/chromium/content/renderer/browser_plugin/browser_plugin.h
index 89481196bec..d18906a573d 100644
--- a/chromium/content/renderer/browser_plugin/browser_plugin.h
+++ b/chromium/content/renderer/browser_plugin/browser_plugin.h
@@ -40,7 +40,6 @@ class CONTENT_EXPORT BrowserPlugin :
RenderViewImpl* render_view() const { return render_view_.get(); }
int render_view_routing_id() const { return render_view_routing_id_; }
int guest_instance_id() const { return guest_instance_id_; }
- bool attached() const { return attached_; }
static BrowserPlugin* FromContainer(WebKit::WebPluginContainer* container);
@@ -271,6 +270,9 @@ class CONTENT_EXPORT BrowserPlugin :
// Informs the guest of an updated autosize state.
void UpdateGuestAutoSizeState(bool current_auto_size);
+ // Informs the BrowserPlugin that guest has changed its size in autosize mode.
+ void SizeChangedDueToAutoSize(const gfx::Size& old_view_size);
+
// Indicates whether a damage buffer was used by the guest process for the
// provided |params|.
static bool UsesDamageBuffer(
@@ -310,9 +312,6 @@ class CONTENT_EXPORT BrowserPlugin :
// This is the browser-process-allocated instance ID that uniquely identifies
// a guest WebContents.
int guest_instance_id_;
- // This indicates whether this BrowserPlugin has been attached to a
- // WebContents.
- bool attached_;
base::WeakPtr<RenderViewImpl> render_view_;
// We cache the |render_view_|'s routing ID because we need it on destruction.
// If the |render_view_| is destroyed before the BrowserPlugin is destroyed
@@ -344,6 +343,7 @@ class CONTENT_EXPORT BrowserPlugin :
WebCursor cursor_;
gfx::Size last_view_size_;
+ bool size_changed_in_flight_;
bool before_first_navigation_;
bool mouse_locked_;
diff --git a/chromium/content/renderer/browser_plugin/browser_plugin_bindings.cc b/chromium/content/renderer/browser_plugin/browser_plugin_bindings.cc
index 26f00504e32..a1025580cbe 100644
--- a/chromium/content/renderer/browser_plugin/browser_plugin_bindings.cc
+++ b/chromium/content/renderer/browser_plugin/browser_plugin_bindings.cc
@@ -286,6 +286,28 @@ class BrowserPluginBindingAttachWindowTo : public BrowserPluginMethodBinding {
// Note: This is a method that is used internally by the <webview> shim only.
// This should not be exposed to developers.
+class BrowserPluginBindingGetGuestInstanceID :
+ public BrowserPluginMethodBinding {
+ public:
+ BrowserPluginBindingGetGuestInstanceID()
+ : BrowserPluginMethodBinding(
+ browser_plugin::kMethodGetGuestInstanceId, 0) {
+ }
+
+ virtual bool Invoke(BrowserPluginBindings* bindings,
+ const NPVariant* args,
+ NPVariant* result) OVERRIDE {
+ int guest_instance_id = bindings->instance()->guest_instance_id();
+ INT32_TO_NPVARIANT(guest_instance_id, *result);
+ return true;
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginBindingGetGuestInstanceID);
+};
+
+// Note: This is a method that is used internally by the <webview> shim only.
+// This should not be exposed to developers.
class BrowserPluginBindingTrackObjectLifetime
: public BrowserPluginMethodBinding {
public:
@@ -526,6 +548,7 @@ class BrowserPluginPropertyBindingName
NPVariant* result) OVERRIDE {
std::string name = bindings->instance()->GetNameAttribute();
return StringToNPVariant(name, result);
+ return true;
}
virtual bool SetProperty(BrowserPluginBindings* bindings,
NPObject* np_obj,
@@ -566,12 +589,10 @@ class BrowserPluginPropertyBindingPartition
UpdateDOMAttribute(bindings, new_value);
std::string error_message;
if (!bindings->instance()->ParsePartitionAttribute(&error_message)) {
- // Reset to old value on error.
- UpdateDOMAttribute(bindings, old_value);
- // Exceptions must be set as the last operation before returning to
- // script.
WebBindings::setException(
np_obj, static_cast<const NPUTF8 *>(error_message.c_str()));
+ // Reset to old value on error.
+ UpdateDOMAttribute(bindings, old_value);
return false;
}
}
@@ -622,12 +643,10 @@ class BrowserPluginPropertyBindingSrc : public BrowserPluginPropertyBinding {
UpdateDOMAttribute(bindings, new_value);
std::string error_message;
if (!bindings->instance()->ParseSrcAttribute(&error_message)) {
- // Reset to old value on error.
- UpdateDOMAttribute(bindings, old_value);
- // Exceptions must be set as the last operation before returning to
- // script.
WebBindings::setException(
np_obj, static_cast<const NPUTF8 *>(error_message.c_str()));
+ // Reset to old value on error.
+ UpdateDOMAttribute(bindings, old_value);
return false;
}
}
@@ -636,8 +655,6 @@ class BrowserPluginPropertyBindingSrc : public BrowserPluginPropertyBinding {
virtual void RemoveProperty(BrowserPluginBindings* bindings,
NPObject* np_obj) OVERRIDE {
std::string old_value = bindings->instance()->GetSrcAttribute();
- if (old_value.empty())
- return;
// Remove the DOM attribute to trigger the mutation observer when it is
// restored to its original value again.
bindings->instance()->RemoveDOMAttribute(name());
@@ -668,6 +685,7 @@ BrowserPluginBindings::BrowserPluginBindings(BrowserPlugin* instance)
method_bindings_.push_back(new BrowserPluginBindingAttach);
method_bindings_.push_back(new BrowserPluginBindingAttachWindowTo);
+ method_bindings_.push_back(new BrowserPluginBindingGetGuestInstanceID);
method_bindings_.push_back(new BrowserPluginBindingTrackObjectLifetime);
property_bindings_.push_back(new BrowserPluginPropertyBindingAutoSize);
diff --git a/chromium/content/renderer/browser_plugin/browser_plugin_browsertest.cc b/chromium/content/renderer/browser_plugin/browser_plugin_browsertest.cc
index 693752c618a..1ad07e9845b 100644
--- a/chromium/content/renderer/browser_plugin/browser_plugin_browsertest.cc
+++ b/chromium/content/renderer/browser_plugin/browser_plugin_browsertest.cc
@@ -172,13 +172,8 @@ MockBrowserPlugin* BrowserPluginTest::GetCurrentPluginWithAttachParams(
msg, &iter, params))
return NULL;
- MockBrowserPlugin* browser_plugin = static_cast<MockBrowserPlugin*>(
+ return static_cast<MockBrowserPlugin*>(
browser_plugin_manager()->GetBrowserPlugin(instance_id));
-
- BrowserPluginMsg_Attach_ACK_Params attach_ack_params;
- browser_plugin->OnAttachACK(instance_id, attach_ack_params);
-
- return browser_plugin;
}
// This test verifies that an initial resize occurs when we instantiate the
diff --git a/chromium/content/renderer/browser_plugin/mock_browser_plugin.h b/chromium/content/renderer/browser_plugin/mock_browser_plugin.h
index acd001b64ca..ac12aa3015e 100644
--- a/chromium/content/renderer/browser_plugin/mock_browser_plugin.h
+++ b/chromium/content/renderer/browser_plugin/mock_browser_plugin.h
@@ -18,7 +18,6 @@ class MockBrowserPlugin : public BrowserPlugin {
virtual ~MockBrowserPlugin();
// Allow poking at a few private members.
- using BrowserPlugin::OnAttachACK;
using BrowserPlugin::guest_crashed_;
using BrowserPlugin::pending_damage_buffer_;
using BrowserPlugin::damage_buffer_sequence_id_;
diff --git a/chromium/content/renderer/gpu/gpu_benchmarking_extension.cc b/chromium/content/renderer/gpu/gpu_benchmarking_extension.cc
index 65b451159f0..a274d0d8361 100644
--- a/chromium/content/renderer/gpu/gpu_benchmarking_extension.cc
+++ b/chromium/content/renderer/gpu/gpu_benchmarking_extension.cc
@@ -16,6 +16,7 @@
#include "content/public/renderer/render_thread.h"
#include "content/renderer/gpu/render_widget_compositor.h"
#include "content/renderer/render_view_impl.h"
+#include "content/renderer/rendering_benchmark.h"
#include "content/renderer/skia_benchmarking_extension.h"
#include "third_party/WebKit/public/web/WebFrame.h"
#include "third_party/WebKit/public/web/WebImageCache.h"
diff --git a/chromium/content/renderer/media/android/media_source_delegate.cc b/chromium/content/renderer/media/android/media_source_delegate.cc
index 715d5207c4a..c13a4987fb7 100644
--- a/chromium/content/renderer/media/android/media_source_delegate.cc
+++ b/chromium/content/renderer/media/android/media_source_delegate.cc
@@ -37,6 +37,22 @@ const uint8 kVorbisPadding[] = { 0xff, 0xff, 0xff, 0xff };
namespace content {
+#define BIND_TO_RENDER_LOOP(function) \
+ media::BindToLoop(main_loop_, \
+ base::Bind(function, main_weak_this_.GetWeakPtr()))
+
+#define BIND_TO_RENDER_LOOP_1(function, arg1) \
+ media::BindToLoop(main_loop_, \
+ base::Bind(function, main_weak_this_.GetWeakPtr(), arg1))
+
+#if defined(GOOGLE_TV)
+#define DCHECK_BELONG_TO_MEDIA_LOOP() \
+ DCHECK(media_loop_->BelongsToCurrentThread())
+#else
+#define DCHECK_BELONG_TO_MEDIA_LOOP() \
+ DCHECK(main_loop_->BelongsToCurrentThread())
+#endif
+
static void LogMediaSourceError(const scoped_refptr<media::MediaLog>& media_log,
const std::string& error) {
media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error));
@@ -50,16 +66,15 @@ MediaSourceDelegate::MediaSourceDelegate(
: main_weak_this_(this),
media_weak_this_(this),
main_loop_(base::MessageLoopProxy::current()),
+#if defined(GOOGLE_TV)
media_loop_(media_loop),
- send_read_from_demuxer_ack_cb_(media::BindToLoop(main_loop_,
- base::Bind(&MediaSourceDelegate::SendReadFromDemuxerAck,
- main_weak_this_.GetWeakPtr()))),
- send_seek_request_ack_cb_(media::BindToLoop(main_loop_,
- base::Bind(&MediaSourceDelegate::SendSeekRequestAck,
- main_weak_this_.GetWeakPtr()))),
- send_demuxer_ready_cb_(media::BindToLoop(main_loop_,
- base::Bind(&MediaSourceDelegate::SendDemuxerReady,
- main_weak_this_.GetWeakPtr()))),
+ send_read_from_demuxer_ack_cb_(
+ BIND_TO_RENDER_LOOP(&MediaSourceDelegate::SendReadFromDemuxerAck)),
+ send_seek_request_ack_cb_(
+ BIND_TO_RENDER_LOOP(&MediaSourceDelegate::SendSeekRequestAck)),
+ send_demuxer_ready_cb_(
+ BIND_TO_RENDER_LOOP(&MediaSourceDelegate::SendDemuxerReady)),
+#endif
proxy_(proxy),
player_id_(player_id),
media_log_(media_log),
@@ -102,16 +117,20 @@ void MediaSourceDelegate::Destroy() {
if (chunk_demuxer_)
chunk_demuxer_->Shutdown();
+#if defined(GOOGLE_TV)
// |this| will be transfered to the callback StopDemuxer() and
// OnDemuxerStopDone(). they own |this| and OnDemuxerStopDone() will delete
// it when called. Hence using base::Unretained(this) is safe here.
media_loop_->PostTask(FROM_HERE,
base::Bind(&MediaSourceDelegate::StopDemuxer,
base::Unretained(this)));
+#else
+ StopDemuxer();
+#endif
}
void MediaSourceDelegate::StopDemuxer() {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
DCHECK(demuxer_);
audio_stream_ = NULL;
@@ -147,26 +166,26 @@ void MediaSourceDelegate::InitializeMediaSource(
access_unit_size_ = kAccessUnitSizeForMediaSource;
chunk_demuxer_.reset(new media::ChunkDemuxer(
- media::BindToLoop(main_loop_,
- base::Bind(&MediaSourceDelegate::OnDemuxerOpened,
- main_weak_this_.GetWeakPtr())),
- media::BindToLoop(main_loop_,
- base::Bind(&MediaSourceDelegate::OnNeedKey,
- main_weak_this_.GetWeakPtr(), "")),
+ BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerOpened),
+ BIND_TO_RENDER_LOOP_1(&MediaSourceDelegate::OnNeedKey, ""),
// WeakPtrs can only bind to methods without return values.
base::Bind(&MediaSourceDelegate::OnAddTextTrack, base::Unretained(this)),
base::Bind(&LogMediaSourceError, media_log_)));
demuxer_ = chunk_demuxer_.get();
+#if defined(GOOGLE_TV)
// |this| will be retained until StopDemuxer() is posted, so Unretained() is
// safe here.
media_loop_->PostTask(FROM_HERE,
base::Bind(&MediaSourceDelegate::InitializeDemuxer,
base::Unretained(this)));
+#else
+ InitializeDemuxer();
+#endif
}
void MediaSourceDelegate::InitializeDemuxer() {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
demuxer_->Initialize(this, base::Bind(&MediaSourceDelegate::OnDemuxerInitDone,
media_weak_this_.GetWeakPtr()));
}
@@ -230,15 +249,19 @@ void MediaSourceDelegate::Seek(base::TimeDelta time, unsigned seek_request_id) {
}
SetSeeking(true);
+#if defined(GOOGLE_TV)
media_loop_->PostTask(FROM_HERE,
base::Bind(&MediaSourceDelegate::SeekInternal,
base::Unretained(this),
time, seek_request_id));
+#else
+ SeekInternal(time, seek_request_id);
+#endif
}
void MediaSourceDelegate::SeekInternal(base::TimeDelta time,
unsigned request_id) {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
demuxer_->Seek(time, base::Bind(&MediaSourceDelegate::OnDemuxerSeekDone,
media_weak_this_.GetWeakPtr(), request_id));
}
@@ -266,15 +289,19 @@ void MediaSourceDelegate::SetDuration(base::TimeDelta duration) {
void MediaSourceDelegate::OnReadFromDemuxer(media::DemuxerStream::Type type) {
DCHECK(main_loop_->BelongsToCurrentThread());
+#if defined(GOOGLE_TV)
media_loop_->PostTask(
FROM_HERE,
base::Bind(&MediaSourceDelegate::OnReadFromDemuxerInternal,
base::Unretained(this), type));
+#else
+ OnReadFromDemuxerInternal(type);
+#endif
}
void MediaSourceDelegate::OnReadFromDemuxerInternal(
media::DemuxerStream::Type type) {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
DVLOG(1) << "OnReadFromDemuxer(" << type << ") : " << player_id_;
if (IsSeeking())
return; // Drop the request during seeking.
@@ -293,8 +320,7 @@ void MediaSourceDelegate::ReadFromDemuxerStream(
media::DemuxerStream::Type type,
scoped_ptr<MediaPlayerHostMsg_ReadFromDemuxerAck_Params> params,
size_t index) {
- DCHECK(media_loop_->BelongsToCurrentThread());
- DCHECK(!IsSeeking());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
// DemuxerStream::Read() always returns the read callback asynchronously.
DemuxerStream* stream =
(type == DemuxerStream::AUDIO) ? audio_stream_ : video_stream_;
@@ -309,7 +335,7 @@ void MediaSourceDelegate::OnBufferReady(
size_t index,
DemuxerStream::Status status,
const scoped_refptr<media::DecoderBuffer>& buffer) {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
DVLOG(1) << "OnBufferReady(" << index << ", " << status << ", "
<< ((!buffer || buffer->end_of_stream()) ?
-1 : buffer->timestamp().InMilliseconds())
@@ -406,7 +432,11 @@ void MediaSourceDelegate::OnBufferReady(
NOTREACHED();
}
+#if defined(GOOGLE_TV)
send_read_from_demuxer_ack_cb_.Run(params.Pass());
+#else
+ SendReadFromDemuxerAck(params.Pass());
+#endif
}
void MediaSourceDelegate::SendReadFromDemuxerAck(
@@ -424,7 +454,7 @@ void MediaSourceDelegate::OnDemuxerError(media::PipelineStatus status) {
}
void MediaSourceDelegate::OnDemuxerInitDone(media::PipelineStatus status) {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
DVLOG(1) << "OnDemuxerInitDone(" << status << ") : " << player_id_;
DCHECK(demuxer_);
@@ -457,7 +487,7 @@ void MediaSourceDelegate::OnDemuxerInitDone(media::PipelineStatus status) {
}
void MediaSourceDelegate::InitAudioDecryptingDemuxerStream() {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
DVLOG(1) << "InitAudioDecryptingDemuxerStream() : " << player_id_;
DCHECK(!set_decryptor_ready_cb_.is_null());
@@ -470,7 +500,7 @@ void MediaSourceDelegate::InitAudioDecryptingDemuxerStream() {
}
void MediaSourceDelegate::InitVideoDecryptingDemuxerStream() {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
DVLOG(1) << "InitVideoDecryptingDemuxerStream() : " << player_id_;
DCHECK(!set_decryptor_ready_cb_.is_null());
@@ -484,7 +514,7 @@ void MediaSourceDelegate::InitVideoDecryptingDemuxerStream() {
void MediaSourceDelegate::OnAudioDecryptingDemuxerStreamInitDone(
media::PipelineStatus status) {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
DVLOG(1) << "OnAudioDecryptingDemuxerStreamInitDone(" << status
<< ") : " << player_id_;
DCHECK(demuxer_);
@@ -508,7 +538,7 @@ void MediaSourceDelegate::OnAudioDecryptingDemuxerStreamInitDone(
void MediaSourceDelegate::OnVideoDecryptingDemuxerStreamInitDone(
media::PipelineStatus status) {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
DVLOG(1) << "OnVideoDecryptingDemuxerStreamInitDone(" << status
<< ") : " << player_id_;
DCHECK(demuxer_);
@@ -526,7 +556,7 @@ void MediaSourceDelegate::OnVideoDecryptingDemuxerStreamInitDone(
void MediaSourceDelegate::OnDemuxerSeekDone(unsigned seek_request_id,
media::PipelineStatus status) {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
DVLOG(1) << "OnDemuxerSeekDone(" << status << ") : " << player_id_;
DCHECK(IsSeeking());
@@ -547,7 +577,7 @@ void MediaSourceDelegate::OnDemuxerSeekDone(unsigned seek_request_id,
}
void MediaSourceDelegate::ResetAudioDecryptingDemuxerStream() {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
DVLOG(1) << "ResetAudioDecryptingDemuxerStream() : " << player_id_;
if (audio_decrypting_demuxer_stream_) {
audio_decrypting_demuxer_stream_->Reset(
@@ -559,12 +589,22 @@ void MediaSourceDelegate::ResetAudioDecryptingDemuxerStream() {
}
void MediaSourceDelegate::ResetVideoDecryptingDemuxerStream() {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
DVLOG(1) << "ResetVideoDecryptingDemuxerStream()";
+#if defined(GOOGLE_TV)
if (video_decrypting_demuxer_stream_)
video_decrypting_demuxer_stream_->Reset(send_seek_request_ack_cb_);
else
send_seek_request_ack_cb_.Run();
+#else
+ if (video_decrypting_demuxer_stream_) {
+ video_decrypting_demuxer_stream_->Reset(
+ base::Bind(&MediaSourceDelegate::SendSeekRequestAck,
+ main_weak_this_.GetWeakPtr()));
+ } else {
+ SendSeekRequestAck();
+ }
+#endif
}
void MediaSourceDelegate::SendSeekRequestAck() {
@@ -583,23 +623,27 @@ void MediaSourceDelegate::OnDemuxerStopDone() {
}
void MediaSourceDelegate::OnMediaConfigRequest() {
+#if defined(GOOGLE_TV)
if (!media_loop_->BelongsToCurrentThread()) {
media_loop_->PostTask(FROM_HERE,
base::Bind(&MediaSourceDelegate::OnMediaConfigRequest,
base::Unretained(this)));
return;
}
+#endif
if (CanNotifyDemuxerReady())
NotifyDemuxerReady();
}
void MediaSourceDelegate::NotifyKeyAdded(const std::string& key_system) {
+#if defined(GOOGLE_TV)
if (!media_loop_->BelongsToCurrentThread()) {
media_loop_->PostTask(FROM_HERE,
base::Bind(&MediaSourceDelegate::NotifyKeyAdded,
base::Unretained(this), key_system));
return;
}
+#endif
DVLOG(1) << "NotifyKeyAdded() : " << player_id_;
// TODO(kjyoun): Enhance logic to detect when to call NotifyDemuxerReady()
// For now, we calls it when the first key is added. See
@@ -615,7 +659,7 @@ void MediaSourceDelegate::NotifyKeyAdded(const std::string& key_system) {
}
bool MediaSourceDelegate::CanNotifyDemuxerReady() {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
// This can happen when a key is added before the demuxer is initialized.
// See NotifyKeyAdded().
// TODO(kjyoun): Remove NotifyDemxuerReady() call from NotifyKeyAdded() so
@@ -629,7 +673,7 @@ bool MediaSourceDelegate::CanNotifyDemuxerReady() {
}
void MediaSourceDelegate::NotifyDemuxerReady() {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
DVLOG(1) << "NotifyDemuxerReady() : " << player_id_;
DCHECK(CanNotifyDemuxerReady());
@@ -656,7 +700,11 @@ void MediaSourceDelegate::NotifyDemuxerReady() {
params->duration_ms = GetDurationMs();
params->key_system = HasEncryptedStream() ? key_system_ : "";
+#if defined(GOOGLE_TV)
send_demuxer_ready_cb_.Run(params.Pass());
+#else
+ SendDemuxerReady(params.Pass());
+#endif
}
void MediaSourceDelegate::SendDemuxerReady(
@@ -667,7 +715,7 @@ void MediaSourceDelegate::SendDemuxerReady(
}
int MediaSourceDelegate::GetDurationMs() {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
if (!chunk_demuxer_)
return -1;
@@ -708,7 +756,7 @@ scoped_ptr<media::TextTrack> MediaSourceDelegate::OnAddTextTrack(
}
bool MediaSourceDelegate::HasEncryptedStream() {
- DCHECK(media_loop_->BelongsToCurrentThread());
+ DCHECK_BELONG_TO_MEDIA_LOOP();
return (audio_stream_ &&
audio_stream_->audio_decoder_config().is_encrypted()) ||
(video_stream_ &&
diff --git a/chromium/content/renderer/media/android/media_source_delegate.h b/chromium/content/renderer/media/android/media_source_delegate.h
index 8f359814e55..1c358d51d85 100644
--- a/chromium/content/renderer/media/android/media_source_delegate.h
+++ b/chromium/content/renderer/media/android/media_source_delegate.h
@@ -184,6 +184,7 @@ class MediaSourceDelegate : public media::DemuxerHost {
// Message loop for main renderer thread.
const scoped_refptr<base::MessageLoopProxy> main_loop_;
+#if defined(GOOGLE_TV)
// Message loop for the media thread.
// When there is high load in the render thread, the reading from |demuxer_|
// and its read-callback loops run very slowly. To improve the response time
@@ -193,6 +194,7 @@ class MediaSourceDelegate : public media::DemuxerHost {
ReadFromDemuxerAckCB send_read_from_demuxer_ack_cb_;
base::Closure send_seek_request_ack_cb_;
DemuxerReadyCB send_demuxer_ready_cb_;
+#endif
WebMediaPlayerProxyAndroid* proxy_;
int player_id_;
diff --git a/chromium/content/renderer/media/media_stream_dependency_factory.cc b/chromium/content/renderer/media/media_stream_dependency_factory.cc
index b5adf1ed754..2d19ae035f2 100644
--- a/chromium/content/renderer/media/media_stream_dependency_factory.cc
+++ b/chromium/content/renderer/media/media_stream_dependency_factory.cc
@@ -16,7 +16,6 @@
#include "content/renderer/media/rtc_peer_connection_handler.h"
#include "content/renderer/media/rtc_video_capturer.h"
#include "content/renderer/media/rtc_video_decoder_factory.h"
-#include "content/renderer/media/rtc_video_encoder_factory.h"
#include "content/renderer/media/video_capture_impl_manager.h"
#include "content/renderer/media/webaudio_capturer_source.h"
#include "content/renderer/media/webrtc_audio_device_impl.h"
@@ -28,7 +27,7 @@
#include "content/renderer/p2p/port_allocator.h"
#include "content/renderer/render_thread_impl.h"
#include "jingle/glue/thread_wrapper.h"
-#include "media/filters/gpu_video_accelerator_factories.h"
+#include "media/filters/gpu_video_decoder_factories.h"
#include "third_party/WebKit/public/platform/WebMediaConstraints.h"
#include "third_party/WebKit/public/platform/WebMediaStream.h"
#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
@@ -489,32 +488,27 @@ bool MediaStreamDependencyFactory::CreatePeerConnectionFactory() {
audio_device_ = new WebRtcAudioDeviceImpl();
scoped_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory;
- scoped_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory;
const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
- scoped_refptr<base::MessageLoopProxy> media_loop_proxy =
- RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy();
- scoped_refptr<RendererGpuVideoAcceleratorFactories> gpu_factories =
- RenderThreadImpl::current()->GetGpuFactories(media_loop_proxy);
-#if !defined(GOOGLE_TV)
- if (cmd_line->HasSwitch(switches::kEnableWebRtcHWDecoding))
- if (gpu_factories)
+ if (cmd_line->HasSwitch(switches::kEnableWebRtcHWDecoding)) {
+ scoped_refptr<base::MessageLoopProxy> media_loop_proxy =
+ RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy();
+ scoped_refptr<RendererGpuVideoDecoderFactories> gpu_factories =
+ RenderThreadImpl::current()->GetGpuFactories(media_loop_proxy);
+ if (gpu_factories.get() != NULL)
decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories));
-#else
+ }
+#if defined(GOOGLE_TV)
// PeerConnectionFactory will hold the ownership of this
// VideoDecoderFactory.
- decoder_factory.reset(decoder_factory_tv_ = new RTCVideoDecoderFactoryTv());
+ decoder_factory.reset(decoder_factory_tv_ = new RTCVideoDecoderFactoryTv);
#endif
- if (cmd_line->HasSwitch(switches::kEnableWebRtcHWEncoding))
- if (gpu_factories)
- encoder_factory.reset(new RTCVideoEncoderFactory(gpu_factories));
-
scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory(
webrtc::CreatePeerConnectionFactory(worker_thread_,
signaling_thread_,
audio_device_.get(),
- encoder_factory.release(),
+ NULL,
decoder_factory.release()));
if (factory.get())
pc_factory_ = factory;
diff --git a/chromium/content/renderer/media/media_stream_impl.cc b/chromium/content/renderer/media/media_stream_impl.cc
index 6ce995e2608..5edc4cc5f16 100644
--- a/chromium/content/renderer/media/media_stream_impl.cc
+++ b/chromium/content/renderer/media/media_stream_impl.cc
@@ -75,11 +75,6 @@ void UpdateRequestOptions(
options->video_type = content::MEDIA_DESKTOP_VIDEO_CAPTURE;
options->video_device_id =
DesktopMediaID(DesktopMediaID::TYPE_SCREEN, 0).ToString();
- } else if (video_stream_source == kMediaStreamSourceDesktop) {
- options->video_type = content::MEDIA_DESKTOP_VIDEO_CAPTURE;
- options->video_device_id = GetStreamConstraint(
- user_media_request.videoConstraints(),
- kMediaStreamSourceId, true);
}
}
}
diff --git a/chromium/content/renderer/media/peer_connection_tracker.cc b/chromium/content/renderer/media/peer_connection_tracker.cc
index 597c6455704..44f44458aac 100644
--- a/chromium/content/renderer/media/peer_connection_tracker.cc
+++ b/chromium/content/renderer/media/peer_connection_tracker.cc
@@ -161,9 +161,15 @@ static base::DictionaryValue* GetDictValueStats(
return NULL;
DictionaryValue* dict = new base::DictionaryValue();
+ if (!dict)
+ return NULL;
dict->SetDouble("timestamp", report.timestamp);
base::ListValue* values = new base::ListValue();
+ if (!values) {
+ delete dict;
+ return NULL;
+ }
dict->Set("values", values);
for (size_t i = 0; i < report.values.size(); ++i) {
@@ -183,10 +189,14 @@ static base::DictionaryValue* GetDictValue(const webrtc::StatsReport& report) {
return NULL;
result.reset(new base::DictionaryValue());
+ if (!result)
+ return NULL;
+
// Note:
// The format must be consistent with what webrtc_internals.js expects.
// If you change it here, you must change webrtc_internals.js as well.
- result->Set("stats", stats.release());
+ if (stats)
+ result->Set("stats", stats.release());
result->SetString("id", report.id);
result->SetString("type", report.type);
diff --git a/chromium/content/renderer/media/renderer_gpu_video_accelerator_factories.cc b/chromium/content/renderer/media/renderer_gpu_video_decoder_factories.cc
index f586497f484..d33e5901b2a 100644
--- a/chromium/content/renderer/media/renderer_gpu_video_accelerator_factories.cc
+++ b/chromium/content/renderer/media/renderer_gpu_video_decoder_factories.cc
@@ -1,8 +1,8 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "content/renderer/media/renderer_gpu_video_accelerator_factories.h"
+#include "content/renderer/media/renderer_gpu_video_decoder_factories.h"
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
@@ -17,8 +17,8 @@
namespace content {
-RendererGpuVideoAcceleratorFactories::~RendererGpuVideoAcceleratorFactories() {}
-RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories(
+RendererGpuVideoDecoderFactories::~RendererGpuVideoDecoderFactories() {}
+RendererGpuVideoDecoderFactories::RendererGpuVideoDecoderFactories(
GpuChannelHost* gpu_channel_host,
const scoped_refptr<base::MessageLoopProxy>& message_loop,
WebGraphicsContext3DCommandBufferImpl* context)
@@ -28,37 +28,32 @@ RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories(
aborted_waiter_(true, false),
message_loop_async_waiter_(false, false),
render_thread_async_waiter_(false, false) {
- // |context| is only required to support HW-accelerated decode.
- if (!context)
- return;
-
if (message_loop_->BelongsToCurrentThread()) {
AsyncGetContext(context);
message_loop_async_waiter_.Reset();
return;
}
// Wait for the context to be acquired.
- message_loop_->PostTask(
- FROM_HERE,
- base::Bind(&RendererGpuVideoAcceleratorFactories::AsyncGetContext,
- // Unretained to avoid ref/deref'ing |*this|, which is not yet
- // stored in a scoped_refptr. Safe because the Wait() below
- // keeps us alive until this task completes.
- base::Unretained(this),
- // OK to pass raw because the pointee is only deleted on the
- // compositor thread, and only as the result of a PostTask from
- // the render thread which can only happen after this function
- // returns, so our PostTask will run first.
- context));
+ message_loop_->PostTask(FROM_HERE, base::Bind(
+ &RendererGpuVideoDecoderFactories::AsyncGetContext,
+ // Unretained to avoid ref/deref'ing |*this|, which is not yet stored in a
+ // scoped_refptr. Safe because the Wait() below keeps us alive until this
+ // task completes.
+ base::Unretained(this),
+ // OK to pass raw because the pointee is only deleted on the compositor
+ // thread, and only as the result of a PostTask from the render thread
+ // which can only happen after this function returns, so our PostTask will
+ // run first.
+ context));
message_loop_async_waiter_.Wait();
}
-RendererGpuVideoAcceleratorFactories::RendererGpuVideoAcceleratorFactories()
+RendererGpuVideoDecoderFactories::RendererGpuVideoDecoderFactories()
: aborted_waiter_(true, false),
message_loop_async_waiter_(false, false),
render_thread_async_waiter_(false, false) {}
-void RendererGpuVideoAcceleratorFactories::AsyncGetContext(
+void RendererGpuVideoDecoderFactories::AsyncGetContext(
WebGraphicsContext3DCommandBufferImpl* context) {
context_ = context->AsWeakPtr();
if (context_.get()) {
@@ -71,23 +66,20 @@ void RendererGpuVideoAcceleratorFactories::AsyncGetContext(
message_loop_async_waiter_.Signal();
}
-scoped_ptr<media::VideoDecodeAccelerator>
-RendererGpuVideoAcceleratorFactories::CreateVideoDecodeAccelerator(
+media::VideoDecodeAccelerator*
+RendererGpuVideoDecoderFactories::CreateVideoDecodeAccelerator(
media::VideoCodecProfile profile,
media::VideoDecodeAccelerator::Client* client) {
if (message_loop_->BelongsToCurrentThread()) {
AsyncCreateVideoDecodeAccelerator(profile, client);
message_loop_async_waiter_.Reset();
- return vda_.Pass();
+ return vda_.release();
}
// The VDA is returned in the vda_ member variable by the
// AsyncCreateVideoDecodeAccelerator() function.
- message_loop_->PostTask(FROM_HERE,
- base::Bind(&RendererGpuVideoAcceleratorFactories::
- AsyncCreateVideoDecodeAccelerator,
- this,
- profile,
- client));
+ message_loop_->PostTask(FROM_HERE, base::Bind(
+ &RendererGpuVideoDecoderFactories::AsyncCreateVideoDecodeAccelerator,
+ this, profile, client));
base::WaitableEvent* objects[] = {&aborted_waiter_,
&message_loop_async_waiter_};
@@ -95,49 +87,17 @@ RendererGpuVideoAcceleratorFactories::CreateVideoDecodeAccelerator(
// If we are aborting and the VDA is created by the
// AsyncCreateVideoDecodeAccelerator() function later we need to ensure
// that it is destroyed on the same thread.
- message_loop_->PostTask(FROM_HERE,
- base::Bind(&RendererGpuVideoAcceleratorFactories::
- AsyncDestroyVideoDecodeAccelerator,
- this));
- return scoped_ptr<media::VideoDecodeAccelerator>();
- }
- return vda_.Pass();
-}
-
-scoped_ptr<media::VideoEncodeAccelerator>
-RendererGpuVideoAcceleratorFactories::CreateVideoEncodeAccelerator(
- media::VideoEncodeAccelerator::Client* client) {
- if (message_loop_->BelongsToCurrentThread()) {
- AsyncCreateVideoEncodeAccelerator(client);
- message_loop_async_waiter_.Reset();
- return vea_.Pass();
- }
- // The VEA is returned in the vea_ member variable by the
- // AsyncCreateVideoEncodeAccelerator() function.
- message_loop_->PostTask(FROM_HERE,
- base::Bind(&RendererGpuVideoAcceleratorFactories::
- AsyncCreateVideoEncodeAccelerator,
- this,
- client));
-
- base::WaitableEvent* objects[] = {&aborted_waiter_,
- &message_loop_async_waiter_};
- if (base::WaitableEvent::WaitMany(objects, arraysize(objects)) == 0) {
- // If we are aborting and the VDA is created by the
- // AsyncCreateVideoEncodeAccelerator() function later we need to ensure
- // that it is destroyed on the same thread.
- message_loop_->PostTask(FROM_HERE,
- base::Bind(&RendererGpuVideoAcceleratorFactories::
- AsyncDestroyVideoEncodeAccelerator,
- this));
- return scoped_ptr<media::VideoEncodeAccelerator>();
+ message_loop_->PostTask(FROM_HERE, base::Bind(
+ &RendererGpuVideoDecoderFactories::AsyncDestroyVideoDecodeAccelerator,
+ this));
+ return NULL;
}
- return vea_.Pass();
+ return vda_.release();
}
-void RendererGpuVideoAcceleratorFactories::AsyncCreateVideoDecodeAccelerator(
- media::VideoCodecProfile profile,
- media::VideoDecodeAccelerator::Client* client) {
+void RendererGpuVideoDecoderFactories::AsyncCreateVideoDecodeAccelerator(
+ media::VideoCodecProfile profile,
+ media::VideoDecodeAccelerator::Client* client) {
DCHECK(message_loop_->BelongsToCurrentThread());
if (context_.get() && context_->GetCommandBufferProxy()) {
@@ -147,17 +107,8 @@ void RendererGpuVideoAcceleratorFactories::AsyncCreateVideoDecodeAccelerator(
message_loop_async_waiter_.Signal();
}
-void RendererGpuVideoAcceleratorFactories::AsyncCreateVideoEncodeAccelerator(
- media::VideoEncodeAccelerator::Client* client) {
- DCHECK(message_loop_->BelongsToCurrentThread());
-
- vea_ = gpu_channel_host_->CreateVideoEncoder(client).Pass();
- message_loop_async_waiter_.Signal();
-}
-
-uint32 RendererGpuVideoAcceleratorFactories::CreateTextures(
- int32 count,
- const gfx::Size& size,
+uint32 RendererGpuVideoDecoderFactories::CreateTextures(
+ int32 count, const gfx::Size& size,
std::vector<uint32>* texture_ids,
std::vector<gpu::Mailbox>* texture_mailboxes,
uint32 texture_target) {
@@ -170,14 +121,9 @@ uint32 RendererGpuVideoAcceleratorFactories::CreateTextures(
message_loop_async_waiter_.Reset();
return sync_point;
}
- message_loop_->PostTask(
- FROM_HERE,
- base::Bind(&RendererGpuVideoAcceleratorFactories::AsyncCreateTextures,
- this,
- count,
- size,
- texture_target,
- &sync_point));
+ message_loop_->PostTask(FROM_HERE, base::Bind(
+ &RendererGpuVideoDecoderFactories::AsyncCreateTextures, this,
+ count, size, texture_target, &sync_point));
base::WaitableEvent* objects[] = {&aborted_waiter_,
&message_loop_async_waiter_};
@@ -188,10 +134,8 @@ uint32 RendererGpuVideoAcceleratorFactories::CreateTextures(
return sync_point;
}
-void RendererGpuVideoAcceleratorFactories::AsyncCreateTextures(
- int32 count,
- const gfx::Size& size,
- uint32 texture_target,
+void RendererGpuVideoDecoderFactories::AsyncCreateTextures(
+ int32 count, const gfx::Size& size, uint32 texture_target,
uint32* sync_point) {
DCHECK(message_loop_->BelongsToCurrentThread());
DCHECK(texture_target);
@@ -213,15 +157,8 @@ void RendererGpuVideoAcceleratorFactories::AsyncCreateTextures(
gles2->TexParameteri(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
gles2->TexParameteri(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
if (texture_target == GL_TEXTURE_2D) {
- gles2->TexImage2D(texture_target,
- 0,
- GL_RGBA,
- size.width(),
- size.height(),
- 0,
- GL_RGBA,
- GL_UNSIGNED_BYTE,
- NULL);
+ gles2->TexImage2D(texture_target, 0, GL_RGBA, size.width(), size.height(),
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
}
gles2->GenMailboxCHROMIUM(created_texture_mailboxes_[i].name);
gles2->ProduceTextureCHROMIUM(texture_target,
@@ -238,20 +175,16 @@ void RendererGpuVideoAcceleratorFactories::AsyncCreateTextures(
message_loop_async_waiter_.Signal();
}
-void RendererGpuVideoAcceleratorFactories::DeleteTexture(uint32 texture_id) {
+void RendererGpuVideoDecoderFactories::DeleteTexture(uint32 texture_id) {
if (message_loop_->BelongsToCurrentThread()) {
AsyncDeleteTexture(texture_id);
return;
}
- message_loop_->PostTask(
- FROM_HERE,
- base::Bind(&RendererGpuVideoAcceleratorFactories::AsyncDeleteTexture,
- this,
- texture_id));
+ message_loop_->PostTask(FROM_HERE, base::Bind(
+ &RendererGpuVideoDecoderFactories::AsyncDeleteTexture, this, texture_id));
}
-void RendererGpuVideoAcceleratorFactories::AsyncDeleteTexture(
- uint32 texture_id) {
+void RendererGpuVideoDecoderFactories::AsyncDeleteTexture(uint32 texture_id) {
DCHECK(message_loop_->BelongsToCurrentThread());
if (!context_.get())
return;
@@ -261,25 +194,23 @@ void RendererGpuVideoAcceleratorFactories::AsyncDeleteTexture(
DCHECK_EQ(gles2->GetError(), static_cast<GLenum>(GL_NO_ERROR));
}
-void RendererGpuVideoAcceleratorFactories::WaitSyncPoint(uint32 sync_point) {
+void RendererGpuVideoDecoderFactories::WaitSyncPoint(uint32 sync_point) {
if (message_loop_->BelongsToCurrentThread()) {
AsyncWaitSyncPoint(sync_point);
message_loop_async_waiter_.Reset();
return;
}
- message_loop_->PostTask(
- FROM_HERE,
- base::Bind(&RendererGpuVideoAcceleratorFactories::AsyncWaitSyncPoint,
- this,
- sync_point));
+ message_loop_->PostTask(FROM_HERE, base::Bind(
+ &RendererGpuVideoDecoderFactories::AsyncWaitSyncPoint,
+ this,
+ sync_point));
base::WaitableEvent* objects[] = {&aborted_waiter_,
&message_loop_async_waiter_};
base::WaitableEvent::WaitMany(objects, arraysize(objects));
}
-void RendererGpuVideoAcceleratorFactories::AsyncWaitSyncPoint(
- uint32 sync_point) {
+void RendererGpuVideoDecoderFactories::AsyncWaitSyncPoint(uint32 sync_point) {
DCHECK(message_loop_->BelongsToCurrentThread());
if (!context_) {
message_loop_async_waiter_.Signal();
@@ -291,10 +222,9 @@ void RendererGpuVideoAcceleratorFactories::AsyncWaitSyncPoint(
message_loop_async_waiter_.Signal();
}
-void RendererGpuVideoAcceleratorFactories::ReadPixels(uint32 texture_id,
- uint32 texture_target,
- const gfx::Size& size,
- const SkBitmap& pixels) {
+void RendererGpuVideoDecoderFactories::ReadPixels(
+ uint32 texture_id, uint32 texture_target, const gfx::Size& size,
+ const SkBitmap& pixels) {
// SkBitmaps use the SkPixelRef object to refcount the underlying pixels.
// Multiple SkBitmaps can share a SkPixelRef instance. We use this to
// ensure that the underlying pixels in the SkBitmap passed in remain valid
@@ -302,13 +232,9 @@ void RendererGpuVideoAcceleratorFactories::ReadPixels(uint32 texture_id,
read_pixels_bitmap_.setPixelRef(pixels.pixelRef());
if (!message_loop_->BelongsToCurrentThread()) {
- message_loop_->PostTask(
- FROM_HERE,
- base::Bind(&RendererGpuVideoAcceleratorFactories::AsyncReadPixels,
- this,
- texture_id,
- texture_target,
- size));
+ message_loop_->PostTask(FROM_HERE, base::Bind(
+ &RendererGpuVideoDecoderFactories::AsyncReadPixels, this,
+ texture_id, texture_target, size));
base::WaitableEvent* objects[] = {&aborted_waiter_,
&message_loop_async_waiter_};
if (base::WaitableEvent::WaitMany(objects, arraysize(objects)) == 0)
@@ -320,10 +246,8 @@ void RendererGpuVideoAcceleratorFactories::ReadPixels(uint32 texture_id,
read_pixels_bitmap_.setPixelRef(NULL);
}
-void RendererGpuVideoAcceleratorFactories::AsyncReadPixels(
- uint32 texture_id,
- uint32 texture_target,
- const gfx::Size& size) {
+void RendererGpuVideoDecoderFactories::AsyncReadPixels(
+ uint32 texture_id, uint32 texture_target, const gfx::Size& size) {
DCHECK(message_loop_->BelongsToCurrentThread());
if (!context_.get()) {
message_loop_async_waiter_.Signal();
@@ -345,32 +269,25 @@ void RendererGpuVideoAcceleratorFactories::AsyncReadPixels(
GLuint fb;
gles2->GenFramebuffers(1, &fb);
gles2->BindFramebuffer(GL_FRAMEBUFFER, fb);
- gles2->FramebufferTexture2D(
- GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture_target, tmp_texture, 0);
+ gles2->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ texture_target, tmp_texture, 0);
gles2->PixelStorei(GL_PACK_ALIGNMENT, 4);
- gles2->ReadPixels(0,
- 0,
- size.width(),
- size.height(),
- GL_BGRA_EXT,
- GL_UNSIGNED_BYTE,
- read_pixels_bitmap_.pixelRef()->pixels());
+ gles2->ReadPixels(0, 0, size.width(), size.height(), GL_BGRA_EXT,
+ GL_UNSIGNED_BYTE, read_pixels_bitmap_.pixelRef()->pixels());
gles2->DeleteFramebuffers(1, &fb);
gles2->DeleteTextures(1, &tmp_texture);
DCHECK_EQ(gles2->GetError(), static_cast<GLenum>(GL_NO_ERROR));
message_loop_async_waiter_.Signal();
}
-base::SharedMemory* RendererGpuVideoAcceleratorFactories::CreateSharedMemory(
+base::SharedMemory* RendererGpuVideoDecoderFactories::CreateSharedMemory(
size_t size) {
if (main_message_loop_->BelongsToCurrentThread()) {
return ChildThread::current()->AllocateSharedMemory(size);
}
- main_message_loop_->PostTask(
- FROM_HERE,
- base::Bind(&RendererGpuVideoAcceleratorFactories::AsyncCreateSharedMemory,
- this,
- size));
+ main_message_loop_->PostTask(FROM_HERE, base::Bind(
+ &RendererGpuVideoDecoderFactories::AsyncCreateSharedMemory, this,
+ size));
base::WaitableEvent* objects[] = {&aborted_waiter_,
&render_thread_async_waiter_};
@@ -379,8 +296,7 @@ base::SharedMemory* RendererGpuVideoAcceleratorFactories::CreateSharedMemory(
return shared_memory_segment_.release();
}
-void RendererGpuVideoAcceleratorFactories::AsyncCreateSharedMemory(
- size_t size) {
+void RendererGpuVideoDecoderFactories::AsyncCreateSharedMemory(size_t size) {
DCHECK_EQ(base::MessageLoop::current(),
ChildThread::current()->message_loop());
@@ -390,20 +306,22 @@ void RendererGpuVideoAcceleratorFactories::AsyncCreateSharedMemory(
}
scoped_refptr<base::MessageLoopProxy>
-RendererGpuVideoAcceleratorFactories::GetMessageLoop() {
+RendererGpuVideoDecoderFactories::GetMessageLoop() {
return message_loop_;
}
-void RendererGpuVideoAcceleratorFactories::Abort() { aborted_waiter_.Signal(); }
+void RendererGpuVideoDecoderFactories::Abort() {
+ aborted_waiter_.Signal();
+}
-bool RendererGpuVideoAcceleratorFactories::IsAborted() {
+bool RendererGpuVideoDecoderFactories::IsAborted() {
return aborted_waiter_.IsSignaled();
}
-scoped_refptr<RendererGpuVideoAcceleratorFactories>
-RendererGpuVideoAcceleratorFactories::Clone() {
- scoped_refptr<RendererGpuVideoAcceleratorFactories> factories =
- new RendererGpuVideoAcceleratorFactories();
+scoped_refptr<media::GpuVideoDecoderFactories>
+RendererGpuVideoDecoderFactories::Clone() {
+ scoped_refptr<RendererGpuVideoDecoderFactories> factories =
+ new RendererGpuVideoDecoderFactories();
factories->message_loop_ = message_loop_;
factories->main_message_loop_ = main_message_loop_;
factories->gpu_channel_host_ = gpu_channel_host_;
@@ -411,18 +329,10 @@ RendererGpuVideoAcceleratorFactories::Clone() {
return factories;
}
-void
-RendererGpuVideoAcceleratorFactories::AsyncDestroyVideoDecodeAccelerator() {
+void RendererGpuVideoDecoderFactories::AsyncDestroyVideoDecodeAccelerator() {
// OK to release because Destroy() will delete the VDA instance.
if (vda_)
vda_.release()->Destroy();
}
-void
-RendererGpuVideoAcceleratorFactories::AsyncDestroyVideoEncodeAccelerator() {
- // OK to release because Destroy() will delete the VDA instance.
- if (vea_)
- vea_.release()->Destroy();
-}
-
} // namespace content
diff --git a/chromium/content/renderer/media/renderer_gpu_video_accelerator_factories.h b/chromium/content/renderer/media/renderer_gpu_video_decoder_factories.h
index fcc4ffb411a..32f9bcdf227 100644
--- a/chromium/content/renderer/media/renderer_gpu_video_accelerator_factories.h
+++ b/chromium/content/renderer/media/renderer_gpu_video_decoder_factories.h
@@ -1,9 +1,9 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// 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 CONTENT_RENDERER_MEDIA_RENDERER_GPU_VIDEO_ACCELERATOR_FACTORIES_H_
-#define CONTENT_RENDERER_MEDIA_RENDERER_GPU_VIDEO_ACCELERATOR_FACTORIES_H_
+#ifndef CONTENT_RENDERER_MEDIA_RENDERER_GPU_VIDEO_DECODER_FACTORIES_H_
+#define CONTENT_RENDERER_MEDIA_RENDERER_GPU_VIDEO_DECODER_FACTORIES_H_
#include <vector>
@@ -12,7 +12,7 @@
#include "base/memory/weak_ptr.h"
#include "base/synchronization/waitable_event.h"
#include "content/common/content_export.h"
-#include "media/filters/gpu_video_accelerator_factories.h"
+#include "media/filters/gpu_video_decoder_factories.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/size.h"
@@ -25,7 +25,7 @@ namespace content {
class GpuChannelHost;
class WebGraphicsContext3DCommandBufferImpl;
-// Glue code to expose functionality needed by media::GpuVideoAccelerator to
+// Glue code to expose functionality needed by media::GpuVideoDecoder to
// RenderViewImpl. This class is entirely an implementation detail of
// RenderViewImpl and only has its own header to allow extraction of its
// implementation from render_view_impl.cc which is already far too large.
@@ -34,31 +34,27 @@ class WebGraphicsContext3DCommandBufferImpl;
// internally trampolined to the appropriate thread. GPU/GL-related calls go to
// the constructor-argument loop (the media thread), and shmem-related calls go
// to the render thread.
-class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
- : public media::GpuVideoAcceleratorFactories {
+class CONTENT_EXPORT RendererGpuVideoDecoderFactories
+ : public media::GpuVideoDecoderFactories {
public:
// Takes a ref on |gpu_channel_host| and tests |context| for loss before each
// use.
- RendererGpuVideoAcceleratorFactories(
+ RendererGpuVideoDecoderFactories(
GpuChannelHost* gpu_channel_host,
const scoped_refptr<base::MessageLoopProxy>& message_loop,
WebGraphicsContext3DCommandBufferImpl* wgc3dcbi);
- // media::GpuVideoAcceleratorFactories implementation.
- virtual scoped_ptr<media::VideoDecodeAccelerator>
- CreateVideoDecodeAccelerator(
- media::VideoCodecProfile profile,
- media::VideoDecodeAccelerator::Client* client) OVERRIDE;
- virtual scoped_ptr<media::VideoEncodeAccelerator>
- CreateVideoEncodeAccelerator(
- media::VideoEncodeAccelerator::Client* client) OVERRIDE;
+ // media::GpuVideoDecoderFactories implementation.
+ virtual media::VideoDecodeAccelerator* CreateVideoDecodeAccelerator(
+ media::VideoCodecProfile profile,
+ media::VideoDecodeAccelerator::Client* client) OVERRIDE;
// Creates textures and produces them into mailboxes. Returns a sync point to
// wait on before using the mailboxes, or 0 on failure.
- virtual uint32 CreateTextures(int32 count,
- const gfx::Size& size,
- std::vector<uint32>* texture_ids,
- std::vector<gpu::Mailbox>* texture_mailboxes,
- uint32 texture_target) OVERRIDE;
+ virtual uint32 CreateTextures(
+ int32 count, const gfx::Size& size,
+ std::vector<uint32>* texture_ids,
+ std::vector<gpu::Mailbox>* texture_mailboxes,
+ uint32 texture_target) OVERRIDE;
virtual void DeleteTexture(uint32 texture_id) OVERRIDE;
virtual void WaitSyncPoint(uint32 sync_point) OVERRIDE;
virtual void ReadPixels(uint32 texture_id,
@@ -69,14 +65,16 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
virtual scoped_refptr<base::MessageLoopProxy> GetMessageLoop() OVERRIDE;
virtual void Abort() OVERRIDE;
virtual bool IsAborted() OVERRIDE;
- scoped_refptr<RendererGpuVideoAcceleratorFactories> Clone();
+
+ // Makes a copy of |this|.
+ scoped_refptr<media::GpuVideoDecoderFactories> Clone();
protected:
- friend class base::RefCountedThreadSafe<RendererGpuVideoAcceleratorFactories>;
- virtual ~RendererGpuVideoAcceleratorFactories();
+ friend class base::RefCountedThreadSafe<RendererGpuVideoDecoderFactories>;
+ virtual ~RendererGpuVideoDecoderFactories();
private:
- RendererGpuVideoAcceleratorFactories();
+ RendererGpuVideoDecoderFactories();
// Helper for the constructor to acquire the ContentGLContext on
// |message_loop_|.
@@ -87,25 +85,19 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
// (except for DeleteTexture, which is fire-and-forget).
// AsyncCreateSharedMemory runs on the renderer thread and the rest run on
// |message_loop_|.
- // AsyncCreateVideoDecodeAccelerator returns its output in the |vda_| member.
- // AsyncCreateVideoEncodeAccelerator returns its output in the |vea_| member.
+ // The AsyncCreateVideoDecodeAccelerator returns its output in the vda_
+ // member.
void AsyncCreateVideoDecodeAccelerator(
media::VideoCodecProfile profile,
media::VideoDecodeAccelerator::Client* client);
- void AsyncCreateVideoEncodeAccelerator(
- media::VideoEncodeAccelerator::Client* client);
- void AsyncCreateTextures(int32 count,
- const gfx::Size& size,
- uint32 texture_target,
- uint32* sync_point);
+ void AsyncCreateTextures(int32 count, const gfx::Size& size,
+ uint32 texture_target, uint32* sync_point);
void AsyncDeleteTexture(uint32 texture_id);
void AsyncWaitSyncPoint(uint32 sync_point);
- void AsyncReadPixels(uint32 texture_id,
- uint32 texture_target,
+ void AsyncReadPixels(uint32 texture_id, uint32 texture_target,
const gfx::Size& size);
void AsyncCreateSharedMemory(size_t size);
void AsyncDestroyVideoDecodeAccelerator();
- void AsyncDestroyVideoEncodeAccelerator();
scoped_refptr<base::MessageLoopProxy> message_loop_;
scoped_refptr<base::MessageLoopProxy> main_message_loop_;
@@ -124,12 +116,9 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
// message loop to indicate their completion. e.g. AsyncCreateSharedMemory.
base::WaitableEvent render_thread_async_waiter_;
- // The vda returned by the CreateVideoDecodeAccelerator function.
+ // The vda returned by the CreateVideoAcclelerator function.
scoped_ptr<media::VideoDecodeAccelerator> vda_;
- // The vea returned by the CreateVideoEncodeAccelerator function.
- scoped_ptr<media::VideoEncodeAccelerator> vea_;
-
// Shared memory segment which is returned by the CreateSharedMemory()
// function.
scoped_ptr<base::SharedMemory> shared_memory_segment_;
@@ -141,9 +130,9 @@ class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
std::vector<uint32> created_textures_;
std::vector<gpu::Mailbox> created_texture_mailboxes_;
- DISALLOW_COPY_AND_ASSIGN(RendererGpuVideoAcceleratorFactories);
+ DISALLOW_COPY_AND_ASSIGN(RendererGpuVideoDecoderFactories);
};
} // namespace content
-#endif // CONTENT_RENDERER_MEDIA_RENDERER_GPU_VIDEO_ACCELERATOR_FACTORIES_H_
+#endif // CONTENT_RENDERER_MEDIA_RENDERER_GPU_VIDEO_DECODER_FACTORIES_H_
diff --git a/chromium/content/renderer/media/rtc_video_decoder.cc b/chromium/content/renderer/media/rtc_video_decoder.cc
index 27030f69514..12904f11850 100644
--- a/chromium/content/renderer/media/rtc_video_decoder.cc
+++ b/chromium/content/renderer/media/rtc_video_decoder.cc
@@ -13,7 +13,7 @@
#include "base/task_runner_util.h"
#include "content/child/child_thread.h"
#include "media/base/bind_to_loop.h"
-#include "media/filters/gpu_video_accelerator_factories.h"
+#include "media/filters/gpu_video_decoder_factories.h"
#include "third_party/webrtc/system_wrappers/interface/ref_count.h"
namespace content {
@@ -69,7 +69,7 @@ RTCVideoDecoder::BufferData::BufferData() {}
RTCVideoDecoder::BufferData::~BufferData() {}
RTCVideoDecoder::RTCVideoDecoder(
- const scoped_refptr<media::GpuVideoAcceleratorFactories>& factories)
+ const scoped_refptr<media::GpuVideoDecoderFactories>& factories)
: weak_factory_(this),
weak_this_(weak_factory_.GetWeakPtr()),
factories_(factories),
@@ -122,7 +122,7 @@ RTCVideoDecoder::~RTCVideoDecoder() {
scoped_ptr<RTCVideoDecoder> RTCVideoDecoder::Create(
webrtc::VideoCodecType type,
- const scoped_refptr<media::GpuVideoAcceleratorFactories>& factories) {
+ const scoped_refptr<media::GpuVideoDecoderFactories>& factories) {
scoped_ptr<RTCVideoDecoder> decoder;
// Convert WebRTC codec type to media codec profile.
media::VideoCodecProfile profile;
@@ -136,8 +136,8 @@ scoped_ptr<RTCVideoDecoder> RTCVideoDecoder::Create(
}
decoder.reset(new RTCVideoDecoder(factories));
- decoder->vda_ =
- factories->CreateVideoDecodeAccelerator(profile, decoder.get()).Pass();
+ decoder->vda_
+ .reset(factories->CreateVideoDecodeAccelerator(profile, decoder.get()));
// vda can be NULL if VP8 is not supported.
if (decoder->vda_ != NULL) {
decoder->state_ = INITIALIZED;
@@ -397,7 +397,7 @@ scoped_refptr<media::VideoFrame> RTCVideoDecoder::CreateVideoFrame(
visible_rect,
natural_size,
timestamp_ms,
- base::Bind(&media::GpuVideoAcceleratorFactories::ReadPixels,
+ base::Bind(&media::GpuVideoDecoderFactories::ReadPixels,
factories_,
pb.texture_id(),
decoder_texture_target_,
diff --git a/chromium/content/renderer/media/rtc_video_decoder.h b/chromium/content/renderer/media/rtc_video_decoder.h
index 7a2686e672a..11e58527145 100644
--- a/chromium/content/renderer/media/rtc_video_decoder.h
+++ b/chromium/content/renderer/media/rtc_video_decoder.h
@@ -30,7 +30,7 @@ class MessageLoopProxy;
namespace media {
class DecoderBuffer;
-class GpuVideoAcceleratorFactories;
+class GpuVideoDecoderFactories;
}
namespace content {
@@ -52,7 +52,7 @@ class CONTENT_EXPORT RTCVideoDecoder
// run on the message loop of |factories|.
static scoped_ptr<RTCVideoDecoder> Create(
webrtc::VideoCodecType type,
- const scoped_refptr<media::GpuVideoAcceleratorFactories>& factories);
+ const scoped_refptr<media::GpuVideoDecoderFactories>& factories);
// webrtc::VideoDecoder implementation.
// Called on WebRTC DecodingThread.
@@ -113,7 +113,7 @@ class CONTENT_EXPORT RTCVideoDecoder
// The meessage loop of |factories| will be saved to |vda_loop_proxy_|.
RTCVideoDecoder(
- const scoped_refptr<media::GpuVideoAcceleratorFactories>& factories);
+ const scoped_refptr<media::GpuVideoDecoderFactories>& factories);
void Initialize(base::WaitableEvent* waiter);
@@ -197,7 +197,7 @@ class CONTENT_EXPORT RTCVideoDecoder
base::WeakPtrFactory<RTCVideoDecoder> weak_factory_;
base::WeakPtr<RTCVideoDecoder> weak_this_;
- scoped_refptr<media::GpuVideoAcceleratorFactories> factories_;
+ scoped_refptr<media::GpuVideoDecoderFactories> factories_;
// The message loop to run callbacks on. This is from |factories_|.
scoped_refptr<base::MessageLoopProxy> vda_loop_proxy_;
diff --git a/chromium/content/renderer/media/rtc_video_decoder_factory.cc b/chromium/content/renderer/media/rtc_video_decoder_factory.cc
index 57b6a580c3a..e621735dbcc 100644
--- a/chromium/content/renderer/media/rtc_video_decoder_factory.cc
+++ b/chromium/content/renderer/media/rtc_video_decoder_factory.cc
@@ -6,13 +6,14 @@
#include "base/location.h"
#include "base/memory/scoped_ptr.h"
-#include "content/renderer/media/renderer_gpu_video_accelerator_factories.h"
+#include "content/renderer/media/renderer_gpu_video_decoder_factories.h"
#include "content/renderer/media/rtc_video_decoder.h"
+#include "media/filters/gpu_video_decoder_factories.h"
namespace content {
RTCVideoDecoderFactory::RTCVideoDecoderFactory(
- const scoped_refptr<RendererGpuVideoAcceleratorFactories>& gpu_factories)
+ const scoped_refptr<RendererGpuVideoDecoderFactories>& gpu_factories)
: gpu_factories_(gpu_factories) {
DVLOG(2) << "RTCVideoDecoderFactory";
}
@@ -24,7 +25,7 @@ RTCVideoDecoderFactory::~RTCVideoDecoderFactory() {
webrtc::VideoDecoder* RTCVideoDecoderFactory::CreateVideoDecoder(
webrtc::VideoCodecType type) {
DVLOG(2) << "CreateVideoDecoder";
- // GpuVideoAcceleratorFactories is not thread safe. It cannot be shared
+ // RendererGpuVideoDecoderFactories is not thread safe. It cannot be shared
// by different decoders. This method runs on Chrome_libJingle_WorkerThread
// and the child thread is blocked while this runs. We cannot create new gpu
// factories here. Clone one instead.
diff --git a/chromium/content/renderer/media/rtc_video_decoder_factory.h b/chromium/content/renderer/media/rtc_video_decoder_factory.h
index f7a42a3cd47..1455d7b61ee 100644
--- a/chromium/content/renderer/media/rtc_video_decoder_factory.h
+++ b/chromium/content/renderer/media/rtc_video_decoder_factory.h
@@ -11,19 +11,23 @@
#include "third_party/libjingle/source/talk/media/webrtc/webrtcvideodecoderfactory.h"
#include "third_party/webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
+namespace media {
+class GpuVideoDecoderFactories;
+}
+
namespace webrtc {
class VideoDecoder;
}
namespace content {
-class RendererGpuVideoAcceleratorFactories;
+class RendererGpuVideoDecoderFactories;
// TODO(wuchengli): add unittest.
class CONTENT_EXPORT RTCVideoDecoderFactory
: NON_EXPORTED_BASE(public cricket::WebRtcVideoDecoderFactory) {
public:
explicit RTCVideoDecoderFactory(
- const scoped_refptr<RendererGpuVideoAcceleratorFactories>& gpu_factories);
+ const scoped_refptr<RendererGpuVideoDecoderFactories>& gpu_factories);
virtual ~RTCVideoDecoderFactory();
// Runs on Chrome_libJingle_WorkerThread. The child thread is blocked while
@@ -36,7 +40,7 @@ class CONTENT_EXPORT RTCVideoDecoderFactory
virtual void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) OVERRIDE;
private:
- scoped_refptr<RendererGpuVideoAcceleratorFactories> gpu_factories_;
+ scoped_refptr<RendererGpuVideoDecoderFactories> gpu_factories_;
DISALLOW_COPY_AND_ASSIGN(RTCVideoDecoderFactory);
};
diff --git a/chromium/content/renderer/media/rtc_video_decoder_unittest.cc b/chromium/content/renderer/media/rtc_video_decoder_unittest.cc
index 3355b6a3386..2ffeb3e4b61 100644
--- a/chromium/content/renderer/media/rtc_video_decoder_unittest.cc
+++ b/chromium/content/renderer/media/rtc_video_decoder_unittest.cc
@@ -8,7 +8,7 @@
#include "base/threading/thread.h"
#include "content/renderer/media/rtc_video_decoder.h"
#include "media/base/gmock_callback_support.h"
-#include "media/filters/mock_gpu_video_accelerator_factories.h"
+#include "media/filters/mock_gpu_video_decoder_factories.h"
#include "media/video/mock_video_decode_accelerator.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -25,7 +25,7 @@ class RTCVideoDecoderTest : public ::testing::Test,
webrtc::DecodedImageCallback {
public:
RTCVideoDecoderTest()
- : mock_gpu_factories_(new media::MockGpuVideoAcceleratorFactories),
+ : mock_gpu_factories_(new media::MockGpuVideoDecoderFactories),
vda_thread_("vda_thread"),
idle_waiter_(false, false) {
memset(&codec_, 0, sizeof(codec_));
@@ -37,11 +37,11 @@ class RTCVideoDecoderTest : public ::testing::Test,
mock_vda_ = new media::MockVideoDecodeAccelerator;
EXPECT_CALL(*mock_gpu_factories_, GetMessageLoop())
.WillRepeatedly(Return(vda_loop_proxy_));
- EXPECT_CALL(*mock_gpu_factories_, DoCreateVideoDecodeAccelerator(_, _))
+ EXPECT_CALL(*mock_gpu_factories_, CreateVideoDecodeAccelerator(_, _))
.WillRepeatedly(
Return(static_cast<media::VideoDecodeAccelerator*>(NULL)));
EXPECT_CALL(*mock_gpu_factories_,
- DoCreateVideoDecodeAccelerator(media::VP8PROFILE_MAIN, _))
+ CreateVideoDecodeAccelerator(media::VP8PROFILE_MAIN, _))
.WillRepeatedly(Return(mock_vda_));
EXPECT_CALL(*mock_gpu_factories_, Abort()).WillRepeatedly(Return());
EXPECT_CALL(*mock_gpu_factories_, CreateSharedMemory(_))
@@ -94,7 +94,7 @@ class RTCVideoDecoderTest : public ::testing::Test,
}
protected:
- scoped_refptr<media::MockGpuVideoAcceleratorFactories> mock_gpu_factories_;
+ scoped_refptr<media::MockGpuVideoDecoderFactories> mock_gpu_factories_;
media::MockVideoDecodeAccelerator* mock_vda_;
scoped_ptr<RTCVideoDecoder> rtc_decoder_;
webrtc::VideoCodec codec_;
diff --git a/chromium/content/renderer/media/rtc_video_encoder.cc b/chromium/content/renderer/media/rtc_video_encoder.cc
deleted file mode 100644
index 416317d3635..00000000000
--- a/chromium/content/renderer/media/rtc_video_encoder.cc
+++ /dev/null
@@ -1,658 +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 "content/renderer/media/rtc_video_encoder.h"
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/memory/scoped_vector.h"
-#include "base/message_loop/message_loop_proxy.h"
-#include "base/synchronization/waitable_event.h"
-#include "content/renderer/media/renderer_gpu_video_accelerator_factories.h"
-#include "media/base/bitstream_buffer.h"
-#include "media/base/video_frame.h"
-#include "media/filters/gpu_video_accelerator_factories.h"
-#include "media/video/video_encode_accelerator.h"
-
-#define NOTIFY_ERROR(x) \
- do { \
- DLOG(ERROR) << "calling NotifyError(): " << x; \
- NotifyError(x); \
- } while (0)
-
-namespace content {
-
-// This private class of RTCVideoEncoder does the actual work of communicating
-// with a media::VideoEncodeAccelerator for handling video encoding. It can
-// be created on any thread, but should subsequently be posted to (and Destroy()
-// called on) a single thread. Callbacks to RTCVideoEncoder are posted to the
-// thread on which the instance was constructed.
-//
-// This class separates state related to the thread that RTCVideoEncoder
-// operates on (presently the libjingle worker thread) from the thread that
-// |gpu_factories_| provides for accelerator operations (presently the media
-// thread). The RTCVideoEncoder class can be deleted directly by WebRTC, while
-// RTCVideoEncoder::Impl stays around long enough to properly shut down the VEA.
-class RTCVideoEncoder::Impl
- : public media::VideoEncodeAccelerator::Client,
- public base::RefCountedThreadSafe<RTCVideoEncoder::Impl> {
- public:
- Impl(
- const base::WeakPtr<RTCVideoEncoder>& weak_encoder,
- const scoped_refptr<RendererGpuVideoAcceleratorFactories>& gpu_factories);
-
- // Create the VEA and call Initialize() on it. Called once per instantiation,
- // and then the instance is bound forevermore to whichever thread made the
- // call.
- // RTCVideoEncoder expects to be able to call this function synchronously from
- // its own thread, hence the |async_waiter| and |async_retval| arguments.
- void CreateAndInitializeVEA(const gfx::Size& input_visible_size,
- uint32 bitrate,
- media::VideoCodecProfile profile,
- base::WaitableEvent* async_waiter,
- int32_t* async_retval);
- // Enqueue a frame from WebRTC for encoding.
- // RTCVideoEncoder expects to be able to call this function synchronously from
- // its own thread, hence the |async_waiter| and |async_retval| arguments.
- void Enqueue(const webrtc::I420VideoFrame* input_frame,
- bool force_keyframe,
- base::WaitableEvent* async_waiter,
- int32_t* async_retval);
-
- // RTCVideoEncoder is given a buffer to be passed to WebRTC through the
- // RTCVideoEncoder::ReturnEncodedImage() function. When that is complete,
- // the buffer is returned to Impl by its index using this function.
- void UseOutputBitstreamBufferId(int32 bitstream_buffer_id);
-
- // Request encoding parameter change for the underlying encoder.
- void RequestEncodingParametersChange(uint32 bitrate, uint32 framerate);
-
- // Destroy this Impl's encoder. The destructor is not explicitly called, as
- // Impl is a base::RefCountedThreadSafe.
- void Destroy();
-
- // media::VideoEncodeAccelerator::Client implementation.
- virtual void NotifyInitializeDone() OVERRIDE;
- virtual void RequireBitstreamBuffers(unsigned int input_count,
- const gfx::Size& input_coded_size,
- size_t output_buffer_size) OVERRIDE;
- virtual void BitstreamBufferReady(int32 bitstream_buffer_id,
- size_t payload_size,
- bool key_frame) OVERRIDE;
- virtual void NotifyError(media::VideoEncodeAccelerator::Error error) OVERRIDE;
-
- private:
- friend class base::RefCountedThreadSafe<Impl>;
-
- enum {
- kInputBufferExtraCount = 1, // The number of input buffers allocated, more
- // than what is requested by
- // VEA::RequireBitstreamBuffers().
- kOutputBufferCount = 3,
- };
-
- virtual ~Impl();
-
- // Perform encoding on an input frame from the input queue.
- void EncodeOneFrame();
-
- // Notify that an input frame is finished for encoding. |index| is the index
- // of the completed frame in |input_buffers_|.
- void EncodeFrameFinished(int index);
-
- // Set up/signal |async_waiter_| and |async_retval_|; see declarations below.
- void RegisterAsyncWaiter(base::WaitableEvent* waiter, int32_t* retval);
- void SignalAsyncWaiter(int32_t retval);
-
- base::ThreadChecker thread_checker_;
-
- // Weak pointer to the parent RTCVideoEncoder, for posting back VEA::Client
- // notifications.
- const base::WeakPtr<RTCVideoEncoder> weak_encoder_;
-
- // The message loop on which to post callbacks to |weak_encoder_|.
- const scoped_refptr<base::MessageLoopProxy> encoder_message_loop_proxy_;
-
- // Factory for creating VEAs, shared memory buffers, etc.
- const scoped_refptr<RendererGpuVideoAcceleratorFactories> gpu_factories_;
-
- // webrtc::VideoEncoder expects InitEncode() and Encode() to be synchronous.
- // Do this by waiting on the |async_waiter_| and returning the return value in
- // |async_retval_| when initialization completes, encoding completes, or
- // an error occurs.
- base::WaitableEvent* async_waiter_;
- int32_t* async_retval_;
-
- // The underlying VEA to perform encoding on.
- scoped_ptr<media::VideoEncodeAccelerator> video_encoder_;
-
- // Next input frame. Since there is at most one next frame, a single-element
- // queue is sufficient.
- const webrtc::I420VideoFrame* input_next_frame_;
-
- // Whether to encode a keyframe next.
- bool input_next_frame_keyframe_;
-
- // Frame sizes.
- gfx::Size input_frame_coded_size_;
- gfx::Size input_visible_size_;
-
- // Shared memory buffers for input/output with the VEA.
- ScopedVector<base::SharedMemory> input_buffers_;
- ScopedVector<base::SharedMemory> output_buffers_;
-
- // Input buffers ready to be filled with input from Encode(). As a LIFO since
- // we don't care about ordering.
- std::vector<int> input_buffers_free_;
-
- // Timestamp of first frame returned from encoder. We calculate subsequent
- // capture times as deltas from this base.
- base::Time time_base_;
-
- DISALLOW_COPY_AND_ASSIGN(Impl);
-};
-
-RTCVideoEncoder::Impl::Impl(
- const base::WeakPtr<RTCVideoEncoder>& weak_encoder,
- const scoped_refptr<RendererGpuVideoAcceleratorFactories>& gpu_factories)
- : weak_encoder_(weak_encoder),
- encoder_message_loop_proxy_(base::MessageLoopProxy::current()),
- gpu_factories_(gpu_factories),
- async_waiter_(NULL),
- async_retval_(NULL),
- input_next_frame_(NULL),
- input_next_frame_keyframe_(false) {
- thread_checker_.DetachFromThread();
-}
-
-void RTCVideoEncoder::Impl::CreateAndInitializeVEA(
- const gfx::Size& input_visible_size,
- uint32 bitrate,
- media::VideoCodecProfile profile,
- base::WaitableEvent* async_waiter,
- int32_t* async_retval) {
- DVLOG(3) << "Impl::CreateAndInitializeVEA()";
- DCHECK(thread_checker_.CalledOnValidThread());
-
- RegisterAsyncWaiter(async_waiter, async_retval);
-
- // Check for overflow converting bitrate (kilobits/sec) to bits/sec.
- if (bitrate > kuint32max / 1000) {
- NOTIFY_ERROR(media::VideoEncodeAccelerator::kInvalidArgumentError);
- return;
- }
-
- video_encoder_ = gpu_factories_->CreateVideoEncodeAccelerator(this).Pass();
- if (!video_encoder_) {
- NOTIFY_ERROR(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
- input_visible_size_ = input_visible_size;
- video_encoder_->Initialize(
- media::VideoFrame::I420, input_visible_size_, profile, bitrate * 1000);
-}
-
-void RTCVideoEncoder::Impl::Enqueue(const webrtc::I420VideoFrame* input_frame,
- bool force_keyframe,
- base::WaitableEvent* async_waiter,
- int32_t* async_retval) {
- DVLOG(3) << "Impl::Enqueue()";
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!input_next_frame_);
-
- RegisterAsyncWaiter(async_waiter, async_retval);
- input_next_frame_ = input_frame;
- input_next_frame_keyframe_ = force_keyframe;
-
- if (!input_buffers_free_.empty())
- EncodeOneFrame();
-}
-
-void RTCVideoEncoder::Impl::UseOutputBitstreamBufferId(
- int32 bitstream_buffer_id) {
- DVLOG(3) << "Impl::UseOutputBitstreamBufferIndex(): "
- "bitstream_buffer_id=" << bitstream_buffer_id;
- DCHECK(thread_checker_.CalledOnValidThread());
- if (video_encoder_) {
- video_encoder_->UseOutputBitstreamBuffer(media::BitstreamBuffer(
- bitstream_buffer_id,
- output_buffers_[bitstream_buffer_id]->handle(),
- output_buffers_[bitstream_buffer_id]->mapped_size()));
- }
-}
-
-void RTCVideoEncoder::Impl::RequestEncodingParametersChange(uint32 bitrate,
- uint32 framerate) {
- DVLOG(3) << "Impl::RequestEncodingParametersChange(): bitrate=" << bitrate
- << ", framerate=" << framerate;
- DCHECK(thread_checker_.CalledOnValidThread());
-
- // Check for overflow converting bitrate (kilobits/sec) to bits/sec.
- if (bitrate > kuint32max / 1000) {
- NOTIFY_ERROR(media::VideoEncodeAccelerator::kInvalidArgumentError);
- return;
- }
-
- if (video_encoder_)
- video_encoder_->RequestEncodingParametersChange(bitrate * 1000, framerate);
-}
-
-void RTCVideoEncoder::Impl::Destroy() {
- DVLOG(3) << "Impl::Destroy()";
- DCHECK(thread_checker_.CalledOnValidThread());
- if (video_encoder_)
- video_encoder_.release()->Destroy();
-}
-
-void RTCVideoEncoder::Impl::NotifyInitializeDone() {
- DVLOG(3) << "Impl::NotifyInitializeDone()";
- DCHECK(thread_checker_.CalledOnValidThread());
- SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_OK);
-}
-
-void RTCVideoEncoder::Impl::RequireBitstreamBuffers(
- unsigned int input_count,
- const gfx::Size& input_coded_size,
- size_t output_buffer_size) {
- DVLOG(3) << "Impl::RequireBitstreamBuffers(): input_count=" << input_count
- << ", input_coded_size=" << input_coded_size.ToString()
- << ", output_buffer_size=" << output_buffer_size;
- DCHECK(thread_checker_.CalledOnValidThread());
-
- if (!video_encoder_)
- return;
-
- input_frame_coded_size_ = input_coded_size;
-
- for (unsigned int i = 0; i < input_count + kInputBufferExtraCount; ++i) {
- base::SharedMemory* shm =
- gpu_factories_->CreateSharedMemory(input_coded_size.GetArea() * 3 / 2);
- if (!shm) {
- DLOG(ERROR) << "Impl::RequireBitstreamBuffers(): "
- "failed to create input buffer " << i;
- NOTIFY_ERROR(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
- input_buffers_.push_back(shm);
- input_buffers_free_.push_back(i);
- }
-
- for (int i = 0; i < kOutputBufferCount; ++i) {
- base::SharedMemory* shm =
- gpu_factories_->CreateSharedMemory(output_buffer_size);
- if (!shm) {
- DLOG(ERROR) << "Impl::RequireBitstreamBuffers(): "
- "failed to create output buffer " << i;
- NOTIFY_ERROR(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
- output_buffers_.push_back(shm);
- }
-
- // Immediately provide all output buffers to the VEA.
- for (size_t i = 0; i < output_buffers_.size(); ++i) {
- video_encoder_->UseOutputBitstreamBuffer(media::BitstreamBuffer(
- i, output_buffers_[i]->handle(), output_buffers_[i]->mapped_size()));
- }
-}
-
-void RTCVideoEncoder::Impl::BitstreamBufferReady(int32 bitstream_buffer_id,
- size_t payload_size,
- bool key_frame) {
- DVLOG(3) << "Impl::BitstreamBufferReady(): "
- "bitstream_buffer_id=" << bitstream_buffer_id
- << ", payload_size=" << payload_size
- << ", key_frame=" << key_frame;
- DCHECK(thread_checker_.CalledOnValidThread());
-
- if (bitstream_buffer_id < 0 ||
- bitstream_buffer_id >= static_cast<int>(output_buffers_.size())) {
- DLOG(ERROR) << "Impl::BitstreamBufferReady(): invalid bitstream_buffer_id="
- << bitstream_buffer_id;
- NOTIFY_ERROR(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
- base::SharedMemory* output_buffer = output_buffers_[bitstream_buffer_id];
- if (payload_size > output_buffer->mapped_size()) {
- DLOG(ERROR) << "Impl::BitstreamBufferReady(): invalid payload_size="
- << payload_size;
- NOTIFY_ERROR(media::VideoEncodeAccelerator::kPlatformFailureError);
- return;
- }
-
- const base::Time now = base::Time::Now();
- if (time_base_.is_null())
- time_base_ = now;
- const base::TimeDelta delta = now - time_base_;
-
- scoped_ptr<webrtc::EncodedImage> image(new webrtc::EncodedImage(
- reinterpret_cast<uint8_t*>(output_buffer->memory()),
- payload_size,
- output_buffer->mapped_size()));
- image->_encodedWidth = input_visible_size_.width();
- image->_encodedHeight = input_visible_size_.height();
- // Convert capture time to 90 kHz RTP timestamp.
- image->_timeStamp = (delta * 90000).InSeconds();
- image->capture_time_ms_ = delta.InMilliseconds();
- image->_frameType = (key_frame ? webrtc::kKeyFrame : webrtc::kDeltaFrame);
- image->_completeFrame = true;
-
- encoder_message_loop_proxy_->PostTask(
- FROM_HERE,
- base::Bind(&RTCVideoEncoder::ReturnEncodedImage,
- weak_encoder_,
- base::Passed(&image),
- bitstream_buffer_id));
-}
-
-void RTCVideoEncoder::Impl::NotifyError(
- media::VideoEncodeAccelerator::Error error) {
- DVLOG(3) << "Impl::NotifyError(): error=" << error;
- DCHECK(thread_checker_.CalledOnValidThread());
- int32_t retval;
- switch (error) {
- case media::VideoEncodeAccelerator::kInvalidArgumentError:
- retval = WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
- break;
- default:
- retval = WEBRTC_VIDEO_CODEC_ERROR;
- }
-
- if (video_encoder_)
- video_encoder_.release()->Destroy();
-
- if (async_waiter_) {
- SignalAsyncWaiter(retval);
- } else {
- encoder_message_loop_proxy_->PostTask(
- FROM_HERE,
- base::Bind(&RTCVideoEncoder::NotifyError, weak_encoder_, retval));
- }
-}
-
-RTCVideoEncoder::Impl::~Impl() { DCHECK(!video_encoder_); }
-
-void RTCVideoEncoder::Impl::EncodeOneFrame() {
- DVLOG(3) << "Impl::EncodeOneFrame()";
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(input_next_frame_);
- DCHECK(!input_buffers_free_.empty());
-
- // EncodeOneFrame() may re-enter EncodeFrameFinished() if VEA::Encode() fails,
- // we receive a VEA::NotifyError(), and the media::VideoFrame we pass to
- // Encode() gets destroyed early. Handle this by resetting our
- // input_next_frame_* state before we hand off the VideoFrame to the VEA.
- const webrtc::I420VideoFrame* next_frame = input_next_frame_;
- bool next_frame_keyframe = input_next_frame_keyframe_;
- input_next_frame_ = NULL;
- input_next_frame_keyframe_ = false;
-
- if (!video_encoder_) {
- SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_ERROR);
- return;
- }
-
- const int index = input_buffers_free_.back();
- base::SharedMemory* input_buffer = input_buffers_[index];
-
- // Do a strided copy of the input frame to match the input requirements for
- // the encoder.
- // TODO(sheu): support zero-copy from WebRTC. http://crbug.com/269312
- const uint8_t* src = next_frame->buffer(webrtc::kYPlane);
- uint8* dst = reinterpret_cast<uint8*>(input_buffer->memory());
- uint8* const y_dst = dst;
- int width = input_frame_coded_size_.width();
- int stride = next_frame->stride(webrtc::kYPlane);
- for (int i = 0; i < next_frame->height(); ++i) {
- memcpy(dst, src, width);
- src += stride;
- dst += width;
- }
- src = next_frame->buffer(webrtc::kUPlane);
- width = input_frame_coded_size_.width() / 2;
- stride = next_frame->stride(webrtc::kUPlane);
- for (int i = 0; i < next_frame->height() / 2; ++i) {
- memcpy(dst, src, width);
- src += stride;
- dst += width;
- }
- src = next_frame->buffer(webrtc::kVPlane);
- width = input_frame_coded_size_.width() / 2;
- stride = next_frame->stride(webrtc::kVPlane);
- for (int i = 0; i < next_frame->height() / 2; ++i) {
- memcpy(dst, src, width);
- src += stride;
- dst += width;
- }
-
- scoped_refptr<media::VideoFrame> frame =
- media::VideoFrame::WrapExternalSharedMemory(
- media::VideoFrame::I420,
- input_frame_coded_size_,
- gfx::Rect(input_visible_size_),
- input_visible_size_,
- y_dst,
- input_buffer->handle(),
- base::TimeDelta(),
- base::Bind(&RTCVideoEncoder::Impl::EncodeFrameFinished, this, index));
-
- video_encoder_->Encode(frame, next_frame_keyframe);
- input_buffers_free_.pop_back();
- SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_OK);
-}
-
-void RTCVideoEncoder::Impl::EncodeFrameFinished(int index) {
- DVLOG(3) << "Impl::EncodeFrameFinished(): index=" << index;
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK_GE(index, 0);
- DCHECK_LT(index, static_cast<int>(input_buffers_.size()));
- input_buffers_free_.push_back(index);
- if (input_next_frame_)
- EncodeOneFrame();
-}
-
-void RTCVideoEncoder::Impl::RegisterAsyncWaiter(base::WaitableEvent* waiter,
- int32_t* retval) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!async_waiter_);
- DCHECK(!async_retval_);
- async_waiter_ = waiter;
- async_retval_ = retval;
-}
-
-void RTCVideoEncoder::Impl::SignalAsyncWaiter(int32_t retval) {
- DCHECK(thread_checker_.CalledOnValidThread());
- *async_retval_ = retval;
- async_waiter_->Signal();
- async_retval_ = NULL;
- async_waiter_ = NULL;
-}
-
-#undef NOTIFY_ERROR
-
-////////////////////////////////////////////////////////////////////////////////
-//
-// RTCVideoEncoder
-//
-////////////////////////////////////////////////////////////////////////////////
-
-RTCVideoEncoder::RTCVideoEncoder(
- webrtc::VideoCodecType type,
- media::VideoCodecProfile profile,
- const scoped_refptr<RendererGpuVideoAcceleratorFactories>& gpu_factories)
- : video_codec_type_(type),
- video_codec_profile_(profile),
- gpu_factories_(gpu_factories),
- encoded_image_callback_(NULL),
- impl_status_(WEBRTC_VIDEO_CODEC_UNINITIALIZED) {
- DVLOG(1) << "RTCVideoEncoder(): profile=" << profile;
-}
-
-RTCVideoEncoder::~RTCVideoEncoder() {
- DCHECK(thread_checker_.CalledOnValidThread());
- Release();
- DCHECK(!impl_);
-}
-
-int32_t RTCVideoEncoder::InitEncode(const webrtc::VideoCodec* codec_settings,
- int32_t number_of_cores,
- uint32_t max_payload_size) {
- DVLOG(1) << "InitEncode(): codecType=" << codec_settings->codecType
- << ", width=" << codec_settings->width
- << ", height=" << codec_settings->height
- << ", startBitrate=" << codec_settings->startBitrate;
- DCHECK(thread_checker_.CalledOnValidThread());
- DCHECK(!impl_);
-
- weak_this_factory_.reset(new base::WeakPtrFactory<RTCVideoEncoder>(this));
- impl_ = new Impl(weak_this_factory_->GetWeakPtr(), gpu_factories_);
- base::WaitableEvent initialization_waiter(true, false);
- int32_t initialization_retval = WEBRTC_VIDEO_CODEC_UNINITIALIZED;
- gpu_factories_->GetMessageLoop()->PostTask(
- FROM_HERE,
- base::Bind(&RTCVideoEncoder::Impl::CreateAndInitializeVEA,
- impl_,
- gfx::Size(codec_settings->width, codec_settings->height),
- codec_settings->startBitrate,
- video_codec_profile_,
- &initialization_waiter,
- &initialization_retval));
-
- // webrtc::VideoEncoder expects this call to be synchronous.
- initialization_waiter.Wait();
- return initialization_retval;
-}
-
-int32_t RTCVideoEncoder::Encode(
- const webrtc::I420VideoFrame& input_image,
- const webrtc::CodecSpecificInfo* codec_specific_info,
- const std::vector<webrtc::VideoFrameType>* frame_types) {
- DVLOG(3) << "Encode()";
- // TODO(sheu): figure out why this check fails.
- // DCHECK(thread_checker_.CalledOnValidThread());
- if (!impl_) {
- DVLOG(3) << "Encode(): returning impl_status_=" << impl_status_;
- return impl_status_;
- }
-
- base::WaitableEvent encode_waiter(true, false);
- int32_t encode_retval = WEBRTC_VIDEO_CODEC_UNINITIALIZED;
- gpu_factories_->GetMessageLoop()->PostTask(
- FROM_HERE,
- base::Bind(&RTCVideoEncoder::Impl::Enqueue,
- impl_,
- &input_image,
- (frame_types->front() == webrtc::kKeyFrame),
- &encode_waiter,
- &encode_retval));
-
- // webrtc::VideoEncoder expects this call to be synchronous.
- encode_waiter.Wait();
- DVLOG(3) << "Encode(): returning encode_retval=" << encode_retval;
- return encode_retval;
-}
-
-int32_t RTCVideoEncoder::RegisterEncodeCompleteCallback(
- webrtc::EncodedImageCallback* callback) {
- DVLOG(3) << "RegisterEncodeCompleteCallback()";
- DCHECK(thread_checker_.CalledOnValidThread());
- if (!impl_) {
- DVLOG(3) << "RegisterEncodeCompleteCallback(): returning " << impl_status_;
- return impl_status_;
- }
-
- encoded_image_callback_ = callback;
- return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t RTCVideoEncoder::Release() {
- DVLOG(3) << "Release()";
- DCHECK(thread_checker_.CalledOnValidThread());
-
- // Reset the gpu_factory_, in case we reuse this encoder.
- gpu_factories_->Abort();
- gpu_factories_ = gpu_factories_->Clone();
- if (impl_) {
- gpu_factories_->GetMessageLoop()->PostTask(
- FROM_HERE, base::Bind(&RTCVideoEncoder::Impl::Destroy, impl_));
- impl_ = NULL;
- weak_this_factory_.reset();
- impl_status_ = WEBRTC_VIDEO_CODEC_UNINITIALIZED;
- }
- return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t RTCVideoEncoder::SetChannelParameters(uint32_t packet_loss, int rtt) {
- DVLOG(3) << "SetChannelParameters(): packet_loss=" << packet_loss
- << ", rtt=" << rtt;
- DCHECK(thread_checker_.CalledOnValidThread());
- // Ignored.
- return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t RTCVideoEncoder::SetRates(uint32_t new_bit_rate, uint32_t frame_rate) {
- DVLOG(3) << "SetRates(): new_bit_rate=" << new_bit_rate
- << ", frame_rate=" << frame_rate;
- DCHECK(thread_checker_.CalledOnValidThread());
- if (!impl_) {
- DVLOG(3) << "SetRates(): returning " << impl_status_;
- return impl_status_;
- }
-
- gpu_factories_->GetMessageLoop()->PostTask(
- FROM_HERE,
- base::Bind(&RTCVideoEncoder::Impl::RequestEncodingParametersChange,
- impl_,
- new_bit_rate,
- frame_rate));
- return WEBRTC_VIDEO_CODEC_OK;
-}
-
-void RTCVideoEncoder::ReturnEncodedImage(scoped_ptr<webrtc::EncodedImage> image,
- int32 bitstream_buffer_id) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DVLOG(3) << "ReturnEncodedImage(): "
- "bitstream_buffer_id=" << bitstream_buffer_id;
-
- if (!encoded_image_callback_)
- return;
-
- webrtc::CodecSpecificInfo info;
- info.codecType = video_codec_type_;
-
- // Generate a header describing a single fragment.
- webrtc::RTPFragmentationHeader header;
- header.VerifyAndAllocateFragmentationHeader(1);
- header.fragmentationOffset[0] = 0;
- header.fragmentationLength[0] = image->_length;
- header.fragmentationPlType[0] = 0;
- header.fragmentationTimeDiff[0] = 0;
-
- int32_t retval = encoded_image_callback_->Encoded(*image, &info, &header);
- if (retval < 0) {
- DVLOG(2) << "ReturnEncodedImage(): encoded_image_callback_ returned "
- << retval;
- }
-
- // The call through webrtc::EncodedImageCallback is synchronous, so we can
- // immediately recycle the output buffer back to the Impl.
- gpu_factories_->GetMessageLoop()->PostTask(
- FROM_HERE,
- base::Bind(&RTCVideoEncoder::Impl::UseOutputBitstreamBufferId,
- impl_,
- bitstream_buffer_id));
-}
-
-void RTCVideoEncoder::NotifyError(int32_t error) {
- DCHECK(thread_checker_.CalledOnValidThread());
- DVLOG(1) << "NotifyError(): error=" << error;
-
- impl_status_ = error;
- gpu_factories_->GetMessageLoop()->PostTask(
- FROM_HERE, base::Bind(&RTCVideoEncoder::Impl::Destroy, impl_));
- impl_ = NULL;
-}
-
-} // namespace content
diff --git a/chromium/content/renderer/media/rtc_video_encoder.h b/chromium/content/renderer/media/rtc_video_encoder.h
deleted file mode 100644
index 22d4c503d3a..00000000000
--- a/chromium/content/renderer/media/rtc_video_encoder.h
+++ /dev/null
@@ -1,104 +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 CONTENT_RENDERER_MEDIA_RTC_VIDEO_ENCODER_H_
-#define CONTENT_RENDERER_MEDIA_RTC_VIDEO_ENCODER_H_
-
-#include <vector>
-
-#include "base/memory/ref_counted.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/threading/thread_checker.h"
-#include "base/time/time.h"
-#include "content/common/content_export.h"
-#include "media/base/video_decoder_config.h"
-#include "third_party/webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
-#include "ui/gfx/size.h"
-
-namespace base {
-
-class MessageLoopProxy;
-
-} // namespace base
-
-namespace content {
-
-class RendererGpuVideoAcceleratorFactories;
-
-// RTCVideoEncoder uses a media::VideoEncodeAccelerator to implement a
-// webrtc::VideoEncoder class for WebRTC. Internally, VEA methods are
-// trampolined to a private RTCVideoEncoder::Impl instance. The Impl class runs
-// on the worker thread queried from the |gpu_factories_|, which is presently
-// the media thread. RTCVideoEncoder itself is run and destroyed on the thread
-// it is constructed on, which is presently the libjingle worker thread.
-// Callbacks from the Impl due to its VEA::Client notifications are also posted
-// back to RTCVideoEncoder on this thread.
-class CONTENT_EXPORT RTCVideoEncoder
- : NON_EXPORTED_BASE(public webrtc::VideoEncoder) {
- public:
- RTCVideoEncoder(
- webrtc::VideoCodecType type,
- media::VideoCodecProfile profile,
- const scoped_refptr<RendererGpuVideoAcceleratorFactories>& gpu_factories);
- virtual ~RTCVideoEncoder();
-
- // webrtc::VideoEncoder implementation. Tasks are posted to |impl_| using the
- // appropriate VEA methods.
- virtual int32_t InitEncode(const webrtc::VideoCodec* codec_settings,
- int32_t number_of_cores,
- uint32_t max_payload_size) OVERRIDE;
- virtual int32_t Encode(
- const webrtc::I420VideoFrame& input_image,
- const webrtc::CodecSpecificInfo* codec_specific_info,
- const std::vector<webrtc::VideoFrameType>* frame_types) OVERRIDE;
- virtual int32_t RegisterEncodeCompleteCallback(
- webrtc::EncodedImageCallback* callback) OVERRIDE;
- virtual int32_t Release() OVERRIDE;
- virtual int32_t SetChannelParameters(uint32_t packet_loss, int rtt) OVERRIDE;
- virtual int32_t SetRates(uint32_t new_bit_rate, uint32_t frame_rate) OVERRIDE;
-
- private:
- class Impl;
- friend class RTCVideoEncoder::Impl;
-
- // Return an encoded output buffer to WebRTC.
- void ReturnEncodedImage(scoped_ptr<webrtc::EncodedImage> image,
- int32 bitstream_buffer_id);
-
- void NotifyError(int32_t error);
-
- base::ThreadChecker thread_checker_;
-
- // The video codec type, as reported to WebRTC.
- const webrtc::VideoCodecType video_codec_type_;
-
- // The video codec profile, to configure the encoder to encode to.
- const media::VideoCodecProfile video_codec_profile_;
-
- // Factory for creating VEAs, shared memory buffers, etc.
- scoped_refptr<RendererGpuVideoAcceleratorFactories> gpu_factories_;
-
- // Weak pointer and factory for posting back VEA::Client notifications to
- // RTCVideoEncoder.
- scoped_ptr<base::WeakPtrFactory<RTCVideoEncoder> > weak_this_factory_;
-
- // webrtc::VideoEncoder encode complete callback.
- webrtc::EncodedImageCallback* encoded_image_callback_;
-
- // The RTCVideoEncoder::Impl that does all the work.
- scoped_refptr<Impl> impl_;
-
- // We cannot immediately return error conditions to the WebRTC user of this
- // class, as there is no error callback in the webrtc::VideoEncoder interface.
- // Instead, we cache an error status here and return it the next time an
- // interface entry point is called.
- int32_t impl_status_;
-
- DISALLOW_COPY_AND_ASSIGN(RTCVideoEncoder);
-};
-
-} // namespace content
-
-#endif // CONTENT_RENDERER_MEDIA_RTC_VIDEO_ENCODER_H_
diff --git a/chromium/content/renderer/media/rtc_video_encoder_factory.cc b/chromium/content/renderer/media/rtc_video_encoder_factory.cc
deleted file mode 100644
index 3ff42728df2..00000000000
--- a/chromium/content/renderer/media/rtc_video_encoder_factory.cc
+++ /dev/null
@@ -1,110 +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 "content/renderer/media/rtc_video_encoder_factory.h"
-
-#include "content/common/gpu/client/gpu_video_encode_accelerator_host.h"
-#include "content/renderer/media/renderer_gpu_video_accelerator_factories.h"
-#include "content/renderer/media/rtc_video_encoder.h"
-#include "media/video/video_encode_accelerator.h"
-
-namespace content {
-
-namespace {
-
-// Translate from media::VideoEncodeAccelerator::SupportedProfile to
-// cricket::WebRtcVideoEncoderFactory::VideoCodec
-cricket::WebRtcVideoEncoderFactory::VideoCodec VEAToWebRTCCodec(
- const media::VideoEncodeAccelerator::SupportedProfile& profile) {
- webrtc::VideoCodecType type = webrtc::kVideoCodecUnknown;
- std::string name;
- int width = 0, height = 0, fps = 0;
-
- if (profile.profile >= media::VP8PROFILE_MIN &&
- profile.profile <= media::VP8PROFILE_MAX) {
- type = webrtc::kVideoCodecVP8;
- name = "VP8";
- } else if (profile.profile >= media::H264PROFILE_MIN &&
- profile.profile <= media::H264PROFILE_MAX) {
- type = webrtc::kVideoCodecGeneric;
- name = "CAST1";
- }
-
- if (type != webrtc::kVideoCodecUnknown) {
- width = profile.max_resolution.width();
- height = profile.max_resolution.height();
- fps = profile.max_framerate.numerator;
- DCHECK_EQ(profile.max_framerate.denominator, 1U);
- }
-
- return cricket::WebRtcVideoEncoderFactory::VideoCodec(
- type, name, width, height, fps);
-}
-
-// Translate from cricket::WebRtcVideoEncoderFactory::VideoCodec to
-// media::VideoCodecProfile. Pick a default profile for each codec type.
-media::VideoCodecProfile WebRTCCodecToVideoCodecProfile(
- webrtc::VideoCodecType type) {
- switch (type) {
- case webrtc::kVideoCodecVP8:
- return media::VP8PROFILE_MAIN;
- case webrtc::kVideoCodecGeneric:
- return media::H264PROFILE_MAIN;
- default:
- return media::VIDEO_CODEC_PROFILE_UNKNOWN;
- }
-}
-
-} // anonymous namespace
-
-RTCVideoEncoderFactory::RTCVideoEncoderFactory(
- const scoped_refptr<RendererGpuVideoAcceleratorFactories>& gpu_factories)
- : gpu_factories_(gpu_factories) {
- // Query media::VideoEncodeAccelerator (statically) for our supported codecs.
- std::vector<media::VideoEncodeAccelerator::SupportedProfile> profiles =
- GpuVideoEncodeAcceleratorHost::GetSupportedProfiles();
- for (size_t i = 0; i < profiles.size(); ++i) {
- VideoCodec codec = VEAToWebRTCCodec(profiles[i]);
- if (codec.type != webrtc::kVideoCodecUnknown)
- codecs_.push_back(codec);
- }
-}
-
-RTCVideoEncoderFactory::~RTCVideoEncoderFactory() {}
-
-webrtc::VideoEncoder* RTCVideoEncoderFactory::CreateVideoEncoder(
- webrtc::VideoCodecType type) {
- bool found = false;
- for (size_t i = 0; i < codecs_.size(); ++i) {
- if (codecs_[i].type == type) {
- found = true;
- break;
- }
- }
- if (!found)
- return NULL;
- // GpuVideoAcceleratorFactories is not thread safe. It cannot be shared
- // by different encoders. Since we aren't running on the child thread and
- // cannot create a new factory, clone one instead.
- return new RTCVideoEncoder(
- type, WebRTCCodecToVideoCodecProfile(type), gpu_factories_->Clone());
-}
-
-void RTCVideoEncoderFactory::AddObserver(Observer* observer) {
- // No-op: our codec list is populated on installation.
-}
-
-void RTCVideoEncoderFactory::RemoveObserver(Observer* observer) {}
-
-const std::vector<cricket::WebRtcVideoEncoderFactory::VideoCodec>&
-RTCVideoEncoderFactory::codecs() const {
- return codecs_;
-}
-
-void RTCVideoEncoderFactory::DestroyVideoEncoder(
- webrtc::VideoEncoder* encoder) {
- delete encoder;
-}
-
-} // namespace content
diff --git a/chromium/content/renderer/media/rtc_video_encoder_factory.h b/chromium/content/renderer/media/rtc_video_encoder_factory.h
deleted file mode 100644
index b07ccda0043..00000000000
--- a/chromium/content/renderer/media/rtc_video_encoder_factory.h
+++ /dev/null
@@ -1,48 +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 CONTENT_RENDERER_MEDIA_RTC_VIDEO_ENCODER_FACTORY_H_
-#define CONTENT_RENDERER_MEDIA_RTC_VIDEO_ENCODER_FACTORY_H_
-
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/memory/ref_counted.h"
-#include "content/common/content_export.h"
-#include "third_party/libjingle/source/talk/media/webrtc/webrtcvideoencoderfactory.h"
-
-namespace content {
-
-class RendererGpuVideoAcceleratorFactories;
-
-// This class creates RTCVideoEncoder instances (each wrapping a
-// media::VideoEncodeAccelerator) on behalf of the WebRTC stack.
-class CONTENT_EXPORT RTCVideoEncoderFactory
- : NON_EXPORTED_BASE(public cricket::WebRtcVideoEncoderFactory) {
- public:
- explicit RTCVideoEncoderFactory(
- const scoped_refptr<RendererGpuVideoAcceleratorFactories>& gpu_factories);
- virtual ~RTCVideoEncoderFactory();
-
- // cricket::WebRtcVideoEncoderFactory implementation.
- virtual webrtc::VideoEncoder* CreateVideoEncoder(
- webrtc::VideoCodecType type) OVERRIDE;
- virtual void AddObserver(Observer* observer) OVERRIDE;
- virtual void RemoveObserver(Observer* observer) OVERRIDE;
- virtual const std::vector<VideoCodec>& codecs() const OVERRIDE;
- virtual void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) OVERRIDE;
-
- private:
- const scoped_refptr<RendererGpuVideoAcceleratorFactories> gpu_factories_;
-
- // Codec support list of cricket::WebRtcVideoEncoderFactory::VideoCodec
- // instances.
- std::vector<VideoCodec> codecs_;
-
- DISALLOW_COPY_AND_ASSIGN(RTCVideoEncoderFactory);
-};
-
-} // namespace content
-
-#endif // CONTENT_RENDERER_MEDIA_RTC_VIDEO_ENCODER_FACTORY_H_
diff --git a/chromium/content/renderer/media/webmediaplayer_impl.cc b/chromium/content/renderer/media/webmediaplayer_impl.cc
index d4780970eb4..227d0cf4b14 100644
--- a/chromium/content/renderer/media/webmediaplayer_impl.cc
+++ b/chromium/content/renderer/media/webmediaplayer_impl.cc
@@ -43,8 +43,8 @@
#include "media/filters/ffmpeg_audio_decoder.h"
#include "media/filters/ffmpeg_demuxer.h"
#include "media/filters/ffmpeg_video_decoder.h"
-#include "media/filters/gpu_video_accelerator_factories.h"
#include "media/filters/gpu_video_decoder.h"
+#include "media/filters/gpu_video_decoder_factories.h"
#include "media/filters/opus_audio_decoder.h"
#include "media/filters/video_renderer_base.h"
#include "media/filters/vpx_video_decoder.h"
diff --git a/chromium/content/renderer/media/webmediaplayer_impl.h b/chromium/content/renderer/media/webmediaplayer_impl.h
index c386b08f2b0..23b1ddf524a 100644
--- a/chromium/content/renderer/media/webmediaplayer_impl.h
+++ b/chromium/content/renderer/media/webmediaplayer_impl.h
@@ -56,7 +56,7 @@ class MessageLoopProxy;
namespace media {
class ChunkDemuxer;
class FFmpegDemuxer;
-class GpuVideoAcceleratorFactories;
+class GpuVideoDecoderFactories;
class MediaLog;
}
@@ -318,8 +318,8 @@ class WebMediaPlayerImpl
bool incremented_externally_allocated_memory_;
- // Factories for supporting video accelerators. May be null.
- scoped_refptr<media::GpuVideoAcceleratorFactories> gpu_factories_;
+ // Factories for supporting GpuVideoDecoder. May be null.
+ scoped_refptr<media::GpuVideoDecoderFactories> gpu_factories_;
// Routes audio playback to either AudioRendererSink or WebAudio.
scoped_refptr<WebAudioSourceProviderImpl> audio_source_provider_;
diff --git a/chromium/content/renderer/media/webmediaplayer_params.cc b/chromium/content/renderer/media/webmediaplayer_params.cc
index a05abbfa571..04fe3105736 100644
--- a/chromium/content/renderer/media/webmediaplayer_params.cc
+++ b/chromium/content/renderer/media/webmediaplayer_params.cc
@@ -7,7 +7,7 @@
#include "base/message_loop/message_loop_proxy.h"
#include "media/base/audio_renderer_sink.h"
#include "media/base/media_log.h"
-#include "media/filters/gpu_video_accelerator_factories.h"
+#include "media/filters/gpu_video_decoder_factories.h"
namespace content {
@@ -15,7 +15,7 @@ WebMediaPlayerParams::WebMediaPlayerParams(
const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy,
const base::Callback<void(const base::Closure&)>& defer_load_cb,
const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink,
- const scoped_refptr<media::GpuVideoAcceleratorFactories>& gpu_factories,
+ const scoped_refptr<media::GpuVideoDecoderFactories>& gpu_factories,
const scoped_refptr<media::MediaLog>& media_log)
: message_loop_proxy_(message_loop_proxy),
defer_load_cb_(defer_load_cb),
diff --git a/chromium/content/renderer/media/webmediaplayer_params.h b/chromium/content/renderer/media/webmediaplayer_params.h
index bf398642f77..4347a4af460 100644
--- a/chromium/content/renderer/media/webmediaplayer_params.h
+++ b/chromium/content/renderer/media/webmediaplayer_params.h
@@ -14,7 +14,7 @@ class MessageLoopProxy;
namespace media {
class AudioRendererSink;
-class GpuVideoAcceleratorFactories;
+class GpuVideoDecoderFactories;
class MediaLog;
}
@@ -30,7 +30,7 @@ class WebMediaPlayerParams {
const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy,
const base::Callback<void(const base::Closure&)>& defer_load_cb,
const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink,
- const scoped_refptr<media::GpuVideoAcceleratorFactories>& gpu_factories,
+ const scoped_refptr<media::GpuVideoDecoderFactories>& gpu_factories,
const scoped_refptr<media::MediaLog>& media_log);
~WebMediaPlayerParams();
@@ -46,8 +46,7 @@ class WebMediaPlayerParams {
return audio_renderer_sink_;
}
- const scoped_refptr<media::GpuVideoAcceleratorFactories>& gpu_factories()
- const {
+ const scoped_refptr<media::GpuVideoDecoderFactories>& gpu_factories() const {
return gpu_factories_;
}
@@ -59,7 +58,7 @@ class WebMediaPlayerParams {
scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
base::Callback<void(const base::Closure&)> defer_load_cb_;
scoped_refptr<media::AudioRendererSink> audio_renderer_sink_;
- scoped_refptr<media::GpuVideoAcceleratorFactories> gpu_factories_;
+ scoped_refptr<media::GpuVideoDecoderFactories> gpu_factories_;
scoped_refptr<media::MediaLog> media_log_;
DISALLOW_IMPLICIT_CONSTRUCTORS(WebMediaPlayerParams);
diff --git a/chromium/content/renderer/media/webrtc_audio_device_impl.cc b/chromium/content/renderer/media/webrtc_audio_device_impl.cc
index c40e0a2219b..254561e4ae1 100644
--- a/chromium/content/renderer/media/webrtc_audio_device_impl.cc
+++ b/chromium/content/renderer/media/webrtc_audio_device_impl.cc
@@ -63,7 +63,9 @@ int WebRtcAudioDeviceImpl::CaptureData(const std::vector<int>& channels,
int total_delay_ms = 0;
{
base::AutoLock auto_lock(lock_);
- if (!recording_)
+ // Return immediately when not recording or |channels| is empty.
+ // See crbug.com/274017: renderer crash dereferencing invalid channels[0].
+ if (!recording_ || channels.empty())
return 0;
// Store the reported audio delay locally.
diff --git a/chromium/content/renderer/media/webrtc_local_audio_track.cc b/chromium/content/renderer/media/webrtc_local_audio_track.cc
index de86a3c4cc3..1aae3056f6d 100644
--- a/chromium/content/renderer/media/webrtc_local_audio_track.cc
+++ b/chromium/content/renderer/media/webrtc_local_audio_track.cc
@@ -34,6 +34,12 @@ WebRtcLocalAudioTrack::WebRtcLocalAudioTrack(
// and APM (AudioProcessingModule) is turned on only for microphone data.
DCHECK(capturer.get());
DVLOG(1) << "WebRtcLocalAudioTrack::WebRtcLocalAudioTrack()";
+
+ // TODO(tommi): Remove this, feed audio constraints to WebRtcLocalAudioTrack
+ // and check the constraints. This is here to fix a recent regression whereby
+ // audio processing is not enabled for WebAudio regardless of the hard coded
+ // audio constraints. For more info: http://crbug.com/277134
+ need_audio_processing_ = true;
}
WebRtcLocalAudioTrack::~WebRtcLocalAudioTrack() {
diff --git a/chromium/content/renderer/media/webrtc_local_audio_track_unittest.cc b/chromium/content/renderer/media/webrtc_local_audio_track_unittest.cc
index 4720e45bf01..776cbb10035 100644
--- a/chromium/content/renderer/media/webrtc_local_audio_track_unittest.cc
+++ b/chromium/content/renderer/media/webrtc_local_audio_track_unittest.cc
@@ -175,7 +175,7 @@ TEST_F(WebRtcLocalAudioTrackTest, ConnectAndDisconnectOneSink) {
EXPECT_CALL(*sink, SetCaptureFormat(_)).WillOnce(Return());
EXPECT_CALL(*sink, CaptureData(
kNumberOfNetworkChannels, params.sample_rate(), params.channels(),
- params.frames_per_buffer(), 0, 0, false))
+ params.frames_per_buffer(), 0, 0, _))
.Times(AtLeast(1)).WillRepeatedly(SignalEvent(&event));
track->AddSink(sink.get());
@@ -245,7 +245,7 @@ TEST_F(WebRtcLocalAudioTrackTest, MultipleAudioTracks) {
EXPECT_CALL(*sink_1, SetCaptureFormat(_)).WillOnce(Return());
EXPECT_CALL(*sink_1, CaptureData(
1, params.sample_rate(), params.channels(),
- params.frames_per_buffer(), 0, 0, false))
+ params.frames_per_buffer(), 0, 0, _))
.Times(AtLeast(1)).WillRepeatedly(SignalEvent(&event_1));
track_1->AddSink(sink_1.get());
EXPECT_TRUE(event_1.TimedWait(TestTimeouts::tiny_timeout()));
@@ -266,11 +266,11 @@ TEST_F(WebRtcLocalAudioTrackTest, MultipleAudioTracks) {
EXPECT_CALL(*sink_2, SetCaptureFormat(_)).WillOnce(Return());
EXPECT_CALL(*sink_1, CaptureData(
1, params.sample_rate(), params.channels(),
- params.frames_per_buffer(), 0, 0, false))
+ params.frames_per_buffer(), 0, 0, _))
.Times(AtLeast(1)).WillRepeatedly(SignalEvent(&event_1));
EXPECT_CALL(*sink_2, CaptureData(
1, params.sample_rate(), params.channels(),
- params.frames_per_buffer(), 0, 0, false))
+ params.frames_per_buffer(), 0, 0, _))
.Times(AtLeast(1)).WillRepeatedly(SignalEvent(&event_2));
track_2->AddSink(sink_2.get());
EXPECT_TRUE(event_1.TimedWait(TestTimeouts::tiny_timeout()));
@@ -319,7 +319,7 @@ TEST_F(WebRtcLocalAudioTrackTest, StartAndStopAudioTracks) {
scoped_ptr<MockWebRtcAudioCapturerSink> sink(
new MockWebRtcAudioCapturerSink());
event.Reset();
- EXPECT_CALL(*sink, CaptureData(_, _, _, _, 0, 0, false))
+ EXPECT_CALL(*sink, CaptureData(_, _, _, _, 0, 0, _))
.Times(AnyNumber()).WillRepeatedly(Return());
EXPECT_CALL(*sink, SetCaptureFormat(_)).Times(1);
track_1->AddSink(sink.get());
@@ -397,7 +397,7 @@ TEST_F(WebRtcLocalAudioTrackTest, ConnectTracksToDifferentCapturers) {
scoped_ptr<MockWebRtcAudioCapturerSink> sink_1(
new MockWebRtcAudioCapturerSink());
EXPECT_CALL(*sink_1.get(), CaptureData(kNumberOfNetworkChannelsForTrack1,
- 48000, 2, _, 0, 0, false))
+ 48000, 2, _, 0, 0, _))
.Times(AnyNumber()).WillRepeatedly(Return());
EXPECT_CALL(*sink_1.get(), SetCaptureFormat(_)).Times(1);
track_1->AddSink(sink_1.get());
diff --git a/chromium/content/renderer/pepper/pepper_in_process_router.cc b/chromium/content/renderer/pepper/pepper_in_process_router.cc
index d5c0d429a40..1446426dd77 100644
--- a/chromium/content/renderer/pepper/pepper_in_process_router.cc
+++ b/chromium/content/renderer/pepper/pepper_in_process_router.cc
@@ -110,9 +110,24 @@ bool PepperInProcessRouter::SendToHost(IPC::Message* msg) {
scoped_ptr<IPC::Message> message(msg);
if (!message->is_sync()) {
- bool result = host_impl_->GetPpapiHost()->OnMessageReceived(*message);
- DCHECK(result) << "The message was not handled by the host.";
- return true;
+ // If this is a resource destroyed message, post a task to dispatch it.
+ // Dispatching it synchronously can cause the host to re-enter the proxy
+ // code while we're still in the resource destructor, leading to a crash.
+ // http://crbug.com/276368.
+ // This won't cause message reordering problems because the resource
+ // destroyed message is always the last one sent for a resource.
+ if (message->type() == PpapiHostMsg_ResourceDestroyed::ID) {
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&PepperInProcessRouter::DispatchHostMsg,
+ weak_factory_.GetWeakPtr(),
+ base::Owned(message.release())));
+ return true;
+ } else {
+ bool result = host_impl_->GetPpapiHost()->OnMessageReceived(*message);
+ DCHECK(result) << "The message was not handled by the host.";
+ return true;
+ }
}
pending_message_id_ = IPC::SyncMessage::GetMessageId(*message);
@@ -146,6 +161,11 @@ bool PepperInProcessRouter::SendToPlugin(IPC::Message* msg) {
return true;
}
+void PepperInProcessRouter::DispatchHostMsg(IPC::Message* msg) {
+ bool handled = host_impl_->GetPpapiHost()->OnMessageReceived(*msg);
+ DCHECK(handled);
+}
+
void PepperInProcessRouter::DispatchPluginMsg(IPC::Message* msg) {
bool handled = OnPluginMsgReceived(*msg);
DCHECK(handled);
diff --git a/chromium/content/renderer/pepper/pepper_in_process_router.h b/chromium/content/renderer/pepper/pepper_in_process_router.h
index 568c18eaab4..77b19881174 100644
--- a/chromium/content/renderer/pepper/pepper_in_process_router.h
+++ b/chromium/content/renderer/pepper/pepper_in_process_router.h
@@ -71,6 +71,7 @@ class PepperInProcessRouter {
private:
bool SendToHost(IPC::Message *msg);
bool SendToPlugin(IPC::Message *msg);
+ void DispatchHostMsg(IPC::Message* msg);
void DispatchPluginMsg(IPC::Message* msg);
bool SendToBrowser(IPC::Message *msg);
diff --git a/chromium/content/renderer/pepper/pepper_url_loader_host.cc b/chromium/content/renderer/pepper/pepper_url_loader_host.cc
index 8343f1934ea..9b951f57354 100644
--- a/chromium/content/renderer/pepper/pepper_url_loader_host.cc
+++ b/chromium/content/renderer/pepper/pepper_url_loader_host.cc
@@ -249,9 +249,12 @@ int32_t PepperURLLoaderHost::InternalOnHostMsgOpen(
WebFrame* frame = GetFrame();
if (!frame)
return PP_ERROR_FAILED;
+
WebURLRequest web_request;
if (!CreateWebURLRequest(&filled_in_request_data, frame, &web_request))
return PP_ERROR_FAILED;
+
+ web_request.setTargetType(WebURLRequest::TargetIsObject);
web_request.setRequestorProcessID(renderer_ppapi_host_->GetPluginPID());
WebURLLoaderOptions options;
diff --git a/chromium/content/renderer/pepper/url_request_info_util.cc b/chromium/content/renderer/pepper/url_request_info_util.cc
index e82c8a18612..72365fde336 100644
--- a/chromium/content/renderer/pepper/url_request_info_util.cc
+++ b/chromium/content/renderer/pepper/url_request_info_util.cc
@@ -124,7 +124,6 @@ bool CreateWebURLRequest(ppapi::URLRequestInfoData* data,
return false;
dest->initialize();
- dest->setTargetType(WebURLRequest::TargetIsObject);
dest->setURL(frame->document().completeURL(WebString::fromUTF8(
data->url)));
dest->setDownloadToFile(data->stream_to_file);
diff --git a/chromium/content/renderer/render_frame_impl.cc b/chromium/content/renderer/render_frame_impl.cc
index 92bfb3d6a3c..fff52e0ff96 100644
--- a/chromium/content/renderer/render_frame_impl.cc
+++ b/chromium/content/renderer/render_frame_impl.cc
@@ -274,6 +274,17 @@ void RenderFrameImpl::loadURLExternally(
WebKit::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation(
WebKit::WebFrame* frame,
+ WebKit::WebDataSource::ExtraData* extra_data,
+ const WebKit::WebURLRequest& request,
+ WebKit::WebNavigationType type,
+ WebKit::WebNavigationPolicy default_policy,
+ bool is_redirect) {
+ return render_view_->decidePolicyForNavigation(
+ frame, extra_data, request, type, default_policy, is_redirect);
+}
+
+WebKit::WebNavigationPolicy RenderFrameImpl::decidePolicyForNavigation(
+ WebKit::WebFrame* frame,
const WebKit::WebURLRequest& request,
WebKit::WebNavigationType type,
WebKit::WebNavigationPolicy default_policy,
diff --git a/chromium/content/renderer/render_frame_impl.h b/chromium/content/renderer/render_frame_impl.h
index f4686b2d15d..f64a5230455 100644
--- a/chromium/content/renderer/render_frame_impl.h
+++ b/chromium/content/renderer/render_frame_impl.h
@@ -71,6 +71,14 @@ class CONTENT_EXPORT RenderFrameImpl
const WebKit::WebString& suggested_name);
virtual WebKit::WebNavigationPolicy decidePolicyForNavigation(
WebKit::WebFrame* frame,
+ WebKit::WebDataSource::ExtraData* extra_data,
+ const WebKit::WebURLRequest& request,
+ WebKit::WebNavigationType type,
+ WebKit::WebNavigationPolicy default_policy,
+ bool is_redirect);
+ // DEPRECATED
+ virtual WebKit::WebNavigationPolicy decidePolicyForNavigation(
+ WebKit::WebFrame* frame,
const WebKit::WebURLRequest& request,
WebKit::WebNavigationType type,
WebKit::WebNavigationPolicy default_policy,
diff --git a/chromium/content/renderer/render_thread_impl.cc b/chromium/content/renderer/render_thread_impl.cc
index f15738dd00a..b1e4a71cd6f 100644
--- a/chromium/content/renderer/render_thread_impl.cc
+++ b/chromium/content/renderer/render_thread_impl.cc
@@ -87,7 +87,7 @@
#include "ipc/ipc_platform_file.h"
#include "media/base/audio_hardware_config.h"
#include "media/base/media.h"
-#include "media/filters/gpu_video_accelerator_factories.h"
+#include "media/filters/gpu_video_decoder_factories.h"
#include "net/base/net_errors.h"
#include "net/base/net_util.h"
#include "third_party/WebKit/public/platform/WebString.h"
@@ -887,20 +887,22 @@ void RenderThreadImpl::PostponeIdleNotification() {
idle_notifications_to_skip_ = 2;
}
-scoped_refptr<RendererGpuVideoAcceleratorFactories>
+scoped_refptr<RendererGpuVideoDecoderFactories>
RenderThreadImpl::GetGpuFactories(
const scoped_refptr<base::MessageLoopProxy>& factories_loop) {
DCHECK(IsMainThread());
const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
- scoped_refptr<RendererGpuVideoAcceleratorFactories> gpu_factories;
+ scoped_refptr<RendererGpuVideoDecoderFactories> gpu_factories;
WebGraphicsContext3DCommandBufferImpl* context3d = NULL;
if (!cmd_line->HasSwitch(switches::kDisableAcceleratedVideoDecode))
context3d = GetGpuVDAContext3D();
- GpuChannelHost* gpu_channel_host = GetGpuChannel();
- if (gpu_channel_host) {
- gpu_factories = new RendererGpuVideoAcceleratorFactories(
- gpu_channel_host, factories_loop, context3d);
+ if (context3d) {
+ GpuChannelHost* gpu_channel_host = GetGpuChannel();
+ if (gpu_channel_host) {
+ gpu_factories = new RendererGpuVideoDecoderFactories(
+ gpu_channel_host, factories_loop, context3d);
+ }
}
return gpu_factories;
}
diff --git a/chromium/content/renderer/render_thread_impl.h b/chromium/content/renderer/render_thread_impl.h
index d11a4989557..fd2cfff7f42 100644
--- a/chromium/content/renderer/render_thread_impl.h
+++ b/chromium/content/renderer/render_thread_impl.h
@@ -19,7 +19,7 @@
#include "content/common/gpu/client/gpu_channel_host.h"
#include "content/common/gpu/gpu_process_launch_causes.h"
#include "content/public/renderer/render_thread.h"
-#include "content/renderer/media/renderer_gpu_video_accelerator_factories.h"
+#include "content/renderer/media/renderer_gpu_video_decoder_factories.h"
#include "ipc/ipc_channel_proxy.h"
#include "ui/gfx/native_widget_types.h"
@@ -55,6 +55,7 @@ class ForwardingMessageFilter;
namespace media {
class AudioHardwareConfig;
+class GpuVideoDecoderFactories;
}
namespace v8 {
@@ -257,8 +258,9 @@ class CONTENT_EXPORT RenderThreadImpl : public RenderThread,
// not sent for at least one notification delay.
void PostponeIdleNotification();
- // Gets gpu factories, which will run on |factories_loop|.
- scoped_refptr<RendererGpuVideoAcceleratorFactories> GetGpuFactories(
+ // Gets gpu factories, which will run on |factories_loop|. Returns NULL if VDA
+ // is disabled or a graphics context cannot be obtained.
+ scoped_refptr<RendererGpuVideoDecoderFactories> GetGpuFactories(
const scoped_refptr<base::MessageLoopProxy>& factories_loop);
// Returns a graphics context shared among all
diff --git a/chromium/content/renderer/render_view_browsertest.cc b/chromium/content/renderer/render_view_browsertest.cc
index 125f4c3214d..c400a749677 100644
--- a/chromium/content/renderer/render_view_browsertest.cc
+++ b/chromium/content/renderer/render_view_browsertest.cc
@@ -771,7 +771,10 @@ TEST_F(RenderViewImplTest, DontIgnoreBackAfterNavEntryLimit) {
// Test that our IME backend sends a notification message when the input focus
// changes.
-TEST_F(RenderViewImplTest, OnImeTypeChanged) {
+// crbug.com/276821:
+// Because Blink change cause this test failed, we first disabled this test and
+// fix later.
+TEST_F(RenderViewImplTest, DISABLED_OnImeTypeChanged) {
// Enable our IME backend code.
view()->OnSetInputMethodActive(true);
diff --git a/chromium/content/renderer/render_view_impl.cc b/chromium/content/renderer/render_view_impl.cc
index d64150c58ab..1df467e88f2 100644
--- a/chromium/content/renderer/render_view_impl.cc
+++ b/chromium/content/renderer/render_view_impl.cc
@@ -132,7 +132,7 @@
#include "media/base/filter_collection.h"
#include "media/base/media_switches.h"
#include "media/filters/audio_renderer_impl.h"
-#include "media/filters/gpu_video_accelerator_factories.h"
+#include "media/filters/gpu_video_decoder_factories.h"
#include "net/base/data_url.h"
#include "net/base/escape.h"
#include "net/base/net_errors.h"
@@ -2290,6 +2290,7 @@ WebView* RenderViewImpl::createView(
params.frame_name = frame_name;
params.opener_frame_id = creator->identifier();
params.opener_url = creator->document().url();
+ params.opener_top_level_frame_url = creator->top()->document().url();
GURL security_url(creator->document().securityOrigin().toString().utf8());
if (!security_url.is_valid())
security_url = GURL();
@@ -2687,10 +2688,6 @@ void RenderViewImpl::showContextMenu(
RenderViewObserver, observers_, DidRequestShowContextMenu(frame, data));
}
-void RenderViewImpl::clearContextMenu() {
- context_menu_node_.reset();
-}
-
void RenderViewImpl::setStatusText(const WebString& text) {
}
@@ -2993,7 +2990,7 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer(
#if defined(ENABLE_WEBRTC)
EnsureMediaStreamClient();
#if !defined(GOOGLE_TV)
- if (media_stream_client_->IsMediaStream(url)) {
+ if (media_stream_client_ && media_stream_client_->IsMediaStream(url)) {
#if defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL)
bool found_neon =
(android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0;
@@ -3071,7 +3068,7 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer(
DVLOG(1) << "Using AudioRendererMixerManager-provided sink: " << sink.get();
}
- scoped_refptr<media::GpuVideoAcceleratorFactories> gpu_factories =
+ scoped_refptr<media::GpuVideoDecoderFactories> gpu_factories =
RenderThreadImpl::current()->GetGpuFactories(
RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy());
@@ -4235,13 +4232,17 @@ bool RenderViewImpl::ShouldUpdateSelectionTextFromContextMenuParams(
void RenderViewImpl::reportFindInPageMatchCount(int request_id,
int count,
bool final_update) {
- NOTREACHED();
+ // TODO(jam): switch PepperPluginInstanceImpl to take a RenderFrame
+ main_render_frame_->reportFindInPageMatchCount(
+ request_id, count, final_update);
}
void RenderViewImpl::reportFindInPageSelection(int request_id,
int active_match_ordinal,
const WebRect& selection_rect) {
- NOTREACHED();
+ // TODO(jam): switch PepperPluginInstanceImpl to take a RenderFrame
+ main_render_frame_->reportFindInPageSelection(
+ request_id, active_match_ordinal, selection_rect);
}
void RenderViewImpl::openFileSystem(
diff --git a/chromium/content/renderer/render_view_impl.h b/chromium/content/renderer/render_view_impl.h
index d338b172a7e..4c6d77acb36 100644
--- a/chromium/content/renderer/render_view_impl.h
+++ b/chromium/content/renderer/render_view_impl.h
@@ -484,7 +484,6 @@ class CONTENT_EXPORT RenderViewImpl
const WebKit::WebString& message);
virtual void showContextMenu(WebKit::WebFrame* frame,
const WebKit::WebContextMenuData& data);
- virtual void clearContextMenu();
virtual void setStatusText(const WebKit::WebString& text);
virtual void setMouseOverURL(const WebKit::WebURL& url);
virtual void setKeyboardFocusURL(const WebKit::WebURL& url);
@@ -1091,6 +1090,9 @@ class CONTENT_EXPORT RenderViewImpl
void CheckPreferredSize();
// Initializes |media_stream_client_| if needed.
+ // TODO(qinmin): rename this function as it does not guarantee
+ // |media_stream_client_| will be created.
+ // http://crbug.com/278490.
void EnsureMediaStreamClient();
// This callback is triggered when DownloadFavicon completes, either
diff --git a/chromium/content/renderer/renderer_main.cc b/chromium/content/renderer/renderer_main.cc
index 5fe9a9a2176..0a8b0d84bfc 100644
--- a/chromium/content/renderer/renderer_main.cc
+++ b/chromium/content/renderer/renderer_main.cc
@@ -181,6 +181,8 @@ int RendererMain(const MainFunctionParams& parameters) {
base::FieldTrialList field_trial_list(NULL);
// Ensure any field trials in browser are reflected into renderer.
if (parsed_command_line.HasSwitch(switches::kForceFieldTrials)) {
+ std::string persistent = parsed_command_line.GetSwitchValueASCII(
+ switches::kForceFieldTrials);
// Field trials are created in an "activated" state to ensure they get
// reported in crash reports.
bool result = base::FieldTrialList::CreateTrialsFromString(
diff --git a/chromium/content/renderer/renderer_webkitplatformsupport_impl.cc b/chromium/content/renderer/renderer_webkitplatformsupport_impl.cc
index fd07f28ce95..d5156a1d350 100644
--- a/chromium/content/renderer/renderer_webkitplatformsupport_impl.cc
+++ b/chromium/content/renderer/renderer_webkitplatformsupport_impl.cc
@@ -148,6 +148,8 @@ class RendererWebKitPlatformSupportImpl::MimeRegistry
const WebKit::WebString& file_extension);
virtual WebKit::WebString mimeTypeFromFile(
const WebKit::WebString& file_path);
+ virtual WebKit::WebString preferredExtensionForMIMEType(
+ const WebKit::WebString& mime_type);
};
class RendererWebKitPlatformSupportImpl::FileUtilities
@@ -223,10 +225,6 @@ RendererWebKitPlatformSupportImpl::RendererWebKitPlatformSupportImpl()
}
RendererWebKitPlatformSupportImpl::~RendererWebKitPlatformSupportImpl() {
-#ifdef USE_THREADLOCAL_WEBFILESYSTEM
- // TODO(kinuko): Delete this ifdef after blink side switch's over.
- WebFileSystemImpl::DeleteThreadSpecificInstance();
-#endif
}
//------------------------------------------------------------------------------
@@ -376,14 +374,9 @@ WebIDBFactory* RendererWebKitPlatformSupportImpl::idbFactory() {
//------------------------------------------------------------------------------
WebFileSystem* RendererWebKitPlatformSupportImpl::fileSystem() {
-#ifdef USE_THREADLOCAL_WEBFILESYSTEM
- // TODO(kinuko): Delete this ifdef after blink side switch's over.
- return WebFileSystemImpl::ThreadSpecificInstance(child_thread_loop_.get());
-#else
if (!web_file_system_)
web_file_system_.reset(new WebFileSystemImpl(child_thread_loop_.get()));
return web_file_system_.get();
-#endif
}
//------------------------------------------------------------------------------
@@ -491,6 +484,21 @@ WebString RendererWebKitPlatformSupportImpl::MimeRegistry::mimeTypeFromFile(
return ASCIIToUTF16(mime_type);
}
+WebString
+RendererWebKitPlatformSupportImpl::MimeRegistry::preferredExtensionForMIMEType(
+ const WebString& mime_type) {
+ if (IsPluginProcess())
+ return SimpleWebMimeRegistryImpl::preferredExtensionForMIMEType(mime_type);
+
+ // The sandbox restricts our access to the registry, so we need to proxy
+ // these calls over to the browser process.
+ base::FilePath::StringType file_extension;
+ RenderThread::Get()->Send(
+ new MimeRegistryMsg_GetPreferredExtensionForMimeType(
+ UTF16ToASCII(mime_type), &file_extension));
+ return base::FilePath(file_extension).AsUTF16Unsafe();
+}
+
//------------------------------------------------------------------------------
bool RendererWebKitPlatformSupportImpl::FileUtilities::getFileInfo(
diff --git a/chromium/content/renderer/rendering_benchmark.cc b/chromium/content/renderer/rendering_benchmark.cc
new file mode 100644
index 00000000000..5415bdd7d8f
--- /dev/null
+++ b/chromium/content/renderer/rendering_benchmark.cc
@@ -0,0 +1,12 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/renderer/rendering_benchmark.h"
+
+namespace content {
+
+RenderingBenchmark::RenderingBenchmark(const std::string& name) : name_(name) {}
+RenderingBenchmark::~RenderingBenchmark() {}
+
+} // namespace content
diff --git a/chromium/content/renderer/rendering_benchmark.h b/chromium/content/renderer/rendering_benchmark.h
new file mode 100644
index 00000000000..44b5a84d79a
--- /dev/null
+++ b/chromium/content/renderer/rendering_benchmark.h
@@ -0,0 +1,39 @@
+// 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 CONTENT_RENDERER_RENDERING_BENCHMARK_H_
+#define CONTENT_RENDERER_RENDERING_BENCHMARK_H_
+
+#include <string>
+
+#include "base/basictypes.h"
+
+namespace WebKit {
+class WebViewBenchmarkSupport;
+}
+
+namespace content {
+class RenderingBenchmarkResults;
+
+class RenderingBenchmark {
+ public:
+ explicit RenderingBenchmark(const std::string& name);
+ virtual ~RenderingBenchmark();
+
+ virtual void SetUp(WebKit::WebViewBenchmarkSupport* benchmarkSupport) {}
+
+ virtual double Run(WebKit::WebViewBenchmarkSupport* benchmarkSupport) = 0;
+
+ virtual void TearDown(WebKit::WebViewBenchmarkSupport* benchmarkSupport) {}
+
+ const std::string& name() { return name_; }
+
+ private:
+ const std::string name_;
+
+ DISALLOW_COPY_AND_ASSIGN(RenderingBenchmark);
+};
+} // namespace content
+
+#endif // CONTENT_RENDERER_RENDERING_BENCHMARK_H_
diff --git a/chromium/content/shell/shell.cc b/chromium/content/shell/shell.cc
index 93f13bf94d4..0fadcf8d416 100644
--- a/chromium/content/shell/shell.cc
+++ b/chromium/content/shell/shell.cc
@@ -306,7 +306,7 @@ void Shell::WebContentsCreated(WebContents* source_contents,
}
void Shell::DidNavigateMainFramePostCommit(WebContents* web_contents) {
- PlatformSetAddressBarURL(web_contents->GetLastCommittedURL());
+ PlatformSetAddressBarURL(web_contents->GetURL());
}
JavaScriptDialogManager* Shell::GetJavaScriptDialogManager() {
diff --git a/chromium/content/worker/worker_webkitplatformsupport_impl.cc b/chromium/content/worker/worker_webkitplatformsupport_impl.cc
index d1aacef60bf..144db959a3d 100644
--- a/chromium/content/worker/worker_webkitplatformsupport_impl.cc
+++ b/chromium/content/worker/worker_webkitplatformsupport_impl.cc
@@ -86,10 +86,6 @@ WorkerWebKitPlatformSupportImpl::WorkerWebKitPlatformSupportImpl(
}
WorkerWebKitPlatformSupportImpl::~WorkerWebKitPlatformSupportImpl() {
-#ifdef USE_THREADLOCAL_WEBFILESYSTEM
- // TODO(kinuko): Delete this ifdef after blink side switch's over.
- WebFileSystemImpl::DeleteThreadSpecificInstance();
-#endif
}
WebClipboard* WorkerWebKitPlatformSupportImpl::clipboard() {
@@ -102,14 +98,9 @@ WebMimeRegistry* WorkerWebKitPlatformSupportImpl::mimeRegistry() {
}
WebFileSystem* WorkerWebKitPlatformSupportImpl::fileSystem() {
-#ifdef USE_THREADLOCAL_WEBFILESYSTEM
- // TODO(kinuko): Delete this ifdef after blink side switch's over.
- return WebFileSystemImpl::ThreadSpecificInstance(child_thread_loop_.get());
-#else
if (!web_file_system_)
web_file_system_.reset(new WebFileSystemImpl(child_thread_loop_.get()));
return web_file_system_.get();
-#endif
}
WebFileUtilities* WorkerWebKitPlatformSupportImpl::fileUtilities() {
@@ -291,6 +282,15 @@ WebString WorkerWebKitPlatformSupportImpl::mimeTypeFromFile(
return ASCIIToUTF16(mime_type);
}
+WebString WorkerWebKitPlatformSupportImpl::preferredExtensionForMIMEType(
+ const WebString& mime_type) {
+ base::FilePath::StringType file_extension;
+ thread_safe_sender_->Send(
+ new MimeRegistryMsg_GetPreferredExtensionForMimeType(
+ UTF16ToASCII(mime_type), &file_extension));
+ return base::FilePath(file_extension).AsUTF16Unsafe();
+}
+
WebBlobRegistry* WorkerWebKitPlatformSupportImpl::blobRegistry() {
if (!blob_registry_.get() && thread_safe_sender_.get())
blob_registry_.reset(new WebBlobRegistryImpl(thread_safe_sender_.get()));
diff --git a/chromium/content/worker/worker_webkitplatformsupport_impl.h b/chromium/content/worker/worker_webkitplatformsupport_impl.h
index d429822a57f..a85d574ec0c 100644
--- a/chromium/content/worker/worker_webkitplatformsupport_impl.h
+++ b/chromium/content/worker/worker_webkitplatformsupport_impl.h
@@ -98,6 +98,8 @@ class WorkerWebKitPlatformSupportImpl : public WebKitPlatformSupportImpl,
virtual WebKit::WebString wellKnownMimeTypeForExtension(
const WebKit::WebString&);
virtual WebKit::WebString mimeTypeFromFile(const WebKit::WebString&);
+ virtual WebKit::WebString preferredExtensionForMIMEType(
+ const WebKit::WebString&);
virtual void queryStorageUsageAndQuota(
const WebKit::WebURL& storage_partition,
WebKit::WebStorageQuotaType,
diff --git a/chromium/content/zygote/zygote_linux.cc b/chromium/content/zygote/zygote_linux.cc
index 6e42a9d045a..abb52aea32c 100644
--- a/chromium/content/zygote/zygote_linux.cc
+++ b/chromium/content/zygote/zygote_linux.cc
@@ -326,14 +326,10 @@ int Zygote::ForkWithRealPid(const std::string& process_type,
LOG(ERROR) << "METHOD_GET_CHILD_WITH_INODE failed";
goto error;
}
-
real_pids_to_sandbox_pids[real_pid] = pid;
- } else {
- // If no SUID sandbox is involved then no pid translation is
- // necessary.
- real_pid = pid;
}
if (use_helper) {
+ real_pid = pid;
if (!helper_->AckChild(pipe_fds[1], channel_switch)) {
LOG(ERROR) << "Failed to synchronise with zygote fork helper";
goto error;
diff --git a/chromium/extensions/common/manifest_constants.cc b/chromium/extensions/common/manifest_constants.cc
deleted file mode 100644
index fcdf6e99fc8..00000000000
--- a/chromium/extensions/common/manifest_constants.cc
+++ /dev/null
@@ -1,151 +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 "extensions/common/manifest_constants.h"
-
-namespace extensions {
-
-namespace manifest_keys {
-
-const char kAllFrames[] = "all_frames";
-const char kAltKey[] = "altKey";
-const char kApp[] = "app";
-const char kAudio[] = "audio";
-const char kBackgroundAllowJsAccess[] = "background.allow_js_access";
-const char kBackgroundPage[] = "background.page";
-const char kBackgroundPageLegacy[] = "background_page";
-const char kBackgroundPersistent[] = "background.persistent";
-const char kBackgroundScripts[] = "background.scripts";
-const char kBrowserAction[] = "browser_action";
-const char kChromeURLOverrides[] = "chrome_url_overrides";
-const char kCommands[] = "commands";
-const char kContentPack[] = "content_pack";
-const char kContentPackSites[] = "sites";
-const char kContentScripts[] = "content_scripts";
-const char kContentSecurityPolicy[] = "content_security_policy";
-const char kConvertedFromUserScript[] = "converted_from_user_script";
-const char kCss[] = "css";
-const char kCtrlKey[] = "ctrlKey";
-const char kCurrentLocale[] = "current_locale";
-const char kDefaultLocale[] = "default_locale";
-const char kDescription[] = "description";
-const char kDevToolsPage[] = "devtools_page";
-const char kDisplayInLauncher[] = "display_in_launcher";
-const char kDisplayInNewTabPage[] = "display_in_new_tab_page";
-const char kEventName[] = "event_name";
-const char kExcludeGlobs[] = "exclude_globs";
-const char kExcludeMatches[] = "exclude_matches";
-const char kExport[] = "export";
-const char kExternallyConnectable[] = "externally_connectable";
-const char kFileAccessList[] = "file_access";
-const char kFileFilters[] = "file_filters";
-const char kFileBrowserHandlers[] = "file_browser_handlers";
-const char kMediaGalleriesHandlers[] = "media_galleries_handlers";
-const char kFileHandlers[] = "file_handlers";
-const char kFileHandlerExtensions[] = "extensions";
-const char kFileHandlerTitle[] = "title";
-const char kFileHandlerTypes[] = "types";
-const char kHomepageURL[] = "homepage_url";
-const char kIcons[] = "icons";
-const char kId[] = "id";
-const char kImport[] = "import";
-const char kIncognito[] = "incognito";
-const char kIncludeGlobs[] = "include_globs";
-const char kInputComponents[] = "input_components";
-const char kIsolation[] = "app.isolation";
-const char kJs[] = "js";
-const char kKey[] = "key";
-const char kKeycode[] = "keyCode";
-const char kKioskEnabled[] = "kiosk_enabled";
-const char kLanguage[] = "language";
-const char kLaunch[] = "app.launch";
-const char kLaunchContainer[] = "app.launch.container";
-const char kLaunchHeight[] = "app.launch.height";
-const char kLaunchLocalPath[] = "app.launch.local_path";
-const char kLaunchWebURL[] = "app.launch.web_url";
-const char kLaunchWidth[] = "app.launch.width";
-const char kLayouts[] = "layouts";
-const char kManifestVersion[] = "manifest_version";
-const char kMatches[] = "matches";
-const char kMinimumChromeVersion[] = "minimum_chrome_version";
-const char kMinimumVersion[] = "minimum_version";
-const char kMIMETypes[] = "mime_types";
-const char kMimeTypesHandler[] = "mime_types_handler";
-const char kName[] = "name";
-const char kNaClModules[] = "nacl_modules";
-const char kNaClModulesMIMEType[] = "mime_type";
-const char kNaClModulesPath[] = "path";
-const char kOAuth2[] = "oauth2";
-const char kOAuth2AutoApprove[] = "oauth2.auto_approve";
-const char kOAuth2ClientId[] = "oauth2.client_id";
-const char kOAuth2Scopes[] = "oauth2.scopes";
-const char kOfflineEnabled[] = "offline_enabled";
-const char kOmnibox[] = "omnibox";
-const char kOmniboxKeyword[] = "omnibox.keyword";
-const char kOptionalPermissions[] = "optional_permissions";
-const char kOptionsPage[] = "options_page";
-const char kPageAction[] = "page_action";
-const char kPageActionDefaultIcon[] = "default_icon";
-const char kPageActionDefaultPopup[] = "default_popup";
-const char kPageActionDefaultTitle[] = "default_title";
-const char kPageActionIcons[] = "icons";
-const char kPageActionId[] = "id";
-const char kPageActionPopup[] = "popup";
-const char kPageActionPopupPath[] = "path";
-const char kPageActions[] = "page_actions";
-const char kPermissions[] = "permissions";
-const char kPlatformAppBackground[] = "app.background";
-const char kPlatformAppBackgroundPage[] = "app.background.page";
-const char kPlatformAppBackgroundScripts[] = "app.background.scripts";
-const char kPlatformAppContentSecurityPolicy[] = "app.content_security_policy";
-const char kPlugins[] = "plugins";
-const char kPluginsPath[] = "path";
-const char kPluginsPublic[] = "public";
-const char kPublicKey[] = "key";
-const char kResources[] = "resources";
-const char kRequirements[] = "requirements";
-const char kRunAt[] = "run_at";
-const char kSandboxedPages[] = "sandbox.pages";
-const char kSandboxedPagesCSP[] = "sandbox.content_security_policy";
-const char kScriptBadge[] = "script_badge";
-const char kShiftKey[] = "shiftKey";
-const char kShortcutKey[] = "shortcutKey";
-const char kSignature[] = "signature";
-const char kSpellcheck[] = "spellcheck";
-const char kSpellcheckDictionaryFormat[] = "dictionary_format";
-const char kSpellcheckDictionaryLanguage[] = "dictionary_language";
-const char kSpellcheckDictionaryLocale[] = "dictionary_locale";
-const char kSpellcheckDictionaryPath[] = "dictionary_path";
-const char kStorageManagedSchema[] = "storage.managed_schema";
-const char kSuggestedKey[] = "suggested_key";
-const char kSystemIndicator[] = "system_indicator";
-const char kSystemInfoDisplay[] = "systemInfo.display";
-const char kTheme[] = "theme";
-const char kThemeColors[] = "colors";
-const char kThemeDisplayProperties[] = "properties";
-const char kThemeImages[] = "images";
-const char kThemeTints[] = "tints";
-const char kTtsEngine[] = "tts_engine";
-const char kTtsGenderFemale[] = "female";
-const char kTtsGenderMale[] = "male";
-const char kTtsVoices[] = "voices";
-const char kTtsVoicesEventTypeEnd[] = "end";
-const char kTtsVoicesEventTypeError[] = "error";
-const char kTtsVoicesEventTypeMarker[] = "marker";
-const char kTtsVoicesEventTypeSentence[] = "sentence";
-const char kTtsVoicesEventTypeStart[] = "start";
-const char kTtsVoicesEventTypeWord[] = "word";
-const char kTtsVoicesEventTypes[] = "event_types";
-const char kTtsVoicesGender[] = "gender";
-const char kTtsVoicesLang[] = "lang";
-const char kTtsVoicesVoiceName[] = "voice_name";
-const char kType[] = "type";
-const char kUpdateURL[] = "update_url";
-const char kVersion[] = "version";
-const char kWebAccessibleResources[] = "web_accessible_resources";
-const char kWebURLs[] = "app.urls";
-
-} // namespace manifest_keys
-
-} // namespace extensions
diff --git a/chromium/extensions/common/manifest_constants.h b/chromium/extensions/common/manifest_constants.h
deleted file mode 100644
index ce31f7c6881..00000000000
--- a/chromium/extensions/common/manifest_constants.h
+++ /dev/null
@@ -1,157 +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 EXTENSIONS_COMMON_MANIFEST_CONSTANTS_H_
-#define EXTENSIONS_COMMON_MANIFEST_CONSTANTS_H_
-
-// Keys used in JSON representation of extensions.
-namespace extensions {
-namespace manifest_keys {
- extern const char kAllFrames[];
- extern const char kAltKey[];
- extern const char kApp[];
- extern const char kBackgroundAllowJsAccess[];
- extern const char kBackgroundPage[];
- extern const char kBackgroundPageLegacy[];
- extern const char kBackgroundPersistent[];
- extern const char kBackgroundScripts[];
- extern const char kBrowserAction[];
- extern const char kBrowseURLs[];
- extern const char kChromeURLOverrides[];
- extern const char kCommands[];
- extern const char kContentPack[];
- extern const char kContentPackSites[];
- extern const char kContentScripts[];
- extern const char kContentSecurityPolicy[];
- extern const char kConvertedFromUserScript[];
- extern const char kCss[];
- extern const char kCtrlKey[];
- extern const char kCurrentLocale[];
- extern const char kDefaultLocale[];
- extern const char kDescription[];
- extern const char kDevToolsPage[];
- extern const char kDisplayInLauncher[];
- extern const char kDisplayInNewTabPage[];
- extern const char kEventName[];
- extern const char kExcludeGlobs[];
- extern const char kExcludeMatches[];
- extern const char kExport[];
- extern const char kExternallyConnectable[];
- extern const char kFileAccessList[];
- extern const char kFileHandlers[];
- extern const char kFileHandlerExtensions[];
- extern const char kFileHandlerTitle[];
- extern const char kFileHandlerTypes[];
- extern const char kFileFilters[];
- extern const char kFileBrowserHandlers[];
- extern const char kMediaGalleriesHandlers[];
- extern const char kHomepageURL[];
- extern const char kIcons[];
- extern const char kId[];
- extern const char kImport[];
- extern const char kIncognito[];
- extern const char kIncludeGlobs[];
- extern const char kInputComponents[];
- extern const char kIntentDisposition[];
- extern const char kIntentHref[];
- extern const char kIntentPath[];
- extern const char kIntents[];
- extern const char kIntentTitle[];
- extern const char kIntentType[];
- extern const char kIsolation[];
- extern const char kJs[];
- extern const char kKey[];
- extern const char kKeycode[];
- extern const char kKioskEnabled[];
- extern const char kLanguage[];
- extern const char kLaunch[];
- extern const char kLaunchContainer[];
- extern const char kLaunchHeight[];
- extern const char kLaunchLocalPath[];
- extern const char kLaunchWebURL[];
- extern const char kLaunchWidth[];
- extern const char kLayouts[];
- extern const char kManifestVersion[];
- extern const char kMatches[];
- extern const char kMIMETypes[];
- extern const char kMimeTypesHandler[];
- extern const char kMinimumChromeVersion[];
- extern const char kMinimumVersion[];
- extern const char kNaClModules[];
- extern const char kNaClModulesMIMEType[];
- extern const char kNaClModulesPath[];
- extern const char kName[];
- extern const char kOAuth2[];
- extern const char kOAuth2AutoApprove[];
- extern const char kOAuth2ClientId[];
- extern const char kOAuth2Scopes[];
- extern const char kOfflineEnabled[];
- extern const char kOmnibox[];
- extern const char kOmniboxKeyword[];
- extern const char kOptionalPermissions[];
- extern const char kOptionsPage[];
- extern const char kPageAction[];
- extern const char kPageActionDefaultIcon[];
- extern const char kPageActionDefaultPopup[];
- extern const char kPageActionDefaultTitle[];
- extern const char kPageActionIcons[];
- extern const char kPageActionId[];
- extern const char kPageActionPopup[];
- extern const char kPageActionPopupPath[];
- extern const char kPageActions[];
- extern const char kPermissions[];
- extern const char kPlatformAppBackground[];
- extern const char kPlatformAppBackgroundPage[];
- extern const char kPlatformAppBackgroundScripts[];
- extern const char kPlatformAppContentSecurityPolicy[];
- extern const char kPlugins[];
- extern const char kPluginsPath[];
- extern const char kPluginsPublic[];
- extern const char kPublicKey[];
- extern const char kResources[];
- extern const char kRequirements[];
- extern const char kRunAt[];
- extern const char kSandboxedPages[];
- extern const char kSandboxedPagesCSP[];
- extern const char kScriptBadge[];
- extern const char kShiftKey[];
- extern const char kShortcutKey[];
- extern const char kSignature[];
- extern const char kSpellcheck[];
- extern const char kSpellcheckDictionaryFormat[];
- extern const char kSpellcheckDictionaryLanguage[];
- extern const char kSpellcheckDictionaryLocale[];
- extern const char kSpellcheckDictionaryPath[];
- extern const char kStorageManagedSchema[];
- extern const char kSuggestedKey[];
- extern const char kSystemIndicator[];
- extern const char kTheme[];
- extern const char kThemeColors[];
- extern const char kThemeDisplayProperties[];
- extern const char kThemeImages[];
- extern const char kThemeTints[];
- extern const char kTtsEngine[];
- extern const char kTtsGenderFemale[];
- extern const char kTtsGenderMale[];
- extern const char kTtsVoices[];
- extern const char kTtsVoicesEventTypeEnd[];
- extern const char kTtsVoicesEventTypeError[];
- extern const char kTtsVoicesEventTypeMarker[];
- extern const char kTtsVoicesEventTypeSentence[];
- extern const char kTtsVoicesEventTypeStart[];
- extern const char kTtsVoicesEventTypeWord[];
- extern const char kTtsVoicesEventTypes[];
- extern const char kTtsVoicesGender[];
- extern const char kTtsVoicesLang[];
- extern const char kTtsVoicesVoiceName[];
- extern const char kType[];
- extern const char kUpdateURL[];
- extern const char kVersion[];
- extern const char kWebAccessibleResources[];
- extern const char kWebURLs[];
-} // namespace manifest_keys
-
-} // namespace extensions
-
-#endif // EXTENSIONS_COMMON_MANIFEST_CONSTANTS_H_
diff --git a/chromium/extensions/common/matcher/regex_set_matcher.cc b/chromium/extensions/common/matcher/regex_set_matcher.cc
index 24d99efa3ff..af8027cdd38 100644
--- a/chromium/extensions/common/matcher/regex_set_matcher.cc
+++ b/chromium/extensions/common/matcher/regex_set_matcher.cc
@@ -53,6 +53,7 @@ bool RegexSetMatcher::Match(const std::string& text,
std::vector<RE2ID> re2_ids;
filtered_re2_->AllMatches(text, atoms, &re2_ids);
+ std::set<StringPattern::ID> matched_ids;
for (size_t i = 0; i < re2_ids.size(); ++i) {
StringPattern::ID id = re2_id_map_[re2_ids[i]];
matches->insert(id);
diff --git a/chromium/gpu/command_buffer/build_gles2_cmd_buffer.py b/chromium/gpu/command_buffer/build_gles2_cmd_buffer.py
index a6f13c15a5c..6555da26090 100755
--- a/chromium/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/chromium/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -62,15 +62,13 @@ _GL_TYPES = {
_CAPABILITY_FLAGS = [
{'name': 'blend'},
{'name': 'cull_face'},
- {'name': 'depth_test', 'state_flag': 'framebuffer_state_.clear_state_dirty'},
+ {'name': 'depth_test', 'state_flag': 'clear_state_dirty_'},
{'name': 'dither', 'default': True},
{'name': 'polygon_offset_fill'},
{'name': 'sample_alpha_to_coverage'},
{'name': 'sample_coverage'},
- {'name': 'scissor_test',
- 'state_flag': 'framebuffer_state_.clear_state_dirty'},
- {'name': 'stencil_test',
- 'state_flag': 'framebuffer_state_.clear_state_dirty'},
+ {'name': 'scissor_test', 'state_flag': 'clear_state_dirty_'},
+ {'name': 'stencil_test', 'state_flag': 'clear_state_dirty_'},
]
_STATES = {
@@ -103,7 +101,7 @@ _STATES = {
{'name': 'color_mask_blue', 'type': 'GLboolean', 'default': 'true'},
{'name': 'color_mask_alpha', 'type': 'GLboolean', 'default': 'true'},
],
- 'state_flag': 'framebuffer_state_.clear_state_dirty',
+ 'state_flag': 'clear_state_dirty_',
},
'ClearStencil': {
'type': 'Normal',
@@ -244,7 +242,7 @@ _STATES = {
'StencilMask': {
'type': 'FrontBack',
'func': 'StencilMaskSeparate',
- 'state_flag': 'framebuffer_state_.clear_state_dirty',
+ 'state_flag': 'clear_state_dirty_',
'states': [
{
'name': 'stencil_front_writemask',
@@ -402,7 +400,7 @@ _STATES = {
'states': [
{'name': 'depth_mask', 'type': 'GLboolean', 'default': 'true'},
],
- 'state_flag': 'framebuffer_state_.clear_state_dirty',
+ 'state_flag': 'clear_state_dirty_',
},
'Scissor': {
'type': 'Normal',
diff --git a/chromium/gpu/command_buffer/service/feature_info.cc b/chromium/gpu/command_buffer/service/feature_info.cc
index b0fb12073b2..41c6a1b03a3 100644
--- a/chromium/gpu/command_buffer/service/feature_info.cc
+++ b/chromium/gpu/command_buffer/service/feature_info.cc
@@ -605,9 +605,10 @@ void FeatureInfo::AddFeatures(const CommandLine& command_line) {
!have_arb_occlusion_query2;
}
- if (extensions.Contains("GL_ANGLE_instanced_arrays") ||
- (extensions.Contains("GL_ARB_instanced_arrays") &&
- extensions.Contains("GL_ARB_draw_instanced"))) {
+ if (!workarounds_.disable_angle_instanced_arrays &&
+ (extensions.Contains("GL_ANGLE_instanced_arrays") ||
+ (extensions.Contains("GL_ARB_instanced_arrays") &&
+ extensions.Contains("GL_ARB_draw_instanced")))) {
AddExtensionString("GL_ANGLE_instanced_arrays");
feature_flags_.angle_instanced_arrays = true;
validators_.vertex_attribute.AddValue(GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE);
diff --git a/chromium/gpu/command_buffer/service/framebuffer_manager.cc b/chromium/gpu/command_buffer/service/framebuffer_manager.cc
index b4c6b090f0f..b468262ecef 100644
--- a/chromium/gpu/command_buffer/service/framebuffer_manager.cc
+++ b/chromium/gpu/command_buffer/service/framebuffer_manager.cc
@@ -203,13 +203,6 @@ class TextureAttachment
uint32 need = GLES2Util::GetChannelsNeededForAttachmentType(
attachment_type, max_color_attachments);
uint32 have = GLES2Util::GetChannelsForFormat(internal_format);
-
- // Workaround for NVIDIA drivers that incorrectly expose these formats as
- // renderable:
- if (internal_format == GL_LUMINANCE || internal_format == GL_ALPHA ||
- internal_format == GL_LUMINANCE_ALPHA) {
- return false;
- }
return (need & have) != 0;
}
diff --git a/chromium/gpu/command_buffer/service/framebuffer_manager.h b/chromium/gpu/command_buffer/service/framebuffer_manager.h
index aa1111813e1..176e3e2db99 100644
--- a/chromium/gpu/command_buffer/service/framebuffer_manager.h
+++ b/chromium/gpu/command_buffer/service/framebuffer_manager.h
@@ -180,15 +180,6 @@ class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> {
DISALLOW_COPY_AND_ASSIGN(Framebuffer);
};
-struct DecoderFramebufferState {
- DecoderFramebufferState():
- clear_state_dirty(true) {}
-
- // State saved for clearing so we can clear render buffers and then
- // restore to these values.
- bool clear_state_dirty;
-};
-
// This class keeps track of the frambebuffers and their attached renderbuffers
// so we can correctly clear them.
class GPU_EXPORT FramebufferManager {
diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 44a01345372..44f76744b69 100644
--- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -349,6 +349,18 @@ class ScopedResolvedFrameBufferBinder {
DISALLOW_COPY_AND_ASSIGN(ScopedResolvedFrameBufferBinder);
};
+// This class records texture upload time when in scope.
+class ScopedTextureUploadTimer {
+ public:
+ explicit ScopedTextureUploadTimer(GLES2DecoderImpl* decoder);
+ ~ScopedTextureUploadTimer();
+
+ private:
+ GLES2DecoderImpl* decoder_;
+ base::TimeTicks begin_time_;
+ DISALLOW_COPY_AND_ASSIGN(ScopedTextureUploadTimer);
+};
+
// Encapsulates an OpenGL texture.
class BackTexture {
public:
@@ -639,6 +651,7 @@ class GLES2DecoderImpl : public GLES2Decoder {
friend class ScopedFrameBufferBinder;
friend class ScopedGLErrorSuppressor;
friend class ScopedResolvedFrameBufferBinder;
+ friend class ScopedTextureUploadTimer;
friend class BackTexture;
friend class BackRenderbuffer;
friend class BackFramebuffer;
@@ -800,6 +813,33 @@ class GLES2DecoderImpl : public GLES2Decoder {
GLsizei width,
GLsizei height);
+ // Validation for TexImage2D commands.
+ bool ValidateTexImage2D(
+ const char* function_name,
+ GLenum target,
+ GLint level,
+ GLenum internal_format,
+ GLsizei width,
+ GLsizei height,
+ GLint border,
+ GLenum format,
+ GLenum type,
+ const void* pixels,
+ uint32 pixels_size);
+
+ // Wrapper for TexImage2D commands.
+ void DoTexImage2D(
+ GLenum target,
+ GLint level,
+ GLenum internal_format,
+ GLsizei width,
+ GLsizei height,
+ GLint border,
+ GLenum format,
+ GLenum type,
+ const void* pixels,
+ uint32 pixels_size);
+
// Validation for TexSubImage2D.
bool ValidateTexSubImage2D(
error::Error* error,
@@ -1387,6 +1427,46 @@ class GLES2DecoderImpl : public GLES2Decoder {
bool instanced, GLenum mode, GLsizei count, GLenum type,
int32 offset, GLsizei primcount);
+ // Gets the texture id for a given target.
+ TextureRef* GetTextureInfoForTarget(GLenum target) {
+ TextureUnit& unit = state_.texture_units[state_.active_texture_unit];
+ TextureRef* texture = NULL;
+ switch (target) {
+ case GL_TEXTURE_2D:
+ texture = unit.bound_texture_2d.get();
+ break;
+ case GL_TEXTURE_CUBE_MAP:
+ case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
+ case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
+ case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
+ texture = unit.bound_texture_cube_map.get();
+ break;
+ case GL_TEXTURE_EXTERNAL_OES:
+ texture = unit.bound_texture_external_oes.get();
+ break;
+ case GL_TEXTURE_RECTANGLE_ARB:
+ texture = unit.bound_texture_rectangle_arb.get();
+ break;
+ default:
+ NOTREACHED();
+ return NULL;
+ }
+ return texture;
+ }
+
+ TextureRef* GetTextureInfoForTargetUnlessDefault(
+ GLenum target) {
+ TextureRef* texture = GetTextureInfoForTarget(target);
+ if (!texture)
+ return NULL;
+ if (texture == texture_manager()->GetDefaultTextureInfo(target))
+ return NULL;
+ return texture;
+ }
+
GLenum GetBindTargetForSamplerType(GLenum type) {
DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE ||
type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB);
@@ -1562,6 +1642,10 @@ class GLES2DecoderImpl : public GLES2Decoder {
// The size of fiixed attrib buffer.
GLsizei fixed_attrib_buffer_size_;
+ // state saved for clearing so we can clear render buffers and then
+ // restore to these values.
+ bool clear_state_dirty_;
+
// The offscreen frame buffer that the client renders to. With EGL, the
// depth and stencil buffers are separate. With regular GL there is a single
// packed depth stencil buffer in offscreen_target_depth_render_buffer_.
@@ -1608,6 +1692,8 @@ class GLES2DecoderImpl : public GLES2Decoder {
// Backbuffer attachments that are currently undefined.
uint32 backbuffer_needs_clear_bits_;
+ bool teximage2d_faster_than_texsubimage2d_;
+
// The current decoder error.
error::Error current_decoder_error_;
@@ -1621,6 +1707,10 @@ class GLES2DecoderImpl : public GLES2Decoder {
const Validators* validators_;
scoped_refptr<FeatureInfo> feature_info_;
+ // This indicates all the following texSubImage2D calls that are part of the
+ // failed texImage2D call should be ignored.
+ bool tex_image_2d_failed_;
+
int frame_number_;
bool has_robustness_extension_;
@@ -1654,12 +1744,10 @@ class GLES2DecoderImpl : public GLES2Decoder {
GLsizei viewport_max_height_;
// Command buffer stats.
+ int texture_upload_count_;
+ base::TimeDelta total_texture_upload_time_;
base::TimeDelta total_processing_commands_time_;
- // States related to each manager.
- DecoderTextureState texture_state_;
- DecoderFramebufferState framebuffer_state_;
-
scoped_ptr<GPUTracer> gpu_tracer_;
std::queue<linked_ptr<FenceCallback> > pending_readpixel_fences_;
@@ -1793,6 +1881,17 @@ ScopedResolvedFrameBufferBinder::~ScopedResolvedFrameBufferBinder() {
}
}
+ScopedTextureUploadTimer::ScopedTextureUploadTimer(GLES2DecoderImpl* decoder)
+ : decoder_(decoder),
+ begin_time_(base::TimeTicks::HighResNow()) {
+}
+
+ScopedTextureUploadTimer::~ScopedTextureUploadTimer() {
+ decoder_->texture_upload_count_++;
+ decoder_->total_texture_upload_time_ +=
+ base::TimeTicks::HighResNow() - begin_time_;
+}
+
BackTexture::BackTexture(GLES2DecoderImpl* decoder)
: decoder_(decoder),
memory_tracker_(decoder->memory_tracker(), MemoryTracker::kUnmanaged),
@@ -2057,6 +2156,7 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group)
attrib_0_size_(0),
fixed_attrib_buffer_id_(0),
fixed_attrib_buffer_size_(0),
+ clear_state_dirty_(true),
offscreen_target_color_format_(0),
offscreen_target_depth_format_(0),
offscreen_target_stencil_format_(0),
@@ -2067,10 +2167,12 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group)
back_buffer_has_depth_(false),
back_buffer_has_stencil_(false),
backbuffer_needs_clear_bits_(0),
+ teximage2d_faster_than_texsubimage2d_(true),
current_decoder_error_(error::kNoError),
use_shader_translator_(true),
validators_(group_->feature_info()->validators()),
feature_info_(group_->feature_info()),
+ tex_image_2d_failed_(false),
frame_number_(0),
has_robustness_extension_(false),
reset_status_(GL_NO_ERROR),
@@ -2083,7 +2185,8 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group)
service_logging_(CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableGPUServiceLoggingGPU)),
viewport_max_width_(0),
- viewport_max_height_(0) {
+ viewport_max_height_(0),
+ texture_upload_count_(0) {
DCHECK(group);
attrib_0_value_.v[0] = 0.0f;
@@ -2104,7 +2207,7 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group)
// TODO(gman): Consider setting this based on GPU and/or driver.
if (IsAngle()) {
- texture_state_.teximage2d_faster_than_texsubimage2d = false;
+ teximage2d_faster_than_texsubimage2d_ = false;
}
}
@@ -2614,7 +2717,7 @@ void GLES2DecoderImpl::DeleteFramebuffersHelper(
if (framebuffer && !framebuffer->IsDeleted()) {
if (framebuffer == state_.bound_draw_framebuffer.get()) {
state_.bound_draw_framebuffer = NULL;
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
GLenum target = supports_separate_framebuffer_binds ?
GL_DRAW_FRAMEBUFFER_EXT : GL_FRAMEBUFFER;
glBindFramebufferEXT(target, GetBackbufferServiceId());
@@ -2658,7 +2761,7 @@ void GLES2DecoderImpl::DeleteRenderbuffersHelper(
->UnbindRenderbuffer(GL_FRAMEBUFFER, renderbuffer);
}
}
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
RemoveRenderbuffer(client_ids[ii]);
}
}
@@ -2673,7 +2776,7 @@ void GLES2DecoderImpl::DeleteTexturesHelper(
if (texture_ref) {
Texture* texture = texture_ref->texture();
if (texture->IsAttachedToFramebuffer()) {
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
// Unbind texture_ref from texture_ref units.
for (size_t jj = 0; jj < state_.texture_units.size(); ++jj) {
@@ -2732,7 +2835,7 @@ bool GLES2DecoderImpl::MakeCurrent() {
if (workarounds().unbind_fbo_on_context_switch)
RestoreFramebufferBindings();
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
return true;
}
@@ -2776,7 +2879,7 @@ static void RebindCurrentFramebuffer(
}
void GLES2DecoderImpl::RestoreCurrentFramebufferBindings() {
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
if (!features().chromium_framebuffer_multisample) {
RebindCurrentFramebuffer(
@@ -2972,8 +3075,7 @@ void GLES2DecoderImpl::UpdateParentTextureInfo() {
offscreen_saved_color_texture_info_.get(),
GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
- TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
glBindTexture(target, texture_ref ? texture_ref->service_id() : 0);
}
@@ -3025,12 +3127,12 @@ bool GLES2DecoderImpl::GetServiceTextureId(uint32 client_texture_id,
}
uint32 GLES2DecoderImpl::GetTextureUploadCount() {
- return texture_state_.texture_upload_count +
+ return texture_upload_count_ +
async_pixel_transfer_manager_->GetTextureUploadCount();
}
base::TimeDelta GLES2DecoderImpl::GetTotalTextureUploadTime() {
- return texture_state_.total_texture_upload_time +
+ return total_texture_upload_time_ +
async_pixel_transfer_manager_->GetTotalTextureUploadTime();
}
@@ -3576,7 +3678,7 @@ bool GLES2DecoderImpl::BoundFramebufferHasStencilAttachment() {
}
void GLES2DecoderImpl::ApplyDirtyState() {
- if (framebuffer_state_.clear_state_dirty) {
+ if (clear_state_dirty_) {
glColorMask(
state_.color_mask_red, state_.color_mask_green, state_.color_mask_blue,
state_.color_mask_alpha &&
@@ -3594,7 +3696,7 @@ void GLES2DecoderImpl::ApplyDirtyState() {
EnableDisable(GL_CULL_FACE, state_.enable_flags.cull_face);
EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test);
EnableDisable(GL_BLEND, state_.enable_flags.blend);
- framebuffer_state_.clear_state_dirty = false;
+ clear_state_dirty_ = false;
}
}
@@ -3702,7 +3804,7 @@ void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) {
state_.bound_read_framebuffer = framebuffer;
}
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
// If we are rendering to the backbuffer get the FBO id for any simulated
// backbuffer.
@@ -3880,8 +3982,7 @@ void GLES2DecoderImpl::DoEnableVertexAttribArray(GLuint index) {
}
void GLES2DecoderImpl::DoGenerateMipmap(GLenum target) {
- TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
if (!texture_ref ||
!texture_manager()->CanGenerateMipmaps(texture_ref)) {
LOCAL_SET_GL_ERROR(
@@ -4657,7 +4758,7 @@ void GLES2DecoderImpl::DoFramebufferRenderbuffer(
framebuffer->AttachRenderbuffer(attachment, renderbuffer);
}
if (framebuffer == state_.bound_draw_framebuffer.get()) {
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
OnFboChanged();
}
@@ -4741,7 +4842,7 @@ void GLES2DecoderImpl::ClearUnclearedAttachments(
}
void GLES2DecoderImpl::RestoreClearState() {
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
glClearColor(
state_.color_clear_red, state_.color_clear_green, state_.color_clear_blue,
state_.color_clear_alpha);
@@ -4841,7 +4942,7 @@ void GLES2DecoderImpl::DoFramebufferTexture2DCommon(
samples);
}
if (framebuffer == state_.bound_draw_framebuffer.get()) {
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
OnFboChanged();
}
@@ -5080,8 +5181,7 @@ void GLES2DecoderImpl::DoLinkProgram(GLuint program_id) {
void GLES2DecoderImpl::DoTexParameterf(
GLenum target, GLenum pname, GLfloat param) {
- TextureRef* texture = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture = GetTextureInfoForTarget(target);
if (!texture) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexParameterf", "unknown texture");
return;
@@ -5094,8 +5194,7 @@ void GLES2DecoderImpl::DoTexParameterf(
void GLES2DecoderImpl::DoTexParameteri(
GLenum target, GLenum pname, GLint param) {
- TextureRef* texture = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture = GetTextureInfoForTarget(target);
if (!texture) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexParameteri", "unknown texture");
return;
@@ -5107,8 +5206,7 @@ void GLES2DecoderImpl::DoTexParameteri(
void GLES2DecoderImpl::DoTexParameterfv(
GLenum target, GLenum pname, const GLfloat* params) {
- TextureRef* texture = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture = GetTextureInfoForTarget(target);
if (!texture) {
LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexParameterfv", "unknown texture");
return;
@@ -5121,8 +5219,7 @@ void GLES2DecoderImpl::DoTexParameterfv(
void GLES2DecoderImpl::DoTexParameteriv(
GLenum target, GLenum pname, const GLint* params) {
- TextureRef* texture = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture = GetTextureInfoForTarget(target);
if (!texture) {
LOCAL_SET_GL_ERROR(
GL_INVALID_VALUE, "glTexParameteriv", "unknown texture");
@@ -7323,8 +7420,7 @@ bool GLES2DecoderImpl::ClearLevel(
}
y += tile_height;
}
- TextureRef* texture = texture_manager()->GetTextureInfoForTarget(
- &state_, bind_target);
+ TextureRef* texture = GetTextureInfoForTarget(bind_target);
glBindTexture(bind_target, texture ? texture->service_id() : 0);
return true;
}
@@ -7499,8 +7595,7 @@ error::Error GLES2DecoderImpl::DoCompressedTexImage2D(
"glCompressedTexImage2D", "dimensions out of range");
return error::kNoError;
}
- TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
if (!texture_ref) {
LOCAL_SET_GL_ERROR(
GL_INVALID_VALUE,
@@ -7529,7 +7624,7 @@ error::Error GLES2DecoderImpl::DoCompressedTexImage2D(
}
if (texture->IsAttachedToFramebuffer()) {
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
scoped_ptr<int8[]> zero;
@@ -7664,16 +7759,176 @@ error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2DBucket(
return error::kNoError;
}
+bool GLES2DecoderImpl::ValidateTextureParameters(
+ const char* function_name,
+ GLenum target, GLenum format, GLenum type, GLint level) {
+ if (!feature_info_->GetTextureFormatValidator(format).IsValid(type)) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_OPERATION, function_name,
+ (std::string("invalid type ") +
+ GLES2Util::GetStringEnum(type) + " for format " +
+ GLES2Util::GetStringEnum(format)).c_str());
+ return false;
+ }
+
+ uint32 channels = GLES2Util::GetChannelsForFormat(format);
+ if ((channels & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && level) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_OPERATION, function_name,
+ (std::string("invalid type ") +
+ GLES2Util::GetStringEnum(type) + " for format " +
+ GLES2Util::GetStringEnum(format)).c_str());
+ return false;
+ }
+ return true;
+}
+
+bool GLES2DecoderImpl::ValidateTexImage2D(
+ const char* function_name,
+ GLenum target,
+ GLint level,
+ GLenum internal_format,
+ GLsizei width,
+ GLsizei height,
+ GLint border,
+ GLenum format,
+ GLenum type,
+ const void* pixels,
+ uint32 pixels_size) {
+ if (!validators_->texture_target.IsValid(target)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, target, "target");
+ return false;
+ }
+ if (!validators_->texture_format.IsValid(internal_format)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM(
+ function_name, internal_format, "internal_format");
+ return false;
+ }
+ if (!validators_->texture_format.IsValid(format)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, format, "format");
+ return false;
+ }
+ if (!validators_->pixel_type.IsValid(type)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, type, "type");
+ return false;
+ }
+ if (format != internal_format) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_OPERATION, function_name, "format != internalFormat");
+ return false;
+ }
+ if (!ValidateTextureParameters(function_name, target, format, type, level)) {
+ return false;
+ }
+ if (!texture_manager()->ValidForTarget(target, level, width, height, 1) ||
+ border != 0) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_VALUE, function_name, "dimensions out of range");
+ return false;
+ }
+ if ((GLES2Util::GetChannelsForFormat(format) &
+ (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && pixels) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_OPERATION,
+ function_name, "can not supply data for depth or stencil textures");
+ return false;
+ }
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
+ if (!texture_ref) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_OPERATION, function_name, "unknown texture for target");
+ return false;
+ }
+ if (texture_ref->texture()->IsImmutable()) {
+ LOCAL_SET_GL_ERROR(
+ GL_INVALID_OPERATION, function_name, "texture is immutable");
+ return false;
+ }
+ return true;
+}
+
+void GLES2DecoderImpl::DoTexImage2D(
+ GLenum target,
+ GLint level,
+ GLenum internal_format,
+ GLsizei width,
+ GLsizei height,
+ GLint border,
+ GLenum format,
+ GLenum type,
+ const void* pixels,
+ uint32 pixels_size) {
+ if (!ValidateTexImage2D("glTexImage2D", target, level, internal_format,
+ width, height, border, format, type, pixels, pixels_size)) {
+ return;
+ }
+
+ if (!EnsureGPUMemoryAvailable(pixels_size)) {
+ LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory");
+ return;
+ }
+
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
+ Texture* texture = texture_ref->texture();
+ GLsizei tex_width = 0;
+ GLsizei tex_height = 0;
+ GLenum tex_type = 0;
+ GLenum tex_format = 0;
+ bool level_is_same =
+ texture->GetLevelSize(target, level, &tex_width, &tex_height) &&
+ texture->GetLevelType(target, level, &tex_type, &tex_format) &&
+ width == tex_width && height == tex_height &&
+ type == tex_type && format == tex_format;
+
+ if (level_is_same && !pixels) {
+ // Just set the level texture but mark the texture as uncleared.
+ texture_manager()->SetLevelInfo(
+ texture_ref,
+ target, level, internal_format, width, height, 1, border, format, type,
+ false);
+ tex_image_2d_failed_ = false;
+ return;
+ }
+
+ if (texture->IsAttachedToFramebuffer()) {
+ clear_state_dirty_ = true;
+ }
+
+ if (!teximage2d_faster_than_texsubimage2d_ && level_is_same && pixels) {
+ {
+ ScopedTextureUploadTimer timer(this);
+ glTexSubImage2D(target, level, 0, 0, width, height, format, type, pixels);
+ }
+ texture_manager()->SetLevelCleared(texture_ref, target, level, true);
+ tex_image_2d_failed_ = false;
+ return;
+ }
+
+ LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glTexImage2D");
+ {
+ ScopedTextureUploadTimer timer(this);
+ glTexImage2D(
+ target, level, internal_format, width, height, border, format, type,
+ pixels);
+ }
+ GLenum error = LOCAL_PEEK_GL_ERROR("glTexImage2D");
+ if (error == GL_NO_ERROR) {
+ texture_manager()->SetLevelInfo(
+ texture_ref,
+ target, level, internal_format, width, height, 1, border, format, type,
+ pixels != NULL);
+ tex_image_2d_failed_ = false;
+ }
+ return;
+}
+
error::Error GLES2DecoderImpl::HandleTexImage2D(
uint32 immediate_data_size, const cmds::TexImage2D& c) {
TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexImage2D");
- // Set as failed for now, but if it successed, this will be set to not failed.
- texture_state_.tex_image_2d_failed = true;
+ tex_image_2d_failed_ = true;
GLenum target = static_cast<GLenum>(c.target);
GLint level = static_cast<GLint>(c.level);
- // TODO(kloveless): Change TexImage2D command to use unsigned integer
- // for internalformat.
- GLenum internal_format = static_cast<GLenum>(c.internalformat);
+ GLint internal_format = static_cast<GLint>(c.internalformat);
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
GLint border = static_cast<GLint>(c.border);
@@ -7696,11 +7951,9 @@ error::Error GLES2DecoderImpl::HandleTexImage2D(
}
}
- TextureManager::DoTextImage2DArguments args = {
- target, level, internal_format, width, height, border, format, type,
- pixels, pixels_size};
- texture_manager()->ValidateAndDoTexImage2D(
- &texture_state_, &state_, &framebuffer_state_, args);
+ DoTexImage2D(
+ target, level, internal_format, width, height, border, format, type,
+ pixels, pixels_size);
return error::kNoError;
}
@@ -7708,9 +7961,7 @@ error::Error GLES2DecoderImpl::HandleTexImage2DImmediate(
uint32 immediate_data_size, const cmds::TexImage2DImmediate& c) {
GLenum target = static_cast<GLenum>(c.target);
GLint level = static_cast<GLint>(c.level);
- // TODO(kloveless): Change TexImage2DImmediate command to use unsigned
- // integer for internalformat.
- GLenum internal_format = static_cast<GLenum>(c.internalformat);
+ GLint internal_format = static_cast<GLint>(c.internalformat);
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
GLint border = static_cast<GLint>(c.border);
@@ -7727,12 +7978,9 @@ error::Error GLES2DecoderImpl::HandleTexImage2DImmediate(
if (!pixels) {
return error::kOutOfBounds;
}
-
- TextureManager::DoTextImage2DArguments args = {
- target, level, internal_format, width, height, border, format, type,
- pixels, size};
- texture_manager()->ValidateAndDoTexImage2D(
- &texture_state_, &state_, &framebuffer_state_, args);
+ DoTexImage2D(
+ target, level, internal_format, width, height, border, format, type,
+ pixels, size);
return error::kNoError;
}
@@ -7746,8 +7994,7 @@ void GLES2DecoderImpl::DoCompressedTexSubImage2D(
GLenum format,
GLsizei image_size,
const void * data) {
- TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
if (!texture_ref) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
@@ -7820,8 +8067,7 @@ void GLES2DecoderImpl::DoCopyTexImage2D(
GLsizei height,
GLint border) {
DCHECK(!ShouldDeferReads());
- TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
if (!texture_ref) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
@@ -7839,9 +8085,8 @@ void GLES2DecoderImpl::DoCopyTexImage2D(
GL_INVALID_VALUE, "glCopyTexImage2D", "dimensions out of range");
return;
}
- if (!texture_manager()->ValidateTextureParameters(
- state_.GetErrorState(), "glCopyTexImage2D", target, internal_format,
- GL_UNSIGNED_BYTE, level)) {
+ if (!ValidateTextureParameters(
+ "glCopyTexImage2D", target, internal_format, GL_UNSIGNED_BYTE, level)) {
return;
}
@@ -7886,7 +8131,7 @@ void GLES2DecoderImpl::DoCopyTexImage2D(
gfx::Size size = GetBoundReadFrameBufferSize();
if (texture->IsAttachedToFramebuffer()) {
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
// Clip to size to source dimensions
@@ -7941,8 +8186,7 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D(
GLsizei width,
GLsizei height) {
DCHECK(!ShouldDeferReads());
- TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
if (!texture_ref) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
@@ -8068,8 +8312,7 @@ bool GLES2DecoderImpl::ValidateTexSubImage2D(
LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, type, "type");
return false;
}
- TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
if (!texture_ref) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
@@ -8136,8 +8379,7 @@ error::Error GLES2DecoderImpl::DoTexSubImage2D(
xoffset, yoffset, width, height, format, type, data)) {
return error;
}
- TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
Texture* texture = texture_ref->texture();
GLsizei tex_width = 0;
GLsizei tex_height = 0;
@@ -8151,21 +8393,20 @@ error::Error GLES2DecoderImpl::DoTexSubImage2D(
GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big");
return error::kNoError;
}
- ScopedTextureUploadTimer timer(&texture_state_);
+ ScopedTextureUploadTimer timer(this);
glTexSubImage2D(
target, level, xoffset, yoffset, width, height, format, type, data);
return error::kNoError;
}
- if (texture_state_.teximage2d_faster_than_texsubimage2d &&
- !texture->IsImmutable()) {
- ScopedTextureUploadTimer timer(&texture_state_);
+ if (teximage2d_faster_than_texsubimage2d_ && !texture->IsImmutable()) {
+ ScopedTextureUploadTimer timer(this);
// NOTE: In OpenGL ES 2.0 border is always zero and format is always the
// same as internal_foramt. If that changes we'll need to look them up.
glTexImage2D(
target, level, format, width, height, 0, format, type, data);
} else {
- ScopedTextureUploadTimer timer(&texture_state_);
+ ScopedTextureUploadTimer timer(this);
glTexSubImage2D(
target, level, xoffset, yoffset, width, height, format, type, data);
}
@@ -8177,7 +8418,7 @@ error::Error GLES2DecoderImpl::HandleTexSubImage2D(
uint32 immediate_data_size, const cmds::TexSubImage2D& c) {
TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexSubImage2D");
GLboolean internal = static_cast<GLboolean>(c.internal);
- if (internal == GL_TRUE && texture_state_.tex_image_2d_failed)
+ if (internal == GL_TRUE && tex_image_2d_failed_)
return error::kNoError;
GLenum target = static_cast<GLenum>(c.target);
@@ -8203,7 +8444,7 @@ error::Error GLES2DecoderImpl::HandleTexSubImage2D(
error::Error GLES2DecoderImpl::HandleTexSubImage2DImmediate(
uint32 immediate_data_size, const cmds::TexSubImage2DImmediate& c) {
GLboolean internal = static_cast<GLboolean>(c.internal);
- if (internal == GL_TRUE && texture_state_.tex_image_2d_failed)
+ if (internal == GL_TRUE && tex_image_2d_failed_)
return error::kNoError;
GLenum target = static_cast<GLenum>(c.target);
@@ -9323,8 +9564,7 @@ void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM(
// Default target might be conceptually valid, but disallow it to avoid
// accidents.
- TextureRef* texture_ref =
- texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTargetUnlessDefault(target);
if (!texture_ref) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
@@ -9479,7 +9719,6 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM(
}
if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) {
- UpdateStreamTextureIfNeeded(source_texture);
DCHECK(stream_texture_manager());
StreamTexture* stream_tex =
stream_texture_manager()->LookupStreamTexture(
@@ -9639,8 +9878,7 @@ void GLES2DecoderImpl::DoTexStorage2DEXT(
GL_INVALID_VALUE, "glTexStorage2DEXT", "dimensions out of range");
return;
}
- TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
if (!texture_ref) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
@@ -9649,7 +9887,7 @@ void GLES2DecoderImpl::DoTexStorage2DEXT(
}
Texture* texture = texture_ref->texture();
if (texture->IsAttachedToFramebuffer()) {
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
if (texture->IsImmutable()) {
LOCAL_SET_GL_ERROR(
@@ -9721,8 +9959,7 @@ void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target,
"context", logger_.GetLogPrefix(),
"mailbox[0]", static_cast<unsigned char>(mailbox[0]));
- TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
if (!texture_ref) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
@@ -9756,7 +9993,7 @@ void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target,
"mailbox[0]", static_cast<unsigned char>(mailbox[0]));
scoped_refptr<TextureRef> texture_ref =
- texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target);
+ GetTextureInfoForTargetUnlessDefault(target);
if (!texture_ref.get()) {
LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
"glConsumeTextureCHROMIUM",
@@ -9847,8 +10084,7 @@ void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(
// Default target might be conceptually valid, but disallow it to avoid
// accidents.
- TextureRef* texture_ref =
- texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTargetUnlessDefault(target);
if (!texture_ref) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
@@ -9895,8 +10131,7 @@ void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM(
// Default target might be conceptually valid, but disallow it to avoid
// accidents.
- TextureRef* texture_ref =
- texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTargetUnlessDefault(target);
if (!texture_ref) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
@@ -10037,9 +10272,7 @@ error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM(
TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM");
GLenum target = static_cast<GLenum>(c.target);
GLint level = static_cast<GLint>(c.level);
- // TODO(kloveless): Change HandleAsyncTexImage2DCHROMIUM command to use
- // unsigned integer for internalformat.
- GLenum internal_format = static_cast<GLenum>(c.internalformat);
+ GLint internal_format = static_cast<GLint>(c.internalformat);
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
GLint border = static_cast<GLint>(c.border);
@@ -10065,17 +10298,15 @@ error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM(
}
}
- TextureManager::DoTextImage2DArguments args = {
- target, level, internal_format, width, height, border, format, type,
- pixels, pixels_size};
- TextureRef* texture_ref;
// All the normal glTexSubImage2D validation.
- if (!texture_manager()->ValidateTexImage2D(
- &state_, "glAsyncTexImage2DCHROMIUM", args, &texture_ref)) {
+ if (!ValidateTexImage2D(
+ "glAsyncTexImage2DCHROMIUM", target, level, internal_format,
+ width, height, border, format, type, pixels, pixels_size)) {
return error::kNoError;
}
// Extra async validation.
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
Texture* texture = texture_ref->texture();
if (!ValidateAsyncTransfer(
"glAsyncTexImage2DCHROMIUM", texture_ref, target, level, pixels))
@@ -10162,8 +10393,7 @@ error::Error GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM(
}
// Extra async validation.
- TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
Texture* texture = texture_ref->texture();
if (!ValidateAsyncTransfer(
"glAsyncTexSubImage2DCHROMIUM", texture_ref, target, level, pixels))
@@ -10231,8 +10461,7 @@ error::Error GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM(
GL_INVALID_ENUM, "glWaitAsyncTexImage2DCHROMIUM", "target");
return error::kNoError;
}
- TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget(
- &state_, target);
+ TextureRef* texture_ref = GetTextureInfoForTarget(target);
if (!texture_ref) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index 393c90292c8..a992e343446 100644
--- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -319,7 +319,7 @@ error::Error GLES2DecoderImpl::HandleColorMask(
state_.color_mask_green = green;
state_.color_mask_blue = blue;
state_.color_mask_alpha = alpha;
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
return error::kNoError;
}
@@ -678,7 +678,7 @@ error::Error GLES2DecoderImpl::HandleDepthMask(
GLboolean flag = static_cast<GLboolean>(c.flag);
if (state_.depth_mask != flag) {
state_.depth_mask = flag;
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
return error::kNoError;
}
@@ -1698,7 +1698,7 @@ error::Error GLES2DecoderImpl::HandleStencilMask(
state_.stencil_back_writemask != mask) {
state_.stencil_front_writemask = mask;
state_.stencil_back_writemask = mask;
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
return error::kNoError;
}
@@ -1725,7 +1725,7 @@ error::Error GLES2DecoderImpl::HandleStencilMaskSeparate(
if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
state_.stencil_back_writemask = mask;
}
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
return error::kNoError;
}
@@ -3332,7 +3332,7 @@ bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) {
case GL_DEPTH_TEST:
if (state_.enable_flags.depth_test != enabled) {
state_.enable_flags.depth_test = enabled;
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
return false;
case GL_DITHER:
@@ -3350,13 +3350,13 @@ bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) {
case GL_SCISSOR_TEST:
if (state_.enable_flags.scissor_test != enabled) {
state_.enable_flags.scissor_test = enabled;
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
return false;
case GL_STENCIL_TEST:
if (state_.enable_flags.stencil_test != enabled) {
state_.enable_flags.stencil_test = enabled;
- framebuffer_state_.clear_state_dirty = true;
+ clear_state_dirty_ = true;
}
return false;
default:
diff --git a/chromium/gpu/command_buffer/service/texture_manager.cc b/chromium/gpu/command_buffer/service/texture_manager.cc
index deb8c8e6645..486bdacad32 100644
--- a/chromium/gpu/command_buffer/service/texture_manager.cc
+++ b/chromium/gpu/command_buffer/service/texture_manager.cc
@@ -6,7 +6,6 @@
#include "base/bits.h"
#include "base/strings/stringprintf.h"
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
-#include "gpu/command_buffer/service/context_state.h"
#include "gpu/command_buffer/service/error_state.h"
#include "gpu/command_buffer/service/feature_info.h"
#include "gpu/command_buffer/service/framebuffer_manager.h"
@@ -1237,238 +1236,5 @@ void TextureManager::IncFramebufferStateChangeCount() {
}
-bool TextureManager::ValidateTextureParameters(
- ErrorState* error_state, const char* function_name,
- GLenum target, GLenum format, GLenum type, GLint level) {
- if (!feature_info_->GetTextureFormatValidator(format).IsValid(type)) {
- ERRORSTATE_SET_GL_ERROR(
- error_state, GL_INVALID_OPERATION, function_name,
- (std::string("invalid type ") +
- GLES2Util::GetStringEnum(type) + " for format " +
- GLES2Util::GetStringEnum(format)).c_str());
- return false;
- }
-
- uint32 channels = GLES2Util::GetChannelsForFormat(format);
- if ((channels & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && level) {
- ERRORSTATE_SET_GL_ERROR(
- error_state, GL_INVALID_OPERATION, function_name,
- (std::string("invalid type ") +
- GLES2Util::GetStringEnum(type) + " for format " +
- GLES2Util::GetStringEnum(format)).c_str());
- return false;
- }
- return true;
-}
-
-// Gets the texture id for a given target.
-TextureRef* TextureManager::GetTextureInfoForTarget(
- ContextState* state, GLenum target) {
- TextureUnit& unit = state->texture_units[state->active_texture_unit];
- TextureRef* texture = NULL;
- switch (target) {
- case GL_TEXTURE_2D:
- texture = unit.bound_texture_2d.get();
- break;
- case GL_TEXTURE_CUBE_MAP:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- texture = unit.bound_texture_cube_map.get();
- break;
- case GL_TEXTURE_EXTERNAL_OES:
- texture = unit.bound_texture_external_oes.get();
- break;
- case GL_TEXTURE_RECTANGLE_ARB:
- texture = unit.bound_texture_rectangle_arb.get();
- break;
- default:
- NOTREACHED();
- return NULL;
- }
- return texture;
-}
-
-TextureRef* TextureManager::GetTextureInfoForTargetUnlessDefault(
- ContextState* state, GLenum target) {
- TextureRef* texture = GetTextureInfoForTarget(state, target);
- if (!texture)
- return NULL;
- if (texture == GetDefaultTextureInfo(target))
- return NULL;
- return texture;
-}
-
-bool TextureManager::ValidateTexImage2D(
- ContextState* state,
- const char* function_name,
- const DoTextImage2DArguments& args,
- TextureRef** texture_ref) {
- ErrorState* error_state = state->GetErrorState();
- const Validators* validators = feature_info_->validators();
- if (!validators->texture_target.IsValid(args.target)) {
- ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(
- error_state, function_name, args.target, "target");
- return false;
- }
- if (!validators->texture_format.IsValid(args.internal_format)) {
- ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(
- error_state, function_name, args.internal_format,
- "internal_format");
- return false;
- }
- if (!validators->texture_format.IsValid(args.format)) {
- ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(
- error_state, function_name, args.format, "format");
- return false;
- }
- if (!validators->pixel_type.IsValid(args.type)) {
- ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(
- error_state, function_name, args.type, "type");
- return false;
- }
- if (args.format != args.internal_format) {
- ERRORSTATE_SET_GL_ERROR(
- error_state, GL_INVALID_OPERATION, function_name,
- "format != internalFormat");
- return false;
- }
- if (!ValidateTextureParameters(
- error_state, function_name, args.target, args.format, args.type,
- args.level)) {
- return false;
- }
- if (!ValidForTarget(args.target, args.level, args.width, args.height, 1) ||
- args.border != 0) {
- ERRORSTATE_SET_GL_ERROR(
- error_state, GL_INVALID_VALUE, function_name,
- "dimensions out of range");
- return false;
- }
- if ((GLES2Util::GetChannelsForFormat(args.format) &
- (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && args.pixels) {
- ERRORSTATE_SET_GL_ERROR(
- error_state, GL_INVALID_OPERATION,
- function_name, "can not supply data for depth or stencil textures");
- return false;
- }
-
- TextureRef* local_texture_ref = GetTextureInfoForTarget(state, args.target);
- if (!local_texture_ref) {
- ERRORSTATE_SET_GL_ERROR(
- error_state, GL_INVALID_OPERATION, function_name,
- "unknown texture for target");
- return false;
- }
- if (local_texture_ref->texture()->IsImmutable()) {
- ERRORSTATE_SET_GL_ERROR(
- error_state, GL_INVALID_OPERATION, function_name,
- "texture is immutable");
- return false;
- }
-
- // TODO - verify that using the managed vs unmanaged does not matter.
- // They both use the same MemoryTracker, and this call just re-routes
- // to it.
- if (!memory_tracker_managed_->EnsureGPUMemoryAvailable(args.pixels_size)) {
- ERRORSTATE_SET_GL_ERROR(error_state, GL_OUT_OF_MEMORY, "glTexImage2D",
- "out of memory");
- return false;
- }
-
- // Write the TextureReference since this is valid.
- *texture_ref = local_texture_ref;
- return true;
-}
-
-void TextureManager::ValidateAndDoTexImage2D(
- DecoderTextureState* texture_state,
- ContextState* state,
- DecoderFramebufferState* framebuffer_state,
- const DoTextImage2DArguments& args) {
- TextureRef* texture_ref;
- if (!ValidateTexImage2D(state, "glTexImage2D", args, &texture_ref)) {
- return;
- }
-
- DoTexImage2D(texture_state, state->GetErrorState(), framebuffer_state,
- texture_ref, args);
-}
-
-void TextureManager::DoTexImage2D(
- DecoderTextureState* texture_state,
- ErrorState* error_state,
- DecoderFramebufferState* framebuffer_state,
- TextureRef* texture_ref,
- const DoTextImage2DArguments& args) {
- Texture* texture = texture_ref->texture();
- GLsizei tex_width = 0;
- GLsizei tex_height = 0;
- GLenum tex_type = 0;
- GLenum tex_format = 0;
- bool level_is_same =
- texture->GetLevelSize(args.target, args.level, &tex_width, &tex_height) &&
- texture->GetLevelType(args.target, args.level, &tex_type, &tex_format) &&
- args.width == tex_width && args.height == tex_height &&
- args.type == tex_type && args.format == tex_format;
-
- if (level_is_same && !args.pixels) {
- // Just set the level texture but mark the texture as uncleared.
- SetLevelInfo(
- texture_ref,
- args.target, args.level, args.internal_format, args.width, args.height,
- 1, args.border, args.format, args.type, false);
- texture_state->tex_image_2d_failed = false;
- return;
- }
-
- if (texture->IsAttachedToFramebuffer()) {
- framebuffer_state->clear_state_dirty = true;
- }
-
- if (!texture_state->teximage2d_faster_than_texsubimage2d &&
- level_is_same && args.pixels) {
- {
- ScopedTextureUploadTimer timer(texture_state);
- glTexSubImage2D(args.target, args.level, 0, 0, args.width, args.height,
- args.format, args.type, args.pixels);
- }
- SetLevelCleared(texture_ref, args.target, args.level, true);
- texture_state->tex_image_2d_failed = false;
- return;
- }
-
- ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(error_state, "glTexImage2D");
- {
- ScopedTextureUploadTimer timer(texture_state);
- glTexImage2D(
- args.target, args.level, args.internal_format, args.width, args.height,
- args.border, args.format, args.type, args.pixels);
- }
- GLenum error = ERRORSTATE_PEEK_GL_ERROR(error_state, "glTexImage2D");
- if (error == GL_NO_ERROR) {
- SetLevelInfo(
- texture_ref,
- args.target, args.level, args.internal_format, args.width, args.height,
- 1, args.border, args.format, args.type, args.pixels != NULL);
- texture_state->tex_image_2d_failed = false;
- }
-}
-
-ScopedTextureUploadTimer::ScopedTextureUploadTimer(
- DecoderTextureState* texture_state)
- : texture_state_(texture_state),
- begin_time_(base::TimeTicks::HighResNow()) {
-}
-
-ScopedTextureUploadTimer::~ScopedTextureUploadTimer() {
- texture_state_->texture_upload_count++;
- texture_state_->total_texture_upload_time +=
- base::TimeTicks::HighResNow() - begin_time_;
-}
-
} // namespace gles2
} // namespace gpu
diff --git a/chromium/gpu/command_buffer/service/texture_manager.h b/chromium/gpu/command_buffer/service/texture_manager.h
index db470045751..cbc659caf4e 100644
--- a/chromium/gpu/command_buffer/service/texture_manager.h
+++ b/chromium/gpu/command_buffer/service/texture_manager.h
@@ -27,8 +27,6 @@ class StreamTextureManager;
namespace gles2 {
class GLES2Decoder;
-struct ContextState;
-struct DecoderFramebufferState;
class Display;
class ErrorState;
class FeatureInfo;
@@ -431,29 +429,6 @@ class GPU_EXPORT TextureRef : public base::RefCounted<TextureRef> {
DISALLOW_COPY_AND_ASSIGN(TextureRef);
};
-// Holds data that is per gles2_cmd_decoder, but is related to to the
-// TextureManager.
-struct DecoderTextureState {
- // total_texture_upload_time automatically initialized to 0 in default
- // constructor.
- DecoderTextureState():
- tex_image_2d_failed(false),
- texture_upload_count(0),
- teximage2d_faster_than_texsubimage2d(true) {}
-
- // This indicates all the following texSubImage2D calls that are part of the
- // failed texImage2D call should be ignored.
- bool tex_image_2d_failed;
-
- // Command buffer stats.
- int texture_upload_count;
- base::TimeDelta total_texture_upload_time;
-
- // This is really not per-decoder, but the logic to decide this value is in
- // the decoder for now, so it is simpler to leave it there.
- bool teximage2d_faster_than_texsubimage2d;
-};
-
// This class keeps track of the textures and their sizes so we can do NPOT and
// texture complete checking.
//
@@ -696,43 +671,6 @@ class GPU_EXPORT TextureManager {
destruction_observers_.RemoveObserver(observer);
}
- struct DoTextImage2DArguments {
- GLenum target;
- GLint level;
- GLenum internal_format;
- GLsizei width;
- GLsizei height;
- GLint border;
- GLenum format;
- GLenum type;
- const void* pixels;
- uint32 pixels_size;
- };
-
- bool ValidateTexImage2D(
- ContextState* state,
- const char* function_name,
- const DoTextImage2DArguments& args,
- // Pointer to TextureRef filled in if validation successful.
- // Presumes the pointer is valid.
- TextureRef** texture_ref);
-
- void ValidateAndDoTexImage2D(
- DecoderTextureState* texture_state,
- ContextState* state,
- DecoderFramebufferState* framebuffer_state,
- const DoTextImage2DArguments& args);
-
- // TODO(kloveless): Make GetTexture* private once this is no longer called
- // from gles2_cmd_decoder.
- TextureRef* GetTextureInfoForTarget(ContextState* state, GLenum target);
- TextureRef* GetTextureInfoForTargetUnlessDefault(
- ContextState* state, GLenum target);
-
- bool ValidateTextureParameters(
- ErrorState* error_state, const char* function_name,
- GLenum target, GLenum format, GLenum type, GLint level);
-
private:
friend class Texture;
friend class TextureRef;
@@ -742,13 +680,6 @@ class GPU_EXPORT TextureManager {
GLenum target,
GLuint* black_texture);
- void DoTexImage2D(
- DecoderTextureState* texture_state,
- ErrorState* error_state,
- DecoderFramebufferState* framebuffer_state,
- TextureRef* texture_ref,
- const DoTextImage2DArguments& args);
-
void StartTracking(TextureRef* texture);
void StopTracking(TextureRef* texture);
@@ -799,18 +730,6 @@ class GPU_EXPORT TextureManager {
DISALLOW_COPY_AND_ASSIGN(TextureManager);
};
-// This class records texture upload time when in scope.
-class ScopedTextureUploadTimer {
- public:
- explicit ScopedTextureUploadTimer(DecoderTextureState* texture_state);
- ~ScopedTextureUploadTimer();
-
- private:
- DecoderTextureState* texture_state_;
- base::TimeTicks begin_time_;
- DISALLOW_COPY_AND_ASSIGN(ScopedTextureUploadTimer);
-};
-
} // namespace gles2
} // namespace gpu
diff --git a/chromium/gpu/config/gpu_driver_bug_list_json.cc b/chromium/gpu/config/gpu_driver_bug_list_json.cc
index 423a723f838..7b2d8df827f 100644
--- a/chromium/gpu/config/gpu_driver_bug_list_json.cc
+++ b/chromium/gpu/config/gpu_driver_bug_list_json.cc
@@ -85,7 +85,7 @@ const char kGpuDriverBugListJson[] = LONG_STRING_CONST(
{
"name": "gpu driver bug list",
// Please update the version number whenever you change this file.
- "version": "2.5",
+ "version": "2.6",
"entries": [
{
"id": 1,
@@ -425,6 +425,17 @@ const char kGpuDriverBugListJson[] = LONG_STRING_CONST(
"features": [
"swizzle_rgba_for_async_readpixels"
]
+ },
+ {
+ "id": 28,
+ "cr_bugs": [277817],
+ "description": "Disable use of ANGLE_instanced_arrays on Windows",
+ "os": {
+ "type": "win"
+ },
+ "features": [
+ "disable_angle_instanced_arrays"
+ ]
}
]
}
diff --git a/chromium/gpu/config/gpu_driver_bug_workaround_type.h b/chromium/gpu/config/gpu_driver_bug_workaround_type.h
index 20198dacd1a..c9b19ac986c 100644
--- a/chromium/gpu/config/gpu_driver_bug_workaround_type.h
+++ b/chromium/gpu/config/gpu_driver_bug_workaround_type.h
@@ -62,6 +62,8 @@
disable_d3d11) \
GPU_OP(SWIZZLE_RGBA_FOR_ASYNC_READPIXELS, \
swizzle_rgba_for_async_readpixels) \
+ GPU_OP(DISABLE_ANGLE_INSTANCED_ARRAYS, \
+ disable_angle_instanced_arrays) \
namespace gpu {
diff --git a/chromium/ipc/ipc_message.cc b/chromium/ipc/ipc_message.cc
index cf3a65e077f..2fb909773f1 100644
--- a/chromium/ipc/ipc_message.cc
+++ b/chromium/ipc/ipc_message.cc
@@ -27,7 +27,7 @@ inline uint32 GetRefNumUpper24() {
// Process ID. With the current trace event buffer cap, the 14-bit count did
// not appear to wrap during a trace. Note that it is not a big deal if
// collisions occur, as this is only used for debugging and trace analysis.
- return ((pid << 14) | (count & 0x3fff)) << 8;
+ return ((pid << 22) | (count & 0x3fff)) << 8;
}
} // namespace
diff --git a/chromium/jingle/glue/chrome_async_socket.cc b/chromium/jingle/glue/chrome_async_socket.cc
index c14fb99b11e..39085e105f6 100644
--- a/chromium/jingle/glue/chrome_async_socket.cc
+++ b/chromium/jingle/glue/chrome_async_socket.cc
@@ -106,9 +106,9 @@ bool ChromeAsyncSocket::Connect(const talk_base::SocketAddress& address) {
net::HostPortPair dest_host_port_pair(address.hostname(), address.port());
- transport_socket_ =
+ transport_socket_.reset(
resolving_client_socket_factory_->CreateTransportClientSocket(
- dest_host_port_pair);
+ dest_host_port_pair));
int status = transport_socket_->Connect(
base::Bind(&ChromeAsyncSocket::ProcessConnectDone,
weak_ptr_factory_.GetWeakPtr()));
@@ -404,10 +404,10 @@ bool ChromeAsyncSocket::StartTls(const std::string& domain_name) {
DCHECK(transport_socket_.get());
scoped_ptr<net::ClientSocketHandle> socket_handle(
new net::ClientSocketHandle());
- socket_handle->SetSocket(transport_socket_.Pass());
- transport_socket_ =
+ socket_handle->set_socket(transport_socket_.release());
+ transport_socket_.reset(
resolving_client_socket_factory_->CreateSSLClientSocket(
- socket_handle.Pass(), net::HostPortPair(domain_name, 443));
+ socket_handle.release(), net::HostPortPair(domain_name, 443)));
int status = transport_socket_->Connect(
base::Bind(&ChromeAsyncSocket::ProcessSSLConnectDone,
weak_ptr_factory_.GetWeakPtr()));
diff --git a/chromium/jingle/glue/chrome_async_socket_unittest.cc b/chromium/jingle/glue/chrome_async_socket_unittest.cc
index db3d2b09c9f..ebb69a21aa6 100644
--- a/chromium/jingle/glue/chrome_async_socket_unittest.cc
+++ b/chromium/jingle/glue/chrome_async_socket_unittest.cc
@@ -113,20 +113,20 @@ class MockXmppClientSocketFactory : public ResolvingClientSocketFactory {
}
// ResolvingClientSocketFactory implementation.
- virtual scoped_ptr<net::StreamSocket> CreateTransportClientSocket(
+ virtual net::StreamSocket* CreateTransportClientSocket(
const net::HostPortPair& host_and_port) OVERRIDE {
return mock_client_socket_factory_->CreateTransportClientSocket(
address_list_, NULL, net::NetLog::Source());
}
- virtual scoped_ptr<net::SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<net::ClientSocketHandle> transport_socket,
+ virtual net::SSLClientSocket* CreateSSLClientSocket(
+ net::ClientSocketHandle* transport_socket,
const net::HostPortPair& host_and_port) OVERRIDE {
net::SSLClientSocketContext context;
context.cert_verifier = cert_verifier_.get();
context.transport_security_state = transport_security_state_.get();
return mock_client_socket_factory_->CreateSSLClientSocket(
- transport_socket.Pass(), host_and_port, ssl_config_, context);
+ transport_socket, host_and_port, ssl_config_, context);
}
private:
diff --git a/chromium/jingle/glue/fake_ssl_client_socket.cc b/chromium/jingle/glue/fake_ssl_client_socket.cc
index 9d722c7861b..bf6d12a7dcc 100644
--- a/chromium/jingle/glue/fake_ssl_client_socket.cc
+++ b/chromium/jingle/glue/fake_ssl_client_socket.cc
@@ -77,8 +77,8 @@ base::StringPiece FakeSSLClientSocket::GetSslServerHello() {
}
FakeSSLClientSocket::FakeSSLClientSocket(
- scoped_ptr<net::StreamSocket> transport_socket)
- : transport_socket_(transport_socket.Pass()),
+ net::StreamSocket* transport_socket)
+ : transport_socket_(transport_socket),
next_handshake_state_(STATE_NONE),
handshake_completed_(false),
write_buf_(NewDrainableIOBufferWithSize(arraysize(kSslClientHello))),
diff --git a/chromium/jingle/glue/fake_ssl_client_socket.h b/chromium/jingle/glue/fake_ssl_client_socket.h
index 54a9e2f2b1b..5bc4547d62b 100644
--- a/chromium/jingle/glue/fake_ssl_client_socket.h
+++ b/chromium/jingle/glue/fake_ssl_client_socket.h
@@ -36,7 +36,8 @@ namespace jingle_glue {
class FakeSSLClientSocket : public net::StreamSocket {
public:
- explicit FakeSSLClientSocket(scoped_ptr<net::StreamSocket> transport_socket);
+ // Takes ownership of |transport_socket|.
+ explicit FakeSSLClientSocket(net::StreamSocket* transport_socket);
virtual ~FakeSSLClientSocket();
diff --git a/chromium/jingle/glue/fake_ssl_client_socket_unittest.cc b/chromium/jingle/glue/fake_ssl_client_socket_unittest.cc
index f6d8fea5fb3..5c061f3774c 100644
--- a/chromium/jingle/glue/fake_ssl_client_socket_unittest.cc
+++ b/chromium/jingle/glue/fake_ssl_client_socket_unittest.cc
@@ -91,7 +91,7 @@ class FakeSSLClientSocketTest : public testing::Test {
virtual ~FakeSSLClientSocketTest() {}
- scoped_ptr<net::StreamSocket> MakeClientSocket() {
+ net::StreamSocket* MakeClientSocket() {
return mock_client_socket_factory_.CreateTransportClientSocket(
net::AddressList(), NULL, net::NetLog::Source());
}
@@ -269,7 +269,7 @@ class FakeSSLClientSocketTest : public testing::Test {
};
TEST_F(FakeSSLClientSocketTest, PassThroughMethods) {
- scoped_ptr<MockClientSocket> mock_client_socket(new MockClientSocket());
+ MockClientSocket* mock_client_socket = new MockClientSocket();
const int kReceiveBufferSize = 10;
const int kSendBufferSize = 20;
net::IPEndPoint ip_endpoint(net::IPAddressNumber(net::kIPv4AddressSize), 80);
@@ -284,8 +284,7 @@ TEST_F(FakeSSLClientSocketTest, PassThroughMethods) {
EXPECT_CALL(*mock_client_socket, SetOmniboxSpeculation());
// Takes ownership of |mock_client_socket|.
- FakeSSLClientSocket fake_ssl_client_socket(
- mock_client_socket.PassAs<net::StreamSocket>());
+ FakeSSLClientSocket fake_ssl_client_socket(mock_client_socket);
fake_ssl_client_socket.SetReceiveBufferSize(kReceiveBufferSize);
fake_ssl_client_socket.SetSendBufferSize(kSendBufferSize);
EXPECT_EQ(kPeerAddress,
diff --git a/chromium/jingle/glue/resolving_client_socket_factory.h b/chromium/jingle/glue/resolving_client_socket_factory.h
index d1b9fc1f389..5be8bc88c2d 100644
--- a/chromium/jingle/glue/resolving_client_socket_factory.h
+++ b/chromium/jingle/glue/resolving_client_socket_factory.h
@@ -5,7 +5,6 @@
#ifndef JINGLE_GLUE_RESOLVING_CLIENT_SOCKET_FACTORY_H_
#define JINGLE_GLUE_RESOLVING_CLIENT_SOCKET_FACTORY_H_
-#include "base/memory/scoped_ptr.h"
namespace net {
class ClientSocketHandle;
@@ -24,11 +23,11 @@ class ResolvingClientSocketFactory {
public:
virtual ~ResolvingClientSocketFactory() { }
// Method to create a transport socket using a HostPortPair.
- virtual scoped_ptr<net::StreamSocket> CreateTransportClientSocket(
+ virtual net::StreamSocket* CreateTransportClientSocket(
const net::HostPortPair& host_and_port) = 0;
- virtual scoped_ptr<net::SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<net::ClientSocketHandle> transport_socket,
+ virtual net::SSLClientSocket* CreateSSLClientSocket(
+ net::ClientSocketHandle* transport_socket,
const net::HostPortPair& host_and_port) = 0;
};
diff --git a/chromium/jingle/glue/xmpp_client_socket_factory.cc b/chromium/jingle/glue/xmpp_client_socket_factory.cc
index 4823ee5d9bd..b9e040d619f 100644
--- a/chromium/jingle/glue/xmpp_client_socket_factory.cc
+++ b/chromium/jingle/glue/xmpp_client_socket_factory.cc
@@ -8,7 +8,6 @@
#include "jingle/glue/fake_ssl_client_socket.h"
#include "jingle/glue/proxy_resolving_client_socket.h"
#include "net/socket/client_socket_factory.h"
-#include "net/socket/client_socket_handle.h"
#include "net/socket/ssl_client_socket.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h"
@@ -29,25 +28,20 @@ XmppClientSocketFactory::XmppClientSocketFactory(
XmppClientSocketFactory::~XmppClientSocketFactory() {}
-scoped_ptr<net::StreamSocket>
-XmppClientSocketFactory::CreateTransportClientSocket(
+net::StreamSocket* XmppClientSocketFactory::CreateTransportClientSocket(
const net::HostPortPair& host_and_port) {
// TODO(akalin): Use socket pools.
- scoped_ptr<net::StreamSocket> transport_socket(
- new ProxyResolvingClientSocket(
- NULL,
- request_context_getter_,
- ssl_config_,
- host_and_port));
+ net::StreamSocket* transport_socket = new ProxyResolvingClientSocket(
+ NULL,
+ request_context_getter_,
+ ssl_config_,
+ host_and_port);
return (use_fake_ssl_client_socket_ ?
- scoped_ptr<net::StreamSocket>(
- new FakeSSLClientSocket(transport_socket.Pass())) :
- transport_socket.Pass());
+ new FakeSSLClientSocket(transport_socket) : transport_socket);
}
-scoped_ptr<net::SSLClientSocket>
-XmppClientSocketFactory::CreateSSLClientSocket(
- scoped_ptr<net::ClientSocketHandle> transport_socket,
+net::SSLClientSocket* XmppClientSocketFactory::CreateSSLClientSocket(
+ net::ClientSocketHandle* transport_socket,
const net::HostPortPair& host_and_port) {
net::SSLClientSocketContext context;
context.cert_verifier =
@@ -58,7 +52,7 @@ XmppClientSocketFactory::CreateSSLClientSocket(
// TODO(rkn): context.server_bound_cert_service is NULL because the
// ServerBoundCertService class is not thread safe.
return client_socket_factory_->CreateSSLClientSocket(
- transport_socket.Pass(), host_and_port, ssl_config_, context);
+ transport_socket, host_and_port, ssl_config_, context);
}
diff --git a/chromium/jingle/glue/xmpp_client_socket_factory.h b/chromium/jingle/glue/xmpp_client_socket_factory.h
index 4204c1982e8..c2a0d6a5187 100644
--- a/chromium/jingle/glue/xmpp_client_socket_factory.h
+++ b/chromium/jingle/glue/xmpp_client_socket_factory.h
@@ -35,11 +35,11 @@ class XmppClientSocketFactory : public ResolvingClientSocketFactory {
virtual ~XmppClientSocketFactory();
// ResolvingClientSocketFactory implementation.
- virtual scoped_ptr<net::StreamSocket> CreateTransportClientSocket(
+ virtual net::StreamSocket* CreateTransportClientSocket(
const net::HostPortPair& host_and_port) OVERRIDE;
- virtual scoped_ptr<net::SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<net::ClientSocketHandle> transport_socket,
+ virtual net::SSLClientSocket* CreateSSLClientSocket(
+ net::ClientSocketHandle* transport_socket,
const net::HostPortPair& host_and_port) OVERRIDE;
private:
diff --git a/chromium/jingle/notifier/listener/push_notifications_subscribe_task.cc b/chromium/jingle/notifier/listener/push_notifications_subscribe_task.cc
index b069c9e4fc3..33f9949c7bf 100644
--- a/chromium/jingle/notifier/listener/push_notifications_subscribe_task.cc
+++ b/chromium/jingle/notifier/listener/push_notifications_subscribe_task.cc
@@ -43,6 +43,7 @@ int PushNotificationsSubscribeTask::ProcessStart() {
scoped_ptr<buzz::XmlElement> iq_stanza(
MakeSubscriptionMessage(subscriptions_, GetClient()->jid(),
task_id()));
+ std::string stanza_str = XmlElementToString(*iq_stanza.get());
DVLOG(1) << "Push notifications: Subscription stanza: "
<< XmlElementToString(*iq_stanza.get());
@@ -60,9 +61,10 @@ int PushNotificationsSubscribeTask::ProcessResponse() {
if (stanza == NULL) {
return STATE_BLOCKED;
}
+ std::string stanza_str = XmlElementToString(*stanza);
DVLOG(1) << "Push notifications: Subscription response: "
<< XmlElementToString(*stanza);
- // We've received a response to our subscription request.
+ // We've receieved a response to our subscription request.
if (stanza->HasAttr(buzz::QN_TYPE) &&
stanza->Attr(buzz::QN_TYPE) == buzz::STR_RESULT) {
if (delegate_)
diff --git a/chromium/media/audio/android/audio_manager_android.cc b/chromium/media/audio/android/audio_manager_android.cc
index 69bd2b82cd4..164344aba0b 100644
--- a/chromium/media/audio/android/audio_manager_android.cc
+++ b/chromium/media/audio/android/audio_manager_android.cc
@@ -59,11 +59,16 @@ void AudioManagerAndroid::GetAudioInputDeviceNames(
AudioParameters AudioManagerAndroid::GetInputStreamParameters(
const std::string& device_id) {
+ // Use mono as preferred number of input channels on Android to save
+ // resources. Using mono also avoids a driver issue seen on Samsung
+ // Galaxy S3 and S4 devices. See http://crbug.com/256851 for details.
+ ChannelLayout channel_layout = CHANNEL_LAYOUT_MONO;
int buffer_size = Java_AudioManagerAndroid_getMinInputFrameSize(
- base::android::AttachCurrentThread(), GetNativeOutputSampleRate(), 2);
+ base::android::AttachCurrentThread(), GetNativeOutputSampleRate(),
+ ChannelLayoutToChannelCount(channel_layout));
return AudioParameters(
- AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO,
+ AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout,
GetNativeOutputSampleRate(), 16,
buffer_size <= 0 ? kDefaultInputBufferSize : buffer_size);
}
diff --git a/chromium/media/audio/clockless_audio_sink.cc b/chromium/media/audio/clockless_audio_sink.cc
deleted file mode 100644
index ff809d0541d..00000000000
--- a/chromium/media/audio/clockless_audio_sink.cc
+++ /dev/null
@@ -1,107 +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 "media/audio/clockless_audio_sink.h"
-
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "media/base/audio_renderer_sink.h"
-
-namespace media {
-
-// Internal to ClocklessAudioSink. Class is used to call Render() on a seperate
-// thread, running as fast as it can read the data.
-class ClocklessAudioSinkThread : public base::DelegateSimpleThread::Delegate {
- public:
- explicit ClocklessAudioSinkThread(const AudioParameters& params,
- AudioRendererSink::RenderCallback* callback)
- : callback_(callback),
- audio_bus_(AudioBus::Create(params)),
- stop_event_(new base::WaitableEvent(false, false)) {}
-
- void Start() {
- stop_event_->Reset();
- thread_.reset(new base::DelegateSimpleThread(this, "ClocklessAudioSink"));
- thread_->Start();
- }
-
- // Generate a signal to stop calling Render().
- base::TimeDelta Stop() {
- stop_event_->Signal();
- thread_->Join();
- return playback_time_;
- }
-
- private:
- // Call Render() repeatedly, keeping track of the rendering time.
- virtual void Run() OVERRIDE {
- base::TimeTicks start;
- while (!stop_event_->IsSignaled()) {
- int frames_received = callback_->Render(audio_bus_.get(), 0);
- if (frames_received <= 0) {
- // No data received, so let other threads run to provide data.
- base::PlatformThread::YieldCurrentThread();
- } else if (start.is_null()) {
- // First time we processed some audio, so record the starting time.
- start = base::TimeTicks::HighResNow();
- } else {
- // Keep track of the last time data was rendered.
- playback_time_ = base::TimeTicks::HighResNow() - start;
- }
- }
- }
-
- AudioRendererSink::RenderCallback* callback_;
- scoped_ptr<AudioBus> audio_bus_;
- scoped_ptr<base::WaitableEvent> stop_event_;
- scoped_ptr<base::DelegateSimpleThread> thread_;
- base::TimeDelta playback_time_;
-};
-
-ClocklessAudioSink::ClocklessAudioSink()
- : initialized_(false),
- playing_(false) {}
-
-ClocklessAudioSink::~ClocklessAudioSink() {}
-
-void ClocklessAudioSink::Initialize(const AudioParameters& params,
- RenderCallback* callback) {
- DCHECK(!initialized_);
- thread_.reset(new ClocklessAudioSinkThread(params, callback));
- initialized_ = true;
-}
-
-void ClocklessAudioSink::Start() {
- DCHECK(!playing_);
-}
-
-void ClocklessAudioSink::Stop() {
- DCHECK(initialized_);
-
- if (!playing_)
- return;
-
- playback_time_ = thread_->Stop();
-}
-
-void ClocklessAudioSink::Play() {
- DCHECK(initialized_);
-
- if (playing_)
- return;
-
- playing_ = true;
- thread_->Start();
-}
-
-void ClocklessAudioSink::Pause() {
- Stop();
-}
-
-bool ClocklessAudioSink::SetVolume(double volume) {
- // Audio is always muted.
- return volume == 0.0;
-}
-
-} // namespace media
diff --git a/chromium/media/audio/clockless_audio_sink.h b/chromium/media/audio/clockless_audio_sink.h
deleted file mode 100644
index 9e73b1a8817..00000000000
--- a/chromium/media/audio/clockless_audio_sink.h
+++ /dev/null
@@ -1,55 +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 MEDIA_AUDIO_CLOCKLESS_AUDIO_SINK_H_
-#define MEDIA_AUDIO_CLOCKLESS_AUDIO_SINK_H_
-
-#include "base/memory/scoped_ptr.h"
-#include "base/time/time.h"
-#include "media/base/audio_renderer_sink.h"
-
-namespace base {
-class MessageLoopProxy;
-}
-
-namespace media {
-class AudioBus;
-class ClocklessAudioSinkThread;
-
-// Implementation of an AudioRendererSink that consumes the audio as fast as
-// possible. This class does not support multiple Play()/Pause() events.
-class MEDIA_EXPORT ClocklessAudioSink
- : NON_EXPORTED_BASE(public AudioRendererSink) {
- public:
- ClocklessAudioSink();
-
- // AudioRendererSink implementation.
- virtual void Initialize(const AudioParameters& params,
- RenderCallback* callback) OVERRIDE;
- virtual void Start() OVERRIDE;
- virtual void Stop() OVERRIDE;
- virtual void Pause() OVERRIDE;
- virtual void Play() OVERRIDE;
- virtual bool SetVolume(double volume) OVERRIDE;
-
- // Returns the time taken to consume all the audio.
- base::TimeDelta render_time() { return playback_time_; }
-
- protected:
- virtual ~ClocklessAudioSink();
-
- private:
- scoped_ptr<ClocklessAudioSinkThread> thread_;
- bool initialized_;
- bool playing_;
-
- // Time taken in last set of Render() calls.
- base::TimeDelta playback_time_;
-
- DISALLOW_COPY_AND_ASSIGN(ClocklessAudioSink);
-};
-
-} // namespace media
-
-#endif // MEDIA_AUDIO_CLOCKLESS_AUDIO_SINK_H_
diff --git a/chromium/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java b/chromium/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
index ed5d9478c55..9cce93dd7c4 100644
--- a/chromium/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
+++ b/chromium/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
@@ -29,6 +29,7 @@ class MediaCodecBridge {
// Error code for MediaCodecBridge. Keep this value in sync with
// INFO_MEDIA_CODEC_ERROR in media_codec_bridge.h.
+ private static final int MEDIA_CODEC_OK = 0;
private static final int MEDIA_CODEC_ERROR = -1000;
// After a flush(), dequeueOutputBuffer() can often produce empty presentation timestamps
@@ -115,12 +116,18 @@ class MediaCodecBridge {
}
@CalledByNative
- private void flush() {
- mMediaCodec.flush();
- mFlushed = true;
- if (mAudioTrack != null) {
- mAudioTrack.flush();
+ private int flush() {
+ try {
+ mFlushed = true;
+ if (mAudioTrack != null) {
+ mAudioTrack.flush();
+ }
+ mMediaCodec.flush();
+ } catch(IllegalStateException e) {
+ Log.e(TAG, "Failed to flush MediaCodec " + e.toString());
+ return MEDIA_CODEC_ERROR;
}
+ return MEDIA_CODEC_OK;
}
@CalledByNative
@@ -230,7 +237,7 @@ class MediaCodecBridge {
}
@CalledByNative
- private static void setCodecSpecificData(MediaFormat format, int index, ByteBuffer bytes) {
+ private static void setCodecSpecificData(MediaFormat format, int index, byte[] bytes) {
String name = null;
if (index == 0) {
name = "csd-0";
@@ -238,7 +245,7 @@ class MediaCodecBridge {
name = "csd-1";
}
if (name != null) {
- format.setByteBuffer(name, bytes);
+ format.setByteBuffer(name, ByteBuffer.wrap(bytes));
}
}
diff --git a/chromium/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java b/chromium/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
deleted file mode 100644
index 5f824fc6128..00000000000
--- a/chromium/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
+++ /dev/null
@@ -1,338 +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.
-
-package org.chromium.media;
-
-import android.media.MediaCrypto;
-import android.media.MediaDrm;
-import android.os.AsyncTask;
-import android.os.Handler;
-import android.util.Log;
-
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.util.EntityUtils;
-import org.chromium.base.CalledByNative;
-import org.chromium.base.JNINamespace;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.UUID;
-
-/**
- * A wrapper of the android MediaDrm class. Each MediaDrmBridge manages multiple
- * sessions for a single MediaSourcePlayer.
- */
-@JNINamespace("media")
-class MediaDrmBridge {
-
- private static final String TAG = "MediaDrmBridge";
- private MediaDrm mMediaDrm;
- private UUID mSchemeUUID;
- private int mNativeMediaDrmBridge;
- // TODO(qinmin): we currently only support one session per DRM bridge.
- // Change this to a HashMap if we start to support multiple sessions.
- private String mSessionId;
- private MediaCrypto mMediaCrypto;
- private String mMimeType;
- private Handler mhandler;
-
- private static UUID getUUIDFromBytes(byte[] data) {
- if (data.length != 16) {
- return null;
- }
- long mostSigBits = 0;
- long leastSigBits = 0;
- for (int i = 0; i < 8; i++) {
- mostSigBits = (mostSigBits << 8) | (data[i] & 0xff);
- }
- for (int i = 8; i < 16; i++) {
- leastSigBits = (leastSigBits << 8) | (data[i] & 0xff);
- }
- return new UUID(mostSigBits, leastSigBits);
- }
-
- private MediaDrmBridge(UUID schemeUUID, int nativeMediaDrmBridge) {
- try {
- mSchemeUUID = schemeUUID;
- mMediaDrm = new MediaDrm(schemeUUID);
- mNativeMediaDrmBridge = nativeMediaDrmBridge;
- mMediaDrm.setOnEventListener(new MediaDrmListener());
- mSessionId = openSession();
- mhandler = new Handler();
- } catch (android.media.UnsupportedSchemeException e) {
- Log.e(TAG, "Unsupported DRM scheme " + e.toString());
- }
- }
-
- /**
- * Open a new session and return the sessionId.
- *
- * @return ID of the session.
- */
- private String openSession() {
- String session = null;
- try {
- final byte[] sessionId = mMediaDrm.openSession();
- session = new String(sessionId, "UTF-8");
- } catch (android.media.NotProvisionedException e) {
- Log.e(TAG, "Cannot open a new session " + e.toString());
- } catch (java.io.UnsupportedEncodingException e) {
- Log.e(TAG, "Cannot open a new session " + e.toString());
- }
- return session;
- }
-
- /**
- * Create a new MediaDrmBridge from the crypto scheme UUID.
- *
- * @param schemeUUID Crypto scheme UUID.
- * @param nativeMediaDrmBridge Native object of this class.
- */
- @CalledByNative
- private static MediaDrmBridge create(byte[] schemeUUID, int nativeMediaDrmBridge) {
- UUID cryptoScheme = getUUIDFromBytes(schemeUUID);
- if (cryptoScheme != null && MediaDrm.isCryptoSchemeSupported(cryptoScheme)) {
- return new MediaDrmBridge(cryptoScheme, nativeMediaDrmBridge);
- }
- return null;
- }
-
- /**
- * Create a new MediaCrypto object from the session Id.
- *
- * @param sessionId Crypto session Id.
- */
- @CalledByNative
- private MediaCrypto getMediaCrypto() {
- if (mMediaCrypto != null) {
- return mMediaCrypto;
- }
- try {
- final byte[] session = mSessionId.getBytes("UTF-8");
- if (MediaCrypto.isCryptoSchemeSupported(mSchemeUUID)) {
- mMediaCrypto = new MediaCrypto(mSchemeUUID, session);
- }
- } catch (android.media.MediaCryptoException e) {
- Log.e(TAG, "Cannot create MediaCrypto " + e.toString());
- } catch (java.io.UnsupportedEncodingException e) {
- Log.e(TAG, "Cannot create MediaCrypto " + e.toString());
- }
- return mMediaCrypto;
- }
-
- /**
- * Release the MediaDrmBridge object.
- */
- @CalledByNative
- private void release() {
- if (mMediaCrypto != null) {
- mMediaCrypto.release();
- }
- if (mSessionId != null) {
- try {
- final byte[] session = mSessionId.getBytes("UTF-8");
- mMediaDrm.closeSession(session);
- } catch (java.io.UnsupportedEncodingException e) {
- Log.e(TAG, "Failed to close session " + e.toString());
- }
- }
- mMediaDrm.release();
- }
-
- /**
- * Generate a key request and post an asynchronous task to the native side
- * with the response message.
- *
- * @param initData Data needed to generate the key request.
- * @param mime Mime type.
- */
- @CalledByNative
- private void generateKeyRequest(byte[] initData, String mime) {
- if (mSessionId == null) {
- return;
- }
- try {
- final byte[] session = mSessionId.getBytes("UTF-8");
- mMimeType = mime;
- HashMap<String, String> optionalParameters = new HashMap<String, String>();
- final MediaDrm.KeyRequest request = mMediaDrm.getKeyRequest(
- session, initData, mime, MediaDrm.KEY_TYPE_STREAMING, optionalParameters);
- mhandler.post(new Runnable(){
- public void run() {
- nativeOnKeyMessage(mNativeMediaDrmBridge, mSessionId,
- request.getData(), request.getDefaultUrl());
- }
- });
- return;
- } catch (android.media.NotProvisionedException e) {
- Log.e(TAG, "Cannot get key request " + e.toString());
- } catch (java.io.UnsupportedEncodingException e) {
- Log.e(TAG, "Cannot get key request " + e.toString());
- }
- onKeyError();
- }
-
- /**
- * Cancel a key request for a session Id.
- *
- * @param sessionId Crypto session Id.
- */
- @CalledByNative
- private void cancelKeyRequest(String sessionId) {
- if (mSessionId == null || !mSessionId.equals(sessionId)) {
- return;
- }
- try {
- final byte[] session = sessionId.getBytes("UTF-8");
- mMediaDrm.removeKeys(session);
- } catch (java.io.UnsupportedEncodingException e) {
- Log.e(TAG, "Cannot cancel key request " + e.toString());
- }
- }
-
- /**
- * Add a key for a session Id.
- *
- * @param sessionId Crypto session Id.
- * @param key Response data from the server.
- */
- @CalledByNative
- private void addKey(String sessionId, byte[] key) {
- if (mSessionId == null || !mSessionId.equals(sessionId)) {
- return;
- }
- try {
- final byte[] session = sessionId.getBytes("UTF-8");
- mMediaDrm.provideKeyResponse(session, key);
- mhandler.post(new Runnable() {
- public void run() {
- nativeOnKeyAdded(mNativeMediaDrmBridge, mSessionId);
- }
- });
- return;
- } catch (android.media.NotProvisionedException e) {
- Log.e(TAG, "failed to provide key response " + e.toString());
- } catch (android.media.DeniedByServerException e) {
- Log.e(TAG, "failed to provide key response " + e.toString());
- } catch (java.io.UnsupportedEncodingException e) {
- Log.e(TAG, "failed to provide key response " + e.toString());
- }
- onKeyError();
- }
-
- /**
- * Called when the provision response is received.
- *
- * @param response Response data from the provision server.
- */
- private void onProvisionResponse(byte[] response) {
- try {
- mMediaDrm.provideProvisionResponse(response);
- } catch (android.media.DeniedByServerException e) {
- Log.e(TAG, "failed to provide key response " + e.toString());
- }
- }
-
- private void onKeyError() {
- // TODO(qinmin): pass the error code to native.
- mhandler.post(new Runnable() {
- public void run() {
- nativeOnKeyError(mNativeMediaDrmBridge, mSessionId);
- }
- });
- }
-
- private class MediaDrmListener implements MediaDrm.OnEventListener {
- @Override
- public void onEvent(MediaDrm mediaDrm, byte[] sessionId, int event, int extra,
- byte[] data) {
- switch(event) {
- case MediaDrm.EVENT_PROVISION_REQUIRED:
- MediaDrm.ProvisionRequest request = mMediaDrm.getProvisionRequest();
- PostRequestTask postTask = new PostRequestTask(request.getData());
- postTask.execute(request.getDefaultUrl());
- break;
- case MediaDrm.EVENT_KEY_REQUIRED:
- generateKeyRequest(data, mMimeType);
- break;
- case MediaDrm.EVENT_KEY_EXPIRED:
- onKeyError();
- break;
- case MediaDrm.EVENT_VENDOR_DEFINED:
- assert(false);
- break;
- default:
- Log.e(TAG, "Invalid DRM event " + (int)event);
- return;
- }
- }
- }
-
- private class PostRequestTask extends AsyncTask<String, Void, Void> {
- private static final String TAG = "PostRequestTask";
-
- private byte[] mDrmRequest;
- private byte[] mResponseBody;
-
- public PostRequestTask(byte[] drmRequest) {
- mDrmRequest = drmRequest;
- }
-
- @Override
- protected Void doInBackground(String... urls) {
- mResponseBody = postRequest(urls[0], mDrmRequest);
- if (mResponseBody != null) {
- Log.d(TAG, "response length=" + mResponseBody.length);
- }
- return null;
- }
-
- private byte[] postRequest(String url, byte[] drmRequest) {
- HttpClient httpClient = new DefaultHttpClient();
- HttpPost httpPost = new HttpPost(url + "&signedRequest=" + new String(drmRequest));
-
- Log.d(TAG, "PostRequest:" + httpPost.getRequestLine());
- try {
- // Add data
- httpPost.setHeader("Accept", "*/*");
- httpPost.setHeader("User-Agent", "Widevine CDM v1.0");
- httpPost.setHeader("Content-Type", "application/json");
-
- // Execute HTTP Post Request
- HttpResponse response = httpClient.execute(httpPost);
-
- byte[] responseBody;
- int responseCode = response.getStatusLine().getStatusCode();
- if (responseCode == 200) {
- responseBody = EntityUtils.toByteArray(response.getEntity());
- } else {
- Log.d(TAG, "Server returned HTTP error code " + responseCode);
- return null;
- }
- return responseBody;
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(Void v) {
- onProvisionResponse(mResponseBody);
- }
- }
-
- private native void nativeOnKeyMessage(int nativeMediaDrmBridge, String sessionId,
- byte[] message, String destinationUrl);
-
- private native void nativeOnKeyAdded(int nativeMediaDrmBridge, String sessionId);
-
- private native void nativeOnKeyError(int nativeMediaDrmBridge, String sessionId);
-}
diff --git a/chromium/media/base/android/java/src/org/chromium/media/VideoCapture.java b/chromium/media/base/android/java/src/org/chromium/media/VideoCapture.java
index f055f35ed68..df9eb4dcffb 100644
--- a/chromium/media/base/android/java/src/org/chromium/media/VideoCapture.java
+++ b/chromium/media/base/android/java/src/org/chromium/media/VideoCapture.java
@@ -100,6 +100,12 @@ public class VideoCapture implements PreviewCallback, OnFrameAvailableListener {
", height=" + height + ", frameRate=" + frameRate);
try {
mCamera = Camera.open(mId);
+ } catch (RuntimeException ex) {
+ Log.e(TAG, "allocate:Camera.open: " + ex);
+ return false;
+ }
+
+ try {
Camera.CameraInfo camera_info = new Camera.CameraInfo();
Camera.getCameraInfo(mId, camera_info);
mCameraOrientation = camera_info.orientation;
@@ -113,7 +119,7 @@ public class VideoCapture implements PreviewCallback, OnFrameAvailableListener {
// Calculate fps.
List<int[]> listFpsRange = parameters.getSupportedPreviewFpsRange();
- if (listFpsRange.size() == 0) {
+ if (listFpsRange == null || listFpsRange.size() == 0) {
Log.e(TAG, "allocate: no fps range found");
return false;
}
diff --git a/chromium/media/base/android/media_codec_bridge.cc b/chromium/media/base/android/media_codec_bridge.cc
index ab549367803..47ee5997160 100644
--- a/chromium/media/base/android/media_codec_bridge.cc
+++ b/chromium/media/base/android/media_codec_bridge.cc
@@ -94,9 +94,9 @@ void MediaCodecBridge::StartInternal() {
GetOutputBuffers();
}
-void MediaCodecBridge::Reset() {
+int MediaCodecBridge::Reset() {
JNIEnv* env = AttachCurrentThread();
- Java_MediaCodecBridge_flush(env, j_media_codec_.obj());
+ return Java_MediaCodecBridge_flush(env, j_media_codec_.obj());
}
void MediaCodecBridge::Stop() {
@@ -297,18 +297,16 @@ bool AudioCodecBridge::ConfigureMediaFormat(
}
current_pos++;
// The first header is identification header.
- jobject identification_header = env->NewDirectByteBuffer(
- const_cast<uint8*>(current_pos), header_length[0]);
+ ScopedJavaLocalRef<jbyteArray> first_header =
+ base::android::ToJavaByteArray(env, current_pos, header_length[0]);
Java_MediaCodecBridge_setCodecSpecificData(
- env, j_format, 0, identification_header);
+ env, j_format, 0, first_header.obj());
// The last header is codec header.
- jobject codec_header = env->NewDirectByteBuffer(
- const_cast<uint8*>(extra_data + total_length),
- extra_data_size - total_length);
+ ScopedJavaLocalRef<jbyteArray> last_header =
+ base::android::ToJavaByteArray(
+ env, extra_data + total_length, extra_data_size - total_length);
Java_MediaCodecBridge_setCodecSpecificData(
- env, j_format, 1, codec_header);
- env->DeleteLocalRef(codec_header);
- env->DeleteLocalRef(identification_header);
+ env, j_format, 1, last_header.obj());
break;
}
case kCodecAAC:
@@ -339,16 +337,18 @@ bool AudioCodecBridge::ConfigureMediaFormat(
LOG(ERROR) << "Invalid AAC header";
return false;
}
- uint8 csd[2];
+ const size_t kCsdLength = 2;
+ uint8 csd[kCsdLength];
csd[0] = profile << 3 | frequency_index >> 1;
csd[1] = (frequency_index & 0x01) << 7 | channel_config << 3;
- jobject header = env->NewDirectByteBuffer(csd, 2);
+ ScopedJavaLocalRef<jbyteArray> byte_array =
+ base::android::ToJavaByteArray(env, csd, kCsdLength);
Java_MediaCodecBridge_setCodecSpecificData(
- env, j_format, 0, header);
+ env, j_format, 0, byte_array.obj());
+
// TODO(qinmin): pass an extra variable to this function to determine
// whether we need to call this.
Java_MediaCodecBridge_setFrameHasADTSHeader(env, j_format);
- env->DeleteLocalRef(header);
break;
}
default:
diff --git a/chromium/media/base/android/media_codec_bridge.h b/chromium/media/base/android/media_codec_bridge.h
index 3469b1804e7..a0edcb9e693 100644
--- a/chromium/media/base/android/media_codec_bridge.h
+++ b/chromium/media/base/android/media_codec_bridge.h
@@ -45,7 +45,9 @@ class MEDIA_EXPORT MediaCodecBridge {
// DequeueInputBuffer() and DequeueOutputBuffer() become invalid.
// Please note that this clears all the inputs in the media codec. In other
// words, there will be no outputs until new input is provided.
- void Reset();
+ // Returns MEDIA_CODEC_ERROR if an unexpected error happens, or Media_CODEC_OK
+ // otherwise.
+ int Reset();
// Finishes the decode/encode session. The instance remains active
// and ready to be StartAudio/Video()ed again. HOWEVER, due to the buggy
diff --git a/chromium/media/base/android/media_drm_bridge.cc b/chromium/media/base/android/media_drm_bridge.cc
index 9ac62ca6f48..ee4fbbdf115 100644
--- a/chromium/media/base/android/media_drm_bridge.cc
+++ b/chromium/media/base/android/media_drm_bridge.cc
@@ -4,15 +4,11 @@
#include "media/base/android/media_drm_bridge.h"
-#include "base/android/build_info.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/logging.h"
-#include "jni/MediaDrmBridge_jni.h"
#include "media/base/android/media_player_manager.h"
-using base::android::AttachCurrentThread;
-using base::android::ConvertUTF8ToJavaString;
using base::android::ConvertJavaStringToUTF8;
using base::android::JavaByteArrayToByteVector;
using base::android::ScopedJavaLocalRef;
@@ -139,83 +135,53 @@ static bool GetPsshData(const uint8* data, int data_size,
}
// static
+bool MediaDrmBridge::IsAvailable() {
+ return false;
+}
+
MediaDrmBridge* MediaDrmBridge::Create(int media_keys_id,
- const std::vector<uint8>& scheme_uuid,
+ const std::vector<uint8>& uuid,
MediaPlayerManager* manager) {
- if (!IsAvailable() || scheme_uuid.empty())
+ if (!IsAvailable())
return NULL;
// TODO(qinmin): check whether the uuid is valid.
- return new MediaDrmBridge(media_keys_id, scheme_uuid, manager);
-}
-
-bool MediaDrmBridge::IsAvailable() {
- return base::android::BuildInfo::GetInstance()->sdk_int() >= 18;
-}
-
-bool MediaDrmBridge::RegisterMediaDrmBridge(JNIEnv* env) {
- return RegisterNativesImpl(env);
+ return new MediaDrmBridge(media_keys_id, uuid, manager);
}
MediaDrmBridge::MediaDrmBridge(int media_keys_id,
- const std::vector<uint8>& scheme_uuid,
+ const std::vector<uint8>& uuid,
MediaPlayerManager* manager)
- : media_keys_id_(media_keys_id),
- scheme_uuid_(scheme_uuid),
- manager_(manager) {
- JNIEnv* env = AttachCurrentThread();
- CHECK(env);
-
- ScopedJavaLocalRef<jbyteArray> j_scheme_uuid =
- base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size());
- j_media_drm_.Reset(Java_MediaDrmBridge_create(
- env, j_scheme_uuid.obj(), reinterpret_cast<intptr_t>(this)));
+ : media_keys_id_(media_keys_id), uuid_(uuid), manager_(manager) {
+ // TODO(qinmin): pass the uuid to DRM engine.
}
-MediaDrmBridge::~MediaDrmBridge() {
- JNIEnv* env = AttachCurrentThread();
- Java_MediaDrmBridge_release(env, j_media_drm_.obj());
-}
+MediaDrmBridge::~MediaDrmBridge() {}
bool MediaDrmBridge::GenerateKeyRequest(const std::string& type,
const uint8* init_data,
int init_data_length) {
std::vector<uint8> pssh_data;
- if (!GetPsshData(init_data, init_data_length, scheme_uuid_, &pssh_data))
+ if (!GetPsshData(init_data, init_data_length, uuid_, &pssh_data))
return false;
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jbyteArray> j_pssh_data =
- base::android::ToJavaByteArray(env, &pssh_data[0], pssh_data.size());
- ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, type);
- Java_MediaDrmBridge_generateKeyRequest(
- env, j_media_drm_.obj(), j_pssh_data.obj(), j_mime.obj());
- return true;
+ NOTIMPLEMENTED();
+ return false;
+}
+
+void MediaDrmBridge::CancelKeyRequest(const std::string& session_id) {
+ NOTIMPLEMENTED();
}
void MediaDrmBridge::AddKey(const uint8* key, int key_length,
const uint8* init_data, int init_data_length,
const std::string& session_id) {
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jbyteArray> j_key_data =
- base::android::ToJavaByteArray(env, key, key_length);
- ScopedJavaLocalRef<jstring> j_session_id =
- ConvertUTF8ToJavaString(env, session_id);
- Java_MediaDrmBridge_addKey(
- env, j_media_drm_.obj(), j_session_id.obj(), j_key_data.obj());
+ NOTIMPLEMENTED();
}
ScopedJavaLocalRef<jobject> MediaDrmBridge::GetMediaCrypto() {
- JNIEnv* env = AttachCurrentThread();
- return Java_MediaDrmBridge_getMediaCrypto(env, j_media_drm_.obj());
-}
-
-void MediaDrmBridge::CancelKeyRequest(const std::string& session_id) {
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jstring> j_session_id =
- ConvertUTF8ToJavaString(env, session_id);
- Java_MediaDrmBridge_cancelKeyRequest(
- env, j_media_drm_.obj(), j_session_id.obj());
+ NOTIMPLEMENTED();
+ return ScopedJavaLocalRef<jobject>();
}
void MediaDrmBridge::OnKeyMessage(JNIEnv* env,
@@ -231,14 +197,13 @@ void MediaDrmBridge::OnKeyMessage(JNIEnv* env,
manager_->OnKeyMessage(media_keys_id_, session_id, message, destination_url);
}
-void MediaDrmBridge::OnKeyAdded(JNIEnv* env, jobject, jstring j_session_id) {
- std::string session_id = ConvertJavaStringToUTF8(env, j_session_id);
- manager_->OnKeyAdded(media_keys_id_, session_id);
-}
-
-void MediaDrmBridge::OnKeyError(JNIEnv* env, jobject, jstring j_session_id) {
- std::string session_id = ConvertJavaStringToUTF8(env, j_session_id);
- manager_->OnKeyError(media_keys_id_, session_id, MediaKeys::kUnknownError, 0);
+void MediaDrmBridge::OnDrmEvent(JNIEnv* env,
+ jobject j_media_drm,
+ jstring session_id,
+ jint event,
+ jint extra,
+ jstring data) {
+ NOTIMPLEMENTED();
}
} // namespace media
diff --git a/chromium/media/base/android/media_drm_bridge.h b/chromium/media/base/android/media_drm_bridge.h
index 26e64372684..42b67909ca7 100644
--- a/chromium/media/base/android/media_drm_bridge.h
+++ b/chromium/media/base/android/media_drm_bridge.h
@@ -23,17 +23,15 @@ class MEDIA_EXPORT MediaDrmBridge : public MediaKeys {
public:
virtual ~MediaDrmBridge();
- // Returns a MediaDrmBridge instance if |scheme_uuid| is supported, or a NULL
+ // Returns a MediaDrmBridge instance if |uuid| is supported, or a NULL
// pointer otherwise.
static MediaDrmBridge* Create(int media_keys_id,
- const std::vector<uint8>& scheme_uuid,
+ const std::vector<uint8>& uuid,
MediaPlayerManager* manager);
- // Checks whether MediaDRM is available.
+ // Checks whether DRM is available.
static bool IsAvailable();
- static bool RegisterMediaDrmBridge(JNIEnv* env);
-
// MediaKeys implementations.
virtual bool GenerateKeyRequest(const std::string& type,
const uint8* init_data,
@@ -43,16 +41,14 @@ class MEDIA_EXPORT MediaDrmBridge : public MediaKeys {
const std::string& session_id) OVERRIDE;
virtual void CancelKeyRequest(const std::string& session_id) OVERRIDE;
+ // Drm related message was received.
+ void OnDrmEvent(JNIEnv* env, jobject, jstring session_id,
+ jint event, jint extra, jstring data);
+
// Called after we got the response for GenerateKeyRequest().
- void OnKeyMessage(JNIEnv* env, jobject, jstring j_session_id,
+ void OnKeyMessage(JNIEnv* env, jobject, jstring session_id,
jbyteArray message, jstring destination_url);
- // Called when key is added.
- void OnKeyAdded(JNIEnv* env, jobject, jstring j_session_id);
-
- // Called when error happens.
- void OnKeyError(JNIEnv* env, jobject, jstring j_session_id);
-
// Methods to create and release a MediaCrypto object.
base::android::ScopedJavaLocalRef<jobject> GetMediaCrypto();
@@ -60,17 +56,14 @@ class MEDIA_EXPORT MediaDrmBridge : public MediaKeys {
private:
MediaDrmBridge(int media_keys_id,
- const std::vector<uint8>& scheme_uuid,
+ const std::vector<uint8>& uuid,
MediaPlayerManager* manager);
- // ID of the MediaKeys object.
+ // Id of the MediaKeys object.
int media_keys_id_;
// UUID of the key system.
- std::vector<uint8> scheme_uuid_;
-
- // Java MediaDrm instance.
- base::android::ScopedJavaGlobalRef<jobject> j_media_drm_;
+ std::vector<uint8> uuid_;
// Non-owned pointer.
MediaPlayerManager* manager_;
diff --git a/chromium/media/base/android/media_jni_registrar.cc b/chromium/media/base/android/media_jni_registrar.cc
index b7d48ca0737..93a46c3b545 100644
--- a/chromium/media/base/android/media_jni_registrar.cc
+++ b/chromium/media/base/android/media_jni_registrar.cc
@@ -10,7 +10,6 @@
#include "media/audio/android/audio_manager_android.h"
#include "media/base/android/media_codec_bridge.h"
-#include "media/base/android/media_drm_bridge.h"
#include "media/base/android/media_player_bridge.h"
#include "media/base/android/media_player_listener.h"
#include "media/base/android/webaudio_media_codec_bridge.h"
@@ -23,8 +22,6 @@ static base::android::RegistrationMethod kMediaRegisteredMethods[] = {
AudioManagerAndroid::RegisterAudioManager },
{ "MediaCodecBridge",
MediaCodecBridge::RegisterMediaCodecBridge },
- { "MediaDrmBridge",
- MediaDrmBridge::RegisterMediaDrmBridge },
{ "MediaPlayerBridge",
MediaPlayerBridge::RegisterMediaPlayerBridge },
{ "MediaPlayerListener",
diff --git a/chromium/media/base/android/media_source_player.cc b/chromium/media/base/android/media_source_player.cc
index 19dc446f2e8..3af8a2b0d3c 100644
--- a/chromium/media/base/android/media_source_player.cc
+++ b/chromium/media/base/android/media_source_player.cc
@@ -161,7 +161,12 @@ void MediaDecoderJob::DecodeInternal(
if (needs_flush) {
DVLOG(1) << "DecodeInternal needs flush.";
input_eos_encountered_ = false;
- media_codec_bridge_->Reset();
+ int reset_status = media_codec_bridge_->Reset();
+ if (0 != reset_status) {
+ ui_loop_->PostTask(FROM_HERE, base::Bind(
+ callback, DECODE_FAILED, start_presentation_timestamp, 0));
+ return;
+ }
}
DecodeStatus decode_status = DECODE_INPUT_END_OF_STREAM;
@@ -847,11 +852,11 @@ void MediaSourcePlayer::ConfigureVideoDecoderJob() {
if (video_decoder_job_ && !reconfig_video_decoder_)
return;
- base::android::ScopedJavaLocalRef<jobject> media_crypto;
+ base::android::ScopedJavaLocalRef<jobject> media_codec;
if (is_video_encrypted_) {
if (drm_bridge_) {
- media_crypto = drm_bridge_->GetMediaCrypto();
- DCHECK(!media_crypto.is_null());
+ media_codec = drm_bridge_->GetMediaCrypto();
+ DCHECK(!media_codec.is_null());
} else {
LOG(INFO) << "MediaDrmBridge is not available when creating decoder "
<< "for encrypted video stream.";
@@ -865,7 +870,7 @@ void MediaSourcePlayer::ConfigureVideoDecoderJob() {
// Create the new VideoDecoderJob.
video_decoder_job_.reset(VideoDecoderJob::Create(
video_codec_, gfx::Size(width_, height_), surface_.j_surface().obj(),
- media_crypto.obj()));
+ media_codec.obj()));
if (video_decoder_job_)
reconfig_video_decoder_ = false;
diff --git a/chromium/media/base/run_all_unittests.cc b/chromium/media/base/run_all_unittests.cc
index 4274634d0b7..28ef5c68f7a 100644
--- a/chromium/media/base/run_all_unittests.cc
+++ b/chromium/media/base/run_all_unittests.cc
@@ -11,6 +11,7 @@
#if defined(OS_ANDROID)
#include "base/android/jni_android.h"
#include "media/base/android/media_jni_registrar.h"
+#include "ui/gl/android/gl_jni_registrar.h"
#endif
class TestSuiteNoAtExit : public base::TestSuite {
@@ -28,6 +29,8 @@ void TestSuiteNoAtExit::Initialize() {
#if defined(OS_ANDROID)
// Register JNI bindings for android.
JNIEnv* env = base::android::AttachCurrentThread();
+ // Needed for surface texture support.
+ ui::gl::android::RegisterJni(env);
media::RegisterJni(env);
#endif
diff --git a/chromium/media/ffmpeg/ffmpeg_regression_tests.cc b/chromium/media/ffmpeg/ffmpeg_regression_tests.cc
index a780d432e98..19f00f81aef 100644
--- a/chromium/media/ffmpeg/ffmpeg_regression_tests.cc
+++ b/chromium/media/ffmpeg/ffmpeg_regression_tests.cc
@@ -359,7 +359,7 @@ FLAKY_FFMPEG_TEST_CASE(WEBM_2, "security/uninitialize.webm");
TEST_P(FFmpegRegressionTest, BasicPlayback) {
if (GetParam().init_status == PIPELINE_OK) {
ASSERT_TRUE(Start(GetTestDataFilePath(GetParam().filename),
- GetParam().init_status, kHashed));
+ GetParam().init_status, true));
Play();
ASSERT_EQ(WaitUntilEndedOrError(), GetParam().end_status);
EXPECT_EQ(GetParam().video_md5, GetVideoHash());
@@ -374,7 +374,7 @@ TEST_P(FFmpegRegressionTest, BasicPlayback) {
}
} else {
ASSERT_FALSE(Start(GetTestDataFilePath(GetParam().filename),
- GetParam().init_status, kHashed));
+ GetParam().init_status, true));
EXPECT_EQ(GetParam().video_md5, GetVideoHash());
EXPECT_EQ(GetParam().audio_md5, GetAudioHash());
}
diff --git a/chromium/media/filters/ffmpeg_audio_decoder.cc b/chromium/media/filters/ffmpeg_audio_decoder.cc
index 53dec642269..1c0cc58ecd9 100644
--- a/chromium/media/filters/ffmpeg_audio_decoder.cc
+++ b/chromium/media/filters/ffmpeg_audio_decoder.cc
@@ -354,6 +354,13 @@ bool FFmpegAudioDecoder::ConfigureDecoder() {
// Store initial values to guard against midstream configuration changes.
channels_ = codec_context_->channels;
+ if (channels_ != ChannelLayoutToChannelCount(channel_layout_)) {
+ DLOG(ERROR) << "Audio configuration specified "
+ << ChannelLayoutToChannelCount(channel_layout_)
+ << " channels, but FFmpeg thinks the file contains "
+ << channels_ << " channels";
+ return false;
+ }
av_sample_format_ = codec_context_->sample_fmt;
sample_format_ = AVSampleFormatToSampleFormat(
static_cast<AVSampleFormat>(av_sample_format_));
diff --git a/chromium/media/filters/gpu_video_decoder.cc b/chromium/media/filters/gpu_video_decoder.cc
index cecd55ec4da..30c6dfa94f5 100644
--- a/chromium/media/filters/gpu_video_decoder.cc
+++ b/chromium/media/filters/gpu_video_decoder.cc
@@ -17,7 +17,7 @@
#include "media/base/pipeline.h"
#include "media/base/pipeline_status.h"
#include "media/base/video_decoder_config.h"
-#include "media/filters/gpu_video_accelerator_factories.h"
+#include "media/filters/gpu_video_decoder_factories.h"
namespace media {
@@ -52,7 +52,7 @@ GpuVideoDecoder::BufferData::BufferData(
GpuVideoDecoder::BufferData::~BufferData() {}
GpuVideoDecoder::GpuVideoDecoder(
- const scoped_refptr<GpuVideoAcceleratorFactories>& factories)
+ const scoped_refptr<GpuVideoDecoderFactories>& factories)
: needs_bitstream_conversion_(false),
gvd_loop_proxy_(factories->GetMessageLoop()),
weak_factory_(this),
@@ -173,8 +173,7 @@ void GpuVideoDecoder::Initialize(const VideoDecoderConfig& config,
return;
}
- vda_ =
- factories_->CreateVideoDecodeAccelerator(config.profile(), this).Pass();
+ vda_.reset(factories_->CreateVideoDecodeAccelerator(config.profile(), this));
if (!vda_) {
status_cb.Run(DECODER_ERROR_NOT_SUPPORTED);
return;
@@ -436,7 +435,7 @@ void GpuVideoDecoder::PictureReady(const media::Picture& picture) {
visible_rect,
natural_size,
timestamp,
- base::Bind(&GpuVideoAcceleratorFactories::ReadPixels,
+ base::Bind(&GpuVideoDecoderFactories::ReadPixels,
factories_,
pb.texture_id(),
decoder_texture_target_,
diff --git a/chromium/media/filters/gpu_video_decoder.h b/chromium/media/filters/gpu_video_decoder.h
index 2911e87c84e..29c330d2141 100644
--- a/chromium/media/filters/gpu_video_decoder.h
+++ b/chromium/media/filters/gpu_video_decoder.h
@@ -26,7 +26,7 @@ class SharedMemory;
namespace media {
class DecoderBuffer;
-class GpuVideoAcceleratorFactories;
+class GpuVideoDecoderFactories;
// GPU-accelerated video decoder implementation. Relies on
// AcceleratedVideoDecoderMsg_Decode and friends.
@@ -36,7 +36,7 @@ class MEDIA_EXPORT GpuVideoDecoder
public:
// The message loop of |factories| will be saved to |gvd_loop_proxy_|.
explicit GpuVideoDecoder(
- const scoped_refptr<GpuVideoAcceleratorFactories>& factories);
+ const scoped_refptr<GpuVideoDecoderFactories>& factories);
// VideoDecoder implementation.
virtual void Initialize(const VideoDecoderConfig& config,
@@ -117,7 +117,7 @@ class MEDIA_EXPORT GpuVideoDecoder
base::WeakPtrFactory<GpuVideoDecoder> weak_factory_;
base::WeakPtr<GpuVideoDecoder> weak_this_;
- scoped_refptr<GpuVideoAcceleratorFactories> factories_;
+ scoped_refptr<GpuVideoDecoderFactories> factories_;
// Populated during Initialize() (on success) and unchanged until an error
// occurs.
diff --git a/chromium/media/video/video_encode_accelerator.cc b/chromium/media/filters/gpu_video_decoder_factories.cc
index 6309180bceb..67d24ce3773 100644
--- a/chromium/media/video/video_encode_accelerator.cc
+++ b/chromium/media/filters/gpu_video_decoder_factories.cc
@@ -2,10 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "media/video/video_encode_accelerator.h"
+#include "media/filters/gpu_video_decoder_factories.h"
namespace media {
-VideoEncodeAccelerator::~VideoEncodeAccelerator() {}
+GpuVideoDecoderFactories::~GpuVideoDecoderFactories() {}
} // namespace media
diff --git a/chromium/media/filters/gpu_video_accelerator_factories.h b/chromium/media/filters/gpu_video_decoder_factories.h
index 3ee79ac6a5c..107e2de8c3b 100644
--- a/chromium/media/filters/gpu_video_accelerator_factories.h
+++ b/chromium/media/filters/gpu_video_decoder_factories.h
@@ -2,13 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef MEDIA_FILTERS_GPU_VIDEO_ACCELERATOR_FACTORIES_H_
-#define MEDIA_FILTERS_GPU_VIDEO_ACCELERATOR_FACTORIES_H_
+#ifndef MEDIA_FILTERS_GPU_VIDEO_DECODER_FACTORIES_H_
+#define MEDIA_FILTERS_GPU_VIDEO_DECODER_FACTORIES_H_
#include "base/memory/ref_counted.h"
-#include "base/memory/scoped_ptr.h"
#include "media/video/video_decode_accelerator.h"
-#include "media/video/video_encode_accelerator.h"
namespace base {
class MessageLoopProxy;
@@ -20,19 +18,15 @@ class SkBitmap;
namespace media {
// Helper interface for specifying factories needed to instantiate a hardware
-// video accelerator.
-class MEDIA_EXPORT GpuVideoAcceleratorFactories
- : public base::RefCountedThreadSafe<GpuVideoAcceleratorFactories> {
+// video decoder.
+class MEDIA_EXPORT GpuVideoDecoderFactories
+ : public base::RefCountedThreadSafe<GpuVideoDecoderFactories> {
public:
// Caller owns returned pointer.
- virtual scoped_ptr<VideoDecodeAccelerator> CreateVideoDecodeAccelerator(
+ virtual VideoDecodeAccelerator* CreateVideoDecodeAccelerator(
VideoCodecProfile profile,
VideoDecodeAccelerator::Client* client) = 0;
- // Caller owns returned pointer.
- virtual scoped_ptr<VideoEncodeAccelerator> CreateVideoEncodeAccelerator(
- VideoEncodeAccelerator::Client* client) = 0;
-
// Allocate & delete native textures.
virtual uint32 CreateTextures(int32 count,
const gfx::Size& size,
@@ -53,7 +47,7 @@ class MEDIA_EXPORT GpuVideoAcceleratorFactories
// Close()ing the returned pointer.
virtual base::SharedMemory* CreateSharedMemory(size_t size) = 0;
- // Returns the message loop the video accelerator runs on.
+ // Returns the message loop the VideoDecodeAccelerator runs on.
virtual scoped_refptr<base::MessageLoopProxy> GetMessageLoop() = 0;
// Abort any outstanding factory operations and error any future
@@ -64,10 +58,10 @@ class MEDIA_EXPORT GpuVideoAcceleratorFactories
virtual bool IsAborted() = 0;
protected:
- friend class base::RefCountedThreadSafe<GpuVideoAcceleratorFactories>;
- virtual ~GpuVideoAcceleratorFactories();
+ friend class base::RefCountedThreadSafe<GpuVideoDecoderFactories>;
+ virtual ~GpuVideoDecoderFactories();
};
} // namespace media
-#endif // MEDIA_FILTERS_GPU_VIDEO_ACCELERATOR_FACTORIES_H_
+#endif // MEDIA_FILTERS_GPU_VIDEO_DECODER_FACTORIES_H_
diff --git a/chromium/media/filters/mock_gpu_video_accelerator_factories.cc b/chromium/media/filters/mock_gpu_video_accelerator_factories.cc
deleted file mode 100644
index f4f39973600..00000000000
--- a/chromium/media/filters/mock_gpu_video_accelerator_factories.cc
+++ /dev/null
@@ -1,28 +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 "media/filters/mock_gpu_video_accelerator_factories.h"
-
-namespace media {
-
-MockGpuVideoAcceleratorFactories::MockGpuVideoAcceleratorFactories() {}
-
-MockGpuVideoAcceleratorFactories::~MockGpuVideoAcceleratorFactories() {}
-
-scoped_ptr<VideoDecodeAccelerator>
-MockGpuVideoAcceleratorFactories::CreateVideoDecodeAccelerator(
- VideoCodecProfile profile,
- VideoDecodeAccelerator::Client* client) {
- return scoped_ptr<VideoDecodeAccelerator>(
- DoCreateVideoDecodeAccelerator(profile, client));
-}
-
-scoped_ptr<VideoEncodeAccelerator>
-MockGpuVideoAcceleratorFactories::CreateVideoEncodeAccelerator(
- VideoEncodeAccelerator::Client* client) {
- return scoped_ptr<VideoEncodeAccelerator>(
- DoCreateVideoEncodeAccelerator(client));
-}
-
-} // namespace media
diff --git a/chromium/media/filters/gpu_video_accelerator_factories.cc b/chromium/media/filters/mock_gpu_video_decoder_factories.cc
index f9f56604d25..9a16a802c9d 100644
--- a/chromium/media/filters/gpu_video_accelerator_factories.cc
+++ b/chromium/media/filters/mock_gpu_video_decoder_factories.cc
@@ -2,10 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "media/filters/gpu_video_accelerator_factories.h"
+#include "media/filters/mock_gpu_video_decoder_factories.h"
namespace media {
-GpuVideoAcceleratorFactories::~GpuVideoAcceleratorFactories() {}
+MockGpuVideoDecoderFactories::MockGpuVideoDecoderFactories() {}
+
+MockGpuVideoDecoderFactories::~MockGpuVideoDecoderFactories() {}
} // namespace media
diff --git a/chromium/media/filters/mock_gpu_video_accelerator_factories.h b/chromium/media/filters/mock_gpu_video_decoder_factories.h
index 8aa432d8cfc..e0ad274b66f 100644
--- a/chromium/media/filters/mock_gpu_video_accelerator_factories.h
+++ b/chromium/media/filters/mock_gpu_video_decoder_factories.h
@@ -2,14 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef MEDIA_FILTERS_MOCK_GPU_VIDEO_ACCELERATOR_FACTORIES_H_
-#define MEDIA_FILTERS_MOCK_GPU_VIDEO_ACCELERATOR_FACTORIES_H_
+#ifndef MEDIA_FILTERS_MOCK_GPU_VIDEO_DECODER_FACTORIES_H_
+#define MEDIA_FILTERS_MOCK_GPU_VIDEO_DECODER_FACTORIES_H_
-#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop_proxy.h"
-#include "media/filters/gpu_video_accelerator_factories.h"
+#include "media/filters/gpu_video_decoder_factories.h"
#include "media/video/video_decode_accelerator.h"
-#include "media/video/video_encode_accelerator.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/skia/include/core/SkBitmap.h"
@@ -22,18 +20,12 @@ class SharedMemory;
namespace media {
-class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories {
+class MockGpuVideoDecoderFactories : public GpuVideoDecoderFactories {
public:
- MockGpuVideoAcceleratorFactories();
-
- // CreateVideo{Decode,Encode}Accelerator returns scoped_ptr, which the mocking
- // framework does not want. Trampoline them.
- MOCK_METHOD2(DoCreateVideoDecodeAccelerator,
+ MockGpuVideoDecoderFactories();
+ MOCK_METHOD2(CreateVideoDecodeAccelerator,
VideoDecodeAccelerator*(VideoCodecProfile,
VideoDecodeAccelerator::Client*));
- MOCK_METHOD1(DoCreateVideoEncodeAccelerator,
- VideoEncodeAccelerator*(VideoEncodeAccelerator::Client*));
-
MOCK_METHOD5(CreateTextures,
uint32(int32 count,
const gfx::Size& size,
@@ -52,19 +44,12 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories {
MOCK_METHOD0(Abort, void());
MOCK_METHOD0(IsAborted, bool());
- virtual scoped_ptr<VideoDecodeAccelerator> CreateVideoDecodeAccelerator(
- VideoCodecProfile profile,
- VideoDecodeAccelerator::Client* client) OVERRIDE;
-
- virtual scoped_ptr<VideoEncodeAccelerator> CreateVideoEncodeAccelerator(
- VideoEncodeAccelerator::Client* client) OVERRIDE;
-
private:
- virtual ~MockGpuVideoAcceleratorFactories();
+ virtual ~MockGpuVideoDecoderFactories();
- DISALLOW_COPY_AND_ASSIGN(MockGpuVideoAcceleratorFactories);
+ DISALLOW_COPY_AND_ASSIGN(MockGpuVideoDecoderFactories);
};
} // namespace media
-#endif // MEDIA_FILTERS_MOCK_GPU_VIDEO_ACCELERATOR_FACTORIES_H_
+#endif // MEDIA_FILTERS_MOCK_GPU_VIDEO_DECODER_FACTORIES_H_
diff --git a/chromium/media/filters/pipeline_integration_test.cc b/chromium/media/filters/pipeline_integration_test.cc
index 954fec0e9a8..26f65b96024 100644
--- a/chromium/media/filters/pipeline_integration_test.cc
+++ b/chromium/media/filters/pipeline_integration_test.cc
@@ -5,7 +5,6 @@
#include "media/filters/pipeline_integration_test_base.h"
#include "base/bind.h"
-#include "base/command_line.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string_util.h"
#include "build/build_config.h"
@@ -59,9 +58,6 @@ static const int k1280IsoFileDurationMs = 2736;
static const int kVP9WebMFileDurationMs = 2735;
static const int kVP8AWebMFileDurationMs = 2700;
-// Command line switch for runtime adjustment of audio file to be benchmarked.
-static const char kBenchmarkAudioFile[] = "benchmark-audio-file";
-
// Note: Tests using this class only exercise the DecryptingDemuxerStream path.
// They do not exercise the Decrypting{Audio|Video}Decoder path.
class FakeEncryptedMedia {
@@ -407,8 +403,8 @@ TEST_F(PipelineIntegrationTest, BasicPlayback) {
}
TEST_F(PipelineIntegrationTest, BasicPlaybackHashed) {
- ASSERT_TRUE(Start(
- GetTestDataFilePath("bear-320x240.webm"), PIPELINE_OK, kHashed));
+ ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"),
+ PIPELINE_OK, true));
Play();
@@ -418,31 +414,8 @@ TEST_F(PipelineIntegrationTest, BasicPlaybackHashed) {
EXPECT_EQ("-3.59,-2.06,-0.43,2.15,0.77,-0.95,", GetAudioHash());
}
-TEST_F(PipelineIntegrationTest, AudioPlaybackBenchmark) {
- // Audio-only files are all that is allowed for clockless playback.
- // Audio file can be specified on the command line
- // (--benchmark-audio-file=id3_png_test.mp3), so check for it.
- std::string filename(CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
- kBenchmarkAudioFile));
- if (filename.empty())
- filename = "sfx_f32le.wav";
-
- ASSERT_TRUE(Start(GetTestDataFilePath(filename), PIPELINE_OK, kClockless));
-
- Play();
-
- ASSERT_TRUE(WaitUntilOnEnded());
-
- // Call Stop() to ensure that the rendering is complete.
- Stop();
- printf("Clockless playback of %s took %.2f ms.\n",
- filename.c_str(),
- GetAudioTime().InMillisecondsF());
-}
-
TEST_F(PipelineIntegrationTest, F32PlaybackHashed) {
- ASSERT_TRUE(
- Start(GetTestDataFilePath("sfx_f32le.wav"), PIPELINE_OK, kHashed));
+ ASSERT_TRUE(Start(GetTestDataFilePath("sfx_f32le.wav"), PIPELINE_OK, true));
Play();
ASSERT_TRUE(WaitUntilOnEnded());
EXPECT_EQ(std::string(kNullVideoHash), GetVideoHash());
diff --git a/chromium/media/filters/pipeline_integration_test_base.cc b/chromium/media/filters/pipeline_integration_test_base.cc
index 31ae8ad827f..e2567adfbfe 100644
--- a/chromium/media/filters/pipeline_integration_test_base.cc
+++ b/chromium/media/filters/pipeline_integration_test_base.cc
@@ -26,7 +26,6 @@ const char kNullAudioHash[] = "0.00,0.00,0.00,0.00,0.00,0.00,";
PipelineIntegrationTestBase::PipelineIntegrationTestBase()
: hashing_enabled_(false),
- clockless_playback_(false),
pipeline_(new Pipeline(message_loop_.message_loop_proxy(),
new MediaLog())),
ended_(false),
@@ -121,9 +120,8 @@ bool PipelineIntegrationTestBase::Start(const base::FilePath& file_path,
bool PipelineIntegrationTestBase::Start(const base::FilePath& file_path,
PipelineStatus expected_status,
- kTestType test_type) {
- hashing_enabled_ = test_type == kHashed;
- clockless_playback_ = test_type == kClockless;
+ bool hashing_enabled) {
+ hashing_enabled_ = hashing_enabled;
return Start(file_path, expected_status);
}
@@ -231,32 +229,26 @@ PipelineIntegrationTestBase::CreateFilterCollection(
scoped_ptr<FilterCollection> collection(new FilterCollection());
collection->SetDemuxer(demuxer_.get());
- if (!clockless_playback_) {
- ScopedVector<VideoDecoder> video_decoders;
- video_decoders.push_back(
- new VpxVideoDecoder(message_loop_.message_loop_proxy()));
- video_decoders.push_back(
- new FFmpegVideoDecoder(message_loop_.message_loop_proxy()));
-
- // Disable frame dropping if hashing is enabled.
- scoped_ptr<VideoRenderer> renderer(new VideoRendererBase(
- message_loop_.message_loop_proxy(),
- video_decoders.Pass(),
- base::Bind(&PipelineIntegrationTestBase::SetDecryptor,
- base::Unretained(this),
- decryptor),
- base::Bind(&PipelineIntegrationTestBase::OnVideoRendererPaint,
- base::Unretained(this)),
- base::Bind(&PipelineIntegrationTestBase::OnSetOpaque,
- base::Unretained(this)),
- !hashing_enabled_));
- collection->SetVideoRenderer(renderer.Pass());
-
- audio_sink_ = new NullAudioSink(message_loop_.message_loop_proxy());
- } else {
- // audio only for clockless_playback_
- clockless_audio_sink_ = new ClocklessAudioSink();
- }
+ ScopedVector<VideoDecoder> video_decoders;
+ video_decoders.push_back(
+ new VpxVideoDecoder(message_loop_.message_loop_proxy()));
+ video_decoders.push_back(
+ new FFmpegVideoDecoder(message_loop_.message_loop_proxy()));
+
+ // Disable frame dropping if hashing is enabled.
+ scoped_ptr<VideoRenderer> renderer(new VideoRendererBase(
+ message_loop_.message_loop_proxy(),
+ video_decoders.Pass(),
+ base::Bind(&PipelineIntegrationTestBase::SetDecryptor,
+ base::Unretained(this), decryptor),
+ base::Bind(&PipelineIntegrationTestBase::OnVideoRendererPaint,
+ base::Unretained(this)),
+ base::Bind(&PipelineIntegrationTestBase::OnSetOpaque,
+ base::Unretained(this)),
+ !hashing_enabled_));
+ collection->SetVideoRenderer(renderer.Pass());
+
+ audio_sink_ = new NullAudioSink(message_loop_.message_loop_proxy());
ScopedVector<AudioDecoder> audio_decoders;
audio_decoders.push_back(
@@ -266,9 +258,7 @@ PipelineIntegrationTestBase::CreateFilterCollection(
AudioRendererImpl* audio_renderer_impl = new AudioRendererImpl(
message_loop_.message_loop_proxy(),
- (clockless_playback_)
- ? static_cast<AudioRendererSink*>(clockless_audio_sink_.get())
- : audio_sink_.get(),
+ audio_sink_.get(),
audio_decoders.Pass(),
base::Bind(&PipelineIntegrationTestBase::SetDecryptor,
base::Unretained(this),
@@ -311,9 +301,4 @@ std::string PipelineIntegrationTestBase::GetAudioHash() {
return audio_sink_->GetAudioHashForTesting();
}
-base::TimeDelta PipelineIntegrationTestBase::GetAudioTime() {
- DCHECK(clockless_playback_);
- return clockless_audio_sink_->render_time();
-}
-
} // namespace media
diff --git a/chromium/media/filters/pipeline_integration_test_base.h b/chromium/media/filters/pipeline_integration_test_base.h
index f91d8c4efea..e9dc0aa1bd1 100644
--- a/chromium/media/filters/pipeline_integration_test_base.h
+++ b/chromium/media/filters/pipeline_integration_test_base.h
@@ -7,7 +7,6 @@
#include "base/md5.h"
#include "base/message_loop/message_loop.h"
-#include "media/audio/clockless_audio_sink.h"
#include "media/audio/null_audio_sink.h"
#include "media/base/filter_collection.h"
#include "media/base/media_keys.h"
@@ -48,13 +47,10 @@ class PipelineIntegrationTestBase {
bool WaitUntilOnEnded();
PipelineStatus WaitUntilEndedOrError();
bool Start(const base::FilePath& file_path, PipelineStatus expected_status);
- // Enable playback with audio and video hashing enabled, or clockless
- // playback (audio only). Frame dropping and audio underflow will be disabled
- // if hashing enabled to ensure consistent hashes.
- enum kTestType { kHashed, kClockless };
- bool Start(const base::FilePath& file_path,
- PipelineStatus expected_status,
- kTestType test_type);
+ // Enable playback with audio and video hashing enabled. Frame dropping and
+ // audio underflow will be disabled to ensure consistent hashes.
+ bool Start(const base::FilePath& file_path, PipelineStatus expected_status,
+ bool hashing_enabled);
// Initialize the pipeline and ignore any status updates. Useful for testing
// invalid audio/video clips which don't have deterministic results.
bool Start(const base::FilePath& file_path);
@@ -79,20 +75,14 @@ class PipelineIntegrationTestBase {
// enabled.
std::string GetAudioHash();
- // Returns the time taken to render the complete audio file.
- // Pipeline must have been started with clockless playback enabled.
- base::TimeDelta GetAudioTime();
-
protected:
base::MessageLoop message_loop_;
base::MD5Context md5_context_;
bool hashing_enabled_;
- bool clockless_playback_;
scoped_ptr<Demuxer> demuxer_;
scoped_ptr<DataSource> data_source_;
scoped_ptr<Pipeline> pipeline_;
scoped_refptr<NullAudioSink> audio_sink_;
- scoped_refptr<ClocklessAudioSink> clockless_audio_sink_;
bool ended_;
PipelineStatus pipeline_status_;
NeedKeyCB need_key_cb_;
@@ -113,7 +103,6 @@ class PipelineIntegrationTestBase {
void QuitAfterCurrentTimeTask(const base::TimeDelta& quit_time);
scoped_ptr<FilterCollection> CreateFilterCollection(
scoped_ptr<Demuxer> demuxer, Decryptor* decryptor);
-
void SetDecryptor(Decryptor* decryptor,
const DecryptorReadyCB& decryptor_ready_cb);
void OnVideoRendererPaint(const scoped_refptr<VideoFrame>& frame);
diff --git a/chromium/media/filters/stream_parser_factory.cc b/chromium/media/filters/stream_parser_factory.cc
index c883f967d9e..3038d3e737c 100644
--- a/chromium/media/filters/stream_parser_factory.cc
+++ b/chromium/media/filters/stream_parser_factory.cc
@@ -65,7 +65,11 @@ static const CodecInfo kVorbisCodecInfo = { "vorbis", CodecInfo::AUDIO, NULL,
static const CodecInfo* kVideoWebMCodecs[] = {
&kVP8CodecInfo,
+#if !defined(OS_ANDROID)
+ // TODO(wonsik): crbug.com/285016 query Android platform for codec
+ // capabilities.
&kVP9CodecInfo,
+#endif
&kVorbisCodecInfo,
NULL
};
diff --git a/chromium/media/media.gyp b/chromium/media/media.gyp
index 92642a2173f..c685090fd17 100644
--- a/chromium/media/media.gyp
+++ b/chromium/media/media.gyp
@@ -99,8 +99,6 @@
'audio/audio_source_diverter.h',
'audio/audio_util.cc',
'audio/audio_util.h',
- 'audio/clockless_audio_sink.cc',
- 'audio/clockless_audio_sink.h',
'audio/cras/audio_manager_cras.cc',
'audio/cras/audio_manager_cras.h',
'audio/cras/cras_input.cc',
@@ -155,10 +153,10 @@
'audio/openbsd/audio_manager_openbsd.h',
'audio/pulse/audio_manager_pulse.cc',
'audio/pulse/audio_manager_pulse.h',
- 'audio/pulse/pulse_input.cc',
- 'audio/pulse/pulse_input.h',
'audio/pulse/pulse_output.cc',
'audio/pulse/pulse_output.h',
+ 'audio/pulse/pulse_input.cc',
+ 'audio/pulse/pulse_input.h',
'audio/pulse/pulse_unified.cc',
'audio/pulse/pulse_unified.h',
'audio/pulse/pulse_util.cc',
@@ -185,10 +183,10 @@
'audio/win/audio_unified_win.h',
'audio/win/avrt_wrapper_win.cc',
'audio/win/avrt_wrapper_win.h',
- 'audio/win/core_audio_util_win.cc',
- 'audio/win/core_audio_util_win.h',
'audio/win/device_enumeration_win.cc',
'audio/win/device_enumeration_win.h',
+ 'audio/win/core_audio_util_win.cc',
+ 'audio/win/core_audio_util_win.h',
'audio/win/wavein_input_win.cc',
'audio/win/wavein_input_win.h',
'audio/win/waveout_output_win.cc',
@@ -219,19 +217,19 @@
'base/audio_pull_fifo.h',
'base/audio_renderer.cc',
'base/audio_renderer.h',
+ 'base/audio_renderer_sink.h',
'base/audio_renderer_mixer.cc',
'base/audio_renderer_mixer.h',
'base/audio_renderer_mixer_input.cc',
'base/audio_renderer_mixer_input.h',
- 'base/audio_renderer_sink.h',
'base/audio_splicer.cc',
'base/audio_splicer.h',
'base/audio_timestamp_helper.cc',
'base/audio_timestamp_helper.h',
'base/bind_to_loop.h',
+ 'base/bitstream_buffer.h',
'base/bit_reader.cc',
'base/bit_reader.h',
- 'base/bitstream_buffer.h',
'base/buffers.h',
'base/byte_queue.cc',
'base/byte_queue.h',
@@ -249,10 +247,10 @@
'base/decoder_buffer.h',
'base/decoder_buffer_queue.cc',
'base/decoder_buffer_queue.h',
- 'base/decrypt_config.cc',
- 'base/decrypt_config.h',
'base/decryptor.cc',
'base/decryptor.h',
+ 'base/decrypt_config.cc',
+ 'base/decrypt_config.h',
'base/demuxer.cc',
'base/demuxer.h',
'base/demuxer_stream.cc',
@@ -350,10 +348,10 @@
'filters/ffmpeg_video_decoder.h',
'filters/file_data_source.cc',
'filters/file_data_source.h',
- 'filters/gpu_video_accelerator_factories.cc',
- 'filters/gpu_video_accelerator_factories.h',
'filters/gpu_video_decoder.cc',
'filters/gpu_video_decoder.h',
+ 'filters/gpu_video_decoder_factories.cc',
+ 'filters/gpu_video_decoder_factories.h',
'filters/h264_to_annex_b_bitstream_converter.cc',
'filters/h264_to_annex_b_bitstream_converter.h',
'filters/in_memory_url_protocol.cc',
@@ -374,12 +372,12 @@
'filters/video_renderer_base.h',
'filters/vpx_video_decoder.cc',
'filters/vpx_video_decoder.h',
- 'midi/midi_manager.cc',
'midi/midi_manager.h',
- 'midi/midi_manager_mac.cc',
+ 'midi/midi_manager.cc',
'midi/midi_manager_mac.h',
- 'midi/midi_port_info.cc',
+ 'midi/midi_manager_mac.cc',
'midi/midi_port_info.h',
+ 'midi/midi_port_info.cc',
'video/capture/android/video_capture_device_android.cc',
'video/capture/android/video_capture_device_android.h',
'video/capture/fake_video_capture_device.cc',
@@ -418,8 +416,6 @@
'video/picture.h',
'video/video_decode_accelerator.cc',
'video/video_decode_accelerator.h',
- 'video/video_encode_accelerator.cc',
- 'video/video_encode_accelerator.h',
'webm/webm_audio_client.cc',
'webm/webm_audio_client.h',
'webm/webm_cluster_parser.cc',
@@ -1129,8 +1125,8 @@
'base/mock_filters.h',
'base/test_helpers.cc',
'base/test_helpers.h',
- 'filters/mock_gpu_video_accelerator_factories.cc',
- 'filters/mock_gpu_video_accelerator_factories.h',
+ 'filters/mock_gpu_video_decoder_factories.cc',
+ 'filters/mock_gpu_video_decoder_factories.h',
'video/mock_video_decode_accelerator.cc',
'video/mock_video_decode_accelerator.h',
],
@@ -1483,7 +1479,6 @@
'sources': [
'base/android/java/src/org/chromium/media/AudioManagerAndroid.java',
'base/android/java/src/org/chromium/media/MediaCodecBridge.java',
- 'base/android/java/src/org/chromium/media/MediaDrmBridge.java',
'base/android/java/src/org/chromium/media/MediaPlayerBridge.java',
'base/android/java/src/org/chromium/media/MediaPlayerListener.java',
'base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java',
diff --git a/chromium/media/tools/shader_bench/shader_bench.cc b/chromium/media/tools/shader_bench/shader_bench.cc
index 0b4236f1eb1..b26733ce032 100644
--- a/chromium/media/tools/shader_bench/shader_bench.cc
+++ b/chromium/media/tools/shader_bench/shader_bench.cc
@@ -13,7 +13,6 @@
#include "base/memory/scoped_ptr.h"
#include "base/strings/string_number_conversions.h"
#include "base/time/time.h"
-#include "media/base/media.h"
#include "media/base/video_frame.h"
#include "media/tools/shader_bench/cpu_color_painter.h"
#include "media/tools/shader_bench/gpu_color_painter.h"
@@ -128,19 +127,18 @@ int main(int argc, char** argv) {
// Initialize window and graphics context.
base::AtExitManager at_exit_manager;
- media::InitializeMediaLibraryForTesting();
gfx::GLSurface::InitializeOneOff();
scoped_ptr<media::Window> window(new media::Window(width, height));
- scoped_refptr<gfx::GLSurface> surface =
- gfx::GLSurface::CreateViewGLSurface(window->PluginWindow());
- scoped_refptr<gfx::GLContext> context = gfx::GLContext::CreateGLContext(
- NULL, surface.get(), gfx::PreferDiscreteGpu);
- context->MakeCurrent(surface.get());
+ gfx::GLSurface* surface =
+ gfx::GLSurface::CreateViewGLSurface(window->PluginWindow()).get();
+ gfx::GLContext* context = gfx::GLContext::CreateGLContext(
+ NULL, surface, gfx::PreferDiscreteGpu).get();
+ context->MakeCurrent(surface);
// This sets D3DPRESENT_INTERVAL_IMMEDIATE on Windows.
context->SetSwapInterval(0);
// Initialize and name GPU painters.
- const struct {
+ static const struct {
const char* name;
GPUPainter* painter;
} painters[] = {
diff --git a/chromium/media/video/capture/win/filter_base_win.cc b/chromium/media/video/capture/win/filter_base_win.cc
index ddc68d68b2c..89309df694d 100644
--- a/chromium/media/video/capture/win/filter_base_win.cc
+++ b/chromium/media/video/capture/win/filter_base_win.cc
@@ -72,6 +72,8 @@ class PinEnumerator
STDMETHOD(Clone)(IEnumPins** clone) {
PinEnumerator* pin_enum = new PinEnumerator(filter_);
+ if (!pin_enum)
+ return E_OUTOFMEMORY;
pin_enum->AddRef();
pin_enum->index_ = index_;
*clone = pin_enum;
diff --git a/chromium/media/video/capture/win/pin_base_win.cc b/chromium/media/video/capture/win/pin_base_win.cc
index e912b84ec2a..7e2f7b095ad 100644
--- a/chromium/media/video/capture/win/pin_base_win.cc
+++ b/chromium/media/video/capture/win/pin_base_win.cc
@@ -93,6 +93,8 @@ class TypeEnumerator
STDMETHOD(Clone)(IEnumMediaTypes** clone) {
TypeEnumerator* type_enum = new TypeEnumerator(pin_);
+ if (!type_enum)
+ return E_OUTOFMEMORY;
type_enum->AddRef();
type_enum->index_ = index_;
*clone = type_enum;
diff --git a/chromium/media/video/video_encode_accelerator.h b/chromium/media/video/video_encode_accelerator.h
deleted file mode 100644
index 8d4f56536bf..00000000000
--- a/chromium/media/video/video_encode_accelerator.h
+++ /dev/null
@@ -1,145 +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 MEDIA_VIDEO_VIDEO_ENCODE_ACCELERATOR_H_
-#define MEDIA_VIDEO_VIDEO_ENCODE_ACCELERATOR_H_
-
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/memory/ref_counted.h"
-#include "media/base/bitstream_buffer.h"
-#include "media/base/media_export.h"
-#include "media/base/video_decoder_config.h"
-#include "media/base/video_frame.h"
-
-namespace media {
-
-class BitstreamBuffer;
-class VideoFrame;
-
-// Video encoder interface.
-class MEDIA_EXPORT VideoEncodeAccelerator {
- public:
- virtual ~VideoEncodeAccelerator();
-
- // Specification of an encoding profile supported by an encoder.
- struct SupportedProfile {
- VideoCodecProfile profile;
- gfx::Size max_resolution;
- struct {
- uint32 numerator;
- uint32 denominator;
- } max_framerate;
- };
-
- // Enumeration of potential errors generated by the API.
- enum Error {
- // An operation was attempted during an incompatible encoder state.
- kIllegalStateError,
- // Invalid argument was passed to an API method.
- kInvalidArgumentError,
- // A failure occurred at the GPU process or one of its dependencies.
- // Examples of such failures include GPU hardware failures, GPU driver
- // failures, GPU library failures, GPU process programming errors, and so
- // on.
- kPlatformFailureError,
- };
-
- // Interface for clients that use VideoEncodeAccelerator.
- class MEDIA_EXPORT Client {
- public:
- // Callback to notify client that encoder has been successfully initialized.
- virtual void NotifyInitializeDone() = 0;
-
- // Callback to tell the client what size of frames and buffers to provide
- // for input and output. The VEA disclaims use or ownership of all
- // previously provided buffers once this callback is made.
- // Parameters:
- // |input_count| is the number of input VideoFrames required for encoding.
- // The client should be prepared to feed at least this many frames into the
- // encoder before being returned any input frames, since the encoder may
- // need to hold onto some subset of inputs as reference pictures.
- // |input_coded_size| is the logical size of the input frames (as reported
- // by VideoFrame::coded_size()) to encode, in pixels. The encoder may have
- // hardware alignment requirements that make this different from
- // |input_visible_size|, as requested in Initialize(), in which case the
- // input VideoFrame to Encode() should be padded appropriately.
- // |output_buffer_size| is the required size of output buffers for this
- // encoder in bytes.
- virtual void RequireBitstreamBuffers(unsigned int input_count,
- const gfx::Size& input_coded_size,
- size_t output_buffer_size) = 0;
-
- // Callback to deliver encoded bitstream buffers. Ownership of the buffer
- // is transferred back to the VEA::Client once this callback is made.
- // Parameters:
- // |bitstream_buffer_id| is the id of the buffer that is ready.
- // |payload_size| is the byte size of the used portion of the buffer.
- // |key_frame| is true if this delivered frame is a keyframe.
- virtual void BitstreamBufferReady(int32 bitstream_buffer_id,
- size_t payload_size,
- bool key_frame) = 0;
-
- // Error notification callback.
- virtual void NotifyError(Error error) = 0;
-
- protected:
- // Clients are not owned by VEA instances and should not be deleted through
- // these pointers.
- virtual ~Client() {}
- };
-
- // Video encoder functions.
-
- // Initialize the video encoder with a specific configuration. Called once
- // per encoder construction.
- // Parameters:
- // |input_format| is the frame format of the input stream (as would be
- // reported by VideoFrame::format() for frames passed to Encode()).
- // |input_visible_size| is the resolution of the input stream (as would be
- // reported by VideoFrame::visible_rect().size() for frames passed to
- // Encode()).
- // |output_profile| is the codec profile of the encoded output stream.
- // |initial_bitrate| is the initial bitrate of the encoded output stream,
- // in bits per second.
- // TODO(sheu): handle resolution changes. http://crbug.com/249944
- virtual void Initialize(media::VideoFrame::Format input_format,
- const gfx::Size& input_visible_size,
- VideoCodecProfile output_profile,
- uint32 initial_bitrate) = 0;
-
- // Encodes the given frame.
- // Parameters:
- // |frame| is the VideoFrame that is to be encoded.
- // |force_keyframe| forces the encoding of a keyframe for this frame.
- virtual void Encode(const scoped_refptr<VideoFrame>& frame,
- bool force_keyframe) = 0;
-
- // Send a bitstream buffer to the encoder to be used for storing future
- // encoded output. Each call here with a given |buffer| will cause the buffer
- // to be filled once, then returned with BitstreamBufferReady().
- // Parameters:
- // |buffer| is the bitstream buffer to use for output.
- virtual void UseOutputBitstreamBuffer(const BitstreamBuffer& buffer) = 0;
-
- // Request a change to the encoding parameters. This is only a request,
- // fulfilled on a best-effort basis.
- // Parameters:
- // |bitrate| is the requested new bitrate, in bits per second.
- // |framerate| is the requested new framerate, in frames per second.
- virtual void RequestEncodingParametersChange(uint32 bitrate,
- uint32 framerate) = 0;
-
- // Destroys the encoder: all pending inputs and outputs are dropped
- // immediately and the component is freed. This call may asynchronously free
- // system resources, but its client-visible effects are synchronous. After
- // this method returns no more callbacks will be made on the client. Deletes
- // |this| unconditionally, so make sure to drop all pointers to it!
- virtual void Destroy() = 0;
-};
-
-} // namespace media
-
-#endif // MEDIA_VIDEO_VIDEO_ENCODE_ACCELERATOR_H_
diff --git a/chromium/media/webm/webm_cluster_parser.cc b/chromium/media/webm/webm_cluster_parser.cc
index 9991d6b4d15..f83a3652f03 100644
--- a/chromium/media/webm/webm_cluster_parser.cc
+++ b/chromium/media/webm/webm_cluster_parser.cc
@@ -214,7 +214,7 @@ bool WebMClusterParser::ParseBlock(bool is_simple_block, const uint8* buf,
// Sign extend negative timecode offsets.
if (timecode & 0x8000)
- timecode |= ~0xffff;
+ timecode |= (-1 << 16);
const uint8* frame_data = buf + 4;
int frame_size = size - (frame_data - buf);
@@ -277,8 +277,6 @@ bool WebMClusterParser::OnBlock(bool is_simple_block, int track_num,
return false;
}
- // TODO(acolwell): Should relative negative timecode offsets be rejected? Or
- // only when the absolute timecode is negative? See http://crbug.com/271794
if (timecode < 0) {
MEDIA_LOG(log_cb_) << "Got a block with negative timecode offset "
<< timecode;
diff --git a/chromium/net/OWNERS b/chromium/net/OWNERS
index 87e11faef93..18f14625033 100644
--- a/chromium/net/OWNERS
+++ b/chromium/net/OWNERS
@@ -1,5 +1,4 @@
agl@chromium.org
-akalin@chromium.org
asanka@chromium.org
cbentzel@chromium.org
eroman@chromium.org
diff --git a/chromium/net/android/java/src/org/chromium/net/AndroidKeyStore.java b/chromium/net/android/java/src/org/chromium/net/AndroidKeyStore.java
index 2edaa895b7e..de5d8f2d5f0 100644
--- a/chromium/net/android/java/src/org/chromium/net/AndroidKeyStore.java
+++ b/chromium/net/android/java/src/org/chromium/net/AndroidKeyStore.java
@@ -112,20 +112,21 @@ public class AndroidKeyStore {
* shall only be used to implement signing in the context of SSL
* client certificate support.
*
- * The message will actually be a hash, computed and padded by OpenSSL,
- * itself, depending on the type of the key. The result should match
- * exactly what the vanilla implementations of the following OpenSSL
- * function calls do:
+ * The message will actually be a hash, computed by OpenSSL itself,
+ * depending on the type of the key. The result should match exactly
+ * what the vanilla implementations of the following OpenSSL function
+ * calls do:
*
* - For a RSA private key, this should be equivalent to calling
- * RSA_sign(NDI_md5_sha1,....), i.e. it must generate a raw RSA
- * signature. The message must a combined, 36-byte MD5+SHA1 message
- * digest padded to the length of the modulus using PKCS#1 padding.
+ * RSA_private_encrypt(..., RSA_PKCS1_PADDING), i.e. it must
+ * generate a raw RSA signature. The message must be either a
+ * combined, 36-byte MD5+SHA1 message digest or a DigestInfo
+ * value wrapping a message digest.
*
* - For a DSA and ECDSA private keys, this should be equivalent to
* calling DSA_sign(0,...) and ECDSA_sign(0,...) respectively. The
- * message must be a 20-byte SHA1 hash and the function shall
- * compute a direct DSA/ECDSA signature for it.
+ * message must be a hash and the function shall compute a direct
+ * DSA/ECDSA signature for it.
*
* @param privateKey The PrivateKey handle.
* @param message The message to sign.
diff --git a/chromium/net/android/keystore_openssl.cc b/chromium/net/android/keystore_openssl.cc
index cc463f49539..cd55ece3336 100644
--- a/chromium/net/android/keystore_openssl.cc
+++ b/chromium/net/android/keystore_openssl.cc
@@ -35,7 +35,7 @@
//
// Generally speaking, OpenSSL provides many different ways to sign
// digests. This code doesn't support all these cases, only the ones that
-// are required to sign the MAC during the OpenSSL handshake for TLS < 1.2.
+// are required to sign the MAC during the OpenSSL handshake for TLS.
//
// The OpenSSL EVP_PKEY type is a generic wrapper around key pairs.
// Internally, it can hold a pointer to a RSA, DSA or ECDSA structure,
@@ -54,8 +54,8 @@
// are used to hold the typical modulus / exponent / parameters for the
// key pair).
//
-// This source file thus defines a custom RSA_METHOD structure, which
-// fields points to static methods used to implement the corresponding
+// This source file thus defines a custom RSA_METHOD structure whose
+// fields point to static methods used to implement the corresponding
// RSA operation using platform Android APIs.
//
// However, the platform APIs require a jobject JNI reference to work.
@@ -106,6 +106,7 @@ typedef crypto::ScopedOpenSSL<RSA, RSA_free> ScopedRSA;
typedef crypto::ScopedOpenSSL<DSA, DSA_free> ScopedDSA;
typedef crypto::ScopedOpenSSL<EC_KEY, EC_KEY_free> ScopedEC_KEY;
typedef crypto::ScopedOpenSSL<EC_GROUP, EC_GROUP_free> ScopedEC_GROUP;
+typedef crypto::ScopedOpenSSL<X509_SIG, X509_SIG_free> ScopedX509_SIG;
// Custom RSA_METHOD that uses the platform APIs.
// Note that for now, only signing through RSA_sign() is really supported.
@@ -172,28 +173,79 @@ int RsaMethodFinish(RSA* rsa) {
return 0;
}
+// Although these parameters are, per OpenSSL, named |message| and
+// |message_len|, RsaMethodSign is actually passed a message digest,
+// not the original message.
int RsaMethodSign(int type,
const unsigned char* message,
unsigned int message_len,
unsigned char* signature,
unsigned int* signature_len,
const RSA* rsa) {
- // This is only used for client certificate support, which
- // will always pass the NID_md5_sha1 |type| value.
- DCHECK_EQ(NID_md5_sha1, type);
- if (type != NID_md5_sha1) {
- RSAerr(RSA_F_RSA_SIGN, RSA_R_UNKNOWN_ALGORITHM_TYPE);
- return 0;
- }
// Retrieve private key JNI reference.
jobject private_key = reinterpret_cast<jobject>(RSA_get_app_data(rsa));
if (!private_key) {
LOG(WARNING) << "Null JNI reference passed to RsaMethodSign!";
return 0;
}
- // Sign message with it through JNI.
- base::StringPiece message_piece(reinterpret_cast<const char*>(message),
- static_cast<size_t>(message_len));
+
+ // See RSA_sign in third_party/openssl/openssl/crypto/rsa/rsa_sign.c.
+ base::StringPiece message_piece;
+ std::vector<uint8> buffer; // To store |message| wrapped in a DigestInfo.
+ if (type == NID_md5_sha1) {
+ // For TLS < 1.2, sign just |message|.
+ message_piece.set(message, static_cast<size_t>(message_len));
+ } else {
+ // For TLS 1.2, wrap |message| in a PKCS #1 DigestInfo before signing.
+ ScopedX509_SIG sig(X509_SIG_new());
+ if (!sig.get())
+ return 0;
+ if (X509_ALGOR_set0(sig.get()->algor,
+ OBJ_nid2obj(type), V_ASN1_NULL, 0) != 1) {
+ return 0;
+ }
+ if (sig.get()->algor->algorithm == NULL) {
+ RSAerr(RSA_F_RSA_SIGN, RSA_R_UNKNOWN_ALGORITHM_TYPE);
+ return 0;
+ }
+ if (sig.get()->algor->algorithm->length == 0) {
+ RSAerr(RSA_F_RSA_SIGN,
+ RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD);
+ return 0;
+ }
+ if (ASN1_OCTET_STRING_set(sig.get()->digest, message, message_len) != 1)
+ return 0;
+
+ int len = i2d_X509_SIG(sig.get(), NULL);
+ if (len < 0) {
+ LOG(WARNING) << "Couldn't encode X509_SIG structure";
+ return 0;
+ }
+ buffer.resize(len);
+ // OpenSSL takes a pointer to a pointer so it can kindly increment
+ // it for you.
+ unsigned char* p = &buffer[0];
+ len = i2d_X509_SIG(sig.get(), &p);
+ if (len < 0) {
+ LOG(WARNING) << "Couldn't encode X509_SIG structure";
+ return 0;
+ }
+
+ message_piece.set(&buffer[0], static_cast<size_t>(len));
+ }
+
+ // Sanity-check the size.
+ //
+ // TODO(davidben): Do we need to do this? OpenSSL does, but
+ // RawSignDigestWithPrivateKey does error on sufficiently large
+ // input. However, it doesn't take the padding into account.
+ size_t expected_size = static_cast<size_t>(RSA_size(rsa));
+ if (message_piece.size() > expected_size - RSA_PKCS1_PADDING_SIZE) {
+ RSAerr(RSA_F_RSA_SIGN, RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY);
+ return 0;
+ }
+
+ // Sign |message_piece| with the private key through JNI.
std::vector<uint8> result;
if (!RawSignDigestWithPrivateKey(
@@ -202,7 +254,6 @@ int RsaMethodSign(int type,
return 0;
}
- size_t expected_size = static_cast<size_t>(RSA_size(rsa));
if (result.size() > expected_size) {
LOG(ERROR) << "RSA Signature size mismatch, actual: "
<< result.size() << ", expected <= " << expected_size;
diff --git a/chromium/net/base/mime_util.cc b/chromium/net/base/mime_util.cc
index da3a4c9aee8..3a0310c53f3 100644
--- a/chromium/net/base/mime_util.cc
+++ b/chromium/net/base/mime_util.cc
@@ -304,10 +304,11 @@ static const char* const proprietary_media_types[] = {
static const char* const common_media_codecs[] = {
#if !defined(OS_ANDROID) // Android doesn't support Ogg Theora.
"theora",
+ "vp9", // TODO(tomfinegan): Move vp9 back down with vp8 once VP9 is supported
+ // on Android. https://crbug.com/285016
#endif
"vorbis",
"vp8",
- "vp9",
"1" // WAVE_FORMAT_PCM.
};
@@ -413,7 +414,13 @@ struct MediaFormatStrict {
};
static const MediaFormatStrict format_codec_mappings[] = {
+ // TODO(tomfinegan): Remove this if/else when VP9 is supported on Android.
+ // https://crbug.com/285016
+#if !defined(OS_ANDROID)
{ "video/webm", "vorbis,vp8,vp8.0,vp9,vp9.0" },
+#else
+ { "video/webm", "vorbis,vp8,vp8.0" },
+#endif
{ "audio/webm", "vorbis" },
{ "audio/wav", "1" }
};
diff --git a/chromium/net/base/net_log_event_type_list.h b/chromium/net/base/net_log_event_type_list.h
index b1f0afe096d..01d9bf1e66d 100644
--- a/chromium/net/base/net_log_event_type_list.h
+++ b/chromium/net/base/net_log_event_type_list.h
@@ -1296,15 +1296,6 @@ EVENT_TYPE(QUIC_SESSION_PACKET_RECEIVED)
// as a base-10 string.>,
// "size": <The size of the packet in bytes>
// }
-EVENT_TYPE(QUIC_SESSION_PACKET_RETRANSMITTED)
-
-// Session retransmitted a QUIC packet.
-// {
-// "old_packet_sequence_number": <The old packet's full 64-bit sequence
-// number, as a base-10 string.>,
-// "new_packet_sequence_number": <The new packet's full 64-bit sequence
-// number, as a base-10 string.>,
-// }
EVENT_TYPE(QUIC_SESSION_PACKET_SENT)
// Session received a QUIC packet header for a valid packet.
@@ -1444,49 +1435,6 @@ EVENT_TYPE(QUIC_SESSION_CONNECTION_CLOSE_FRAME_RECEIVED)
// }
EVENT_TYPE(QUIC_SESSION_CONNECTION_CLOSE_FRAME_SENT)
-// Session received a public reset packet.
-// {
-// }
-EVENT_TYPE(QUIC_SESSION_PUBLIC_RESET_PACKET_RECEIVED)
-
-// Session received a version negotiation packet.
-// {
-// "versions": <List of QUIC versions supported by the server>,
-// }
-EVENT_TYPE(QUIC_SESSION_VERSION_NEGOTIATION_PACKET_RECEIVED)
-
-// Session revived a QUIC packet packet via FEC.
-// {
-// "guid": <The 64-bit GUID for this connection, as a base-10 string>,
-// "public_flags": <The public flags set for this packet>,
-// "packet_sequence_number": <The packet's full 64-bit sequence number,
-// as a base-10 string.>,
-// "private_flags": <The private flags set for this packet>,
-// "fec_group": <The FEC group of this packet>,
-// }
-EVENT_TYPE(QUIC_SESSION_PACKET_HEADER_REVIVED)
-
-// Session received a crypto handshake message.
-// {
-// "quic_crypto_handshake_message": <The human readable dump of the message
-// contents>
-// }
-EVENT_TYPE(QUIC_SESSION_CRYPTO_HANDSHAKE_MESSAGE_RECEIVED)
-
-// Session sent a crypto handshake message.
-// {
-// "quic_crypto_handshake_message": <The human readable dump of the message
-// contents>
-// }
-EVENT_TYPE(QUIC_SESSION_CRYPTO_HANDSHAKE_MESSAGE_SENT)
-
-// Session was closed, either remotely or by the peer.
-// {
-// "quic_error": <QuicErrorCode which caused the connection to be closed>,
-// "from_peer": <True if the peer closed the connection>
-// }
-EVENT_TYPE(QUIC_SESSION_CLOSED)
-
// ------------------------------------------------------------------------
// QuicHttpStream
// ------------------------------------------------------------------------
diff --git a/chromium/net/cert/x509_cert_types.h b/chromium/net/cert/x509_cert_types.h
index f74c82eab7b..b6adb518aa9 100644
--- a/chromium/net/cert/x509_cert_types.h
+++ b/chromium/net/cert/x509_cert_types.h
@@ -42,7 +42,7 @@ struct NET_EXPORT CertPrincipal {
bool ParseDistinguishedName(const void* ber_name_data, size_t length);
#endif
-#if defined(OS_MACOSX) && !defined(OS_IOS)
+#if defined(OS_MACOSX)
// Compare this CertPrincipal with |against|, returning true if they're
// equal enough to be a possible match. This should NOT be used for any
// security relevant decisions.
@@ -136,9 +136,9 @@ enum CertDateFormat {
// |format|, and writes the result into |*time|. If an invalid date is
// specified, or if parsing fails, returns false, and |*time| will not be
// updated.
-NET_EXPORT_PRIVATE bool ParseCertificateDate(const base::StringPiece& raw_date,
- CertDateFormat format,
- base::Time* time);
+bool ParseCertificateDate(const base::StringPiece& raw_date,
+ CertDateFormat format,
+ base::Time* time);
} // namespace net
#endif // NET_CERT_X509_CERT_TYPES_H_
diff --git a/chromium/net/cert/x509_cert_types_unittest.cc b/chromium/net/cert/x509_cert_types_unittest.cc
index 38fd3e95266..e0bcc707dc1 100644
--- a/chromium/net/cert/x509_cert_types_unittest.cc
+++ b/chromium/net/cert/x509_cert_types_unittest.cc
@@ -2,19 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "net/cert/x509_cert_types.h"
-
#include "base/basictypes.h"
-#include "base/strings/string_piece.h"
-#include "base/time/time.h"
+#include "net/cert/x509_cert_types.h"
#include "net/test/test_certificate_data.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
-namespace {
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
+#if defined(OS_MACOSX)
TEST(X509TypesTest, Matching) {
CertPrincipal spamco;
spamco.common_name = "SpamCo Dept. Of Certificization";
@@ -53,7 +48,6 @@ TEST(X509TypesTest, Matching) {
}
#endif
-#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
TEST(X509TypesTest, ParseDNVerisign) {
CertPrincipal verisign;
EXPECT_TRUE(verisign.ParseDistinguishedName(VerisignDN, sizeof(VerisignDN)));
@@ -141,103 +135,5 @@ TEST(X509TypesTest, ParseDNEntrust) {
EXPECT_EQ("(c) 1999 Entrust.net Limited",
entrust.organization_unit_names[1]);
}
-#endif
-
-const struct CertDateTestData {
- CertDateFormat format;
- const char* date_string;
- bool is_valid;
- base::Time::Exploded expected_result;
-} kCertDateTimeData[] = {
- { CERT_DATE_FORMAT_UTC_TIME,
- "120101000000Z",
- true,
- { 2012, 1, 0, 1, 0, 0, 0 } },
- { CERT_DATE_FORMAT_GENERALIZED_TIME,
- "20120101000000Z",
- true,
- { 2012, 1, 0, 1, 0, 0, 0 } },
- { CERT_DATE_FORMAT_UTC_TIME,
- "490101000000Z",
- true,
- { 2049, 1, 0, 1, 0, 0, 0 } },
- { CERT_DATE_FORMAT_UTC_TIME,
- "500101000000Z",
- true,
- { 1950, 1, 0, 1, 0, 0, 0 } },
- { CERT_DATE_FORMAT_GENERALIZED_TIME,
- "19500101000000Z",
- true,
- { 1950, 1, 0, 1, 0, 0, 0 } },
- { CERT_DATE_FORMAT_UTC_TIME,
- "AB0101000000Z",
- false,
- { 0 } },
- { CERT_DATE_FORMAT_GENERALIZED_TIME,
- "19AB0101000000Z",
- false,
- { 0 } },
- { CERT_DATE_FORMAT_UTC_TIME,
- "",
- false,
- { 0 } },
- { CERT_DATE_FORMAT_UTC_TIME,
- "A",
- false,
- { 0 } },
- { CERT_DATE_FORMAT_GENERALIZED_TIME,
- "20121301000000Z",
- false,
- { 0 } },
- { CERT_DATE_FORMAT_GENERALIZED_TIME,
- "20120101123000Z",
- true,
- { 2012, 1, 0, 1, 12, 30, 0 } },
-};
-
-// GTest pretty printer.
-void PrintTo(const CertDateTestData& data, std::ostream* os) {
- *os << " format: " << data.format
- << "; date string: " << base::StringPiece(data.date_string)
- << "; valid: " << data.is_valid
- << "; expected date: "
- << (data.is_valid ?
- base::Time::FromUTCExploded(data.expected_result)
- .ToInternalValue() :
- 0U);
-}
-
-class X509CertTypesDateTest : public testing::TestWithParam<CertDateTestData> {
- public:
- virtual ~X509CertTypesDateTest() {}
- virtual void SetUp() {
- test_data_ = GetParam();
- }
-
- protected:
- CertDateTestData test_data_;
-};
-
-TEST_P(X509CertTypesDateTest, Parse) {
- base::Time parsed_date;
- bool parsed = ParseCertificateDate(
- test_data_.date_string, test_data_.format, &parsed_date);
- EXPECT_EQ(test_data_.is_valid, parsed);
- if (!test_data_.is_valid)
- return;
- // Convert the expected value to a base::Time(). This ensures that systems
- // systems that only support 32-bit times will pass the tests, by ensuring at
- // least that the times have the same truncating behaviour.
- // Note: Compared as internal values so that mismatches can be cleanly
- // printed by GTest (eg: without PrintTo overrides).
- EXPECT_EQ(base::Time::FromUTCExploded(test_data_.expected_result)
- .ToInternalValue(),
- parsed_date.ToInternalValue());
-}
-INSTANTIATE_TEST_CASE_P(,
- X509CertTypesDateTest,
- testing::ValuesIn(kCertDateTimeData));
-
-} // namespace
} // namespace net
diff --git a/chromium/net/disk_cache/backend_unittest.cc b/chromium/net/disk_cache/backend_unittest.cc
index 7eeeee1fd83..bc48a2eb203 100644
--- a/chromium/net/disk_cache/backend_unittest.cc
+++ b/chromium/net/disk_cache/backend_unittest.cc
@@ -313,7 +313,7 @@ TEST_F(DiskCacheBackendTest, CreateBackend_MissingFile) {
scoped_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl(
cache_path_, cache_thread.message_loop_proxy().get(), NULL));
int rv = cache->Init(cb.callback());
- EXPECT_EQ(net::ERR_FAILED, cb.GetResult(rv));
+ ASSERT_EQ(net::ERR_FAILED, cb.GetResult(rv));
base::ThreadRestrictions::SetIOAllowed(prev);
cache.reset();
diff --git a/chromium/net/disk_cache/entry_unittest.cc b/chromium/net/disk_cache/entry_unittest.cc
index 7addc85e5a0..857e07f1b7b 100644
--- a/chromium/net/disk_cache/entry_unittest.cc
+++ b/chromium/net/disk_cache/entry_unittest.cc
@@ -392,6 +392,7 @@ void DiskCacheEntryTest::ExternalSyncIOBackground(disk_cache::Entry* entry) {
EXPECT_EQ(
25000,
entry->ReadData(1, 0, buffer2.get(), kSize2, net::CompletionCallback()));
+ EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000));
EXPECT_EQ(5000,
entry->ReadData(
1, 30000, buffer2.get(), kSize2, net::CompletionCallback()));
diff --git a/chromium/net/disk_cache/simple/simple_entry_impl.cc b/chromium/net/disk_cache/simple/simple_entry_impl.cc
index 3c3ec7daff6..cbee6048371 100644
--- a/chromium/net/disk_cache/simple/simple_entry_impl.cc
+++ b/chromium/net/disk_cache/simple/simple_entry_impl.cc
@@ -496,7 +496,7 @@ int SimpleEntryImpl::ReadyForSparseIO(const CompletionCallback& callback) {
DCHECK(io_thread_checker_.CalledOnValidThread());
// TODO(gavinp): Determine if the simple backend should support sparse data.
NOTIMPLEMENTED();
- return net::ERR_FAILED;
+ return net::ERR_NOT_IMPLEMENTED;
}
SimpleEntryImpl::~SimpleEntryImpl() {
diff --git a/chromium/net/disk_cache/simple/simple_index_file.cc b/chromium/net/disk_cache/simple/simple_index_file.cc
index 7bcea7cdfa8..0136be1c5a0 100644
--- a/chromium/net/disk_cache/simple/simple_index_file.cc
+++ b/chromium/net/disk_cache/simple/simple_index_file.cc
@@ -7,7 +7,6 @@
#include <vector>
#include "base/file_util.h"
-#include "base/files/file_enumerator.h"
#include "base/files/memory_mapped_file.h"
#include "base/hash.h"
#include "base/logging.h"
@@ -22,11 +21,17 @@
#include "net/disk_cache/simple/simple_util.h"
#include "third_party/zlib/zlib.h"
-
+namespace disk_cache {
namespace {
+const int kEntryFilesHashLength = 16;
+const int kEntryFilesSuffixLength = 2;
+
const uint64 kMaxEntiresInIndex = 100000000;
+const char kIndexFileName[] = "the-real-index";
+const char kTempIndexFileName[] = "temp-index";
+
uint32 CalculatePickleCRC(const Pickle& pickle) {
return crc32(crc32(0, Z_NULL, 0),
reinterpret_cast<const Bytef*>(pickle.payload()),
@@ -67,9 +72,54 @@ void WriteToDiskInternal(const base::FilePath& index_filename,
}
}
-} // namespace
+// Called for each cache directory traversal iteration.
+void ProcessEntryFile(SimpleIndex::EntrySet* entries,
+ const base::FilePath& file_path) {
+ static const size_t kEntryFilesLength =
+ kEntryFilesHashLength + kEntryFilesSuffixLength;
+ // Converting to std::string is OK since we never use UTF8 wide chars in our
+ // file names.
+ const base::FilePath::StringType base_name = file_path.BaseName().value();
+ const std::string file_name(base_name.begin(), base_name.end());
+ if (file_name.size() != kEntryFilesLength)
+ return;
+ const base::StringPiece hash_string(
+ file_name.begin(), file_name.begin() + kEntryFilesHashLength);
+ uint64 hash_key = 0;
+ if (!simple_util::GetEntryHashKeyFromHexString(hash_string, &hash_key)) {
+ LOG(WARNING) << "Invalid entry hash key filename while restoring index from"
+ << " disk: " << file_name;
+ return;
+ }
-namespace disk_cache {
+ base::PlatformFileInfo file_info;
+ if (!file_util::GetFileInfo(file_path, &file_info)) {
+ LOG(ERROR) << "Could not get file info for " << file_path.value();
+ return;
+ }
+ base::Time last_used_time;
+#if defined(OS_POSIX)
+ // For POSIX systems, a last access time is available. However, it's not
+ // guaranteed to be more accurate than mtime. It is no worse though.
+ last_used_time = file_info.last_accessed;
+#endif
+ if (last_used_time.is_null())
+ last_used_time = file_info.last_modified;
+
+ int64 file_size = file_info.size;
+ SimpleIndex::EntrySet::iterator it = entries->find(hash_key);
+ if (it == entries->end()) {
+ SimpleIndex::InsertInEntrySet(
+ hash_key,
+ EntryMetadata(last_used_time, file_size),
+ entries);
+ } else {
+ // Summing up the total size of the entry through all the *_[0-2] files
+ it->second.SetEntrySize(it->second.GetEntrySize() + file_size);
+ }
+}
+
+} // namespace
SimpleIndexLoadResult::SimpleIndexLoadResult() : did_load(false),
flush_required(false) {
@@ -84,11 +134,6 @@ void SimpleIndexLoadResult::Reset() {
entries.clear();
}
-// static
-const char SimpleIndexFile::kIndexFileName[] = "the-real-index";
-// static
-const char SimpleIndexFile::kTempIndexFileName[] = "temp-index";
-
SimpleIndexFile::IndexMetadata::IndexMetadata() :
magic_number_(kSimpleIndexMagicNumber),
version_(kSimpleVersion),
@@ -350,7 +395,6 @@ void SimpleIndexFile::SyncRestoreFromDisk(
const base::FilePath& index_file_path,
SimpleIndexLoadResult* out_result) {
LOG(INFO) << "Simple Cache Index is being restored from disk.";
-
base::DeleteFile(index_file_path, /* recursive = */ false);
out_result->Reset();
SimpleIndex::EntrySet* entries = &out_result->entries;
@@ -359,53 +403,13 @@ void SimpleIndexFile::SyncRestoreFromDisk(
COMPILE_ASSERT(kSimpleEntryFileCount == 3,
file_pattern_must_match_file_count);
- const int kFileSuffixLength = sizeof("_0") - 1;
- const base::FilePath::StringType file_pattern = FILE_PATH_LITERAL("*_[0-2]");
- base::FileEnumerator enumerator(cache_directory,
- false /* recursive */,
- base::FileEnumerator::FILES,
- file_pattern);
- for (base::FilePath file_path = enumerator.Next(); !file_path.empty();
- file_path = enumerator.Next()) {
- const base::FilePath::StringType base_name = file_path.BaseName().value();
- // Converting to std::string is OK since we never use UTF8 wide chars in our
- // file names.
- const std::string hash_key_string(base_name.begin(),
- base_name.end() - kFileSuffixLength);
- uint64 hash_key = 0;
- if (!simple_util::GetEntryHashKeyFromHexString(
- hash_key_string, &hash_key)) {
- LOG(WARNING) << "Invalid Entry Hash Key filename while restoring "
- << "Simple Index from disk: " << base_name;
- // TODO(felipeg): Should we delete the invalid file here ?
- continue;
- }
-
- base::FileEnumerator::FileInfo info = enumerator.GetInfo();
- base::Time last_used_time;
-#if defined(OS_POSIX)
- // For POSIX systems, a last access time is available. However, it's not
- // guaranteed to be more accurate than mtime. It is no worse though.
- last_used_time = base::Time::FromTimeT(info.stat().st_atime);
-#endif
- if (last_used_time.is_null())
- last_used_time = info.GetLastModifiedTime();
-
- int64 file_size = info.GetSize();
- SimpleIndex::EntrySet::iterator it = entries->find(hash_key);
- if (it == entries->end()) {
- SimpleIndex::InsertInEntrySet(
- hash_key,
- EntryMetadata(last_used_time, file_size),
- entries);
- } else {
- // Summing up the total size of the entry through all the *_[0-2] files
- it->second.SetEntrySize(it->second.GetEntrySize() + file_size);
- }
+ const bool did_succeed = TraverseCacheDirectory(
+ cache_directory, base::Bind(&ProcessEntryFile, entries));
+ if (!did_succeed) {
+ LOG(ERROR) << "Could not reconstruct index from disk";
+ return;
}
-
out_result->did_load = true;
-
// When we restore from disk we write the merged index file to disk right
// away, this might save us from having to restore again next time.
out_result->flush_required = true;
diff --git a/chromium/net/disk_cache/simple/simple_index_file.h b/chromium/net/disk_cache/simple/simple_index_file.h
index b536df9a1e7..e5fc85d69a2 100644
--- a/chromium/net/disk_cache/simple/simple_index_file.h
+++ b/chromium/net/disk_cache/simple/simple_index_file.h
@@ -97,6 +97,9 @@ class NET_EXPORT_PRIVATE SimpleIndexFile {
private:
friend class WrappedSimpleIndexFile;
+ // Used for cache directory traversal.
+ typedef base::Callback<void (const base::FilePath&)> EntryFileCallback;
+
// When loading the entries from disk, add this many extra hash buckets to
// prevent reallocation on the IO thread when merging in new live entries.
static const int kExtraSizeForMerge = 512;
@@ -123,6 +126,15 @@ class NET_EXPORT_PRIVATE SimpleIndexFile {
static void Deserialize(const char* data, int data_len,
SimpleIndexLoadResult* out_result);
+ // Implemented either in simple_index_file_posix.cc or
+ // simple_index_file_win.cc. base::FileEnumerator turned out to be very
+ // expensive in terms of memory usage therefore it's used only on non-POSIX
+ // environments for convenience (for now). Returns whether the traversal
+ // succeeded.
+ static bool TraverseCacheDirectory(
+ const base::FilePath& cache_path,
+ const EntryFileCallback& entry_file_callback);
+
// Scan the index directory for entries, returning an EntrySet of all entries
// found.
static void SyncRestoreFromDisk(const base::FilePath& cache_directory,
@@ -144,9 +156,6 @@ class NET_EXPORT_PRIVATE SimpleIndexFile {
const base::FilePath index_file_;
const base::FilePath temp_index_file_;
- static const char kIndexFileName[];
- static const char kTempIndexFileName[];
-
DISALLOW_COPY_AND_ASSIGN(SimpleIndexFile);
};
diff --git a/chromium/net/disk_cache/simple/simple_index_file_posix.cc b/chromium/net/disk_cache/simple/simple_index_file_posix.cc
new file mode 100644
index 00000000000..586699d2a8e
--- /dev/null
+++ b/chromium/net/disk_cache/simple/simple_index_file_posix.cc
@@ -0,0 +1,52 @@
+// Copyright (c) 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 "net/disk_cache/simple/simple_index_file.h"
+
+#include <dirent.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <string>
+
+#include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
+
+namespace disk_cache {
+namespace {
+
+struct DirCloser {
+ void operator()(DIR* dir) { closedir(dir); }
+};
+
+typedef scoped_ptr<DIR, DirCloser> ScopedDir;
+
+} // namespace
+
+// static
+bool SimpleIndexFile::TraverseCacheDirectory(
+ const base::FilePath& cache_path,
+ const EntryFileCallback& entry_file_callback) {
+ const ScopedDir dir(opendir(cache_path.value().c_str()));
+ if (!dir) {
+ PLOG(ERROR) << "opendir " << cache_path.value();
+ return false;
+ }
+ dirent entry, *result;
+ while (readdir_r(dir.get(), &entry, &result) == 0) {
+ if (!result)
+ return true; // The traversal completed successfully.
+ const std::string file_name(result->d_name);
+ if (file_name == "." || file_name == "..")
+ continue;
+ const base::FilePath file_path = cache_path.Append(
+ base::FilePath(file_name));
+ entry_file_callback.Run(file_path);
+ }
+ PLOG(ERROR) << "readdir_r " << cache_path.value();
+ return false;
+}
+
+} // namespace disk_cache
diff --git a/chromium/net/disk_cache/simple/simple_index_file_win.cc b/chromium/net/disk_cache/simple/simple_index_file_win.cc
new file mode 100644
index 00000000000..051d12deaf7
--- /dev/null
+++ b/chromium/net/disk_cache/simple/simple_index_file_win.cc
@@ -0,0 +1,33 @@
+// Copyright (c) 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 "net/disk_cache/simple/simple_index_file.h"
+
+#include <string>
+
+#include "base/files/file_enumerator.h"
+#include "base/files/file_path.h"
+
+namespace disk_cache {
+
+// static
+bool SimpleIndexFile::TraverseCacheDirectory(
+ const base::FilePath& cache_path,
+ const EntryFileCallback& entry_file_callback) {
+ const base::FilePath current_directory(FILE_PATH_LITERAL("."));
+ const base::FilePath parent_directory(FILE_PATH_LITERAL(".."));
+ const base::FilePath::StringType file_pattern = FILE_PATH_LITERAL("*");
+ base::FileEnumerator enumerator(
+ cache_path, false /* recursive */, base::FileEnumerator::FILES,
+ file_pattern);
+ for (base::FilePath file_path = enumerator.Next(); !file_path.empty();
+ file_path = enumerator.Next()) {
+ if (file_path == current_directory || file_path == parent_directory)
+ continue;
+ entry_file_callback.Run(file_path);
+ }
+ return true;
+}
+
+} // namespace disk_cache
diff --git a/chromium/net/disk_cache/simple/simple_util.cc b/chromium/net/disk_cache/simple/simple_util.cc
index 72a4612271f..e9ec067635a 100644
--- a/chromium/net/disk_cache/simple/simple_util.cc
+++ b/chromium/net/disk_cache/simple/simple_util.cc
@@ -40,7 +40,7 @@ std::string GetEntryHashKeyAsHexString(const std::string& key) {
return hash_key_str;
}
-bool GetEntryHashKeyFromHexString(const std::string& hash_key,
+bool GetEntryHashKeyFromHexString(const base::StringPiece& hash_key,
uint64* hash_key_out) {
if (hash_key.size() != kEntryHashKeyAsHexStringSize) {
return false;
diff --git a/chromium/net/disk_cache/simple/simple_util.h b/chromium/net/disk_cache/simple/simple_util.h
index 2e92b4a049d..3bb80b95402 100644
--- a/chromium/net/disk_cache/simple/simple_util.h
+++ b/chromium/net/disk_cache/simple/simple_util.h
@@ -8,6 +8,7 @@
#include <string>
#include "base/basictypes.h"
+#include "base/strings/string_piece.h"
#include "net/base/net_export.h"
namespace base {
@@ -33,7 +34,7 @@ NET_EXPORT_PRIVATE uint64 GetEntryHashKey(const std::string& key);
// Parses the |hash_key| string into a uint64 buffer.
// |hash_key| string must be of the form: FFFFFFFFFFFFFFFF .
NET_EXPORT_PRIVATE bool GetEntryHashKeyFromHexString(
- const std::string& hash_key,
+ const base::StringPiece& hash_key,
uint64* hash_key_out);
// Given a |key| for a (potential) entry in the simple backend and the |index|
diff --git a/chromium/net/dns/address_sorter_posix_unittest.cc b/chromium/net/dns/address_sorter_posix_unittest.cc
index c4517379957..96cbfc6fcb0 100644
--- a/chromium/net/dns/address_sorter_posix_unittest.cc
+++ b/chromium/net/dns/address_sorter_posix_unittest.cc
@@ -10,8 +10,6 @@
#include "net/base/net_util.h"
#include "net/base/test_completion_callback.h"
#include "net/socket/client_socket_factory.h"
-#include "net/socket/ssl_client_socket.h"
-#include "net/socket/stream_socket.h"
#include "net/udp/datagram_client_socket.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -92,27 +90,27 @@ class TestSocketFactory : public ClientSocketFactory {
TestSocketFactory() {}
virtual ~TestSocketFactory() {}
- virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
+ virtual DatagramClientSocket* CreateDatagramClientSocket(
DatagramSocket::BindType,
const RandIntCallback&,
NetLog*,
const NetLog::Source&) OVERRIDE {
- return scoped_ptr<DatagramClientSocket>(new TestUDPClientSocket(&mapping_));
+ return new TestUDPClientSocket(&mapping_);
}
- virtual scoped_ptr<StreamSocket> CreateTransportClientSocket(
+ virtual StreamSocket* CreateTransportClientSocket(
const AddressList&,
NetLog*,
const NetLog::Source&) OVERRIDE {
NOTIMPLEMENTED();
- return scoped_ptr<StreamSocket>();
+ return NULL;
}
- virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<ClientSocketHandle>,
+ virtual SSLClientSocket* CreateSSLClientSocket(
+ ClientSocketHandle*,
const HostPortPair&,
const SSLConfig&,
const SSLClientSocketContext&) OVERRIDE {
NOTIMPLEMENTED();
- return scoped_ptr<SSLClientSocket>();
+ return NULL;
}
virtual void ClearSSLSessionCache() OVERRIDE {
NOTIMPLEMENTED();
diff --git a/chromium/net/dns/dns_session_unittest.cc b/chromium/net/dns/dns_session_unittest.cc
index ed726f23234..46627069f66 100644
--- a/chromium/net/dns/dns_session_unittest.cc
+++ b/chromium/net/dns/dns_session_unittest.cc
@@ -14,8 +14,6 @@
#include "net/dns/dns_protocol.h"
#include "net/dns/dns_socket_pool.h"
#include "net/socket/socket_test_util.h"
-#include "net/socket/ssl_client_socket.h"
-#include "net/socket/stream_socket.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
@@ -26,26 +24,26 @@ class TestClientSocketFactory : public ClientSocketFactory {
public:
virtual ~TestClientSocketFactory();
- virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
+ virtual DatagramClientSocket* CreateDatagramClientSocket(
DatagramSocket::BindType bind_type,
const RandIntCallback& rand_int_cb,
net::NetLog* net_log,
const net::NetLog::Source& source) OVERRIDE;
- virtual scoped_ptr<StreamSocket> CreateTransportClientSocket(
+ virtual StreamSocket* CreateTransportClientSocket(
const AddressList& addresses,
NetLog*, const NetLog::Source&) OVERRIDE {
NOTIMPLEMENTED();
- return scoped_ptr<StreamSocket>();
+ return NULL;
}
- virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
+ virtual SSLClientSocket* CreateSSLClientSocket(
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context) OVERRIDE {
NOTIMPLEMENTED();
- return scoped_ptr<SSLClientSocket>();
+ return NULL;
}
virtual void ClearSSLSessionCache() OVERRIDE {
@@ -181,8 +179,7 @@ bool DnsSessionTest::ExpectEvent(const PoolEvent& expected) {
return true;
}
-scoped_ptr<DatagramClientSocket>
-TestClientSocketFactory::CreateDatagramClientSocket(
+DatagramClientSocket* TestClientSocketFactory::CreateDatagramClientSocket(
DatagramSocket::BindType bind_type,
const RandIntCallback& rand_int_cb,
net::NetLog* net_log,
@@ -191,10 +188,9 @@ TestClientSocketFactory::CreateDatagramClientSocket(
// simplest SocketDataProvider with no data supplied.
SocketDataProvider* data_provider = new StaticSocketDataProvider();
data_providers_.push_back(data_provider);
- scoped_ptr<MockUDPClientSocket> socket(
- new MockUDPClientSocket(data_provider, net_log));
- data_provider->set_socket(socket.get());
- return socket.PassAs<DatagramClientSocket>();
+ MockUDPClientSocket* socket = new MockUDPClientSocket(data_provider, net_log);
+ data_provider->set_socket(socket);
+ return socket;
}
TestClientSocketFactory::~TestClientSocketFactory() {
diff --git a/chromium/net/dns/dns_socket_pool.cc b/chromium/net/dns/dns_socket_pool.cc
index 7a7ecd6ee8f..64570fca8fc 100644
--- a/chromium/net/dns/dns_socket_pool.cc
+++ b/chromium/net/dns/dns_socket_pool.cc
@@ -76,8 +76,8 @@ scoped_ptr<DatagramClientSocket> DnsSocketPool::CreateConnectedSocket(
scoped_ptr<DatagramClientSocket> socket;
NetLog::Source no_source;
- socket = socket_factory_->CreateDatagramClientSocket(
- kBindType, base::Bind(&base::RandInt), net_log_, no_source);
+ socket.reset(socket_factory_->CreateDatagramClientSocket(
+ kBindType, base::Bind(&base::RandInt), net_log_, no_source));
if (socket.get()) {
int rv = socket->Connect((*nameservers_)[server_index]);
diff --git a/chromium/net/dns/dns_transaction_unittest.cc b/chromium/net/dns/dns_transaction_unittest.cc
index 7040e44be16..f9667eed5f4 100644
--- a/chromium/net/dns/dns_transaction_unittest.cc
+++ b/chromium/net/dns/dns_transaction_unittest.cc
@@ -180,21 +180,21 @@ class TestSocketFactory : public MockClientSocketFactory {
TestSocketFactory() : fail_next_socket_(false) {}
virtual ~TestSocketFactory() {}
- virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
+ virtual DatagramClientSocket* CreateDatagramClientSocket(
DatagramSocket::BindType bind_type,
const RandIntCallback& rand_int_cb,
net::NetLog* net_log,
const net::NetLog::Source& source) OVERRIDE {
if (fail_next_socket_) {
fail_next_socket_ = false;
- return scoped_ptr<DatagramClientSocket>(
- new FailingUDPClientSocket(&empty_data_, net_log));
+ return new FailingUDPClientSocket(&empty_data_, net_log);
}
SocketDataProvider* data_provider = mock_data().GetNext();
- scoped_ptr<TestUDPClientSocket> socket(
- new TestUDPClientSocket(this, data_provider, net_log));
- data_provider->set_socket(socket.get());
- return socket.PassAs<DatagramClientSocket>();
+ TestUDPClientSocket* socket = new TestUDPClientSocket(this,
+ data_provider,
+ net_log);
+ data_provider->set_socket(socket);
+ return socket;
}
void OnConnect(const IPEndPoint& endpoint) {
diff --git a/chromium/net/dns/host_resolver_impl.cc b/chromium/net/dns/host_resolver_impl.cc
index 10631773291..e656f03955f 100644
--- a/chromium/net/dns/host_resolver_impl.cc
+++ b/chromium/net/dns/host_resolver_impl.cc
@@ -2023,35 +2023,35 @@ HostResolverImpl::Key HostResolverImpl::GetEffectiveKeyForRequest(
AddressFamily effective_address_family = info.address_family();
if (info.address_family() == ADDRESS_FAMILY_UNSPECIFIED) {
- if (probe_ipv6_support_) {
- base::TimeTicks start_time = base::TimeTicks::Now();
- // Google DNS address.
- const uint8 kIPv6Address[] =
- { 0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88 };
- IPAddressNumber address(kIPv6Address,
- kIPv6Address + arraysize(kIPv6Address));
- bool rv6 = IsGloballyReachable(address, net_log);
- if (rv6)
- net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_IPV6_SUPPORTED);
-
- UMA_HISTOGRAM_TIMES("Net.IPv6ConnectDuration",
- base::TimeTicks::Now() - start_time);
- if (rv6) {
- UMA_HISTOGRAM_BOOLEAN("Net.IPv6ConnectSuccessMatch",
- default_address_family_ == ADDRESS_FAMILY_UNSPECIFIED);
- } else {
- UMA_HISTOGRAM_BOOLEAN("Net.IPv6ConnectFailureMatch",
- default_address_family_ != ADDRESS_FAMILY_UNSPECIFIED);
-
- effective_address_family = ADDRESS_FAMILY_IPV4;
- effective_flags |= HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6;
- }
+ base::TimeTicks start_time = base::TimeTicks::Now();
+ // Google DNS address.
+ const uint8 kIPv6Address[] =
+ { 0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88 };
+ IPAddressNumber address(kIPv6Address,
+ kIPv6Address + arraysize(kIPv6Address));
+ bool rv6 = IsGloballyReachable(address, net_log);
+ if (rv6)
+ net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_IPV6_SUPPORTED);
+
+ UMA_HISTOGRAM_TIMES("Net.IPv6ConnectDuration",
+ base::TimeTicks::Now() - start_time);
+ if (rv6) {
+ UMA_HISTOGRAM_BOOLEAN("Net.IPv6ConnectSuccessMatch",
+ default_address_family_ == ADDRESS_FAMILY_UNSPECIFIED);
} else {
- effective_address_family = default_address_family_;
+ UMA_HISTOGRAM_BOOLEAN("Net.IPv6ConnectFailureMatch",
+ default_address_family_ != ADDRESS_FAMILY_UNSPECIFIED);
}
}
+ if (effective_address_family == ADDRESS_FAMILY_UNSPECIFIED &&
+ default_address_family_ != ADDRESS_FAMILY_UNSPECIFIED) {
+ effective_address_family = default_address_family_;
+ if (probe_ipv6_support_)
+ effective_flags |= HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6;
+ }
+
return Key(info.hostname(), effective_address_family, effective_flags);
}
diff --git a/chromium/net/ftp/ftp_network_transaction.cc b/chromium/net/ftp/ftp_network_transaction.cc
index f9f7b820168..ccd6e2ef3b1 100644
--- a/chromium/net/ftp/ftp_network_transaction.cc
+++ b/chromium/net/ftp/ftp_network_transaction.cc
@@ -663,8 +663,8 @@ int FtpNetworkTransaction::DoCtrlResolveHostComplete(int result) {
int FtpNetworkTransaction::DoCtrlConnect() {
next_state_ = STATE_CTRL_CONNECT_COMPLETE;
- ctrl_socket_ = socket_factory_->CreateTransportClientSocket(
- addresses_, net_log_.net_log(), net_log_.source());
+ ctrl_socket_.reset(socket_factory_->CreateTransportClientSocket(
+ addresses_, net_log_.net_log(), net_log_.source()));
net_log_.AddEvent(
NetLog::TYPE_FTP_CONTROL_CONNECTION,
ctrl_socket_->NetLog().source().ToEventParametersCallback());
@@ -1249,8 +1249,8 @@ int FtpNetworkTransaction::DoDataConnect() {
return Stop(rv);
data_address = AddressList::CreateFromIPAddress(
ip_endpoint.address(), data_connection_port_);
- data_socket_ = socket_factory_->CreateTransportClientSocket(
- data_address, net_log_.net_log(), net_log_.source());
+ data_socket_.reset(socket_factory_->CreateTransportClientSocket(
+ data_address, net_log_.net_log(), net_log_.source()));
net_log_.AddEvent(
NetLog::TYPE_FTP_DATA_CONNECTION,
data_socket_->NetLog().source().ToEventParametersCallback());
diff --git a/chromium/net/http/http_basic_stream.cc b/chromium/net/http/http_basic_stream.cc
index c30e17d6203..d70ac02be74 100644
--- a/chromium/net/http/http_basic_stream.cc
+++ b/chromium/net/http/http_basic_stream.cc
@@ -127,8 +127,4 @@ void HttpBasicStream::Drain(HttpNetworkSession* session) {
// |drainer| will delete itself.
}
-void HttpBasicStream::SetPriority(RequestPriority priority) {
- // TODO(akalin): Plumb this through to |connection_|.
-}
-
} // namespace net
diff --git a/chromium/net/http/http_basic_stream.h b/chromium/net/http/http_basic_stream.h
index 2057837e9a9..2d4bb65ad32 100644
--- a/chromium/net/http/http_basic_stream.h
+++ b/chromium/net/http/http_basic_stream.h
@@ -81,8 +81,6 @@ class HttpBasicStream : public HttpStream {
virtual void Drain(HttpNetworkSession* session) OVERRIDE;
- virtual void SetPriority(RequestPriority priority) OVERRIDE;
-
private:
scoped_refptr<GrowableIOBuffer> read_buf_;
diff --git a/chromium/net/http/http_cache_transaction.cc b/chromium/net/http/http_cache_transaction.cc
index 8d4a45573b8..d1307012208 100644
--- a/chromium/net/http/http_cache_transaction.cc
+++ b/chromium/net/http/http_cache_transaction.cc
@@ -1538,6 +1538,20 @@ int HttpCache::Transaction::DoCacheQueryData() {
}
int HttpCache::Transaction::DoCacheQueryDataComplete(int result) {
+#if defined(OS_ANDROID)
+ if (result == ERR_NOT_IMPLEMENTED) {
+ // Restart the request overwriting the cache entry.
+ //
+ // Note: this would have fixed range requests for debug builds on all OSes,
+ // not just Android, but karen@ prefers to limit the effect based on OS for
+ // cherry-picked fixes.
+ // TODO(pasko): remove the OS_ANDROID limitation as soon as the fix proves
+ // useful after the cherry-pick.
+ // TODO(pasko): remove this workaround as soon as the SimpleBackendImpl
+ // supports Sparse IO.
+ return DoRestartPartialRequest();
+ }
+#endif
DCHECK_EQ(OK, result);
if (!cache_.get())
return ERR_UNEXPECTED;
diff --git a/chromium/net/http/http_cache_unittest.cc b/chromium/net/http/http_cache_unittest.cc
index 37e53346f42..c2bfde7bce2 100644
--- a/chromium/net/http/http_cache_unittest.cc
+++ b/chromium/net/http/http_cache_unittest.cc
@@ -3394,6 +3394,82 @@ TEST(HttpCache, RangeGET_OK) {
RemoveMockTransaction(&kRangeGET_TransactionOK);
}
+#if defined(OS_ANDROID)
+
+// Checks that with a cache backend having Sparse IO unimplementes the cache
+// entry would be doomed after a range request.
+// TODO(pasko): remove when the SimpleBackendImpl implements Sparse IO.
+TEST(HttpCache, RangeGET_SparseNotImplemented) {
+ MockHttpCache cache;
+ cache.disk_cache()->set_fail_sparse_requests();
+
+ // Run a cacheable request to prime the cache.
+ MockTransaction transaction(kTypicalGET_Transaction);
+ transaction.url = kRangeGET_TransactionOK.url;
+ AddMockTransaction(&transaction);
+ RunTransactionTest(cache.http_cache(), transaction);
+ EXPECT_EQ(1, cache.network_layer()->transaction_count());
+ EXPECT_EQ(0, cache.disk_cache()->open_count());
+ EXPECT_EQ(1, cache.disk_cache()->create_count());
+
+ // Verify that we added the entry.
+ disk_cache::Entry* entry;
+ net::TestCompletionCallback cb;
+ int rv = cache.disk_cache()->OpenEntry(transaction.url,
+ &entry,
+ cb.callback());
+ ASSERT_EQ(net::OK, cb.GetResult(rv));
+ EXPECT_EQ(1, cache.disk_cache()->open_count());
+ entry->Close();
+ RemoveMockTransaction(&transaction);
+
+ // Request the range with the backend that does not support it.
+ MockTransaction transaction2(kRangeGET_TransactionOK);
+ std::string headers;
+ AddMockTransaction(&transaction2);
+ RunTransactionTestWithResponse(cache.http_cache(), transaction2, &headers);
+ EXPECT_EQ(2, cache.network_layer()->transaction_count());
+ EXPECT_EQ(2, cache.disk_cache()->open_count());
+ EXPECT_EQ(2, cache.disk_cache()->create_count());
+
+ // Mock cache would return net::ERR_CACHE_OPEN_FAILURE on a doomed entry, even
+ // if it was re-created later, so this effectively checks that the old data is
+ // gone.
+ disk_cache::Entry* entry2;
+ rv = cache.disk_cache()->OpenEntry(transaction2.url,
+ &entry2,
+ cb.callback());
+ ASSERT_EQ(net::ERR_CACHE_OPEN_FAILURE, cb.GetResult(rv));
+ RemoveMockTransaction(&transaction2);
+}
+
+TEST(HttpCache, RangeGET_SparseNotImplementedOnEmptyCache) {
+ MockHttpCache cache;
+ cache.disk_cache()->set_fail_sparse_requests();
+
+ // Request the range with the backend that does not support it.
+ MockTransaction transaction(kRangeGET_TransactionOK);
+ std::string headers;
+ AddMockTransaction(&transaction);
+ RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers);
+ EXPECT_EQ(1, cache.network_layer()->transaction_count());
+ EXPECT_EQ(0, cache.disk_cache()->open_count());
+ EXPECT_EQ(1, cache.disk_cache()->create_count());
+
+ // Mock cache would return net::ERR_CACHE_OPEN_FAILURE on a doomed entry, even
+ // if it was re-created later, so this effectively checks that the old data is
+ // gone as a result of a failed range write.
+ disk_cache::Entry* entry;
+ net::TestCompletionCallback cb;
+ int rv = cache.disk_cache()->OpenEntry(transaction.url,
+ &entry,
+ cb.callback());
+ ASSERT_EQ(net::ERR_CACHE_OPEN_FAILURE, cb.GetResult(rv));
+ RemoveMockTransaction(&transaction);
+}
+
+#endif // OS_ANDROID
+
// Tests that we can cache range requests and fetch random blocks from the
// cache and the network, with synchronous responses.
TEST(HttpCache, RangeGET_SyncOK) {
diff --git a/chromium/net/http/http_network_transaction.cc b/chromium/net/http/http_network_transaction.cc
index a63a2aa43b9..70292be257f 100644
--- a/chromium/net/http/http_network_transaction.cc
+++ b/chromium/net/http/http_network_transaction.cc
@@ -419,10 +419,8 @@ bool HttpNetworkTransaction::GetLoadTimingInfo(
void HttpNetworkTransaction::SetPriority(RequestPriority priority) {
priority_ = priority;
- if (stream_request_)
- stream_request_->SetPriority(priority);
- if (stream_)
- stream_->SetPriority(priority);
+ // TODO(akalin): Plumb this through to |stream_request_| and
+ // |stream_|.
}
void HttpNetworkTransaction::OnStreamReady(const SSLConfig& used_ssl_config,
diff --git a/chromium/net/http/http_network_transaction_unittest.cc b/chromium/net/http/http_network_transaction_unittest.cc
index d89ab546afd..5f8dac2f87d 100644
--- a/chromium/net/http/http_network_transaction_unittest.cc
+++ b/chromium/net/http/http_network_transaction_unittest.cc
@@ -15,7 +15,6 @@
#include "base/files/file_path.h"
#include "base/json/json_writer.h"
#include "base/memory/scoped_ptr.h"
-#include "base/memory/weak_ptr.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/test_file_util.h"
@@ -46,7 +45,6 @@
#include "net/http/http_stream_factory.h"
#include "net/http/http_transaction_unittest.h"
#include "net/proxy/proxy_config_service_fixed.h"
-#include "net/proxy/proxy_info.h"
#include "net/proxy/proxy_resolver.h"
#include "net/proxy/proxy_service.h"
#include "net/socket/client_socket_factory.h"
@@ -60,7 +58,6 @@
#include "net/spdy/spdy_session_pool.h"
#include "net/spdy/spdy_test_util_common.h"
#include "net/ssl/ssl_cert_request_info.h"
-#include "net/ssl/ssl_config_service.h"
#include "net/ssl/ssl_config_service_defaults.h"
#include "net/ssl/ssl_info.h"
#include "net/test/cert_test_util.h"
@@ -452,7 +449,7 @@ class CaptureGroupNameSocketPool : public ParentPool {
virtual void CancelRequest(const std::string& group_name,
ClientSocketHandle* handle) {}
virtual void ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
int id) {}
virtual void CloseIdleSockets() {}
virtual int IdleSocketCount() const {
@@ -11683,299 +11680,4 @@ TEST_P(HttpNetworkTransactionTest, GetFullRequestHeadersIncludesExtraHeader) {
EXPECT_EQ("bar", foo);
}
-namespace {
-
-// Fake HttpStreamBase that simply records calls to SetPriority().
-class FakeStream : public HttpStreamBase,
- public base::SupportsWeakPtr<FakeStream> {
- public:
- explicit FakeStream(RequestPriority priority) : priority_(priority) {}
- virtual ~FakeStream() {}
-
- RequestPriority priority() const { return priority_; }
-
- virtual int InitializeStream(const HttpRequestInfo* request_info,
- RequestPriority priority,
- const BoundNetLog& net_log,
- const CompletionCallback& callback) OVERRIDE {
- return ERR_IO_PENDING;
- }
-
- virtual int SendRequest(const HttpRequestHeaders& request_headers,
- HttpResponseInfo* response,
- const CompletionCallback& callback) OVERRIDE {
- ADD_FAILURE();
- return ERR_UNEXPECTED;
- }
-
- virtual int ReadResponseHeaders(const CompletionCallback& callback) OVERRIDE {
- ADD_FAILURE();
- return ERR_UNEXPECTED;
- }
-
- virtual const HttpResponseInfo* GetResponseInfo() const OVERRIDE {
- ADD_FAILURE();
- return NULL;
- }
-
- virtual int ReadResponseBody(IOBuffer* buf, int buf_len,
- const CompletionCallback& callback) OVERRIDE {
- ADD_FAILURE();
- return ERR_UNEXPECTED;
- }
-
- virtual void Close(bool not_reusable) OVERRIDE {}
-
- virtual bool IsResponseBodyComplete() const OVERRIDE {
- ADD_FAILURE();
- return false;
- }
-
- virtual bool CanFindEndOfResponse() const OVERRIDE {
- return false;
- }
-
- virtual bool IsConnectionReused() const OVERRIDE {
- ADD_FAILURE();
- return false;
- }
-
- virtual void SetConnectionReused() OVERRIDE {
- ADD_FAILURE();
- }
-
- virtual bool IsConnectionReusable() const OVERRIDE {
- ADD_FAILURE();
- return false;
- }
-
- virtual bool GetLoadTimingInfo(
- LoadTimingInfo* load_timing_info) const OVERRIDE {
- ADD_FAILURE();
- return false;
- }
-
- virtual void GetSSLInfo(SSLInfo* ssl_info) OVERRIDE {
- ADD_FAILURE();
- }
-
- virtual void GetSSLCertRequestInfo(
- SSLCertRequestInfo* cert_request_info) OVERRIDE {
- ADD_FAILURE();
- }
-
- virtual bool IsSpdyHttpStream() const OVERRIDE {
- ADD_FAILURE();
- return false;
- }
-
- virtual void Drain(HttpNetworkSession* session) OVERRIDE {
- ADD_FAILURE();
- }
-
- virtual void SetPriority(RequestPriority priority) OVERRIDE {
- priority_ = priority;
- }
-
- private:
- RequestPriority priority_;
-
- DISALLOW_COPY_AND_ASSIGN(FakeStream);
-};
-
-// Fake HttpStreamRequest that simply records calls to SetPriority()
-// and vends FakeStreams with its current priority.
-class FakeStreamRequest : public HttpStreamRequest,
- public base::SupportsWeakPtr<FakeStreamRequest> {
- public:
- FakeStreamRequest(RequestPriority priority,
- HttpStreamRequest::Delegate* delegate)
- : priority_(priority),
- delegate_(delegate) {}
-
- virtual ~FakeStreamRequest() {}
-
- RequestPriority priority() const { return priority_; }
-
- // Create a new FakeStream and pass it to the request's
- // delegate. Returns a weak pointer to the FakeStream.
- base::WeakPtr<FakeStream> FinishStreamRequest() {
- FakeStream* fake_stream = new FakeStream(priority_);
- // Do this before calling OnStreamReady() as OnStreamReady() may
- // immediately delete |fake_stream|.
- base::WeakPtr<FakeStream> weak_stream = fake_stream->AsWeakPtr();
- delegate_->OnStreamReady(SSLConfig(), ProxyInfo(), fake_stream);
- return weak_stream;
- }
-
- virtual int RestartTunnelWithProxyAuth(
- const AuthCredentials& credentials) OVERRIDE {
- ADD_FAILURE();
- return ERR_UNEXPECTED;
- }
-
- virtual LoadState GetLoadState() const OVERRIDE {
- ADD_FAILURE();
- return LoadState();
- }
-
- virtual void SetPriority(RequestPriority priority) OVERRIDE {
- priority_ = priority;
- }
-
- virtual bool was_npn_negotiated() const OVERRIDE {
- return false;
- }
-
- virtual NextProto protocol_negotiated() const OVERRIDE {
- return kProtoUnknown;
- }
-
- virtual bool using_spdy() const OVERRIDE {
- return false;
- }
-
- private:
- RequestPriority priority_;
- HttpStreamRequest::Delegate* const delegate_;
-
- DISALLOW_COPY_AND_ASSIGN(FakeStreamRequest);
-};
-
-// Fake HttpStreamFactory that vends FakeStreamRequests.
-class FakeStreamFactory : public HttpStreamFactory {
- public:
- FakeStreamFactory() {}
- virtual ~FakeStreamFactory() {}
-
- // Returns a WeakPtr<> to the last HttpStreamRequest returned by
- // RequestStream() (which may be NULL if it was destroyed already).
- base::WeakPtr<FakeStreamRequest> last_stream_request() {
- return last_stream_request_;
- }
-
- virtual HttpStreamRequest* RequestStream(
- const HttpRequestInfo& info,
- RequestPriority priority,
- const SSLConfig& server_ssl_config,
- const SSLConfig& proxy_ssl_config,
- HttpStreamRequest::Delegate* delegate,
- const BoundNetLog& net_log) OVERRIDE {
- FakeStreamRequest* fake_request = new FakeStreamRequest(priority, delegate);
- last_stream_request_ = fake_request->AsWeakPtr();
- return fake_request;
- }
-
- virtual HttpStreamRequest* RequestWebSocketStream(
- const HttpRequestInfo& info,
- RequestPriority priority,
- const SSLConfig& server_ssl_config,
- const SSLConfig& proxy_ssl_config,
- HttpStreamRequest::Delegate* delegate,
- WebSocketStreamBase::Factory* factory,
- const BoundNetLog& net_log) OVERRIDE {
- ADD_FAILURE();
- return NULL;
- }
-
- virtual void PreconnectStreams(int num_streams,
- const HttpRequestInfo& info,
- RequestPriority priority,
- const SSLConfig& server_ssl_config,
- const SSLConfig& proxy_ssl_config) OVERRIDE {
- ADD_FAILURE();
- }
-
- virtual base::Value* PipelineInfoToValue() const OVERRIDE {
- ADD_FAILURE();
- return NULL;
- }
-
- virtual const HostMappingRules* GetHostMappingRules() const OVERRIDE {
- ADD_FAILURE();
- return NULL;
- }
-
- private:
- base::WeakPtr<FakeStreamRequest> last_stream_request_;
-
- DISALLOW_COPY_AND_ASSIGN(FakeStreamFactory);
-};
-
-} // namespace
-
-// Make sure that HttpNetworkTransaction passes on its priority to its
-// stream request on start.
-TEST_P(HttpNetworkTransactionTest, SetStreamRequestPriorityOnStart) {
- scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_));
- HttpNetworkSessionPeer peer(session);
- FakeStreamFactory* fake_factory = new FakeStreamFactory();
- peer.SetHttpStreamFactory(fake_factory);
-
- HttpNetworkTransaction trans(LOW, session);
-
- ASSERT_TRUE(fake_factory->last_stream_request() == NULL);
-
- HttpRequestInfo request;
- TestCompletionCallback callback;
- EXPECT_EQ(ERR_IO_PENDING,
- trans.Start(&request, callback.callback(), BoundNetLog()));
-
- base::WeakPtr<FakeStreamRequest> fake_request =
- fake_factory->last_stream_request();
- ASSERT_TRUE(fake_request != NULL);
- EXPECT_EQ(LOW, fake_request->priority());
-}
-
-// Make sure that HttpNetworkTransaction passes on its priority
-// updates to its stream request.
-TEST_P(HttpNetworkTransactionTest, SetStreamRequestPriority) {
- scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_));
- HttpNetworkSessionPeer peer(session);
- FakeStreamFactory* fake_factory = new FakeStreamFactory();
- peer.SetHttpStreamFactory(fake_factory);
-
- HttpNetworkTransaction trans(LOW, session);
-
- HttpRequestInfo request;
- TestCompletionCallback callback;
- EXPECT_EQ(ERR_IO_PENDING,
- trans.Start(&request, callback.callback(), BoundNetLog()));
-
- base::WeakPtr<FakeStreamRequest> fake_request =
- fake_factory->last_stream_request();
- ASSERT_TRUE(fake_request != NULL);
- EXPECT_EQ(LOW, fake_request->priority());
-
- trans.SetPriority(LOWEST);
- ASSERT_TRUE(fake_request != NULL);
- EXPECT_EQ(LOWEST, fake_request->priority());
-}
-
-// Make sure that HttpNetworkTransaction passes on its priority
-// updates to its stream.
-TEST_P(HttpNetworkTransactionTest, SetStreamPriority) {
- scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_));
- HttpNetworkSessionPeer peer(session);
- FakeStreamFactory* fake_factory = new FakeStreamFactory();
- peer.SetHttpStreamFactory(fake_factory);
-
- HttpNetworkTransaction trans(LOW, session);
-
- HttpRequestInfo request;
- TestCompletionCallback callback;
- EXPECT_EQ(ERR_IO_PENDING,
- trans.Start(&request, callback.callback(), BoundNetLog()));
-
- base::WeakPtr<FakeStreamRequest> fake_request =
- fake_factory->last_stream_request();
- ASSERT_TRUE(fake_request != NULL);
- base::WeakPtr<FakeStream> fake_stream = fake_request->FinishStreamRequest();
- ASSERT_TRUE(fake_stream != NULL);
- EXPECT_EQ(LOW, fake_stream->priority());
-
- trans.SetPriority(LOWEST);
- EXPECT_EQ(LOWEST, fake_stream->priority());
-}
-
} // namespace net
diff --git a/chromium/net/http/http_pipelined_host_forced.cc b/chromium/net/http/http_pipelined_host_forced.cc
index 8059d848d73..8179e86f319 100644
--- a/chromium/net/http/http_pipelined_host_forced.cc
+++ b/chromium/net/http/http_pipelined_host_forced.cc
@@ -36,9 +36,10 @@ HttpPipelinedStream* HttpPipelinedHostForced::CreateStreamOnNewPipeline(
bool was_npn_negotiated,
NextProto protocol_negotiated) {
CHECK(!pipeline_.get());
- scoped_ptr<BufferedWriteStreamSocket> buffered_socket(
- new BufferedWriteStreamSocket(connection->PassSocket()));
- connection->SetSocket(buffered_socket.PassAs<StreamSocket>());
+ StreamSocket* wrapped_socket = connection->release_socket();
+ BufferedWriteStreamSocket* buffered_socket = new BufferedWriteStreamSocket(
+ wrapped_socket);
+ connection->set_socket(buffered_socket);
pipeline_.reset(factory_->CreateNewPipeline(
connection, this, key_.origin(), used_ssl_config, used_proxy_info,
net_log, was_npn_negotiated, protocol_negotiated));
diff --git a/chromium/net/http/http_pipelined_stream.cc b/chromium/net/http/http_pipelined_stream.cc
index df5743556d1..951c2f9afd6 100644
--- a/chromium/net/http/http_pipelined_stream.cc
+++ b/chromium/net/http/http_pipelined_stream.cc
@@ -121,11 +121,6 @@ void HttpPipelinedStream::Drain(HttpNetworkSession* session) {
pipeline_->Drain(this, session);
}
-void HttpPipelinedStream::SetPriority(RequestPriority priority) {
- // TODO(akalin): Plumb this through to |pipeline_| and its
- // underlying ClientSocketHandle.
-}
-
const SSLConfig& HttpPipelinedStream::used_ssl_config() const {
return pipeline_->used_ssl_config();
}
diff --git a/chromium/net/http/http_pipelined_stream.h b/chromium/net/http/http_pipelined_stream.h
index d3a7991e5ca..675d8f083a2 100644
--- a/chromium/net/http/http_pipelined_stream.h
+++ b/chromium/net/http/http_pipelined_stream.h
@@ -81,8 +81,6 @@ class HttpPipelinedStream : public HttpStream {
virtual void Drain(HttpNetworkSession* session) OVERRIDE;
- virtual void SetPriority(RequestPriority priority) OVERRIDE;
-
// The SSLConfig used to establish this stream's pipeline.
const SSLConfig& used_ssl_config() const;
diff --git a/chromium/net/http/http_proxy_client_socket_pool.cc b/chromium/net/http/http_proxy_client_socket_pool.cc
index c75df6f0d2f..b80df37b3dd 100644
--- a/chromium/net/http/http_proxy_client_socket_pool.cc
+++ b/chromium/net/http/http_proxy_client_socket_pool.cc
@@ -289,7 +289,7 @@ int HttpProxyConnectJob::DoHttpProxyConnect() {
int HttpProxyConnectJob::DoHttpProxyConnectComplete(int result) {
if (result == OK || result == ERR_PROXY_AUTH_REQUESTED ||
result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE) {
- SetSocket(transport_socket_.PassAs<StreamSocket>());
+ set_socket(transport_socket_.release());
}
return result;
@@ -380,19 +380,19 @@ HttpProxyConnectJobFactory::HttpProxyConnectJobFactory(
}
-scoped_ptr<ConnectJob>
+ConnectJob*
HttpProxyClientSocketPool::HttpProxyConnectJobFactory::NewConnectJob(
const std::string& group_name,
const PoolBase::Request& request,
ConnectJob::Delegate* delegate) const {
- return scoped_ptr<ConnectJob>(new HttpProxyConnectJob(group_name,
- request.params(),
- ConnectionTimeout(),
- transport_pool_,
- ssl_pool_,
- host_resolver_,
- delegate,
- net_log_));
+ return new HttpProxyConnectJob(group_name,
+ request.params(),
+ ConnectionTimeout(),
+ transport_pool_,
+ ssl_pool_,
+ host_resolver_,
+ delegate,
+ net_log_);
}
base::TimeDelta
@@ -462,9 +462,8 @@ void HttpProxyClientSocketPool::CancelRequest(
}
void HttpProxyClientSocketPool::ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
- int id) {
- base_.ReleaseSocket(group_name, socket.Pass(), id);
+ StreamSocket* socket, int id) {
+ base_.ReleaseSocket(group_name, socket, id);
}
void HttpProxyClientSocketPool::FlushWithError(int error) {
diff --git a/chromium/net/http/http_proxy_client_socket_pool.h b/chromium/net/http/http_proxy_client_socket_pool.h
index b77b5ae3571..a15b8cad809 100644
--- a/chromium/net/http/http_proxy_client_socket_pool.h
+++ b/chromium/net/http/http_proxy_client_socket_pool.h
@@ -204,7 +204,7 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketPool
ClientSocketHandle* handle) OVERRIDE;
virtual void ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
int id) OVERRIDE;
virtual void FlushWithError(int error) OVERRIDE;
@@ -250,7 +250,7 @@ class NET_EXPORT_PRIVATE HttpProxyClientSocketPool
NetLog* net_log);
// ClientSocketPoolBase::ConnectJobFactory methods.
- virtual scoped_ptr<ConnectJob> NewConnectJob(
+ virtual ConnectJob* NewConnectJob(
const std::string& group_name,
const PoolBase::Request& request,
ConnectJob::Delegate* delegate) const OVERRIDE;
diff --git a/chromium/net/http/http_response_body_drainer_unittest.cc b/chromium/net/http/http_response_body_drainer_unittest.cc
index 70134cce1ea..5d9fcc4689e 100644
--- a/chromium/net/http/http_response_body_drainer_unittest.cc
+++ b/chromium/net/http/http_response_body_drainer_unittest.cc
@@ -127,8 +127,6 @@ class MockHttpStream : public HttpStream {
virtual void Drain(HttpNetworkSession*) OVERRIDE {}
- virtual void SetPriority(RequestPriority priority) OVERRIDE {}
-
// Methods to tweak/observer mock behavior:
void set_stall_reads_forever() { stall_reads_forever_ = true; }
diff --git a/chromium/net/http/http_stream_base.h b/chromium/net/http/http_stream_base.h
index 596ed75dff1..6dce6d2a805 100644
--- a/chromium/net/http/http_stream_base.h
+++ b/chromium/net/http/http_stream_base.h
@@ -141,9 +141,6 @@ class NET_EXPORT_PRIVATE HttpStreamBase {
// draining is complete.
virtual void Drain(HttpNetworkSession* session) = 0;
- // Called when the priority of the parent transaction changes.
- virtual void SetPriority(RequestPriority priority) = 0;
-
private:
DISALLOW_COPY_AND_ASSIGN(HttpStreamBase);
};
diff --git a/chromium/net/http/http_stream_factory.h b/chromium/net/http/http_stream_factory.h
index 0de3b65bc57..6db6905b433 100644
--- a/chromium/net/http/http_stream_factory.h
+++ b/chromium/net/http/http_stream_factory.h
@@ -157,9 +157,6 @@ class NET_EXPORT_PRIVATE HttpStreamRequest {
virtual int RestartTunnelWithProxyAuth(
const AuthCredentials& credentials) = 0;
- // Called when the priority of the parent transaction changes.
- virtual void SetPriority(RequestPriority priority) = 0;
-
// Returns the LoadState for the request.
virtual LoadState GetLoadState() const = 0;
diff --git a/chromium/net/http/http_stream_factory_impl.h b/chromium/net/http/http_stream_factory_impl.h
index 4339fd350d7..3949f3839ee 100644
--- a/chromium/net/http/http_stream_factory_impl.h
+++ b/chromium/net/http/http_stream_factory_impl.h
@@ -9,7 +9,6 @@
#include <set>
#include <vector>
-#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "net/base/host_port_pair.h"
#include "net/base/net_log.h"
@@ -67,10 +66,8 @@ class NET_EXPORT_PRIVATE HttpStreamFactoryImpl :
size_t num_orphaned_jobs() const { return orphaned_job_set_.size(); }
private:
- FRIEND_TEST_ALL_PREFIXES(HttpStreamFactoryImplRequestTest, SetPriority);
-
- class NET_EXPORT_PRIVATE Request;
- class NET_EXPORT_PRIVATE Job;
+ class Request;
+ class Job;
typedef std::set<Request*> RequestSet;
typedef std::vector<Request*> RequestVector;
diff --git a/chromium/net/http/http_stream_factory_impl_job.cc b/chromium/net/http/http_stream_factory_impl_job.cc
index c0383f4772d..b2eee3b0fbe 100644
--- a/chromium/net/http/http_stream_factory_impl_job.cc
+++ b/chromium/net/http/http_stream_factory_impl_job.cc
@@ -230,17 +230,12 @@ void HttpStreamFactoryImpl::Job::Orphan(const Request* request) {
}
}
-void HttpStreamFactoryImpl::Job::SetPriority(RequestPriority priority) {
- priority_ = priority;
- // TODO(akalin): Propagate this to |connection_| and maybe the
- // preconnect state.
-}
-
bool HttpStreamFactoryImpl::Job::was_npn_negotiated() const {
return was_npn_negotiated_;
}
-NextProto HttpStreamFactoryImpl::Job::protocol_negotiated() const {
+NextProto HttpStreamFactoryImpl::Job::protocol_negotiated()
+ const {
return protocol_negotiated_;
}
diff --git a/chromium/net/http/http_stream_factory_impl_job.h b/chromium/net/http/http_stream_factory_impl_job.h
index 01a794a1bc7..2c2eb349586 100644
--- a/chromium/net/http/http_stream_factory_impl_job.h
+++ b/chromium/net/http/http_stream_factory_impl_job.h
@@ -74,9 +74,6 @@ class HttpStreamFactoryImpl::Job {
// Used to detach the Job from |request|.
void Orphan(const Request* request);
- void SetPriority(RequestPriority priority);
-
- RequestPriority priority() const { return priority_; }
bool was_npn_negotiated() const;
NextProto protocol_negotiated() const;
bool using_spdy() const;
diff --git a/chromium/net/http/http_stream_factory_impl_request.cc b/chromium/net/http/http_stream_factory_impl_request.cc
index 57190ed72e7..e73a897a528 100644
--- a/chromium/net/http/http_stream_factory_impl_request.cc
+++ b/chromium/net/http/http_stream_factory_impl_request.cc
@@ -215,15 +215,6 @@ int HttpStreamFactoryImpl::Request::RestartTunnelWithProxyAuth(
return bound_job_->RestartTunnelWithProxyAuth(credentials);
}
-void HttpStreamFactoryImpl::Request::SetPriority(RequestPriority priority) {
- for (std::set<HttpStreamFactoryImpl::Job*>::const_iterator it = jobs_.begin();
- it != jobs_.end(); ++it) {
- (*it)->SetPriority(priority);
- }
- if (bound_job_)
- bound_job_->SetPriority(priority);
-}
-
LoadState HttpStreamFactoryImpl::Request::GetLoadState() const {
if (bound_job_.get())
return bound_job_->GetLoadState();
diff --git a/chromium/net/http/http_stream_factory_impl_request.h b/chromium/net/http/http_stream_factory_impl_request.h
index d6f9b02cbef..169e1f54ce9 100644
--- a/chromium/net/http/http_stream_factory_impl_request.h
+++ b/chromium/net/http/http_stream_factory_impl_request.h
@@ -105,7 +105,6 @@ class HttpStreamFactoryImpl::Request : public HttpStreamRequest {
virtual int RestartTunnelWithProxyAuth(
const AuthCredentials& credentials) OVERRIDE;
- virtual void SetPriority(RequestPriority priority) OVERRIDE;
virtual LoadState GetLoadState() const OVERRIDE;
virtual bool was_npn_negotiated() const OVERRIDE;
virtual NextProto protocol_negotiated() const OVERRIDE;
diff --git a/chromium/net/http/http_stream_factory_impl_request_unittest.cc b/chromium/net/http/http_stream_factory_impl_request_unittest.cc
deleted file mode 100644
index 1f38a2e56f6..00000000000
--- a/chromium/net/http/http_stream_factory_impl_request_unittest.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright (c) 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 "net/http/http_stream_factory_impl_request.h"
-
-#include "net/http/http_stream_factory_impl_job.h"
-#include "net/proxy/proxy_info.h"
-#include "net/proxy/proxy_service.h"
-#include "net/spdy/spdy_test_util_common.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace net {
-
-class HttpStreamFactoryImplRequestTest
- : public ::testing::Test,
- public ::testing::WithParamInterface<NextProto> {};
-
-INSTANTIATE_TEST_CASE_P(
- NextProto,
- HttpStreamFactoryImplRequestTest,
- testing::Values(kProtoSPDY2, kProtoSPDY3, kProtoSPDY31, kProtoSPDY4a2,
- kProtoHTTP2Draft04));
-
-namespace {
-
-class DoNothingRequestDelegate : public HttpStreamRequest::Delegate {
- public:
- DoNothingRequestDelegate() {}
-
- virtual ~DoNothingRequestDelegate() {}
-
- // HttpStreamRequest::Delegate
- virtual void OnStreamReady(
- const SSLConfig& used_ssl_config,
- const ProxyInfo& used_proxy_info,
- HttpStreamBase* stream) OVERRIDE {}
- virtual void OnWebSocketStreamReady(
- const SSLConfig& used_ssl_config,
- const ProxyInfo& used_proxy_info,
- WebSocketStreamBase* stream) OVERRIDE {}
- virtual void OnStreamFailed(
- int status,
- const SSLConfig& used_ssl_config) OVERRIDE {}
- virtual void OnCertificateError(
- int status,
- const SSLConfig& used_ssl_config,
- const SSLInfo& ssl_info) OVERRIDE {}
- virtual void OnNeedsProxyAuth(const HttpResponseInfo& proxy_response,
- const SSLConfig& used_ssl_config,
- const ProxyInfo& used_proxy_info,
- HttpAuthController* auth_controller) OVERRIDE {}
- virtual void OnNeedsClientAuth(const SSLConfig& used_ssl_config,
- SSLCertRequestInfo* cert_info) OVERRIDE {}
- virtual void OnHttpsProxyTunnelResponse(const HttpResponseInfo& response_info,
- const SSLConfig& used_ssl_config,
- const ProxyInfo& used_proxy_info,
- HttpStreamBase* stream) OVERRIDE {}
-};
-
-} // namespace
-
-// Make sure that Request passes on its priority updates to its jobs.
-TEST_P(HttpStreamFactoryImplRequestTest, SetPriority) {
- SpdySessionDependencies session_deps(GetParam(),
- ProxyService::CreateDirect());
-
- scoped_refptr<HttpNetworkSession>
- session(SpdySessionDependencies::SpdyCreateSession(&session_deps));
- HttpStreamFactoryImpl* factory =
- static_cast<HttpStreamFactoryImpl*>(session->http_stream_factory());
-
- DoNothingRequestDelegate request_delegate;
- HttpStreamFactoryImpl::Request request(
- GURL(), factory, &request_delegate, NULL, BoundNetLog());
-
- HttpStreamFactoryImpl::Job* job =
- new HttpStreamFactoryImpl::Job(factory,
- session,
- HttpRequestInfo(),
- DEFAULT_PRIORITY,
- SSLConfig(),
- SSLConfig(),
- NULL);
- request.AttachJob(job);
- EXPECT_EQ(DEFAULT_PRIORITY, job->priority());
-
- request.SetPriority(MEDIUM);
- EXPECT_EQ(MEDIUM, job->priority());
-
- // Make |job| the bound job.
- request.OnStreamFailed(job, ERR_FAILED, SSLConfig());
-
- request.SetPriority(IDLE);
- EXPECT_EQ(IDLE, job->priority());
-}
-
-} // namespace net
diff --git a/chromium/net/http/http_stream_factory_impl_unittest.cc b/chromium/net/http/http_stream_factory_impl_unittest.cc
index f378c93ea18..14fbc0338a3 100644
--- a/chromium/net/http/http_stream_factory_impl_unittest.cc
+++ b/chromium/net/http/http_stream_factory_impl_unittest.cc
@@ -314,7 +314,7 @@ class CapturePreconnectsSocketPool : public ParentPool {
ADD_FAILURE();
}
virtual void ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
int id) OVERRIDE {
ADD_FAILURE();
}
diff --git a/chromium/net/http/http_stream_parser_unittest.cc b/chromium/net/http/http_stream_parser_unittest.cc
index 84775945ec1..d530c2deab7 100644
--- a/chromium/net/http/http_stream_parser_unittest.cc
+++ b/chromium/net/http/http_stream_parser_unittest.cc
@@ -220,7 +220,7 @@ TEST(HttpStreamParser, AsyncChunkAndAsyncSocket) {
ASSERT_EQ(OK, rv);
scoped_ptr<ClientSocketHandle> socket_handle(new ClientSocketHandle);
- socket_handle->SetSocket(transport.PassAs<StreamSocket>());
+ socket_handle->set_socket(transport.release());
HttpRequestInfo request_info;
request_info.method = "GET";
@@ -375,7 +375,7 @@ TEST(HttpStreamParser, TruncatedHeaders) {
ASSERT_EQ(OK, rv);
scoped_ptr<ClientSocketHandle> socket_handle(new ClientSocketHandle);
- socket_handle->SetSocket(transport.PassAs<StreamSocket>());
+ socket_handle->set_socket(transport.release());
HttpRequestInfo request_info;
request_info.method = "GET";
diff --git a/chromium/net/http/mock_http_cache.cc b/chromium/net/http/mock_http_cache.cc
index 85ffa74584e..a3d55b17e6b 100644
--- a/chromium/net/http/mock_http_cache.cc
+++ b/chromium/net/http/mock_http_cache.cc
@@ -50,14 +50,10 @@ struct MockDiskEntry::CallbackInfo {
int result;
};
-MockDiskEntry::MockDiskEntry()
- : test_mode_(0), doomed_(false), sparse_(false),
- fail_requests_(false), busy_(false), delayed_(false) {
-}
-
MockDiskEntry::MockDiskEntry(const std::string& key)
: key_(key), doomed_(false), sparse_(false),
- fail_requests_(false), busy_(false), delayed_(false) {
+ fail_requests_(false), fail_sparse_requests_(false), busy_(false),
+ delayed_(false) {
test_mode_ = GetTestModeForEntry(key);
}
@@ -139,6 +135,8 @@ int MockDiskEntry::WriteData(
int MockDiskEntry::ReadSparseData(int64 offset, net::IOBuffer* buf, int buf_len,
const net::CompletionCallback& callback) {
DCHECK(!callback.is_null());
+ if (fail_sparse_requests_)
+ return net::ERR_NOT_IMPLEMENTED;
if (!sparse_ || busy_)
return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
if (offset < 0)
@@ -169,6 +167,8 @@ int MockDiskEntry::WriteSparseData(int64 offset, net::IOBuffer* buf,
int buf_len,
const net::CompletionCallback& callback) {
DCHECK(!callback.is_null());
+ if (fail_sparse_requests_)
+ return net::ERR_NOT_IMPLEMENTED;
if (busy_)
return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
if (!sparse_) {
@@ -237,6 +237,8 @@ int MockDiskEntry::GetAvailableRange(int64 offset, int len, int64* start,
}
bool MockDiskEntry::CouldBeSparse() const {
+ if (fail_sparse_requests_)
+ return false;
return sparse_;
}
@@ -245,6 +247,8 @@ void MockDiskEntry::CancelSparseIO() {
}
int MockDiskEntry::ReadyForSparseIO(const net::CompletionCallback& callback) {
+ if (fail_sparse_requests_)
+ return net::ERR_NOT_IMPLEMENTED;
if (!cancel_)
return net::OK;
@@ -333,7 +337,8 @@ bool MockDiskEntry::ignore_callbacks_ = false;
MockDiskCache::MockDiskCache()
: open_count_(0), create_count_(0), fail_requests_(false),
- soft_failures_(false), double_create_check_(true) {
+ soft_failures_(false), double_create_check_(true),
+ fail_sparse_requests_(false) {
}
MockDiskCache::~MockDiskCache() {
@@ -411,6 +416,9 @@ int MockDiskCache::CreateEntry(const std::string& key,
if (soft_failures_)
new_entry->set_fail_requests();
+ if (fail_sparse_requests_)
+ new_entry->set_fail_sparse_requests();
+
if (GetTestModeForEntry(key) & TEST_MODE_SYNC_CACHE_START)
return net::OK;
diff --git a/chromium/net/http/mock_http_cache.h b/chromium/net/http/mock_http_cache.h
index 6cb0e50f562..90399ec4ff0 100644
--- a/chromium/net/http/mock_http_cache.h
+++ b/chromium/net/http/mock_http_cache.h
@@ -21,7 +21,6 @@
class MockDiskEntry : public disk_cache::Entry,
public base::RefCounted<MockDiskEntry> {
public:
- MockDiskEntry();
explicit MockDiskEntry(const std::string& key);
bool is_doomed() const { return doomed_; }
@@ -53,6 +52,8 @@ class MockDiskEntry : public disk_cache::Entry,
// Fail most subsequent requests.
void set_fail_requests() { fail_requests_ = true; }
+ void set_fail_sparse_requests() { fail_sparse_requests_ = true; }
+
// If |value| is true, don't deliver any completion callbacks until called
// again with |value| set to false. Caution: remember to enable callbacks
// again or all subsequent tests will fail.
@@ -85,6 +86,7 @@ class MockDiskEntry : public disk_cache::Entry,
bool doomed_;
bool sparse_;
bool fail_requests_;
+ bool fail_sparse_requests_;
bool busy_;
bool delayed_;
static bool cancel_;
@@ -134,6 +136,9 @@ class MockDiskCache : public disk_cache::Backend {
// Makes sure that CreateEntry is not called twice for a given key.
void set_double_create_check(bool value) { double_create_check_ = value; }
+ // Makes all requests for data ranges to fail as not implemented.
+ void set_fail_sparse_requests() { fail_sparse_requests_ = true; }
+
void ReleaseAll();
private:
@@ -147,6 +152,7 @@ class MockDiskCache : public disk_cache::Backend {
bool fail_requests_;
bool soft_failures_;
bool double_create_check_;
+ bool fail_sparse_requests_;
};
class MockBackendFactory : public net::HttpCache::BackendFactory {
diff --git a/chromium/net/http/proxy_connect_redirect_http_stream.cc b/chromium/net/http/proxy_connect_redirect_http_stream.cc
index 59bb0146953..f30f33c002c 100644
--- a/chromium/net/http/proxy_connect_redirect_http_stream.cc
+++ b/chromium/net/http/proxy_connect_redirect_http_stream.cc
@@ -109,10 +109,6 @@ void ProxyConnectRedirectHttpStream::Drain(HttpNetworkSession* session) {
NOTREACHED();
}
-void ProxyConnectRedirectHttpStream::SetPriority(RequestPriority priority) {
- // Nothing to do.
-}
-
UploadProgress ProxyConnectRedirectHttpStream::GetUploadProgress() const {
NOTREACHED();
return UploadProgress();
diff --git a/chromium/net/http/proxy_connect_redirect_http_stream.h b/chromium/net/http/proxy_connect_redirect_http_stream.h
index c335c218c71..f39ec76b9b9 100644
--- a/chromium/net/http/proxy_connect_redirect_http_stream.h
+++ b/chromium/net/http/proxy_connect_redirect_http_stream.h
@@ -59,10 +59,6 @@ class ProxyConnectRedirectHttpStream : public HttpStream {
SSLCertRequestInfo* cert_request_info) OVERRIDE;
virtual bool IsSpdyHttpStream() const OVERRIDE;
virtual void Drain(HttpNetworkSession* session) OVERRIDE;
-
- // This function may be called.
- virtual void SetPriority(RequestPriority priority) OVERRIDE;
-
virtual UploadProgress GetUploadProgress() const OVERRIDE;
virtual HttpStream* RenewStreamForAuth() OVERRIDE;
diff --git a/chromium/net/net.gyp b/chromium/net/net.gyp
index 7086e3d362a..9443da6ac8e 100644
--- a/chromium/net/net.gyp
+++ b/chromium/net/net.gyp
@@ -399,6 +399,8 @@
'disk_cache/simple/simple_index.h',
'disk_cache/simple/simple_index_file.cc',
'disk_cache/simple/simple_index_file.h',
+ 'disk_cache/simple/simple_index_file_posix.cc',
+ 'disk_cache/simple/simple_index_file_win.cc',
'disk_cache/simple/simple_net_log_parameters.cc',
'disk_cache/simple/simple_net_log_parameters.h',
'disk_cache/simple/simple_synchronous_entry.cc',
@@ -1631,7 +1633,6 @@
'http/http_security_headers_unittest.cc',
'http/http_server_properties_impl_unittest.cc',
'http/http_status_code_unittest.cc',
- 'http/http_stream_factory_impl_request_unittest.cc',
'http/http_stream_factory_impl_unittest.cc',
'http/http_stream_parser_unittest.cc',
'http/http_transaction_unittest.cc',
@@ -2134,6 +2135,11 @@
'../testing/android/native_test.gyp:native_test_native_code',
]
}],
+ [ 'OS != "win" and OS != "mac"', {
+ 'sources!': [
+ 'cert/x509_cert_types_unittest.cc',
+ ],
+ }],
],
},
{
diff --git a/chromium/net/quic/quic_client_session.cc b/chromium/net/quic/quic_client_session.cc
index 67620787307..d7fb0d2675e 100644
--- a/chromium/net/quic/quic_client_session.cc
+++ b/chromium/net/quic/quic_client_session.cc
@@ -81,7 +81,7 @@ void QuicClientSession::StreamRequest::OnRequestCompleteFailure(int rv) {
QuicClientSession::QuicClientSession(
QuicConnection* connection,
- scoped_ptr<DatagramClientSocket> socket,
+ DatagramClientSocket* socket,
QuicStreamFactory* stream_factory,
QuicCryptoClientStreamFactory* crypto_client_stream_factory,
const string& server_hostname,
@@ -91,7 +91,7 @@ QuicClientSession::QuicClientSession(
: QuicSession(connection, config, false),
weak_factory_(this),
stream_factory_(stream_factory),
- socket_(socket.Pass()),
+ socket_(socket),
read_buffer_(new IOBufferWithSize(kMaxPacketSize)),
read_pending_(false),
num_total_streams_(0),
@@ -260,18 +260,7 @@ void QuicClientSession::OnCryptoHandshakeEvent(CryptoHandshakeEvent event) {
QuicSession::OnCryptoHandshakeEvent(event);
}
-void QuicClientSession::OnCryptoHandshakeMessageSent(
- const CryptoHandshakeMessage& message) {
- logger_.OnCryptoHandshakeMessageSent(message);
-}
-
-void QuicClientSession::OnCryptoHandshakeMessageReceived(
- const CryptoHandshakeMessage& message) {
- logger_.OnCryptoHandshakeMessageReceived(message);
-}
-
void QuicClientSession::ConnectionClose(QuicErrorCode error, bool from_peer) {
- logger_.OnConnectionClose(error, from_peer);
UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.ConnectionCloseErrorCode",
error);
UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.QuicVersion",
diff --git a/chromium/net/quic/quic_client_session.h b/chromium/net/quic/quic_client_session.h
index 555837fe9a5..339c40b2ba1 100644
--- a/chromium/net/quic/quic_client_session.h
+++ b/chromium/net/quic/quic_client_session.h
@@ -13,7 +13,6 @@
#include <string>
#include "base/containers/hash_tables.h"
-#include "base/memory/scoped_ptr.h"
#include "net/base/completion_callback.h"
#include "net/quic/quic_connection_logger.h"
#include "net/quic/quic_crypto_client_stream.h"
@@ -75,7 +74,7 @@ class NET_EXPORT_PRIVATE QuicClientSession : public QuicSession {
// not |stream_factory|, which must outlive this session.
// TODO(rch): decouple the factory from the session via a Delegate interface.
QuicClientSession(QuicConnection* connection,
- scoped_ptr<DatagramClientSocket> socket,
+ DatagramClientSocket* socket,
QuicStreamFactory* stream_factory,
QuicCryptoClientStreamFactory* crypto_client_stream_factory,
const std::string& server_hostname,
@@ -103,10 +102,6 @@ class NET_EXPORT_PRIVATE QuicClientSession : public QuicSession {
virtual QuicCryptoClientStream* GetCryptoStream() OVERRIDE;
virtual void CloseStream(QuicStreamId stream_id) OVERRIDE;
virtual void OnCryptoHandshakeEvent(CryptoHandshakeEvent event) OVERRIDE;
- virtual void OnCryptoHandshakeMessageSent(
- const CryptoHandshakeMessage& message) OVERRIDE;
- virtual void OnCryptoHandshakeMessageReceived(
- const CryptoHandshakeMessage& message) OVERRIDE;
virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE;
// QuicConnectionVisitorInterface methods:
diff --git a/chromium/net/quic/quic_client_session_test.cc b/chromium/net/quic/quic_client_session_test.cc
index 09e7d210116..6113f4587c1 100644
--- a/chromium/net/quic/quic_client_session_test.cc
+++ b/chromium/net/quic/quic_client_session_test.cc
@@ -15,7 +15,6 @@
#include "net/quic/test_tools/crypto_test_utils.h"
#include "net/quic/test_tools/quic_client_session_peer.h"
#include "net/quic/test_tools/quic_test_utils.h"
-#include "net/udp/datagram_client_socket.h"
using testing::_;
@@ -30,9 +29,8 @@ class QuicClientSessionTest : public ::testing::Test {
QuicClientSessionTest()
: guid_(1),
connection_(new PacketSavingConnection(guid_, IPEndPoint(), false)),
- session_(connection_, scoped_ptr<DatagramClientSocket>(), NULL,
- NULL, kServerHostname, DefaultQuicConfig(), &crypto_config_,
- &net_log_) {
+ session_(connection_, NULL, NULL, NULL, kServerHostname,
+ DefaultQuicConfig(), &crypto_config_, &net_log_) {
session_.config()->SetDefaults();
crypto_config_.SetDefaults();
}
diff --git a/chromium/net/quic/quic_connection.cc b/chromium/net/quic/quic_connection.cc
index 718b78864c9..fefeba95f2d 100644
--- a/chromium/net/quic/quic_connection.cc
+++ b/chromium/net/quic/quic_connection.cc
@@ -1035,10 +1035,6 @@ void QuicConnection::RetransmitPacket(
unacked));
retransmission_map_.insert(make_pair(serialized_packet.sequence_number,
retransmission_info));
- if (debug_visitor_) {
- debug_visitor_->OnPacketRetransmitted(sequence_number,
- serialized_packet.sequence_number);
- }
SendOrQueuePacket(unacked->encryption_level(),
serialized_packet.sequence_number,
serialized_packet.packet,
diff --git a/chromium/net/quic/quic_connection.h b/chromium/net/quic/quic_connection.h
index 20878d91bc7..41172f7d46d 100644
--- a/chromium/net/quic/quic_connection.h
+++ b/chromium/net/quic/quic_connection.h
@@ -95,12 +95,6 @@ class NET_EXPORT_PRIVATE QuicConnectionDebugVisitorInterface
const QuicEncryptedPacket& packet,
int rv) = 0;
- // Called when the contents of a packet have been retransmitted as
- // a new packet.
- virtual void OnPacketRetransmitted(
- QuicPacketSequenceNumber old_sequence_number,
- QuicPacketSequenceNumber new_sequence_number) = 0;
-
// Called when a packet has been received, but before it is
// validated or parsed.
virtual void OnPacketReceived(const IPEndPoint& self_address,
diff --git a/chromium/net/quic/quic_connection_logger.cc b/chromium/net/quic/quic_connection_logger.cc
index b5dfcd61028..3405cd0c764 100644
--- a/chromium/net/quic/quic_connection_logger.cc
+++ b/chromium/net/quic/quic_connection_logger.cc
@@ -10,7 +10,6 @@
#include "base/strings/string_number_conversions.h"
#include "base/values.h"
#include "net/base/net_log.h"
-#include "net/quic/crypto/crypto_handshake.h"
namespace net {
@@ -44,18 +43,6 @@ base::Value* NetLogQuicPacketSentCallback(
return dict;
}
-base::Value* NetLogQuicPacketRetransmittedCallback(
- QuicPacketSequenceNumber old_sequence_number,
- QuicPacketSequenceNumber new_sequence_number,
- NetLog::LogLevel /* log_level */) {
- base::DictionaryValue* dict = new base::DictionaryValue();
- dict->SetString("old_packet_sequence_number",
- base::Uint64ToString(old_sequence_number));
- dict->SetString("new_packet_sequence_number",
- base::Uint64ToString(new_sequence_number));
- return dict;
-}
-
base::Value* NetLogQuicPacketHeaderCallback(const QuicPacketHeader* header,
NetLog::LogLevel /* log_level */) {
base::DictionaryValue* dict = new base::DictionaryValue();
@@ -99,7 +86,7 @@ base::Value* NetLogQuicAckFrameCallback(const QuicAckFrame* frame,
frame->received_info.missing_packets;
for (SequenceNumberSet::const_iterator it = missing_packets.begin();
it != missing_packets.end(); ++it) {
- missing->AppendString(base::Uint64ToString(*it));
+ missing->Append(new base::StringValue(base::Uint64ToString(*it)));
}
return dict;
}
@@ -120,7 +107,7 @@ base::Value* NetLogQuicCongestionFeedbackFrameCallback(
it != frame->inter_arrival.received_packet_times.end(); ++it) {
std::string value = base::Uint64ToString(it->first) + "@" +
base::Uint64ToString(it->second.ToDebuggingValue());
- received->AppendString(value);
+ received->Append(new base::StringValue(value));
}
break;
}
@@ -159,37 +146,6 @@ base::Value* NetLogQuicConnectionCloseFrameCallback(
return dict;
}
-base::Value* NetLogQuicVersionNegotiationPacketCallback(
- const QuicVersionNegotiationPacket* packet,
- NetLog::LogLevel /* log_level */) {
- base::DictionaryValue* dict = new base::DictionaryValue();
- base::ListValue* versions = new base::ListValue();
- dict->Set("versions", versions);
- for (QuicVersionVector::const_iterator it = packet->versions.begin();
- it != packet->versions.end(); ++it) {
- versions->AppendString(QuicVersionToString(*it));
- }
- return dict;
-}
-
-base::Value* NetLogQuicCryptoHandshakeMessageCallback(
- const CryptoHandshakeMessage* message,
- NetLog::LogLevel /* log_level */) {
- base::DictionaryValue* dict = new base::DictionaryValue();
- dict->SetString("quic_crypto_handshake_message", message->DebugString());
- return dict;
-}
-
-base::Value* NetLogQuicConnectionClosedCallback(
- QuicErrorCode error,
- bool from_peer,
- NetLog::LogLevel /* log_level */) {
- base::DictionaryValue* dict = new base::DictionaryValue();
- dict->SetInteger("quic_error", error);
- dict->SetBoolean("from_peer", from_peer);
- return dict;
-}
-
void UpdatePacketGapSentHistogram(size_t num_consecutive_missing_packets) {
UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapSent",
num_consecutive_missing_packets);
@@ -260,15 +216,6 @@ void QuicConnectionLogger::OnPacketSent(
packet.length(), rv));
}
-void QuicConnectionLogger:: OnPacketRetransmitted(
- QuicPacketSequenceNumber old_sequence_number,
- QuicPacketSequenceNumber new_sequence_number) {
- net_log_.AddEvent(
- NetLog::TYPE_QUIC_SESSION_PACKET_RETRANSMITTED,
- base::Bind(&NetLogQuicPacketRetransmittedCallback,
- old_sequence_number, new_sequence_number));
-}
-
void QuicConnectionLogger::OnPacketReceived(const IPEndPoint& self_address,
const IPEndPoint& peer_address,
const QuicEncryptedPacket& packet) {
@@ -374,43 +321,15 @@ void QuicConnectionLogger::OnConnectionCloseFrame(
void QuicConnectionLogger::OnPublicResetPacket(
const QuicPublicResetPacket& packet) {
- net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_PUBLIC_RESET_PACKET_RECEIVED);
}
void QuicConnectionLogger::OnVersionNegotiationPacket(
const QuicVersionNegotiationPacket& packet) {
- net_log_.AddEvent(
- NetLog::TYPE_QUIC_SESSION_VERSION_NEGOTIATION_PACKET_RECEIVED,
- base::Bind(&NetLogQuicVersionNegotiationPacketCallback, &packet));
}
void QuicConnectionLogger::OnRevivedPacket(
const QuicPacketHeader& revived_header,
base::StringPiece payload) {
- net_log_.AddEvent(
- NetLog::TYPE_QUIC_SESSION_PACKET_HEADER_REVIVED,
- base::Bind(&NetLogQuicPacketHeaderCallback, &revived_header));
-}
-
-void QuicConnectionLogger::OnCryptoHandshakeMessageReceived(
- const CryptoHandshakeMessage& message) {
- net_log_.AddEvent(
- NetLog::TYPE_QUIC_SESSION_CRYPTO_HANDSHAKE_MESSAGE_RECEIVED,
- base::Bind(&NetLogQuicCryptoHandshakeMessageCallback, &message));
-}
-
-void QuicConnectionLogger::OnCryptoHandshakeMessageSent(
- const CryptoHandshakeMessage& message) {
- net_log_.AddEvent(
- NetLog::TYPE_QUIC_SESSION_CRYPTO_HANDSHAKE_MESSAGE_SENT,
- base::Bind(&NetLogQuicCryptoHandshakeMessageCallback, &message));
-}
-
-void QuicConnectionLogger::OnConnectionClose(QuicErrorCode error,
- bool from_peer) {
- net_log_.AddEvent(
- NetLog::TYPE_QUIC_SESSION_CLOSED,
- base::Bind(&NetLogQuicConnectionClosedCallback, error, from_peer));
}
} // namespace net
diff --git a/chromium/net/quic/quic_connection_logger.h b/chromium/net/quic/quic_connection_logger.h
index f9080d643e3..1d2bd2df96d 100644
--- a/chromium/net/quic/quic_connection_logger.h
+++ b/chromium/net/quic/quic_connection_logger.h
@@ -10,7 +10,6 @@
namespace net {
class BoundNetLog;
-class CryptoHandshakeMessage;
// This class is a debug visitor of a QuicConnection which logs
// events to |net_log|.
@@ -29,9 +28,7 @@ class NET_EXPORT_PRIVATE QuicConnectionLogger
EncryptionLevel level,
const QuicEncryptedPacket& packet,
int rv) OVERRIDE;
- virtual void OnPacketRetransmitted(
- QuicPacketSequenceNumber old_sequence_number,
- QuicPacketSequenceNumber new_sequence_number) OVERRIDE;
+
virtual void OnPacketReceived(const IPEndPoint& self_address,
const IPEndPoint& peer_address,
const QuicEncryptedPacket& packet) OVERRIDE;
@@ -51,12 +48,6 @@ class NET_EXPORT_PRIVATE QuicConnectionLogger
virtual void OnRevivedPacket(const QuicPacketHeader& revived_header,
base::StringPiece payload) OVERRIDE;
- void OnCryptoHandshakeMessageReceived(
- const CryptoHandshakeMessage& message);
- void OnCryptoHandshakeMessageSent(
- const CryptoHandshakeMessage& message);
- void OnConnectionClose(QuicErrorCode error, bool from_peer);
-
private:
BoundNetLog net_log_;
// The last packet sequence number received.
diff --git a/chromium/net/quic/quic_crypto_client_stream.cc b/chromium/net/quic/quic_crypto_client_stream.cc
index 585b293560b..ab1d974b32b 100644
--- a/chromium/net/quic/quic_crypto_client_stream.cc
+++ b/chromium/net/quic/quic_crypto_client_stream.cc
@@ -85,8 +85,6 @@ QuicCryptoClientStream::~QuicCryptoClientStream() {
void QuicCryptoClientStream::OnHandshakeMessage(
const CryptoHandshakeMessage& message) {
- QuicCryptoStream::OnHandshakeMessage(message);
-
DoHandshakeLoop(&message);
}
diff --git a/chromium/net/quic/quic_crypto_server_stream.cc b/chromium/net/quic/quic_crypto_server_stream.cc
index a23a34d5b49..f7b67b7c23e 100644
--- a/chromium/net/quic/quic_crypto_server_stream.cc
+++ b/chromium/net/quic/quic_crypto_server_stream.cc
@@ -27,8 +27,6 @@ QuicCryptoServerStream::~QuicCryptoServerStream() {
void QuicCryptoServerStream::OnHandshakeMessage(
const CryptoHandshakeMessage& message) {
- QuicCryptoStream::OnHandshakeMessage(message);
-
// Do not process handshake messages after the handshake is confirmed.
if (handshake_confirmed_) {
CloseConnection(QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE);
diff --git a/chromium/net/quic/quic_crypto_stream.cc b/chromium/net/quic/quic_crypto_stream.cc
index 569648f1baa..2f06e3ba234 100644
--- a/chromium/net/quic/quic_crypto_stream.cc
+++ b/chromium/net/quic/quic_crypto_stream.cc
@@ -27,11 +27,6 @@ void QuicCryptoStream::OnError(CryptoFramer* framer) {
session()->ConnectionClose(framer->error(), false);
}
-void QuicCryptoStream::OnHandshakeMessage(
- const CryptoHandshakeMessage& message) {
- session()->OnCryptoHandshakeMessageReceived(message);
-}
-
uint32 QuicCryptoStream::ProcessData(const char* data,
uint32 data_len) {
// Do not process handshake messages after the handshake is confirmed.
@@ -57,7 +52,6 @@ void QuicCryptoStream::CloseConnectionWithDetails(QuicErrorCode error,
void QuicCryptoStream::SendHandshakeMessage(
const CryptoHandshakeMessage& message) {
- session()->OnCryptoHandshakeMessageSent(message);
const QuicData& data = message.GetSerialized();
// TODO(wtc): check the return value.
WriteData(string(data.data(), data.length()), false);
diff --git a/chromium/net/quic/quic_crypto_stream.h b/chromium/net/quic/quic_crypto_stream.h
index c402b0d9b44..bdae59e31f5 100644
--- a/chromium/net/quic/quic_crypto_stream.h
+++ b/chromium/net/quic/quic_crypto_stream.h
@@ -34,8 +34,7 @@ class NET_EXPORT_PRIVATE QuicCryptoStream
// CryptoFramerVisitorInterface implementation
virtual void OnError(CryptoFramer* framer) OVERRIDE;
- virtual void OnHandshakeMessage(
- const CryptoHandshakeMessage& message) OVERRIDE;
+ virtual void OnHandshakeMessage(const CryptoHandshakeMessage& message) = 0;
// ReliableQuicStream implementation
virtual uint32 ProcessData(const char* data, uint32 data_len) OVERRIDE;
diff --git a/chromium/net/quic/quic_http_stream.cc b/chromium/net/quic/quic_http_stream.cc
index 73581248d5b..94d1a2e56ba 100644
--- a/chromium/net/quic/quic_http_stream.cc
+++ b/chromium/net/quic/quic_http_stream.cc
@@ -257,10 +257,6 @@ void QuicHttpStream::Drain(HttpNetworkSession* session) {
delete this;
}
-void QuicHttpStream::SetPriority(RequestPriority priority) {
- // Nothing to do here (yet).
-}
-
int QuicHttpStream::OnSendData() {
// TODO(rch): Change QUIC IO to provide notifications to the streams.
NOTREACHED();
diff --git a/chromium/net/quic/quic_http_stream.h b/chromium/net/quic/quic_http_stream.h
index cc2b973e87f..85dc5537480 100644
--- a/chromium/net/quic/quic_http_stream.h
+++ b/chromium/net/quic/quic_http_stream.h
@@ -54,7 +54,6 @@ class NET_EXPORT_PRIVATE QuicHttpStream :
SSLCertRequestInfo* cert_request_info) OVERRIDE;
virtual bool IsSpdyHttpStream() const OVERRIDE;
virtual void Drain(HttpNetworkSession* session) OVERRIDE;
- virtual void SetPriority(RequestPriority priority) OVERRIDE;
// QuicReliableClientStream::Delegate implementation
virtual int OnSendData() OVERRIDE;
diff --git a/chromium/net/quic/quic_http_stream_test.cc b/chromium/net/quic/quic_http_stream_test.cc
index 1e4ac916bbf..b3784168a70 100644
--- a/chromium/net/quic/quic_http_stream_test.cc
+++ b/chromium/net/quic/quic_http_stream_test.cc
@@ -179,12 +179,10 @@ class QuicHttpStreamTest : public ::testing::TestWithParam<bool> {
connection_->SetSendAlgorithm(send_algorithm_);
connection_->SetReceiveAlgorithm(receive_algorithm_);
crypto_config_.SetDefaults();
- session_.reset(
- new QuicClientSession(connection_,
- scoped_ptr<DatagramClientSocket>(socket), NULL,
- &crypto_client_stream_factory_,
- "www.google.com", DefaultQuicConfig(),
- &crypto_config_, NULL));
+ session_.reset(new QuicClientSession(connection_, socket, NULL,
+ &crypto_client_stream_factory_,
+ "www.google.com", DefaultQuicConfig(),
+ &crypto_config_, NULL));
session_->GetCryptoStream()->CryptoConnect();
EXPECT_TRUE(session_->IsCryptoHandshakeConfirmed());
stream_.reset(use_closing_stream_ ?
diff --git a/chromium/net/quic/quic_session.cc b/chromium/net/quic/quic_session.cc
index 5abf30593ed..a07f413cbd2 100644
--- a/chromium/net/quic/quic_session.cc
+++ b/chromium/net/quic/quic_session.cc
@@ -283,14 +283,6 @@ void QuicSession::OnCryptoHandshakeEvent(CryptoHandshakeEvent event) {
}
}
-void QuicSession::OnCryptoHandshakeMessageSent(
- const CryptoHandshakeMessage& message) {
-}
-
-void QuicSession::OnCryptoHandshakeMessageReceived(
- const CryptoHandshakeMessage& message) {
-}
-
QuicConfig* QuicSession::config() {
return &config_;
}
diff --git a/chromium/net/quic/quic_session.h b/chromium/net/quic/quic_session.h
index 24a6deb45d1..9f7aceb7581 100644
--- a/chromium/net/quic/quic_session.h
+++ b/chromium/net/quic/quic_session.h
@@ -106,14 +106,6 @@ class NET_EXPORT_PRIVATE QuicSession : public QuicConnectionVisitorInterface {
// Servers will simply call it once with HANDSHAKE_CONFIRMED.
virtual void OnCryptoHandshakeEvent(CryptoHandshakeEvent event);
- // Called by the QuicCryptoStream when a handshake message is sent.
- virtual void OnCryptoHandshakeMessageSent(
- const CryptoHandshakeMessage& message);
-
- // Called by the QuicCryptoStream when a handshake message is received.
- virtual void OnCryptoHandshakeMessageReceived(
- const CryptoHandshakeMessage& message);
-
// Returns mutable config for this session. Returned config is owned
// by QuicSession.
QuicConfig* config();
diff --git a/chromium/net/quic/quic_stream_factory.cc b/chromium/net/quic/quic_stream_factory.cc
index 86bd8a18aaa..fba7f0b7dec 100644
--- a/chromium/net/quic/quic_stream_factory.cc
+++ b/chromium/net/quic/quic_stream_factory.cc
@@ -408,10 +408,10 @@ QuicClientSession* QuicStreamFactory::CreateSession(
const BoundNetLog& net_log) {
QuicGuid guid = random_generator_->RandUint64();
IPEndPoint addr = *address_list.begin();
- scoped_ptr<DatagramClientSocket> socket(
+ DatagramClientSocket* socket =
client_socket_factory_->CreateDatagramClientSocket(
DatagramSocket::DEFAULT_BIND, base::Bind(&base::RandInt),
- net_log.net_log(), net_log.source()));
+ net_log.net_log(), net_log.source());
socket->Connect(addr);
// We should adaptively set this buffer size, but for now, we'll use a size
@@ -437,7 +437,7 @@ QuicClientSession* QuicStreamFactory::CreateSession(
base::MessageLoop::current()->message_loop_proxy().get(),
clock_.get(),
random_generator_,
- socket.get());
+ socket);
QuicConnection* connection = new QuicConnection(guid, addr, helper, false,
QuicVersionMax());
@@ -447,7 +447,7 @@ QuicClientSession* QuicStreamFactory::CreateSession(
DCHECK(crypto_config);
QuicClientSession* session =
- new QuicClientSession(connection, socket.Pass(), this,
+ new QuicClientSession(connection, socket, this,
quic_crypto_client_stream_factory_,
host_port_proxy_pair.first.host(), config_,
crypto_config, net_log.net_log());
diff --git a/chromium/net/socket/buffered_write_stream_socket.cc b/chromium/net/socket/buffered_write_stream_socket.cc
index cf13c5e439a..36b9df715fd 100644
--- a/chromium/net/socket/buffered_write_stream_socket.cc
+++ b/chromium/net/socket/buffered_write_stream_socket.cc
@@ -23,8 +23,8 @@ void AppendBuffer(GrowableIOBuffer* dst, IOBuffer* src, int src_len) {
} // anonymous namespace
BufferedWriteStreamSocket::BufferedWriteStreamSocket(
- scoped_ptr<StreamSocket> socket_to_wrap)
- : wrapped_socket_(socket_to_wrap.Pass()),
+ StreamSocket* socket_to_wrap)
+ : wrapped_socket_(socket_to_wrap),
io_buffer_(new GrowableIOBuffer()),
backup_buffer_(new GrowableIOBuffer()),
weak_factory_(this),
diff --git a/chromium/net/socket/buffered_write_stream_socket.h b/chromium/net/socket/buffered_write_stream_socket.h
index aad5736d0b0..fcb33a81910 100644
--- a/chromium/net/socket/buffered_write_stream_socket.h
+++ b/chromium/net/socket/buffered_write_stream_socket.h
@@ -5,8 +5,6 @@
#ifndef NET_SOCKET_BUFFERED_WRITE_STREAM_SOCKET_H_
#define NET_SOCKET_BUFFERED_WRITE_STREAM_SOCKET_H_
-#include "base/basictypes.h"
-#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "net/base/net_log.h"
#include "net/socket/stream_socket.h"
@@ -35,7 +33,7 @@ class IPEndPoint;
// There are no bounds on the local buffer size. Use carefully.
class NET_EXPORT_PRIVATE BufferedWriteStreamSocket : public StreamSocket {
public:
- explicit BufferedWriteStreamSocket(scoped_ptr<StreamSocket> socket_to_wrap);
+ BufferedWriteStreamSocket(StreamSocket* socket_to_wrap);
virtual ~BufferedWriteStreamSocket();
// Socket interface
@@ -73,8 +71,6 @@ class NET_EXPORT_PRIVATE BufferedWriteStreamSocket : public StreamSocket {
bool callback_pending_;
bool wrapped_write_in_progress_;
int error_;
-
- DISALLOW_COPY_AND_ASSIGN(BufferedWriteStreamSocket);
};
} // namespace net
diff --git a/chromium/net/socket/buffered_write_stream_socket_unittest.cc b/chromium/net/socket/buffered_write_stream_socket_unittest.cc
index 485295f33f6..e579a7f51d2 100644
--- a/chromium/net/socket/buffered_write_stream_socket_unittest.cc
+++ b/chromium/net/socket/buffered_write_stream_socket_unittest.cc
@@ -30,11 +30,10 @@ class BufferedWriteStreamSocketTest : public testing::Test {
if (writes_count) {
data_->StopAfter(writes_count);
}
- scoped_ptr<DeterministicMockTCPClientSocket> wrapped_socket(
- new DeterministicMockTCPClientSocket(net_log_.net_log(), data_.get()));
+ DeterministicMockTCPClientSocket* wrapped_socket =
+ new DeterministicMockTCPClientSocket(net_log_.net_log(), data_.get());
data_->set_delegate(wrapped_socket->AsWeakPtr());
- socket_.reset(new BufferedWriteStreamSocket(
- wrapped_socket.PassAs<StreamSocket>()));
+ socket_.reset(new BufferedWriteStreamSocket(wrapped_socket));
socket_->Connect(callback_.callback());
}
diff --git a/chromium/net/socket/client_socket_factory.cc b/chromium/net/socket/client_socket_factory.cc
index a86688e3333..022988aa6a9 100644
--- a/chromium/net/socket/client_socket_factory.cc
+++ b/chromium/net/socket/client_socket_factory.cc
@@ -67,25 +67,23 @@ class DefaultClientSocketFactory : public ClientSocketFactory,
ClearSSLSessionCache();
}
- virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
+ virtual DatagramClientSocket* CreateDatagramClientSocket(
DatagramSocket::BindType bind_type,
const RandIntCallback& rand_int_cb,
NetLog* net_log,
const NetLog::Source& source) OVERRIDE {
- return scoped_ptr<DatagramClientSocket>(
- new UDPClientSocket(bind_type, rand_int_cb, net_log, source));
+ return new UDPClientSocket(bind_type, rand_int_cb, net_log, source);
}
- virtual scoped_ptr<StreamSocket> CreateTransportClientSocket(
+ virtual StreamSocket* CreateTransportClientSocket(
const AddressList& addresses,
NetLog* net_log,
const NetLog::Source& source) OVERRIDE {
- return scoped_ptr<StreamSocket>(
- new TCPClientSocket(addresses, net_log, source));
+ return new TCPClientSocket(addresses, net_log, source);
}
- virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
+ virtual SSLClientSocket* CreateSSLClientSocket(
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context) OVERRIDE {
@@ -104,19 +102,17 @@ class DefaultClientSocketFactory : public ClientSocketFactory,
nss_task_runner = base::ThreadTaskRunnerHandle::Get();
#if defined(USE_OPENSSL)
- return scoped_ptr<SSLClientSocket>(
- new SSLClientSocketOpenSSL(transport_socket.Pass(), host_and_port,
- ssl_config, context));
+ return new SSLClientSocketOpenSSL(transport_socket, host_and_port,
+ ssl_config, context);
#elif defined(USE_NSS) || defined(OS_MACOSX) || defined(OS_WIN)
- return scoped_ptr<SSLClientSocket>(
- new SSLClientSocketNSS(nss_task_runner.get(),
- transport_socket.Pass(),
- host_and_port,
- ssl_config,
- context));
+ return new SSLClientSocketNSS(nss_task_runner.get(),
+ transport_socket,
+ host_and_port,
+ ssl_config,
+ context);
#else
NOTIMPLEMENTED();
- return scoped_ptr<SSLClientSocket>();
+ return NULL;
#endif
}
@@ -134,6 +130,18 @@ static base::LazyInstance<DefaultClientSocketFactory>::Leaky
} // namespace
+// Deprecated function (http://crbug.com/37810) that takes a StreamSocket.
+SSLClientSocket* ClientSocketFactory::CreateSSLClientSocket(
+ StreamSocket* transport_socket,
+ const HostPortPair& host_and_port,
+ const SSLConfig& ssl_config,
+ const SSLClientSocketContext& context) {
+ ClientSocketHandle* socket_handle = new ClientSocketHandle();
+ socket_handle->set_socket(transport_socket);
+ return CreateSSLClientSocket(socket_handle, host_and_port, ssl_config,
+ context);
+}
+
// static
ClientSocketFactory* ClientSocketFactory::GetDefaultFactory() {
return g_default_client_socket_factory.Pointer();
diff --git a/chromium/net/socket/client_socket_factory.h b/chromium/net/socket/client_socket_factory.h
index 6cb5949f0b3..65022f29234 100644
--- a/chromium/net/socket/client_socket_factory.h
+++ b/chromium/net/socket/client_socket_factory.h
@@ -8,7 +8,6 @@
#include <string>
#include "base/basictypes.h"
-#include "base/memory/scoped_ptr.h"
#include "net/base/net_export.h"
#include "net/base/net_log.h"
#include "net/base/rand_callback.h"
@@ -33,13 +32,13 @@ class NET_EXPORT ClientSocketFactory {
// |source| is the NetLog::Source for the entity trying to create the socket,
// if it has one.
- virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
+ virtual DatagramClientSocket* CreateDatagramClientSocket(
DatagramSocket::BindType bind_type,
const RandIntCallback& rand_int_cb,
NetLog* net_log,
const NetLog::Source& source) = 0;
- virtual scoped_ptr<StreamSocket> CreateTransportClientSocket(
+ virtual StreamSocket* CreateTransportClientSocket(
const AddressList& addresses,
NetLog* net_log,
const NetLog::Source& source) = 0;
@@ -47,12 +46,19 @@ class NET_EXPORT ClientSocketFactory {
// It is allowed to pass in a |transport_socket| that is not obtained from a
// socket pool. The caller could create a ClientSocketHandle directly and call
// set_socket() on it to set a valid StreamSocket instance.
- virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
+ virtual SSLClientSocket* CreateSSLClientSocket(
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context) = 0;
+ // Deprecated function (http://crbug.com/37810) that takes a StreamSocket.
+ virtual SSLClientSocket* CreateSSLClientSocket(
+ StreamSocket* transport_socket,
+ const HostPortPair& host_and_port,
+ const SSLConfig& ssl_config,
+ const SSLClientSocketContext& context);
+
// Clears cache used for SSL session resumption.
virtual void ClearSSLSessionCache() = 0;
diff --git a/chromium/net/socket/client_socket_handle.cc b/chromium/net/socket/client_socket_handle.cc
index acb896b36f5..3894fa7aa0e 100644
--- a/chromium/net/socket/client_socket_handle.cc
+++ b/chromium/net/socket/client_socket_handle.cc
@@ -43,7 +43,7 @@ void ClientSocketHandle::ResetInternal(bool cancel) {
if (pool_)
// If we've still got a socket, release it back to the ClientSocketPool so
// it can be deleted or reused.
- pool_->ReleaseSocket(group_name_, PassSocket(), pool_id_);
+ pool_->ReleaseSocket(group_name_, release_socket(), pool_id_);
} else if (cancel) {
// If we did not get initialized yet, we've got a socket request pending.
// Cancel it.
@@ -121,10 +121,6 @@ bool ClientSocketHandle::GetLoadTimingInfo(
return true;
}
-void ClientSocketHandle::SetSocket(scoped_ptr<StreamSocket> s) {
- socket_ = s.Pass();
-}
-
void ClientSocketHandle::OnIOComplete(int result) {
CompletionCallback callback = user_callback_;
user_callback_.Reset();
@@ -132,10 +128,6 @@ void ClientSocketHandle::OnIOComplete(int result) {
callback.Run(result);
}
-scoped_ptr<StreamSocket> ClientSocketHandle::PassSocket() {
- return socket_.Pass();
-}
-
void ClientSocketHandle::HandleInitCompletion(int result) {
CHECK_NE(ERR_IO_PENDING, result);
ClientSocketPoolHistograms* histograms = pool_->histograms();
diff --git a/chromium/net/socket/client_socket_handle.h b/chromium/net/socket/client_socket_handle.h
index 9651f089a86..7d5588a145b 100644
--- a/chromium/net/socket/client_socket_handle.h
+++ b/chromium/net/socket/client_socket_handle.h
@@ -116,8 +116,8 @@ class NET_EXPORT ClientSocketHandle {
LoadTimingInfo* load_timing_info) const;
// Used by ClientSocketPool to initialize the ClientSocketHandle.
- void SetSocket(scoped_ptr<StreamSocket> s);
void set_is_reused(bool is_reused) { is_reused_ = is_reused; }
+ void set_socket(StreamSocket* s) { socket_.reset(s); }
void set_idle_time(base::TimeDelta idle_time) { idle_time_ = idle_time; }
void set_pool_id(int id) { pool_id_ = id; }
void set_is_ssl_error(bool is_ssl_error) { is_ssl_error_ = is_ssl_error; }
@@ -144,10 +144,10 @@ class NET_EXPORT ClientSocketHandle {
}
// These may only be used if is_initialized() is true.
- scoped_ptr<StreamSocket> PassSocket();
- StreamSocket* socket() { return socket_.get(); }
const std::string& group_name() const { return group_name_; }
int id() const { return pool_id_; }
+ StreamSocket* socket() { return socket_.get(); }
+ StreamSocket* release_socket() { return socket_.release(); }
bool is_reused() const { return is_reused_; }
base::TimeDelta idle_time() const { return idle_time_; }
SocketReuseType reuse_type() const {
diff --git a/chromium/net/socket/client_socket_pool.h b/chromium/net/socket/client_socket_pool.h
index af184547d6e..7cb9a7ebc2e 100644
--- a/chromium/net/socket/client_socket_pool.h
+++ b/chromium/net/socket/client_socket_pool.h
@@ -10,7 +10,6 @@
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
-#include "base/memory/scoped_ptr.h"
#include "base/template_util.h"
#include "base/time/time.h"
#include "net/base/completion_callback.h"
@@ -112,7 +111,7 @@ class NET_EXPORT ClientSocketPool {
// change when it flushes, so it can use this |id| to discard sockets with
// mismatched ids.
virtual void ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
int id) = 0;
// This flushes all state from the ClientSocketPool. This means that all
diff --git a/chromium/net/socket/client_socket_pool_base.cc b/chromium/net/socket/client_socket_pool_base.cc
index b1ddd40881c..3332e04a171 100644
--- a/chromium/net/socket/client_socket_pool_base.cc
+++ b/chromium/net/socket/client_socket_pool_base.cc
@@ -82,10 +82,6 @@ ConnectJob::~ConnectJob() {
net_log().EndEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB);
}
-scoped_ptr<StreamSocket> ConnectJob::PassSocket() {
- return socket_.Pass();
-}
-
int ConnectJob::Connect() {
if (timeout_duration_ != base::TimeDelta())
timer_.Start(FROM_HERE, timeout_duration_, this, &ConnectJob::OnTimeout);
@@ -104,16 +100,16 @@ int ConnectJob::Connect() {
return rv;
}
-void ConnectJob::SetSocket(scoped_ptr<StreamSocket> socket) {
+void ConnectJob::set_socket(StreamSocket* socket) {
if (socket) {
net_log().AddEvent(NetLog::TYPE_CONNECT_JOB_SET_SOCKET,
socket->NetLog().source().ToEventParametersCallback());
}
- socket_ = socket.Pass();
+ socket_.reset(socket);
}
void ConnectJob::NotifyDelegateOfCompletion(int rv) {
- // The delegate will own |this|.
+ // The delegate will delete |this|.
Delegate* delegate = delegate_;
delegate_ = NULL;
@@ -139,7 +135,7 @@ void ConnectJob::LogConnectCompletion(int net_error) {
void ConnectJob::OnTimeout() {
// Make sure the socket is NULL before calling into |delegate|.
- SetSocket(scoped_ptr<StreamSocket>());
+ set_socket(NULL);
net_log_.AddEvent(NetLog::TYPE_SOCKET_POOL_CONNECT_JOB_TIMED_OUT);
@@ -396,11 +392,11 @@ int ClientSocketPoolBaseHelper::RequestSocketInternal(
if (rv == OK) {
LogBoundConnectJobToRequest(connect_job->net_log().source(), request);
if (!preconnecting) {
- HandOutSocket(connect_job->PassSocket(), false /* not reused */,
+ HandOutSocket(connect_job->ReleaseSocket(), false /* not reused */,
connect_job->connect_timing(), handle, base::TimeDelta(),
group, request->net_log());
} else {
- AddIdleSocket(connect_job->PassSocket(), group);
+ AddIdleSocket(connect_job->ReleaseSocket(), group);
}
} else if (rv == ERR_IO_PENDING) {
// If we don't have any sockets in this group, set a timer for potentially
@@ -413,17 +409,17 @@ int ClientSocketPoolBaseHelper::RequestSocketInternal(
connecting_socket_count_++;
- group->AddJob(connect_job.Pass(), preconnecting);
+ group->AddJob(connect_job.release(), preconnecting);
} else {
LogBoundConnectJobToRequest(connect_job->net_log().source(), request);
- scoped_ptr<StreamSocket> error_socket;
+ StreamSocket* error_socket = NULL;
if (!preconnecting) {
DCHECK(handle);
connect_job->GetAdditionalErrorState(handle);
- error_socket = connect_job->PassSocket();
+ error_socket = connect_job->ReleaseSocket();
}
if (error_socket) {
- HandOutSocket(error_socket.Pass(), false /* not reused */,
+ HandOutSocket(error_socket, false /* not reused */,
connect_job->connect_timing(), handle, base::TimeDelta(),
group, request->net_log());
} else if (group->IsEmpty()) {
@@ -473,7 +469,7 @@ bool ClientSocketPoolBaseHelper::AssignIdleSocketToRequest(
IdleSocket idle_socket = *idle_socket_it;
idle_sockets->erase(idle_socket_it);
HandOutSocket(
- scoped_ptr<StreamSocket>(idle_socket.socket),
+ idle_socket.socket,
idle_socket.socket->WasEverUsed(),
LoadTimingInfo::ConnectTiming(),
request->handle(),
@@ -499,11 +495,11 @@ void ClientSocketPoolBaseHelper::CancelRequest(
if (callback_it != pending_callback_map_.end()) {
int result = callback_it->second.result;
pending_callback_map_.erase(callback_it);
- scoped_ptr<StreamSocket> socket = handle->PassSocket();
+ StreamSocket* socket = handle->release_socket();
if (socket) {
if (result != OK)
socket->Disconnect();
- ReleaseSocket(handle->group_name(), socket.Pass(), handle->id());
+ ReleaseSocket(handle->group_name(), socket, handle->id());
}
return;
}
@@ -760,7 +756,7 @@ void ClientSocketPoolBaseHelper::StartIdleSocketTimer() {
}
void ClientSocketPoolBaseHelper::ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
int id) {
GroupMap::iterator i = group_map_.find(group_name);
CHECK(i != group_map_.end());
@@ -777,10 +773,10 @@ void ClientSocketPoolBaseHelper::ReleaseSocket(const std::string& group_name,
id == pool_generation_number_;
if (can_reuse) {
// Add it to the idle list.
- AddIdleSocket(socket.Pass(), group);
+ AddIdleSocket(socket, group);
OnAvailableSocketSlot(group_name, group);
} else {
- socket.reset();
+ delete socket;
}
CheckForStalledSocketGroups();
@@ -858,16 +854,13 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete(
CHECK(group_it != group_map_.end());
Group* group = group_it->second;
- scoped_ptr<StreamSocket> socket = job->PassSocket();
+ scoped_ptr<StreamSocket> socket(job->ReleaseSocket());
// Copies of these are needed because |job| may be deleted before they are
// accessed.
BoundNetLog job_log = job->net_log();
LoadTimingInfo::ConnectTiming connect_timing = job->connect_timing();
- // RemoveConnectJob(job, _) must be called by all branches below;
- // otherwise, |job| will be leaked.
-
if (result == OK) {
DCHECK(socket.get());
RemoveConnectJob(job, group);
@@ -876,12 +869,12 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete(
group->mutable_pending_requests()->begin(), group));
LogBoundConnectJobToRequest(job_log.source(), r.get());
HandOutSocket(
- socket.Pass(), false /* unused socket */, connect_timing,
+ socket.release(), false /* unused socket */, connect_timing,
r->handle(), base::TimeDelta(), group, r->net_log());
r->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL);
InvokeUserCallbackLater(r->handle(), r->callback(), result);
} else {
- AddIdleSocket(socket.Pass(), group);
+ AddIdleSocket(socket.release(), group);
OnAvailableSocketSlot(group_name, group);
CheckForStalledSocketGroups();
}
@@ -897,7 +890,7 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete(
RemoveConnectJob(job, group);
if (socket.get()) {
handed_out_socket = true;
- HandOutSocket(socket.Pass(), false /* unused socket */,
+ HandOutSocket(socket.release(), false /* unused socket */,
connect_timing, r->handle(), base::TimeDelta(), group,
r->net_log());
}
@@ -949,12 +942,16 @@ void ClientSocketPoolBaseHelper::RemoveConnectJob(ConnectJob* job,
connecting_socket_count_--;
DCHECK(group);
+ DCHECK(ContainsKey(group->jobs(), job));
group->RemoveJob(job);
// If we've got no more jobs for this group, then we no longer need a
// backup job either.
if (group->jobs().empty())
group->CleanupBackupJob();
+
+ DCHECK(job);
+ delete job;
}
void ClientSocketPoolBaseHelper::OnAvailableSocketSlot(
@@ -982,7 +979,7 @@ void ClientSocketPoolBaseHelper::ProcessPendingRequest(
}
void ClientSocketPoolBaseHelper::HandOutSocket(
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
bool reused,
const LoadTimingInfo::ConnectTiming& connect_timing,
ClientSocketHandle* handle,
@@ -990,7 +987,7 @@ void ClientSocketPoolBaseHelper::HandOutSocket(
Group* group,
const BoundNetLog& net_log) {
DCHECK(socket);
- handle->SetSocket(socket.Pass());
+ handle->set_socket(socket);
handle->set_is_reused(reused);
handle->set_idle_time(idle_time);
handle->set_pool_id(pool_generation_number_);
@@ -1003,20 +1000,18 @@ void ClientSocketPoolBaseHelper::HandOutSocket(
"idle_ms", static_cast<int>(idle_time.InMilliseconds())));
}
- net_log.AddEvent(
- NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET,
- handle->socket()->NetLog().source().ToEventParametersCallback());
+ net_log.AddEvent(NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET,
+ socket->NetLog().source().ToEventParametersCallback());
handed_out_socket_count_++;
group->IncrementActiveSocketCount();
}
void ClientSocketPoolBaseHelper::AddIdleSocket(
- scoped_ptr<StreamSocket> socket,
- Group* group) {
+ StreamSocket* socket, Group* group) {
DCHECK(socket);
IdleSocket idle_socket;
- idle_socket.socket = socket.release();
+ idle_socket.socket = socket;
idle_socket.start_time = base::TimeTicks::Now();
group->mutable_idle_sockets()->push_back(idle_socket);
@@ -1187,25 +1182,19 @@ bool ClientSocketPoolBaseHelper::Group::TryToUseUnassignedConnectJob() {
return true;
}
-void ClientSocketPoolBaseHelper::Group::AddJob(scoped_ptr<ConnectJob> job,
+void ClientSocketPoolBaseHelper::Group::AddJob(ConnectJob* job,
bool is_preconnect) {
SanityCheck();
if (is_preconnect)
++unassigned_job_count_;
- jobs_.insert(job.release());
+ jobs_.insert(job);
}
void ClientSocketPoolBaseHelper::Group::RemoveJob(ConnectJob* job) {
- scoped_ptr<ConnectJob> owned_job(job);
SanityCheck();
- std::set<ConnectJob*>::iterator it = jobs_.find(job);
- if (it != jobs_.end()) {
- jobs_.erase(it);
- } else {
- NOTREACHED();
- }
+ jobs_.erase(job);
size_t job_count = jobs_.size();
if (job_count < unassigned_job_count_)
unassigned_job_count_ = job_count;
@@ -1233,17 +1222,15 @@ void ClientSocketPoolBaseHelper::Group::OnBackupSocketTimerFired(
if (pending_requests_.empty())
return;
- scoped_ptr<ConnectJob> backup_job =
- pool->connect_job_factory_->NewConnectJob(
- group_name, **pending_requests_.begin(), pool);
+ ConnectJob* backup_job = pool->connect_job_factory_->NewConnectJob(
+ group_name, **pending_requests_.begin(), pool);
backup_job->net_log().AddEvent(NetLog::TYPE_SOCKET_BACKUP_CREATED);
SIMPLE_STATS_COUNTER("socket.backup_created");
int rv = backup_job->Connect();
pool->connecting_socket_count_++;
- ConnectJob* raw_backup_job = backup_job.get();
- AddJob(backup_job.Pass(), false);
+ AddJob(backup_job, false);
if (rv != ERR_IO_PENDING)
- pool->OnConnectJobComplete(rv, raw_backup_job);
+ pool->OnConnectJobComplete(rv, backup_job);
}
void ClientSocketPoolBaseHelper::Group::SanityCheck() {
diff --git a/chromium/net/socket/client_socket_pool_base.h b/chromium/net/socket/client_socket_pool_base.h
index eb642edd730..4bf95d7b04a 100644
--- a/chromium/net/socket/client_socket_pool_base.h
+++ b/chromium/net/socket/client_socket_pool_base.h
@@ -61,11 +61,8 @@ class NET_EXPORT_PRIVATE ConnectJob {
Delegate() {}
virtual ~Delegate() {}
- // Alerts the delegate that the connection completed. |job| must
- // be destroyed by the delegate. A scoped_ptr<> isn't used because
- // the caller of this function doesn't own |job|.
- virtual void OnConnectJobComplete(int result,
- ConnectJob* job) = 0;
+ // Alerts the delegate that the connection completed.
+ virtual void OnConnectJobComplete(int result, ConnectJob* job) = 0;
private:
DISALLOW_COPY_AND_ASSIGN(Delegate);
@@ -82,10 +79,9 @@ class NET_EXPORT_PRIVATE ConnectJob {
const std::string& group_name() const { return group_name_; }
const BoundNetLog& net_log() { return net_log_; }
- // Releases ownership of the underlying socket to the caller.
- // Returns the released socket, or NULL if there was a connection
- // error.
- scoped_ptr<StreamSocket> PassSocket();
+ // Releases |socket_| to the client. On connection error, this should return
+ // NULL.
+ StreamSocket* ReleaseSocket() { return socket_.release(); }
// Begins connecting the socket. Returns OK on success, ERR_IO_PENDING if it
// cannot complete synchronously without blocking, or another net error code
@@ -109,7 +105,7 @@ class NET_EXPORT_PRIVATE ConnectJob {
const BoundNetLog& net_log() const { return net_log_; }
protected:
- void SetSocket(scoped_ptr<StreamSocket> socket);
+ void set_socket(StreamSocket* socket);
StreamSocket* socket() { return socket_.get(); }
void NotifyDelegateOfCompletion(int rv);
void ResetTimer(base::TimeDelta remainingTime);
@@ -192,7 +188,7 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper
ConnectJobFactory() {}
virtual ~ConnectJobFactory() {}
- virtual scoped_ptr<ConnectJob> NewConnectJob(
+ virtual ConnectJob* NewConnectJob(
const std::string& group_name,
const Request& request,
ConnectJob::Delegate* delegate) const = 0;
@@ -233,7 +229,7 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper
// See ClientSocketPool::ReleaseSocket for documentation on this function.
void ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
int id);
// See ClientSocketPool::FlushWithError for documentation on this function.
@@ -390,8 +386,7 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper
// Otherwise, returns false.
bool TryToUseUnassignedConnectJob();
- void AddJob(scoped_ptr<ConnectJob> job, bool is_preconnect);
- // Remove |job| from this group, which must already own |job|.
+ void AddJob(ConnectJob* job, bool is_preconnect);
void RemoveJob(ConnectJob* job);
void RemoveAllJobs();
@@ -480,7 +475,7 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper
CleanupIdleSockets(false);
}
- // Removes |job| from |group|, which must already own |job|.
+ // Removes |job| from |connect_job_set_|. Also updates |group| if non-NULL.
void RemoveConnectJob(ConnectJob* job, Group* group);
// Tries to see if we can handle any more requests for |group|.
@@ -490,7 +485,7 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper
void ProcessPendingRequest(const std::string& group_name, Group* group);
// Assigns |socket| to |handle| and updates |group|'s counters appropriately.
- void HandOutSocket(scoped_ptr<StreamSocket> socket,
+ void HandOutSocket(StreamSocket* socket,
bool reused,
const LoadTimingInfo::ConnectTiming& connect_timing,
ClientSocketHandle* handle,
@@ -499,7 +494,7 @@ class NET_EXPORT_PRIVATE ClientSocketPoolBaseHelper
const BoundNetLog& net_log);
// Adds |socket| to the list of idle sockets for |group|.
- void AddIdleSocket(scoped_ptr<StreamSocket> socket, Group* group);
+ void AddIdleSocket(StreamSocket* socket, Group* group);
// Iterates through |group_map_|, canceling all ConnectJobs and deleting
// groups if they are no longer needed.
@@ -629,7 +624,7 @@ class ClientSocketPoolBase {
ConnectJobFactory() {}
virtual ~ConnectJobFactory() {}
- virtual scoped_ptr<ConnectJob> NewConnectJob(
+ virtual ConnectJob* NewConnectJob(
const std::string& group_name,
const Request& request,
ConnectJob::Delegate* delegate) const = 0;
@@ -707,10 +702,9 @@ class ClientSocketPoolBase {
return helper_.CancelRequest(group_name, handle);
}
- void ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
+ void ReleaseSocket(const std::string& group_name, StreamSocket* socket,
int id) {
- return helper_.ReleaseSocket(group_name, socket.Pass(), id);
+ return helper_.ReleaseSocket(group_name, socket, id);
}
void FlushWithError(int error) { helper_.FlushWithError(error); }
@@ -791,13 +785,13 @@ class ClientSocketPoolBase {
: connect_job_factory_(connect_job_factory) {}
virtual ~ConnectJobFactoryAdaptor() {}
- virtual scoped_ptr<ConnectJob> NewConnectJob(
+ virtual ConnectJob* NewConnectJob(
const std::string& group_name,
const internal::ClientSocketPoolBaseHelper::Request& request,
- ConnectJob::Delegate* delegate) const OVERRIDE {
- const Request& casted_request = static_cast<const Request&>(request);
+ ConnectJob::Delegate* delegate) const {
+ const Request* casted_request = static_cast<const Request*>(&request);
return connect_job_factory_->NewConnectJob(
- group_name, casted_request, delegate);
+ group_name, *casted_request, delegate);
}
virtual base::TimeDelta ConnectionTimeout() const {
diff --git a/chromium/net/socket/client_socket_pool_base_unittest.cc b/chromium/net/socket/client_socket_pool_base_unittest.cc
index 6688e01244d..5eeda972cff 100644
--- a/chromium/net/socket/client_socket_pool_base_unittest.cc
+++ b/chromium/net/socket/client_socket_pool_base_unittest.cc
@@ -30,9 +30,7 @@
#include "net/socket/client_socket_handle.h"
#include "net/socket/client_socket_pool_histograms.h"
#include "net/socket/socket_test_util.h"
-#include "net/socket/ssl_client_socket.h"
#include "net/socket/stream_socket.h"
-#include "net/udp/datagram_client_socket.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -191,30 +189,30 @@ class MockClientSocketFactory : public ClientSocketFactory {
public:
MockClientSocketFactory() : allocation_count_(0) {}
- virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
+ virtual DatagramClientSocket* CreateDatagramClientSocket(
DatagramSocket::BindType bind_type,
const RandIntCallback& rand_int_cb,
NetLog* net_log,
const NetLog::Source& source) OVERRIDE {
NOTREACHED();
- return scoped_ptr<DatagramClientSocket>();
+ return NULL;
}
- virtual scoped_ptr<StreamSocket> CreateTransportClientSocket(
+ virtual StreamSocket* CreateTransportClientSocket(
const AddressList& addresses,
NetLog* /* net_log */,
const NetLog::Source& /*source*/) OVERRIDE {
allocation_count_++;
- return scoped_ptr<StreamSocket>();
+ return NULL;
}
- virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
+ virtual SSLClientSocket* CreateSSLClientSocket(
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context) OVERRIDE {
NOTIMPLEMENTED();
- return scoped_ptr<SSLClientSocket>();
+ return NULL;
}
virtual void ClearSSLSessionCache() OVERRIDE {
@@ -296,8 +294,7 @@ class TestConnectJob : public ConnectJob {
AddressList ignored;
client_socket_factory_->CreateTransportClientSocket(
ignored, NULL, net::NetLog::Source());
- SetSocket(
- scoped_ptr<StreamSocket>(new MockClientSocket(net_log().net_log())));
+ set_socket(new MockClientSocket(net_log().net_log()));
switch (job_type_) {
case kMockJob:
return DoConnect(true /* successful */, false /* sync */,
@@ -376,7 +373,7 @@ class TestConnectJob : public ConnectJob {
return ERR_IO_PENDING;
default:
NOTREACHED();
- SetSocket(scoped_ptr<StreamSocket>());
+ set_socket(NULL);
return ERR_FAILED;
}
}
@@ -389,7 +386,7 @@ class TestConnectJob : public ConnectJob {
result = ERR_PROXY_AUTH_REQUESTED;
} else {
result = ERR_CONNECTION_FAILED;
- SetSocket(scoped_ptr<StreamSocket>());
+ set_socket(NULL);
}
if (was_async)
@@ -433,7 +430,7 @@ class TestConnectJobFactory
// ConnectJobFactory implementation.
- virtual scoped_ptr<ConnectJob> NewConnectJob(
+ virtual ConnectJob* NewConnectJob(
const std::string& group_name,
const TestClientSocketPoolBase::Request& request,
ConnectJob::Delegate* delegate) const OVERRIDE {
@@ -443,13 +440,13 @@ class TestConnectJobFactory
job_type = job_types_->front();
job_types_->pop_front();
}
- return scoped_ptr<ConnectJob>(new TestConnectJob(job_type,
- group_name,
- request,
- timeout_duration_,
- delegate,
- client_socket_factory_,
- net_log_));
+ return new TestConnectJob(job_type,
+ group_name,
+ request,
+ timeout_duration_,
+ delegate,
+ client_socket_factory_,
+ net_log_);
}
virtual base::TimeDelta ConnectionTimeout() const OVERRIDE {
@@ -512,9 +509,9 @@ class TestClientSocketPool : public ClientSocketPool {
virtual void ReleaseSocket(
const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
int id) OVERRIDE {
- base_.ReleaseSocket(group_name, socket.Pass(), id);
+ base_.ReleaseSocket(group_name, socket, id);
}
virtual void FlushWithError(int error) OVERRIDE {
@@ -633,10 +630,10 @@ class TestConnectJobDelegate : public ConnectJob::Delegate {
virtual void OnConnectJobComplete(int result, ConnectJob* job) OVERRIDE {
result_ = result;
- scoped_ptr<ConnectJob> owned_job(job);
- scoped_ptr<StreamSocket> socket = owned_job->PassSocket();
+ scoped_ptr<StreamSocket> socket(job->ReleaseSocket());
// socket.get() should be NULL iff result != OK
- EXPECT_EQ(socket == NULL, result != OK);
+ EXPECT_EQ(socket.get() == NULL, result != OK);
+ delete job;
have_result_ = true;
if (waiting_for_result_)
base::MessageLoop::current()->Quit();
diff --git a/chromium/net/socket/nss_ssl_util.cc b/chromium/net/socket/nss_ssl_util.cc
index ae037b17c1e..be33ac5add0 100644
--- a/chromium/net/socket/nss_ssl_util.cc
+++ b/chromium/net/socket/nss_ssl_util.cc
@@ -58,13 +58,12 @@ class NSSSSLInitSingleton {
enabled = false;
// Trim the list of cipher suites in order to keep the size of the
- // ClientHello down. DSS, ECDH, CAMELLIA, SEED, ECC+3DES, and
- // HMAC-SHA256 cipher suites are disabled.
+ // ClientHello down. DSS, ECDH, CAMELLIA, SEED and ECC+3DES cipher
+ // suites are disabled.
if (info.symCipher == ssl_calg_camellia ||
info.symCipher == ssl_calg_seed ||
(info.symCipher == ssl_calg_3des && info.keaType != ssl_kea_rsa) ||
info.authAlgorithm == ssl_auth_dsa ||
- info.macAlgorithm == ssl_hmac_sha256 ||
info.nonStandard ||
strcmp(info.keaTypeName, "ECDH") == 0) {
enabled = false;
diff --git a/chromium/net/socket/socket_test_util.cc b/chromium/net/socket/socket_test_util.cc
index 159f62e42c6..8b2bdfccba3 100644
--- a/chromium/net/socket/socket_test_util.cc
+++ b/chromium/net/socket/socket_test_util.cc
@@ -657,39 +657,37 @@ void MockClientSocketFactory::ResetNextMockIndexes() {
mock_ssl_data_.ResetNextIndex();
}
-scoped_ptr<DatagramClientSocket>
-MockClientSocketFactory::CreateDatagramClientSocket(
+DatagramClientSocket* MockClientSocketFactory::CreateDatagramClientSocket(
DatagramSocket::BindType bind_type,
const RandIntCallback& rand_int_cb,
net::NetLog* net_log,
const net::NetLog::Source& source) {
SocketDataProvider* data_provider = mock_data_.GetNext();
- scoped_ptr<MockUDPClientSocket> socket(
- new MockUDPClientSocket(data_provider, net_log));
- data_provider->set_socket(socket.get());
- return socket.PassAs<DatagramClientSocket>();
+ MockUDPClientSocket* socket = new MockUDPClientSocket(data_provider, net_log);
+ data_provider->set_socket(socket);
+ return socket;
}
-scoped_ptr<StreamSocket> MockClientSocketFactory::CreateTransportClientSocket(
+StreamSocket* MockClientSocketFactory::CreateTransportClientSocket(
const AddressList& addresses,
net::NetLog* net_log,
const net::NetLog::Source& source) {
SocketDataProvider* data_provider = mock_data_.GetNext();
- scoped_ptr<MockTCPClientSocket> socket(
- new MockTCPClientSocket(addresses, net_log, data_provider));
- data_provider->set_socket(socket.get());
- return socket.PassAs<StreamSocket>();
+ MockTCPClientSocket* socket =
+ new MockTCPClientSocket(addresses, net_log, data_provider);
+ data_provider->set_socket(socket);
+ return socket;
}
-scoped_ptr<SSLClientSocket> MockClientSocketFactory::CreateSSLClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
+SSLClientSocket* MockClientSocketFactory::CreateSSLClientSocket(
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context) {
- return scoped_ptr<SSLClientSocket>(
- new MockSSLClientSocket(transport_socket.Pass(),
- host_and_port, ssl_config,
- mock_ssl_data_.GetNext()));
+ MockSSLClientSocket* socket =
+ new MockSSLClientSocket(transport_socket, host_and_port, ssl_config,
+ mock_ssl_data_.GetNext());
+ return socket;
}
void MockClientSocketFactory::ClearSSLSessionCache() {
@@ -1280,7 +1278,7 @@ void DeterministicMockTCPClientSocket::OnConnectComplete(
// static
void MockSSLClientSocket::ConnectCallback(
- MockSSLClientSocket* ssl_client_socket,
+ MockSSLClientSocket *ssl_client_socket,
const CompletionCallback& callback,
int rv) {
if (rv == OK)
@@ -1289,7 +1287,7 @@ void MockSSLClientSocket::ConnectCallback(
}
MockSSLClientSocket::MockSSLClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_port_pair,
const SSLConfig& ssl_config,
SSLSocketDataProvider* data)
@@ -1297,7 +1295,7 @@ MockSSLClientSocket::MockSSLClientSocket(
// Have to use the right BoundNetLog for LoadTimingInfo regression
// tests.
transport_socket->socket()->NetLog()),
- transport_(transport_socket.Pass()),
+ transport_(transport_socket),
data_(data),
is_npn_state_set_(false),
new_npn_value_(false),
@@ -1666,10 +1664,10 @@ void ClientSocketPoolTest::ReleaseAllConnections(KeepAlive keep_alive) {
}
MockTransportClientSocketPool::MockConnectJob::MockConnectJob(
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
ClientSocketHandle* handle,
const CompletionCallback& callback)
- : socket_(socket.Pass()),
+ : socket_(socket),
handle_(handle),
user_callback_(callback) {
}
@@ -1700,7 +1698,7 @@ void MockTransportClientSocketPool::MockConnectJob::OnConnect(int rv) {
if (!socket_.get())
return;
if (rv == OK) {
- handle_->SetSocket(socket_.Pass());
+ handle_->set_socket(socket_.release());
// Needed for socket pool tests that layer other sockets on top of mock
// sockets.
@@ -1742,10 +1740,9 @@ int MockTransportClientSocketPool::RequestSocket(
const std::string& group_name, const void* socket_params,
RequestPriority priority, ClientSocketHandle* handle,
const CompletionCallback& callback, const BoundNetLog& net_log) {
- scoped_ptr<StreamSocket> socket =
- client_socket_factory_->CreateTransportClientSocket(
- AddressList(), net_log.net_log(), net::NetLog::Source());
- MockConnectJob* job = new MockConnectJob(socket.Pass(), handle, callback);
+ StreamSocket* socket = client_socket_factory_->CreateTransportClientSocket(
+ AddressList(), net_log.net_log(), net::NetLog::Source());
+ MockConnectJob* job = new MockConnectJob(socket, handle, callback);
job_list_.push_back(job);
handle->set_pool_id(1);
return job->Connect();
@@ -1762,12 +1759,11 @@ void MockTransportClientSocketPool::CancelRequest(const std::string& group_name,
}
}
-void MockTransportClientSocketPool::ReleaseSocket(
- const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
- int id) {
+void MockTransportClientSocketPool::ReleaseSocket(const std::string& group_name,
+ StreamSocket* socket, int id) {
EXPECT_EQ(1, id);
release_count_++;
+ delete socket;
}
DeterministicMockClientSocketFactory::DeterministicMockClientSocketFactory() {}
@@ -1795,45 +1791,42 @@ MockSSLClientSocket* DeterministicMockClientSocketFactory::
return ssl_client_sockets_[index];
}
-scoped_ptr<DatagramClientSocket>
+DatagramClientSocket*
DeterministicMockClientSocketFactory::CreateDatagramClientSocket(
DatagramSocket::BindType bind_type,
const RandIntCallback& rand_int_cb,
net::NetLog* net_log,
const NetLog::Source& source) {
DeterministicSocketData* data_provider = mock_data().GetNext();
- scoped_ptr<DeterministicMockUDPClientSocket> socket(
- new DeterministicMockUDPClientSocket(net_log, data_provider));
+ DeterministicMockUDPClientSocket* socket =
+ new DeterministicMockUDPClientSocket(net_log, data_provider);
data_provider->set_delegate(socket->AsWeakPtr());
- udp_client_sockets().push_back(socket.get());
- return socket.PassAs<DatagramClientSocket>();
+ udp_client_sockets().push_back(socket);
+ return socket;
}
-scoped_ptr<StreamSocket>
-DeterministicMockClientSocketFactory::CreateTransportClientSocket(
+StreamSocket* DeterministicMockClientSocketFactory::CreateTransportClientSocket(
const AddressList& addresses,
net::NetLog* net_log,
const net::NetLog::Source& source) {
DeterministicSocketData* data_provider = mock_data().GetNext();
- scoped_ptr<DeterministicMockTCPClientSocket> socket(
- new DeterministicMockTCPClientSocket(net_log, data_provider));
+ DeterministicMockTCPClientSocket* socket =
+ new DeterministicMockTCPClientSocket(net_log, data_provider);
data_provider->set_delegate(socket->AsWeakPtr());
- tcp_client_sockets().push_back(socket.get());
- return socket.PassAs<StreamSocket>();
+ tcp_client_sockets().push_back(socket);
+ return socket;
}
-scoped_ptr<SSLClientSocket>
-DeterministicMockClientSocketFactory::CreateSSLClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
+SSLClientSocket* DeterministicMockClientSocketFactory::CreateSSLClientSocket(
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context) {
- scoped_ptr<MockSSLClientSocket> socket(
- new MockSSLClientSocket(transport_socket.Pass(),
- host_and_port, ssl_config,
- mock_ssl_data_.GetNext()));
- ssl_client_sockets_.push_back(socket.get());
- return socket.PassAs<SSLClientSocket>();
+ MockSSLClientSocket* socket =
+ new MockSSLClientSocket(transport_socket, host_and_port, ssl_config,
+ mock_ssl_data_.GetNext());
+ ssl_client_sockets_.push_back(socket);
+ return socket;
}
void DeterministicMockClientSocketFactory::ClearSSLSessionCache() {
@@ -1866,9 +1859,8 @@ void MockSOCKSClientSocketPool::CancelRequest(
}
void MockSOCKSClientSocketPool::ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
- int id) {
- return transport_pool_->ReleaseSocket(group_name, socket.Pass(), id);
+ StreamSocket* socket, int id) {
+ return transport_pool_->ReleaseSocket(group_name, socket, id);
}
const char kSOCKS5GreetRequest[] = { 0x05, 0x01, 0x00 };
diff --git a/chromium/net/socket/socket_test_util.h b/chromium/net/socket/socket_test_util.h
index a888249654c..6afe170299e 100644
--- a/chromium/net/socket/socket_test_util.h
+++ b/chromium/net/socket/socket_test_util.h
@@ -592,17 +592,17 @@ class MockClientSocketFactory : public ClientSocketFactory {
}
// ClientSocketFactory
- virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
+ virtual DatagramClientSocket* CreateDatagramClientSocket(
DatagramSocket::BindType bind_type,
const RandIntCallback& rand_int_cb,
NetLog* net_log,
const NetLog::Source& source) OVERRIDE;
- virtual scoped_ptr<StreamSocket> CreateTransportClientSocket(
+ virtual StreamSocket* CreateTransportClientSocket(
const AddressList& addresses,
NetLog* net_log,
const NetLog::Source& source) OVERRIDE;
- virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
+ virtual SSLClientSocket* CreateSSLClientSocket(
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context) OVERRIDE;
@@ -857,7 +857,7 @@ class DeterministicMockTCPClientSocket
class MockSSLClientSocket : public MockClientSocket, public AsyncSocket {
public:
MockSSLClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
SSLSocketDataProvider* socket);
@@ -1049,7 +1049,7 @@ class MockTransportClientSocketPool : public TransportClientSocketPool {
public:
class MockConnectJob {
public:
- MockConnectJob(scoped_ptr<StreamSocket> socket, ClientSocketHandle* handle,
+ MockConnectJob(StreamSocket* socket, ClientSocketHandle* handle,
const CompletionCallback& callback);
~MockConnectJob();
@@ -1088,8 +1088,7 @@ class MockTransportClientSocketPool : public TransportClientSocketPool {
virtual void CancelRequest(const std::string& group_name,
ClientSocketHandle* handle) OVERRIDE;
virtual void ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
- int id) OVERRIDE;
+ StreamSocket* socket, int id) OVERRIDE;
private:
ClientSocketFactory* client_socket_factory_;
@@ -1124,17 +1123,17 @@ class DeterministicMockClientSocketFactory : public ClientSocketFactory {
}
// ClientSocketFactory
- virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
+ virtual DatagramClientSocket* CreateDatagramClientSocket(
DatagramSocket::BindType bind_type,
const RandIntCallback& rand_int_cb,
NetLog* net_log,
const NetLog::Source& source) OVERRIDE;
- virtual scoped_ptr<StreamSocket> CreateTransportClientSocket(
+ virtual StreamSocket* CreateTransportClientSocket(
const AddressList& addresses,
NetLog* net_log,
const NetLog::Source& source) OVERRIDE;
- virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
+ virtual SSLClientSocket* CreateSSLClientSocket(
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context) OVERRIDE;
@@ -1171,8 +1170,7 @@ class MockSOCKSClientSocketPool : public SOCKSClientSocketPool {
virtual void CancelRequest(const std::string& group_name,
ClientSocketHandle* handle) OVERRIDE;
virtual void ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
- int id) OVERRIDE;
+ StreamSocket* socket, int id) OVERRIDE;
private:
TransportClientSocketPool* const transport_pool_;
diff --git a/chromium/net/socket/socks5_client_socket.cc b/chromium/net/socket/socks5_client_socket.cc
index 537b584a932..c9d25bc3dcb 100644
--- a/chromium/net/socket/socks5_client_socket.cc
+++ b/chromium/net/socket/socks5_client_socket.cc
@@ -28,18 +28,34 @@ COMPILE_ASSERT(sizeof(struct in_addr) == 4, incorrect_system_size_of_IPv4);
COMPILE_ASSERT(sizeof(struct in6_addr) == 16, incorrect_system_size_of_IPv6);
SOCKS5ClientSocket::SOCKS5ClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
+ ClientSocketHandle* transport_socket,
const HostResolver::RequestInfo& req_info)
: io_callback_(base::Bind(&SOCKS5ClientSocket::OnIOComplete,
base::Unretained(this))),
- transport_(transport_socket.Pass()),
+ transport_(transport_socket),
next_state_(STATE_NONE),
completed_handshake_(false),
bytes_sent_(0),
bytes_received_(0),
read_header_size(kReadHeaderSize),
host_request_info_(req_info),
- net_log_(transport_->socket()->NetLog()) {
+ net_log_(transport_socket->socket()->NetLog()) {
+}
+
+SOCKS5ClientSocket::SOCKS5ClientSocket(
+ StreamSocket* transport_socket,
+ const HostResolver::RequestInfo& req_info)
+ : io_callback_(base::Bind(&SOCKS5ClientSocket::OnIOComplete,
+ base::Unretained(this))),
+ transport_(new ClientSocketHandle()),
+ next_state_(STATE_NONE),
+ completed_handshake_(false),
+ bytes_sent_(0),
+ bytes_received_(0),
+ read_header_size(kReadHeaderSize),
+ host_request_info_(req_info),
+ net_log_(transport_socket->NetLog()) {
+ transport_->set_socket(transport_socket);
}
SOCKS5ClientSocket::~SOCKS5ClientSocket() {
diff --git a/chromium/net/socket/socks5_client_socket.h b/chromium/net/socket/socks5_client_socket.h
index 45216244f10..b955e8f42de 100644
--- a/chromium/net/socket/socks5_client_socket.h
+++ b/chromium/net/socket/socks5_client_socket.h
@@ -28,13 +28,20 @@ class BoundNetLog;
// Currently no SOCKSv5 authentication is supported.
class NET_EXPORT_PRIVATE SOCKS5ClientSocket : public StreamSocket {
public:
+ // Takes ownership of the |transport_socket|, which should already be
+ // connected by the time Connect() is called.
+ //
// |req_info| contains the hostname and port to which the socket above will
// communicate to via the SOCKS layer.
//
// Although SOCKS 5 supports 3 different modes of addressing, we will
// always pass it a hostname. This means the DNS resolving is done
// proxy side.
- SOCKS5ClientSocket(scoped_ptr<ClientSocketHandle> transport_socket,
+ SOCKS5ClientSocket(ClientSocketHandle* transport_socket,
+ const HostResolver::RequestInfo& req_info);
+
+ // Deprecated constructor (http://crbug.com/37810) that takes a StreamSocket.
+ SOCKS5ClientSocket(StreamSocket* transport_socket,
const HostResolver::RequestInfo& req_info);
// On destruction Disconnect() is called.
diff --git a/chromium/net/socket/socks5_client_socket_unittest.cc b/chromium/net/socket/socks5_client_socket_unittest.cc
index 4c9240ff5c1..717d858eef8 100644
--- a/chromium/net/socket/socks5_client_socket_unittest.cc
+++ b/chromium/net/socket/socks5_client_socket_unittest.cc
@@ -32,13 +32,13 @@ class SOCKS5ClientSocketTest : public PlatformTest {
public:
SOCKS5ClientSocketTest();
// Create a SOCKSClientSocket on top of a MockSocket.
- scoped_ptr<SOCKS5ClientSocket> BuildMockSocket(MockRead reads[],
- size_t reads_count,
- MockWrite writes[],
- size_t writes_count,
- const std::string& hostname,
- int port,
- NetLog* net_log);
+ SOCKS5ClientSocket* BuildMockSocket(MockRead reads[],
+ size_t reads_count,
+ MockWrite writes[],
+ size_t writes_count,
+ const std::string& hostname,
+ int port,
+ NetLog* net_log);
virtual void SetUp();
@@ -47,8 +47,6 @@ class SOCKS5ClientSocketTest : public PlatformTest {
CapturingNetLog net_log_;
scoped_ptr<SOCKS5ClientSocket> user_sock_;
AddressList address_list_;
- // Filled in by BuildMockSocket() and owned by its return value
- // (which |user_sock| is set to).
StreamSocket* tcp_sock_;
TestCompletionCallback callback_;
scoped_ptr<MockHostResolver> host_resolver_;
@@ -77,7 +75,7 @@ void SOCKS5ClientSocketTest::SetUp() {
ASSERT_EQ(OK, rv);
}
-scoped_ptr<SOCKS5ClientSocket> SOCKS5ClientSocketTest::BuildMockSocket(
+SOCKS5ClientSocket* SOCKS5ClientSocketTest::BuildMockSocket(
MockRead reads[],
size_t reads_count,
MockWrite writes[],
@@ -96,13 +94,8 @@ scoped_ptr<SOCKS5ClientSocket> SOCKS5ClientSocketTest::BuildMockSocket(
EXPECT_EQ(OK, rv);
EXPECT_TRUE(tcp_sock_->IsConnected());
- scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle);
- // |connection| takes ownership of |tcp_sock_|, but keep a
- // non-owning pointer to it.
- connection->SetSocket(scoped_ptr<StreamSocket>(tcp_sock_));
- return scoped_ptr<SOCKS5ClientSocket>(new SOCKS5ClientSocket(
- connection.Pass(),
- HostResolver::RequestInfo(HostPortPair(hostname, port))));
+ return new SOCKS5ClientSocket(tcp_sock_,
+ HostResolver::RequestInfo(HostPortPair(hostname, port)));
}
// Tests a complete SOCKS5 handshake and the disconnection.
@@ -130,9 +123,9 @@ TEST_F(SOCKS5ClientSocketTest, CompleteHandshake) {
MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength),
MockRead(ASYNC, payload_read.data(), payload_read.size()) };
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- "localhost", 80, &net_log_);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ "localhost", 80, &net_log_));
// At this state the TCP connection is completed but not the SOCKS handshake.
EXPECT_TRUE(tcp_sock_->IsConnected());
@@ -202,9 +195,9 @@ TEST_F(SOCKS5ClientSocketTest, ConnectAndDisconnectTwice) {
MockRead(SYNCHRONOUS, kSOCKS5OkResponse, kSOCKS5OkResponseLength)
};
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- hostname, 80, NULL);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ hostname, 80, NULL));
int rv = user_sock_->Connect(callback_.callback());
EXPECT_EQ(OK, rv);
@@ -224,9 +217,9 @@ TEST_F(SOCKS5ClientSocketTest, LargeHostNameFails) {
// Create a SOCKS socket, with mock transport socket.
MockWrite data_writes[] = {MockWrite()};
MockRead data_reads[] = {MockRead()};
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- large_host_name, 80, NULL);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ large_host_name, 80, NULL));
// Try to connect -- should fail (without having read/written anything to
// the transport socket first) because the hostname is too long.
@@ -260,9 +253,9 @@ TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) {
MockRead data_reads[] = {
MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength),
MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) };
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- hostname, 80, &net_log_);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ hostname, 80, &net_log_));
int rv = user_sock_->Connect(callback_.callback());
EXPECT_EQ(ERR_IO_PENDING, rv);
@@ -291,9 +284,9 @@ TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) {
MockRead(ASYNC, partial1, arraysize(partial1)),
MockRead(ASYNC, partial2, arraysize(partial2)),
MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) };
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- hostname, 80, &net_log_);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ hostname, 80, &net_log_));
int rv = user_sock_->Connect(callback_.callback());
EXPECT_EQ(ERR_IO_PENDING, rv);
@@ -321,9 +314,9 @@ TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) {
MockRead data_reads[] = {
MockRead(ASYNC, kSOCKS5GreetResponse, kSOCKS5GreetResponseLength),
MockRead(ASYNC, kSOCKS5OkResponse, kSOCKS5OkResponseLength) };
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- hostname, 80, &net_log_);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ hostname, 80, &net_log_));
int rv = user_sock_->Connect(callback_.callback());
EXPECT_EQ(ERR_IO_PENDING, rv);
CapturingNetLog::CapturedEntryList net_log_entries;
@@ -352,9 +345,9 @@ TEST_F(SOCKS5ClientSocketTest, PartialReadWrites) {
kSOCKS5OkResponseLength - kSplitPoint)
};
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- hostname, 80, &net_log_);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ hostname, 80, &net_log_));
int rv = user_sock_->Connect(callback_.callback());
EXPECT_EQ(ERR_IO_PENDING, rv);
CapturingNetLog::CapturedEntryList net_log_entries;
diff --git a/chromium/net/socket/socks_client_socket.cc b/chromium/net/socket/socks_client_socket.cc
index 1941fdbfd95..c4bbd28c619 100644
--- a/chromium/net/socket/socks_client_socket.cc
+++ b/chromium/net/socket/socks_client_socket.cc
@@ -55,18 +55,31 @@ struct SOCKS4ServerResponse {
COMPILE_ASSERT(sizeof(SOCKS4ServerResponse) == kReadHeaderSize,
socks4_server_response_struct_wrong_size);
-SOCKSClientSocket::SOCKSClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
- const HostResolver::RequestInfo& req_info,
- HostResolver* host_resolver)
- : transport_(transport_socket.Pass()),
+SOCKSClientSocket::SOCKSClientSocket(ClientSocketHandle* transport_socket,
+ const HostResolver::RequestInfo& req_info,
+ HostResolver* host_resolver)
+ : transport_(transport_socket),
next_state_(STATE_NONE),
completed_handshake_(false),
bytes_sent_(0),
bytes_received_(0),
host_resolver_(host_resolver),
host_request_info_(req_info),
- net_log_(transport_->socket()->NetLog()) {
+ net_log_(transport_socket->socket()->NetLog()) {
+}
+
+SOCKSClientSocket::SOCKSClientSocket(StreamSocket* transport_socket,
+ const HostResolver::RequestInfo& req_info,
+ HostResolver* host_resolver)
+ : transport_(new ClientSocketHandle()),
+ next_state_(STATE_NONE),
+ completed_handshake_(false),
+ bytes_sent_(0),
+ bytes_received_(0),
+ host_resolver_(host_resolver),
+ host_request_info_(req_info),
+ net_log_(transport_socket->NetLog()) {
+ transport_->set_socket(transport_socket);
}
SOCKSClientSocket::~SOCKSClientSocket() {
diff --git a/chromium/net/socket/socks_client_socket.h b/chromium/net/socket/socks_client_socket.h
index 285c75ec295..3d4f9fc2771 100644
--- a/chromium/net/socket/socks_client_socket.h
+++ b/chromium/net/socket/socks_client_socket.h
@@ -27,9 +27,17 @@ class BoundNetLog;
// The SOCKS client socket implementation
class NET_EXPORT_PRIVATE SOCKSClientSocket : public StreamSocket {
public:
+ // Takes ownership of the |transport_socket|, which should already be
+ // connected by the time Connect() is called.
+ //
// |req_info| contains the hostname and port to which the socket above will
// communicate to via the socks layer. For testing the referrer is optional.
- SOCKSClientSocket(scoped_ptr<ClientSocketHandle> transport_socket,
+ SOCKSClientSocket(ClientSocketHandle* transport_socket,
+ const HostResolver::RequestInfo& req_info,
+ HostResolver* host_resolver);
+
+ // Deprecated constructor (http://crbug.com/37810) that takes a StreamSocket.
+ SOCKSClientSocket(StreamSocket* transport_socket,
const HostResolver::RequestInfo& req_info,
HostResolver* host_resolver);
diff --git a/chromium/net/socket/socks_client_socket_pool.cc b/chromium/net/socket/socks_client_socket_pool.cc
index e49eabaa84c..d740e5b9a0e 100644
--- a/chromium/net/socket/socks_client_socket_pool.cc
+++ b/chromium/net/socket/socks_client_socket_pool.cc
@@ -140,10 +140,10 @@ int SOCKSConnectJob::DoSOCKSConnect() {
// Add a SOCKS connection on top of the tcp socket.
if (socks_params_->is_socks_v5()) {
- socket_.reset(new SOCKS5ClientSocket(transport_socket_handle_.Pass(),
+ socket_.reset(new SOCKS5ClientSocket(transport_socket_handle_.release(),
socks_params_->destination()));
} else {
- socket_.reset(new SOCKSClientSocket(transport_socket_handle_.Pass(),
+ socket_.reset(new SOCKSClientSocket(transport_socket_handle_.release(),
socks_params_->destination(),
resolver_));
}
@@ -157,7 +157,7 @@ int SOCKSConnectJob::DoSOCKSConnectComplete(int result) {
return result;
}
- SetSocket(socket_.Pass());
+ set_socket(socket_.release());
return result;
}
@@ -166,18 +166,17 @@ int SOCKSConnectJob::ConnectInternal() {
return DoLoop(OK);
}
-scoped_ptr<ConnectJob>
-SOCKSClientSocketPool::SOCKSConnectJobFactory::NewConnectJob(
+ConnectJob* SOCKSClientSocketPool::SOCKSConnectJobFactory::NewConnectJob(
const std::string& group_name,
const PoolBase::Request& request,
ConnectJob::Delegate* delegate) const {
- return scoped_ptr<ConnectJob>(new SOCKSConnectJob(group_name,
- request.params(),
- ConnectionTimeout(),
- transport_pool_,
- host_resolver_,
- delegate,
- net_log_));
+ return new SOCKSConnectJob(group_name,
+ request.params(),
+ ConnectionTimeout(),
+ transport_pool_,
+ host_resolver_,
+ delegate,
+ net_log_);
}
base::TimeDelta
@@ -239,9 +238,8 @@ void SOCKSClientSocketPool::CancelRequest(const std::string& group_name,
}
void SOCKSClientSocketPool::ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
- int id) {
- base_.ReleaseSocket(group_name, socket.Pass(), id);
+ StreamSocket* socket, int id) {
+ base_.ReleaseSocket(group_name, socket, id);
}
void SOCKSClientSocketPool::FlushWithError(int error) {
diff --git a/chromium/net/socket/socks_client_socket_pool.h b/chromium/net/socket/socks_client_socket_pool.h
index fe69a78df69..86609a1a5a0 100644
--- a/chromium/net/socket/socks_client_socket_pool.h
+++ b/chromium/net/socket/socks_client_socket_pool.h
@@ -134,7 +134,7 @@ class NET_EXPORT_PRIVATE SOCKSClientSocketPool
ClientSocketHandle* handle) OVERRIDE;
virtual void ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
int id) OVERRIDE;
virtual void FlushWithError(int error) OVERRIDE;
@@ -183,7 +183,7 @@ class NET_EXPORT_PRIVATE SOCKSClientSocketPool
virtual ~SOCKSConnectJobFactory() {}
// ClientSocketPoolBase::ConnectJobFactory methods.
- virtual scoped_ptr<ConnectJob> NewConnectJob(
+ virtual ConnectJob* NewConnectJob(
const std::string& group_name,
const PoolBase::Request& request,
ConnectJob::Delegate* delegate) const OVERRIDE;
diff --git a/chromium/net/socket/socks_client_socket_unittest.cc b/chromium/net/socket/socks_client_socket_unittest.cc
index 8c30838959d..7a8faf69856 100644
--- a/chromium/net/socket/socks_client_socket_unittest.cc
+++ b/chromium/net/socket/socks_client_socket_unittest.cc
@@ -4,7 +4,6 @@
#include "net/socket/socks_client_socket.h"
-#include "base/memory/scoped_ptr.h"
#include "net/base/address_list.h"
#include "net/base/net_log.h"
#include "net/base/net_log_unittest.h"
@@ -28,19 +27,16 @@ class SOCKSClientSocketTest : public PlatformTest {
public:
SOCKSClientSocketTest();
// Create a SOCKSClientSocket on top of a MockSocket.
- scoped_ptr<SOCKSClientSocket> BuildMockSocket(
- MockRead reads[], size_t reads_count,
- MockWrite writes[], size_t writes_count,
- HostResolver* host_resolver,
- const std::string& hostname, int port,
- NetLog* net_log);
+ SOCKSClientSocket* BuildMockSocket(MockRead reads[], size_t reads_count,
+ MockWrite writes[], size_t writes_count,
+ HostResolver* host_resolver,
+ const std::string& hostname, int port,
+ NetLog* net_log);
virtual void SetUp();
protected:
scoped_ptr<SOCKSClientSocket> user_sock_;
AddressList address_list_;
- // Filled in by BuildMockSocket() and owned by its return value
- // (which |user_sock| is set to).
StreamSocket* tcp_sock_;
TestCompletionCallback callback_;
scoped_ptr<MockHostResolver> host_resolver_;
@@ -56,7 +52,7 @@ void SOCKSClientSocketTest::SetUp() {
PlatformTest::SetUp();
}
-scoped_ptr<SOCKSClientSocket> SOCKSClientSocketTest::BuildMockSocket(
+SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket(
MockRead reads[],
size_t reads_count,
MockWrite writes[],
@@ -77,14 +73,9 @@ scoped_ptr<SOCKSClientSocket> SOCKSClientSocketTest::BuildMockSocket(
EXPECT_EQ(OK, rv);
EXPECT_TRUE(tcp_sock_->IsConnected());
- scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle);
- // |connection| takes ownership of |tcp_sock_|, but keep a
- // non-owning pointer to it.
- connection->SetSocket(scoped_ptr<StreamSocket>(tcp_sock_));
- return scoped_ptr<SOCKSClientSocket>(new SOCKSClientSocket(
- connection.Pass(),
+ return new SOCKSClientSocket(tcp_sock_,
HostResolver::RequestInfo(HostPortPair(hostname, port)),
- host_resolver));
+ host_resolver);
}
// Implementation of HostResolver that never completes its resolve request.
@@ -143,11 +134,11 @@ TEST_F(SOCKSClientSocketTest, CompleteHandshake) {
MockRead(ASYNC, payload_read.data(), payload_read.size()) };
CapturingNetLog log;
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- host_resolver_.get(),
- "localhost", 80,
- &log);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ host_resolver_.get(),
+ "localhost", 80,
+ &log));
// At this state the TCP connection is completed but not the SOCKS handshake.
EXPECT_TRUE(tcp_sock_->IsConnected());
@@ -219,11 +210,11 @@ TEST_F(SOCKSClientSocketTest, HandshakeFailures) {
arraysize(tests[i].fail_reply)) };
CapturingNetLog log;
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- host_resolver_.get(),
- "localhost", 80,
- &log);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ host_resolver_.get(),
+ "localhost", 80,
+ &log));
int rv = user_sock_->Connect(callback_.callback());
EXPECT_EQ(ERR_IO_PENDING, rv);
@@ -256,11 +247,11 @@ TEST_F(SOCKSClientSocketTest, PartialServerReads) {
MockRead(ASYNC, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) };
CapturingNetLog log;
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- host_resolver_.get(),
- "localhost", 80,
- &log);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ host_resolver_.get(),
+ "localhost", 80,
+ &log));
int rv = user_sock_->Connect(callback_.callback());
EXPECT_EQ(ERR_IO_PENDING, rv);
@@ -294,11 +285,11 @@ TEST_F(SOCKSClientSocketTest, PartialClientWrites) {
MockRead(ASYNC, kSOCKSOkReply, arraysize(kSOCKSOkReply)) };
CapturingNetLog log;
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- host_resolver_.get(),
- "localhost", 80,
- &log);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ host_resolver_.get(),
+ "localhost", 80,
+ &log));
int rv = user_sock_->Connect(callback_.callback());
EXPECT_EQ(ERR_IO_PENDING, rv);
@@ -326,11 +317,11 @@ TEST_F(SOCKSClientSocketTest, FailedSocketRead) {
MockRead(SYNCHRONOUS, 0) };
CapturingNetLog log;
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- host_resolver_.get(),
- "localhost", 80,
- &log);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ host_resolver_.get(),
+ "localhost", 80,
+ &log));
int rv = user_sock_->Connect(callback_.callback());
EXPECT_EQ(ERR_IO_PENDING, rv);
@@ -356,11 +347,11 @@ TEST_F(SOCKSClientSocketTest, FailedDNS) {
CapturingNetLog log;
- user_sock_ = BuildMockSocket(NULL, 0,
- NULL, 0,
- host_resolver_.get(),
- hostname, 80,
- &log);
+ user_sock_.reset(BuildMockSocket(NULL, 0,
+ NULL, 0,
+ host_resolver_.get(),
+ hostname, 80,
+ &log));
int rv = user_sock_->Connect(callback_.callback());
EXPECT_EQ(ERR_IO_PENDING, rv);
@@ -387,11 +378,11 @@ TEST_F(SOCKSClientSocketTest, DisconnectWhileHostResolveInProgress) {
MockWrite data_writes[] = { MockWrite(SYNCHRONOUS, "", 0) };
MockRead data_reads[] = { MockRead(SYNCHRONOUS, "", 0) };
- user_sock_ = BuildMockSocket(data_reads, arraysize(data_reads),
- data_writes, arraysize(data_writes),
- hanging_resolver.get(),
- "foo", 80,
- NULL);
+ user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes),
+ hanging_resolver.get(),
+ "foo", 80,
+ NULL));
// Start connecting (will get stuck waiting for the host to resolve).
int rv = user_sock_->Connect(callback_.callback());
diff --git a/chromium/net/socket/ssl_client_socket_nss.cc b/chromium/net/socket/ssl_client_socket_nss.cc
index acc1b0dee2e..f374dedcf80 100644
--- a/chromium/net/socket/ssl_client_socket_nss.cc
+++ b/chromium/net/socket/ssl_client_socket_nss.cc
@@ -2598,7 +2598,7 @@ int SSLClientSocketNSS::Core::DoGetDomainBoundCert(const std::string& host) {
weak_net_log_->BeginEvent(NetLog::TYPE_SSL_GET_DOMAIN_BOUND_CERT);
- int rv = server_bound_cert_service_->GetOrCreateDomainBoundCert(
+ int rv = server_bound_cert_service_->GetDomainBoundCert(
host,
&domain_bound_private_key_,
&domain_bound_cert_,
@@ -2751,12 +2751,12 @@ void SSLClientSocketNSS::Core::SetChannelIDProvided() {
SSLClientSocketNSS::SSLClientSocketNSS(
base::SequencedTaskRunner* nss_task_runner,
- scoped_ptr<ClientSocketHandle> transport_socket,
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context)
: nss_task_runner_(nss_task_runner),
- transport_(transport_socket.Pass()),
+ transport_(transport_socket),
host_and_port_(host_and_port),
ssl_config_(ssl_config),
cert_verifier_(context.cert_verifier),
@@ -2765,7 +2765,7 @@ SSLClientSocketNSS::SSLClientSocketNSS(
completed_handshake_(false),
next_handshake_state_(STATE_NONE),
nss_fd_(NULL),
- net_log_(transport_->socket()->NetLog()),
+ net_log_(transport_socket->socket()->NetLog()),
transport_security_state_(context.transport_security_state),
valid_thread_id_(base::kInvalidThreadId) {
EnterFunction("");
@@ -3141,8 +3141,7 @@ int SSLClientSocketNSS::InitializeSSLOptions() {
net_log_, "SSL_OptionSet", "SSL_ENABLE_SESSION_TICKETS");
}
- rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_FALSE_START,
- ssl_config_.false_start_enabled);
+ rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_FALSE_START, PR_FALSE);
if (rv != SECSuccess)
LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_ENABLE_FALSE_START");
diff --git a/chromium/net/socket/ssl_client_socket_nss.h b/chromium/net/socket/ssl_client_socket_nss.h
index b41d28d74a8..fed8ef706b5 100644
--- a/chromium/net/socket/ssl_client_socket_nss.h
+++ b/chromium/net/socket/ssl_client_socket_nss.h
@@ -59,7 +59,7 @@ class SSLClientSocketNSS : public SSLClientSocket {
// behaviour is desired, for performance or compatibility, the current task
// runner should be supplied instead.
SSLClientSocketNSS(base::SequencedTaskRunner* nss_task_runner,
- scoped_ptr<ClientSocketHandle> transport_socket,
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context);
diff --git a/chromium/net/socket/ssl_client_socket_openssl.cc b/chromium/net/socket/ssl_client_socket_openssl.cc
index 4591cec5b9d..1431bc61486 100644
--- a/chromium/net/socket/ssl_client_socket_openssl.cc
+++ b/chromium/net/socket/ssl_client_socket_openssl.cc
@@ -425,7 +425,7 @@ void SSLClientSocket::ClearSessionCache() {
}
SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
- scoped_ptr<ClientSocketHandle> transport_socket,
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context)
@@ -439,14 +439,14 @@ SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
cert_verifier_(context.cert_verifier),
ssl_(NULL),
transport_bio_(NULL),
- transport_(transport_socket.Pass()),
+ transport_(transport_socket),
host_and_port_(host_and_port),
ssl_config_(ssl_config),
ssl_session_cache_shard_(context.ssl_session_cache_shard),
trying_cached_session_(false),
next_handshake_state_(STATE_NONE),
npn_status_(kNextProtoUnsupported),
- net_log_(transport_->socket()->NetLog()) {
+ net_log_(transport_socket->socket()->NetLog()) {
}
SSLClientSocketOpenSSL::~SSLClientSocketOpenSSL() {
diff --git a/chromium/net/socket/ssl_client_socket_openssl.h b/chromium/net/socket/ssl_client_socket_openssl.h
index f66d95cc69d..520f432b8bc 100644
--- a/chromium/net/socket/ssl_client_socket_openssl.h
+++ b/chromium/net/socket/ssl_client_socket_openssl.h
@@ -41,7 +41,7 @@ class SSLClientSocketOpenSSL : public SSLClientSocket {
// The given hostname will be compared with the name(s) in the server's
// certificate during the SSL handshake. ssl_config specifies the SSL
// settings.
- SSLClientSocketOpenSSL(scoped_ptr<ClientSocketHandle> transport_socket,
+ SSLClientSocketOpenSSL(ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context);
diff --git a/chromium/net/socket/ssl_client_socket_openssl_unittest.cc b/chromium/net/socket/ssl_client_socket_openssl_unittest.cc
index 04f899903ac..7a37cdc1187 100644
--- a/chromium/net/socket/ssl_client_socket_openssl_unittest.cc
+++ b/chromium/net/socket/ssl_client_socket_openssl_unittest.cc
@@ -107,13 +107,11 @@ class SSLClientSocketOpenSSLClientAuthTest : public PlatformTest {
}
protected:
- scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<StreamSocket> transport_socket,
+ SSLClientSocket* CreateSSLClientSocket(
+ StreamSocket* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config) {
- scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle);
- connection->SetSocket(transport_socket.Pass());
- return socket_factory_->CreateSSLClientSocket(connection.Pass(),
+ return socket_factory_->CreateSSLClientSocket(transport_socket,
host_and_port,
ssl_config,
context_);
@@ -166,9 +164,9 @@ class SSLClientSocketOpenSSLClientAuthTest : public PlatformTest {
// itself was a success.
bool CreateAndConnectSSLClientSocket(SSLConfig& ssl_config,
int* result) {
- sock_ = CreateSSLClientSocket(transport_.Pass(),
- test_server_->host_port_pair(),
- ssl_config);
+ sock_.reset(CreateSSLClientSocket(transport_.release(),
+ test_server_->host_port_pair(),
+ ssl_config));
if (sock_->IsConnected()) {
LOG(ERROR) << "SSL Socket prematurely connected";
diff --git a/chromium/net/socket/ssl_client_socket_pool.cc b/chromium/net/socket/ssl_client_socket_pool.cc
index d07c76ffb49..fed268d4ee4 100644
--- a/chromium/net/socket/ssl_client_socket_pool.cc
+++ b/chromium/net/socket/ssl_client_socket_pool.cc
@@ -287,11 +287,11 @@ int SSLConnectJob::DoSSLConnect() {
connect_timing_.ssl_start = base::TimeTicks::Now();
- ssl_socket_ = client_socket_factory_->CreateSSLClientSocket(
- transport_socket_handle_.Pass(),
+ ssl_socket_.reset(client_socket_factory_->CreateSSLClientSocket(
+ transport_socket_handle_.release(),
params_->host_and_port(),
params_->ssl_config(),
- context_);
+ context_));
return ssl_socket_->Connect(callback_);
}
@@ -410,7 +410,7 @@ int SSLConnectJob::DoSSLConnectComplete(int result) {
}
if (result == OK || IsCertificateError(result)) {
- SetSocket(ssl_socket_.PassAs<StreamSocket>());
+ set_socket(ssl_socket_.release());
} else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) {
error_response_info_.cert_request_info = new SSLCertRequestInfo;
ssl_socket_->GetSSLCertRequestInfo(
@@ -527,16 +527,14 @@ SSLClientSocketPool::~SSLClientSocketPool() {
ssl_config_service_->RemoveObserver(this);
}
-scoped_ptr<ConnectJob>
-SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob(
+ConnectJob* SSLClientSocketPool::SSLConnectJobFactory::NewConnectJob(
const std::string& group_name,
const PoolBase::Request& request,
ConnectJob::Delegate* delegate) const {
- return scoped_ptr<ConnectJob>(
- new SSLConnectJob(group_name, request.params(), ConnectionTimeout(),
- transport_pool_, socks_pool_, http_proxy_pool_,
- client_socket_factory_, host_resolver_,
- context_, delegate, net_log_));
+ return new SSLConnectJob(group_name, request.params(), ConnectionTimeout(),
+ transport_pool_, socks_pool_, http_proxy_pool_,
+ client_socket_factory_, host_resolver_,
+ context_, delegate, net_log_);
}
base::TimeDelta
@@ -574,9 +572,8 @@ void SSLClientSocketPool::CancelRequest(const std::string& group_name,
}
void SSLClientSocketPool::ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
- int id) {
- base_.ReleaseSocket(group_name, socket.Pass(), id);
+ StreamSocket* socket, int id) {
+ base_.ReleaseSocket(group_name, socket, id);
}
void SSLClientSocketPool::FlushWithError(int error) {
diff --git a/chromium/net/socket/ssl_client_socket_pool.h b/chromium/net/socket/ssl_client_socket_pool.h
index 431a1b7ceea..bc54bc92f9a 100644
--- a/chromium/net/socket/ssl_client_socket_pool.h
+++ b/chromium/net/socket/ssl_client_socket_pool.h
@@ -204,7 +204,7 @@ class NET_EXPORT_PRIVATE SSLClientSocketPool
ClientSocketHandle* handle) OVERRIDE;
virtual void ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
int id) OVERRIDE;
virtual void FlushWithError(int error) OVERRIDE;
@@ -261,7 +261,7 @@ class NET_EXPORT_PRIVATE SSLClientSocketPool
virtual ~SSLConnectJobFactory() {}
// ClientSocketPoolBase::ConnectJobFactory methods.
- virtual scoped_ptr<ConnectJob> NewConnectJob(
+ virtual ConnectJob* NewConnectJob(
const std::string& group_name,
const PoolBase::Request& request,
ConnectJob::Delegate* delegate) const OVERRIDE;
diff --git a/chromium/net/socket/ssl_client_socket_unittest.cc b/chromium/net/socket/ssl_client_socket_unittest.cc
index f791928580f..f0e7120a135 100644
--- a/chromium/net/socket/ssl_client_socket_unittest.cc
+++ b/chromium/net/socket/ssl_client_socket_unittest.cc
@@ -30,11 +30,9 @@
//-----------------------------------------------------------------------------
-namespace net {
-
namespace {
-const SSLConfig kDefaultSSLConfig;
+const net::SSLConfig kDefaultSSLConfig;
// WrappedStreamSocket is a base class that wraps an existing StreamSocket,
// forwarding the Socket and StreamSocket interfaces to the underlying
@@ -42,30 +40,33 @@ const SSLConfig kDefaultSSLConfig;
// This is to provide a common base class for subclasses to override specific
// StreamSocket methods for testing, while still communicating with a 'real'
// StreamSocket.
-class WrappedStreamSocket : public StreamSocket {
+class WrappedStreamSocket : public net::StreamSocket {
public:
- explicit WrappedStreamSocket(scoped_ptr<StreamSocket> transport)
- : transport_(transport.Pass()) {}
+ explicit WrappedStreamSocket(scoped_ptr<net::StreamSocket> transport)
+ : transport_(transport.Pass()) {
+ }
virtual ~WrappedStreamSocket() {}
// StreamSocket implementation:
- virtual int Connect(const CompletionCallback& callback) OVERRIDE {
+ virtual int Connect(const net::CompletionCallback& callback) OVERRIDE {
return transport_->Connect(callback);
}
- virtual void Disconnect() OVERRIDE { transport_->Disconnect(); }
+ virtual void Disconnect() OVERRIDE {
+ transport_->Disconnect();
+ }
virtual bool IsConnected() const OVERRIDE {
return transport_->IsConnected();
}
virtual bool IsConnectedAndIdle() const OVERRIDE {
return transport_->IsConnectedAndIdle();
}
- virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE {
+ virtual int GetPeerAddress(net::IPEndPoint* address) const OVERRIDE {
return transport_->GetPeerAddress(address);
}
- virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE {
+ virtual int GetLocalAddress(net::IPEndPoint* address) const OVERRIDE {
return transport_->GetLocalAddress(address);
}
- virtual const BoundNetLog& NetLog() const OVERRIDE {
+ virtual const net::BoundNetLog& NetLog() const OVERRIDE {
return transport_->NetLog();
}
virtual void SetSubresourceSpeculation() OVERRIDE {
@@ -83,22 +84,20 @@ class WrappedStreamSocket : public StreamSocket {
virtual bool WasNpnNegotiated() const OVERRIDE {
return transport_->WasNpnNegotiated();
}
- virtual NextProto GetNegotiatedProtocol() const OVERRIDE {
+ virtual net::NextProto GetNegotiatedProtocol() const OVERRIDE {
return transport_->GetNegotiatedProtocol();
}
- virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE {
+ virtual bool GetSSLInfo(net::SSLInfo* ssl_info) OVERRIDE {
return transport_->GetSSLInfo(ssl_info);
}
// Socket implementation:
- virtual int Read(IOBuffer* buf,
- int buf_len,
- const CompletionCallback& callback) OVERRIDE {
+ virtual int Read(net::IOBuffer* buf, int buf_len,
+ const net::CompletionCallback& callback) OVERRIDE {
return transport_->Read(buf, buf_len, callback);
}
- virtual int Write(IOBuffer* buf,
- int buf_len,
- const CompletionCallback& callback) OVERRIDE {
+ virtual int Write(net::IOBuffer* buf, int buf_len,
+ const net::CompletionCallback& callback) OVERRIDE {
return transport_->Write(buf, buf_len, callback);
}
virtual bool SetReceiveBufferSize(int32 size) OVERRIDE {
@@ -109,7 +108,7 @@ class WrappedStreamSocket : public StreamSocket {
}
protected:
- scoped_ptr<StreamSocket> transport_;
+ scoped_ptr<net::StreamSocket> transport_;
};
// ReadBufferingStreamSocket is a wrapper for an existing StreamSocket that
@@ -120,13 +119,12 @@ class WrappedStreamSocket : public StreamSocket {
// them from the TestServer.
class ReadBufferingStreamSocket : public WrappedStreamSocket {
public:
- explicit ReadBufferingStreamSocket(scoped_ptr<StreamSocket> transport);
+ explicit ReadBufferingStreamSocket(scoped_ptr<net::StreamSocket> transport);
virtual ~ReadBufferingStreamSocket() {}
// Socket implementation:
- virtual int Read(IOBuffer* buf,
- int buf_len,
- const CompletionCallback& callback) OVERRIDE;
+ virtual int Read(net::IOBuffer* buf, int buf_len,
+ const net::CompletionCallback& callback) OVERRIDE;
// Sets the internal buffer to |size|. This must not be greater than
// the largest value supplied to Read() - that is, it does not handle
@@ -150,18 +148,19 @@ class ReadBufferingStreamSocket : public WrappedStreamSocket {
void OnReadCompleted(int result);
State state_;
- scoped_refptr<GrowableIOBuffer> read_buffer_;
+ scoped_refptr<net::GrowableIOBuffer> read_buffer_;
int buffer_size_;
- scoped_refptr<IOBuffer> user_read_buf_;
- CompletionCallback user_read_callback_;
+ scoped_refptr<net::IOBuffer> user_read_buf_;
+ net::CompletionCallback user_read_callback_;
};
ReadBufferingStreamSocket::ReadBufferingStreamSocket(
- scoped_ptr<StreamSocket> transport)
+ scoped_ptr<net::StreamSocket> transport)
: WrappedStreamSocket(transport.Pass()),
- read_buffer_(new GrowableIOBuffer()),
- buffer_size_(0) {}
+ read_buffer_(new net::GrowableIOBuffer()),
+ buffer_size_(0) {
+}
void ReadBufferingStreamSocket::SetBufferSize(int size) {
DCHECK(!user_read_buf_.get());
@@ -169,19 +168,19 @@ void ReadBufferingStreamSocket::SetBufferSize(int size) {
read_buffer_->SetCapacity(size);
}
-int ReadBufferingStreamSocket::Read(IOBuffer* buf,
+int ReadBufferingStreamSocket::Read(net::IOBuffer* buf,
int buf_len,
- const CompletionCallback& callback) {
+ const net::CompletionCallback& callback) {
if (buffer_size_ == 0)
return transport_->Read(buf, buf_len, callback);
if (buf_len < buffer_size_)
- return ERR_UNEXPECTED;
+ return net::ERR_UNEXPECTED;
state_ = STATE_READ;
user_read_buf_ = buf;
- int result = DoLoop(OK);
- if (result == ERR_IO_PENDING)
+ int result = DoLoop(net::OK);
+ if (result == net::ERR_IO_PENDING)
user_read_callback_ = callback;
else
user_read_buf_ = NULL;
@@ -203,10 +202,10 @@ int ReadBufferingStreamSocket::DoLoop(int result) {
case STATE_NONE:
default:
NOTREACHED() << "Unexpected state: " << current_state;
- rv = ERR_UNEXPECTED;
+ rv = net::ERR_UNEXPECTED;
break;
}
- } while (rv != ERR_IO_PENDING && state_ != STATE_NONE);
+ } while (rv != net::ERR_IO_PENDING && state_ != STATE_NONE);
return rv;
}
@@ -228,11 +227,10 @@ int ReadBufferingStreamSocket::DoReadComplete(int result) {
read_buffer_->set_offset(read_buffer_->offset() + result);
if (read_buffer_->RemainingCapacity() > 0) {
state_ = STATE_READ;
- return OK;
+ return net::OK;
}
- memcpy(user_read_buf_->data(),
- read_buffer_->StartOfBuffer(),
+ memcpy(user_read_buf_->data(), read_buffer_->StartOfBuffer(),
read_buffer_->capacity());
read_buffer_->set_offset(0);
return read_buffer_->capacity();
@@ -240,7 +238,7 @@ int ReadBufferingStreamSocket::DoReadComplete(int result) {
void ReadBufferingStreamSocket::OnReadCompleted(int result) {
result = DoLoop(result);
- if (result == ERR_IO_PENDING)
+ if (result == net::ERR_IO_PENDING)
return;
user_read_buf_ = NULL;
@@ -254,18 +252,16 @@ class SynchronousErrorStreamSocket : public WrappedStreamSocket {
virtual ~SynchronousErrorStreamSocket() {}
// Socket implementation:
- virtual int Read(IOBuffer* buf,
- int buf_len,
- const CompletionCallback& callback) OVERRIDE;
- virtual int Write(IOBuffer* buf,
- int buf_len,
- const CompletionCallback& callback) OVERRIDE;
+ virtual int Read(net::IOBuffer* buf, int buf_len,
+ const net::CompletionCallback& callback) OVERRIDE;
+ virtual int Write(net::IOBuffer* buf, int buf_len,
+ const net::CompletionCallback& callback) OVERRIDE;
// Sets the next Read() call and all future calls to return |error|.
// If there is already a pending asynchronous read, the configured error
// will not be returned until that asynchronous read has completed and Read()
// is called again.
- void SetNextReadError(Error error) {
+ void SetNextReadError(net::Error error) {
DCHECK_GE(0, error);
have_read_error_ = true;
pending_read_error_ = error;
@@ -275,7 +271,7 @@ class SynchronousErrorStreamSocket : public WrappedStreamSocket {
// If there is already a pending asynchronous write, the configured error
// will not be returned until that asynchronous write has completed and
// Write() is called again.
- void SetNextWriteError(Error error) {
+ void SetNextWriteError(net::Error error) {
DCHECK_GE(0, error);
have_write_error_ = true;
pending_write_error_ = error;
@@ -295,21 +291,24 @@ SynchronousErrorStreamSocket::SynchronousErrorStreamSocket(
scoped_ptr<StreamSocket> transport)
: WrappedStreamSocket(transport.Pass()),
have_read_error_(false),
- pending_read_error_(OK),
+ pending_read_error_(net::OK),
have_write_error_(false),
- pending_write_error_(OK) {}
+ pending_write_error_(net::OK) {
+}
-int SynchronousErrorStreamSocket::Read(IOBuffer* buf,
- int buf_len,
- const CompletionCallback& callback) {
+int SynchronousErrorStreamSocket::Read(
+ net::IOBuffer* buf,
+ int buf_len,
+ const net::CompletionCallback& callback) {
if (have_read_error_)
return pending_read_error_;
return transport_->Read(buf, buf_len, callback);
}
-int SynchronousErrorStreamSocket::Write(IOBuffer* buf,
- int buf_len,
- const CompletionCallback& callback) {
+int SynchronousErrorStreamSocket::Write(
+ net::IOBuffer* buf,
+ int buf_len,
+ const net::CompletionCallback& callback) {
if (have_write_error_)
return pending_write_error_;
return transport_->Write(buf, buf_len, callback);
@@ -325,14 +324,12 @@ class FakeBlockingStreamSocket : public WrappedStreamSocket {
virtual ~FakeBlockingStreamSocket() {}
// Socket implementation:
- virtual int Read(IOBuffer* buf,
- int buf_len,
- const CompletionCallback& callback) OVERRIDE {
+ virtual int Read(net::IOBuffer* buf, int buf_len,
+ const net::CompletionCallback& callback) OVERRIDE {
return read_state_.RunWrappedFunction(buf, buf_len, callback);
}
- virtual int Write(IOBuffer* buf,
- int buf_len,
- const CompletionCallback& callback) OVERRIDE {
+ virtual int Write(net::IOBuffer* buf, int buf_len,
+ const net::CompletionCallback& callback) OVERRIDE {
return write_state_.RunWrappedFunction(buf, buf_len, callback);
}
@@ -353,8 +350,9 @@ class FakeBlockingStreamSocket : public WrappedStreamSocket {
class BlockingState {
public:
// Wrapper for the underlying Socket function to call (ie: Read/Write).
- typedef base::Callback<int(IOBuffer*, int, const CompletionCallback&)>
- WrappedSocketFunction;
+ typedef base::Callback<
+ int(net::IOBuffer*, int,
+ const net::CompletionCallback&)> WrappedSocketFunction;
explicit BlockingState(const WrappedSocketFunction& function);
~BlockingState() {}
@@ -373,9 +371,8 @@ class FakeBlockingStreamSocket : public WrappedStreamSocket {
// Performs the wrapped socket function on the underlying transport. If
// configured to block via SetShouldBlock(), then |user_callback| will not
// be invoked until Unblock() has been called.
- int RunWrappedFunction(IOBuffer* buf,
- int len,
- const CompletionCallback& user_callback);
+ int RunWrappedFunction(net::IOBuffer* buf, int len,
+ const net::CompletionCallback& user_callback);
private:
// Handles completion from the underlying wrapped socket function.
@@ -385,7 +382,7 @@ class FakeBlockingStreamSocket : public WrappedStreamSocket {
bool should_block_;
bool have_result_;
int pending_result_;
- CompletionCallback user_callback_;
+ net::CompletionCallback user_callback_;
};
BlockingState read_state_;
@@ -400,14 +397,16 @@ FakeBlockingStreamSocket::FakeBlockingStreamSocket(
read_state_(base::Bind(&Socket::Read,
base::Unretained(transport_.get()))),
write_state_(base::Bind(&Socket::Write,
- base::Unretained(transport_.get()))) {}
+ base::Unretained(transport_.get()))) {
+}
FakeBlockingStreamSocket::BlockingState::BlockingState(
const WrappedSocketFunction& function)
: wrapped_function_(function),
should_block_(false),
have_result_(false),
- pending_result_(OK) {}
+ pending_result_(net::OK) {
+}
void FakeBlockingStreamSocket::BlockingState::SetShouldBlock() {
DCHECK(!should_block_);
@@ -430,24 +429,24 @@ void FakeBlockingStreamSocket::BlockingState::Unblock() {
}
int FakeBlockingStreamSocket::BlockingState::RunWrappedFunction(
- IOBuffer* buf,
+ net::IOBuffer* buf,
int len,
- const CompletionCallback& callback) {
+ const net::CompletionCallback& callback) {
// The callback to be called by the underlying transport. Either forward
// directly to the user's callback if not set to block, or intercept it with
// OnCompleted so that the user's callback is not invoked until Unblock() is
// called.
- CompletionCallback transport_callback =
+ net::CompletionCallback transport_callback =
!should_block_ ? callback : base::Bind(&BlockingState::OnCompleted,
base::Unretained(this));
int rv = wrapped_function_.Run(buf, len, transport_callback);
if (should_block_) {
user_callback_ = callback;
// May have completed synchronously.
- have_result_ = (rv != ERR_IO_PENDING);
+ have_result_ = (rv != net::ERR_IO_PENDING);
pending_result_ = rv;
- return ERR_IO_PENDING;
+ return net::ERR_IO_PENDING;
}
return rv;
@@ -467,61 +466,64 @@ void FakeBlockingStreamSocket::BlockingState::OnCompleted(int result) {
base::ResetAndReturn(&user_callback_).Run(result);
}
-// CompletionCallback that will delete the associated StreamSocket when
+// CompletionCallback that will delete the associated net::StreamSocket when
// the callback is invoked.
-class DeleteSocketCallback : public TestCompletionCallbackBase {
+class DeleteSocketCallback : public net::TestCompletionCallbackBase {
public:
- explicit DeleteSocketCallback(StreamSocket* socket)
+ explicit DeleteSocketCallback(net::StreamSocket* socket)
: socket_(socket),
callback_(base::Bind(&DeleteSocketCallback::OnComplete,
- base::Unretained(this))) {}
+ base::Unretained(this))) {
+ }
virtual ~DeleteSocketCallback() {}
- const CompletionCallback& callback() const { return callback_; }
+ const net::CompletionCallback& callback() const { return callback_; }
private:
void OnComplete(int result) {
- if (socket_) {
- delete socket_;
- socket_ = NULL;
- } else {
- ADD_FAILURE() << "Deleting socket twice";
- }
- SetResult(result);
+ if (socket_) {
+ delete socket_;
+ socket_ = NULL;
+ } else {
+ ADD_FAILURE() << "Deleting socket twice";
+ }
+ SetResult(result);
}
- StreamSocket* socket_;
- CompletionCallback callback_;
+ net::StreamSocket* socket_;
+ net::CompletionCallback callback_;
DISALLOW_COPY_AND_ASSIGN(DeleteSocketCallback);
};
+} // namespace
+
class SSLClientSocketTest : public PlatformTest {
public:
SSLClientSocketTest()
- : socket_factory_(ClientSocketFactory::GetDefaultFactory()),
- cert_verifier_(new MockCertVerifier),
- transport_security_state_(new TransportSecurityState) {
- cert_verifier_->set_default_result(OK);
+ : socket_factory_(net::ClientSocketFactory::GetDefaultFactory()),
+ cert_verifier_(new net::MockCertVerifier),
+ transport_security_state_(new net::TransportSecurityState) {
+ cert_verifier_->set_default_result(net::OK);
context_.cert_verifier = cert_verifier_.get();
context_.transport_security_state = transport_security_state_.get();
}
protected:
- scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<StreamSocket> transport_socket,
- const HostPortPair& host_and_port,
- const SSLConfig& ssl_config) {
- scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle);
- connection->SetSocket(transport_socket.Pass());
- return socket_factory_->CreateSSLClientSocket(
- connection.Pass(), host_and_port, ssl_config, context_);
+ net::SSLClientSocket* CreateSSLClientSocket(
+ net::StreamSocket* transport_socket,
+ const net::HostPortPair& host_and_port,
+ const net::SSLConfig& ssl_config) {
+ return socket_factory_->CreateSSLClientSocket(transport_socket,
+ host_and_port,
+ ssl_config,
+ context_);
}
- ClientSocketFactory* socket_factory_;
- scoped_ptr<MockCertVerifier> cert_verifier_;
- scoped_ptr<TransportSecurityState> transport_security_state_;
- SSLClientSocketContext context_;
+ net::ClientSocketFactory* socket_factory_;
+ scoped_ptr<net::MockCertVerifier> cert_verifier_;
+ scoped_ptr<net::TransportSecurityState> transport_security_state_;
+ net::SSLClientSocketContext context_;
};
//-----------------------------------------------------------------------------
@@ -534,45 +536,45 @@ class SSLClientSocketTest : public PlatformTest {
// timeout. This means that an SSL connect end event may appear as a socket
// write.
static bool LogContainsSSLConnectEndEvent(
- const CapturingNetLog::CapturedEntryList& log,
- int i) {
- return LogContainsEndEvent(log, i, NetLog::TYPE_SSL_CONNECT) ||
- LogContainsEvent(
- log, i, NetLog::TYPE_SOCKET_BYTES_SENT, NetLog::PHASE_NONE);
-}
-;
+ const net::CapturingNetLog::CapturedEntryList& log, int i) {
+ return net::LogContainsEndEvent(log, i, net::NetLog::TYPE_SSL_CONNECT) ||
+ net::LogContainsEvent(log, i, net::NetLog::TYPE_SOCKET_BYTES_SENT,
+ net::NetLog::PHASE_NONE);
+};
TEST_F(SSLClientSocketTest, Connect) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- CapturingNetLog log;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, &log, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::CapturingNetLog log;
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, &log, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
EXPECT_FALSE(sock->IsConnected());
rv = sock->Connect(callback.callback());
- CapturingNetLog::CapturedEntryList entries;
+ net::CapturingNetLog::CapturedEntryList entries;
log.GetEntries(&entries);
- EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT));
- if (rv == ERR_IO_PENDING)
+ EXPECT_TRUE(net::LogContainsBeginEvent(
+ entries, 5, net::NetLog::TYPE_SSL_CONNECT));
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(sock->IsConnected());
log.GetEntries(&entries);
EXPECT_TRUE(LogContainsSSLConnectEndEvent(entries, -1));
@@ -582,40 +584,43 @@ TEST_F(SSLClientSocketTest, Connect) {
}
TEST_F(SSLClientSocketTest, ConnectExpired) {
- SpawnedTestServer::SSLOptions ssl_options(
- SpawnedTestServer::SSLOptions::CERT_EXPIRED);
- SpawnedTestServer test_server(
- SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath());
+ net::SpawnedTestServer::SSLOptions ssl_options(
+ net::SpawnedTestServer::SSLOptions::CERT_EXPIRED);
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ ssl_options,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- cert_verifier_->set_default_result(ERR_CERT_DATE_INVALID);
+ cert_verifier_->set_default_result(net::ERR_CERT_DATE_INVALID);
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- CapturingNetLog log;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, &log, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::CapturingNetLog log;
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, &log, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
EXPECT_FALSE(sock->IsConnected());
rv = sock->Connect(callback.callback());
- CapturingNetLog::CapturedEntryList entries;
+ net::CapturingNetLog::CapturedEntryList entries;
log.GetEntries(&entries);
- EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT));
- if (rv == ERR_IO_PENDING)
+ EXPECT_TRUE(net::LogContainsBeginEvent(
+ entries, 5, net::NetLog::TYPE_SSL_CONNECT));
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(ERR_CERT_DATE_INVALID, rv);
+ EXPECT_EQ(net::ERR_CERT_DATE_INVALID, rv);
// Rather than testing whether or not the underlying socket is connected,
// test that the handshake has finished. This is because it may be
@@ -626,40 +631,43 @@ TEST_F(SSLClientSocketTest, ConnectExpired) {
}
TEST_F(SSLClientSocketTest, ConnectMismatched) {
- SpawnedTestServer::SSLOptions ssl_options(
- SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME);
- SpawnedTestServer test_server(
- SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath());
+ net::SpawnedTestServer::SSLOptions ssl_options(
+ net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME);
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ ssl_options,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- cert_verifier_->set_default_result(ERR_CERT_COMMON_NAME_INVALID);
+ cert_verifier_->set_default_result(net::ERR_CERT_COMMON_NAME_INVALID);
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- CapturingNetLog log;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, &log, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::CapturingNetLog log;
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, &log, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
EXPECT_FALSE(sock->IsConnected());
rv = sock->Connect(callback.callback());
- CapturingNetLog::CapturedEntryList entries;
+ net::CapturingNetLog::CapturedEntryList entries;
log.GetEntries(&entries);
- EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT));
- if (rv == ERR_IO_PENDING)
+ EXPECT_TRUE(net::LogContainsBeginEvent(
+ entries, 5, net::NetLog::TYPE_SSL_CONNECT));
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, rv);
+ EXPECT_EQ(net::ERR_CERT_COMMON_NAME_INVALID, rv);
// Rather than testing whether or not the underlying socket is connected,
// test that the handshake has finished. This is because it may be
@@ -672,35 +680,38 @@ TEST_F(SSLClientSocketTest, ConnectMismatched) {
// Attempt to connect to a page which requests a client certificate. It should
// return an error code on connect.
TEST_F(SSLClientSocketTest, ConnectClientAuthCertRequested) {
- SpawnedTestServer::SSLOptions ssl_options;
+ net::SpawnedTestServer::SSLOptions ssl_options;
ssl_options.request_client_certificate = true;
- SpawnedTestServer test_server(
- SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ ssl_options,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- CapturingNetLog log;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, &log, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::CapturingNetLog log;
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, &log, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
EXPECT_FALSE(sock->IsConnected());
rv = sock->Connect(callback.callback());
- CapturingNetLog::CapturedEntryList entries;
+ net::CapturingNetLog::CapturedEntryList entries;
log.GetEntries(&entries);
- EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT));
- if (rv == ERR_IO_PENDING)
+ EXPECT_TRUE(net::LogContainsBeginEvent(
+ entries, 5, net::NetLog::TYPE_SSL_CONNECT));
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
log.GetEntries(&entries);
@@ -720,9 +731,9 @@ TEST_F(SSLClientSocketTest, ConnectClientAuthCertRequested) {
// certificate. This test may still be useful as we'll want to close
// the socket on a timeout if the user takes a long time to pick a
// cert. Related bug: https://bugzilla.mozilla.org/show_bug.cgi?id=542832
- ExpectLogContainsSomewhere(
- entries, 0, NetLog::TYPE_SSL_CONNECT, NetLog::PHASE_END);
- EXPECT_EQ(ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv);
+ net::ExpectLogContainsSomewhere(
+ entries, 0, net::NetLog::TYPE_SSL_CONNECT, net::NetLog::PHASE_END);
+ EXPECT_EQ(net::ERR_SSL_CLIENT_AUTH_CERT_NEEDED, rv);
EXPECT_FALSE(sock->IsConnected());
}
@@ -731,30 +742,32 @@ TEST_F(SSLClientSocketTest, ConnectClientAuthCertRequested) {
//
// TODO(davidben): Also test providing an actual certificate.
TEST_F(SSLClientSocketTest, ConnectClientAuthSendNullCert) {
- SpawnedTestServer::SSLOptions ssl_options;
+ net::SpawnedTestServer::SSLOptions ssl_options;
ssl_options.request_client_certificate = true;
- SpawnedTestServer test_server(
- SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ ssl_options,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- CapturingNetLog log;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, &log, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::CapturingNetLog log;
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, &log, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- SSLConfig ssl_config = kDefaultSSLConfig;
+ net::SSLConfig ssl_config = kDefaultSSLConfig;
ssl_config.send_client_cert = true;
ssl_config.client_cert = NULL;
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), ssl_config));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ ssl_config));
EXPECT_FALSE(sock->IsConnected());
@@ -762,13 +775,14 @@ TEST_F(SSLClientSocketTest, ConnectClientAuthSendNullCert) {
// TODO(davidben): Add a test which requires them and verify the error.
rv = sock->Connect(callback.callback());
- CapturingNetLog::CapturedEntryList entries;
+ net::CapturingNetLog::CapturedEntryList entries;
log.GetEntries(&entries);
- EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT));
- if (rv == ERR_IO_PENDING)
+ EXPECT_TRUE(net::LogContainsBeginEvent(
+ entries, 5, net::NetLog::TYPE_SSL_CONNECT));
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(sock->IsConnected());
log.GetEntries(&entries);
EXPECT_TRUE(LogContainsSSLConnectEndEvent(entries, -1));
@@ -776,7 +790,7 @@ TEST_F(SSLClientSocketTest, ConnectClientAuthSendNullCert) {
// We responded to the server's certificate request with a Certificate
// message with no client certificate in it. ssl_info.client_cert_sent
// should be false in this case.
- SSLInfo ssl_info;
+ net::SSLInfo ssl_info;
sock->GetSSLInfo(&ssl_info);
EXPECT_FALSE(ssl_info.client_cert_sent);
@@ -790,50 +804,51 @@ TEST_F(SSLClientSocketTest, ConnectClientAuthSendNullCert) {
// - Server sends data unexpectedly.
TEST_F(SSLClientSocketTest, Read) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, NULL, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, NULL, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
rv = sock->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(sock->IsConnected());
const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
- scoped_refptr<IOBuffer> request_buffer(
- new IOBuffer(arraysize(request_text) - 1));
+ scoped_refptr<net::IOBuffer> request_buffer(
+ new net::IOBuffer(arraysize(request_text) - 1));
memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1);
rv = sock->Write(
request_buffer.get(), arraysize(request_text) - 1, callback.callback());
- EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
+ EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv);
- scoped_refptr<IOBuffer> buf(new IOBuffer(4096));
+ scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(4096));
for (;;) {
rv = sock->Read(buf.get(), 4096, callback.callback());
- EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
+ EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
EXPECT_GE(rv, 0);
@@ -847,40 +862,39 @@ TEST_F(SSLClientSocketTest, Read) {
// the socket connection uncleanly.
// This is a regression test for http://crbug.com/238536
TEST_F(SSLClientSocketTest, Read_WithSynchronousError) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- scoped_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr, NULL, NetLog::Source()));
- scoped_ptr<SynchronousErrorStreamSocket> transport(
- new SynchronousErrorStreamSocket(real_transport.Pass()));
+ net::TestCompletionCallback callback;
+ scoped_ptr<net::StreamSocket> real_transport(new net::TCPClientSocket(
+ addr, NULL, net::NetLog::Source()));
+ SynchronousErrorStreamSocket* transport = new SynchronousErrorStreamSocket(
+ real_transport.Pass());
int rv = callback.GetResult(transport->Connect(callback.callback()));
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
// Disable TLS False Start to avoid handshake non-determinism.
- SSLConfig ssl_config;
+ net::SSLConfig ssl_config;
ssl_config.false_start_enabled = false;
- SynchronousErrorStreamSocket* raw_transport = transport.get();
- scoped_ptr<SSLClientSocket> sock(
- CreateSSLClientSocket(transport.PassAs<StreamSocket>(),
- test_server.host_port_pair(),
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
ssl_config));
rv = callback.GetResult(sock->Connect(callback.callback()));
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(sock->IsConnected());
const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
static const int kRequestTextSize =
static_cast<int>(arraysize(request_text) - 1);
- scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kRequestTextSize));
+ scoped_refptr<net::IOBuffer> request_buffer(
+ new net::IOBuffer(kRequestTextSize));
memcpy(request_buffer->data(), request_text, kRequestTextSize);
rv = callback.GetResult(
@@ -888,9 +902,9 @@ TEST_F(SSLClientSocketTest, Read_WithSynchronousError) {
EXPECT_EQ(kRequestTextSize, rv);
// Simulate an unclean/forcible shutdown.
- raw_transport->SetNextReadError(ERR_CONNECTION_RESET);
+ transport->SetNextReadError(net::ERR_CONNECTION_RESET);
- scoped_refptr<IOBuffer> buf(new IOBuffer(4096));
+ scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(4096));
// Note: This test will hang if this bug has regressed. Simply checking that
// rv != ERR_IO_PENDING is insufficient, as ERR_IO_PENDING is a legitimate
@@ -899,7 +913,7 @@ TEST_F(SSLClientSocketTest, Read_WithSynchronousError) {
#if !defined(USE_OPENSSL)
// SSLClientSocketNSS records the error exactly
- EXPECT_EQ(ERR_CONNECTION_RESET, rv);
+ EXPECT_EQ(net::ERR_CONNECTION_RESET, rv);
#else
// SSLClientSocketOpenSSL treats any errors as a simple EOF.
EXPECT_EQ(0, rv);
@@ -911,51 +925,49 @@ TEST_F(SSLClientSocketTest, Read_WithSynchronousError) {
// intermediary terminates the socket connection uncleanly.
// This is a regression test for http://crbug.com/249848
TEST_F(SSLClientSocketTest, Write_WithSynchronousError) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- scoped_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr, NULL, NetLog::Source()));
- // Note: |error_socket|'s ownership is handed to |transport|, but a pointer
+ net::TestCompletionCallback callback;
+ scoped_ptr<net::StreamSocket> real_transport(new net::TCPClientSocket(
+ addr, NULL, net::NetLog::Source()));
+ // Note: |error_socket|'s ownership is handed to |transport|, but the pointer
// is retained in order to configure additional errors.
- scoped_ptr<SynchronousErrorStreamSocket> error_socket(
- new SynchronousErrorStreamSocket(real_transport.Pass()));
- SynchronousErrorStreamSocket* raw_error_socket = error_socket.get();
- scoped_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(error_socket.PassAs<StreamSocket>()));
- FakeBlockingStreamSocket* raw_transport = transport.get();
+ SynchronousErrorStreamSocket* error_socket = new SynchronousErrorStreamSocket(
+ real_transport.Pass());
+ FakeBlockingStreamSocket* transport = new FakeBlockingStreamSocket(
+ scoped_ptr<net::StreamSocket>(error_socket));
int rv = callback.GetResult(transport->Connect(callback.callback()));
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
// Disable TLS False Start to avoid handshake non-determinism.
- SSLConfig ssl_config;
+ net::SSLConfig ssl_config;
ssl_config.false_start_enabled = false;
- scoped_ptr<SSLClientSocket> sock(
- CreateSSLClientSocket(transport.PassAs<StreamSocket>(),
- test_server.host_port_pair(),
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
ssl_config));
rv = callback.GetResult(sock->Connect(callback.callback()));
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(sock->IsConnected());
const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
static const int kRequestTextSize =
static_cast<int>(arraysize(request_text) - 1);
- scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kRequestTextSize));
+ scoped_refptr<net::IOBuffer> request_buffer(
+ new net::IOBuffer(kRequestTextSize));
memcpy(request_buffer->data(), request_text, kRequestTextSize);
// Simulate an unclean/forcible shutdown on the underlying socket.
// However, simulate this error asynchronously.
- raw_error_socket->SetNextWriteError(ERR_CONNECTION_RESET);
- raw_transport->SetNextWriteShouldBlock();
+ error_socket->SetNextWriteError(net::ERR_CONNECTION_RESET);
+ transport->SetNextWriteShouldBlock();
// This write should complete synchronously, because the TLS ciphertext
// can be created and placed into the outgoing buffers independent of the
@@ -964,14 +976,14 @@ TEST_F(SSLClientSocketTest, Write_WithSynchronousError) {
sock->Write(request_buffer.get(), kRequestTextSize, callback.callback()));
EXPECT_EQ(kRequestTextSize, rv);
- scoped_refptr<IOBuffer> buf(new IOBuffer(4096));
+ scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(4096));
rv = sock->Read(buf.get(), 4096, callback.callback());
- EXPECT_EQ(ERR_IO_PENDING, rv);
+ EXPECT_EQ(net::ERR_IO_PENDING, rv);
// Now unblock the outgoing request, having it fail with the connection
// being reset.
- raw_transport->UnblockWrite();
+ transport->UnblockWrite();
// Note: This will cause an inifite loop if this bug has regressed. Simply
// checking that rv != ERR_IO_PENDING is insufficient, as ERR_IO_PENDING
@@ -980,7 +992,7 @@ TEST_F(SSLClientSocketTest, Write_WithSynchronousError) {
#if !defined(USE_OPENSSL)
// SSLClientSocketNSS records the error exactly
- EXPECT_EQ(ERR_CONNECTION_RESET, rv);
+ EXPECT_EQ(net::ERR_CONNECTION_RESET, rv);
#else
// SSLClientSocketOpenSSL treats any errors as a simple EOF.
EXPECT_EQ(0, rv);
@@ -990,37 +1002,38 @@ TEST_F(SSLClientSocketTest, Write_WithSynchronousError) {
// Test the full duplex mode, with Read and Write pending at the same time.
// This test also serves as a regression test for http://crbug.com/29815.
TEST_F(SSLClientSocketTest, Read_FullDuplex) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback; // Used for everything except Write.
+ net::TestCompletionCallback callback; // Used for everything except Write.
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, NULL, NetLog::Source()));
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, NULL, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
rv = sock->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(sock->IsConnected());
// Issue a "hanging" Read first.
- scoped_refptr<IOBuffer> buf(new IOBuffer(4096));
+ scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(4096));
rv = sock->Read(buf.get(), 4096, callback.callback());
// We haven't written the request, so there should be no response yet.
- ASSERT_EQ(ERR_IO_PENDING, rv);
+ ASSERT_EQ(net::ERR_IO_PENDING, rv);
// Write the request.
// The request is padded with a User-Agent header to a size that causes the
@@ -1030,14 +1043,15 @@ TEST_F(SSLClientSocketTest, Read_FullDuplex) {
for (int i = 0; i < 3770; ++i)
request_text.push_back('*');
request_text.append("\r\n\r\n");
- scoped_refptr<IOBuffer> request_buffer(new StringIOBuffer(request_text));
+ scoped_refptr<net::IOBuffer> request_buffer(
+ new net::StringIOBuffer(request_text));
- TestCompletionCallback callback2; // Used for Write only.
+ net::TestCompletionCallback callback2; // Used for Write only.
rv = sock->Write(
request_buffer.get(), request_text.size(), callback2.callback());
- EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
+ EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback2.WaitForResult();
EXPECT_EQ(static_cast<int>(request_text.size()), rv);
@@ -1053,65 +1067,62 @@ TEST_F(SSLClientSocketTest, Read_FullDuplex) {
// callback, the Write() callback should not be invoked.
// Regression test for http://crbug.com/232633
TEST_F(SSLClientSocketTest, Read_DeleteWhilePendingFullDuplex) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- scoped_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr, NULL, NetLog::Source()));
- // Note: |error_socket|'s ownership is handed to |transport|, but a pointer
+ net::TestCompletionCallback callback;
+ scoped_ptr<net::StreamSocket> real_transport(new net::TCPClientSocket(
+ addr, NULL, net::NetLog::Source()));
+ // Note: |error_socket|'s ownership is handed to |transport|, but the pointer
// is retained in order to configure additional errors.
- scoped_ptr<SynchronousErrorStreamSocket> error_socket(
- new SynchronousErrorStreamSocket(real_transport.Pass()));
- SynchronousErrorStreamSocket* raw_error_socket = error_socket.get();
- scoped_ptr<FakeBlockingStreamSocket> transport(
- new FakeBlockingStreamSocket(error_socket.PassAs<StreamSocket>()));
- FakeBlockingStreamSocket* raw_transport = transport.get();
+ SynchronousErrorStreamSocket* error_socket = new SynchronousErrorStreamSocket(
+ real_transport.Pass());
+ FakeBlockingStreamSocket* transport = new FakeBlockingStreamSocket(
+ scoped_ptr<net::StreamSocket>(error_socket));
int rv = callback.GetResult(transport->Connect(callback.callback()));
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
// Disable TLS False Start to avoid handshake non-determinism.
- SSLConfig ssl_config;
+ net::SSLConfig ssl_config;
ssl_config.false_start_enabled = false;
- scoped_ptr<SSLClientSocket> sock =
- CreateSSLClientSocket(transport.PassAs<StreamSocket>(),
- test_server.host_port_pair(),
- ssl_config);
+ net::SSLClientSocket* sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ ssl_config));
rv = callback.GetResult(sock->Connect(callback.callback()));
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(sock->IsConnected());
std::string request_text = "GET / HTTP/1.1\r\nUser-Agent: long browser name ";
request_text.append(20 * 1024, '*');
request_text.append("\r\n\r\n");
- scoped_refptr<DrainableIOBuffer> request_buffer(new DrainableIOBuffer(
- new StringIOBuffer(request_text), request_text.size()));
+ scoped_refptr<net::DrainableIOBuffer> request_buffer(
+ new net::DrainableIOBuffer(new net::StringIOBuffer(request_text),
+ request_text.size()));
// Simulate errors being returned from the underlying Read() and Write() ...
- raw_error_socket->SetNextReadError(ERR_CONNECTION_RESET);
- raw_error_socket->SetNextWriteError(ERR_CONNECTION_RESET);
+ error_socket->SetNextReadError(net::ERR_CONNECTION_RESET);
+ error_socket->SetNextWriteError(net::ERR_CONNECTION_RESET);
// ... but have those errors returned asynchronously. Because the Write() will
// return first, this will trigger the error.
- raw_transport->SetNextReadShouldBlock();
- raw_transport->SetNextWriteShouldBlock();
+ transport->SetNextReadShouldBlock();
+ transport->SetNextWriteShouldBlock();
// Enqueue a Read() before calling Write(), which should "hang" due to
// the ERR_IO_PENDING caused by SetReadShouldBlock() and thus return.
- SSLClientSocket* raw_sock = sock.get();
- DeleteSocketCallback read_callback(sock.release());
- scoped_refptr<IOBuffer> read_buf(new IOBuffer(4096));
- rv = raw_sock->Read(read_buf.get(), 4096, read_callback.callback());
+ DeleteSocketCallback read_callback(sock);
+ scoped_refptr<net::IOBuffer> read_buf(new net::IOBuffer(4096));
+ rv = sock->Read(read_buf.get(), 4096, read_callback.callback());
// Ensure things didn't complete synchronously, otherwise |sock| is invalid.
- ASSERT_EQ(ERR_IO_PENDING, rv);
+ ASSERT_EQ(net::ERR_IO_PENDING, rv);
ASSERT_FALSE(read_callback.have_result());
#if !defined(USE_OPENSSL)
@@ -1131,9 +1142,9 @@ TEST_F(SSLClientSocketTest, Read_DeleteWhilePendingFullDuplex) {
// SSLClientSocketOpenSSL::Write() will not return until all of
// |request_buffer| has been written to the underlying BIO (although not
// necessarily the underlying transport).
- rv = callback.GetResult(raw_sock->Write(request_buffer.get(),
- request_buffer->BytesRemaining(),
- callback.callback()));
+ rv = callback.GetResult(sock->Write(request_buffer.get(),
+ request_buffer->BytesRemaining(),
+ callback.callback()));
ASSERT_LT(0, rv);
request_buffer->DidConsume(rv);
@@ -1146,22 +1157,22 @@ TEST_F(SSLClientSocketTest, Read_DeleteWhilePendingFullDuplex) {
// Attempt to write the remaining data. NSS will not be able to consume the
// application data because the internal buffers are full, while OpenSSL will
// return that its blocked because the underlying transport is blocked.
- rv = raw_sock->Write(request_buffer.get(),
- request_buffer->BytesRemaining(),
- callback.callback());
- ASSERT_EQ(ERR_IO_PENDING, rv);
+ rv = sock->Write(request_buffer.get(),
+ request_buffer->BytesRemaining(),
+ callback.callback());
+ ASSERT_EQ(net::ERR_IO_PENDING, rv);
ASSERT_FALSE(callback.have_result());
// Now unblock Write(), which will invoke OnSendComplete and (eventually)
// call the Read() callback, deleting the socket and thus aborting calling
// the Write() callback.
- raw_transport->UnblockWrite();
+ transport->UnblockWrite();
rv = read_callback.WaitForResult();
#if !defined(USE_OPENSSL)
// NSS records the error exactly.
- EXPECT_EQ(ERR_CONNECTION_RESET, rv);
+ EXPECT_EQ(net::ERR_CONNECTION_RESET, rv);
#else
// OpenSSL treats any errors as a simple EOF.
EXPECT_EQ(0, rv);
@@ -1172,49 +1183,50 @@ TEST_F(SSLClientSocketTest, Read_DeleteWhilePendingFullDuplex) {
}
TEST_F(SSLClientSocketTest, Read_SmallChunks) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, NULL, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, NULL, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
rv = sock->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
- scoped_refptr<IOBuffer> request_buffer(
- new IOBuffer(arraysize(request_text) - 1));
+ scoped_refptr<net::IOBuffer> request_buffer(
+ new net::IOBuffer(arraysize(request_text) - 1));
memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1);
rv = sock->Write(
request_buffer.get(), arraysize(request_text) - 1, callback.callback());
- EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
+ EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv);
- scoped_refptr<IOBuffer> buf(new IOBuffer(1));
+ scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(1));
for (;;) {
rv = sock->Read(buf.get(), 1, callback.callback());
- EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
+ EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
EXPECT_GE(rv, 0);
@@ -1224,36 +1236,34 @@ TEST_F(SSLClientSocketTest, Read_SmallChunks) {
}
TEST_F(SSLClientSocketTest, Read_ManySmallRecords) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
+ net::TestCompletionCallback callback;
- scoped_ptr<StreamSocket> real_transport(
- new TCPClientSocket(addr, NULL, NetLog::Source()));
- scoped_ptr<ReadBufferingStreamSocket> transport(
- new ReadBufferingStreamSocket(real_transport.Pass()));
- ReadBufferingStreamSocket* raw_transport = transport.get();
+ scoped_ptr<net::StreamSocket> real_transport(new net::TCPClientSocket(
+ addr, NULL, net::NetLog::Source()));
+ ReadBufferingStreamSocket* transport = new ReadBufferingStreamSocket(
+ real_transport.Pass());
int rv = callback.GetResult(transport->Connect(callback.callback()));
- ASSERT_EQ(OK, rv);
+ ASSERT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(
- CreateSSLClientSocket(transport.PassAs<StreamSocket>(),
- test_server.host_port_pair(),
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
kDefaultSSLConfig));
rv = callback.GetResult(sock->Connect(callback.callback()));
- ASSERT_EQ(OK, rv);
+ ASSERT_EQ(net::OK, rv);
ASSERT_TRUE(sock->IsConnected());
const char request_text[] = "GET /ssl-many-small-records HTTP/1.0\r\n\r\n";
- scoped_refptr<IOBuffer> request_buffer(
- new IOBuffer(arraysize(request_text) - 1));
+ scoped_refptr<net::IOBuffer> request_buffer(
+ new net::IOBuffer(arraysize(request_text) - 1));
memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1);
rv = callback.GetResult(sock->Write(
@@ -1270,114 +1280,117 @@ TEST_F(SSLClientSocketTest, Read_ManySmallRecords) {
// 15K was chosen because 15K is smaller than the 17K (max) read issued by
// the SSLClientSocket implementation, and larger than the minimum amount
// of ciphertext necessary to contain the 8K of plaintext requested below.
- raw_transport->SetBufferSize(15000);
+ transport->SetBufferSize(15000);
- scoped_refptr<IOBuffer> buffer(new IOBuffer(8192));
+ scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(8192));
rv = callback.GetResult(sock->Read(buffer.get(), 8192, callback.callback()));
ASSERT_EQ(rv, 8192);
}
TEST_F(SSLClientSocketTest, Read_Interrupted) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, NULL, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, NULL, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
rv = sock->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
- scoped_refptr<IOBuffer> request_buffer(
- new IOBuffer(arraysize(request_text) - 1));
+ scoped_refptr<net::IOBuffer> request_buffer(
+ new net::IOBuffer(arraysize(request_text) - 1));
memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1);
rv = sock->Write(
request_buffer.get(), arraysize(request_text) - 1, callback.callback());
- EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
+ EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv);
// Do a partial read and then exit. This test should not crash!
- scoped_refptr<IOBuffer> buf(new IOBuffer(512));
+ scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(512));
rv = sock->Read(buf.get(), 512, callback.callback());
- EXPECT_TRUE(rv > 0 || rv == ERR_IO_PENDING);
+ EXPECT_TRUE(rv > 0 || rv == net::ERR_IO_PENDING);
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
EXPECT_GT(rv, 0);
}
TEST_F(SSLClientSocketTest, Read_FullLogging) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- CapturingNetLog log;
- log.SetLogLevel(NetLog::LOG_ALL);
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, &log, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::CapturingNetLog log;
+ log.SetLogLevel(net::NetLog::LOG_ALL);
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, &log, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
rv = sock->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(sock->IsConnected());
const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
- scoped_refptr<IOBuffer> request_buffer(
- new IOBuffer(arraysize(request_text) - 1));
+ scoped_refptr<net::IOBuffer> request_buffer(
+ new net::IOBuffer(arraysize(request_text) - 1));
memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1);
rv = sock->Write(
request_buffer.get(), arraysize(request_text) - 1, callback.callback());
- EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
+ EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv);
- CapturingNetLog::CapturedEntryList entries;
+ net::CapturingNetLog::CapturedEntryList entries;
log.GetEntries(&entries);
- size_t last_index = ExpectLogContainsSomewhereAfter(
- entries, 5, NetLog::TYPE_SSL_SOCKET_BYTES_SENT, NetLog::PHASE_NONE);
+ size_t last_index = net::ExpectLogContainsSomewhereAfter(
+ entries, 5, net::NetLog::TYPE_SSL_SOCKET_BYTES_SENT,
+ net::NetLog::PHASE_NONE);
- scoped_refptr<IOBuffer> buf(new IOBuffer(4096));
+ scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(4096));
for (;;) {
rv = sock->Read(buf.get(), 4096, callback.callback());
- EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
+ EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
EXPECT_GE(rv, 0);
@@ -1385,59 +1398,61 @@ TEST_F(SSLClientSocketTest, Read_FullLogging) {
break;
log.GetEntries(&entries);
- last_index =
- ExpectLogContainsSomewhereAfter(entries,
- last_index + 1,
- NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED,
- NetLog::PHASE_NONE);
+ last_index = net::ExpectLogContainsSomewhereAfter(
+ entries, last_index + 1, net::NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED,
+ net::NetLog::PHASE_NONE);
}
}
// Regression test for http://crbug.com/42538
TEST_F(SSLClientSocketTest, PrematureApplicationData) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
- TestCompletionCallback callback;
+ net::AddressList addr;
+ net::TestCompletionCallback callback;
static const unsigned char application_data[] = {
- 0x17, 0x03, 0x01, 0x00, 0x4a, 0x02, 0x00, 0x00, 0x46, 0x03, 0x01, 0x4b,
- 0xc2, 0xf8, 0xb2, 0xc1, 0x56, 0x42, 0xb9, 0x57, 0x7f, 0xde, 0x87, 0x46,
- 0xf7, 0xa3, 0x52, 0x42, 0x21, 0xf0, 0x13, 0x1c, 0x9c, 0x83, 0x88, 0xd6,
- 0x93, 0x0c, 0xf6, 0x36, 0x30, 0x05, 0x7e, 0x20, 0xb5, 0xb5, 0x73, 0x36,
- 0x53, 0x83, 0x0a, 0xfc, 0x17, 0x63, 0xbf, 0xa0, 0xe4, 0x42, 0x90, 0x0d,
- 0x2f, 0x18, 0x6d, 0x20, 0xd8, 0x36, 0x3f, 0xfc, 0xe6, 0x01, 0xfa, 0x0f,
- 0xa5, 0x75, 0x7f, 0x09, 0x00, 0x04, 0x00, 0x16, 0x03, 0x01, 0x11, 0x57,
- 0x0b, 0x00, 0x11, 0x53, 0x00, 0x11, 0x50, 0x00, 0x06, 0x22, 0x30, 0x82,
- 0x06, 0x1e, 0x30, 0x82, 0x05, 0x06, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,
- 0x0a};
+ 0x17, 0x03, 0x01, 0x00, 0x4a, 0x02, 0x00, 0x00, 0x46, 0x03, 0x01, 0x4b,
+ 0xc2, 0xf8, 0xb2, 0xc1, 0x56, 0x42, 0xb9, 0x57, 0x7f, 0xde, 0x87, 0x46,
+ 0xf7, 0xa3, 0x52, 0x42, 0x21, 0xf0, 0x13, 0x1c, 0x9c, 0x83, 0x88, 0xd6,
+ 0x93, 0x0c, 0xf6, 0x36, 0x30, 0x05, 0x7e, 0x20, 0xb5, 0xb5, 0x73, 0x36,
+ 0x53, 0x83, 0x0a, 0xfc, 0x17, 0x63, 0xbf, 0xa0, 0xe4, 0x42, 0x90, 0x0d,
+ 0x2f, 0x18, 0x6d, 0x20, 0xd8, 0x36, 0x3f, 0xfc, 0xe6, 0x01, 0xfa, 0x0f,
+ 0xa5, 0x75, 0x7f, 0x09, 0x00, 0x04, 0x00, 0x16, 0x03, 0x01, 0x11, 0x57,
+ 0x0b, 0x00, 0x11, 0x53, 0x00, 0x11, 0x50, 0x00, 0x06, 0x22, 0x30, 0x82,
+ 0x06, 0x1e, 0x30, 0x82, 0x05, 0x06, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,
+ 0x0a
+ };
// All reads and writes complete synchronously (async=false).
- MockRead data_reads[] = {
- MockRead(SYNCHRONOUS,
- reinterpret_cast<const char*>(application_data),
- arraysize(application_data)),
- MockRead(SYNCHRONOUS, OK), };
+ net::MockRead data_reads[] = {
+ net::MockRead(net::SYNCHRONOUS,
+ reinterpret_cast<const char*>(application_data),
+ arraysize(application_data)),
+ net::MockRead(net::SYNCHRONOUS, net::OK),
+ };
- StaticSocketDataProvider data(data_reads, arraysize(data_reads), NULL, 0);
+ net::StaticSocketDataProvider data(data_reads, arraysize(data_reads),
+ NULL, 0);
- scoped_ptr<StreamSocket> transport(
- new MockTCPClientSocket(addr, NULL, &data));
+ net::StreamSocket* transport =
+ new net::MockTCPClientSocket(addr, NULL, &data);
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
rv = sock->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, rv);
+ EXPECT_EQ(net::ERR_SSL_PROTOCOL_ERROR, rv);
}
TEST_F(SSLClientSocketTest, CipherSuiteDisables) {
@@ -1445,41 +1460,46 @@ TEST_F(SSLClientSocketTest, CipherSuiteDisables) {
// http://www.iana.org/assignments/tls-parameters/tls-parameters.xml,
// only disabling those cipher suites that the test server actually
// implements.
- const uint16 kCiphersToDisable[] = {0x0005, // TLS_RSA_WITH_RC4_128_SHA
+ const uint16 kCiphersToDisable[] = {
+ 0x0005, // TLS_RSA_WITH_RC4_128_SHA
};
- SpawnedTestServer::SSLOptions ssl_options;
+ net::SpawnedTestServer::SSLOptions ssl_options;
// Enable only RC4 on the test server.
- ssl_options.bulk_ciphers = SpawnedTestServer::SSLOptions::BULK_CIPHER_RC4;
- SpawnedTestServer test_server(
- SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath());
+ ssl_options.bulk_ciphers =
+ net::SpawnedTestServer::SSLOptions::BULK_CIPHER_RC4;
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ ssl_options,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- CapturingNetLog log;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, &log, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::CapturingNetLog log;
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, &log, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- SSLConfig ssl_config;
+ net::SSLConfig ssl_config;
for (size_t i = 0; i < arraysize(kCiphersToDisable); ++i)
ssl_config.disabled_cipher_suites.push_back(kCiphersToDisable[i]);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), ssl_config));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ ssl_config));
EXPECT_FALSE(sock->IsConnected());
rv = sock->Connect(callback.callback());
- CapturingNetLog::CapturedEntryList entries;
+ net::CapturingNetLog::CapturedEntryList entries;
log.GetEntries(&entries);
- EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT));
+ EXPECT_TRUE(net::LogContainsBeginEvent(
+ entries, 5, net::NetLog::TYPE_SSL_CONNECT));
// NSS has special handling that maps a handshake_failure alert received
// immediately after a client_hello to be a mismatched cipher suite error,
@@ -1487,16 +1507,17 @@ TEST_F(SSLClientSocketTest, CipherSuiteDisables) {
// Secure Transport (OS X), the handshake_failure is bubbled up without any
// interpretation, leading to ERR_SSL_PROTOCOL_ERROR. Either way, a failure
// indicates that no cipher suite was negotiated with the test server.
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_TRUE(rv == ERR_SSL_VERSION_OR_CIPHER_MISMATCH ||
- rv == ERR_SSL_PROTOCOL_ERROR);
+ EXPECT_TRUE(rv == net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH ||
+ rv == net::ERR_SSL_PROTOCOL_ERROR);
// The exact ordering differs between SSLClientSocketNSS (which issues an
// extra read) and SSLClientSocketMac (which does not). Just make sure the
// error appears somewhere in the log.
log.GetEntries(&entries);
- ExpectLogContainsSomewhere(
- entries, 0, NetLog::TYPE_SSL_HANDSHAKE_ERROR, NetLog::PHASE_NONE);
+ net::ExpectLogContainsSomewhere(entries, 0,
+ net::NetLog::TYPE_SSL_HANDSHAKE_ERROR,
+ net::NetLog::PHASE_NONE);
// We cannot test sock->IsConnected(), as the NSS implementation disconnects
// the socket when it encounters an error, whereas other implementations
@@ -1518,65 +1539,65 @@ TEST_F(SSLClientSocketTest, CipherSuiteDisables) {
// Here we verify that such a simple ClientSocketHandle, not associated with any
// client socket pool, can be destroyed safely.
TEST_F(SSLClientSocketTest, ClientSocketHandleNotFromPool) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, NULL, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, NULL, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<ClientSocketHandle> socket_handle(new ClientSocketHandle());
- socket_handle->SetSocket(transport.Pass());
+ net::ClientSocketHandle* socket_handle = new net::ClientSocketHandle();
+ socket_handle->set_socket(transport);
- scoped_ptr<SSLClientSocket> sock(
- socket_factory_->CreateSSLClientSocket(socket_handle.Pass(),
- test_server.host_port_pair(),
- kDefaultSSLConfig,
- context_));
+ scoped_ptr<net::SSLClientSocket> sock(
+ socket_factory_->CreateSSLClientSocket(
+ socket_handle, test_server.host_port_pair(), kDefaultSSLConfig,
+ context_));
EXPECT_FALSE(sock->IsConnected());
rv = sock->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
}
// Verifies that SSLClientSocket::ExportKeyingMaterial return a success
// code and different keying label results in different keying material.
TEST_F(SSLClientSocketTest, ExportKeyingMaterial) {
- SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
- SpawnedTestServer::kLocalhost,
- base::FilePath());
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ net::SpawnedTestServer::kLocalhost,
+ base::FilePath());
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
+ net::TestCompletionCallback callback;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, NULL, NetLog::Source()));
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, NULL, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
rv = sock->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(sock->IsConnected());
const int kKeyingMaterialSize = 32;
@@ -1584,23 +1605,23 @@ TEST_F(SSLClientSocketTest, ExportKeyingMaterial) {
const char* kKeyingContext = "";
unsigned char client_out1[kKeyingMaterialSize];
memset(client_out1, 0, sizeof(client_out1));
- rv = sock->ExportKeyingMaterial(
- kKeyingLabel1, false, kKeyingContext, client_out1, sizeof(client_out1));
- EXPECT_EQ(rv, OK);
+ rv = sock->ExportKeyingMaterial(kKeyingLabel1, false, kKeyingContext,
+ client_out1, sizeof(client_out1));
+ EXPECT_EQ(rv, net::OK);
const char* kKeyingLabel2 = "client-socket-test-2";
unsigned char client_out2[kKeyingMaterialSize];
memset(client_out2, 0, sizeof(client_out2));
- rv = sock->ExportKeyingMaterial(
- kKeyingLabel2, false, kKeyingContext, client_out2, sizeof(client_out2));
- EXPECT_EQ(rv, OK);
+ rv = sock->ExportKeyingMaterial(kKeyingLabel2, false, kKeyingContext,
+ client_out2, sizeof(client_out2));
+ EXPECT_EQ(rv, net::OK);
EXPECT_NE(memcmp(client_out1, client_out2, kKeyingMaterialSize), 0);
}
// Verifies that SSLClientSocket::ClearSessionCache can be called without
// explicit NSS initialization.
TEST(SSLClientSocket, ClearSessionCache) {
- SSLClientSocket::ClearSessionCache();
+ net::SSLClientSocket::ClearSessionCache();
}
// This tests that SSLInfo contains a properly re-constructed certificate
@@ -1618,84 +1639,86 @@ TEST(SSLClientSocket, ClearSessionCache) {
TEST_F(SSLClientSocketTest, VerifyReturnChainProperlyOrdered) {
// By default, cause the CertVerifier to treat all certificates as
// expired.
- cert_verifier_->set_default_result(ERR_CERT_DATE_INVALID);
+ cert_verifier_->set_default_result(net::ERR_CERT_DATE_INVALID);
// We will expect SSLInfo to ultimately contain this chain.
- CertificateList certs =
- CreateCertificateListFromFile(GetTestCertsDirectory(),
- "redundant-validated-chain.pem",
- X509Certificate::FORMAT_AUTO);
+ net::CertificateList certs = CreateCertificateListFromFile(
+ net::GetTestCertsDirectory(), "redundant-validated-chain.pem",
+ net::X509Certificate::FORMAT_AUTO);
ASSERT_EQ(3U, certs.size());
- X509Certificate::OSCertHandles temp_intermediates;
+ net::X509Certificate::OSCertHandles temp_intermediates;
temp_intermediates.push_back(certs[1]->os_cert_handle());
temp_intermediates.push_back(certs[2]->os_cert_handle());
- CertVerifyResult verify_result;
- verify_result.verified_cert = X509Certificate::CreateFromHandle(
- certs[0]->os_cert_handle(), temp_intermediates);
+ net::CertVerifyResult verify_result;
+ verify_result.verified_cert =
+ net::X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(),
+ temp_intermediates);
// Add a rule that maps the server cert (A) to the chain of A->B->C2
// rather than A->B->C.
- cert_verifier_->AddResultForCert(certs[0].get(), verify_result, OK);
+ cert_verifier_->AddResultForCert(certs[0].get(), verify_result, net::OK);
// Load and install the root for the validated chain.
- scoped_refptr<X509Certificate> root_cert = ImportCertFromFile(
- GetTestCertsDirectory(), "redundant-validated-chain-root.pem");
- ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert);
- ScopedTestRoot scoped_root(root_cert.get());
+ scoped_refptr<net::X509Certificate> root_cert =
+ net::ImportCertFromFile(net::GetTestCertsDirectory(),
+ "redundant-validated-chain-root.pem");
+ ASSERT_NE(static_cast<net::X509Certificate*>(NULL), root_cert);
+ net::ScopedTestRoot scoped_root(root_cert.get());
// Set up a test server with CERT_CHAIN_WRONG_ROOT.
- SpawnedTestServer::SSLOptions ssl_options(
- SpawnedTestServer::SSLOptions::CERT_CHAIN_WRONG_ROOT);
- SpawnedTestServer test_server(
- SpawnedTestServer::TYPE_HTTPS,
- ssl_options,
+ net::SpawnedTestServer::SSLOptions ssl_options(
+ net::SpawnedTestServer::SSLOptions::CERT_CHAIN_WRONG_ROOT);
+ net::SpawnedTestServer test_server(
+ net::SpawnedTestServer::TYPE_HTTPS, ssl_options,
base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
ASSERT_TRUE(test_server.Start());
- AddressList addr;
+ net::AddressList addr;
ASSERT_TRUE(test_server.GetAddressList(&addr));
- TestCompletionCallback callback;
- CapturingNetLog log;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, &log, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::CapturingNetLog log;
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, &log, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
EXPECT_FALSE(sock->IsConnected());
rv = sock->Connect(callback.callback());
- CapturingNetLog::CapturedEntryList entries;
+ net::CapturingNetLog::CapturedEntryList entries;
log.GetEntries(&entries);
- EXPECT_TRUE(LogContainsBeginEvent(entries, 5, NetLog::TYPE_SSL_CONNECT));
- if (rv == ERR_IO_PENDING)
+ EXPECT_TRUE(net::LogContainsBeginEvent(
+ entries, 5, net::NetLog::TYPE_SSL_CONNECT));
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
EXPECT_TRUE(sock->IsConnected());
log.GetEntries(&entries);
EXPECT_TRUE(LogContainsSSLConnectEndEvent(entries, -1));
- SSLInfo ssl_info;
+ net::SSLInfo ssl_info;
sock->GetSSLInfo(&ssl_info);
// Verify that SSLInfo contains the corrected re-constructed chain A -> B
// -> C2.
- const X509Certificate::OSCertHandles& intermediates =
+ const net::X509Certificate::OSCertHandles& intermediates =
ssl_info.cert->GetIntermediateCertificates();
ASSERT_EQ(2U, intermediates.size());
- EXPECT_TRUE(X509Certificate::IsSameOSCert(ssl_info.cert->os_cert_handle(),
- certs[0]->os_cert_handle()));
- EXPECT_TRUE(X509Certificate::IsSameOSCert(intermediates[0],
- certs[1]->os_cert_handle()));
- EXPECT_TRUE(X509Certificate::IsSameOSCert(intermediates[1],
- certs[2]->os_cert_handle()));
+ EXPECT_TRUE(net::X509Certificate::IsSameOSCert(
+ ssl_info.cert->os_cert_handle(), certs[0]->os_cert_handle()));
+ EXPECT_TRUE(net::X509Certificate::IsSameOSCert(
+ intermediates[0], certs[1]->os_cert_handle()));
+ EXPECT_TRUE(net::X509Certificate::IsSameOSCert(
+ intermediates[1], certs[2]->os_cert_handle()));
sock->Disconnect();
EXPECT_FALSE(sock->IsConnected());
@@ -1706,34 +1729,37 @@ class SSLClientSocketCertRequestInfoTest : public SSLClientSocketTest {
protected:
// Creates a test server with the given SSLOptions, connects to it and returns
// the SSLCertRequestInfo reported by the socket.
- scoped_refptr<SSLCertRequestInfo> GetCertRequest(
- SpawnedTestServer::SSLOptions ssl_options) {
- SpawnedTestServer test_server(
- SpawnedTestServer::TYPE_HTTPS, ssl_options, base::FilePath());
+ scoped_refptr<net::SSLCertRequestInfo> GetCertRequest(
+ net::SpawnedTestServer::SSLOptions ssl_options) {
+ net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
+ ssl_options,
+ base::FilePath());
if (!test_server.Start())
return NULL;
- AddressList addr;
+ net::AddressList addr;
if (!test_server.GetAddressList(&addr))
return NULL;
- TestCompletionCallback callback;
- CapturingNetLog log;
- scoped_ptr<StreamSocket> transport(
- new TCPClientSocket(addr, &log, NetLog::Source()));
+ net::TestCompletionCallback callback;
+ net::CapturingNetLog log;
+ net::StreamSocket* transport = new net::TCPClientSocket(
+ addr, &log, net::NetLog::Source());
int rv = transport->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- EXPECT_EQ(OK, rv);
+ EXPECT_EQ(net::OK, rv);
- scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
- transport.Pass(), test_server.host_port_pair(), kDefaultSSLConfig));
+ scoped_ptr<net::SSLClientSocket> sock(
+ CreateSSLClientSocket(transport, test_server.host_port_pair(),
+ kDefaultSSLConfig));
EXPECT_FALSE(sock->IsConnected());
rv = sock->Connect(callback.callback());
- if (rv == ERR_IO_PENDING)
+ if (rv == net::ERR_IO_PENDING)
rv = callback.WaitForResult();
- scoped_refptr<SSLCertRequestInfo> request_info = new SSLCertRequestInfo();
+ scoped_refptr<net::SSLCertRequestInfo> request_info =
+ new net::SSLCertRequestInfo();
sock->GetSSLCertRequestInfo(request_info.get());
sock->Disconnect();
EXPECT_FALSE(sock->IsConnected());
@@ -1743,9 +1769,10 @@ class SSLClientSocketCertRequestInfoTest : public SSLClientSocketTest {
};
TEST_F(SSLClientSocketCertRequestInfoTest, NoAuthorities) {
- SpawnedTestServer::SSLOptions ssl_options;
+ net::SpawnedTestServer::SSLOptions ssl_options;
ssl_options.request_client_certificate = true;
- scoped_refptr<SSLCertRequestInfo> request_info = GetCertRequest(ssl_options);
+ scoped_refptr<net::SSLCertRequestInfo> request_info =
+ GetCertRequest(ssl_options);
ASSERT_TRUE(request_info.get());
EXPECT_EQ(0u, request_info->cert_authorities.size());
}
@@ -1754,36 +1781,39 @@ TEST_F(SSLClientSocketCertRequestInfoTest, TwoAuthorities) {
const base::FilePath::CharType kThawteFile[] =
FILE_PATH_LITERAL("thawte.single.pem");
const unsigned char kThawteDN[] = {
- 0x30, 0x4c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
- 0x02, 0x5a, 0x41, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a,
- 0x13, 0x1c, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x43, 0x6f, 0x6e,
- 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x50, 0x74, 0x79,
- 0x29, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03,
- 0x55, 0x04, 0x03, 0x13, 0x0d, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20,
- 0x53, 0x47, 0x43, 0x20, 0x43, 0x41};
+ 0x30, 0x4c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
+ 0x02, 0x5a, 0x41, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a,
+ 0x13, 0x1c, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x43, 0x6f, 0x6e,
+ 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x50, 0x74, 0x79,
+ 0x29, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03,
+ 0x55, 0x04, 0x03, 0x13, 0x0d, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20,
+ 0x53, 0x47, 0x43, 0x20, 0x43, 0x41
+ };
const size_t kThawteLen = sizeof(kThawteDN);
const base::FilePath::CharType kDiginotarFile[] =
FILE_PATH_LITERAL("diginotar_root_ca.pem");
const unsigned char kDiginotarDN[] = {
- 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
- 0x02, 0x4e, 0x4c, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a,
- 0x13, 0x09, 0x44, 0x69, 0x67, 0x69, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x31,
- 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x44, 0x69,
- 0x67, 0x69, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74,
- 0x20, 0x43, 0x41, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48,
- 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x11, 0x69, 0x6e, 0x66, 0x6f,
- 0x40, 0x64, 0x69, 0x67, 0x69, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x2e, 0x6e,
- 0x6c};
+ 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
+ 0x02, 0x4e, 0x4c, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x0a,
+ 0x13, 0x09, 0x44, 0x69, 0x67, 0x69, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x31,
+ 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x11, 0x44, 0x69,
+ 0x67, 0x69, 0x4e, 0x6f, 0x74, 0x61, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74,
+ 0x20, 0x43, 0x41, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x09, 0x2a, 0x86, 0x48,
+ 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x11, 0x69, 0x6e, 0x66, 0x6f,
+ 0x40, 0x64, 0x69, 0x67, 0x69, 0x6e, 0x6f, 0x74, 0x61, 0x72, 0x2e, 0x6e,
+ 0x6c
+ };
const size_t kDiginotarLen = sizeof(kDiginotarDN);
- SpawnedTestServer::SSLOptions ssl_options;
+ net::SpawnedTestServer::SSLOptions ssl_options;
ssl_options.request_client_certificate = true;
ssl_options.client_authorities.push_back(
- GetTestClientCertsDirectory().Append(kThawteFile));
+ net::GetTestClientCertsDirectory().Append(kThawteFile));
ssl_options.client_authorities.push_back(
- GetTestClientCertsDirectory().Append(kDiginotarFile));
- scoped_refptr<SSLCertRequestInfo> request_info = GetCertRequest(ssl_options);
+ net::GetTestClientCertsDirectory().Append(kDiginotarFile));
+ scoped_refptr<net::SSLCertRequestInfo> request_info =
+ GetCertRequest(ssl_options);
ASSERT_TRUE(request_info.get());
ASSERT_EQ(2u, request_info->cert_authorities.size());
EXPECT_EQ(std::string(reinterpret_cast<const char*>(kThawteDN), kThawteLen),
@@ -1792,7 +1822,3 @@ TEST_F(SSLClientSocketCertRequestInfoTest, TwoAuthorities) {
std::string(reinterpret_cast<const char*>(kDiginotarDN), kDiginotarLen),
request_info->cert_authorities[1]);
}
-
-} // namespace
-
-} // namespace net
diff --git a/chromium/net/socket/ssl_server_socket.h b/chromium/net/socket/ssl_server_socket.h
index 8b607bf80cf..52d53cb19a2 100644
--- a/chromium/net/socket/ssl_server_socket.h
+++ b/chromium/net/socket/ssl_server_socket.h
@@ -6,7 +6,6 @@
#define NET_SOCKET_SSL_SERVER_SOCKET_H_
#include "base/basictypes.h"
-#include "base/memory/scoped_ptr.h"
#include "net/base/completion_callback.h"
#include "net/base/net_export.h"
#include "net/socket/ssl_socket.h"
@@ -53,8 +52,8 @@ NET_EXPORT void EnableSSLServerSockets();
//
// The caller starts the SSL server handshake by calling Handshake on the
// returned socket.
-NET_EXPORT scoped_ptr<SSLServerSocket> CreateSSLServerSocket(
- scoped_ptr<StreamSocket> socket,
+NET_EXPORT SSLServerSocket* CreateSSLServerSocket(
+ StreamSocket* socket,
X509Certificate* certificate,
crypto::RSAPrivateKey* key,
const SSLConfig& ssl_config);
diff --git a/chromium/net/socket/ssl_server_socket_nss.cc b/chromium/net/socket/ssl_server_socket_nss.cc
index 7e5d70118ac..c2681d3ee14 100644
--- a/chromium/net/socket/ssl_server_socket_nss.cc
+++ b/chromium/net/socket/ssl_server_socket_nss.cc
@@ -78,20 +78,19 @@ void EnableSSLServerSockets() {
g_nss_ssl_server_init_singleton.Get();
}
-scoped_ptr<SSLServerSocket> CreateSSLServerSocket(
- scoped_ptr<StreamSocket> socket,
+SSLServerSocket* CreateSSLServerSocket(
+ StreamSocket* socket,
X509Certificate* cert,
crypto::RSAPrivateKey* key,
const SSLConfig& ssl_config) {
DCHECK(g_nss_server_sockets_init) << "EnableSSLServerSockets() has not been"
<< "called yet!";
- return scoped_ptr<SSLServerSocket>(
- new SSLServerSocketNSS(socket.Pass(), cert, key, ssl_config));
+ return new SSLServerSocketNSS(socket, cert, key, ssl_config);
}
SSLServerSocketNSS::SSLServerSocketNSS(
- scoped_ptr<StreamSocket> transport_socket,
+ StreamSocket* transport_socket,
scoped_refptr<X509Certificate> cert,
crypto::RSAPrivateKey* key,
const SSLConfig& ssl_config)
@@ -101,7 +100,7 @@ SSLServerSocketNSS::SSLServerSocketNSS(
user_write_buf_len_(0),
nss_fd_(NULL),
nss_bufs_(NULL),
- transport_socket_(transport_socket.Pass()),
+ transport_socket_(transport_socket),
ssl_config_(ssl_config),
cert_(cert),
next_handshake_state_(STATE_NONE),
diff --git a/chromium/net/socket/ssl_server_socket_nss.h b/chromium/net/socket/ssl_server_socket_nss.h
index 8bbb0e338ac..17a1fc38750 100644
--- a/chromium/net/socket/ssl_server_socket_nss.h
+++ b/chromium/net/socket/ssl_server_socket_nss.h
@@ -24,7 +24,7 @@ class SSLServerSocketNSS : public SSLServerSocket {
public:
// See comments on CreateSSLServerSocket for details of how these
// parameters are used.
- SSLServerSocketNSS(scoped_ptr<StreamSocket> socket,
+ SSLServerSocketNSS(StreamSocket* socket,
scoped_refptr<X509Certificate> certificate,
crypto::RSAPrivateKey* key,
const SSLConfig& ssl_config);
diff --git a/chromium/net/socket/ssl_server_socket_openssl.cc b/chromium/net/socket/ssl_server_socket_openssl.cc
index c327f2caf10..e0cf8bc0b21 100644
--- a/chromium/net/socket/ssl_server_socket_openssl.cc
+++ b/chromium/net/socket/ssl_server_socket_openssl.cc
@@ -16,13 +16,13 @@ void EnableSSLServerSockets() {
NOTIMPLEMENTED();
}
-scoped_ptr<SSLServerSocket> CreateSSLServerSocket(
- scoped_ptr<StreamSocket> socket,
- X509Certificate* certificate,
- crypto::RSAPrivateKey* key,
- const SSLConfig& ssl_config) {
+SSLServerSocket* CreateSSLServerSocket(StreamSocket* socket,
+ X509Certificate* certificate,
+ crypto::RSAPrivateKey* key,
+ const SSLConfig& ssl_config) {
NOTIMPLEMENTED();
- return scoped_ptr<SSLServerSocket>();
+ delete socket;
+ return NULL;
}
} // namespace net
diff --git a/chromium/net/socket/ssl_server_socket_unittest.cc b/chromium/net/socket/ssl_server_socket_unittest.cc
index 64c85490b29..f931e2c957e 100644
--- a/chromium/net/socket/ssl_server_socket_unittest.cc
+++ b/chromium/net/socket/ssl_server_socket_unittest.cc
@@ -304,11 +304,8 @@ class SSLServerSocketTest : public PlatformTest {
protected:
void Initialize() {
- scoped_ptr<ClientSocketHandle> client_connection(new ClientSocketHandle);
- client_connection->SetSocket(
- scoped_ptr<StreamSocket>(new FakeSocket(&channel_1_, &channel_2_)));
- scoped_ptr<StreamSocket> server_socket(
- new FakeSocket(&channel_2_, &channel_1_));
+ FakeSocket* fake_client_socket = new FakeSocket(&channel_1_, &channel_2_);
+ FakeSocket* fake_server_socket = new FakeSocket(&channel_2_, &channel_1_);
base::FilePath certs_dir(GetTestCertsDirectory());
@@ -347,12 +344,11 @@ class SSLServerSocketTest : public PlatformTest {
net::SSLClientSocketContext context;
context.cert_verifier = cert_verifier_.get();
context.transport_security_state = transport_security_state_.get();
- client_socket_ =
+ client_socket_.reset(
socket_factory_->CreateSSLClientSocket(
- client_connection.Pass(), host_and_pair, ssl_config, context);
- server_socket_ = net::CreateSSLServerSocket(
- server_socket.Pass(),
- cert.get(), private_key.get(), net::SSLConfig());
+ fake_client_socket, host_and_pair, ssl_config, context));
+ server_socket_.reset(net::CreateSSLServerSocket(
+ fake_server_socket, cert.get(), private_key.get(), net::SSLConfig()));
}
FakeDataChannel channel_1_;
diff --git a/chromium/net/socket/transport_client_socket_pool.cc b/chromium/net/socket/transport_client_socket_pool.cc
index 6d0afac59fb..8255e988fa4 100644
--- a/chromium/net/socket/transport_client_socket_pool.cc
+++ b/chromium/net/socket/transport_client_socket_pool.cc
@@ -190,8 +190,8 @@ int TransportConnectJob::DoResolveHostComplete(int result) {
int TransportConnectJob::DoTransportConnect() {
next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE;
- transport_socket_ = client_socket_factory_->CreateTransportClientSocket(
- addresses_, net_log().net_log(), net_log().source());
+ transport_socket_.reset(client_socket_factory_->CreateTransportClientSocket(
+ addresses_, net_log().net_log(), net_log().source()));
int rv = transport_socket_->Connect(
base::Bind(&TransportConnectJob::OnIOComplete, base::Unretained(this)));
if (rv == ERR_IO_PENDING &&
@@ -246,7 +246,7 @@ int TransportConnectJob::DoTransportConnectComplete(int result) {
100);
}
}
- SetSocket(transport_socket_.Pass());
+ set_socket(transport_socket_.release());
fallback_timer_.Stop();
} else {
// Be a bit paranoid and kill off the fallback members to prevent reuse.
@@ -270,9 +270,9 @@ void TransportConnectJob::DoIPv6FallbackTransportConnect() {
fallback_addresses_.reset(new AddressList(addresses_));
MakeAddressListStartWithIPv4(fallback_addresses_.get());
- fallback_transport_socket_ =
+ fallback_transport_socket_.reset(
client_socket_factory_->CreateTransportClientSocket(
- *fallback_addresses_, net_log().net_log(), net_log().source());
+ *fallback_addresses_, net_log().net_log(), net_log().source()));
fallback_connect_start_time_ = base::TimeTicks::Now();
int rv = fallback_transport_socket_->Connect(
base::Bind(
@@ -317,7 +317,7 @@ void TransportConnectJob::DoIPv6FallbackTransportConnectComplete(int result) {
base::TimeDelta::FromMilliseconds(1),
base::TimeDelta::FromMinutes(10),
100);
- SetSocket(fallback_transport_socket_.Pass());
+ set_socket(fallback_transport_socket_.release());
next_state_ = STATE_NONE;
transport_socket_.reset();
} else {
@@ -333,19 +333,18 @@ int TransportConnectJob::ConnectInternal() {
return DoLoop(OK);
}
-scoped_ptr<ConnectJob>
+ConnectJob*
TransportClientSocketPool::TransportConnectJobFactory::NewConnectJob(
const std::string& group_name,
const PoolBase::Request& request,
ConnectJob::Delegate* delegate) const {
- return scoped_ptr<ConnectJob>(
- new TransportConnectJob(group_name,
- request.params(),
- ConnectionTimeout(),
- client_socket_factory_,
- host_resolver_,
- delegate,
- net_log_));
+ return new TransportConnectJob(group_name,
+ request.params(),
+ ConnectionTimeout(),
+ client_socket_factory_,
+ host_resolver_,
+ delegate,
+ net_log_);
}
base::TimeDelta
@@ -420,9 +419,9 @@ void TransportClientSocketPool::CancelRequest(
void TransportClientSocketPool::ReleaseSocket(
const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
int id) {
- base_.ReleaseSocket(group_name, socket.Pass(), id);
+ base_.ReleaseSocket(group_name, socket, id);
}
void TransportClientSocketPool::FlushWithError(int error) {
diff --git a/chromium/net/socket/transport_client_socket_pool.h b/chromium/net/socket/transport_client_socket_pool.h
index f07dc1f5675..bb53b3da301 100644
--- a/chromium/net/socket/transport_client_socket_pool.h
+++ b/chromium/net/socket/transport_client_socket_pool.h
@@ -156,7 +156,7 @@ class NET_EXPORT_PRIVATE TransportClientSocketPool : public ClientSocketPool {
virtual void CancelRequest(const std::string& group_name,
ClientSocketHandle* handle) OVERRIDE;
virtual void ReleaseSocket(const std::string& group_name,
- scoped_ptr<StreamSocket> socket,
+ StreamSocket* socket,
int id) OVERRIDE;
virtual void FlushWithError(int error) OVERRIDE;
virtual bool IsStalled() const OVERRIDE;
@@ -193,7 +193,7 @@ class NET_EXPORT_PRIVATE TransportClientSocketPool : public ClientSocketPool {
// ClientSocketPoolBase::ConnectJobFactory methods.
- virtual scoped_ptr<ConnectJob> NewConnectJob(
+ virtual ConnectJob* NewConnectJob(
const std::string& group_name,
const PoolBase::Request& request,
ConnectJob::Delegate* delegate) const OVERRIDE;
diff --git a/chromium/net/socket/transport_client_socket_pool_unittest.cc b/chromium/net/socket/transport_client_socket_pool_unittest.cc
index c607a38b78a..dfa1151b291 100644
--- a/chromium/net/socket/transport_client_socket_pool_unittest.cc
+++ b/chromium/net/socket/transport_client_socket_pool_unittest.cc
@@ -23,7 +23,6 @@
#include "net/socket/client_socket_handle.h"
#include "net/socket/client_socket_pool_histograms.h"
#include "net/socket/socket_test_util.h"
-#include "net/socket/ssl_client_socket.h"
#include "net/socket/stream_socket.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -341,16 +340,16 @@ class MockClientSocketFactory : public ClientSocketFactory {
delay_(base::TimeDelta::FromMilliseconds(
ClientSocketPool::kMaxConnectRetryIntervalMs)) {}
- virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
+ virtual DatagramClientSocket* CreateDatagramClientSocket(
DatagramSocket::BindType bind_type,
const RandIntCallback& rand_int_cb,
NetLog* net_log,
const NetLog::Source& source) OVERRIDE {
NOTREACHED();
- return scoped_ptr<DatagramClientSocket>();
+ return NULL;
}
- virtual scoped_ptr<StreamSocket> CreateTransportClientSocket(
+ virtual StreamSocket* CreateTransportClientSocket(
const AddressList& addresses,
NetLog* /* net_log */,
const NetLog::Source& /* source */) OVERRIDE {
@@ -364,41 +363,34 @@ class MockClientSocketFactory : public ClientSocketFactory {
switch (type) {
case MOCK_CLIENT_SOCKET:
- return scoped_ptr<StreamSocket>(
- new MockClientSocket(addresses, net_log_));
+ return new MockClientSocket(addresses, net_log_);
case MOCK_FAILING_CLIENT_SOCKET:
- return scoped_ptr<StreamSocket>(
- new MockFailingClientSocket(addresses, net_log_));
+ return new MockFailingClientSocket(addresses, net_log_);
case MOCK_PENDING_CLIENT_SOCKET:
- return scoped_ptr<StreamSocket>(
- new MockPendingClientSocket(
- addresses, true, false, base::TimeDelta(), net_log_));
+ return new MockPendingClientSocket(
+ addresses, true, false, base::TimeDelta(), net_log_);
case MOCK_PENDING_FAILING_CLIENT_SOCKET:
- return scoped_ptr<StreamSocket>(
- new MockPendingClientSocket(
- addresses, false, false, base::TimeDelta(), net_log_));
+ return new MockPendingClientSocket(
+ addresses, false, false, base::TimeDelta(), net_log_);
case MOCK_DELAYED_CLIENT_SOCKET:
- return scoped_ptr<StreamSocket>(
- new MockPendingClientSocket(
- addresses, true, false, delay_, net_log_));
+ return new MockPendingClientSocket(
+ addresses, true, false, delay_, net_log_);
case MOCK_STALLED_CLIENT_SOCKET:
- return scoped_ptr<StreamSocket>(
- new MockPendingClientSocket(
- addresses, true, true, base::TimeDelta(), net_log_));
+ return new MockPendingClientSocket(
+ addresses, true, true, base::TimeDelta(), net_log_);
default:
NOTREACHED();
- return scoped_ptr<StreamSocket>(
- new MockClientSocket(addresses, net_log_));
+ return new MockClientSocket(addresses, net_log_);
}
}
- virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
- scoped_ptr<ClientSocketHandle> transport_socket,
+ virtual SSLClientSocket* CreateSSLClientSocket(
+ ClientSocketHandle* transport_socket,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context) OVERRIDE {
NOTIMPLEMENTED();
- return scoped_ptr<SSLClientSocket>();
+ return NULL;
}
virtual void ClearSSLSessionCache() OVERRIDE {
diff --git a/chromium/net/socket/transport_client_socket_unittest.cc b/chromium/net/socket/transport_client_socket_unittest.cc
index 5c5a303b82f..2f75e740067 100644
--- a/chromium/net/socket/transport_client_socket_unittest.cc
+++ b/chromium/net/socket/transport_client_socket_unittest.cc
@@ -130,10 +130,10 @@ void TransportClientSocketTest::SetUp() {
CHECK_EQ(ERR_IO_PENDING, rv);
rv = callback.WaitForResult();
CHECK_EQ(rv, OK);
- sock_ =
+ sock_.reset(
socket_factory_->CreateTransportClientSocket(addr,
&net_log_,
- NetLog::Source());
+ NetLog::Source()));
}
int TransportClientSocketTest::DrainClientSocket(
diff --git a/chromium/net/socket_stream/socket_stream.cc b/chromium/net/socket_stream/socket_stream.cc
index c549fcb9768..dca994cbada 100644
--- a/chromium/net/socket_stream/socket_stream.cc
+++ b/chromium/net/socket_stream/socket_stream.cc
@@ -33,7 +33,6 @@
#include "net/http/http_transaction_factory.h"
#include "net/http/http_util.h"
#include "net/socket/client_socket_factory.h"
-#include "net/socket/client_socket_handle.h"
#include "net/socket/socks5_client_socket.h"
#include "net/socket/socks_client_socket.h"
#include "net/socket/ssl_client_socket.h"
@@ -97,7 +96,6 @@ SocketStream::SocketStream(const GURL& url, Delegate* delegate)
proxy_mode_(kDirectConnection),
proxy_url_(url),
pac_request_(NULL),
- connection_(new ClientSocketHandle),
privacy_mode_(kPrivacyModeDisabled),
// Unretained() is required; without it, Bind() creates a circular
// dependency and the SocketStream object will not be freed.
@@ -207,10 +205,8 @@ bool SocketStream::SendData(const char* data, int len) {
<< "The current base::MessageLoop must be TYPE_IO";
DCHECK_GT(len, 0);
- if (!connection_->socket() ||
- !connection_->socket()->IsConnected() || next_state_ == STATE_NONE) {
+ if (!socket_.get() || !socket_->IsConnected() || next_state_ == STATE_NONE)
return false;
- }
int total_buffered_bytes = len;
if (current_write_buf_.get()) {
@@ -268,7 +264,7 @@ void SocketStream::RestartWithAuth(const AuthCredentials& credentials) {
DCHECK_EQ(base::MessageLoop::TYPE_IO, base::MessageLoop::current()->type())
<< "The current base::MessageLoop must be TYPE_IO";
DCHECK(proxy_auth_controller_.get());
- if (!connection_->socket()) {
+ if (!socket_.get()) {
DVLOG(1) << "Socket is closed before restarting with auth.";
return;
}
@@ -373,7 +369,7 @@ void SocketStream::Finish(int result) {
}
int SocketStream::DidEstablishConnection() {
- if (!connection_->socket() || !connection_->socket()->IsConnected()) {
+ if (!socket_.get() || !socket_->IsConnected()) {
next_state_ = STATE_CLOSE;
return ERR_CONNECTION_FAILED;
}
@@ -734,12 +730,11 @@ int SocketStream::DoTcpConnect(int result) {
}
next_state_ = STATE_TCP_CONNECT_COMPLETE;
DCHECK(factory_);
- connection_->SetSocket(
- factory_->CreateTransportClientSocket(addresses_,
- net_log_.net_log(),
- net_log_.source()));
+ socket_.reset(factory_->CreateTransportClientSocket(addresses_,
+ net_log_.net_log(),
+ net_log_.source()));
metrics_->OnStartConnection();
- return connection_->socket()->Connect(io_callback_);
+ return socket_->Connect(io_callback_);
}
int SocketStream::DoTcpConnectComplete(int result) {
@@ -824,8 +819,7 @@ int SocketStream::DoWriteTunnelHeaders() {
int buf_len = static_cast<int>(tunnel_request_headers_->headers_.size() -
tunnel_request_headers_bytes_sent_);
DCHECK_GT(buf_len, 0);
- return connection_->socket()->Write(
- tunnel_request_headers_.get(), buf_len, io_callback_);
+ return socket_->Write(tunnel_request_headers_.get(), buf_len, io_callback_);
}
int SocketStream::DoWriteTunnelHeadersComplete(int result) {
@@ -868,8 +862,7 @@ int SocketStream::DoReadTunnelHeaders() {
tunnel_response_headers_->SetDataOffset(tunnel_response_headers_len_);
CHECK(tunnel_response_headers_->data());
- return connection_->socket()->Read(
- tunnel_response_headers_.get(), buf_len, io_callback_);
+ return socket_->Read(tunnel_response_headers_.get(), buf_len, io_callback_);
}
int SocketStream::DoReadTunnelHeadersComplete(int result) {
@@ -960,20 +953,17 @@ int SocketStream::DoSOCKSConnect() {
next_state_ = STATE_SOCKS_CONNECT_COMPLETE;
+ StreamSocket* s = socket_.release();
HostResolver::RequestInfo req_info(HostPortPair::FromURL(url_));
DCHECK(!proxy_info_.is_empty());
- scoped_ptr<StreamSocket> s;
- if (proxy_info_.proxy_server().scheme() == ProxyServer::SCHEME_SOCKS5) {
- s.reset(new SOCKS5ClientSocket(connection_.Pass(), req_info));
- } else {
- s.reset(new SOCKSClientSocket(
- connection_.Pass(), req_info, context_->host_resolver()));
- }
- connection_.reset(new ClientSocketHandle);
- connection_->SetSocket(s.Pass());
+ if (proxy_info_.proxy_server().scheme() == ProxyServer::SCHEME_SOCKS5)
+ s = new SOCKS5ClientSocket(s, req_info);
+ else
+ s = new SOCKSClientSocket(s, req_info, context_->host_resolver());
+ socket_.reset(s);
metrics_->OnCountConnectionType(SocketStreamMetrics::SOCKS_CONNECTION);
- return connection_->socket()->Connect(io_callback_);
+ return socket_->Connect(io_callback_);
}
int SocketStream::DoSOCKSConnectComplete(int result) {
@@ -996,16 +986,14 @@ int SocketStream::DoSecureProxyConnect() {
ssl_context.cert_verifier = context_->cert_verifier();
ssl_context.transport_security_state = context_->transport_security_state();
ssl_context.server_bound_cert_service = context_->server_bound_cert_service();
- scoped_ptr<StreamSocket> socket(factory_->CreateSSLClientSocket(
- connection_.Pass(),
+ socket_.reset(factory_->CreateSSLClientSocket(
+ socket_.release(),
proxy_info_.proxy_server().host_port_pair(),
proxy_ssl_config_,
ssl_context));
- connection_.reset(new ClientSocketHandle);
- connection_->SetSocket(socket.Pass());
next_state_ = STATE_SECURE_PROXY_CONNECT_COMPLETE;
metrics_->OnCountConnectionType(SocketStreamMetrics::SECURE_PROXY_CONNECTION);
- return connection_->socket()->Connect(io_callback_);
+ return socket_->Connect(io_callback_);
}
int SocketStream::DoSecureProxyConnectComplete(int result) {
@@ -1037,7 +1025,7 @@ int SocketStream::DoSecureProxyHandleCertError(int result) {
int SocketStream::DoSecureProxyHandleCertErrorComplete(int result) {
DCHECK_EQ(STATE_NONE, next_state_);
if (result == OK) {
- if (!connection_->socket()->IsConnectedAndIdle())
+ if (!socket_->IsConnectedAndIdle())
return AllowCertErrorForReconnection(&proxy_ssl_config_);
next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN;
} else {
@@ -1052,16 +1040,13 @@ int SocketStream::DoSSLConnect() {
ssl_context.cert_verifier = context_->cert_verifier();
ssl_context.transport_security_state = context_->transport_security_state();
ssl_context.server_bound_cert_service = context_->server_bound_cert_service();
- scoped_ptr<StreamSocket> socket(
- factory_->CreateSSLClientSocket(connection_.Pass(),
- HostPortPair::FromURL(url_),
- server_ssl_config_,
- ssl_context));
- connection_.reset(new ClientSocketHandle);
- connection_->SetSocket(socket.Pass());
+ socket_.reset(factory_->CreateSSLClientSocket(socket_.release(),
+ HostPortPair::FromURL(url_),
+ server_ssl_config_,
+ ssl_context));
next_state_ = STATE_SSL_CONNECT_COMPLETE;
metrics_->OnCountConnectionType(SocketStreamMetrics::SSL_CONNECTION);
- return connection_->socket()->Connect(io_callback_);
+ return socket_->Connect(io_callback_);
}
int SocketStream::DoSSLConnectComplete(int result) {
@@ -1097,7 +1082,7 @@ int SocketStream::DoSSLHandleCertErrorComplete(int result) {
// we should take care of TLS NPN extension here.
if (result == OK) {
- if (!connection_->socket()->IsConnectedAndIdle())
+ if (!socket_->IsConnectedAndIdle())
return AllowCertErrorForReconnection(&server_ssl_config_);
result = DidEstablishConnection();
} else {
@@ -1111,7 +1096,7 @@ int SocketStream::DoReadWrite(int result) {
next_state_ = STATE_CLOSE;
return result;
}
- if (!connection_->socket() || !connection_->socket()->IsConnected()) {
+ if (!socket_.get() || !socket_->IsConnected()) {
next_state_ = STATE_CLOSE;
return ERR_CONNECTION_CLOSED;
}
@@ -1120,7 +1105,7 @@ int SocketStream::DoReadWrite(int result) {
// let's close the socket.
// We don't care about receiving data after the socket is closed.
if (closing_ && !current_write_buf_.get() && pending_write_bufs_.empty()) {
- connection_->socket()->Disconnect();
+ socket_->Disconnect();
next_state_ = STATE_CLOSE;
return OK;
}
@@ -1132,7 +1117,7 @@ int SocketStream::DoReadWrite(int result) {
if (!read_buf_.get()) {
// No read pending and server didn't close the socket.
read_buf_ = new IOBuffer(kReadBufferSize);
- result = connection_->socket()->Read(
+ result = socket_->Read(
read_buf_.get(),
kReadBufferSize,
base::Bind(&SocketStream::OnReadCompleted, base::Unretained(this)));
@@ -1171,7 +1156,7 @@ int SocketStream::DoReadWrite(int result) {
pending_write_bufs_.pop_front();
}
- result = connection_->socket()->Write(
+ result = socket_->Write(
current_write_buf_.get(),
current_write_buf_->BytesRemaining(),
base::Bind(&SocketStream::OnWriteCompleted, base::Unretained(this)));
@@ -1203,10 +1188,10 @@ int SocketStream::HandleCertificateRequest(int result, SSLConfig* ssl_config) {
return result;
}
- DCHECK(connection_->socket());
+ DCHECK(socket_.get());
scoped_refptr<SSLCertRequestInfo> cert_request_info = new SSLCertRequestInfo;
SSLClientSocket* ssl_socket =
- static_cast<SSLClientSocket*>(connection_->socket());
+ static_cast<SSLClientSocket*>(socket_.get());
ssl_socket->GetSSLCertRequestInfo(cert_request_info.get());
HttpTransactionFactory* factory = context_->http_transaction_factory();
@@ -1252,8 +1237,7 @@ int SocketStream::AllowCertErrorForReconnection(SSLConfig* ssl_config) {
// allowed bad certificates in |ssl_config|.
// See also net/http/http_network_transaction.cc HandleCertificateError() and
// RestartIgnoringLastError().
- SSLClientSocket* ssl_socket =
- static_cast<SSLClientSocket*>(connection_->socket());
+ SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(socket_.get());
SSLInfo ssl_info;
ssl_socket->GetSSLInfo(&ssl_info);
if (ssl_info.cert.get() == NULL ||
@@ -1275,8 +1259,8 @@ int SocketStream::AllowCertErrorForReconnection(SSLConfig* ssl_config) {
bad_cert.cert_status = ssl_info.cert_status;
ssl_config->allowed_bad_certs.push_back(bad_cert);
// Restart connection ignoring the bad certificate.
- connection_->socket()->Disconnect();
- connection_->SetSocket(scoped_ptr<StreamSocket>());
+ socket_->Disconnect();
+ socket_.reset();
next_state_ = STATE_TCP_CONNECT;
return OK;
}
@@ -1302,8 +1286,7 @@ void SocketStream::DoRestartWithAuth() {
int SocketStream::HandleCertificateError(int result) {
DCHECK(IsCertificateError(result));
- SSLClientSocket* ssl_socket =
- static_cast<SSLClientSocket*>(connection_->socket());
+ SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(socket_.get());
DCHECK(ssl_socket);
if (!context_)
diff --git a/chromium/net/socket_stream/socket_stream.h b/chromium/net/socket_stream/socket_stream.h
index 90aeb8c54b9..5004060df9a 100644
--- a/chromium/net/socket_stream/socket_stream.h
+++ b/chromium/net/socket_stream/socket_stream.h
@@ -28,13 +28,13 @@ namespace net {
class AuthChallengeInfo;
class CertVerifier;
class ClientSocketFactory;
-class ClientSocketHandle;
class CookieOptions;
class HostResolver;
class HttpAuthController;
class SSLInfo;
class ServerBoundCertService;
class SingleRequestHostResolver;
+class StreamSocket;
class SocketStreamMetrics;
class TransportSecurityState;
class URLRequestContext;
@@ -364,7 +364,7 @@ class NET_EXPORT SocketStream
scoped_ptr<SingleRequestHostResolver> resolver_;
AddressList addresses_;
- scoped_ptr<ClientSocketHandle> connection_;
+ scoped_ptr<StreamSocket> socket_;
SSLConfig server_ssl_config_;
SSLConfig proxy_ssl_config_;
diff --git a/chromium/net/spdy/spdy_credential_builder_unittest.cc b/chromium/net/spdy/spdy_credential_builder_unittest.cc
index f82f2f5860f..bc67cc593ae 100644
--- a/chromium/net/spdy/spdy_credential_builder_unittest.cc
+++ b/chromium/net/spdy/spdy_credential_builder_unittest.cc
@@ -31,8 +31,9 @@ void CreateCertAndKey(std::string* cert, std::string* key) {
TestCompletionCallback callback;
ServerBoundCertService::RequestHandle request_handle;
- int rv = server_bound_cert_service->GetOrCreateDomainBoundCert(
- "www.google.com", key, cert, callback.callback(), &request_handle);
+ int rv = server_bound_cert_service->GetDomainBoundCert(
+ "www.google.com", key, cert,
+ callback.callback(), &request_handle);
EXPECT_EQ(ERR_IO_PENDING, rv);
EXPECT_EQ(OK, callback.WaitForResult());
diff --git a/chromium/net/spdy/spdy_http_stream.cc b/chromium/net/spdy/spdy_http_stream.cc
index 4d9117514ab..08e8b58bf61 100644
--- a/chromium/net/spdy/spdy_http_stream.cc
+++ b/chromium/net/spdy/spdy_http_stream.cc
@@ -524,9 +524,4 @@ void SpdyHttpStream::Drain(HttpNetworkSession* session) {
delete this;
}
-void SpdyHttpStream::SetPriority(RequestPriority priority) {
- // TODO(akalin): Plumb this through to |stream_request_| and
- // |stream_|.
-}
-
} // namespace net
diff --git a/chromium/net/spdy/spdy_http_stream.h b/chromium/net/spdy/spdy_http_stream.h
index f6e39cd102e..65d98784181 100644
--- a/chromium/net/spdy/spdy_http_stream.h
+++ b/chromium/net/spdy/spdy_http_stream.h
@@ -73,7 +73,6 @@ class NET_EXPORT_PRIVATE SpdyHttpStream : public SpdyStream::Delegate,
SSLCertRequestInfo* cert_request_info) OVERRIDE;
virtual bool IsSpdyHttpStream() const OVERRIDE;
virtual void Drain(HttpNetworkSession* session) OVERRIDE;
- virtual void SetPriority(RequestPriority priority) OVERRIDE;
// SpdyStream::Delegate implementation.
virtual void OnRequestHeadersSent() OVERRIDE;
diff --git a/chromium/net/spdy/spdy_http_stream_unittest.cc b/chromium/net/spdy/spdy_http_stream_unittest.cc
index d88c963cd9a..55387cf410a 100644
--- a/chromium/net/spdy/spdy_http_stream_unittest.cc
+++ b/chromium/net/spdy/spdy_http_stream_unittest.cc
@@ -542,7 +542,7 @@ void GetECServerBoundCertAndProof(
TestCompletionCallback callback;
std::string key;
ServerBoundCertService::RequestHandle request_handle;
- int rv = server_bound_cert_service->GetOrCreateDomainBoundCert(
+ int rv = server_bound_cert_service->GetDomainBoundCert(
host, &key, cert, callback.callback(),
&request_handle);
EXPECT_EQ(ERR_IO_PENDING, rv);
diff --git a/chromium/net/spdy/spdy_network_transaction_unittest.cc b/chromium/net/spdy/spdy_network_transaction_unittest.cc
index f3f9f344995..98c4d134b4a 100644
--- a/chromium/net/spdy/spdy_network_transaction_unittest.cc
+++ b/chromium/net/spdy/spdy_network_transaction_unittest.cc
@@ -10,7 +10,6 @@
#include "base/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/memory/scoped_vector.h"
-#include "base/run_loop.h"
#include "base/stl_util.h"
#include "net/base/auth.h"
#include "net/base/net_log_unittest.h"
@@ -81,13 +80,6 @@ class SpdyNetworkTransactionTest
SpdyNetworkTransactionTest() : spdy_util_(GetParam().protocol) {
}
- virtual ~SpdyNetworkTransactionTest() {
- // UploadDataStream posts deletion tasks back to the message loop on
- // destruction.
- upload_data_stream_.reset();
- base::RunLoop().RunUntilIdle();
- }
-
virtual void SetUp() {
google_get_request_initialized_ = false;
google_post_request_initialized_ = false;
@@ -95,6 +87,11 @@ class SpdyNetworkTransactionTest
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
}
+ virtual void TearDown() {
+ // Empty the current queue.
+ base::MessageLoop::current()->RunUntilIdle();
+ }
+
struct TransactionHelperResult {
int rv;
std::string status_line;
@@ -522,7 +519,7 @@ class SpdyNetworkTransactionTest
// reads until we complete our callback.
while (!callback.have_result()) {
data->CompleteRead();
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
}
rv = callback.WaitForResult();
} else if (rv <= 0) {
@@ -576,7 +573,7 @@ class SpdyNetworkTransactionTest
rv = trans2->Start(
&CreateGetPushRequest(), callback.callback(), BoundNetLog());
EXPECT_EQ(ERR_IO_PENDING, rv);
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
// The data for the pushed path may be coming in more than 1 frame. Compile
// the results into a single string.
@@ -1883,10 +1880,10 @@ TEST_P(SpdyNetworkTransactionTest, DelayedChunkedPost) {
helper.AddData(&data);
ASSERT_TRUE(helper.StartDefaultTest());
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
helper.request().upload_data_stream->AppendChunk(
kUploadData, kUploadDataSize, false);
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
helper.request().upload_data_stream->AppendChunk(
kUploadData, kUploadDataSize, true);
@@ -2255,7 +2252,7 @@ TEST_P(SpdyNetworkTransactionTest, CancelledTransaction) {
// Flush the MessageLoop while the SpdySessionDependencies (in particular, the
// MockClientSocketFactory) are still alive.
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
helper.VerifyDataNotConsumed();
}
@@ -2411,7 +2408,7 @@ TEST_P(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) {
data.CompleteRead();
// Finish running rest of tasks.
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
helper.VerifyDataConsumed();
}
@@ -2472,12 +2469,12 @@ TEST_P(SpdyNetworkTransactionTest, RedirectGetRequest) {
d.set_quit_on_redirect(true);
r.Start();
- base::RunLoop().Run();
+ base::MessageLoop::current()->Run();
EXPECT_EQ(1, d.received_redirect_count());
r.FollowDeferredRedirect();
- base::RunLoop().Run();
+ base::MessageLoop::current()->Run();
EXPECT_EQ(1, d.response_started_count());
EXPECT_FALSE(d.received_data_before_response());
EXPECT_EQ(net::URLRequestStatus::SUCCESS, r.status().status());
@@ -2562,7 +2559,7 @@ TEST_P(SpdyNetworkTransactionTest, RedirectServerPush) {
AddSocketDataProvider(&data);
r.Start();
- base::RunLoop().Run();
+ base::MessageLoop::current()->Run();
EXPECT_EQ(0, d.received_redirect_count());
std::string contents("hello!");
@@ -2575,11 +2572,11 @@ TEST_P(SpdyNetworkTransactionTest, RedirectServerPush) {
d2.set_quit_on_redirect(true);
r2.Start();
- base::RunLoop().Run();
+ base::MessageLoop::current()->Run();
EXPECT_EQ(1, d2.received_redirect_count());
r2.FollowDeferredRedirect();
- base::RunLoop().Run();
+ base::MessageLoop::current()->Run();
EXPECT_EQ(1, d2.response_started_count());
EXPECT_FALSE(d2.received_data_before_response());
EXPECT_EQ(net::URLRequestStatus::SUCCESS, r2.status().status());
@@ -3789,7 +3786,7 @@ TEST_P(SpdyNetworkTransactionTest, BufferFull) {
// Flush the MessageLoop while the SpdySessionDependencies (in particular, the
// MockClientSocketFactory) are still alive.
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
// Verify that we consumed all test data.
helper.VerifyDataConsumed();
@@ -3886,7 +3883,7 @@ TEST_P(SpdyNetworkTransactionTest, Buffering) {
// Flush the MessageLoop while the SpdySessionDependencies (in particular, the
// MockClientSocketFactory) are still alive.
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
// Verify that we consumed all test data.
helper.VerifyDataConsumed();
@@ -3980,7 +3977,7 @@ TEST_P(SpdyNetworkTransactionTest, BufferedAll) {
// Flush the MessageLoop while the SpdySessionDependencies (in particular, the
// MockClientSocketFactory) are still alive.
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
// Verify that we consumed all test data.
helper.VerifyDataConsumed();
@@ -4075,7 +4072,7 @@ TEST_P(SpdyNetworkTransactionTest, BufferedClosed) {
// Flush the MessageLoop while the SpdySessionDependencies (in particular, the
// MockClientSocketFactory) are still alive.
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
// Verify that we consumed all test data.
helper.VerifyDataConsumed();
@@ -4146,7 +4143,7 @@ TEST_P(SpdyNetworkTransactionTest, BufferedCancelled) {
// Flush the MessageLoop; this will cause the buffered IO task
// to run for the final time.
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
// Verify that we consumed all test data.
helper.VerifyDataConsumed();
@@ -4790,7 +4787,7 @@ TEST_P(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) {
if (variant == VARIANT_RST_DURING_READ_COMPLETION) {
// Writes to the socket complete asynchronously on SPDY by running
// through the message loop. Complete the write here.
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
}
// Now schedule the ERR_CONNECTION_RESET.
@@ -5105,7 +5102,7 @@ TEST_P(SpdyNetworkTransactionTest, ServerPushClaimBeforeHeaders) {
&CreateGetPushRequest(), callback.callback(), BoundNetLog());
EXPECT_EQ(ERR_IO_PENDING, rv);
data.RunFor(3);
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
// Read the server push body.
std::string result2;
@@ -5241,7 +5238,7 @@ TEST_P(SpdyNetworkTransactionTest, ServerPushWithTwoHeaderFrames) {
&CreateGetPushRequest(), callback.callback(), BoundNetLog());
EXPECT_EQ(ERR_IO_PENDING, rv);
data.RunFor(3);
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
// Read the server push body.
std::string result2;
@@ -5374,7 +5371,7 @@ TEST_P(SpdyNetworkTransactionTest, ServerPushWithNoStatusHeaderFrames) {
&CreateGetPushRequest(), callback.callback(), BoundNetLog());
EXPECT_EQ(ERR_IO_PENDING, rv);
data.RunFor(2);
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
// Read the server push body.
std::string result2;
@@ -5729,7 +5726,7 @@ TEST_P(SpdyNetworkTransactionTest, OutOfOrderSynStream) {
// Run the message loop, but do not allow the write to complete.
// This leaves the SpdySession with a write pending, which prevents
// SpdySession from attempting subsequent writes until this write completes.
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
// Now, start both new transactions
HttpRequestInfo info2 = CreateGetRequest();
@@ -5738,7 +5735,7 @@ TEST_P(SpdyNetworkTransactionTest, OutOfOrderSynStream) {
new HttpNetworkTransaction(MEDIUM, helper.session().get()));
rv = trans2->Start(&info2, callback2.callback(), BoundNetLog());
EXPECT_EQ(ERR_IO_PENDING, rv);
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
HttpRequestInfo info3 = CreateGetRequest();
TestCompletionCallback callback3;
@@ -5746,7 +5743,7 @@ TEST_P(SpdyNetworkTransactionTest, OutOfOrderSynStream) {
new HttpNetworkTransaction(HIGHEST, helper.session().get()));
rv = trans3->Start(&info3, callback3.callback(), BoundNetLog());
EXPECT_EQ(ERR_IO_PENDING, rv);
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
// We now have two SYN_STREAM frames queued up which will be
// dequeued only once the first write completes, which we
@@ -5958,7 +5955,7 @@ TEST_P(SpdyNetworkTransactionTest, WindowUpdateSent) {
// Force write of WINDOW_UPDATE which was scheduled during the above
// read.
- base::RunLoop().RunUntilIdle();
+ base::MessageLoop::current()->RunUntilIdle();
// Read EOF.
data.CompleteRead();
@@ -6142,7 +6139,7 @@ TEST_P(SpdyNetworkTransactionTest, FlowControlStallResume) {
int rv = trans->Start(&helper.request(), callback.callback(), BoundNetLog());
EXPECT_EQ(ERR_IO_PENDING, rv);
- base::RunLoop().RunUntilIdle(); // Write as much as we can.
+ base::MessageLoop::current()->RunUntilIdle(); // Write as much as we can.
SpdyHttpStream* stream = static_cast<SpdyHttpStream*>(trans->stream_.get());
ASSERT_TRUE(stream != NULL);
diff --git a/chromium/net/spdy/spdy_stream.cc b/chromium/net/spdy/spdy_stream.cc
index a603a6c93e0..18d20e8d3a4 100644
--- a/chromium/net/spdy/spdy_stream.cc
+++ b/chromium/net/spdy/spdy_stream.cc
@@ -740,7 +740,7 @@ int SpdyStream::DoGetDomainBoundCert() {
io_state_ = STATE_GET_DOMAIN_BOUND_CERT_COMPLETE;
ServerBoundCertService* sbc_service = session_->GetServerBoundCertService();
DCHECK(sbc_service != NULL);
- int rv = sbc_service->GetOrCreateDomainBoundCert(
+ int rv = sbc_service->GetDomainBoundCert(
url.GetOrigin().host(),
&domain_bound_private_key_,
&domain_bound_cert_,
diff --git a/chromium/net/spdy/spdy_test_util_common.cc b/chromium/net/spdy/spdy_test_util_common.cc
index 95466847b93..4383db0860a 100644
--- a/chromium/net/spdy/spdy_test_util_common.cc
+++ b/chromium/net/spdy/spdy_test_util_common.cc
@@ -649,8 +649,8 @@ base::WeakPtr<SpdySession> CreateFakeSpdySessionHelper(
EXPECT_FALSE(HasSpdySession(pool, key));
base::WeakPtr<SpdySession> spdy_session;
scoped_ptr<ClientSocketHandle> handle(new ClientSocketHandle());
- handle->SetSocket(scoped_ptr<StreamSocket>(new FakeSpdySessionClientSocket(
- expected_status == OK ? ERR_IO_PENDING : expected_status)));
+ handle->set_socket(new FakeSpdySessionClientSocket(
+ expected_status == OK ? ERR_IO_PENDING : expected_status));
EXPECT_EQ(
expected_status,
pool->CreateAvailableSessionFromSocket(
diff --git a/chromium/net/ssl/server_bound_cert_service.cc b/chromium/net/ssl/server_bound_cert_service.cc
index 2bbcbc79e6b..4bc82ed5d9b 100644
--- a/chromium/net/ssl/server_bound_cert_service.cc
+++ b/chromium/net/ssl/server_bound_cert_service.cc
@@ -43,8 +43,7 @@ const int kValidityPeriodInDays = 365;
const int kSystemTimeValidityBufferInDays = 90;
// Used by the GetDomainBoundCertResult histogram to record the final
-// outcome of each GetDomainBoundCert or GetOrCreateDomainBoundCert call.
-// Do not re-use values.
+// outcome of each GetDomainBoundCert call. Do not re-use values.
enum GetCertResult {
// Synchronously found and returned an existing domain bound cert.
SYNC_SUCCESS = 0,
@@ -58,8 +57,7 @@ enum GetCertResult {
ASYNC_FAILURE_CREATE_CERT = 4,
ASYNC_FAILURE_EXPORT_KEY = 5,
ASYNC_FAILURE_UNKNOWN = 6,
- // GetDomainBoundCert or GetOrCreateDomainBoundCert was called with
- // invalid arguments.
+ // GetDomainBoundCert was called with invalid arguments.
INVALID_ARGUMENT = 7,
// We don't support any of the cert types the server requested.
UNSUPPORTED_TYPE = 8,
@@ -279,18 +277,14 @@ class ServerBoundCertServiceWorker {
// origin message loop.
class ServerBoundCertServiceJob {
public:
- ServerBoundCertServiceJob(bool create_if_missing)
- : create_if_missing_(create_if_missing) {
- }
+ ServerBoundCertServiceJob() { }
~ServerBoundCertServiceJob() {
if (!requests_.empty())
DeleteAllCanceled();
}
- void AddRequest(ServerBoundCertServiceRequest* request,
- bool create_if_missing = false) {
- create_if_missing_ |= create_if_missing;
+ void AddRequest(ServerBoundCertServiceRequest* request) {
requests_.push_back(request);
}
@@ -300,8 +294,6 @@ class ServerBoundCertServiceJob {
PostAll(error, private_key, cert);
}
- bool CreateIfMissing() const { return create_if_missing_; }
-
private:
void PostAll(int error,
const std::string& private_key,
@@ -328,7 +320,6 @@ class ServerBoundCertServiceJob {
}
std::vector<ServerBoundCertServiceRequest*> requests_;
- bool create_if_missing_;
};
// static
@@ -397,7 +388,7 @@ std::string ServerBoundCertService::GetDomainForHost(const std::string& host) {
return domain;
}
-int ServerBoundCertService::GetOrCreateDomainBoundCert(
+int ServerBoundCertService::GetDomainBoundCert(
const std::string& host,
std::string* private_key,
std::string* cert,
@@ -420,15 +411,49 @@ int ServerBoundCertService::GetOrCreateDomainBoundCert(
requests_++;
- // See if a request for the same domain is currently in flight.
- bool create_if_missing = true;
- if (JoinToInFlightRequest(request_start, domain, private_key, cert,
- create_if_missing, callback, out_req)) {
+ // See if an identical request is currently in flight.
+ ServerBoundCertServiceJob* job = NULL;
+ std::map<std::string, ServerBoundCertServiceJob*>::const_iterator j;
+ j = inflight_.find(domain);
+ if (j != inflight_.end()) {
+ // An identical request is in flight already. We'll just attach our
+ // callback.
+ job = j->second;
+ inflight_joins_++;
+
+ ServerBoundCertServiceRequest* request = new ServerBoundCertServiceRequest(
+ request_start,
+ base::Bind(&RequestHandle::OnRequestComplete,
+ base::Unretained(out_req)),
+ private_key, cert);
+ job->AddRequest(request);
+ out_req->RequestStarted(this, request, callback);
return ERR_IO_PENDING;
}
- int err = LookupDomainBoundCert(request_start, domain, private_key, cert,
- create_if_missing, callback, out_req);
+ // Check if a domain bound cert of an acceptable type already exists for this
+ // domain. Note that |expiration_time| is ignored, and expired certs are
+ // considered valid.
+ base::Time expiration_time;
+ int err = server_bound_cert_store_->GetServerBoundCert(
+ domain,
+ &expiration_time /* ignored */,
+ private_key,
+ cert,
+ base::Bind(&ServerBoundCertService::GotServerBoundCert,
+ weak_ptr_factory_.GetWeakPtr()));
+
+ if (err == OK) {
+ // Sync lookup found a valid cert.
+ DVLOG(1) << "Cert store had valid cert for " << domain;
+ cert_store_hits_++;
+ RecordGetDomainBoundCertResult(SYNC_SUCCESS);
+ base::TimeDelta request_time = base::TimeTicks::Now() - request_start;
+ UMA_HISTOGRAM_TIMES("DomainBoundCerts.GetCertTimeSync", request_time);
+ RecordGetCertTime(request_time);
+ return OK;
+ }
+
if (err == ERR_FILE_NOT_FOUND) {
// Sync lookup did not find a valid cert. Start generating a new one.
workers_created_++;
@@ -442,17 +467,19 @@ int ServerBoundCertService::GetOrCreateDomainBoundCert(
RecordGetDomainBoundCertResult(WORKER_FAILURE);
return ERR_INSUFFICIENT_RESOURCES;
}
- // We are waiting for cert generation. Create a job & request to track it.
- ServerBoundCertServiceJob* job =
- new ServerBoundCertServiceJob(create_if_missing);
+ }
+
+ if (err == ERR_IO_PENDING || err == ERR_FILE_NOT_FOUND) {
+ // We are either waiting for async DB lookup, or waiting for cert
+ // generation. Create a job & request to track it.
+ job = new ServerBoundCertServiceJob();
inflight_[domain] = job;
ServerBoundCertServiceRequest* request = new ServerBoundCertServiceRequest(
request_start,
base::Bind(&RequestHandle::OnRequestComplete,
base::Unretained(out_req)),
- private_key,
- cert);
+ private_key, cert);
job->AddRequest(request);
out_req->RequestStarted(this, request, callback);
return ERR_IO_PENDING;
@@ -461,41 +488,6 @@ int ServerBoundCertService::GetOrCreateDomainBoundCert(
return err;
}
-int ServerBoundCertService::GetDomainBoundCert(
- const std::string& host,
- std::string* private_key,
- std::string* cert,
- const CompletionCallback& callback,
- RequestHandle* out_req) {
- DVLOG(1) << __FUNCTION__ << " " << host;
- DCHECK(CalledOnValidThread());
- base::TimeTicks request_start = base::TimeTicks::Now();
-
- if (callback.is_null() || !private_key || !cert || host.empty()) {
- RecordGetDomainBoundCertResult(INVALID_ARGUMENT);
- return ERR_INVALID_ARGUMENT;
- }
-
- std::string domain = GetDomainForHost(host);
- if (domain.empty()) {
- RecordGetDomainBoundCertResult(INVALID_ARGUMENT);
- return ERR_INVALID_ARGUMENT;
- }
-
- requests_++;
-
- // See if a request for the same domain currently in flight.
- bool create_if_missing = false;
- if (JoinToInFlightRequest(request_start, domain, private_key, cert,
- create_if_missing, callback, out_req)) {
- return ERR_IO_PENDING;
- }
-
- int err = LookupDomainBoundCert(request_start, domain, private_key, cert,
- create_if_missing, callback, out_req);
- return err;
-}
-
void ServerBoundCertService::GotServerBoundCert(
int err,
const std::string& server_identifier,
@@ -519,13 +511,7 @@ void ServerBoundCertService::GotServerBoundCert(
HandleResult(OK, server_identifier, key, cert);
return;
}
- // Async lookup did not find a valid cert. If no request asked to create one,
- // return the error directly.
- if (!j->second->CreateIfMissing()) {
- HandleResult(err, server_identifier, key, cert);
- return;
- }
- // At least one request asked to create a cert => start generating a new one.
+ // Async lookup did not find a valid cert. Start generating a new one.
workers_created_++;
ServerBoundCertServiceWorker* worker = new ServerBoundCertServiceWorker(
server_identifier,
@@ -538,6 +524,7 @@ void ServerBoundCertService::GotServerBoundCert(
server_identifier,
std::string(),
std::string());
+ return;
}
}
@@ -592,86 +579,6 @@ void ServerBoundCertService::HandleResult(
delete job;
}
-bool ServerBoundCertService::JoinToInFlightRequest(
- const base::TimeTicks& request_start,
- const std::string& domain,
- std::string* private_key,
- std::string* cert,
- bool create_if_missing,
- const CompletionCallback& callback,
- RequestHandle* out_req) {
- ServerBoundCertServiceJob* job = NULL;
- std::map<std::string, ServerBoundCertServiceJob*>::const_iterator j =
- inflight_.find(domain);
- if (j != inflight_.end()) {
- // A request for the same domain is in flight already. We'll attach our
- // callback, but we'll also mark it as requiring a cert if one's mising.
- job = j->second;
- inflight_joins_++;
-
- ServerBoundCertServiceRequest* request = new ServerBoundCertServiceRequest(
- request_start,
- base::Bind(&RequestHandle::OnRequestComplete,
- base::Unretained(out_req)),
- private_key,
- cert);
- job->AddRequest(request, create_if_missing);
- out_req->RequestStarted(this, request, callback);
- return true;
- }
- return false;
-}
-
-int ServerBoundCertService::LookupDomainBoundCert(
- const base::TimeTicks& request_start,
- const std::string& domain,
- std::string* private_key,
- std::string* cert,
- bool create_if_missing,
- const CompletionCallback& callback,
- RequestHandle* out_req) {
- // Check if a domain bound cert already exists for this domain. Note that
- // |expiration_time| is ignored, and expired certs are considered valid.
- base::Time expiration_time;
- int err = server_bound_cert_store_->GetServerBoundCert(
- domain,
- &expiration_time /* ignored */,
- private_key,
- cert,
- base::Bind(&ServerBoundCertService::GotServerBoundCert,
- weak_ptr_factory_.GetWeakPtr()));
-
- if (err == OK) {
- // Sync lookup found a valid cert.
- DVLOG(1) << "Cert store had valid cert for " << domain;
- cert_store_hits_++;
- RecordGetDomainBoundCertResult(SYNC_SUCCESS);
- base::TimeDelta request_time = base::TimeTicks::Now() - request_start;
- UMA_HISTOGRAM_TIMES("DomainBoundCerts.GetCertTimeSync", request_time);
- RecordGetCertTime(request_time);
- return OK;
- }
-
- if (err == ERR_IO_PENDING) {
- // We are waiting for async DB lookup. Create a job & request to track it.
- ServerBoundCertServiceJob* job =
- new ServerBoundCertServiceJob(create_if_missing);
- inflight_[domain] = job;
-
- ServerBoundCertServiceRequest* request = new ServerBoundCertServiceRequest(
- request_start,
- base::Bind(&RequestHandle::OnRequestComplete,
- base::Unretained(out_req)),
- private_key,
- cert);
- job->AddRequest(request);
- out_req->RequestStarted(this, request, callback);
- return ERR_IO_PENDING;
- }
-
- return err;
-}
-
int ServerBoundCertService::cert_count() {
return server_bound_cert_store_->GetCertCount();
}
diff --git a/chromium/net/ssl/server_bound_cert_service.h b/chromium/net/ssl/server_bound_cert_service.h
index 0dc7f4ae390..d931ec87082 100644
--- a/chromium/net/ssl/server_bound_cert_service.h
+++ b/chromium/net/ssl/server_bound_cert_service.h
@@ -106,31 +106,6 @@ class NET_EXPORT ServerBoundCertService
// |*out_req| will be initialized with a handle to the async request. This
// RequestHandle object must be cancelled or destroyed before the
// ServerBoundCertService is destroyed.
- int GetOrCreateDomainBoundCert(
- const std::string& host,
- std::string* private_key,
- std::string* cert,
- const CompletionCallback& callback,
- RequestHandle* out_req);
-
- // Fetches the domain bound cert for the specified host if one exists.
- // Returns OK if successful, ERR_FILE_NOT_FOUND if none exists, or an error
- // code upon failure.
- //
- // On successful completion, |private_key| stores a DER-encoded
- // PrivateKeyInfo struct, and |cert| stores a DER-encoded certificate.
- // The PrivateKeyInfo is always an ECDSA private key.
- //
- // |callback| must not be null. ERR_IO_PENDING is returned if the operation
- // could not be completed immediately, in which case the result code will
- // be passed to the callback when available. If an in-flight
- // GetDomainBoundCert is pending, and a new GetOrCreateDomainBoundCert
- // request arrives for the same domain, the GetDomainBoundCert request will
- // not complete until a new cert is created.
- //
- // |*out_req| will be initialized with a handle to the async request. This
- // RequestHandle object must be cancelled or destroyed before the
- // ServerBoundCertService is destroyed.
int GetDomainBoundCert(
const std::string& host,
std::string* private_key,
@@ -168,29 +143,6 @@ class NET_EXPORT ServerBoundCertService
const std::string& private_key,
const std::string& cert);
- // Searches for an in-flight request for the same domain. If found,
- // attaches to the request and returns true. Returns false if no in-flight
- // request is found.
- bool JoinToInFlightRequest(const base::TimeTicks& request_start,
- const std::string& domain,
- std::string* private_key,
- std::string* cert,
- bool create_if_missing,
- const CompletionCallback& callback,
- RequestHandle* out_req);
-
- // Looks for the domain bound cert for |domain| in this service's store.
- // Returns OK if it can be found synchronously, ERR_IO_PENDING if the
- // result cannot be obtained synchronously, or a network error code on
- // failure (including failure to find a domain-bound cert of |domain|).
- int LookupDomainBoundCert(const base::TimeTicks& request_start,
- const std::string& domain,
- std::string* private_key,
- std::string* cert,
- bool create_if_missing,
- const CompletionCallback& callback,
- RequestHandle* out_req);
-
scoped_ptr<ServerBoundCertStore> server_bound_cert_store_;
scoped_refptr<base::TaskRunner> task_runner_;
diff --git a/chromium/net/ssl/server_bound_cert_service_unittest.cc b/chromium/net/ssl/server_bound_cert_service_unittest.cc
index b8ca1fa54d0..d7b8553b5ac 100644
--- a/chromium/net/ssl/server_bound_cert_service_unittest.cc
+++ b/chromium/net/ssl/server_bound_cert_service_unittest.cc
@@ -136,24 +136,6 @@ TEST_F(ServerBoundCertServiceTest, GetDomainForHost) {
// See http://crbug.com/91512 - implement OpenSSL version of CreateSelfSigned.
#if !defined(USE_OPENSSL)
-TEST_F(ServerBoundCertServiceTest, GetCacheMiss) {
- std::string host("encrypted.google.com");
-
- int error;
- TestCompletionCallback callback;
- ServerBoundCertService::RequestHandle request_handle;
-
- // Synchronous completion, because the store is initialized.
- std::string private_key, der_cert;
- EXPECT_EQ(0, service_->cert_count());
- error = service_->GetDomainBoundCert(
- host, &private_key, &der_cert, callback.callback(), &request_handle);
- EXPECT_EQ(ERR_FILE_NOT_FOUND, error);
- EXPECT_FALSE(request_handle.is_active());
- EXPECT_EQ(0, service_->cert_count());
- EXPECT_TRUE(der_cert.empty());
-}
-
TEST_F(ServerBoundCertServiceTest, CacheHit) {
std::string host("encrypted.google.com");
@@ -164,7 +146,7 @@ TEST_F(ServerBoundCertServiceTest, CacheHit) {
// Asynchronous completion.
std::string private_key_info1, der_cert1;
EXPECT_EQ(0, service_->cert_count());
- error = service_->GetOrCreateDomainBoundCert(
+ error = service_->GetDomainBoundCert(
host, &private_key_info1, &der_cert1,
callback.callback(), &request_handle);
EXPECT_EQ(ERR_IO_PENDING, error);
@@ -178,7 +160,7 @@ TEST_F(ServerBoundCertServiceTest, CacheHit) {
// Synchronous completion.
std::string private_key_info2, der_cert2;
- error = service_->GetOrCreateDomainBoundCert(
+ error = service_->GetDomainBoundCert(
host, &private_key_info2, &der_cert2,
callback.callback(), &request_handle);
EXPECT_FALSE(request_handle.is_active());
@@ -187,19 +169,8 @@ TEST_F(ServerBoundCertServiceTest, CacheHit) {
EXPECT_EQ(private_key_info1, private_key_info2);
EXPECT_EQ(der_cert1, der_cert2);
- // Synchronous get.
- std::string private_key_info3, der_cert3;
- error = service_->GetDomainBoundCert(
- host, &private_key_info3, &der_cert3, callback.callback(),
- &request_handle);
- EXPECT_FALSE(request_handle.is_active());
- EXPECT_EQ(OK, error);
- EXPECT_EQ(1, service_->cert_count());
- EXPECT_EQ(der_cert1, der_cert3);
- EXPECT_EQ(private_key_info1, private_key_info3);
-
- EXPECT_EQ(3u, service_->requests());
- EXPECT_EQ(2u, service_->cert_store_hits());
+ EXPECT_EQ(2u, service_->requests());
+ EXPECT_EQ(1u, service_->cert_store_hits());
EXPECT_EQ(0u, service_->inflight_joins());
}
@@ -211,7 +182,7 @@ TEST_F(ServerBoundCertServiceTest, StoreCerts) {
std::string host1("encrypted.google.com");
std::string private_key_info1, der_cert1;
EXPECT_EQ(0, service_->cert_count());
- error = service_->GetOrCreateDomainBoundCert(
+ error = service_->GetDomainBoundCert(
host1, &private_key_info1, &der_cert1,
callback.callback(), &request_handle);
EXPECT_EQ(ERR_IO_PENDING, error);
@@ -222,7 +193,7 @@ TEST_F(ServerBoundCertServiceTest, StoreCerts) {
std::string host2("www.verisign.com");
std::string private_key_info2, der_cert2;
- error = service_->GetOrCreateDomainBoundCert(
+ error = service_->GetDomainBoundCert(
host2, &private_key_info2, &der_cert2,
callback.callback(), &request_handle);
EXPECT_EQ(ERR_IO_PENDING, error);
@@ -233,7 +204,7 @@ TEST_F(ServerBoundCertServiceTest, StoreCerts) {
std::string host3("www.twitter.com");
std::string private_key_info3, der_cert3;
- error = service_->GetOrCreateDomainBoundCert(
+ error = service_->GetDomainBoundCert(
host3, &private_key_info3, &der_cert3,
callback.callback(), &request_handle);
EXPECT_EQ(ERR_IO_PENDING, error);
@@ -263,13 +234,13 @@ TEST_F(ServerBoundCertServiceTest, InflightJoin) {
TestCompletionCallback callback2;
ServerBoundCertService::RequestHandle request_handle2;
- error = service_->GetOrCreateDomainBoundCert(
+ error = service_->GetDomainBoundCert(
host, &private_key_info1, &der_cert1,
callback1.callback(), &request_handle1);
EXPECT_EQ(ERR_IO_PENDING, error);
EXPECT_TRUE(request_handle1.is_active());
// Should join with the original request.
- error = service_->GetOrCreateDomainBoundCert(
+ error = service_->GetDomainBoundCert(
host, &private_key_info2, &der_cert2,
callback2.callback(), &request_handle2);
EXPECT_EQ(ERR_IO_PENDING, error);
@@ -283,45 +254,6 @@ TEST_F(ServerBoundCertServiceTest, InflightJoin) {
EXPECT_EQ(2u, service_->requests());
EXPECT_EQ(0u, service_->cert_store_hits());
EXPECT_EQ(1u, service_->inflight_joins());
- EXPECT_EQ(1u, service_->workers_created());
-}
-
-// Tests an inflight join of a Get request to a GetOrCreate request.
-TEST_F(ServerBoundCertServiceTest, InflightJoinGetOrCreateAndGet) {
- std::string host("encrypted.google.com");
- int error;
-
- std::string private_key_info1, der_cert1;
- TestCompletionCallback callback1;
- ServerBoundCertService::RequestHandle request_handle1;
-
- std::string private_key_info2;
- std::string der_cert2;
- TestCompletionCallback callback2;
- ServerBoundCertService::RequestHandle request_handle2;
-
- error = service_->GetOrCreateDomainBoundCert(
- host, &private_key_info1, &der_cert1,
- callback1.callback(), &request_handle1);
- EXPECT_EQ(ERR_IO_PENDING, error);
- EXPECT_TRUE(request_handle1.is_active());
- // Should join with the original request.
- error = service_->GetDomainBoundCert(
- host, &private_key_info2, &der_cert2, callback2.callback(),
- &request_handle2);
- EXPECT_EQ(ERR_IO_PENDING, error);
- EXPECT_TRUE(request_handle2.is_active());
-
- error = callback1.WaitForResult();
- EXPECT_EQ(OK, error);
- error = callback2.WaitForResult();
- EXPECT_EQ(OK, error);
- EXPECT_EQ(der_cert1, der_cert2);
-
- EXPECT_EQ(2u, service_->requests());
- EXPECT_EQ(0u, service_->cert_store_hits());
- EXPECT_EQ(1u, service_->inflight_joins());
- EXPECT_EQ(1u, service_->workers_created());
}
TEST_F(ServerBoundCertServiceTest, ExtractValuesFromBytesEC) {
@@ -331,7 +263,7 @@ TEST_F(ServerBoundCertServiceTest, ExtractValuesFromBytesEC) {
TestCompletionCallback callback;
ServerBoundCertService::RequestHandle request_handle;
- error = service_->GetOrCreateDomainBoundCert(
+ error = service_->GetDomainBoundCert(
host, &private_key_info, &der_cert, callback.callback(),
&request_handle);
EXPECT_EQ(ERR_IO_PENDING, error);
@@ -365,11 +297,11 @@ TEST_F(ServerBoundCertServiceTest, CancelRequest) {
int error;
ServerBoundCertService::RequestHandle request_handle;
- error = service_->GetOrCreateDomainBoundCert(host,
- &private_key_info,
- &der_cert,
- base::Bind(&FailTest),
- &request_handle);
+ error = service_->GetDomainBoundCert(host,
+ &private_key_info,
+ &der_cert,
+ base::Bind(&FailTest),
+ &request_handle);
EXPECT_EQ(ERR_IO_PENDING, error);
EXPECT_TRUE(request_handle.is_active());
request_handle.Cancel();
@@ -394,11 +326,11 @@ TEST_F(ServerBoundCertServiceTest, CancelRequestByHandleDestruction) {
{
ServerBoundCertService::RequestHandle request_handle;
- error = service_->GetOrCreateDomainBoundCert(host,
- &private_key_info,
- &der_cert,
- base::Bind(&FailTest),
- &request_handle);
+ error = service_->GetDomainBoundCert(host,
+ &private_key_info,
+ &der_cert,
+ base::Bind(&FailTest),
+ &request_handle);
EXPECT_EQ(ERR_IO_PENDING, error);
EXPECT_TRUE(request_handle.is_active());
}
@@ -420,11 +352,11 @@ TEST_F(ServerBoundCertServiceTest, DestructionWithPendingRequest) {
int error;
ServerBoundCertService::RequestHandle request_handle;
- error = service_->GetOrCreateDomainBoundCert(host,
- &private_key_info,
- &der_cert,
- base::Bind(&FailTest),
- &request_handle);
+ error = service_->GetDomainBoundCert(host,
+ &private_key_info,
+ &der_cert,
+ base::Bind(&FailTest),
+ &request_handle);
EXPECT_EQ(ERR_IO_PENDING, error);
EXPECT_TRUE(request_handle.is_active());
@@ -459,11 +391,11 @@ TEST_F(ServerBoundCertServiceTest, RequestAfterPoolShutdown) {
int error;
ServerBoundCertService::RequestHandle request_handle;
- error = service_->GetOrCreateDomainBoundCert(host,
- &private_key_info,
- &der_cert,
- base::Bind(&FailTest),
- &request_handle);
+ error = service_->GetDomainBoundCert(host,
+ &private_key_info,
+ &der_cert,
+ base::Bind(&FailTest),
+ &request_handle);
// If we got here without crashing or a valgrind error, it worked.
ASSERT_EQ(ERR_INSUFFICIENT_RESOURCES, error);
EXPECT_FALSE(request_handle.is_active());
@@ -488,27 +420,27 @@ TEST_F(ServerBoundCertServiceTest, SimultaneousCreation) {
TestCompletionCallback callback3;
ServerBoundCertService::RequestHandle request_handle3;
- error = service_->GetOrCreateDomainBoundCert(host1,
- &private_key_info1,
- &der_cert1,
- callback1.callback(),
- &request_handle1);
+ error = service_->GetDomainBoundCert(host1,
+ &private_key_info1,
+ &der_cert1,
+ callback1.callback(),
+ &request_handle1);
EXPECT_EQ(ERR_IO_PENDING, error);
EXPECT_TRUE(request_handle1.is_active());
- error = service_->GetOrCreateDomainBoundCert(host2,
- &private_key_info2,
- &der_cert2,
- callback2.callback(),
- &request_handle2);
+ error = service_->GetDomainBoundCert(host2,
+ &private_key_info2,
+ &der_cert2,
+ callback2.callback(),
+ &request_handle2);
EXPECT_EQ(ERR_IO_PENDING, error);
EXPECT_TRUE(request_handle2.is_active());
- error = service_->GetOrCreateDomainBoundCert(host3,
- &private_key_info3,
- &der_cert3,
- callback3.callback(),
- &request_handle3);
+ error = service_->GetDomainBoundCert(host3,
+ &private_key_info3,
+ &der_cert3,
+ callback3.callback(),
+ &request_handle3);
EXPECT_EQ(ERR_IO_PENDING, error);
EXPECT_TRUE(request_handle3.is_active());
@@ -560,7 +492,7 @@ TEST_F(ServerBoundCertServiceTest, Expiration) {
// Cert is valid - synchronous completion.
std::string private_key_info1, der_cert1;
- error = service_->GetOrCreateDomainBoundCert(
+ error = service_->GetDomainBoundCert(
"good", &private_key_info1, &der_cert1,
callback.callback(), &request_handle);
EXPECT_EQ(OK, error);
@@ -571,7 +503,7 @@ TEST_F(ServerBoundCertServiceTest, Expiration) {
// Expired cert is valid as well - synchronous completion.
std::string private_key_info2, der_cert2;
- error = service_->GetOrCreateDomainBoundCert(
+ error = service_->GetDomainBoundCert(
"expired", &private_key_info2, &der_cert2,
callback.callback(), &request_handle);
EXPECT_EQ(OK, error);
@@ -581,7 +513,7 @@ TEST_F(ServerBoundCertServiceTest, Expiration) {
EXPECT_STREQ("d", der_cert2.c_str());
}
-TEST_F(ServerBoundCertServiceTest, AsyncStoreGetOrCreateNoCertsInStore) {
+TEST_F(ServerBoundCertServiceTest, AsyncStoreGetNoCertsInStore) {
MockServerBoundCertStoreWithAsyncGet* mock_store =
new MockServerBoundCertStoreWithAsyncGet();
service_ = scoped_ptr<ServerBoundCertService>(
@@ -596,7 +528,7 @@ TEST_F(ServerBoundCertServiceTest, AsyncStoreGetOrCreateNoCertsInStore) {
// Asynchronous completion with no certs in the store.
std::string private_key_info, der_cert;
EXPECT_EQ(0, service_->cert_count());
- error = service_->GetOrCreateDomainBoundCert(
+ error = service_->GetDomainBoundCert(
host, &private_key_info, &der_cert, callback.callback(), &request_handle);
EXPECT_EQ(ERR_IO_PENDING, error);
EXPECT_TRUE(request_handle.is_active());
@@ -612,38 +544,7 @@ TEST_F(ServerBoundCertServiceTest, AsyncStoreGetOrCreateNoCertsInStore) {
EXPECT_FALSE(request_handle.is_active());
}
-TEST_F(ServerBoundCertServiceTest, AsyncStoreGetNoCertsInStore) {
- MockServerBoundCertStoreWithAsyncGet* mock_store =
- new MockServerBoundCertStoreWithAsyncGet();
- service_ = scoped_ptr<ServerBoundCertService>(
- new ServerBoundCertService(mock_store, sequenced_worker_pool_));
-
- std::string host("encrypted.google.com");
-
- int error;
- TestCompletionCallback callback;
- ServerBoundCertService::RequestHandle request_handle;
-
- // Asynchronous completion with no certs in the store.
- std::string private_key, der_cert;
- EXPECT_EQ(0, service_->cert_count());
- error = service_->GetDomainBoundCert(
- host, &private_key, &der_cert, callback.callback(), &request_handle);
- EXPECT_EQ(ERR_IO_PENDING, error);
- EXPECT_TRUE(request_handle.is_active());
-
- mock_store->CallGetServerBoundCertCallbackWithResult(
- ERR_FILE_NOT_FOUND, base::Time(), std::string(), std::string());
-
- error = callback.WaitForResult();
- EXPECT_EQ(ERR_FILE_NOT_FOUND, error);
- EXPECT_EQ(0, service_->cert_count());
- EXPECT_EQ(0u, service_->workers_created());
- EXPECT_TRUE(der_cert.empty());
- EXPECT_FALSE(request_handle.is_active());
-}
-
-TEST_F(ServerBoundCertServiceTest, AsyncStoreGetOrCreateOneCertInStore) {
+TEST_F(ServerBoundCertServiceTest, AsyncStoreGetOneCertInStore) {
MockServerBoundCertStoreWithAsyncGet* mock_store =
new MockServerBoundCertStoreWithAsyncGet();
service_ = scoped_ptr<ServerBoundCertService>(
@@ -658,7 +559,7 @@ TEST_F(ServerBoundCertServiceTest, AsyncStoreGetOrCreateOneCertInStore) {
// Asynchronous completion with a cert in the store.
std::string private_key_info, der_cert;
EXPECT_EQ(0, service_->cert_count());
- error = service_->GetOrCreateDomainBoundCert(
+ error = service_->GetDomainBoundCert(
host, &private_key_info, &der_cert, callback.callback(), &request_handle);
EXPECT_EQ(ERR_IO_PENDING, error);
EXPECT_TRUE(request_handle.is_active());
@@ -679,94 +580,6 @@ TEST_F(ServerBoundCertServiceTest, AsyncStoreGetOrCreateOneCertInStore) {
EXPECT_FALSE(request_handle.is_active());
}
-TEST_F(ServerBoundCertServiceTest, AsyncStoreGetOneCertInStore) {
- MockServerBoundCertStoreWithAsyncGet* mock_store =
- new MockServerBoundCertStoreWithAsyncGet();
- service_ = scoped_ptr<ServerBoundCertService>(
- new ServerBoundCertService(mock_store, sequenced_worker_pool_));
-
- std::string host("encrypted.google.com");
-
- int error;
- TestCompletionCallback callback;
- ServerBoundCertService::RequestHandle request_handle;
-
- // Asynchronous completion with a cert in the store.
- std::string private_key, der_cert;
- EXPECT_EQ(0, service_->cert_count());
- error = service_->GetDomainBoundCert(
- host, &private_key, &der_cert, callback.callback(), &request_handle);
- EXPECT_EQ(ERR_IO_PENDING, error);
- EXPECT_TRUE(request_handle.is_active());
-
- mock_store->CallGetServerBoundCertCallbackWithResult(
- OK, base::Time(), "ab", "cd");
-
- error = callback.WaitForResult();
- EXPECT_EQ(OK, error);
- EXPECT_EQ(1, service_->cert_count());
- EXPECT_EQ(1u, service_->requests());
- EXPECT_EQ(1u, service_->cert_store_hits());
- // Because the cert was found in the store, no new workers should have been
- // created.
- EXPECT_EQ(0u, service_->workers_created());
- EXPECT_STREQ("cd", der_cert.c_str());
- EXPECT_FALSE(request_handle.is_active());
-}
-
-TEST_F(ServerBoundCertServiceTest, AsyncStoreGetThenCreateNoCertsInStore) {
- MockServerBoundCertStoreWithAsyncGet* mock_store =
- new MockServerBoundCertStoreWithAsyncGet();
- service_ = scoped_ptr<ServerBoundCertService>(
- new ServerBoundCertService(mock_store, sequenced_worker_pool_));
-
- std::string host("encrypted.google.com");
-
- int error;
-
- // Asynchronous get with no certs in the store.
- TestCompletionCallback callback1;
- ServerBoundCertService::RequestHandle request_handle1;
- std::string private_key1, der_cert1;
- EXPECT_EQ(0, service_->cert_count());
- error = service_->GetDomainBoundCert(
- host, &private_key1, &der_cert1, callback1.callback(), &request_handle1);
- EXPECT_EQ(ERR_IO_PENDING, error);
- EXPECT_TRUE(request_handle1.is_active());
-
- // Asynchronous get/create with no certs in the store.
- TestCompletionCallback callback2;
- ServerBoundCertService::RequestHandle request_handle2;
- std::string private_key2, der_cert2;
- EXPECT_EQ(0, service_->cert_count());
- error = service_->GetOrCreateDomainBoundCert(
- host, &private_key2, &der_cert2, callback2.callback(), &request_handle2);
- EXPECT_EQ(ERR_IO_PENDING, error);
- EXPECT_TRUE(request_handle2.is_active());
-
- mock_store->CallGetServerBoundCertCallbackWithResult(
- ERR_FILE_NOT_FOUND, base::Time(), std::string(), std::string());
-
- // Even though the first request didn't ask to create a cert, it gets joined
- // by the second, which does, so both succeed.
- error = callback1.WaitForResult();
- EXPECT_EQ(OK, error);
- error = callback2.WaitForResult();
- EXPECT_EQ(OK, error);
-
- // One cert is created, one request is joined.
- EXPECT_EQ(2U, service_->requests());
- EXPECT_EQ(1, service_->cert_count());
- EXPECT_EQ(1u, service_->workers_created());
- EXPECT_EQ(1u, service_->inflight_joins());
- EXPECT_FALSE(der_cert1.empty());
- EXPECT_EQ(der_cert1, der_cert2);
- EXPECT_FALSE(private_key1.empty());
- EXPECT_EQ(private_key1, private_key2);
- EXPECT_FALSE(request_handle1.is_active());
- EXPECT_FALSE(request_handle2.is_active());
-}
-
#endif // !defined(USE_OPENSSL)
} // namespace
diff --git a/chromium/net/ssl/ssl_config_service.cc b/chromium/net/ssl/ssl_config_service.cc
index a2c34a26852..265b43c10e5 100644
--- a/chromium/net/ssl/ssl_config_service.cc
+++ b/chromium/net/ssl/ssl_config_service.cc
@@ -42,7 +42,7 @@ SSLConfig::SSLConfig()
version_max(g_default_version_max),
cached_info_enabled(false),
channel_id_enabled(true),
- false_start_enabled(true),
+ false_start_enabled(false),
unrestricted_ssl3_fallback_enabled(false),
send_client_cert(false),
verify_ev_cert(false),
diff --git a/chromium/net/third_party/nss/README.chromium b/chromium/net/third_party/nss/README.chromium
index 11a85102d93..69b7eb77316 100644
--- a/chromium/net/third_party/nss/README.chromium
+++ b/chromium/net/third_party/nss/README.chromium
@@ -74,8 +74,6 @@ Patches:
NSS that doesn't contain the CBC constant-time changes.
patches/cbc.patch
https://code.google.com/p/chromium/issues/detail?id=172658#c12
- TODO(wtc): remove this patch now that NSS 3.14.3 is the minimum
- compile-time and run-time version.
* Change ssl3_SuiteBOnly to always return PR_TRUE. The softoken in NSS
versions older than 3.15 report an EC key size range of 112 bits to 571
@@ -99,13 +97,10 @@ Patches:
https://bugzilla.mozilla.org/show_bug.cgi?id=903565
patches/sslsock_903565.patch
- * Implement the AES GCM cipher suites.
- https://bugzilla.mozilla.org/show_bug.cgi?id=880543
- patches/aesgcm.patch
-
- * Add Chromium-specific code to detect AES GCM support in the system NSS
- libraries at run time.
- patches/aesgcmchromium.patch
+ * Prefer to generate SHA-1 signatures for TLS 1.2 client authentication if
+ the client private key is in a CAPI service provider on Windows or if the
+ client private key is a 1024-bit RSA or DSA key.
+ patches/tls12backuphash.patch
Apply the patches to NSS by running the patches/applypatches.sh script. Read
the comments at the top of patches/applypatches.sh for instructions.
diff --git a/chromium/net/third_party/nss/patches/aesgcm.patch b/chromium/net/third_party/nss/patches/aesgcm.patch
deleted file mode 100644
index 8de0a69d718..00000000000
--- a/chromium/net/third_party/nss/patches/aesgcm.patch
+++ /dev/null
@@ -1,1179 +0,0 @@
-Index: net/third_party/nss/ssl/sslinfo.c
-===================================================================
---- net/third_party/nss/ssl/sslinfo.c (revision 215189)
-+++ net/third_party/nss/ssl/sslinfo.c (working copy)
-@@ -109,7 +109,7 @@
- #define K_ECDHE "ECDHE", kt_ecdh
-
- #define C_SEED "SEED", calg_seed
--#define C_CAMELLIA "CAMELLIA", calg_camellia
-+#define C_CAMELLIA "CAMELLIA", calg_camellia
- #define C_AES "AES", calg_aes
- #define C_RC4 "RC4", calg_rc4
- #define C_RC2 "RC2", calg_rc2
-@@ -117,6 +117,7 @@
- #define C_3DES "3DES", calg_3des
- #define C_NULL "NULL", calg_null
- #define C_SJ "SKIPJACK", calg_sj
-+#define C_AESGCM "AES-GCM", calg_aes_gcm
-
- #define B_256 256, 256, 256
- #define B_128 128, 128, 128
-@@ -130,9 +131,12 @@
- #define M_SHA256 "SHA256", ssl_hmac_sha256, 256
- #define M_SHA "SHA1", ssl_mac_sha, 160
- #define M_MD5 "MD5", ssl_mac_md5, 128
-+#define M_NULL "NULL", ssl_mac_null, 0
-
- static const SSLCipherSuiteInfo suiteInfo[] = {
- /* <------ Cipher suite --------------------> <auth> <KEA> <bulk cipher> <MAC> <FIPS> */
-+{0,CS(TLS_RSA_WITH_AES_128_GCM_SHA256), S_RSA, K_RSA, C_AESGCM, B_128, M_NULL, 1, 0, 0, },
-+
- {0,CS(TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA), S_RSA, K_DHE, C_CAMELLIA, B_256, M_SHA, 0, 0, 0, },
- {0,CS(TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA), S_DSA, K_DHE, C_CAMELLIA, B_256, M_SHA, 0, 0, 0, },
- {0,CS(TLS_DHE_RSA_WITH_AES_256_CBC_SHA256), S_RSA, K_DHE, C_AES, B_256, M_SHA256, 1, 0, 0, },
-@@ -146,6 +150,7 @@
- {0,CS(TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA), S_DSA, K_DHE, C_CAMELLIA, B_128, M_SHA, 0, 0, 0, },
- {0,CS(TLS_DHE_DSS_WITH_RC4_128_SHA), S_DSA, K_DHE, C_RC4, B_128, M_SHA, 0, 0, 0, },
- {0,CS(TLS_DHE_RSA_WITH_AES_128_CBC_SHA256), S_RSA, K_DHE, C_AES, B_128, M_SHA256, 1, 0, 0, },
-+{0,CS(TLS_DHE_RSA_WITH_AES_128_GCM_SHA256), S_RSA, K_DHE, C_AESGCM, B_128, M_NULL, 1, 0, 0, },
- {0,CS(TLS_DHE_RSA_WITH_AES_128_CBC_SHA), S_RSA, K_DHE, C_AES, B_128, M_SHA, 1, 0, 0, },
- {0,CS(TLS_DHE_DSS_WITH_AES_128_CBC_SHA), S_DSA, K_DHE, C_AES, B_128, M_SHA, 1, 0, 0, },
- {0,CS(TLS_RSA_WITH_SEED_CBC_SHA), S_RSA, K_RSA, C_SEED,B_128, M_SHA, 1, 0, 0, },
-@@ -175,6 +180,9 @@
-
- #ifdef NSS_ENABLE_ECC
- /* ECC cipher suites */
-+{0,CS(TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256), S_RSA, K_ECDHE, C_AESGCM, B_128, M_NULL, 1, 0, 0, },
-+{0,CS(TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256), S_ECDSA, K_ECDHE, C_AESGCM, B_128, M_NULL, 1, 0, 0, },
-+
- {0,CS(TLS_ECDH_ECDSA_WITH_NULL_SHA), S_ECDSA, K_ECDH, C_NULL, B_0, M_SHA, 0, 0, 0, },
- {0,CS(TLS_ECDH_ECDSA_WITH_RC4_128_SHA), S_ECDSA, K_ECDH, C_RC4, B_128, M_SHA, 0, 0, 0, },
- {0,CS(TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA), S_ECDSA, K_ECDH, C_3DES, B_3DES, M_SHA, 1, 0, 0, },
-Index: net/third_party/nss/ssl/sslimpl.h
-===================================================================
---- net/third_party/nss/ssl/sslimpl.h (revision 215189)
-+++ net/third_party/nss/ssl/sslimpl.h (working copy)
-@@ -64,6 +64,7 @@
- #define calg_aes ssl_calg_aes
- #define calg_camellia ssl_calg_camellia
- #define calg_seed ssl_calg_seed
-+#define calg_aes_gcm ssl_calg_aes_gcm
-
- #define mac_null ssl_mac_null
- #define mac_md5 ssl_mac_md5
-@@ -290,9 +291,9 @@
- } ssl3CipherSuiteCfg;
-
- #ifdef NSS_ENABLE_ECC
--#define ssl_V3_SUITES_IMPLEMENTED 57
-+#define ssl_V3_SUITES_IMPLEMENTED 61
- #else
--#define ssl_V3_SUITES_IMPLEMENTED 35
-+#define ssl_V3_SUITES_IMPLEMENTED 37
- #endif /* NSS_ENABLE_ECC */
-
- #define MAX_DTLS_SRTP_CIPHER_SUITES 4
-@@ -440,20 +441,6 @@
- #define GS_DATA 3
- #define GS_PAD 4
-
--typedef SECStatus (*SSLCipher)(void * context,
-- unsigned char * out,
-- int * outlen,
-- int maxout,
-- const unsigned char *in,
-- int inlen);
--typedef SECStatus (*SSLCompressor)(void * context,
-- unsigned char * out,
-- int * outlen,
-- int maxout,
-- const unsigned char *in,
-- int inlen);
--typedef SECStatus (*SSLDestroy)(void *context, PRBool freeit);
--
- #if defined(NSS_PLATFORM_CLIENT_AUTH) && defined(XP_WIN32)
- typedef PCERT_KEY_CONTEXT PlatformKey;
- #elif defined(NSS_PLATFORM_CLIENT_AUTH) && defined(XP_MACOSX)
-@@ -485,11 +472,12 @@
- cipher_camellia_128,
- cipher_camellia_256,
- cipher_seed,
-+ cipher_aes_128_gcm,
- cipher_missing /* reserved for no such supported cipher */
- /* This enum must match ssl3_cipherName[] in ssl3con.c. */
- } SSL3BulkCipher;
-
--typedef enum { type_stream, type_block } CipherType;
-+typedef enum { type_stream, type_block, type_aead } CipherType;
-
- #define MAX_IV_LENGTH 24
-
-@@ -531,6 +519,31 @@
- PRUint64 cipher_context[MAX_CIPHER_CONTEXT_LLONGS];
- } ssl3KeyMaterial;
-
-+typedef SECStatus (*SSLCipher)(void * context,
-+ unsigned char * out,
-+ int * outlen,
-+ int maxout,
-+ const unsigned char *in,
-+ int inlen);
-+typedef SECStatus (*SSLAEADCipher)(
-+ ssl3KeyMaterial * keys,
-+ PRBool doDecrypt,
-+ unsigned char * out,
-+ int * outlen,
-+ int maxout,
-+ const unsigned char *in,
-+ int inlen,
-+ SSL3ContentType type,
-+ SSL3ProtocolVersion version,
-+ SSL3SequenceNumber seqnum);
-+typedef SECStatus (*SSLCompressor)(void * context,
-+ unsigned char * out,
-+ int * outlen,
-+ int maxout,
-+ const unsigned char *in,
-+ int inlen);
-+typedef SECStatus (*SSLDestroy)(void *context, PRBool freeit);
-+
- /* The DTLS anti-replay window. Defined here because we need it in
- * the cipher spec. Note that this is a ring buffer but left and
- * right represent the true window, with modular arithmetic used to
-@@ -557,6 +570,7 @@
- int mac_size;
- SSLCipher encode;
- SSLCipher decode;
-+ SSLAEADCipher aead;
- SSLDestroy destroy;
- void * encodeContext;
- void * decodeContext;
-@@ -706,8 +720,6 @@
- PRBool tls_keygen;
- } ssl3KEADef;
-
--typedef enum { kg_null, kg_strong, kg_export } SSL3KeyGenMode;
--
- /*
- ** There are tables of these, all const.
- */
-@@ -719,7 +731,8 @@
- CipherType type;
- int iv_size;
- int block_size;
-- SSL3KeyGenMode keygen_mode;
-+ int tag_size; /* authentication tag size for AEAD ciphers. */
-+ int explicit_nonce_size; /* for AEAD ciphers. */
- };
-
- /*
-Index: net/third_party/nss/ssl/ssl3ecc.c
-===================================================================
---- net/third_party/nss/ssl/ssl3ecc.c (revision 215189)
-+++ net/third_party/nss/ssl/ssl3ecc.c (working copy)
-@@ -911,6 +911,7 @@
- TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
-+ TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
- TLS_ECDHE_ECDSA_WITH_NULL_SHA,
- TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
-@@ -921,6 +922,7 @@
- TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
-+ TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
- TLS_ECDHE_RSA_WITH_NULL_SHA,
- TLS_ECDHE_RSA_WITH_RC4_128_SHA,
-@@ -932,12 +934,14 @@
- TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
-+ TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
- TLS_ECDHE_ECDSA_WITH_NULL_SHA,
- TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
- TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
-+ TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
- TLS_ECDHE_RSA_WITH_NULL_SHA,
- TLS_ECDHE_RSA_WITH_RC4_128_SHA,
-Index: net/third_party/nss/ssl/sslsock.c
-===================================================================
---- net/third_party/nss/ssl/sslsock.c (revision 215189)
-+++ net/third_party/nss/ssl/sslsock.c (working copy)
-@@ -67,8 +67,10 @@
- { TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_DHE_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
-+ { TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_RSA_WITH_AES_128_CBC_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
-+ { TLS_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_DHE_DSS_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_DHE_RSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
-@@ -94,6 +96,7 @@
- { TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
-+ { TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_ECDH_RSA_WITH_NULL_SHA, SSL_ALLOWED, SSL_ALLOWED },
- { TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
-@@ -105,6 +108,7 @@
- { TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
-+ { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- #endif /* NSS_ENABLE_ECC */
- { 0, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED }
-Index: net/third_party/nss/ssl/ssl3con.c
-===================================================================
---- net/third_party/nss/ssl/ssl3con.c (revision 215189)
-+++ net/third_party/nss/ssl/ssl3con.c (working copy)
-@@ -78,6 +78,14 @@
- static SECStatus Null_Cipher(void *ctx, unsigned char *output, int *outputLen,
- int maxOutputLen, const unsigned char *input,
- int inputLen);
-+#ifndef NO_PKCS11_BYPASS
-+static SECStatus ssl3_AESGCMBypass(ssl3KeyMaterial *keys, PRBool doDecrypt,
-+ unsigned char *out, int *outlen, int maxout,
-+ const unsigned char *in, int inlen,
-+ SSL3ContentType type,
-+ SSL3ProtocolVersion version,
-+ SSL3SequenceNumber seq_num);
-+#endif
-
- #define MAX_SEND_BUF_LENGTH 32000 /* watch for 16-bit integer overflow */
- #define MIN_SEND_BUF_LENGTH 4000
-@@ -90,6 +98,13 @@
- static ssl3CipherSuiteCfg cipherSuites[ssl_V3_SUITES_IMPLEMENTED] = {
- /* cipher_suite policy enabled is_present*/
- #ifdef NSS_ENABLE_ECC
-+ { TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
-+ { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
-+#endif /* NSS_ENABLE_ECC */
-+ { TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
-+ { TLS_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
-+
-+#ifdef NSS_ENABLE_ECC
- { TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
- { TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
- #endif /* NSS_ENABLE_ECC */
-@@ -233,23 +248,30 @@
-
- /* indexed by SSL3BulkCipher */
- static const ssl3BulkCipherDef bulk_cipher_defs[] = {
-- /* cipher calg keySz secretSz type ivSz BlkSz keygen */
-- {cipher_null, calg_null, 0, 0, type_stream, 0, 0, kg_null},
-- {cipher_rc4, calg_rc4, 16, 16, type_stream, 0, 0, kg_strong},
-- {cipher_rc4_40, calg_rc4, 16, 5, type_stream, 0, 0, kg_export},
-- {cipher_rc4_56, calg_rc4, 16, 7, type_stream, 0, 0, kg_export},
-- {cipher_rc2, calg_rc2, 16, 16, type_block, 8, 8, kg_strong},
-- {cipher_rc2_40, calg_rc2, 16, 5, type_block, 8, 8, kg_export},
-- {cipher_des, calg_des, 8, 8, type_block, 8, 8, kg_strong},
-- {cipher_3des, calg_3des, 24, 24, type_block, 8, 8, kg_strong},
-- {cipher_des40, calg_des, 8, 5, type_block, 8, 8, kg_export},
-- {cipher_idea, calg_idea, 16, 16, type_block, 8, 8, kg_strong},
-- {cipher_aes_128, calg_aes, 16, 16, type_block, 16,16, kg_strong},
-- {cipher_aes_256, calg_aes, 32, 32, type_block, 16,16, kg_strong},
-- {cipher_camellia_128, calg_camellia,16, 16, type_block, 16,16, kg_strong},
-- {cipher_camellia_256, calg_camellia,32, 32, type_block, 16,16, kg_strong},
-- {cipher_seed, calg_seed, 16, 16, type_block, 16,16, kg_strong},
-- {cipher_missing, calg_null, 0, 0, type_stream, 0, 0, kg_null},
-+ /* |--------- Lengths --------| */
-+ /* cipher calg k s type i b t n */
-+ /* e e v l a o */
-+ /* y c | o g n */
-+ /* | r | c | c */
-+ /* | e | k | e */
-+ /* | t | | | | */
-+ {cipher_null, calg_null, 0, 0, type_stream, 0, 0, 0, 0},
-+ {cipher_rc4, calg_rc4, 16,16, type_stream, 0, 0, 0, 0},
-+ {cipher_rc4_40, calg_rc4, 16, 5, type_stream, 0, 0, 0, 0},
-+ {cipher_rc4_56, calg_rc4, 16, 7, type_stream, 0, 0, 0, 0},
-+ {cipher_rc2, calg_rc2, 16,16, type_block, 8, 8, 0, 0},
-+ {cipher_rc2_40, calg_rc2, 16, 5, type_block, 8, 8, 0, 0},
-+ {cipher_des, calg_des, 8, 8, type_block, 8, 8, 0, 0},
-+ {cipher_3des, calg_3des, 24,24, type_block, 8, 8, 0, 0},
-+ {cipher_des40, calg_des, 8, 5, type_block, 8, 8, 0, 0},
-+ {cipher_idea, calg_idea, 16,16, type_block, 8, 8, 0, 0},
-+ {cipher_aes_128, calg_aes, 16,16, type_block, 16,16, 0, 0},
-+ {cipher_aes_256, calg_aes, 32,32, type_block, 16,16, 0, 0},
-+ {cipher_camellia_128, calg_camellia, 16,16, type_block, 16,16, 0, 0},
-+ {cipher_camellia_256, calg_camellia, 32,32, type_block, 16,16, 0, 0},
-+ {cipher_seed, calg_seed, 16,16, type_block, 16,16, 0, 0},
-+ {cipher_aes_128_gcm, calg_aes_gcm, 16,16, type_aead, 4, 0,16, 8},
-+ {cipher_missing, calg_null, 0, 0, type_stream, 0, 0, 0, 0},
- };
-
- static const ssl3KEADef kea_defs[] =
-@@ -371,6 +393,11 @@
- {SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_rsa_fips},
- {SSL_RSA_FIPS_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_rsa_fips},
-
-+ {TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_null, kea_dhe_rsa},
-+ {TLS_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_null, kea_rsa},
-+ {TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_null, kea_ecdhe_rsa},
-+ {TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_null, kea_ecdhe_ecdsa},
-+
- #ifdef NSS_ENABLE_ECC
- {TLS_ECDH_ECDSA_WITH_NULL_SHA, cipher_null, mac_sha, kea_ecdh_ecdsa},
- {TLS_ECDH_ECDSA_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_ecdh_ecdsa},
-@@ -434,6 +461,7 @@
- { calg_aes , CKM_AES_CBC },
- { calg_camellia , CKM_CAMELLIA_CBC },
- { calg_seed , CKM_SEED_CBC },
-+ { calg_aes_gcm , CKM_AES_GCM },
- /* { calg_init , (CK_MECHANISM_TYPE)0x7fffffffL } */
- };
-
-@@ -472,6 +500,7 @@
- "Camellia-128",
- "Camellia-256",
- "SEED-CBC",
-+ "AES-128-GCM",
- "missing"
- };
-
-@@ -598,9 +627,13 @@
- case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
- case TLS_RSA_WITH_AES_256_CBC_SHA256:
- case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
-+ case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
- case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
-+ case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
- case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
-+ case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
- case TLS_RSA_WITH_AES_128_CBC_SHA256:
-+ case TLS_RSA_WITH_AES_128_GCM_SHA256:
- case TLS_RSA_WITH_NULL_SHA256:
- return version >= SSL_LIBRARY_VERSION_TLS_1_2;
- default:
-@@ -1360,7 +1393,7 @@
- cipher = suite_def->bulk_cipher_alg;
- kea = suite_def->key_exchange_alg;
- mac = suite_def->mac_alg;
-- if (mac <= ssl_mac_sha && isTLS)
-+ if (mac <= ssl_mac_sha && mac != ssl_mac_null && isTLS)
- mac += 2;
-
- ss->ssl3.hs.suite_def = suite_def;
-@@ -1554,7 +1587,6 @@
- unsigned int optArg2 = 0;
- PRBool server_encrypts = ss->sec.isServer;
- SSLCipherAlgorithm calg;
-- SSLCompressionMethod compression_method;
- SECStatus rv;
-
- PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
-@@ -1565,8 +1597,18 @@
- cipher_def = pwSpec->cipher_def;
-
- calg = cipher_def->calg;
-- compression_method = pwSpec->compression_method;
-
-+ if (calg == calg_aes_gcm) {
-+ pwSpec->encode = NULL;
-+ pwSpec->decode = NULL;
-+ pwSpec->destroy = NULL;
-+ pwSpec->encodeContext = NULL;
-+ pwSpec->decodeContext = NULL;
-+ pwSpec->aead = ssl3_AESGCMBypass;
-+ ssl3_InitCompressionContext(pwSpec);
-+ return SECSuccess;
-+ }
-+
- serverContext = pwSpec->server.cipher_context;
- clientContext = pwSpec->client.cipher_context;
-
-@@ -1721,6 +1763,207 @@
- return param;
- }
-
-+/* ssl3_BuildRecordPseudoHeader writes the TLS pseudo-header (the data which
-+ * is included in the MAC) to |out| and returns its length. */
-+static unsigned int
-+ssl3_BuildRecordPseudoHeader(unsigned char *out,
-+ SSL3SequenceNumber seq_num,
-+ SSL3ContentType type,
-+ PRBool includesVersion,
-+ SSL3ProtocolVersion version,
-+ PRBool isDTLS,
-+ int length)
-+{
-+ out[0] = (unsigned char)(seq_num.high >> 24);
-+ out[1] = (unsigned char)(seq_num.high >> 16);
-+ out[2] = (unsigned char)(seq_num.high >> 8);
-+ out[3] = (unsigned char)(seq_num.high >> 0);
-+ out[4] = (unsigned char)(seq_num.low >> 24);
-+ out[5] = (unsigned char)(seq_num.low >> 16);
-+ out[6] = (unsigned char)(seq_num.low >> 8);
-+ out[7] = (unsigned char)(seq_num.low >> 0);
-+ out[8] = type;
-+
-+ /* SSL3 MAC doesn't include the record's version field. */
-+ if (!includesVersion) {
-+ out[9] = MSB(length);
-+ out[10] = LSB(length);
-+ return 11;
-+ }
-+
-+ /* TLS MAC and AEAD additional data include version. */
-+ if (isDTLS) {
-+ SSL3ProtocolVersion dtls_version;
-+
-+ dtls_version = dtls_TLSVersionToDTLSVersion(version);
-+ out[9] = MSB(dtls_version);
-+ out[10] = LSB(dtls_version);
-+ } else {
-+ out[9] = MSB(version);
-+ out[10] = LSB(version);
-+ }
-+ out[11] = MSB(length);
-+ out[12] = LSB(length);
-+ return 13;
-+}
-+
-+static SECStatus
-+ssl3_AESGCM(ssl3KeyMaterial *keys,
-+ PRBool doDecrypt,
-+ unsigned char *out,
-+ int *outlen,
-+ int maxout,
-+ const unsigned char *in,
-+ int inlen,
-+ SSL3ContentType type,
-+ SSL3ProtocolVersion version,
-+ SSL3SequenceNumber seq_num)
-+{
-+ SECItem param;
-+ SECStatus rv = SECFailure;
-+ unsigned char nonce[12];
-+ unsigned char additionalData[13];
-+ unsigned int additionalDataLen;
-+ unsigned int uOutLen;
-+ CK_GCM_PARAMS gcmParams;
-+
-+ static const int tagSize = 16;
-+ static const int explicitNonceLen = 8;
-+
-+ /* See https://tools.ietf.org/html/rfc5246#section-6.2.3.3 for the
-+ * definition of the AEAD additional data. */
-+ additionalDataLen = ssl3_BuildRecordPseudoHeader(
-+ additionalData, seq_num, type, PR_TRUE /* includes version */,
-+ version, PR_FALSE /* not DTLS */,
-+ inlen - (doDecrypt ? explicitNonceLen + tagSize : 0));
-+ PORT_Assert(additionalDataLen <= sizeof(additionalData));
-+
-+ /* See https://tools.ietf.org/html/rfc5288#section-3 for details of how the
-+ * nonce is formed. */
-+ memcpy(nonce, keys->write_iv, 4);
-+ if (doDecrypt) {
-+ memcpy(nonce + 4, in, explicitNonceLen);
-+ in += explicitNonceLen;
-+ inlen -= explicitNonceLen;
-+ *outlen = 0;
-+ } else {
-+ if (maxout < explicitNonceLen) {
-+ PORT_SetError(SEC_ERROR_INPUT_LEN);
-+ return SECFailure;
-+ }
-+ /* Use the 64-bit sequence number as the explicit nonce. */
-+ memcpy(nonce + 4, additionalData, explicitNonceLen);
-+ memcpy(out, additionalData, explicitNonceLen);
-+ out += explicitNonceLen;
-+ maxout -= explicitNonceLen;
-+ *outlen = explicitNonceLen;
-+ }
-+
-+ param.type = siBuffer;
-+ param.data = (unsigned char *) &gcmParams;
-+ param.len = sizeof(gcmParams);
-+ gcmParams.pIv = nonce;
-+ gcmParams.ulIvLen = sizeof(nonce);
-+ gcmParams.pAAD = additionalData;
-+ gcmParams.ulAADLen = additionalDataLen;
-+ gcmParams.ulTagBits = tagSize * 8;
-+
-+ if (doDecrypt) {
-+ rv = PK11_Decrypt(keys->write_key, CKM_AES_GCM, &param, out, &uOutLen,
-+ maxout, in, inlen);
-+ } else {
-+ rv = PK11_Encrypt(keys->write_key, CKM_AES_GCM, &param, out, &uOutLen,
-+ maxout, in, inlen);
-+ }
-+ *outlen += (int) uOutLen;
-+
-+ return rv;
-+}
-+
-+#ifndef NO_PKCS11_BYPASS
-+static SECStatus
-+ssl3_AESGCMBypass(ssl3KeyMaterial *keys,
-+ PRBool doDecrypt,
-+ unsigned char *out,
-+ int *outlen,
-+ int maxout,
-+ const unsigned char *in,
-+ int inlen,
-+ SSL3ContentType type,
-+ SSL3ProtocolVersion version,
-+ SSL3SequenceNumber seq_num)
-+{
-+ SECStatus rv = SECFailure;
-+ unsigned char nonce[12];
-+ unsigned char additionalData[13];
-+ unsigned int additionalDataLen;
-+ unsigned int uOutLen;
-+ AESContext *cx;
-+ CK_GCM_PARAMS gcmParams;
-+
-+ static const int tagSize = 16;
-+ static const int explicitNonceLen = 8;
-+
-+ /* See https://tools.ietf.org/html/rfc5246#section-6.2.3.3 for the
-+ * definition of the AEAD additional data. */
-+ additionalDataLen = ssl3_BuildRecordPseudoHeader(
-+ additionalData, seq_num, type, PR_TRUE /* includes version */,
-+ version, PR_FALSE /* not DTLS */,
-+ inlen - (doDecrypt ? explicitNonceLen + tagSize : 0));
-+ PORT_Assert(additionalDataLen <= sizeof(additionalData));
-+
-+ /* See https://tools.ietf.org/html/rfc5288#section-3 for details of how the
-+ * nonce is formed. */
-+ PORT_Assert(keys->write_iv_item.len == 4);
-+ if (keys->write_iv_item.len != 4) {
-+ PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
-+ return SECFailure;
-+ }
-+ memcpy(nonce, keys->write_iv_item.data, 4);
-+ if (doDecrypt) {
-+ memcpy(nonce + 4, in, explicitNonceLen);
-+ in += explicitNonceLen;
-+ inlen -= explicitNonceLen;
-+ *outlen = 0;
-+ } else {
-+ if (maxout < explicitNonceLen) {
-+ PORT_SetError(SEC_ERROR_INPUT_LEN);
-+ return SECFailure;
-+ }
-+ /* Use the 64-bit sequence number as the explicit nonce. */
-+ memcpy(nonce + 4, additionalData, explicitNonceLen);
-+ memcpy(out, additionalData, explicitNonceLen);
-+ out += explicitNonceLen;
-+ maxout -= explicitNonceLen;
-+ *outlen = explicitNonceLen;
-+ }
-+
-+ gcmParams.pIv = nonce;
-+ gcmParams.ulIvLen = sizeof(nonce);
-+ gcmParams.pAAD = additionalData;
-+ gcmParams.ulAADLen = additionalDataLen;
-+ gcmParams.ulTagBits = tagSize * 8;
-+
-+ cx = (AESContext *)keys->cipher_context;
-+ rv = AES_InitContext(cx, keys->write_key_item.data,
-+ keys->write_key_item.len,
-+ (unsigned char *)&gcmParams, NSS_AES_GCM, !doDecrypt,
-+ AES_BLOCK_SIZE);
-+ if (rv != SECSuccess) {
-+ return rv;
-+ }
-+ if (doDecrypt) {
-+ rv = AES_Decrypt(cx, out, &uOutLen, maxout, in, inlen);
-+ } else {
-+ rv = AES_Encrypt(cx, out, &uOutLen, maxout, in, inlen);
-+ }
-+ AES_DestroyContext(cx, PR_FALSE);
-+ *outlen += (int) uOutLen;
-+
-+ return rv;
-+}
-+#endif
-+
- /* Initialize encryption and MAC contexts for pending spec.
- * Master Secret already is derived.
- * Caller holds Spec write lock.
-@@ -1748,14 +1991,27 @@
- pwSpec = ss->ssl3.pwSpec;
- cipher_def = pwSpec->cipher_def;
- macLength = pwSpec->mac_size;
-+ calg = cipher_def->calg;
-+ PORT_Assert(alg2Mech[calg].calg == calg);
-
-+ pwSpec->client.write_mac_context = NULL;
-+ pwSpec->server.write_mac_context = NULL;
-+
-+ if (calg == calg_aes_gcm) {
-+ pwSpec->encode = NULL;
-+ pwSpec->decode = NULL;
-+ pwSpec->destroy = NULL;
-+ pwSpec->encodeContext = NULL;
-+ pwSpec->decodeContext = NULL;
-+ pwSpec->aead = ssl3_AESGCM;
-+ return SECSuccess;
-+ }
-+
- /*
- ** Now setup the MAC contexts,
- ** crypto contexts are setup below.
- */
-
-- pwSpec->client.write_mac_context = NULL;
-- pwSpec->server.write_mac_context = NULL;
- mac_mech = pwSpec->mac_def->mmech;
- mac_param.data = (unsigned char *)&macLength;
- mac_param.len = sizeof(macLength);
-@@ -1778,9 +2034,6 @@
- ** Now setup the crypto contexts.
- */
-
-- calg = cipher_def->calg;
-- PORT_Assert(alg2Mech[calg].calg == calg);
--
- if (calg == calg_null) {
- pwSpec->encode = Null_Cipher;
- pwSpec->decode = Null_Cipher;
-@@ -1999,55 +2252,21 @@
- {
- const ssl3MACDef * mac_def;
- SECStatus rv;
--#ifndef NO_PKCS11_BYPASS
- PRBool isTLS;
--#endif
- unsigned int tempLen;
- unsigned char temp[MAX_MAC_LENGTH];
-
-- temp[0] = (unsigned char)(seq_num.high >> 24);
-- temp[1] = (unsigned char)(seq_num.high >> 16);
-- temp[2] = (unsigned char)(seq_num.high >> 8);
-- temp[3] = (unsigned char)(seq_num.high >> 0);
-- temp[4] = (unsigned char)(seq_num.low >> 24);
-- temp[5] = (unsigned char)(seq_num.low >> 16);
-- temp[6] = (unsigned char)(seq_num.low >> 8);
-- temp[7] = (unsigned char)(seq_num.low >> 0);
-- temp[8] = type;
--
- /* TLS MAC includes the record's version field, SSL's doesn't.
- ** We decide which MAC defintiion to use based on the version of
- ** the protocol that was negotiated when the spec became current,
- ** NOT based on the version value in the record itself.
-- ** But, we use the record'v version value in the computation.
-+ ** But, we use the record's version value in the computation.
- */
-- if (spec->version <= SSL_LIBRARY_VERSION_3_0) {
-- temp[9] = MSB(inputLength);
-- temp[10] = LSB(inputLength);
-- tempLen = 11;
--#ifndef NO_PKCS11_BYPASS
-- isTLS = PR_FALSE;
--#endif
-- } else {
-- /* New TLS hash includes version. */
-- if (isDTLS) {
-- SSL3ProtocolVersion dtls_version;
-+ isTLS = spec->version > SSL_LIBRARY_VERSION_3_0;
-+ tempLen = ssl3_BuildRecordPseudoHeader(temp, seq_num, type, isTLS,
-+ version, isDTLS, inputLength);
-+ PORT_Assert(tempLen <= sizeof(temp));
-
-- dtls_version = dtls_TLSVersionToDTLSVersion(version);
-- temp[9] = MSB(dtls_version);
-- temp[10] = LSB(dtls_version);
-- } else {
-- temp[9] = MSB(version);
-- temp[10] = LSB(version);
-- }
-- temp[11] = MSB(inputLength);
-- temp[12] = LSB(inputLength);
-- tempLen = 13;
--#ifndef NO_PKCS11_BYPASS
-- isTLS = PR_TRUE;
--#endif
-- }
--
- PRINT_BUF(95, (NULL, "frag hash1: temp", temp, tempLen));
- PRINT_BUF(95, (NULL, "frag hash1: input", input, inputLength));
-
-@@ -2390,86 +2609,112 @@
- contentLen = outlen;
- }
-
-- /*
-- * Add the MAC
-- */
-- rv = ssl3_ComputeRecordMAC( cwSpec, isServer, isDTLS,
-- type, cwSpec->version, cwSpec->write_seq_num, pIn, contentLen,
-- wrBuf->buf + headerLen + ivLen + contentLen, &macLen);
-- if (rv != SECSuccess) {
-- ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE);
-- return SECFailure;
-- }
-- p1Len = contentLen;
-- p2Len = macLen;
-- fragLen = contentLen + macLen; /* needs to be encrypted */
-- PORT_Assert(fragLen <= MAX_FRAGMENT_LENGTH + 1024);
-+ if (cipher_def->type == type_aead) {
-+ const int nonceLen = cipher_def->explicit_nonce_size;
-+ const int tagLen = cipher_def->tag_size;
-
-- /*
-- * Pad the text (if we're doing a block cipher)
-- * then Encrypt it
-- */
-- if (cipher_def->type == type_block) {
-- unsigned char * pBuf;
-- int padding_length;
-- int i;
-+ if (headerLen + nonceLen + contentLen + tagLen > wrBuf->space) {
-+ PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
-+ return SECFailure;
-+ }
-
-- oddLen = contentLen % cipher_def->block_size;
-- /* Assume blockSize is a power of two */
-- padding_length = cipher_def->block_size - 1 -
-- ((fragLen) & (cipher_def->block_size - 1));
-- fragLen += padding_length + 1;
-- PORT_Assert((fragLen % cipher_def->block_size) == 0);
--
-- /* Pad according to TLS rules (also acceptable to SSL3). */
-- pBuf = &wrBuf->buf[headerLen + ivLen + fragLen - 1];
-- for (i = padding_length + 1; i > 0; --i) {
-- *pBuf-- = padding_length;
-+ cipherBytes = contentLen;
-+ rv = cwSpec->aead(
-+ isServer ? &cwSpec->server : &cwSpec->client,
-+ PR_FALSE, /* do encrypt */
-+ wrBuf->buf + headerLen, /* output */
-+ &cipherBytes, /* out len */
-+ wrBuf->space - headerLen, /* max out */
-+ pIn, contentLen, /* input */
-+ type, cwSpec->version, cwSpec->write_seq_num);
-+ if (rv != SECSuccess) {
-+ PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE);
-+ return SECFailure;
- }
-- /* now, if contentLen is not a multiple of block size, fix it */
-- p2Len = fragLen - p1Len;
-- }
-- if (p1Len < 256) {
-- oddLen = p1Len;
-- p1Len = 0;
- } else {
-- p1Len -= oddLen;
-- }
-- if (oddLen) {
-- p2Len += oddLen;
-- PORT_Assert( (cipher_def->block_size < 2) || \
-- (p2Len % cipher_def->block_size) == 0);
-- memmove(wrBuf->buf + headerLen + ivLen + p1Len, pIn + p1Len, oddLen);
-- }
-- if (p1Len > 0) {
-- int cipherBytesPart1 = -1;
-- rv = cwSpec->encode( cwSpec->encodeContext,
-- wrBuf->buf + headerLen + ivLen, /* output */
-- &cipherBytesPart1, /* actual outlen */
-- p1Len, /* max outlen */
-- pIn, p1Len); /* input, and inputlen */
-- PORT_Assert(rv == SECSuccess && cipherBytesPart1 == (int) p1Len);
-- if (rv != SECSuccess || cipherBytesPart1 != (int) p1Len) {
-- PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE);
-+ /*
-+ * Add the MAC
-+ */
-+ rv = ssl3_ComputeRecordMAC( cwSpec, isServer, isDTLS,
-+ type, cwSpec->version, cwSpec->write_seq_num, pIn, contentLen,
-+ wrBuf->buf + headerLen + ivLen + contentLen, &macLen);
-+ if (rv != SECSuccess) {
-+ ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE);
- return SECFailure;
- }
-- cipherBytes += cipherBytesPart1;
-+ p1Len = contentLen;
-+ p2Len = macLen;
-+ fragLen = contentLen + macLen; /* needs to be encrypted */
-+ PORT_Assert(fragLen <= MAX_FRAGMENT_LENGTH + 1024);
-+
-+ /*
-+ * Pad the text (if we're doing a block cipher)
-+ * then Encrypt it
-+ */
-+ if (cipher_def->type == type_block) {
-+ unsigned char * pBuf;
-+ int padding_length;
-+ int i;
-+
-+ oddLen = contentLen % cipher_def->block_size;
-+ /* Assume blockSize is a power of two */
-+ padding_length = cipher_def->block_size - 1 -
-+ ((fragLen) & (cipher_def->block_size - 1));
-+ fragLen += padding_length + 1;
-+ PORT_Assert((fragLen % cipher_def->block_size) == 0);
-+
-+ /* Pad according to TLS rules (also acceptable to SSL3). */
-+ pBuf = &wrBuf->buf[headerLen + ivLen + fragLen - 1];
-+ for (i = padding_length + 1; i > 0; --i) {
-+ *pBuf-- = padding_length;
-+ }
-+ /* now, if contentLen is not a multiple of block size, fix it */
-+ p2Len = fragLen - p1Len;
-+ }
-+ if (p1Len < 256) {
-+ oddLen = p1Len;
-+ p1Len = 0;
-+ } else {
-+ p1Len -= oddLen;
-+ }
-+ if (oddLen) {
-+ p2Len += oddLen;
-+ PORT_Assert( (cipher_def->block_size < 2) || \
-+ (p2Len % cipher_def->block_size) == 0);
-+ memmove(wrBuf->buf + headerLen + ivLen + p1Len, pIn + p1Len,
-+ oddLen);
-+ }
-+ if (p1Len > 0) {
-+ int cipherBytesPart1 = -1;
-+ rv = cwSpec->encode( cwSpec->encodeContext,
-+ wrBuf->buf + headerLen + ivLen, /* output */
-+ &cipherBytesPart1, /* actual outlen */
-+ p1Len, /* max outlen */
-+ pIn, p1Len); /* input, and inputlen */
-+ PORT_Assert(rv == SECSuccess && cipherBytesPart1 == (int) p1Len);
-+ if (rv != SECSuccess || cipherBytesPart1 != (int) p1Len) {
-+ PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE);
-+ return SECFailure;
-+ }
-+ cipherBytes += cipherBytesPart1;
-+ }
-+ if (p2Len > 0) {
-+ int cipherBytesPart2 = -1;
-+ rv = cwSpec->encode( cwSpec->encodeContext,
-+ wrBuf->buf + headerLen + ivLen + p1Len,
-+ &cipherBytesPart2, /* output and actual outLen */
-+ p2Len, /* max outlen */
-+ wrBuf->buf + headerLen + ivLen + p1Len,
-+ p2Len); /* input and inputLen*/
-+ PORT_Assert(rv == SECSuccess && cipherBytesPart2 == (int) p2Len);
-+ if (rv != SECSuccess || cipherBytesPart2 != (int) p2Len) {
-+ PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE);
-+ return SECFailure;
-+ }
-+ cipherBytes += cipherBytesPart2;
-+ }
- }
-- if (p2Len > 0) {
-- int cipherBytesPart2 = -1;
-- rv = cwSpec->encode( cwSpec->encodeContext,
-- wrBuf->buf + headerLen + ivLen + p1Len,
-- &cipherBytesPart2, /* output and actual outLen */
-- p2Len, /* max outlen */
-- wrBuf->buf + headerLen + ivLen + p1Len,
-- p2Len); /* input and inputLen*/
-- PORT_Assert(rv == SECSuccess && cipherBytesPart2 == (int) p2Len);
-- if (rv != SECSuccess || cipherBytesPart2 != (int) p2Len) {
-- PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE);
-- return SECFailure;
-- }
-- cipherBytes += cipherBytesPart2;
-- }
-+
- PORT_Assert(cipherBytes <= MAX_FRAGMENT_LENGTH + 1024);
-
- wrBuf->len = cipherBytes + headerLen;
-@@ -3012,9 +3257,6 @@
- static SECStatus
- ssl3_IllegalParameter(sslSocket *ss)
- {
-- PRBool isTLS;
--
-- isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0);
- (void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
- PORT_SetError(ss->sec.isServer ? SSL_ERROR_BAD_CLIENT
- : SSL_ERROR_BAD_SERVER );
-@@ -3538,7 +3780,6 @@
- }
-
- key_material_params.bIsExport = (CK_BBOOL)(kea_def->is_limited);
-- /* was: (CK_BBOOL)(cipher_def->keygen_mode != kg_strong); */
-
- key_material_params.RandomInfo.pClientRandom = cr;
- key_material_params.RandomInfo.ulClientRandomLen = SSL3_RANDOM_LENGTH;
-@@ -9946,7 +10187,6 @@
- static void
- ssl3_RecordKeyLog(sslSocket *ss)
- {
-- sslSessionID *sid;
- SECStatus rv;
- SECItem *keyData;
- char buf[14 /* "CLIENT_RANDOM " */ +
-@@ -9958,8 +10198,6 @@
-
- PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
-
-- sid = ss->sec.ci.sid;
--
- if (!ssl_keylog_iob)
- return;
-
-@@ -11171,12 +11409,14 @@
- /* With >= TLS 1.1, CBC records have an explicit IV. */
- minLength += cipher_def->iv_size;
- }
-+ } else if (cipher_def->type == type_aead) {
-+ minLength = cipher_def->explicit_nonce_size + cipher_def->tag_size;
- }
-
- /* We can perform this test in variable time because the record's total
- * length and the ciphersuite are both public knowledge. */
- if (cText->buf->len < minLength) {
-- goto decrypt_loser;
-+ goto decrypt_loser;
- }
-
- if (cipher_def->type == type_block &&
-@@ -11244,78 +11484,95 @@
- return SECFailure;
- }
-
-- if (cipher_def->type == type_block &&
-- ((cText->buf->len - ivLen) % cipher_def->block_size) != 0) {
-- goto decrypt_loser;
-- }
-+ rType = cText->type;
-+ if (cipher_def->type == type_aead) {
-+ rv = crSpec->aead(
-+ ss->sec.isServer ? &crSpec->client : &crSpec->server,
-+ PR_TRUE, /* do decrypt */
-+ plaintext->buf, /* out */
-+ (int*) &plaintext->len, /* outlen */
-+ plaintext->space, /* maxout */
-+ cText->buf->buf, /* in */
-+ cText->buf->len, /* inlen */
-+ rType, /* record type */
-+ cText->version,
-+ IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num);
-+ if (rv != SECSuccess) {
-+ good = 0;
-+ }
-+ } else {
-+ if (cipher_def->type == type_block &&
-+ ((cText->buf->len - ivLen) % cipher_def->block_size) != 0) {
-+ goto decrypt_loser;
-+ }
-
-- /* decrypt from cText buf to plaintext. */
-- rv = crSpec->decode(
-- crSpec->decodeContext, plaintext->buf, (int *)&plaintext->len,
-- plaintext->space, cText->buf->buf + ivLen, cText->buf->len - ivLen);
-- if (rv != SECSuccess) {
-- goto decrypt_loser;
-- }
-+ /* decrypt from cText buf to plaintext. */
-+ rv = crSpec->decode(
-+ crSpec->decodeContext, plaintext->buf, (int *)&plaintext->len,
-+ plaintext->space, cText->buf->buf + ivLen, cText->buf->len - ivLen);
-+ if (rv != SECSuccess) {
-+ goto decrypt_loser;
-+ }
-
-- PRINT_BUF(80, (ss, "cleartext:", plaintext->buf, plaintext->len));
-+ PRINT_BUF(80, (ss, "cleartext:", plaintext->buf, plaintext->len));
-
-- originalLen = plaintext->len;
-+ originalLen = plaintext->len;
-
-- /* If it's a block cipher, check and strip the padding. */
-- if (cipher_def->type == type_block) {
-- const unsigned int blockSize = cipher_def->block_size;
-- const unsigned int macSize = crSpec->mac_size;
-+ /* If it's a block cipher, check and strip the padding. */
-+ if (cipher_def->type == type_block) {
-+ const unsigned int blockSize = cipher_def->block_size;
-+ const unsigned int macSize = crSpec->mac_size;
-
-- if (crSpec->version <= SSL_LIBRARY_VERSION_3_0) {
-- good &= SECStatusToMask(ssl_RemoveSSLv3CBCPadding(
-- plaintext, blockSize, macSize));
-- } else {
-- good &= SECStatusToMask(ssl_RemoveTLSCBCPadding(
-- plaintext, macSize));
-+ if (crSpec->version <= SSL_LIBRARY_VERSION_3_0) {
-+ good &= SECStatusToMask(ssl_RemoveSSLv3CBCPadding(
-+ plaintext, blockSize, macSize));
-+ } else {
-+ good &= SECStatusToMask(ssl_RemoveTLSCBCPadding(
-+ plaintext, macSize));
-+ }
- }
-- }
-
-- /* compute the MAC */
-- rType = cText->type;
-- if (cipher_def->type == type_block) {
-- rv = ssl3_ComputeRecordMACConstantTime(
-- crSpec, (PRBool)(!ss->sec.isServer),
-- IS_DTLS(ss), rType, cText->version,
-- IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num,
-- plaintext->buf, plaintext->len, originalLen,
-- hash, &hashBytes);
-+ /* compute the MAC */
-+ if (cipher_def->type == type_block) {
-+ rv = ssl3_ComputeRecordMACConstantTime(
-+ crSpec, (PRBool)(!ss->sec.isServer),
-+ IS_DTLS(ss), rType, cText->version,
-+ IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num,
-+ plaintext->buf, plaintext->len, originalLen,
-+ hash, &hashBytes);
-
-- ssl_CBCExtractMAC(plaintext, originalLen, givenHashBuf,
-- crSpec->mac_size);
-- givenHash = givenHashBuf;
-+ ssl_CBCExtractMAC(plaintext, originalLen, givenHashBuf,
-+ crSpec->mac_size);
-+ givenHash = givenHashBuf;
-
-- /* plaintext->len will always have enough space to remove the MAC
-- * because in ssl_Remove{SSLv3|TLS}CBCPadding we only adjust
-- * plaintext->len if the result has enough space for the MAC and we
-- * tested the unadjusted size against minLength, above. */
-- plaintext->len -= crSpec->mac_size;
-- } else {
-- /* This is safe because we checked the minLength above. */
-- plaintext->len -= crSpec->mac_size;
-+ /* plaintext->len will always have enough space to remove the MAC
-+ * because in ssl_Remove{SSLv3|TLS}CBCPadding we only adjust
-+ * plaintext->len if the result has enough space for the MAC and we
-+ * tested the unadjusted size against minLength, above. */
-+ plaintext->len -= crSpec->mac_size;
-+ } else {
-+ /* This is safe because we checked the minLength above. */
-+ plaintext->len -= crSpec->mac_size;
-
-- rv = ssl3_ComputeRecordMAC(
-- crSpec, (PRBool)(!ss->sec.isServer),
-- IS_DTLS(ss), rType, cText->version,
-- IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num,
-- plaintext->buf, plaintext->len,
-- hash, &hashBytes);
-+ rv = ssl3_ComputeRecordMAC(
-+ crSpec, (PRBool)(!ss->sec.isServer),
-+ IS_DTLS(ss), rType, cText->version,
-+ IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num,
-+ plaintext->buf, plaintext->len,
-+ hash, &hashBytes);
-
-- /* We can read the MAC directly from the record because its location is
-- * public when a stream cipher is used. */
-- givenHash = plaintext->buf + plaintext->len;
-- }
-+ /* We can read the MAC directly from the record because its location
-+ * is public when a stream cipher is used. */
-+ givenHash = plaintext->buf + plaintext->len;
-+ }
-
-- good &= SECStatusToMask(rv);
-+ good &= SECStatusToMask(rv);
-
-- if (hashBytes != (unsigned)crSpec->mac_size ||
-- NSS_SecureMemcmp(givenHash, hash, crSpec->mac_size) != 0) {
-- /* We're allowed to leak whether or not the MAC check was correct */
-- good = 0;
-+ if (hashBytes != (unsigned)crSpec->mac_size ||
-+ NSS_SecureMemcmp(givenHash, hash, crSpec->mac_size) != 0) {
-+ /* We're allowed to leak whether or not the MAC check was correct */
-+ good = 0;
-+ }
- }
-
- if (good == 0) {
-Index: net/third_party/nss/ssl/sslenum.c
-===================================================================
---- net/third_party/nss/ssl/sslenum.c (revision 215189)
-+++ net/third_party/nss/ssl/sslenum.c (working copy)
-@@ -29,6 +29,14 @@
- * Finally, update the ssl_V3_SUITES_IMPLEMENTED macro in sslimpl.h.
- */
- const PRUint16 SSL_ImplementedCiphers[] = {
-+ /* AES-GCM */
-+#ifdef NSS_ENABLE_ECC
-+ TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
-+ TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
-+#endif /* NSS_ENABLE_ECC */
-+ TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
-+ TLS_RSA_WITH_AES_128_GCM_SHA256,
-+
- /* 256-bit */
- #ifdef NSS_ENABLE_ECC
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
-Index: net/third_party/nss/ssl/sslproto.h
-===================================================================
---- net/third_party/nss/ssl/sslproto.h (revision 215189)
-+++ net/third_party/nss/ssl/sslproto.h (working copy)
-@@ -162,6 +162,10 @@
-
- #define TLS_RSA_WITH_SEED_CBC_SHA 0x0096
-
-+#define TLS_RSA_WITH_AES_128_GCM_SHA256 0x009C
-+#define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 0x009E
-+#define TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 0x00A2
-+
- /* TLS "Signaling Cipher Suite Value" (SCSV). May be requested by client.
- * Must NEVER be chosen by server. SSL 3.0 server acknowledges by sending
- * back an empty Renegotiation Info (RI) server hello extension.
-@@ -204,6 +208,11 @@
- #define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 0xC023
- #define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0xC027
-
-+#define TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xC02B
-+#define TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0xC02D
-+#define TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xC02F
-+#define TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 0xC031
-+
- /* Netscape "experimental" cipher suites. */
- #define SSL_RSA_OLDFIPS_WITH_3DES_EDE_CBC_SHA 0xffe0
- #define SSL_RSA_OLDFIPS_WITH_DES_CBC_SHA 0xffe1
-Index: net/third_party/nss/ssl/sslt.h
-===================================================================
---- net/third_party/nss/ssl/sslt.h (revision 215189)
-+++ net/third_party/nss/ssl/sslt.h (working copy)
-@@ -91,9 +91,10 @@
- ssl_calg_3des = 4,
- ssl_calg_idea = 5,
- ssl_calg_fortezza = 6, /* deprecated, now unused */
-- ssl_calg_aes = 7, /* coming soon */
-+ ssl_calg_aes = 7,
- ssl_calg_camellia = 8,
-- ssl_calg_seed = 9
-+ ssl_calg_seed = 9,
-+ ssl_calg_aes_gcm = 10
- } SSLCipherAlgorithm;
-
- typedef enum {
-Index: net/third_party/nss/ssl/dtlscon.c
-===================================================================
---- net/third_party/nss/ssl/dtlscon.c (revision 215189)
-+++ net/third_party/nss/ssl/dtlscon.c (working copy)
-@@ -30,7 +30,14 @@
-
- /* List copied from ssl3con.c:cipherSuites */
- static const ssl3CipherSuite nonDTLSSuites[] = {
-+ /* XXX Make AES-GCM work with DTLS. */
- #ifdef NSS_ENABLE_ECC
-+ TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
-+ TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
-+#endif /* NSS_ENABLE_ECC */
-+ TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
-+ TLS_RSA_WITH_AES_128_GCM_SHA256,
-+#ifdef NSS_ENABLE_ECC
- TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
- TLS_ECDHE_RSA_WITH_RC4_128_SHA,
- #endif /* NSS_ENABLE_ECC */
diff --git a/chromium/net/third_party/nss/patches/aesgcmchromium.patch b/chromium/net/third_party/nss/patches/aesgcmchromium.patch
deleted file mode 100644
index 8cd72bb9d9f..00000000000
--- a/chromium/net/third_party/nss/patches/aesgcmchromium.patch
+++ /dev/null
@@ -1,117 +0,0 @@
---- net/third_party/nss/ssl/ssl3con.c.orig 2013-08-14 14:22:50.479780305 -0700
-+++ net/third_party/nss/ssl/ssl3con.c 2013-08-14 14:23:57.670788603 -0700
-@@ -44,6 +44,9 @@
- #ifdef NSS_ENABLE_ZLIB
- #include "zlib.h"
- #endif
-+#ifdef LINUX
-+#include <dlfcn.h>
-+#endif
-
- #ifndef PK11_SETATTRS
- #define PK11_SETATTRS(x,id,v,l) (x)->type = (id); \
-@@ -1807,6 +1810,69 @@ ssl3_BuildRecordPseudoHeader(unsigned ch
- return 13;
- }
-
-+typedef SECStatus (*PK11CryptFcn)(
-+ PK11SymKey *symKey, CK_MECHANISM_TYPE mechanism, SECItem *param,
-+ unsigned char *out, unsigned int *outLen, unsigned int maxLen,
-+ const unsigned char *in, unsigned int inLen);
-+
-+static PK11CryptFcn pk11_encrypt = NULL;
-+static PK11CryptFcn pk11_decrypt = NULL;
-+
-+static PRCallOnceType resolvePK11CryptOnce;
-+
-+static PRStatus
-+ssl3_ResolvePK11CryptFunctions(void)
-+{
-+#ifdef LINUX
-+ /* On Linux we use the system NSS libraries. Look up the PK11_Encrypt and
-+ * PK11_Decrypt functions at run time. */
-+ void *handle = dlopen(NULL, RTLD_LAZY);
-+ if (!handle) {
-+ PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
-+ return PR_FAILURE;
-+ }
-+ pk11_encrypt = (PK11CryptFcn)dlsym(handle, "PK11_Encrypt");
-+ pk11_decrypt = (PK11CryptFcn)dlsym(handle, "PK11_Decrypt");
-+ dlclose(handle);
-+ return PR_SUCCESS;
-+#else
-+ /* On other platforms we use our own copy of NSS. PK11_Encrypt and
-+ * PK11_Decrypt are known to be available. */
-+ pk11_encrypt = PK11_Encrypt;
-+ pk11_decrypt = PK11_Decrypt;
-+ return PR_SUCCESS;
-+#endif
-+}
-+
-+/*
-+ * In NSS 3.15, PK11_Encrypt and PK11_Decrypt were added to provide access
-+ * to the AES GCM implementation in the NSS softoken. So the presence of
-+ * these two functions implies the NSS version supports AES GCM.
-+ */
-+static PRBool
-+ssl3_HasGCMSupport(void)
-+{
-+ (void)PR_CallOnce(&resolvePK11CryptOnce, ssl3_ResolvePK11CryptFunctions);
-+ return pk11_encrypt != NULL;
-+}
-+
-+/* On this socket, disable the GCM cipher suites */
-+SECStatus
-+ssl3_DisableGCMSuites(sslSocket * ss)
-+{
-+ unsigned int i;
-+
-+ for (i = 0; i < PR_ARRAY_SIZE(cipher_suite_defs); i++) {
-+ const ssl3CipherSuiteDef *cipher_def = &cipher_suite_defs[i];
-+ if (cipher_def->bulk_cipher_alg == cipher_aes_128_gcm) {
-+ SECStatus rv = ssl3_CipherPrefSet(ss, cipher_def->cipher_suite,
-+ PR_FALSE);
-+ PORT_Assert(rv == SECSuccess); /* else is coding error */
-+ }
-+ }
-+ return SECSuccess;
-+}
-+
- static SECStatus
- ssl3_AESGCM(ssl3KeyMaterial *keys,
- PRBool doDecrypt,
-@@ -1869,10 +1935,10 @@ ssl3_AESGCM(ssl3KeyMaterial *keys,
- gcmParams.ulTagBits = tagSize * 8;
-
- if (doDecrypt) {
-- rv = PK11_Decrypt(keys->write_key, CKM_AES_GCM, &param, out, &uOutLen,
-+ rv = pk11_decrypt(keys->write_key, CKM_AES_GCM, &param, out, &uOutLen,
- maxout, in, inlen);
- } else {
-- rv = PK11_Encrypt(keys->write_key, CKM_AES_GCM, &param, out, &uOutLen,
-+ rv = pk11_encrypt(keys->write_key, CKM_AES_GCM, &param, out, &uOutLen,
- maxout, in, inlen);
- }
- *outlen += (int) uOutLen;
-@@ -5071,6 +5137,10 @@ ssl3_SendClientHello(sslSocket *ss, PRBo
- ssl3_DisableNonDTLSSuites(ss);
- }
-
-+ if (!ssl3_HasGCMSupport()) {
-+ ssl3_DisableGCMSuites(ss);
-+ }
-+
- /* how many suites are permitted by policy and user preference? */
- num_suites = count_cipher_suites(ss, ss->ssl3.policy, PR_TRUE);
- if (!num_suites)
-@@ -7776,6 +7846,10 @@ ssl3_HandleClientHello(sslSocket *ss, SS
- ssl3_DisableNonDTLSSuites(ss);
- }
-
-+ if (!ssl3_HasGCMSupport()) {
-+ ssl3_DisableGCMSuites(ss);
-+ }
-+
- #ifdef PARANOID
- /* Look for a matching cipher suite. */
- j = ssl3_config_match_init(ss);
diff --git a/chromium/net/third_party/nss/patches/applypatches.sh b/chromium/net/third_party/nss/patches/applypatches.sh
index 14377acbe46..68798aa6ebb 100755
--- a/chromium/net/third_party/nss/patches/applypatches.sh
+++ b/chromium/net/third_party/nss/patches/applypatches.sh
@@ -48,6 +48,4 @@ patch -p4 < $patches_dir/alpn.patch
patch -p5 < $patches_dir/sslsock_903565.patch
-patch -p4 < $patches_dir/aesgcm.patch
-
-patch -p4 < $patches_dir/aesgcmchromium.patch
+patch -p4 < $patches_dir/tls12backuphash.patch
diff --git a/chromium/net/third_party/nss/patches/tls12backuphash.patch b/chromium/net/third_party/nss/patches/tls12backuphash.patch
new file mode 100644
index 00000000000..92dd9183a07
--- /dev/null
+++ b/chromium/net/third_party/nss/patches/tls12backuphash.patch
@@ -0,0 +1,220 @@
+Index: net/third_party/nss/ssl/ssl3con.c
+===================================================================
+--- net/third_party/nss/ssl/ssl3con.c (revision 220594)
++++ net/third_party/nss/ssl/ssl3con.c (working copy)
+@@ -3933,6 +3933,20 @@
+ ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE);
+ return SECFailure;
+ }
++
++ /* A backup SHA-1 hash for a potential client auth signature. */
++ if (!ss->sec.isServer) {
++ ss->ssl3.hs.md5 = PK11_CreateDigestContext(SEC_OID_SHA1);
++ if (ss->ssl3.hs.md5 == NULL) {
++ ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
++ return SECFailure;
++ }
++
++ if (PK11_DigestBegin(ss->ssl3.hs.md5) != SECSuccess) {
++ ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
++ return SECFailure;
++ }
++ }
+ } else {
+ /* Both ss->ssl3.hs.md5 and ss->ssl3.hs.sha should be NULL or
+ * created successfully. */
+@@ -4043,6 +4057,13 @@
+ ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE);
+ return rv;
+ }
++ if (ss->ssl3.hs.md5) {
++ rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l);
++ if (rv != SECSuccess) {
++ ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
++ return rv;
++ }
++ }
+ } else {
+ rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l);
+ if (rv != SECSuccess) {
+@@ -4791,6 +4812,30 @@
+ return rv;
+ }
+
++static SECStatus
++ssl3_ComputeBackupHandshakeHashes(sslSocket * ss,
++ SSL3Hashes * hashes) /* output goes here. */
++{
++ SECStatus rv = SECSuccess;
++
++ PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) );
++ PORT_Assert( ss->ssl3.hs.hashType == handshake_hash_single );
++
++ rv = PK11_DigestFinal(ss->ssl3.hs.md5, hashes->u.raw, &hashes->len,
++ sizeof(hashes->u.raw));
++ if (rv != SECSuccess) {
++ ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
++ rv = SECFailure;
++ goto loser;
++ }
++ hashes->hashAlg = SEC_OID_SHA1;
++
++loser:
++ PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE);
++ ss->ssl3.hs.md5 = NULL;
++ return rv;
++}
++
+ /*
+ * SSL 2 based implementations pass in the initial outbound buffer
+ * so that the handshake hash can contain the included information.
+@@ -6044,7 +6089,17 @@
+ SSL_GETPID(), ss->fd));
+
+ ssl_GetSpecReadLock(ss);
+- rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.pwSpec, &hashes, 0);
++ /* In TLS 1.2, ssl3_ComputeHandshakeHashes always uses the handshake hash
++ * function (SHA-256). If the server or the client does not support SHA-256
++ * as a signature hash, we can either maintain a backup SHA-1 handshake
++ * hash or buffer all handshake messages.
++ */
++ if (ss->ssl3.hs.hashType == handshake_hash_single && ss->ssl3.hs.md5) {
++ rv = ssl3_ComputeBackupHandshakeHashes(ss, &hashes);
++ PORT_Assert(ss->ssl3.hs.md5 == NULL);
++ } else {
++ rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.pwSpec, &hashes, 0);
++ }
+ ssl_ReleaseSpecReadLock(ss);
+ if (rv != SECSuccess) {
+ goto done; /* err code was set by ssl3_ComputeHandshakeHashes */
+@@ -6098,11 +6153,6 @@
+ if (rv != SECSuccess) {
+ goto done;
+ }
+- /* We always sign using the handshake hash function. It's possible that
+- * a server could support SHA-256 as the handshake hash but not as a
+- * signature hash. In that case we wouldn't be able to do client
+- * certificates with it. The alternative is to buffer all handshake
+- * messages. */
+ sigAndHash.hashAlg = hashes.hashAlg;
+
+ rv = ssl3_AppendSignatureAndHashAlgorithm(ss, &sigAndHash);
+@@ -6802,6 +6852,70 @@
+ }
+
+
++/*
++ * Returns true if the client authentication key is an RSA or DSA key that
++ * may be able to sign only SHA-1 hashes.
++ */
++static PRBool
++ssl3_ClientKeyPrefersSHA1(sslSocket *ss)
++{
++ SECKEYPublicKey *pubk;
++ PRBool prefer_sha1 = PR_FALSE;
++
++#if defined(NSS_PLATFORM_CLIENT_AUTH) && defined(_WIN32)
++ /* If the key is in CAPI, assume conservatively that the CAPI service
++ * provider may be unable to sign SHA-256 hashes.
++ */
++ if (ss->ssl3.platformClientKey->dwKeySpec != CERT_NCRYPT_KEY_SPEC) {
++ /* CAPI only supports RSA and DSA signatures, so we don't need to
++ * check the key type. */
++ return PR_TRUE;
++ }
++#endif /* NSS_PLATFORM_CLIENT_AUTH && _WIN32 */
++
++ /* If the key is a 1024-bit RSA or DSA key, assume conservatively that
++ * it may be unable to sign SHA-256 hashes. This is the case for older
++ * Estonian ID cards that have 1024-bit RSA keys. In FIPS 186-2 and
++ * older, DSA key size is at most 1024 bits and the hash function must
++ * be SHA-1.
++ */
++ pubk = CERT_ExtractPublicKey(ss->ssl3.clientCertificate);
++ if (pubk == NULL) {
++ return PR_FALSE;
++ }
++ if (pubk->keyType == rsaKey || pubk->keyType == dsaKey) {
++ prefer_sha1 = SECKEY_PublicKeyStrength(pubk) <= 128;
++ }
++ SECKEY_DestroyPublicKey(pubk);
++ return prefer_sha1;
++}
++
++/* Destroys the backup handshake hash context if we don't need it. */
++static void
++ssl3_DestroyBackupHandshakeHashIfNotNeeded(sslSocket *ss,
++ const SECItem *algorithms)
++{
++ PRBool need_backup_hash = PR_FALSE;
++ unsigned int i;
++
++ PORT_Assert(ss->ssl3.hs.md5);
++ if (ssl3_ClientKeyPrefersSHA1(ss)) {
++ /* Use SHA-1 if the server supports it. */
++ for (i = 0; i < algorithms->len; i += 2) {
++ if (algorithms->data[i] == tls_hash_sha1 &&
++ (algorithms->data[i+1] == tls_sig_rsa ||
++ algorithms->data[i+1] == tls_sig_dsa)) {
++ need_backup_hash = PR_TRUE;
++ break;
++ }
++ }
++ }
++ if (!need_backup_hash) {
++ PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE);
++ ss->ssl3.hs.md5 = NULL;
++ }
++}
++
+ typedef struct dnameNode {
+ struct dnameNode *next;
+ SECItem name;
+@@ -6994,6 +7108,9 @@
+ }
+ goto send_no_certificate;
+ }
++ if (isTLS12) {
++ ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms);
++ }
+ break; /* not an error */
+ }
+ #endif /* NSS_PLATFORM_CLIENT_AUTH */
+@@ -7029,6 +7146,9 @@
+ }
+ goto send_no_certificate;
+ }
++ if (isTLS12) {
++ ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms);
++ }
+ break; /* not an error */
+
+ case SECFailure:
+@@ -7227,6 +7347,13 @@
+ (ss->ssl3.platformClientKey ||
+ ss->ssl3.clientPrivateKey != NULL);
+
++ if (!sendClientCert &&
++ ss->ssl3.hs.hashType == handshake_hash_single && ss->ssl3.hs.md5) {
++ /* Don't need the backup handshake hash. */
++ PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE);
++ ss->ssl3.hs.md5 = NULL;
++ }
++
+ /* We must wait for the server's certificate to be authenticated before
+ * sending the client certificate in order to disclosing the client
+ * certificate to an attacker that does not have a valid cert for the
+Index: net/third_party/nss/ssl/sslimpl.h
+===================================================================
+--- net/third_party/nss/ssl/sslimpl.h (revision 220594)
++++ net/third_party/nss/ssl/sslimpl.h (working copy)
+@@ -838,6 +838,9 @@
+ * SSL 3.0 - TLS 1.1 use both |md5| and |sha|. |md5| is used for MD5 and
+ * |sha| for SHA-1.
+ * TLS 1.2 and later use only |sha|, for SHA-256. */
++ /* NOTE: On the client side, TLS 1.2 and later use |md5| as a backup
++ * handshake hash for generating client auth signatures. Confusingly, the
++ * backup hash function is SHA-1. */
+ PK11Context * md5;
+ PK11Context * sha;
+
diff --git a/chromium/net/third_party/nss/ssl/dtlscon.c b/chromium/net/third_party/nss/ssl/dtlscon.c
index e86ae01ddbe..78371e62a6c 100644
--- a/chromium/net/third_party/nss/ssl/dtlscon.c
+++ b/chromium/net/third_party/nss/ssl/dtlscon.c
@@ -30,13 +30,6 @@ static const PRUint16 COMMON_MTU_VALUES[] = {
/* List copied from ssl3con.c:cipherSuites */
static const ssl3CipherSuite nonDTLSSuites[] = {
- /* XXX Make AES-GCM work with DTLS. */
-#ifdef NSS_ENABLE_ECC
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
-#endif /* NSS_ENABLE_ECC */
- TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
- TLS_RSA_WITH_AES_128_GCM_SHA256,
#ifdef NSS_ENABLE_ECC
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
TLS_ECDHE_RSA_WITH_RC4_128_SHA,
diff --git a/chromium/net/third_party/nss/ssl/ssl3con.c b/chromium/net/third_party/nss/ssl/ssl3con.c
index e614eab2bde..bf4ff6b716c 100644
--- a/chromium/net/third_party/nss/ssl/ssl3con.c
+++ b/chromium/net/third_party/nss/ssl/ssl3con.c
@@ -44,9 +44,6 @@
#ifdef NSS_ENABLE_ZLIB
#include "zlib.h"
#endif
-#ifdef LINUX
-#include <dlfcn.h>
-#endif
#ifndef PK11_SETATTRS
#define PK11_SETATTRS(x,id,v,l) (x)->type = (id); \
@@ -81,14 +78,6 @@ static int ssl3_OIDToTLSHashAlgorithm(SECOidTag oid);
static SECStatus Null_Cipher(void *ctx, unsigned char *output, int *outputLen,
int maxOutputLen, const unsigned char *input,
int inputLen);
-#ifndef NO_PKCS11_BYPASS
-static SECStatus ssl3_AESGCMBypass(ssl3KeyMaterial *keys, PRBool doDecrypt,
- unsigned char *out, int *outlen, int maxout,
- const unsigned char *in, int inlen,
- SSL3ContentType type,
- SSL3ProtocolVersion version,
- SSL3SequenceNumber seq_num);
-#endif
#define MAX_SEND_BUF_LENGTH 32000 /* watch for 16-bit integer overflow */
#define MIN_SEND_BUF_LENGTH 4000
@@ -101,13 +90,6 @@ static SECStatus ssl3_AESGCMBypass(ssl3KeyMaterial *keys, PRBool doDecrypt,
static ssl3CipherSuiteCfg cipherSuites[ssl_V3_SUITES_IMPLEMENTED] = {
/* cipher_suite policy enabled is_present*/
#ifdef NSS_ENABLE_ECC
- { TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
- { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
-#endif /* NSS_ENABLE_ECC */
- { TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
- { TLS_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, PR_TRUE,PR_FALSE},
-
-#ifdef NSS_ENABLE_ECC
{ TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
{ TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, PR_FALSE,PR_FALSE},
#endif /* NSS_ENABLE_ECC */
@@ -251,30 +233,23 @@ static SSL3Statistics ssl3stats;
/* indexed by SSL3BulkCipher */
static const ssl3BulkCipherDef bulk_cipher_defs[] = {
- /* |--------- Lengths --------| */
- /* cipher calg k s type i b t n */
- /* e e v l a o */
- /* y c | o g n */
- /* | r | c | c */
- /* | e | k | e */
- /* | t | | | | */
- {cipher_null, calg_null, 0, 0, type_stream, 0, 0, 0, 0},
- {cipher_rc4, calg_rc4, 16,16, type_stream, 0, 0, 0, 0},
- {cipher_rc4_40, calg_rc4, 16, 5, type_stream, 0, 0, 0, 0},
- {cipher_rc4_56, calg_rc4, 16, 7, type_stream, 0, 0, 0, 0},
- {cipher_rc2, calg_rc2, 16,16, type_block, 8, 8, 0, 0},
- {cipher_rc2_40, calg_rc2, 16, 5, type_block, 8, 8, 0, 0},
- {cipher_des, calg_des, 8, 8, type_block, 8, 8, 0, 0},
- {cipher_3des, calg_3des, 24,24, type_block, 8, 8, 0, 0},
- {cipher_des40, calg_des, 8, 5, type_block, 8, 8, 0, 0},
- {cipher_idea, calg_idea, 16,16, type_block, 8, 8, 0, 0},
- {cipher_aes_128, calg_aes, 16,16, type_block, 16,16, 0, 0},
- {cipher_aes_256, calg_aes, 32,32, type_block, 16,16, 0, 0},
- {cipher_camellia_128, calg_camellia, 16,16, type_block, 16,16, 0, 0},
- {cipher_camellia_256, calg_camellia, 32,32, type_block, 16,16, 0, 0},
- {cipher_seed, calg_seed, 16,16, type_block, 16,16, 0, 0},
- {cipher_aes_128_gcm, calg_aes_gcm, 16,16, type_aead, 4, 0,16, 8},
- {cipher_missing, calg_null, 0, 0, type_stream, 0, 0, 0, 0},
+ /* cipher calg keySz secretSz type ivSz BlkSz keygen */
+ {cipher_null, calg_null, 0, 0, type_stream, 0, 0, kg_null},
+ {cipher_rc4, calg_rc4, 16, 16, type_stream, 0, 0, kg_strong},
+ {cipher_rc4_40, calg_rc4, 16, 5, type_stream, 0, 0, kg_export},
+ {cipher_rc4_56, calg_rc4, 16, 7, type_stream, 0, 0, kg_export},
+ {cipher_rc2, calg_rc2, 16, 16, type_block, 8, 8, kg_strong},
+ {cipher_rc2_40, calg_rc2, 16, 5, type_block, 8, 8, kg_export},
+ {cipher_des, calg_des, 8, 8, type_block, 8, 8, kg_strong},
+ {cipher_3des, calg_3des, 24, 24, type_block, 8, 8, kg_strong},
+ {cipher_des40, calg_des, 8, 5, type_block, 8, 8, kg_export},
+ {cipher_idea, calg_idea, 16, 16, type_block, 8, 8, kg_strong},
+ {cipher_aes_128, calg_aes, 16, 16, type_block, 16,16, kg_strong},
+ {cipher_aes_256, calg_aes, 32, 32, type_block, 16,16, kg_strong},
+ {cipher_camellia_128, calg_camellia,16, 16, type_block, 16,16, kg_strong},
+ {cipher_camellia_256, calg_camellia,32, 32, type_block, 16,16, kg_strong},
+ {cipher_seed, calg_seed, 16, 16, type_block, 16,16, kg_strong},
+ {cipher_missing, calg_null, 0, 0, type_stream, 0, 0, kg_null},
};
static const ssl3KEADef kea_defs[] =
@@ -396,11 +371,6 @@ static const ssl3CipherSuiteDef cipher_suite_defs[] =
{SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, cipher_3des, mac_sha, kea_rsa_fips},
{SSL_RSA_FIPS_WITH_DES_CBC_SHA, cipher_des, mac_sha, kea_rsa_fips},
- {TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_null, kea_dhe_rsa},
- {TLS_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_null, kea_rsa},
- {TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_null, kea_ecdhe_rsa},
- {TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, cipher_aes_128_gcm, mac_null, kea_ecdhe_ecdsa},
-
#ifdef NSS_ENABLE_ECC
{TLS_ECDH_ECDSA_WITH_NULL_SHA, cipher_null, mac_sha, kea_ecdh_ecdsa},
{TLS_ECDH_ECDSA_WITH_RC4_128_SHA, cipher_rc4, mac_sha, kea_ecdh_ecdsa},
@@ -464,7 +434,6 @@ static const SSLCipher2Mech alg2Mech[] = {
{ calg_aes , CKM_AES_CBC },
{ calg_camellia , CKM_CAMELLIA_CBC },
{ calg_seed , CKM_SEED_CBC },
- { calg_aes_gcm , CKM_AES_GCM },
/* { calg_init , (CK_MECHANISM_TYPE)0x7fffffffL } */
};
@@ -503,7 +472,6 @@ const char * const ssl3_cipherName[] = {
"Camellia-128",
"Camellia-256",
"SEED-CBC",
- "AES-128-GCM",
"missing"
};
@@ -630,13 +598,9 @@ ssl3_CipherSuiteAllowedForVersion(ssl3CipherSuite cipherSuite,
case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
case TLS_RSA_WITH_AES_256_CBC_SHA256:
case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
- case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
- case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
- case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
case TLS_RSA_WITH_AES_128_CBC_SHA256:
- case TLS_RSA_WITH_AES_128_GCM_SHA256:
case TLS_RSA_WITH_NULL_SHA256:
return version >= SSL_LIBRARY_VERSION_TLS_1_2;
default:
@@ -1396,7 +1360,7 @@ ssl3_SetupPendingCipherSpec(sslSocket *ss)
cipher = suite_def->bulk_cipher_alg;
kea = suite_def->key_exchange_alg;
mac = suite_def->mac_alg;
- if (mac <= ssl_mac_sha && mac != ssl_mac_null && isTLS)
+ if (mac <= ssl_mac_sha && isTLS)
mac += 2;
ss->ssl3.hs.suite_def = suite_def;
@@ -1590,6 +1554,7 @@ ssl3_InitPendingContextsBypass(sslSocket *ss)
unsigned int optArg2 = 0;
PRBool server_encrypts = ss->sec.isServer;
SSLCipherAlgorithm calg;
+ SSLCompressionMethod compression_method;
SECStatus rv;
PORT_Assert(ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
@@ -1600,17 +1565,7 @@ ssl3_InitPendingContextsBypass(sslSocket *ss)
cipher_def = pwSpec->cipher_def;
calg = cipher_def->calg;
-
- if (calg == calg_aes_gcm) {
- pwSpec->encode = NULL;
- pwSpec->decode = NULL;
- pwSpec->destroy = NULL;
- pwSpec->encodeContext = NULL;
- pwSpec->decodeContext = NULL;
- pwSpec->aead = ssl3_AESGCMBypass;
- ssl3_InitCompressionContext(pwSpec);
- return SECSuccess;
- }
+ compression_method = pwSpec->compression_method;
serverContext = pwSpec->server.cipher_context;
clientContext = pwSpec->client.cipher_context;
@@ -1766,270 +1721,6 @@ ssl3_ParamFromIV(CK_MECHANISM_TYPE mtype, SECItem *iv, CK_ULONG ulEffectiveBits)
return param;
}
-/* ssl3_BuildRecordPseudoHeader writes the TLS pseudo-header (the data which
- * is included in the MAC) to |out| and returns its length. */
-static unsigned int
-ssl3_BuildRecordPseudoHeader(unsigned char *out,
- SSL3SequenceNumber seq_num,
- SSL3ContentType type,
- PRBool includesVersion,
- SSL3ProtocolVersion version,
- PRBool isDTLS,
- int length)
-{
- out[0] = (unsigned char)(seq_num.high >> 24);
- out[1] = (unsigned char)(seq_num.high >> 16);
- out[2] = (unsigned char)(seq_num.high >> 8);
- out[3] = (unsigned char)(seq_num.high >> 0);
- out[4] = (unsigned char)(seq_num.low >> 24);
- out[5] = (unsigned char)(seq_num.low >> 16);
- out[6] = (unsigned char)(seq_num.low >> 8);
- out[7] = (unsigned char)(seq_num.low >> 0);
- out[8] = type;
-
- /* SSL3 MAC doesn't include the record's version field. */
- if (!includesVersion) {
- out[9] = MSB(length);
- out[10] = LSB(length);
- return 11;
- }
-
- /* TLS MAC and AEAD additional data include version. */
- if (isDTLS) {
- SSL3ProtocolVersion dtls_version;
-
- dtls_version = dtls_TLSVersionToDTLSVersion(version);
- out[9] = MSB(dtls_version);
- out[10] = LSB(dtls_version);
- } else {
- out[9] = MSB(version);
- out[10] = LSB(version);
- }
- out[11] = MSB(length);
- out[12] = LSB(length);
- return 13;
-}
-
-typedef SECStatus (*PK11CryptFcn)(
- PK11SymKey *symKey, CK_MECHANISM_TYPE mechanism, SECItem *param,
- unsigned char *out, unsigned int *outLen, unsigned int maxLen,
- const unsigned char *in, unsigned int inLen);
-
-static PK11CryptFcn pk11_encrypt = NULL;
-static PK11CryptFcn pk11_decrypt = NULL;
-
-static PRCallOnceType resolvePK11CryptOnce;
-
-static PRStatus
-ssl3_ResolvePK11CryptFunctions(void)
-{
-#ifdef LINUX
- /* On Linux we use the system NSS libraries. Look up the PK11_Encrypt and
- * PK11_Decrypt functions at run time. */
- void *handle = dlopen(NULL, RTLD_LAZY);
- if (!handle) {
- PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
- return PR_FAILURE;
- }
- pk11_encrypt = (PK11CryptFcn)dlsym(handle, "PK11_Encrypt");
- pk11_decrypt = (PK11CryptFcn)dlsym(handle, "PK11_Decrypt");
- dlclose(handle);
- return PR_SUCCESS;
-#else
- /* On other platforms we use our own copy of NSS. PK11_Encrypt and
- * PK11_Decrypt are known to be available. */
- pk11_encrypt = PK11_Encrypt;
- pk11_decrypt = PK11_Decrypt;
- return PR_SUCCESS;
-#endif
-}
-
-/*
- * In NSS 3.15, PK11_Encrypt and PK11_Decrypt were added to provide access
- * to the AES GCM implementation in the NSS softoken. So the presence of
- * these two functions implies the NSS version supports AES GCM.
- */
-static PRBool
-ssl3_HasGCMSupport(void)
-{
- (void)PR_CallOnce(&resolvePK11CryptOnce, ssl3_ResolvePK11CryptFunctions);
- return pk11_encrypt != NULL;
-}
-
-/* On this socket, disable the GCM cipher suites */
-SECStatus
-ssl3_DisableGCMSuites(sslSocket * ss)
-{
- unsigned int i;
-
- for (i = 0; i < PR_ARRAY_SIZE(cipher_suite_defs); i++) {
- const ssl3CipherSuiteDef *cipher_def = &cipher_suite_defs[i];
- if (cipher_def->bulk_cipher_alg == cipher_aes_128_gcm) {
- SECStatus rv = ssl3_CipherPrefSet(ss, cipher_def->cipher_suite,
- PR_FALSE);
- PORT_Assert(rv == SECSuccess); /* else is coding error */
- }
- }
- return SECSuccess;
-}
-
-static SECStatus
-ssl3_AESGCM(ssl3KeyMaterial *keys,
- PRBool doDecrypt,
- unsigned char *out,
- int *outlen,
- int maxout,
- const unsigned char *in,
- int inlen,
- SSL3ContentType type,
- SSL3ProtocolVersion version,
- SSL3SequenceNumber seq_num)
-{
- SECItem param;
- SECStatus rv = SECFailure;
- unsigned char nonce[12];
- unsigned char additionalData[13];
- unsigned int additionalDataLen;
- unsigned int uOutLen;
- CK_GCM_PARAMS gcmParams;
-
- static const int tagSize = 16;
- static const int explicitNonceLen = 8;
-
- /* See https://tools.ietf.org/html/rfc5246#section-6.2.3.3 for the
- * definition of the AEAD additional data. */
- additionalDataLen = ssl3_BuildRecordPseudoHeader(
- additionalData, seq_num, type, PR_TRUE /* includes version */,
- version, PR_FALSE /* not DTLS */,
- inlen - (doDecrypt ? explicitNonceLen + tagSize : 0));
- PORT_Assert(additionalDataLen <= sizeof(additionalData));
-
- /* See https://tools.ietf.org/html/rfc5288#section-3 for details of how the
- * nonce is formed. */
- memcpy(nonce, keys->write_iv, 4);
- if (doDecrypt) {
- memcpy(nonce + 4, in, explicitNonceLen);
- in += explicitNonceLen;
- inlen -= explicitNonceLen;
- *outlen = 0;
- } else {
- if (maxout < explicitNonceLen) {
- PORT_SetError(SEC_ERROR_INPUT_LEN);
- return SECFailure;
- }
- /* Use the 64-bit sequence number as the explicit nonce. */
- memcpy(nonce + 4, additionalData, explicitNonceLen);
- memcpy(out, additionalData, explicitNonceLen);
- out += explicitNonceLen;
- maxout -= explicitNonceLen;
- *outlen = explicitNonceLen;
- }
-
- param.type = siBuffer;
- param.data = (unsigned char *) &gcmParams;
- param.len = sizeof(gcmParams);
- gcmParams.pIv = nonce;
- gcmParams.ulIvLen = sizeof(nonce);
- gcmParams.pAAD = additionalData;
- gcmParams.ulAADLen = additionalDataLen;
- gcmParams.ulTagBits = tagSize * 8;
-
- if (doDecrypt) {
- rv = pk11_decrypt(keys->write_key, CKM_AES_GCM, &param, out, &uOutLen,
- maxout, in, inlen);
- } else {
- rv = pk11_encrypt(keys->write_key, CKM_AES_GCM, &param, out, &uOutLen,
- maxout, in, inlen);
- }
- *outlen += (int) uOutLen;
-
- return rv;
-}
-
-#ifndef NO_PKCS11_BYPASS
-static SECStatus
-ssl3_AESGCMBypass(ssl3KeyMaterial *keys,
- PRBool doDecrypt,
- unsigned char *out,
- int *outlen,
- int maxout,
- const unsigned char *in,
- int inlen,
- SSL3ContentType type,
- SSL3ProtocolVersion version,
- SSL3SequenceNumber seq_num)
-{
- SECStatus rv = SECFailure;
- unsigned char nonce[12];
- unsigned char additionalData[13];
- unsigned int additionalDataLen;
- unsigned int uOutLen;
- AESContext *cx;
- CK_GCM_PARAMS gcmParams;
-
- static const int tagSize = 16;
- static const int explicitNonceLen = 8;
-
- /* See https://tools.ietf.org/html/rfc5246#section-6.2.3.3 for the
- * definition of the AEAD additional data. */
- additionalDataLen = ssl3_BuildRecordPseudoHeader(
- additionalData, seq_num, type, PR_TRUE /* includes version */,
- version, PR_FALSE /* not DTLS */,
- inlen - (doDecrypt ? explicitNonceLen + tagSize : 0));
- PORT_Assert(additionalDataLen <= sizeof(additionalData));
-
- /* See https://tools.ietf.org/html/rfc5288#section-3 for details of how the
- * nonce is formed. */
- PORT_Assert(keys->write_iv_item.len == 4);
- if (keys->write_iv_item.len != 4) {
- PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
- return SECFailure;
- }
- memcpy(nonce, keys->write_iv_item.data, 4);
- if (doDecrypt) {
- memcpy(nonce + 4, in, explicitNonceLen);
- in += explicitNonceLen;
- inlen -= explicitNonceLen;
- *outlen = 0;
- } else {
- if (maxout < explicitNonceLen) {
- PORT_SetError(SEC_ERROR_INPUT_LEN);
- return SECFailure;
- }
- /* Use the 64-bit sequence number as the explicit nonce. */
- memcpy(nonce + 4, additionalData, explicitNonceLen);
- memcpy(out, additionalData, explicitNonceLen);
- out += explicitNonceLen;
- maxout -= explicitNonceLen;
- *outlen = explicitNonceLen;
- }
-
- gcmParams.pIv = nonce;
- gcmParams.ulIvLen = sizeof(nonce);
- gcmParams.pAAD = additionalData;
- gcmParams.ulAADLen = additionalDataLen;
- gcmParams.ulTagBits = tagSize * 8;
-
- cx = (AESContext *)keys->cipher_context;
- rv = AES_InitContext(cx, keys->write_key_item.data,
- keys->write_key_item.len,
- (unsigned char *)&gcmParams, NSS_AES_GCM, !doDecrypt,
- AES_BLOCK_SIZE);
- if (rv != SECSuccess) {
- return rv;
- }
- if (doDecrypt) {
- rv = AES_Decrypt(cx, out, &uOutLen, maxout, in, inlen);
- } else {
- rv = AES_Encrypt(cx, out, &uOutLen, maxout, in, inlen);
- }
- AES_DestroyContext(cx, PR_FALSE);
- *outlen += (int) uOutLen;
-
- return rv;
-}
-#endif
-
/* Initialize encryption and MAC contexts for pending spec.
* Master Secret already is derived.
* Caller holds Spec write lock.
@@ -2057,27 +1748,14 @@ ssl3_InitPendingContextsPKCS11(sslSocket *ss)
pwSpec = ss->ssl3.pwSpec;
cipher_def = pwSpec->cipher_def;
macLength = pwSpec->mac_size;
- calg = cipher_def->calg;
- PORT_Assert(alg2Mech[calg].calg == calg);
-
- pwSpec->client.write_mac_context = NULL;
- pwSpec->server.write_mac_context = NULL;
-
- if (calg == calg_aes_gcm) {
- pwSpec->encode = NULL;
- pwSpec->decode = NULL;
- pwSpec->destroy = NULL;
- pwSpec->encodeContext = NULL;
- pwSpec->decodeContext = NULL;
- pwSpec->aead = ssl3_AESGCM;
- return SECSuccess;
- }
/*
** Now setup the MAC contexts,
** crypto contexts are setup below.
*/
+ pwSpec->client.write_mac_context = NULL;
+ pwSpec->server.write_mac_context = NULL;
mac_mech = pwSpec->mac_def->mmech;
mac_param.data = (unsigned char *)&macLength;
mac_param.len = sizeof(macLength);
@@ -2100,6 +1778,9 @@ ssl3_InitPendingContextsPKCS11(sslSocket *ss)
** Now setup the crypto contexts.
*/
+ calg = cipher_def->calg;
+ PORT_Assert(alg2Mech[calg].calg == calg);
+
if (calg == calg_null) {
pwSpec->encode = Null_Cipher;
pwSpec->decode = Null_Cipher;
@@ -2318,20 +1999,54 @@ ssl3_ComputeRecordMAC(
{
const ssl3MACDef * mac_def;
SECStatus rv;
+#ifndef NO_PKCS11_BYPASS
PRBool isTLS;
+#endif
unsigned int tempLen;
unsigned char temp[MAX_MAC_LENGTH];
+ temp[0] = (unsigned char)(seq_num.high >> 24);
+ temp[1] = (unsigned char)(seq_num.high >> 16);
+ temp[2] = (unsigned char)(seq_num.high >> 8);
+ temp[3] = (unsigned char)(seq_num.high >> 0);
+ temp[4] = (unsigned char)(seq_num.low >> 24);
+ temp[5] = (unsigned char)(seq_num.low >> 16);
+ temp[6] = (unsigned char)(seq_num.low >> 8);
+ temp[7] = (unsigned char)(seq_num.low >> 0);
+ temp[8] = type;
+
/* TLS MAC includes the record's version field, SSL's doesn't.
** We decide which MAC defintiion to use based on the version of
** the protocol that was negotiated when the spec became current,
** NOT based on the version value in the record itself.
- ** But, we use the record's version value in the computation.
+ ** But, we use the record'v version value in the computation.
*/
- isTLS = spec->version > SSL_LIBRARY_VERSION_3_0;
- tempLen = ssl3_BuildRecordPseudoHeader(temp, seq_num, type, isTLS,
- version, isDTLS, inputLength);
- PORT_Assert(tempLen <= sizeof(temp));
+ if (spec->version <= SSL_LIBRARY_VERSION_3_0) {
+ temp[9] = MSB(inputLength);
+ temp[10] = LSB(inputLength);
+ tempLen = 11;
+#ifndef NO_PKCS11_BYPASS
+ isTLS = PR_FALSE;
+#endif
+ } else {
+ /* New TLS hash includes version. */
+ if (isDTLS) {
+ SSL3ProtocolVersion dtls_version;
+
+ dtls_version = dtls_TLSVersionToDTLSVersion(version);
+ temp[9] = MSB(dtls_version);
+ temp[10] = LSB(dtls_version);
+ } else {
+ temp[9] = MSB(version);
+ temp[10] = LSB(version);
+ }
+ temp[11] = MSB(inputLength);
+ temp[12] = LSB(inputLength);
+ tempLen = 13;
+#ifndef NO_PKCS11_BYPASS
+ isTLS = PR_TRUE;
+#endif
+ }
PRINT_BUF(95, (NULL, "frag hash1: temp", temp, tempLen));
PRINT_BUF(95, (NULL, "frag hash1: input", input, inputLength));
@@ -2675,112 +2390,86 @@ ssl3_CompressMACEncryptRecord(ssl3CipherSpec * cwSpec,
contentLen = outlen;
}
- if (cipher_def->type == type_aead) {
- const int nonceLen = cipher_def->explicit_nonce_size;
- const int tagLen = cipher_def->tag_size;
-
- if (headerLen + nonceLen + contentLen + tagLen > wrBuf->space) {
- PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
- return SECFailure;
- }
+ /*
+ * Add the MAC
+ */
+ rv = ssl3_ComputeRecordMAC( cwSpec, isServer, isDTLS,
+ type, cwSpec->version, cwSpec->write_seq_num, pIn, contentLen,
+ wrBuf->buf + headerLen + ivLen + contentLen, &macLen);
+ if (rv != SECSuccess) {
+ ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE);
+ return SECFailure;
+ }
+ p1Len = contentLen;
+ p2Len = macLen;
+ fragLen = contentLen + macLen; /* needs to be encrypted */
+ PORT_Assert(fragLen <= MAX_FRAGMENT_LENGTH + 1024);
- cipherBytes = contentLen;
- rv = cwSpec->aead(
- isServer ? &cwSpec->server : &cwSpec->client,
- PR_FALSE, /* do encrypt */
- wrBuf->buf + headerLen, /* output */
- &cipherBytes, /* out len */
- wrBuf->space - headerLen, /* max out */
- pIn, contentLen, /* input */
- type, cwSpec->version, cwSpec->write_seq_num);
- if (rv != SECSuccess) {
+ /*
+ * Pad the text (if we're doing a block cipher)
+ * then Encrypt it
+ */
+ if (cipher_def->type == type_block) {
+ unsigned char * pBuf;
+ int padding_length;
+ int i;
+
+ oddLen = contentLen % cipher_def->block_size;
+ /* Assume blockSize is a power of two */
+ padding_length = cipher_def->block_size - 1 -
+ ((fragLen) & (cipher_def->block_size - 1));
+ fragLen += padding_length + 1;
+ PORT_Assert((fragLen % cipher_def->block_size) == 0);
+
+ /* Pad according to TLS rules (also acceptable to SSL3). */
+ pBuf = &wrBuf->buf[headerLen + ivLen + fragLen - 1];
+ for (i = padding_length + 1; i > 0; --i) {
+ *pBuf-- = padding_length;
+ }
+ /* now, if contentLen is not a multiple of block size, fix it */
+ p2Len = fragLen - p1Len;
+ }
+ if (p1Len < 256) {
+ oddLen = p1Len;
+ p1Len = 0;
+ } else {
+ p1Len -= oddLen;
+ }
+ if (oddLen) {
+ p2Len += oddLen;
+ PORT_Assert( (cipher_def->block_size < 2) || \
+ (p2Len % cipher_def->block_size) == 0);
+ memmove(wrBuf->buf + headerLen + ivLen + p1Len, pIn + p1Len, oddLen);
+ }
+ if (p1Len > 0) {
+ int cipherBytesPart1 = -1;
+ rv = cwSpec->encode( cwSpec->encodeContext,
+ wrBuf->buf + headerLen + ivLen, /* output */
+ &cipherBytesPart1, /* actual outlen */
+ p1Len, /* max outlen */
+ pIn, p1Len); /* input, and inputlen */
+ PORT_Assert(rv == SECSuccess && cipherBytesPart1 == (int) p1Len);
+ if (rv != SECSuccess || cipherBytesPart1 != (int) p1Len) {
PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE);
return SECFailure;
}
- } else {
- /*
- * Add the MAC
- */
- rv = ssl3_ComputeRecordMAC( cwSpec, isServer, isDTLS,
- type, cwSpec->version, cwSpec->write_seq_num, pIn, contentLen,
- wrBuf->buf + headerLen + ivLen + contentLen, &macLen);
- if (rv != SECSuccess) {
- ssl_MapLowLevelError(SSL_ERROR_MAC_COMPUTATION_FAILURE);
+ cipherBytes += cipherBytesPart1;
+ }
+ if (p2Len > 0) {
+ int cipherBytesPart2 = -1;
+ rv = cwSpec->encode( cwSpec->encodeContext,
+ wrBuf->buf + headerLen + ivLen + p1Len,
+ &cipherBytesPart2, /* output and actual outLen */
+ p2Len, /* max outlen */
+ wrBuf->buf + headerLen + ivLen + p1Len,
+ p2Len); /* input and inputLen*/
+ PORT_Assert(rv == SECSuccess && cipherBytesPart2 == (int) p2Len);
+ if (rv != SECSuccess || cipherBytesPart2 != (int) p2Len) {
+ PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE);
return SECFailure;
}
- p1Len = contentLen;
- p2Len = macLen;
- fragLen = contentLen + macLen; /* needs to be encrypted */
- PORT_Assert(fragLen <= MAX_FRAGMENT_LENGTH + 1024);
-
- /*
- * Pad the text (if we're doing a block cipher)
- * then Encrypt it
- */
- if (cipher_def->type == type_block) {
- unsigned char * pBuf;
- int padding_length;
- int i;
-
- oddLen = contentLen % cipher_def->block_size;
- /* Assume blockSize is a power of two */
- padding_length = cipher_def->block_size - 1 -
- ((fragLen) & (cipher_def->block_size - 1));
- fragLen += padding_length + 1;
- PORT_Assert((fragLen % cipher_def->block_size) == 0);
-
- /* Pad according to TLS rules (also acceptable to SSL3). */
- pBuf = &wrBuf->buf[headerLen + ivLen + fragLen - 1];
- for (i = padding_length + 1; i > 0; --i) {
- *pBuf-- = padding_length;
- }
- /* now, if contentLen is not a multiple of block size, fix it */
- p2Len = fragLen - p1Len;
- }
- if (p1Len < 256) {
- oddLen = p1Len;
- p1Len = 0;
- } else {
- p1Len -= oddLen;
- }
- if (oddLen) {
- p2Len += oddLen;
- PORT_Assert( (cipher_def->block_size < 2) || \
- (p2Len % cipher_def->block_size) == 0);
- memmove(wrBuf->buf + headerLen + ivLen + p1Len, pIn + p1Len,
- oddLen);
- }
- if (p1Len > 0) {
- int cipherBytesPart1 = -1;
- rv = cwSpec->encode( cwSpec->encodeContext,
- wrBuf->buf + headerLen + ivLen, /* output */
- &cipherBytesPart1, /* actual outlen */
- p1Len, /* max outlen */
- pIn, p1Len); /* input, and inputlen */
- PORT_Assert(rv == SECSuccess && cipherBytesPart1 == (int) p1Len);
- if (rv != SECSuccess || cipherBytesPart1 != (int) p1Len) {
- PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE);
- return SECFailure;
- }
- cipherBytes += cipherBytesPart1;
- }
- if (p2Len > 0) {
- int cipherBytesPart2 = -1;
- rv = cwSpec->encode( cwSpec->encodeContext,
- wrBuf->buf + headerLen + ivLen + p1Len,
- &cipherBytesPart2, /* output and actual outLen */
- p2Len, /* max outlen */
- wrBuf->buf + headerLen + ivLen + p1Len,
- p2Len); /* input and inputLen*/
- PORT_Assert(rv == SECSuccess && cipherBytesPart2 == (int) p2Len);
- if (rv != SECSuccess || cipherBytesPart2 != (int) p2Len) {
- PORT_SetError(SSL_ERROR_ENCRYPTION_FAILURE);
- return SECFailure;
- }
- cipherBytes += cipherBytesPart2;
- }
- }
-
+ cipherBytes += cipherBytesPart2;
+ }
PORT_Assert(cipherBytes <= MAX_FRAGMENT_LENGTH + 1024);
wrBuf->len = cipherBytes + headerLen;
@@ -3323,6 +3012,9 @@ SSL3_SendAlert(sslSocket *ss, SSL3AlertLevel level, SSL3AlertDescription desc)
static SECStatus
ssl3_IllegalParameter(sslSocket *ss)
{
+ PRBool isTLS;
+
+ isTLS = (PRBool)(ss->ssl3.pwSpec->version > SSL_LIBRARY_VERSION_3_0);
(void)SSL3_SendAlert(ss, alert_fatal, illegal_parameter);
PORT_SetError(ss->sec.isServer ? SSL_ERROR_BAD_CLIENT
: SSL_ERROR_BAD_SERVER );
@@ -3846,6 +3538,7 @@ ssl3_DeriveConnectionKeysPKCS11(sslSocket *ss)
}
key_material_params.bIsExport = (CK_BBOOL)(kea_def->is_limited);
+ /* was: (CK_BBOOL)(cipher_def->keygen_mode != kg_strong); */
key_material_params.RandomInfo.pClientRandom = cr;
key_material_params.RandomInfo.ulClientRandomLen = SSL3_RANDOM_LENGTH;
@@ -3981,6 +3674,20 @@ ssl3_InitHandshakeHashes(sslSocket *ss)
ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE);
return SECFailure;
}
+
+ /* A backup SHA-1 hash for a potential client auth signature. */
+ if (!ss->sec.isServer) {
+ ss->ssl3.hs.md5 = PK11_CreateDigestContext(SEC_OID_SHA1);
+ if (ss->ssl3.hs.md5 == NULL) {
+ ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
+ return SECFailure;
+ }
+
+ if (PK11_DigestBegin(ss->ssl3.hs.md5) != SECSuccess) {
+ ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
+ return SECFailure;
+ }
+ }
} else {
/* Both ss->ssl3.hs.md5 and ss->ssl3.hs.sha should be NULL or
* created successfully. */
@@ -4091,6 +3798,13 @@ ssl3_UpdateHandshakeHashes(sslSocket *ss, const unsigned char *b,
ssl_MapLowLevelError(SSL_ERROR_DIGEST_FAILURE);
return rv;
}
+ if (ss->ssl3.hs.md5) {
+ rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l);
+ if (rv != SECSuccess) {
+ ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
+ return rv;
+ }
+ }
} else {
rv = PK11_DigestOp(ss->ssl3.hs.md5, b, l);
if (rv != SECSuccess) {
@@ -4839,6 +4553,30 @@ tls12_loser:
return rv;
}
+static SECStatus
+ssl3_ComputeBackupHandshakeHashes(sslSocket * ss,
+ SSL3Hashes * hashes) /* output goes here. */
+{
+ SECStatus rv = SECSuccess;
+
+ PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss) );
+ PORT_Assert( ss->ssl3.hs.hashType == handshake_hash_single );
+
+ rv = PK11_DigestFinal(ss->ssl3.hs.md5, hashes->u.raw, &hashes->len,
+ sizeof(hashes->u.raw));
+ if (rv != SECSuccess) {
+ ssl_MapLowLevelError(SSL_ERROR_SHA_DIGEST_FAILURE);
+ rv = SECFailure;
+ goto loser;
+ }
+ hashes->hashAlg = SEC_OID_SHA1;
+
+loser:
+ PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE);
+ ss->ssl3.hs.md5 = NULL;
+ return rv;
+}
+
/*
* SSL 2 based implementations pass in the initial outbound buffer
* so that the handshake hash can contain the included information.
@@ -5137,10 +4875,6 @@ ssl3_SendClientHello(sslSocket *ss, PRBool resending)
ssl3_DisableNonDTLSSuites(ss);
}
- if (!ssl3_HasGCMSupport()) {
- ssl3_DisableGCMSuites(ss);
- }
-
/* how many suites are permitted by policy and user preference? */
num_suites = count_cipher_suites(ss, ss->ssl3.policy, PR_TRUE);
if (!num_suites)
@@ -6092,7 +5826,17 @@ ssl3_SendCertificateVerify(sslSocket *ss)
SSL_GETPID(), ss->fd));
ssl_GetSpecReadLock(ss);
- rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.pwSpec, &hashes, 0);
+ /* In TLS 1.2, ssl3_ComputeHandshakeHashes always uses the handshake hash
+ * function (SHA-256). If the server or the client does not support SHA-256
+ * as a signature hash, we can either maintain a backup SHA-1 handshake
+ * hash or buffer all handshake messages.
+ */
+ if (ss->ssl3.hs.hashType == handshake_hash_single && ss->ssl3.hs.md5) {
+ rv = ssl3_ComputeBackupHandshakeHashes(ss, &hashes);
+ PORT_Assert(ss->ssl3.hs.md5 == NULL);
+ } else {
+ rv = ssl3_ComputeHandshakeHashes(ss, ss->ssl3.pwSpec, &hashes, 0);
+ }
ssl_ReleaseSpecReadLock(ss);
if (rv != SECSuccess) {
goto done; /* err code was set by ssl3_ComputeHandshakeHashes */
@@ -6146,11 +5890,6 @@ ssl3_SendCertificateVerify(sslSocket *ss)
if (rv != SECSuccess) {
goto done;
}
- /* We always sign using the handshake hash function. It's possible that
- * a server could support SHA-256 as the handshake hash but not as a
- * signature hash. In that case we wouldn't be able to do client
- * certificates with it. The alternative is to buffer all handshake
- * messages. */
sigAndHash.hashAlg = hashes.hashAlg;
rv = ssl3_AppendSignatureAndHashAlgorithm(ss, &sigAndHash);
@@ -6850,6 +6589,70 @@ no_memory: /* no-memory error has already been set. */
}
+/*
+ * Returns true if the client authentication key is an RSA or DSA key that
+ * may be able to sign only SHA-1 hashes.
+ */
+static PRBool
+ssl3_ClientKeyPrefersSHA1(sslSocket *ss)
+{
+ SECKEYPublicKey *pubk;
+ PRBool prefer_sha1 = PR_FALSE;
+
+#if defined(NSS_PLATFORM_CLIENT_AUTH) && defined(_WIN32)
+ /* If the key is in CAPI, assume conservatively that the CAPI service
+ * provider may be unable to sign SHA-256 hashes.
+ */
+ if (ss->ssl3.platformClientKey->dwKeySpec != CERT_NCRYPT_KEY_SPEC) {
+ /* CAPI only supports RSA and DSA signatures, so we don't need to
+ * check the key type. */
+ return PR_TRUE;
+ }
+#endif /* NSS_PLATFORM_CLIENT_AUTH && _WIN32 */
+
+ /* If the key is a 1024-bit RSA or DSA key, assume conservatively that
+ * it may be unable to sign SHA-256 hashes. This is the case for older
+ * Estonian ID cards that have 1024-bit RSA keys. In FIPS 186-2 and
+ * older, DSA key size is at most 1024 bits and the hash function must
+ * be SHA-1.
+ */
+ pubk = CERT_ExtractPublicKey(ss->ssl3.clientCertificate);
+ if (pubk == NULL) {
+ return PR_FALSE;
+ }
+ if (pubk->keyType == rsaKey || pubk->keyType == dsaKey) {
+ prefer_sha1 = SECKEY_PublicKeyStrength(pubk) <= 128;
+ }
+ SECKEY_DestroyPublicKey(pubk);
+ return prefer_sha1;
+}
+
+/* Destroys the backup handshake hash context if we don't need it. */
+static void
+ssl3_DestroyBackupHandshakeHashIfNotNeeded(sslSocket *ss,
+ const SECItem *algorithms)
+{
+ PRBool need_backup_hash = PR_FALSE;
+ unsigned int i;
+
+ PORT_Assert(ss->ssl3.hs.md5);
+ if (ssl3_ClientKeyPrefersSHA1(ss)) {
+ /* Use SHA-1 if the server supports it. */
+ for (i = 0; i < algorithms->len; i += 2) {
+ if (algorithms->data[i] == tls_hash_sha1 &&
+ (algorithms->data[i+1] == tls_sig_rsa ||
+ algorithms->data[i+1] == tls_sig_dsa)) {
+ need_backup_hash = PR_TRUE;
+ break;
+ }
+ }
+ }
+ if (!need_backup_hash) {
+ PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE);
+ ss->ssl3.hs.md5 = NULL;
+ }
+}
+
typedef struct dnameNode {
struct dnameNode *next;
SECItem name;
@@ -7042,6 +6845,9 @@ ssl3_HandleCertificateRequest(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
}
goto send_no_certificate;
}
+ if (isTLS12) {
+ ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms);
+ }
break; /* not an error */
}
#endif /* NSS_PLATFORM_CLIENT_AUTH */
@@ -7077,6 +6883,9 @@ ssl3_HandleCertificateRequest(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
}
goto send_no_certificate;
}
+ if (isTLS12) {
+ ssl3_DestroyBackupHandshakeHashIfNotNeeded(ss, &algorithms);
+ }
break; /* not an error */
case SECFailure:
@@ -7275,6 +7084,13 @@ ssl3_SendClientSecondRound(sslSocket *ss)
(ss->ssl3.platformClientKey ||
ss->ssl3.clientPrivateKey != NULL);
+ if (!sendClientCert &&
+ ss->ssl3.hs.hashType == handshake_hash_single && ss->ssl3.hs.md5) {
+ /* Don't need the backup handshake hash. */
+ PK11_DestroyContext(ss->ssl3.hs.md5, PR_TRUE);
+ ss->ssl3.hs.md5 = NULL;
+ }
+
/* We must wait for the server's certificate to be authenticated before
* sending the client certificate in order to disclosing the client
* certificate to an attacker that does not have a valid cert for the
@@ -7846,10 +7662,6 @@ ssl3_HandleClientHello(sslSocket *ss, SSL3Opaque *b, PRUint32 length)
ssl3_DisableNonDTLSSuites(ss);
}
- if (!ssl3_HasGCMSupport()) {
- ssl3_DisableGCMSuites(ss);
- }
-
#ifdef PARANOID
/* Look for a matching cipher suite. */
j = ssl3_config_match_init(ss);
@@ -10261,6 +10073,7 @@ ssl3_SendNextProto(sslSocket *ss)
static void
ssl3_RecordKeyLog(sslSocket *ss)
{
+ sslSessionID *sid;
SECStatus rv;
SECItem *keyData;
char buf[14 /* "CLIENT_RANDOM " */ +
@@ -10272,6 +10085,8 @@ ssl3_RecordKeyLog(sslSocket *ss)
PORT_Assert( ss->opt.noLocks || ssl_HaveSSL3HandshakeLock(ss));
+ sid = ss->sec.ci.sid;
+
if (!ssl_keylog_iob)
return;
@@ -11483,14 +11298,12 @@ ssl3_HandleRecord(sslSocket *ss, SSL3Ciphertext *cText, sslBuffer *databuf)
/* With >= TLS 1.1, CBC records have an explicit IV. */
minLength += cipher_def->iv_size;
}
- } else if (cipher_def->type == type_aead) {
- minLength = cipher_def->explicit_nonce_size + cipher_def->tag_size;
}
/* We can perform this test in variable time because the record's total
* length and the ciphersuite are both public knowledge. */
if (cText->buf->len < minLength) {
- goto decrypt_loser;
+ goto decrypt_loser;
}
if (cipher_def->type == type_block &&
@@ -11558,95 +11371,78 @@ ssl3_HandleRecord(sslSocket *ss, SSL3Ciphertext *cText, sslBuffer *databuf)
return SECFailure;
}
- rType = cText->type;
- if (cipher_def->type == type_aead) {
- rv = crSpec->aead(
- ss->sec.isServer ? &crSpec->client : &crSpec->server,
- PR_TRUE, /* do decrypt */
- plaintext->buf, /* out */
- (int*) &plaintext->len, /* outlen */
- plaintext->space, /* maxout */
- cText->buf->buf, /* in */
- cText->buf->len, /* inlen */
- rType, /* record type */
- cText->version,
- IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num);
- if (rv != SECSuccess) {
- good = 0;
- }
- } else {
- if (cipher_def->type == type_block &&
- ((cText->buf->len - ivLen) % cipher_def->block_size) != 0) {
- goto decrypt_loser;
- }
+ if (cipher_def->type == type_block &&
+ ((cText->buf->len - ivLen) % cipher_def->block_size) != 0) {
+ goto decrypt_loser;
+ }
- /* decrypt from cText buf to plaintext. */
- rv = crSpec->decode(
- crSpec->decodeContext, plaintext->buf, (int *)&plaintext->len,
- plaintext->space, cText->buf->buf + ivLen, cText->buf->len - ivLen);
- if (rv != SECSuccess) {
- goto decrypt_loser;
- }
+ /* decrypt from cText buf to plaintext. */
+ rv = crSpec->decode(
+ crSpec->decodeContext, plaintext->buf, (int *)&plaintext->len,
+ plaintext->space, cText->buf->buf + ivLen, cText->buf->len - ivLen);
+ if (rv != SECSuccess) {
+ goto decrypt_loser;
+ }
- PRINT_BUF(80, (ss, "cleartext:", plaintext->buf, plaintext->len));
+ PRINT_BUF(80, (ss, "cleartext:", plaintext->buf, plaintext->len));
- originalLen = plaintext->len;
+ originalLen = plaintext->len;
- /* If it's a block cipher, check and strip the padding. */
- if (cipher_def->type == type_block) {
- const unsigned int blockSize = cipher_def->block_size;
- const unsigned int macSize = crSpec->mac_size;
+ /* If it's a block cipher, check and strip the padding. */
+ if (cipher_def->type == type_block) {
+ const unsigned int blockSize = cipher_def->block_size;
+ const unsigned int macSize = crSpec->mac_size;
- if (crSpec->version <= SSL_LIBRARY_VERSION_3_0) {
- good &= SECStatusToMask(ssl_RemoveSSLv3CBCPadding(
- plaintext, blockSize, macSize));
- } else {
- good &= SECStatusToMask(ssl_RemoveTLSCBCPadding(
- plaintext, macSize));
- }
+ if (crSpec->version <= SSL_LIBRARY_VERSION_3_0) {
+ good &= SECStatusToMask(ssl_RemoveSSLv3CBCPadding(
+ plaintext, blockSize, macSize));
+ } else {
+ good &= SECStatusToMask(ssl_RemoveTLSCBCPadding(
+ plaintext, macSize));
}
+ }
- /* compute the MAC */
- if (cipher_def->type == type_block) {
- rv = ssl3_ComputeRecordMACConstantTime(
- crSpec, (PRBool)(!ss->sec.isServer),
- IS_DTLS(ss), rType, cText->version,
- IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num,
- plaintext->buf, plaintext->len, originalLen,
- hash, &hashBytes);
-
- ssl_CBCExtractMAC(plaintext, originalLen, givenHashBuf,
- crSpec->mac_size);
- givenHash = givenHashBuf;
-
- /* plaintext->len will always have enough space to remove the MAC
- * because in ssl_Remove{SSLv3|TLS}CBCPadding we only adjust
- * plaintext->len if the result has enough space for the MAC and we
- * tested the unadjusted size against minLength, above. */
- plaintext->len -= crSpec->mac_size;
- } else {
- /* This is safe because we checked the minLength above. */
- plaintext->len -= crSpec->mac_size;
+ /* compute the MAC */
+ rType = cText->type;
+ if (cipher_def->type == type_block) {
+ rv = ssl3_ComputeRecordMACConstantTime(
+ crSpec, (PRBool)(!ss->sec.isServer),
+ IS_DTLS(ss), rType, cText->version,
+ IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num,
+ plaintext->buf, plaintext->len, originalLen,
+ hash, &hashBytes);
+
+ ssl_CBCExtractMAC(plaintext, originalLen, givenHashBuf,
+ crSpec->mac_size);
+ givenHash = givenHashBuf;
+
+ /* plaintext->len will always have enough space to remove the MAC
+ * because in ssl_Remove{SSLv3|TLS}CBCPadding we only adjust
+ * plaintext->len if the result has enough space for the MAC and we
+ * tested the unadjusted size against minLength, above. */
+ plaintext->len -= crSpec->mac_size;
+ } else {
+ /* This is safe because we checked the minLength above. */
+ plaintext->len -= crSpec->mac_size;
- rv = ssl3_ComputeRecordMAC(
- crSpec, (PRBool)(!ss->sec.isServer),
- IS_DTLS(ss), rType, cText->version,
- IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num,
- plaintext->buf, plaintext->len,
- hash, &hashBytes);
+ rv = ssl3_ComputeRecordMAC(
+ crSpec, (PRBool)(!ss->sec.isServer),
+ IS_DTLS(ss), rType, cText->version,
+ IS_DTLS(ss) ? cText->seq_num : crSpec->read_seq_num,
+ plaintext->buf, plaintext->len,
+ hash, &hashBytes);
- /* We can read the MAC directly from the record because its location
- * is public when a stream cipher is used. */
- givenHash = plaintext->buf + plaintext->len;
- }
+ /* We can read the MAC directly from the record because its location is
+ * public when a stream cipher is used. */
+ givenHash = plaintext->buf + plaintext->len;
+ }
- good &= SECStatusToMask(rv);
+ good &= SECStatusToMask(rv);
- if (hashBytes != (unsigned)crSpec->mac_size ||
- NSS_SecureMemcmp(givenHash, hash, crSpec->mac_size) != 0) {
- /* We're allowed to leak whether or not the MAC check was correct */
- good = 0;
- }
+ if (hashBytes != (unsigned)crSpec->mac_size ||
+ NSS_SecureMemcmp(givenHash, hash, crSpec->mac_size) != 0) {
+ /* We're allowed to leak whether or not the MAC check was correct */
+ good = 0;
}
if (good == 0) {
diff --git a/chromium/net/third_party/nss/ssl/ssl3ecc.c b/chromium/net/third_party/nss/ssl/ssl3ecc.c
index a3638e75f1c..74995f18321 100644
--- a/chromium/net/third_party/nss/ssl/ssl3ecc.c
+++ b/chromium/net/third_party/nss/ssl/ssl3ecc.c
@@ -911,7 +911,6 @@ static const ssl3CipherSuite ecdhe_ecdsa_suites[] = {
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_NULL_SHA,
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
@@ -922,7 +921,6 @@ static const ssl3CipherSuite ecdhe_rsa_suites[] = {
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_RSA_WITH_NULL_SHA,
TLS_ECDHE_RSA_WITH_RC4_128_SHA,
@@ -934,14 +932,12 @@ static const ssl3CipherSuite ecSuites[] = {
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_NULL_SHA,
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_RSA_WITH_NULL_SHA,
TLS_ECDHE_RSA_WITH_RC4_128_SHA,
diff --git a/chromium/net/third_party/nss/ssl/sslenum.c b/chromium/net/third_party/nss/ssl/sslenum.c
index 597ec072399..b460f2631dc 100644
--- a/chromium/net/third_party/nss/ssl/sslenum.c
+++ b/chromium/net/third_party/nss/ssl/sslenum.c
@@ -29,14 +29,6 @@
* Finally, update the ssl_V3_SUITES_IMPLEMENTED macro in sslimpl.h.
*/
const PRUint16 SSL_ImplementedCiphers[] = {
- /* AES-GCM */
-#ifdef NSS_ENABLE_ECC
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
-#endif /* NSS_ENABLE_ECC */
- TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
- TLS_RSA_WITH_AES_128_GCM_SHA256,
-
/* 256-bit */
#ifdef NSS_ENABLE_ECC
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
diff --git a/chromium/net/third_party/nss/ssl/sslimpl.h b/chromium/net/third_party/nss/ssl/sslimpl.h
index da302abe57d..40d915616b3 100644
--- a/chromium/net/third_party/nss/ssl/sslimpl.h
+++ b/chromium/net/third_party/nss/ssl/sslimpl.h
@@ -64,7 +64,6 @@ typedef SSLSignType SSL3SignType;
#define calg_aes ssl_calg_aes
#define calg_camellia ssl_calg_camellia
#define calg_seed ssl_calg_seed
-#define calg_aes_gcm ssl_calg_aes_gcm
#define mac_null ssl_mac_null
#define mac_md5 ssl_mac_md5
@@ -291,9 +290,9 @@ typedef struct {
} ssl3CipherSuiteCfg;
#ifdef NSS_ENABLE_ECC
-#define ssl_V3_SUITES_IMPLEMENTED 61
+#define ssl_V3_SUITES_IMPLEMENTED 57
#else
-#define ssl_V3_SUITES_IMPLEMENTED 37
+#define ssl_V3_SUITES_IMPLEMENTED 35
#endif /* NSS_ENABLE_ECC */
#define MAX_DTLS_SRTP_CIPHER_SUITES 4
@@ -441,6 +440,20 @@ struct sslGatherStr {
#define GS_DATA 3
#define GS_PAD 4
+typedef SECStatus (*SSLCipher)(void * context,
+ unsigned char * out,
+ int * outlen,
+ int maxout,
+ const unsigned char *in,
+ int inlen);
+typedef SECStatus (*SSLCompressor)(void * context,
+ unsigned char * out,
+ int * outlen,
+ int maxout,
+ const unsigned char *in,
+ int inlen);
+typedef SECStatus (*SSLDestroy)(void *context, PRBool freeit);
+
#if defined(NSS_PLATFORM_CLIENT_AUTH) && defined(XP_WIN32)
typedef PCERT_KEY_CONTEXT PlatformKey;
#elif defined(NSS_PLATFORM_CLIENT_AUTH) && defined(XP_MACOSX)
@@ -472,12 +485,11 @@ typedef enum {
cipher_camellia_128,
cipher_camellia_256,
cipher_seed,
- cipher_aes_128_gcm,
cipher_missing /* reserved for no such supported cipher */
/* This enum must match ssl3_cipherName[] in ssl3con.c. */
} SSL3BulkCipher;
-typedef enum { type_stream, type_block, type_aead } CipherType;
+typedef enum { type_stream, type_block } CipherType;
#define MAX_IV_LENGTH 24
@@ -519,31 +531,6 @@ typedef struct {
PRUint64 cipher_context[MAX_CIPHER_CONTEXT_LLONGS];
} ssl3KeyMaterial;
-typedef SECStatus (*SSLCipher)(void * context,
- unsigned char * out,
- int * outlen,
- int maxout,
- const unsigned char *in,
- int inlen);
-typedef SECStatus (*SSLAEADCipher)(
- ssl3KeyMaterial * keys,
- PRBool doDecrypt,
- unsigned char * out,
- int * outlen,
- int maxout,
- const unsigned char *in,
- int inlen,
- SSL3ContentType type,
- SSL3ProtocolVersion version,
- SSL3SequenceNumber seqnum);
-typedef SECStatus (*SSLCompressor)(void * context,
- unsigned char * out,
- int * outlen,
- int maxout,
- const unsigned char *in,
- int inlen);
-typedef SECStatus (*SSLDestroy)(void *context, PRBool freeit);
-
/* The DTLS anti-replay window. Defined here because we need it in
* the cipher spec. Note that this is a ring buffer but left and
* right represent the true window, with modular arithmetic used to
@@ -570,7 +557,6 @@ typedef struct {
int mac_size;
SSLCipher encode;
SSLCipher decode;
- SSLAEADCipher aead;
SSLDestroy destroy;
void * encodeContext;
void * decodeContext;
@@ -720,6 +706,8 @@ typedef struct {
PRBool tls_keygen;
} ssl3KEADef;
+typedef enum { kg_null, kg_strong, kg_export } SSL3KeyGenMode;
+
/*
** There are tables of these, all const.
*/
@@ -731,8 +719,7 @@ struct ssl3BulkCipherDefStr {
CipherType type;
int iv_size;
int block_size;
- int tag_size; /* authentication tag size for AEAD ciphers. */
- int explicit_nonce_size; /* for AEAD ciphers. */
+ SSL3KeyGenMode keygen_mode;
};
/*
@@ -838,6 +825,9 @@ typedef struct SSL3HandshakeStateStr {
* SSL 3.0 - TLS 1.1 use both |md5| and |sha|. |md5| is used for MD5 and
* |sha| for SHA-1.
* TLS 1.2 and later use only |sha|, for SHA-256. */
+ /* NOTE: On the client side, TLS 1.2 and later use |md5| as a backup
+ * handshake hash for generating client auth signatures. Confusingly, the
+ * backup hash function is SHA-1. */
PK11Context * md5;
PK11Context * sha;
diff --git a/chromium/net/third_party/nss/ssl/sslinfo.c b/chromium/net/third_party/nss/ssl/sslinfo.c
index 215731e4b02..d29fb0d8f72 100644
--- a/chromium/net/third_party/nss/ssl/sslinfo.c
+++ b/chromium/net/third_party/nss/ssl/sslinfo.c
@@ -109,7 +109,7 @@ SSL_GetChannelInfo(PRFileDesc *fd, SSLChannelInfo *info, PRUintn len)
#define K_ECDHE "ECDHE", kt_ecdh
#define C_SEED "SEED", calg_seed
-#define C_CAMELLIA "CAMELLIA", calg_camellia
+#define C_CAMELLIA "CAMELLIA", calg_camellia
#define C_AES "AES", calg_aes
#define C_RC4 "RC4", calg_rc4
#define C_RC2 "RC2", calg_rc2
@@ -117,7 +117,6 @@ SSL_GetChannelInfo(PRFileDesc *fd, SSLChannelInfo *info, PRUintn len)
#define C_3DES "3DES", calg_3des
#define C_NULL "NULL", calg_null
#define C_SJ "SKIPJACK", calg_sj
-#define C_AESGCM "AES-GCM", calg_aes_gcm
#define B_256 256, 256, 256
#define B_128 128, 128, 128
@@ -131,12 +130,9 @@ SSL_GetChannelInfo(PRFileDesc *fd, SSLChannelInfo *info, PRUintn len)
#define M_SHA256 "SHA256", ssl_hmac_sha256, 256
#define M_SHA "SHA1", ssl_mac_sha, 160
#define M_MD5 "MD5", ssl_mac_md5, 128
-#define M_NULL "NULL", ssl_mac_null, 0
static const SSLCipherSuiteInfo suiteInfo[] = {
/* <------ Cipher suite --------------------> <auth> <KEA> <bulk cipher> <MAC> <FIPS> */
-{0,CS(TLS_RSA_WITH_AES_128_GCM_SHA256), S_RSA, K_RSA, C_AESGCM, B_128, M_NULL, 1, 0, 0, },
-
{0,CS(TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA), S_RSA, K_DHE, C_CAMELLIA, B_256, M_SHA, 0, 0, 0, },
{0,CS(TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA), S_DSA, K_DHE, C_CAMELLIA, B_256, M_SHA, 0, 0, 0, },
{0,CS(TLS_DHE_RSA_WITH_AES_256_CBC_SHA256), S_RSA, K_DHE, C_AES, B_256, M_SHA256, 1, 0, 0, },
@@ -150,7 +146,6 @@ static const SSLCipherSuiteInfo suiteInfo[] = {
{0,CS(TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA), S_DSA, K_DHE, C_CAMELLIA, B_128, M_SHA, 0, 0, 0, },
{0,CS(TLS_DHE_DSS_WITH_RC4_128_SHA), S_DSA, K_DHE, C_RC4, B_128, M_SHA, 0, 0, 0, },
{0,CS(TLS_DHE_RSA_WITH_AES_128_CBC_SHA256), S_RSA, K_DHE, C_AES, B_128, M_SHA256, 1, 0, 0, },
-{0,CS(TLS_DHE_RSA_WITH_AES_128_GCM_SHA256), S_RSA, K_DHE, C_AESGCM, B_128, M_NULL, 1, 0, 0, },
{0,CS(TLS_DHE_RSA_WITH_AES_128_CBC_SHA), S_RSA, K_DHE, C_AES, B_128, M_SHA, 1, 0, 0, },
{0,CS(TLS_DHE_DSS_WITH_AES_128_CBC_SHA), S_DSA, K_DHE, C_AES, B_128, M_SHA, 1, 0, 0, },
{0,CS(TLS_RSA_WITH_SEED_CBC_SHA), S_RSA, K_RSA, C_SEED,B_128, M_SHA, 1, 0, 0, },
@@ -180,9 +175,6 @@ static const SSLCipherSuiteInfo suiteInfo[] = {
#ifdef NSS_ENABLE_ECC
/* ECC cipher suites */
-{0,CS(TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256), S_RSA, K_ECDHE, C_AESGCM, B_128, M_NULL, 1, 0, 0, },
-{0,CS(TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256), S_ECDSA, K_ECDHE, C_AESGCM, B_128, M_NULL, 1, 0, 0, },
-
{0,CS(TLS_ECDH_ECDSA_WITH_NULL_SHA), S_ECDSA, K_ECDH, C_NULL, B_0, M_SHA, 0, 0, 0, },
{0,CS(TLS_ECDH_ECDSA_WITH_RC4_128_SHA), S_ECDSA, K_ECDH, C_RC4, B_128, M_SHA, 0, 0, 0, },
{0,CS(TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA), S_ECDSA, K_ECDH, C_3DES, B_3DES, M_SHA, 1, 0, 0, },
diff --git a/chromium/net/third_party/nss/ssl/sslproto.h b/chromium/net/third_party/nss/ssl/sslproto.h
index 53bba011bb9..b037887acf9 100644
--- a/chromium/net/third_party/nss/ssl/sslproto.h
+++ b/chromium/net/third_party/nss/ssl/sslproto.h
@@ -162,10 +162,6 @@
#define TLS_RSA_WITH_SEED_CBC_SHA 0x0096
-#define TLS_RSA_WITH_AES_128_GCM_SHA256 0x009C
-#define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 0x009E
-#define TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 0x00A2
-
/* TLS "Signaling Cipher Suite Value" (SCSV). May be requested by client.
* Must NEVER be chosen by server. SSL 3.0 server acknowledges by sending
* back an empty Renegotiation Info (RI) server hello extension.
@@ -208,11 +204,6 @@
#define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 0xC023
#define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0xC027
-#define TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xC02B
-#define TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0xC02D
-#define TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xC02F
-#define TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 0xC031
-
/* Netscape "experimental" cipher suites. */
#define SSL_RSA_OLDFIPS_WITH_3DES_EDE_CBC_SHA 0xffe0
#define SSL_RSA_OLDFIPS_WITH_DES_CBC_SHA 0xffe1
diff --git a/chromium/net/third_party/nss/ssl/sslsock.c b/chromium/net/third_party/nss/ssl/sslsock.c
index c17c7a3ad03..db0da5f13d1 100644
--- a/chromium/net/third_party/nss/ssl/sslsock.c
+++ b/chromium/net/third_party/nss/ssl/sslsock.c
@@ -67,10 +67,8 @@ static cipherPolicy ssl_ciphers[] = { /* Export France */
{ TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_DHE_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_RSA_WITH_AES_128_CBC_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_DHE_DSS_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_DHE_RSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
@@ -96,7 +94,6 @@ static cipherPolicy ssl_ciphers[] = { /* Export France */
{ TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_ECDH_RSA_WITH_NULL_SHA, SSL_ALLOWED, SSL_ALLOWED },
{ TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
@@ -108,7 +105,6 @@ static cipherPolicy ssl_ciphers[] = { /* Export France */
{ TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
- { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
{ TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED },
#endif /* NSS_ENABLE_ECC */
{ 0, SSL_NOT_ALLOWED, SSL_NOT_ALLOWED }
diff --git a/chromium/net/third_party/nss/ssl/sslt.h b/chromium/net/third_party/nss/ssl/sslt.h
index f4be1743303..41d01130d9e 100644
--- a/chromium/net/third_party/nss/ssl/sslt.h
+++ b/chromium/net/third_party/nss/ssl/sslt.h
@@ -91,10 +91,9 @@ typedef enum {
ssl_calg_3des = 4,
ssl_calg_idea = 5,
ssl_calg_fortezza = 6, /* deprecated, now unused */
- ssl_calg_aes = 7,
+ ssl_calg_aes = 7, /* coming soon */
ssl_calg_camellia = 8,
- ssl_calg_seed = 9,
- ssl_calg_aes_gcm = 10
+ ssl_calg_seed = 9
} SSLCipherAlgorithm;
typedef enum {
diff --git a/chromium/ppapi/native_client/src/trusted/plugin/json_manifest.cc b/chromium/ppapi/native_client/src/trusted/plugin/json_manifest.cc
index 0928c05f2ce..12d3c10d19c 100644
--- a/chromium/ppapi/native_client/src/trusted/plugin/json_manifest.cc
+++ b/chromium/ppapi/native_client/src/trusted/plugin/json_manifest.cc
@@ -173,15 +173,6 @@ bool IsValidUrlSpec(const Json::Value& url_spec,
urlSpecPlusOptional = kPnaclUrlSpecPlusOptional;
urlSpecPlusOptionalLength = NACL_ARRAY_SIZE(kPnaclUrlSpecPlusOptional);
} else {
- // URL specifications must not contain "pnacl-translate" keys.
- // This prohibits NaCl clients from invoking PNaCl.
- if (url_spec.isMember(kPnaclTranslateKey)) {
- nacl::stringstream error_stream;
- error_stream << "PNaCl-like NMF with application/x-nacl mimetype instead "
- << "of x-pnacl mimetype (has " << kPnaclTranslateKey << ").";
- *error_string = error_stream.str();
- return false;
- }
urlSpecPlusOptional = kManifestUrlSpecRequired;
urlSpecPlusOptionalLength = NACL_ARRAY_SIZE(kManifestUrlSpecRequired);
}
@@ -193,6 +184,16 @@ bool IsValidUrlSpec(const Json::Value& url_spec,
error_string)) {
return false;
}
+ // URL specifications must not contain "pnacl-translate" keys.
+ // This prohibits NaCl clients from invoking PNaCl.
+ Json::Value translate = url_spec[kPnaclTranslateKey];
+ if (!translate.empty()) {
+ nacl::stringstream error_stream;
+ error_stream << parent_key << " property '" << container_key <<
+ "' has '" << kPnaclTranslateKey << "' inside URL spec.";
+ *error_string = error_stream.str();
+ return false;
+ }
// Verify the correct types of the fields if they exist.
Json::Value url = url_spec[kUrlKey];
if (!url.isString()) {
diff --git a/chromium/ppapi/native_client/tools/browser_tester/browser_tester.py b/chromium/ppapi/native_client/tools/browser_tester/browser_tester.py
index fb9644326b9..513a091605c 100755
--- a/chromium/ppapi/native_client/tools/browser_tester/browser_tester.py
+++ b/chromium/ppapi/native_client/tools/browser_tester/browser_tester.py
@@ -138,10 +138,6 @@ def BuildArgParser():
parser.add_option('--enable_crash_reporter', dest='enable_crash_reporter',
action='store_true', default=False,
help='Force crash reporting on.')
- parser.add_option('--enable_sockets', dest='enable_sockets',
- action='store_true', default=False,
- help='Pass --allow-nacl-socket-api=<host> to Chrome, where '
- '<host> is the name of the browser tester\'s web server.')
return parser
@@ -246,7 +242,7 @@ def RunTestsOnce(url, options):
full_url = 'http://%s:%d/%s' % (host, port, url)
if len(options.test_args) > 0:
full_url += '?' + urllib.urlencode(options.test_args)
- browser.Run(full_url, host, port)
+ browser.Run(full_url, port)
server.TestingBegun(0.125)
# In Python 2.5, server.handle_request may block indefinitely. Serving pages
diff --git a/chromium/ppapi/native_client/tools/browser_tester/browsertester/browserlauncher.py b/chromium/ppapi/native_client/tools/browser_tester/browsertester/browserlauncher.py
index 29a6897287b..256a1cb37f9 100755
--- a/chromium/ppapi/native_client/tools/browser_tester/browsertester/browserlauncher.py
+++ b/chromium/ppapi/native_client/tools/browser_tester/browsertester/browserlauncher.py
@@ -9,7 +9,6 @@ import shutil
import sys
import tempfile
import time
-import urlparse
import browserprocess
@@ -106,7 +105,7 @@ class BrowserLauncher(object):
def CreateProfile(self):
raise NotImplementedError
- def MakeCmd(self, url, host, port):
+ def MakeCmd(self, url):
raise NotImplementedError
def CreateToolLogDir(self):
@@ -206,12 +205,12 @@ class BrowserLauncher(object):
def GetReturnCode(self):
return self.browser_process.GetReturnCode()
- def Run(self, url, host, port):
+ def Run(self, url, port):
self.binary = EscapeSpaces(self.FindBinary())
self.profile = self.CreateProfile()
if self.options.tool is not None:
self.tool_log_dir = self.CreateToolLogDir()
- cmd = self.MakeCmd(url, host, port)
+ cmd = self.MakeCmd(url, port)
self.Launch(cmd, MakeEnv(self.options))
@@ -263,7 +262,7 @@ class ChromeLauncher(BrowserLauncher):
def NetLogName(self):
return os.path.join(self.profile, 'netlog.json')
- def MakeCmd(self, url, host, port):
+ def MakeCmd(self, url, port):
cmd = [self.binary,
# Note that we do not use "--enable-logging" here because
# it actually turns off logging to the Buildbot logs on
@@ -290,8 +289,7 @@ class ChromeLauncher(BrowserLauncher):
# blacklisted port. To work around this, the tester whitelists
# whatever port it is using.
'--explicitly-allowed-ports=%d' % port,
- '--user-data-dir=%s' % self.profile,
- '--allow-nacl-socket-api=%s' % host]
+ '--user-data-dir=%s' % self.profile]
# Log network requests to assist debugging.
cmd.append('--log-net-log=%s' % self.NetLogName())
if self.options.ppapi_plugin is None:
@@ -337,8 +335,6 @@ class ChromeLauncher(BrowserLauncher):
'--log-file=%s/log.%%p' % (self.tool_log_dir,)] + cmd
elif self.options.tool != None:
raise LaunchFailure('Invalid tool name "%s"' % (self.options.tool,))
- if self.options.enable_sockets:
- cmd.append('--allow-nacl-socket-api=%s' % host)
cmd.extend(self.options.browser_flags)
cmd.append(url)
return cmd
diff --git a/chromium/ppapi/proxy/plugin_resource_tracker.cc b/chromium/ppapi/proxy/plugin_resource_tracker.cc
index 86cbf7cee43..12e9d3faf6a 100644
--- a/chromium/ppapi/proxy/plugin_resource_tracker.cc
+++ b/chromium/ppapi/proxy/plugin_resource_tracker.cc
@@ -18,7 +18,6 @@ namespace ppapi {
namespace proxy {
PluginResourceTracker::PluginResourceTracker() : ResourceTracker(THREAD_SAFE) {
- UseOddResourceValueInDebugMode();
}
PluginResourceTracker::~PluginResourceTracker() {
diff --git a/chromium/ppapi/shared_impl/id_assignment.h b/chromium/ppapi/shared_impl/id_assignment.h
index 3bacac3829f..039e7fed4ca 100644
--- a/chromium/ppapi/shared_impl/id_assignment.h
+++ b/chromium/ppapi/shared_impl/id_assignment.h
@@ -26,7 +26,7 @@ PPAPI_SHARED_EXPORT extern const unsigned int kPPIdTypeBits;
extern const int32 kMaxPPId;
-// The least significant bits are the type, the rest are the value.
+// The most significant bits are the type, the rest are the value.
template <typename T> inline T MakeTypedId(T value, PPIdType type) {
return (value << kPPIdTypeBits) | static_cast<T>(type);
}
diff --git a/chromium/ppapi/shared_impl/resource_tracker.cc b/chromium/ppapi/shared_impl/resource_tracker.cc
index 36aa2e142dc..5d7d01ad7ab 100644
--- a/chromium/ppapi/shared_impl/resource_tracker.cc
+++ b/chromium/ppapi/shared_impl/resource_tracker.cc
@@ -44,9 +44,6 @@ void ResourceTracker::AddRefResource(PP_Resource res) {
CheckThreadingPreconditions();
DLOG_IF(ERROR, !CheckIdType(res, PP_ID_TYPE_RESOURCE))
<< res << " is not a PP_Resource.";
-
- DCHECK(CanOperateOnResource(res));
-
ResourceMap::iterator i = live_resources_.find(res);
if (i == live_resources_.end())
return;
@@ -69,9 +66,6 @@ void ResourceTracker::ReleaseResource(PP_Resource res) {
CheckThreadingPreconditions();
DLOG_IF(ERROR, !CheckIdType(res, PP_ID_TYPE_RESOURCE))
<< res << " is not a PP_Resource.";
-
- DCHECK(CanOperateOnResource(res));
-
ResourceMap::iterator i = live_resources_.find(res);
if (i == live_resources_.end())
return;
@@ -172,23 +166,15 @@ int ResourceTracker::GetLiveObjectsForInstance(PP_Instance instance) const {
return static_cast<int>(found->second->resources.size());
}
-void ResourceTracker::UseOddResourceValueInDebugMode() {
-#if !defined(NDEBUG)
- DCHECK_EQ(0, last_resource_value_);
-
- ++last_resource_value_;
-#endif
-}
-
PP_Resource ResourceTracker::AddResource(Resource* object) {
CheckThreadingPreconditions();
// If the plugin manages to create too many resources, don't do crazy stuff.
- if (last_resource_value_ >= kMaxPPId)
+ if (last_resource_value_ == kMaxPPId)
return 0;
// Allocate an ID. Note there's a rare error condition below that means we
// could end up not using |new_id|, but that's harmless.
- PP_Resource new_id = MakeTypedId(GetNextResourceValue(), PP_ID_TYPE_RESOURCE);
+ PP_Resource new_id = MakeTypedId(++last_resource_value_, PP_ID_TYPE_RESOURCE);
// Some objects have a 0 instance, meaning they aren't associated with any
// instance, so they won't be in |instance_map_|. This is (as of this writing)
@@ -243,31 +229,4 @@ void ResourceTracker::LastPluginRefWasDeleted(Resource* object) {
object->NotifyLastPluginRefWasDeleted();
}
-int32 ResourceTracker::GetNextResourceValue() {
-#if defined(NDEBUG)
- return ++last_resource_value_;
-#else
- // In debug mode, the least significant bit indicates which side (renderer
- // or plugin process) created the resource. Increment by 2 so it's always the
- // same.
- last_resource_value_ += 2;
- return last_resource_value_;
-#endif
-}
-
-bool ResourceTracker::CanOperateOnResource(PP_Resource res) {
-#if defined(NDEBUG)
- return true;
-#else
- // The invalid PP_Resource value could appear at both sides.
- if (res == 0)
- return true;
-
- // Skipping the type bits, the least significant bit of |res| should be the
- // same as that of |last_resource_value_|.
- return ((res >> kPPIdTypeBits) & 1) == (last_resource_value_ & 1);
-#endif
-
-}
-
} // namespace ppapi
diff --git a/chromium/ppapi/shared_impl/resource_tracker.h b/chromium/ppapi/shared_impl/resource_tracker.h
index b1228d2bbac..2ba43b8bb5a 100644
--- a/chromium/ppapi/shared_impl/resource_tracker.h
+++ b/chromium/ppapi/shared_impl/resource_tracker.h
@@ -63,14 +63,6 @@ class PPAPI_SHARED_EXPORT ResourceTracker {
// plugin side, make sure we have the proxy lock.
void CheckThreadingPreconditions() const;
- // This method is called by PluginResourceTracker's constructor so that in
- // debug mode PP_Resources from the plugin process always have odd values
- // (ignoring the type bits), while PP_Resources from the renderer process have
- // even values.
- // This allows us to check that resource refs aren't added or released on the
- // wrong side.
- void UseOddResourceValueInDebugMode();
-
// Adds the given resource to the tracker, associating it with the instance
// stored in the resource object. The new resource ID is returned, and the
// resource will have 0 plugin refcount. This is called by the resource
@@ -88,11 +80,6 @@ class PPAPI_SHARED_EXPORT ResourceTracker {
// cancels pending callbacks for the resource.
void LastPluginRefWasDeleted(Resource* object);
- int32 GetNextResourceValue();
-
- // In debug mode, checks whether |res| comes from the same resource tracker.
- bool CanOperateOnResource(PP_Resource res);
-
typedef std::set<PP_Resource> ResourceSet;
struct InstanceData {
diff --git a/chromium/components/policy/stub_to_remove.cc b/chromium/printing/image_android.cc
index 6e352ace9cd..544cf070d93 100644
--- a/chromium/components/policy/stub_to_remove.cc
+++ b/chromium/printing/image_android.cc
@@ -2,5 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// TODO(joaodasilva): remove this file and update the comment on policy.gypi.
-// http://crbug.com/271392
+#include "printing/image.h"
+
+namespace printing {
+
+bool Image::LoadMetafile(const Metafile& metafile) {
+ return false;
+}
+
+} // namespace printing
diff --git a/chromium/printing/image_linux.cc b/chromium/printing/image_linux.cc
index 3968cfd993f..d89c4e9d808 100644
--- a/chromium/printing/image_linux.cc
+++ b/chromium/printing/image_linux.cc
@@ -4,8 +4,6 @@
#include "printing/image.h"
-#include "base/logging.h"
-
namespace printing {
bool Image::LoadMetafile(const Metafile& metafile) {
diff --git a/chromium/printing/metafile.h b/chromium/printing/metafile.h
index ca0901b2b65..e331069b505 100644
--- a/chromium/printing/metafile.h
+++ b/chromium/printing/metafile.h
@@ -29,7 +29,7 @@ class Size;
class SkDevice;
-#if defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
namespace base {
struct FileDescriptor;
}
@@ -155,12 +155,12 @@ class PRINTING_EXPORT Metafile {
gfx::NativeDrawingContext context,
const CGRect rect,
const MacRenderPageParams& params) const = 0;
-#elif defined(OS_CHROMEOS)
+#elif defined(OS_CHROMEOS) || defined(OS_ANDROID)
// Saves the underlying data to the file associated with fd. This function
// should ONLY be called after the metafile is closed.
// Returns true if writing succeeded.
virtual bool SaveToFD(const base::FileDescriptor& fd) const = 0;
-#endif // if defined(OS_CHROMEOS)
+#endif // if defined(OS_CHROMEOS) || defined(OS_ANDROID)
};
} // namespace printing
diff --git a/chromium/printing/pdf_metafile_skia.cc b/chromium/printing/pdf_metafile_skia.cc
index 3326a1d6d86..31c8c741fd4 100644
--- a/chromium/printing/pdf_metafile_skia.cc
+++ b/chromium/printing/pdf_metafile_skia.cc
@@ -192,7 +192,7 @@ bool PdfMetafileSkia::RenderPage(unsigned int page_number,
}
#endif
-#if defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
bool PdfMetafileSkia::SaveToFD(const base::FileDescriptor& fd) const {
DCHECK_GT(data_->pdf_stream_.getOffset(), 0U);
diff --git a/chromium/printing/pdf_metafile_skia.h b/chromium/printing/pdf_metafile_skia.h
index 33be6d2e0f4..c6f19712e12 100644
--- a/chromium/printing/pdf_metafile_skia.h
+++ b/chromium/printing/pdf_metafile_skia.h
@@ -63,9 +63,9 @@ class PRINTING_EXPORT PdfMetafileSkia : public Metafile {
const MacRenderPageParams& params) const OVERRIDE;
#endif
-#if defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
virtual bool SaveToFD(const base::FileDescriptor& fd) const OVERRIDE;
-#endif // if defined(OS_CHROMEOS)
+#endif // if defined(OS_CHROMEOS) || defined(OS_ANDROID)
// Return a new metafile containing just the current page in draft mode.
PdfMetafileSkia* GetMetafileForCurrentPage();
diff --git a/chromium/printing/printed_document.cc b/chromium/printing/printed_document.cc
index 6e912a11be9..59cc3856923 100644
--- a/chromium/printing/printed_document.cc
+++ b/chromium/printing/printed_document.cc
@@ -225,8 +225,8 @@ PrintedDocument::Immutable::Immutable(const PrintSettings& settings,
PrintedDocument::Immutable::~Immutable() {
}
-#if defined(OS_POSIX) && defined(USE_AURA)
-// This function is not used on aura linux/chromeos.
+#if (defined(OS_POSIX) && defined(USE_AURA)) || defined(OS_ANDROID)
+// This function is not used on aura linux/chromeos or android.
void PrintedDocument::RenderPrintedPage(const PrintedPage& page,
PrintingContext* context) const {
}
diff --git a/chromium/printing/printing.gyp b/chromium/printing/printing.gyp
index b3bbf2b04bb..890e5bfe587 100644
--- a/chromium/printing/printing.gyp
+++ b/chromium/printing/printing.gyp
@@ -37,6 +37,7 @@
'emf_win.cc',
'emf_win.h',
'image.cc',
+ 'image_android.cc',
'image_linux.cc',
'image_mac.cc',
'image_win.cc',
@@ -228,6 +229,11 @@
'printing_context_gtk.h',
],
}],
+ ['OS=="android"', {
+ 'sources': [
+ 'printing_context_android.h',
+ ],
+ }],
],
},
{
diff --git a/chromium/printing/printing_context_android.h b/chromium/printing/printing_context_android.h
new file mode 100644
index 00000000000..180382506ef
--- /dev/null
+++ b/chromium/printing/printing_context_android.h
@@ -0,0 +1,68 @@
+// 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 PRINTING_PRINTING_CONTEXT_ANDROID_H_
+#define PRINTING_PRINTING_CONTEXT_ANDROID_H_
+
+#include <jni.h>
+
+#include <string>
+
+#include "base/android/scoped_java_ref.h"
+#include "printing/printing_context.h"
+
+namespace printing {
+
+// Android subclass of PrintingContext. The implementation for this header file
+// resides in Chrome for Android repository. This class communicates with the
+// Java side through JNI.
+class PRINTING_EXPORT PrintingContextAndroid : public PrintingContext {
+ public:
+ explicit PrintingContextAndroid(const std::string& app_locale);
+ virtual ~PrintingContextAndroid();
+
+ // Called when the page is successfully written to a PDF using the file
+ // descriptor specified, or when the printing operation failed.
+ static void PdfWritingDone(int fd, bool success);
+
+ // Called from Java, when printing settings from the user are ready or the
+ // printing operation is canceled.
+ void AskUserForSettingsReply(JNIEnv* env, jobject obj, jboolean success);
+
+ // PrintingContext implementation.
+ virtual void AskUserForSettings(
+ gfx::NativeView parent_view,
+ int max_pages,
+ bool has_selection,
+ const PrintSettingsCallback& callback) OVERRIDE;
+ virtual Result UseDefaultSettings() OVERRIDE;
+ virtual Result UpdatePrinterSettings(
+ const base::DictionaryValue& job_settings,
+ const PageRanges& ranges) OVERRIDE;
+ virtual Result InitWithSettings(const PrintSettings& settings) OVERRIDE;
+ virtual Result NewDocument(const string16& document_name) OVERRIDE;
+ virtual Result NewPage() OVERRIDE;
+ virtual Result PageDone() OVERRIDE;
+ virtual Result DocumentDone() OVERRIDE;
+ virtual void Cancel() OVERRIDE;
+ virtual void ReleaseContext() OVERRIDE;
+ virtual gfx::NativeDrawingContext context() const OVERRIDE;
+
+ // Registers JNI bindings for RegisterContext.
+ static bool RegisterPrintingContext(JNIEnv* env);
+
+ private:
+ base::android::ScopedJavaGlobalRef<jobject> j_printing_context_;
+
+ // The callback from AskUserForSettings to be called when the settings are
+ // ready on the Java side
+ PrintSettingsCallback callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(PrintingContextAndroid);
+};
+
+} // namespace printing
+
+#endif // PRINTING_PRINTING_CONTEXT_ANDROID_H_
+
diff --git a/chromium/remoting/remoting.gyp b/chromium/remoting/remoting.gyp
index 6e856a85fb8..e70f5f1eab2 100644
--- a/chromium/remoting/remoting.gyp
+++ b/chromium/remoting/remoting.gyp
@@ -82,16 +82,17 @@
['OS=="win"', {
'host_plugin_extension': 'dll',
'host_plugin_prefix': '',
+ }],
+ ['OS=="win"', {
# Use auto-generated CLSIDs to make sure that the newly installed COM
# classes will be used during/after upgrade even if there are old
# instances running already.
- # The parameter at the end is ignored, but needed to make sure that the
- # script will be invoked separately for each CLSID. Otherwise GYP will
- # reuse the value returned by the first invocation of the script.
- 'daemon_controller_clsid':
- '<!(python -c "import uuid; print uuid.uuid4()" 1)',
- 'rdp_desktop_session_clsid':
- '<!(python -c "import uuid; print uuid.uuid4()" 2)',
+ # The parameter passed to uuidgen.py is ignored, but needed to make sure
+ # that the script will be invoked separately for each CLSID. Otherwise
+ # GYP will reuse the value returned by the first invocation of
+ # the script.
+ 'daemon_controller_clsid': '<!(python tools/uuidgen.py 1)',
+ 'rdp_desktop_session_clsid': '<!(python tools/uuidgen.py 2)',
}],
],
@@ -133,7 +134,6 @@
'webapp/main.html',
'webapp/manifest.json',
'webapp/menu_button.css',
- 'webapp/oauth2_callback.html',
'webapp/open_sans.css',
'webapp/open_sans.woff',
'webapp/scale-to-fit.webp',
@@ -171,7 +171,6 @@
'webapp/menu_button.js',
'webapp/oauth2.js',
'webapp/oauth2_api.js',
- 'webapp/oauth2_callback.js',
'webapp/paired_client_manager.js',
'webapp/plugin_settings.js',
'webapp/remoting.js',
@@ -564,6 +563,27 @@
}, # end of target 'remoting_me2me_host_static'
{
+ 'target_name': 'remoting_host_keygen',
+ 'type': 'executable',
+ 'dependencies': [
+ 'remoting_base',
+ '../base/base.gyp:base',
+ '../base/base.gyp:base_i18n',
+ '../crypto/crypto.gyp:crypto',
+ ],
+ 'sources': [
+ 'host/keygen_main.cc',
+ ],
+ 'conditions': [
+ ['OS=="linux" and linux_use_tcmalloc==1', {
+ 'dependencies': [
+ '../base/allocator/allocator.gyp:allocator',
+ ],
+ }],
+ ],
+ }, # end of target 'remoting_host_keygen'
+
+ {
'target_name': 'remoting_host_setup_base',
'type': 'static_library',
'variables': { 'enable_wexit_time_destructors': 1, },
@@ -1725,7 +1745,7 @@
}, # end of target 'remoting_host_messages'
# Generates localized the version information resources for the Windows
- # binaries.
+ # binaries.
# The substitution strings are taken from:
# - build/util/LASTCHANGE - the last source code revision.
# - chrome/VERSION - the major, build & patch versions.
diff --git a/chromium/sandbox/win/sandbox_poc/pocdll/fs.cc b/chromium/sandbox/win/sandbox_poc/pocdll/fs.cc
index 9a5b2bc3ca5..5fab41b5647 100644
--- a/chromium/sandbox/win/sandbox_poc/pocdll/fs.cc
+++ b/chromium/sandbox/win/sandbox_poc/pocdll/fs.cc
@@ -14,7 +14,7 @@ void TryOpenFile(wchar_t *path, FILE *output) {
wchar_t path_expanded[MAX_PATH] = {0};
DWORD size = ::ExpandEnvironmentStrings(path, path_expanded, MAX_PATH - 1);
if (!size) {
- fprintf(output, "[ERROR] Cannot expand \"%S\". Error %d.\r\n", path,
+ fprintf(output, "[ERROR] Cannot expand \"%S\". Error %S.\r\n", path,
::GetLastError());
}
diff --git a/chromium/sandbox/win/src/handle_policy.cc b/chromium/sandbox/win/src/handle_policy.cc
index 718376ecee1..eeeea7b6e18 100644
--- a/chromium/sandbox/win/src/handle_policy.cc
+++ b/chromium/sandbox/win/src/handle_policy.cc
@@ -79,7 +79,7 @@ DWORD HandlePolicy::DuplicateHandleProxyAction(EvalResult eval_result,
// If the policy didn't block us and we have no valid target, then the broker
// (this process) is the valid target.
HANDLE target_process = remote_target_process.IsValid() ?
- remote_target_process.Get() : ::GetCurrentProcess();
+ remote_target_process : ::GetCurrentProcess();
DWORD result = ERROR_SUCCESS;
if (!::DuplicateHandle(client_info.process, source_handle, target_process,
target_handle, desired_access, FALSE,
diff --git a/chromium/skia/ext/opacity_draw_filter.cc b/chromium/skia/ext/opacity_draw_filter.cc
new file mode 100644
index 00000000000..7132b5df076
--- /dev/null
+++ b/chromium/skia/ext/opacity_draw_filter.cc
@@ -0,0 +1,27 @@
+// 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 "skia/ext/opacity_draw_filter.h"
+#include "third_party/skia/include/core/SkPaint.h"
+
+namespace skia {
+
+OpacityDrawFilter::OpacityDrawFilter(float opacity,
+ bool disable_image_filtering)
+ : alpha_(SkScalarRound(opacity * 255)),
+ disable_image_filtering_(disable_image_filtering) {}
+
+OpacityDrawFilter::~OpacityDrawFilter() {}
+
+bool OpacityDrawFilter::filter(SkPaint* paint, Type type) {
+ if (alpha_ < 255)
+ paint->setAlpha(alpha_);
+ if (disable_image_filtering_)
+ paint->setFilterLevel(SkPaint::kNone_FilterLevel);
+ return true;
+}
+
+} // namespace skia
+
+
diff --git a/chromium/skia/ext/opacity_draw_filter.h b/chromium/skia/ext/opacity_draw_filter.h
new file mode 100644
index 00000000000..a2a686cad8d
--- /dev/null
+++ b/chromium/skia/ext/opacity_draw_filter.h
@@ -0,0 +1,33 @@
+// 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 SKIA_EXT_OPACITY_DRAW_FILTER_H
+#define SKIA_EXT_OPACITY_DRAW_FILTER_H
+
+#include "base/values.h"
+#include "third_party/skia/include/core/SkDrawFilter.h"
+
+class SkPaint;
+
+namespace skia {
+
+// This filter allows setting an opacity on every draw call to a canvas, and to
+// disable image filtering. Note that the opacity setting is only correct in
+// very limited conditions: when there is only zero or one opaque, nonlayer
+// draw for every pixel in the surface.
+class SK_API OpacityDrawFilter : public SkDrawFilter {
+ public:
+ OpacityDrawFilter(float opacity, bool disable_image_filtering);
+ virtual ~OpacityDrawFilter();
+ virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE;
+
+ private:
+ int alpha_;
+ bool disable_image_filtering_;
+};
+
+} // namespace skia
+
+#endif // SKIA_EXT_OPACITY_DRAW_FILTER_H
+
diff --git a/chromium/skia/skia_chrome.gypi b/chromium/skia/skia_chrome.gypi
index ecd9b4735c2..1d246057d17 100644
--- a/chromium/skia/skia_chrome.gypi
+++ b/chromium/skia/skia_chrome.gypi
@@ -49,6 +49,8 @@
'ext/lazy_pixel_ref_utils.cc',
'ext/lazy_pixel_ref_utils.h',
'ext/SkThread_chrome.cc',
+ 'ext/opacity_draw_filter.cc',
+ 'ext/opacity_draw_filter.h',
'ext/paint_simplifier.cc',
'ext/paint_simplifier.h',
'ext/platform_canvas.cc',
@@ -88,7 +90,7 @@
'ext/SkThread_chrome.cc',
],
}],
- [ 'OS == "android"', {
+ [ 'OS == "android" and enable_printing == 0', {
'sources!': [
'ext/vector_platform_device_skia.cc',
],
diff --git a/chromium/skia/skia_library.gypi b/chromium/skia/skia_library.gypi
index 29005533614..75408d48b9e 100644
--- a/chromium/skia/skia_library.gypi
+++ b/chromium/skia/skia_library.gypi
@@ -20,7 +20,7 @@
}, {
'skia_support_gpu': 1,
}],
- ['OS=="ios" or OS=="android"', {
+ ['OS=="ios" or enable_printing == 0', {
'skia_support_pdf': 0,
}, {
'skia_support_pdf': 1,
diff --git a/chromium/skia/skia_system.gypi b/chromium/skia/skia_system.gypi
index b05623c0500..a26bdc0615a 100644
--- a/chromium/skia/skia_system.gypi
+++ b/chromium/skia/skia_system.gypi
@@ -9,6 +9,13 @@
'direct_dependent_settings': {
# This makes the Android build system set the include path appropriately.
'libraries': [ '-lskia' ],
+ # Some Chrome code uses non-public header files (http://crbug.com/274425),
+ # so we need to add this include path for now to make it build. The system
+ # version of skia is already required to be the same as the chromium version
+ # so using the bundled headers shouldn't break anything.
+ 'include_dirs': [
+ '../third_party/skia/src/core',
+ ],
},
'link_settings': {
# This actually causes the final binary to be linked against skia.
diff --git a/chromium/sync/android/java/src/org/chromium/sync/signin/ChromeSigninController.java b/chromium/sync/android/java/src/org/chromium/sync/signin/ChromeSigninController.java
index 03805ecaa58..a9a1b822fed 100644
--- a/chromium/sync/android/java/src/org/chromium/sync/signin/ChromeSigninController.java
+++ b/chromium/sync/android/java/src/org/chromium/sync/signin/ChromeSigninController.java
@@ -6,12 +6,10 @@ package org.chromium.sync.signin;
import android.accounts.Account;
import android.content.Context;
-import android.os.AsyncTask;
import android.preference.PreferenceManager;
import android.util.Log;
import com.google.common.annotations.VisibleForTesting;
-import com.google.ipc.invalidation.external.client.contrib.MultiplexingGcmListener;
import org.chromium.base.ObserverList;
@@ -36,8 +34,6 @@ public class ChromeSigninController {
private final ObserverList<Listener> mListeners = new ObserverList<Listener>();
- private boolean mGcmInitialized;
-
private ChromeSigninController(Context context) {
mApplicationContext = context.getApplicationContext();
}
@@ -104,29 +100,4 @@ public class ChromeSigninController {
public void removeListener(Listener listener) {
mListeners.removeObserver(listener);
}
-
- /**
- * Registers for Google Cloud Messaging (GCM) if there is no existing registration.
- */
- public void ensureGcmIsInitialized() {
- if (mGcmInitialized) return;
- mGcmInitialized = true;
- new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... arg0) {
- try {
- String regId = MultiplexingGcmListener.initializeGcm(mApplicationContext);
- if (!regId.isEmpty())
- Log.d(TAG, "Already registered with GCM");
- } catch (IllegalStateException exception) {
- Log.w(TAG, "Application manifest does not correctly configure GCM; "
- + "sync notifications will not work", exception);
- } catch (UnsupportedOperationException exception) {
- Log.w(TAG, "Device does not support GCM; sync notifications will not work",
- exception);
- }
- return null;
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
}
diff --git a/chromium/sync/engine/net/server_connection_manager.cc b/chromium/sync/engine/net/server_connection_manager.cc
index a60e3a9d03a..0076543374f 100644
--- a/chromium/sync/engine/net/server_connection_manager.cc
+++ b/chromium/sync/engine/net/server_connection_manager.cc
@@ -267,7 +267,11 @@ bool ServerConnectionManager::PostBufferToPath(PostBufferParams* params,
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(watcher != NULL);
- if (auth_token.empty()) {
+ // TODO(pavely): crbug.com/273096. Check for "credentials_lost" is added as
+ // workaround for M29 blocker to avoid sending RPC to sync with known invalid
+ // token but instead to trigger refreshing token in ProfileSyncService. Need
+ // to clean it.
+ if (auth_token.empty() || auth_token == "credentials_lost") {
params->response.server_status = HttpResponse::SYNC_AUTH_ERROR;
return false;
}
diff --git a/chromium/sync/engine/syncer_proto_util.cc b/chromium/sync/engine/syncer_proto_util.cc
index 690a837c817..085bed47d08 100644
--- a/chromium/sync/engine/syncer_proto_util.cc
+++ b/chromium/sync/engine/syncer_proto_util.cc
@@ -199,6 +199,7 @@ SyncProtocolError ConvertErrorPBToLocalType(
return sync_protocol_error;
}
+// static
bool SyncerProtoUtil::VerifyResponseBirthday(
const ClientToServerResponse& response,
syncable::Directory* dir) {
@@ -231,6 +232,13 @@ bool SyncerProtoUtil::VerifyResponseBirthday(
}
// static
+bool SyncerProtoUtil::IsSyncDisabledByAdmin(
+ const sync_pb::ClientToServerResponse& response) {
+ return (response.has_error_code() &&
+ response.error_code() == sync_pb::SyncEnums::DISABLED_BY_ADMIN);
+}
+
+// static
void SyncerProtoUtil::AddRequestBirthday(syncable::Directory* dir,
ClientToServerMessage* msg) {
if (!dir->store_birthday().empty())
@@ -380,11 +388,14 @@ SyncerError SyncerProtoUtil::PostClientToServerMessage(
SyncProtocolError sync_protocol_error;
- // Birthday mismatch overrides any error that is sent by the server.
- if (!VerifyResponseBirthday(*response, dir)) {
+ // The DISABLED_BY_ADMIN error overrides other errors sent by the server.
+ if (IsSyncDisabledByAdmin(*response)) {
+ sync_protocol_error.error_type = DISABLED_BY_ADMIN;
+ sync_protocol_error.action = STOP_SYNC_FOR_DISABLED_ACCOUNT;
+ } else if (!VerifyResponseBirthday(*response, dir)) {
+ // If sync isn't disabled, first check for a birthday mismatch error.
sync_protocol_error.error_type = NOT_MY_BIRTHDAY;
- sync_protocol_error.action =
- DISABLE_SYNC_ON_CLIENT;
+ sync_protocol_error.action = DISABLE_SYNC_ON_CLIENT;
} else if (response->has_error()) {
// This is a new server. Just get the error from the protocol.
sync_protocol_error = ConvertErrorPBToLocalType(response->error());
diff --git a/chromium/sync/engine/syncer_proto_util.h b/chromium/sync/engine/syncer_proto_util.h
index 4e627e0b1c0..d2468c0294d 100644
--- a/chromium/sync/engine/syncer_proto_util.h
+++ b/chromium/sync/engine/syncer_proto_util.h
@@ -129,6 +129,10 @@ class SYNC_EXPORT_PRIVATE SyncerProtoUtil {
const sync_pb::ClientToServerResponse& response,
syncable::Directory* dir);
+ // Returns true if sync is disabled by admin for a dasher account.
+ static bool IsSyncDisabledByAdmin(
+ const sync_pb::ClientToServerResponse& response);
+
// Post the message using the scm, and do some processing on the returned
// headers. Decode the server response.
static bool PostAndProcessHeaders(ServerConnectionManager* scm,
@@ -142,6 +146,7 @@ class SYNC_EXPORT_PRIVATE SyncerProtoUtil {
friend class SyncerProtoUtilTest;
FRIEND_TEST_ALL_PREFIXES(SyncerProtoUtilTest, AddRequestBirthday);
FRIEND_TEST_ALL_PREFIXES(SyncerProtoUtilTest, PostAndProcessHeaders);
+ FRIEND_TEST_ALL_PREFIXES(SyncerProtoUtilTest, VerifyDisabledByAdmin);
FRIEND_TEST_ALL_PREFIXES(SyncerProtoUtilTest, VerifyResponseBirthday);
FRIEND_TEST_ALL_PREFIXES(SyncerProtoUtilTest, HandleThrottlingNoDatatypes);
FRIEND_TEST_ALL_PREFIXES(SyncerProtoUtilTest, HandleThrottlingWithDatatypes);
diff --git a/chromium/sync/engine/syncer_proto_util_unittest.cc b/chromium/sync/engine/syncer_proto_util_unittest.cc
index be494138596..c28813206d3 100644
--- a/chromium/sync/engine/syncer_proto_util_unittest.cc
+++ b/chromium/sync/engine/syncer_proto_util_unittest.cc
@@ -227,6 +227,20 @@ TEST_F(SyncerProtoUtilTest, VerifyResponseBirthday) {
EXPECT_FALSE(SyncerProtoUtil::VerifyResponseBirthday(response, directory()));
}
+TEST_F(SyncerProtoUtilTest, VerifyDisabledByAdmin) {
+ // No error code
+ sync_pb::ClientToServerResponse response;
+ EXPECT_FALSE(SyncerProtoUtil::IsSyncDisabledByAdmin(response));
+
+ // Has error code, but not disabled
+ response.set_error_code(sync_pb::SyncEnums::NOT_MY_BIRTHDAY);
+ EXPECT_FALSE(SyncerProtoUtil::IsSyncDisabledByAdmin(response));
+
+ // Has error code, and is disabled by admin
+ response.set_error_code(sync_pb::SyncEnums::DISABLED_BY_ADMIN);
+ EXPECT_TRUE(SyncerProtoUtil::IsSyncDisabledByAdmin(response));
+}
+
TEST_F(SyncerProtoUtilTest, AddRequestBirthday) {
EXPECT_TRUE(directory()->store_birthday().empty());
ClientToServerMessage msg;
diff --git a/chromium/sync/internal_api/public/engine/model_safe_worker.cc b/chromium/sync/internal_api/public/engine/model_safe_worker.cc
index 7179ed52b69..5c9171521eb 100644
--- a/chromium/sync/internal_api/public/engine/model_safe_worker.cc
+++ b/chromium/sync/internal_api/public/engine/model_safe_worker.cc
@@ -134,11 +134,17 @@ void ModelSafeWorker::WillDestroyCurrentMessageLoop() {
<< " worker stops on destruction of its working thread.";
}
+ {
+ base::AutoLock l(working_loop_lock_);
+ working_loop_ = NULL;
+ }
+
if (observer_)
observer_->OnWorkerLoopDestroyed(GetModelSafeGroup());
}
void ModelSafeWorker::SetWorkingLoopToCurrent() {
+ base::AutoLock l(working_loop_lock_);
DCHECK(!working_loop_);
working_loop_ = base::MessageLoop::current();
working_loop_set_wait_.Signal();
@@ -150,19 +156,29 @@ void ModelSafeWorker::UnregisterForLoopDestruction(
// loop.
working_loop_set_wait_.Wait();
- // Should be called on sync loop.
- DCHECK_NE(base::MessageLoop::current(), working_loop_);
- DCHECK(working_loop_);
- working_loop_->PostTask(
- FROM_HERE,
- base::Bind(&ModelSafeWorker::UnregisterForLoopDestructionAsync,
- this, unregister_done_callback));
+ {
+ base::AutoLock l(working_loop_lock_);
+ if (working_loop_ != NULL) {
+ // Should be called on sync loop.
+ DCHECK_NE(base::MessageLoop::current(), working_loop_);
+ working_loop_->PostTask(
+ FROM_HERE,
+ base::Bind(&ModelSafeWorker::UnregisterForLoopDestructionAsync,
+ this, unregister_done_callback));
+ }
+ }
}
void ModelSafeWorker::UnregisterForLoopDestructionAsync(
base::Callback<void(ModelSafeGroup)> unregister_done_callback) {
+ {
+ base::AutoLock l(working_loop_lock_);
+ if (!working_loop_)
+ return;
+ DCHECK_EQ(base::MessageLoop::current(), working_loop_);
+ }
+
DCHECK(stopped_);
- DCHECK_EQ(base::MessageLoop::current(), working_loop_);
base::MessageLoop::current()->RemoveDestructionObserver(this);
unregister_done_callback.Run(GetModelSafeGroup());
}
diff --git a/chromium/sync/internal_api/public/engine/model_safe_worker.h b/chromium/sync/internal_api/public/engine/model_safe_worker.h
index f6b7ea6d177..0f415942bd3 100644
--- a/chromium/sync/internal_api/public/engine/model_safe_worker.h
+++ b/chromium/sync/internal_api/public/engine/model_safe_worker.h
@@ -132,6 +132,7 @@ class SYNC_EXPORT ModelSafeWorker
// Remember working loop for posting task to unregister destruction
// observation from sync thread when shutting down sync.
+ base::Lock working_loop_lock_;
base::MessageLoop* working_loop_;
base::WaitableEvent working_loop_set_wait_;
};
diff --git a/chromium/third_party/WebKit/Source/bindings/OWNERS b/chromium/third_party/WebKit/Source/bindings/OWNERS
index 53d82fa65a9..04eb6bc41ea 100644
--- a/chromium/third_party/WebKit/Source/bindings/OWNERS
+++ b/chromium/third_party/WebKit/Source/bindings/OWNERS
@@ -1,6 +1,5 @@
abarth@chromium.org
adamk@chromium.org
-arv@chromium.org
ch.dumez@sisa.samsung.com
dcarney@chromium.org
dglazkov@chromium.org
diff --git a/chromium/third_party/WebKit/Source/bindings/scripts/IDLAttributes.txt b/chromium/third_party/WebKit/Source/bindings/scripts/IDLAttributes.txt
index bec45e791f4..f3768392a09 100644
--- a/chromium/third_party/WebKit/Source/bindings/scripts/IDLAttributes.txt
+++ b/chromium/third_party/WebKit/Source/bindings/scripts/IDLAttributes.txt
@@ -59,6 +59,7 @@ GlobalContext=Window|WorkerGlobalScope|SharedWorkerGlobalScope|DedicatedWorkerGl
Immutable
ImplementedAs=*
InitializedByEventConstructor
+IsIndex
# FIXME: We should remove this extended attribute once the needed refactoring is complete.
LegacyImplementedInBaseClass
MasqueradesAsUndefined
diff --git a/chromium/third_party/WebKit/Source/bindings/scripts/deprecated_code_generator_v8.pm b/chromium/third_party/WebKit/Source/bindings/scripts/deprecated_code_generator_v8.pm
index 39c5394140f..c327e692186 100644
--- a/chromium/third_party/WebKit/Source/bindings/scripts/deprecated_code_generator_v8.pm
+++ b/chromium/third_party/WebKit/Source/bindings/scripts/deprecated_code_generator_v8.pm
@@ -2191,6 +2191,14 @@ END
}
my $raisesExceptions = $function->extendedAttributes->{"RaisesException"};
+ if (!$raisesExceptions) {
+ foreach my $parameter (@{$function->parameters}) {
+ if ($parameter->extendedAttributes->{"IsIndex"}) {
+ $raisesExceptions = 1;
+ }
+ }
+ }
+
if ($raisesExceptions) {
AddToImplIncludes("bindings/v8/ExceptionState.h");
$code .= " ExceptionState es(args.GetIsolate());\n";
@@ -2409,6 +2417,14 @@ sub GenerateParametersCheck
}
}
+ if ($parameter->extendedAttributes->{"IsIndex"}) {
+ AddToImplIncludes("core/dom/ExceptionCode.h");
+ $parameterCheckString .= " if (UNLIKELY($parameterName < 0)) {\n";
+ $parameterCheckString .= " setDOMException(IndexSizeError, args.GetIsolate());\n";
+ $parameterCheckString .= " return;\n";
+ $parameterCheckString .= " }\n";
+ }
+
$paramIndex++;
}
return ($parameterCheckString, $paramIndex, %replacements);
@@ -2464,6 +2480,13 @@ sub GenerateSingleConstructorCallback
if ($interface->extendedAttributes->{"ConstructorRaisesException"}) {
$raisesExceptions = 1;
}
+ if (!$raisesExceptions) {
+ foreach my $parameter (@{$function->parameters}) {
+ if ($parameter->extendedAttributes->{"IsIndex"}) {
+ $raisesExceptions = 1;
+ }
+ }
+ }
my @beforeArgumentList;
my @afterArgumentList;
@@ -2723,6 +2746,13 @@ sub GenerateNamedConstructor
if ($interface->extendedAttributes->{"ConstructorRaisesException"}) {
$raisesExceptions = 1;
}
+ if (!$raisesExceptions) {
+ foreach my $parameter (@{$function->parameters}) {
+ if ($parameter->extendedAttributes->{"IsIndex"}) {
+ $raisesExceptions = 1;
+ }
+ }
+ }
my $maybeObserveFeature = GenerateFeatureObservation($function->extendedAttributes->{"MeasureAs"});
my $maybeDeprecateFeature = GenerateDeprecationNotification($function->extendedAttributes->{"DeprecateAs"});
@@ -4952,6 +4982,10 @@ sub GetNativeType
return "double" if $type eq "double";
return "int" if $type eq "long" or $type eq "int" or $type eq "short" or $type eq "byte";
if ($type eq "unsigned long" or $type eq "unsigned int" or $type eq "unsigned short" or $type eq "octet") {
+ if ($extendedAttributes->{"IsIndex"}) {
+ # Special-case index arguments because we need to check that they aren't < 0.
+ return "int";
+ }
return "unsigned";
}
return "long long" if $type eq "long long";
@@ -5031,6 +5065,10 @@ sub JSValueToNativeStatement
my $getIsolate = shift;
my $nativeType = GetNativeType($type, $extendedAttributes, "parameter");
+ if ($type eq "unsigned long" and $extendedAttributes->{"IsIndex"}) {
+ # Special-case index arguments because we need to check that they aren't < 0.
+ $nativeType = "int";
+ }
my $native_value = JSValueToNative($type, $extendedAttributes, $jsValue, $getIsolate);
my $code = "";
if ($type eq "DOMString" || IsEnumType($type)) {
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp b/chromium/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp
index b808512b8a9..02fd9273e7a 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp
+++ b/chromium/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp
@@ -47,7 +47,6 @@
#include "core/dom/CustomElementCallbackDispatcher.h"
#include "core/dom/CustomElementDefinition.h"
#include "core/dom/CustomElementDescriptor.h"
-#include "core/dom/CustomElementException.h"
#include "core/dom/Document.h"
#include "wtf/Assertions.h"
@@ -69,7 +68,7 @@ bool CustomElementConstructorBuilder::isFeatureAllowed() const
return !DOMWrapperWorld::isolatedWorld(m_context);
}
-bool CustomElementConstructorBuilder::validateOptions(const AtomicString& type, ExceptionState& es)
+bool CustomElementConstructorBuilder::validateOptions()
{
ASSERT(m_prototype.IsEmpty());
@@ -80,21 +79,17 @@ bool CustomElementConstructorBuilder::validateOptions(const AtomicString& type,
// is HTMLSpanElement.prototype, has an ambiguity about its
// behavior. The spec should be fixed before WebKit implements
// it. https://www.w3.org/Bugs/Public/show_bug.cgi?id=20801
- CustomElementException::throwException(CustomElementException::NotYetImplemented, type, es);
return false;
}
v8::Handle<v8::Value> prototypeValue = prototypeScriptValue.v8Value();
- if (prototypeValue.IsEmpty() || !prototypeValue->IsObject()) {
- CustomElementException::throwException(CustomElementException::PrototypeNotAnObject, type, es);
+ if (prototypeValue.IsEmpty() || !prototypeValue->IsObject())
return false;
- }
m_prototype = prototypeValue.As<v8::Object>();
V8PerContextData* perContextData;
if (!(perContextData = V8PerContextData::from(m_context))) {
// FIXME: This should generate an InvalidContext exception at a later point.
- CustomElementException::throwException(CustomElementException::ContextDestroyedCheckingPrototype, type, es);
return false;
}
@@ -114,7 +109,6 @@ bool CustomElementConstructorBuilder::validateOptions(const AtomicString& type,
return true;
}
- CustomElementException::throwException(CustomElementException::PrototypeDoesNotExtendHTMLElementSVGElementPrototype, type, es);
return false;
}
@@ -176,7 +170,7 @@ v8::Handle<v8::Function> CustomElementConstructorBuilder::retrieveCallback(v8::I
return value.As<v8::Function>();
}
-bool CustomElementConstructorBuilder::createConstructor(Document* document, CustomElementDefinition* definition, ExceptionState& es)
+bool CustomElementConstructorBuilder::createConstructor(Document* document, CustomElementDefinition* definition)
{
ASSERT(!m_prototype.IsEmpty());
ASSERT(m_constructor.IsEmpty());
@@ -184,16 +178,14 @@ bool CustomElementConstructorBuilder::createConstructor(Document* document, Cust
v8::Isolate* isolate = m_context->GetIsolate();
- if (!prototypeIsValid(definition->descriptor().type(), es))
+ if (!prototypeIsValid())
return false;
v8::Local<v8::FunctionTemplate> constructorTemplate = v8::FunctionTemplate::New();
constructorTemplate->SetCallHandler(constructCustomElement);
m_constructor = constructorTemplate->GetFunction();
- if (m_constructor.IsEmpty()) {
- CustomElementException::throwException(CustomElementException::ContextDestroyedRegisteringDefinition, definition->descriptor().type(), es);
+ if (m_constructor.IsEmpty())
return false;
- }
const CustomElementDescriptor& descriptor = definition->descriptor();
@@ -228,15 +220,15 @@ bool CustomElementConstructorBuilder::createConstructor(Document* document, Cust
return true;
}
-bool CustomElementConstructorBuilder::prototypeIsValid(const AtomicString& type, ExceptionState& es) const
+bool CustomElementConstructorBuilder::prototypeIsValid() const
{
if (m_prototype->InternalFieldCount() || !m_prototype->GetHiddenValue(V8HiddenPropertyName::customElementIsInterfacePrototypeObject()).IsEmpty()) {
- CustomElementException::throwException(CustomElementException::PrototypeInUse, type, es);
+ // Alcreated an interface prototype object.
return false;
}
if (m_prototype->GetPropertyAttributes(v8String("constructor", m_context->GetIsolate())) & v8::DontDelete) {
- CustomElementException::throwException(CustomElementException::ConstructorPropertyNotConfigurable, type, es);
+ // "constructor" is not configurable.
return false;
}
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.h b/chromium/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.h
index 84e46bb568a..354fd12aff9 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.h
+++ b/chromium/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.h
@@ -47,7 +47,6 @@ class CustomElementDefinition;
class Dictionary;
class Document;
class Element;
-class ExceptionState;
class QualifiedName;
class ScriptState;
class V8PerContextData;
@@ -67,10 +66,10 @@ public:
// (returns false), the calls must stop.
bool isFeatureAllowed() const;
- bool validateOptions(const AtomicString& type, ExceptionState&);
+ bool validateOptions();
bool findTagName(const AtomicString& customElementType, QualifiedName& tagName);
PassRefPtr<CustomElementLifecycleCallbacks> createCallbacks();
- bool createConstructor(Document*, CustomElementDefinition*, ExceptionState&);
+ bool createConstructor(Document*, CustomElementDefinition*);
bool didRegisterDefinition(CustomElementDefinition*) const;
// This method collects a return value for the bindings. It is
@@ -81,7 +80,7 @@ public:
private:
static WrapperTypeInfo* findWrapperType(v8::Handle<v8::Value> chain);
bool hasValidPrototypeChainFor(V8PerContextData*, WrapperTypeInfo*) const;
- bool prototypeIsValid(const AtomicString& type, ExceptionState&) const;
+ bool prototypeIsValid() const;
v8::Handle<v8::Function> retrieveCallback(v8::Isolate*, const char* name);
v8::Handle<v8::Context> m_context;
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/ScriptProfiler.cpp b/chromium/third_party/WebKit/Source/bindings/v8/ScriptProfiler.cpp
index f9f5604fd51..f2856c68bc5 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/ScriptProfiler.cpp
+++ b/chromium/third_party/WebKit/Source/bindings/v8/ScriptProfiler.cpp
@@ -303,11 +303,4 @@ ProfileNameIdleTimeMap* ScriptProfiler::currentProfileNameIdleTimeMap()
return *map;
}
-void ScriptProfiler::setIdle(bool isIdle)
-{
- v8::Isolate* isolate = v8::Isolate::GetCurrent();
- if (v8::CpuProfiler* profiler = isolate->GetCpuProfiler())
- profiler->SetIdle(isIdle);
-}
-
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/ScriptProfiler.h b/chromium/third_party/WebKit/Source/bindings/v8/ScriptProfiler.h
index 93f25bcb86c..e11979c02de 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/ScriptProfiler.h
+++ b/chromium/third_party/WebKit/Source/bindings/v8/ScriptProfiler.h
@@ -79,7 +79,6 @@ public:
static void initialize();
static void visitNodeWrappers(WrappedNodeVisitor*);
static HashMap<String, double>* currentProfileNameIdleTimeMap();
- static void setIdle(bool isIdle);
};
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/ScriptSourceCode.h b/chromium/third_party/WebKit/Source/bindings/v8/ScriptSourceCode.h
index 5bacd8bb116..97046ef4024 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/ScriptSourceCode.h
+++ b/chromium/third_party/WebKit/Source/bindings/v8/ScriptSourceCode.h
@@ -31,8 +31,8 @@
#ifndef ScriptSourceCode_h
#define ScriptSourceCode_h
-#include "core/fetch/ResourcePtr.h"
-#include "core/fetch/ScriptResource.h"
+#include "core/loader/cache/ResourcePtr.h"
+#include "core/loader/cache/ScriptResource.h"
#include "weborigin/KURL.h"
#include "wtf/PassOwnPtr.h"
#include "wtf/text/TextPosition.h"
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/V8ErrorHandler.cpp b/chromium/third_party/WebKit/Source/bindings/v8/V8ErrorHandler.cpp
index f7b9681e8d6..8f8b7c2cde5 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/V8ErrorHandler.cpp
+++ b/chromium/third_party/WebKit/Source/bindings/v8/V8ErrorHandler.cpp
@@ -31,16 +31,12 @@
#include "config.h"
#include "bindings/v8/V8ErrorHandler.h"
-#include "V8ErrorEvent.h"
#include "bindings/v8/ScriptController.h"
#include "bindings/v8/V8Binding.h"
#include "bindings/v8/V8HiddenPropertyName.h"
#include "bindings/v8/V8ScriptRunner.h"
-#include "core/dom/Document.h"
#include "core/dom/ErrorEvent.h"
#include "core/dom/EventNames.h"
-#include "core/dom/ScriptExecutionContext.h"
-#include "core/page/Frame.h"
namespace WebCore {
@@ -77,16 +73,6 @@ v8::Local<v8::Value> V8ErrorHandler::callListenerFunction(ScriptExecutionContext
return returnValue;
}
-// static
-void V8ErrorHandler::storeExceptionOnErrorEventWrapper(ErrorEvent* event, v8::Handle<v8::Value> data, v8::Isolate* isolate)
-{
- v8::Local<v8::Value> wrappedEvent = toV8(event, v8::Handle<v8::Object>(), isolate);
- if (!wrappedEvent.IsEmpty()) {
- ASSERT(wrappedEvent->IsObject());
- v8::Local<v8::Object>::Cast(wrappedEvent)->SetHiddenValue(V8HiddenPropertyName::error(), data);
- }
-}
-
bool V8ErrorHandler::shouldPreventDefault(v8::Local<v8::Value> returnValue)
{
return returnValue->IsBoolean() && returnValue->BooleanValue();
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/V8ErrorHandler.h b/chromium/third_party/WebKit/Source/bindings/v8/V8ErrorHandler.h
index 92246d3f136..90fdf5f81a0 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/V8ErrorHandler.h
+++ b/chromium/third_party/WebKit/Source/bindings/v8/V8ErrorHandler.h
@@ -37,9 +37,6 @@
namespace WebCore {
-class ErrorEvent;
-class Frame;
-
class V8ErrorHandler : public V8EventListener {
public:
static PassRefPtr<V8ErrorHandler> create(v8::Local<v8::Object> listener, bool isInline)
@@ -47,8 +44,6 @@ public:
return adoptRef(new V8ErrorHandler(listener, isInline));
}
- static void storeExceptionOnErrorEventWrapper(ErrorEvent*, v8::Handle<v8::Value>, v8::Isolate*);
-
private:
V8ErrorHandler(v8::Local<v8::Object> listener, bool isInline);
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/V8Initializer.cpp b/chromium/third_party/WebKit/Source/bindings/v8/V8Initializer.cpp
index d2e2d9c26a1..fa8be8f0948 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/V8Initializer.cpp
+++ b/chromium/third_party/WebKit/Source/bindings/v8/V8Initializer.cpp
@@ -35,7 +35,6 @@
#include "bindings/v8/ScriptController.h"
#include "bindings/v8/ScriptProfiler.h"
#include "bindings/v8/V8Binding.h"
-#include "bindings/v8/V8ErrorHandler.h"
#include "bindings/v8/V8GCController.h"
#include "bindings/v8/V8HiddenPropertyName.h"
#include "bindings/v8/V8PerContextData.h"
@@ -47,9 +46,9 @@
#include "core/page/DOMWindow.h"
#include "core/page/Frame.h"
#include "core/platform/MemoryUsageSupport.h"
+#include <v8-debug.h>
#include "wtf/RefPtr.h"
#include "wtf/text/WTFString.h"
-#include <v8-debug.h>
namespace WebCore {
@@ -100,14 +99,20 @@ static void messageHandlerInMainThread(v8::Handle<v8::Message> message, v8::Hand
bool shouldUseDocumentURL = resourceName.IsEmpty() || !resourceName->IsString();
String resource = shouldUseDocumentURL ? firstWindow->document()->url() : toWebCoreString(resourceName);
RefPtr<ErrorEvent> event = ErrorEvent::create(errorMessage, resource, message->GetLineNumber(), message->GetStartColumn());
- AccessControlStatus corsStatus = message->IsSharedCrossOrigin() ? SharableCrossOrigin : NotSharableCrossOrigin;
- // This method might be called while we're creating a new context. In this case, we
- // avoid storing the exception object, as we can't create a wrapper during context creation.
+ // messageHandlerInMainThread can be called while we're creating a new context.
+ // Since we cannot create a wrapper in the intermediate timing, we need to skip
+ // creating a wrapper for |event|.
DOMWrapperWorld* world = DOMWrapperWorld::current();
Frame* frame = firstWindow->document()->frame();
- if (world && frame && frame->script()->existingWindowShell(world))
- V8ErrorHandler::storeExceptionOnErrorEventWrapper(event.get(), data, v8::Isolate::GetCurrent());
+ if (world && frame && frame->script()->existingWindowShell(world)) {
+ v8::Local<v8::Value> wrappedEvent = toV8(event.get(), v8::Handle<v8::Object>(), v8::Isolate::GetCurrent());
+ if (!wrappedEvent.IsEmpty()) {
+ ASSERT(wrappedEvent->IsObject());
+ v8::Local<v8::Object>::Cast(wrappedEvent)->SetHiddenValue(V8HiddenPropertyName::error(), data);
+ }
+ }
+ AccessControlStatus corsStatus = message->IsSharedCrossOrigin() ? SharableCrossOrigin : NotSharableCrossOrigin;
firstWindow->document()->reportException(event.release(), callStack, corsStatus);
}
@@ -178,9 +183,12 @@ static void messageHandlerInWorker(v8::Handle<v8::Message> message, v8::Handle<v
String errorMessage = toWebCoreString(message->Get());
String sourceURL = toWebCoreString(message->GetScriptResourceName());
RefPtr<ErrorEvent> event = ErrorEvent::create(errorMessage, sourceURL, message->GetLineNumber(), message->GetStartColumn());
+ v8::Local<v8::Value> wrappedEvent = toV8(event.get(), v8::Handle<v8::Object>(), v8::Isolate::GetCurrent());
+ if (!wrappedEvent.IsEmpty()) {
+ ASSERT(wrappedEvent->IsObject());
+ v8::Local<v8::Object>::Cast(wrappedEvent)->SetHiddenValue(V8HiddenPropertyName::error(), data);
+ }
AccessControlStatus corsStatus = message->IsSharedCrossOrigin() ? SharableCrossOrigin : NotSharableCrossOrigin;
-
- V8ErrorHandler::storeExceptionOnErrorEventWrapper(event.get(), data, v8::Isolate::GetCurrent());
context->reportException(event.release(), 0, corsStatus);
}
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/V8ScriptRunner.cpp b/chromium/third_party/WebKit/Source/bindings/v8/V8ScriptRunner.cpp
index cab312f6445..700441650cc 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/V8ScriptRunner.cpp
+++ b/chromium/third_party/WebKit/Source/bindings/v8/V8ScriptRunner.cpp
@@ -30,8 +30,8 @@
#include "bindings/v8/V8GCController.h"
#include "bindings/v8/V8RecursionScope.h"
#include "core/dom/ScriptExecutionContext.h"
-#include "core/fetch/ScriptResource.h"
#include "core/loader/CachedMetadata.h"
+#include "core/loader/cache/ScriptResource.h"
#include "core/platform/chromium/TraceEvent.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/WorkerScriptController.cpp b/chromium/third_party/WebKit/Source/bindings/v8/WorkerScriptController.cpp
index cbbf758d16d..a0d3b2f5b1e 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/WorkerScriptController.cpp
+++ b/chromium/third_party/WebKit/Source/bindings/v8/WorkerScriptController.cpp
@@ -37,7 +37,6 @@
#include "V8WorkerGlobalScope.h"
#include "bindings/v8/ScriptSourceCode.h"
#include "bindings/v8/ScriptValue.h"
-#include "bindings/v8/V8ErrorHandler.h"
#include "bindings/v8/V8GCController.h"
#include "bindings/v8/V8Initializer.h"
#include "bindings/v8/V8ObjectConstructor.h"
@@ -168,7 +167,6 @@ ScriptValue WorkerScriptController::evaluate(const String& script, const String&
state->lineNumber = message->GetLineNumber();
state->columnNumber = message->GetStartColumn();
state->sourceURL = toWebCoreString(message->GetScriptResourceName());
- state->exception = ScriptValue(block.Exception());
block.Reset();
} else
state->hadException = false;
@@ -190,10 +188,10 @@ void WorkerScriptController::evaluate(const ScriptSourceCode& sourceCode, RefPtr
if (errorEvent) {
*errorEvent = m_workerGlobalScope->shouldSanitizeScriptError(state.sourceURL, NotSharableCrossOrigin) ?
ErrorEvent::createSanitizedError() : ErrorEvent::create(state.errorMessage, state.sourceURL, state.lineNumber, state.columnNumber);
- V8ErrorHandler::storeExceptionOnErrorEventWrapper(errorEvent->get(), state.exception.v8Value(), m_isolate);
} else {
ASSERT(!m_workerGlobalScope->shouldSanitizeScriptError(state.sourceURL, NotSharableCrossOrigin));
RefPtr<ErrorEvent> event = m_errorEventFromImportedScript ? m_errorEventFromImportedScript.release() : ErrorEvent::create(state.errorMessage, state.sourceURL, state.lineNumber, state.columnNumber);
+ m_errorEventFromImportedScript.clear();
m_workerGlobalScope->reportException(event, 0, NotSharableCrossOrigin);
}
}
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/WorkerScriptController.h b/chromium/third_party/WebKit/Source/bindings/v8/WorkerScriptController.h
index 0697da0b0a6..dd0e5745106 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/WorkerScriptController.h
+++ b/chromium/third_party/WebKit/Source/bindings/v8/WorkerScriptController.h
@@ -58,7 +58,6 @@ namespace WebCore {
int lineNumber;
int columnNumber;
String sourceURL;
- ScriptValue exception;
};
class WorkerScriptController {
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/custom/V8WorkerGlobalScopeCustom.cpp b/chromium/third_party/WebKit/Source/bindings/v8/custom/V8WorkerGlobalScopeCustom.cpp
index b2e35d93b49..87d751da456 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/custom/V8WorkerGlobalScopeCustom.cpp
+++ b/chromium/third_party/WebKit/Source/bindings/v8/custom/V8WorkerGlobalScopeCustom.cpp
@@ -94,6 +94,26 @@ void SetTimeoutOrInterval(const v8::FunctionCallbackInfo<v8::Value>& args, bool
v8SetReturnValue(args, timerId);
}
+void V8WorkerGlobalScope::importScriptsMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& args)
+{
+ if (!args.Length())
+ return;
+
+ Vector<String> urls;
+ for (int i = 0; i < args.Length(); i++) {
+ V8TRYCATCH_VOID(v8::Handle<v8::String>, scriptUrl, args[i]->ToString());
+ if (scriptUrl.IsEmpty())
+ return;
+ urls.append(toWebCoreString(scriptUrl));
+ }
+
+ WorkerGlobalScope* workerGlobalScope = V8WorkerGlobalScope::toNative(args.Holder());
+
+ ExceptionState es(args.GetIsolate());
+ workerGlobalScope->importScripts(urls, es);
+ es.throwIfNeeded();
+}
+
void V8WorkerGlobalScope::setTimeoutMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& args)
{
return SetTimeoutOrInterval(args, true);
diff --git a/chromium/third_party/WebKit/Source/bindings/v8/custom/V8XMLHttpRequestCustom.cpp b/chromium/third_party/WebKit/Source/bindings/v8/custom/V8XMLHttpRequestCustom.cpp
index 9d734b6b26d..e9eabc2f481 100644
--- a/chromium/third_party/WebKit/Source/bindings/v8/custom/V8XMLHttpRequestCustom.cpp
+++ b/chromium/third_party/WebKit/Source/bindings/v8/custom/V8XMLHttpRequestCustom.cpp
@@ -102,14 +102,20 @@ void V8XMLHttpRequest::responseAttrGetterCustom(v8::Local<v8::String> name, cons
case XMLHttpRequest::ResponseTypeBlob:
{
- Blob* blob = xmlHttpRequest->responseBlob();
+ ExceptionState es(info.GetIsolate());
+ Blob* blob = xmlHttpRequest->responseBlob(es);
+ if (es.throwIfNeeded())
+ return;
v8SetReturnValue(info, toV8Fast(blob, info, xmlHttpRequest));
return;
}
case XMLHttpRequest::ResponseTypeArrayBuffer:
{
- ArrayBuffer* arrayBuffer = xmlHttpRequest->responseArrayBuffer();
+ ExceptionState es(info.GetIsolate());
+ ArrayBuffer* arrayBuffer = xmlHttpRequest->responseArrayBuffer(es);
+ if (es.throwIfNeeded())
+ return;
if (arrayBuffer && !arrayBuffer->hasDeallocationObserver()) {
arrayBuffer->setDeallocationObserver(V8ArrayBufferDeallocationObserver::instance());
v8::V8::AdjustAmountOfExternalAllocatedMemory(arrayBuffer->byteLength());
diff --git a/chromium/third_party/WebKit/Source/core/animation/AnimatableTransform.cpp b/chromium/third_party/WebKit/Source/core/animation/AnimatableTransform.cpp
deleted file mode 100644
index 8606a25a179..00000000000
--- a/chromium/third_party/WebKit/Source/core/animation/AnimatableTransform.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "core/animation/AnimatableTransform.h"
-
-namespace WebCore {
-
-PassRefPtr<AnimatableTransform> AnimatableTransform::create(const TransformOperations& transform)
-{
- return adoptRef(new AnimatableTransform(transform));
-}
-
-PassRefPtr<AnimatableValue> AnimatableTransform::interpolateTo(const AnimatableValue* value, double fraction) const
-{
- const AnimatableTransform* transform = toAnimatableTransform(value);
- return AnimatableTransform::create(transform->m_transform.blend(m_transform, fraction));
-}
-
-PassRefPtr<AnimatableValue> AnimatableTransform::addWith(const AnimatableValue* value) const
-{
- const AnimatableTransform* transform = toAnimatableTransform(value);
- return AnimatableTransform::create(m_transform.add(transform->m_transform));
-}
-
-} // namespace WebCore
-
diff --git a/chromium/third_party/WebKit/Source/core/animation/AnimatableValue.h b/chromium/third_party/WebKit/Source/core/animation/AnimatableValue.h
index 94a65d1caef..3145e0a7621 100644
--- a/chromium/third_party/WebKit/Source/core/animation/AnimatableValue.h
+++ b/chromium/third_party/WebKit/Source/core/animation/AnimatableValue.h
@@ -50,14 +50,12 @@ public:
bool isNumber() const { return m_type == TypeNumber; }
bool isNeutral() const { return m_type == TypeNeutral; }
- bool isTransform() const { return m_type == TypeTransform; }
bool isUnknown() const { return m_type == TypeUnknown; }
protected:
enum AnimatableType {
TypeNeutral,
TypeNumber,
- TypeTransform,
TypeUnknown,
};
diff --git a/chromium/third_party/WebKit/Source/core/animation/DocumentTimeline.cpp b/chromium/third_party/WebKit/Source/core/animation/DocumentTimeline.cpp
index 6a023d2a7d2..63ce0b325db 100644
--- a/chromium/third_party/WebKit/Source/core/animation/DocumentTimeline.cpp
+++ b/chromium/third_party/WebKit/Source/core/animation/DocumentTimeline.cpp
@@ -45,7 +45,6 @@ PassRefPtr<DocumentTimeline> DocumentTimeline::create(Document* document)
DocumentTimeline::DocumentTimeline(Document* document)
: m_currentTime(nullValue())
, m_document(document)
- , m_zeroTimeAsPerfTime(nullValue())
{
ASSERT(document);
}
@@ -63,10 +62,7 @@ PassRefPtr<Player> DocumentTimeline::play(TimedItem* child)
void DocumentTimeline::serviceAnimations(double monotonicAnimationStartTime)
{
- if (!isNull(m_zeroTimeAsPerfTime)) {
- ASSERT((isNull(m_currentTime)) || (m_currentTime + m_zeroTimeAsPerfTime <= monotonicAnimationStartTime));
- m_currentTime = monotonicAnimationStartTime - m_zeroTimeAsPerfTime;
- }
+ m_currentTime = monotonicAnimationStartTime;
for (int i = m_players.size() - 1; i >= 0; --i) {
if (!m_players[i]->update())
@@ -79,12 +75,6 @@ void DocumentTimeline::serviceAnimations(double monotonicAnimationStartTime)
dispatchEvents();
}
-void DocumentTimeline::setZeroTimeAsPerfTime(double zeroTime)
-{
- ASSERT(isNull(m_zeroTimeAsPerfTime));
- m_zeroTimeAsPerfTime = zeroTime;
-}
-
void DocumentTimeline::pauseAnimationsForTesting(double pauseTime)
{
for (size_t i = 0; i < m_players.size(); i++) {
@@ -95,17 +85,9 @@ void DocumentTimeline::pauseAnimationsForTesting(double pauseTime)
void DocumentTimeline::dispatchEvents()
{
- Vector<EventToDispatch> events = m_events;
+ for (size_t i = 0; i < m_events.size(); i++)
+ m_events[i].target->dispatchEvent(m_events[i].event.release());
m_events.clear();
- for (size_t i = 0; i < events.size(); i++)
- events[i].target->dispatchEvent(events[i].event.release());
-}
-
-size_t DocumentTimeline::numberOfActiveAnimationsForTesting() const
-{
- // Includes all players whose directly associated timed items
- // are current or in effect.
- return isNull(m_currentTime) ? 0 : m_players.size();
}
} // namespace
diff --git a/chromium/third_party/WebKit/Source/core/animation/DocumentTimeline.h b/chromium/third_party/WebKit/Source/core/animation/DocumentTimeline.h
index 56c4c388028..f5e438fd7db 100644
--- a/chromium/third_party/WebKit/Source/core/animation/DocumentTimeline.h
+++ b/chromium/third_party/WebKit/Source/core/animation/DocumentTimeline.h
@@ -51,12 +51,8 @@ public:
static PassRefPtr<DocumentTimeline> create(Document*);
void serviceAnimations(double);
PassRefPtr<Player> play(TimedItem*);
- // Called from setReadyState() in Document.cpp to set m_zeroTimeAsPerfTime to
- // performance.timing.domInteractive.
- void setZeroTimeAsPerfTime(double);
double currentTime() { return m_currentTime; }
void pauseAnimationsForTesting(double);
- size_t numberOfActiveAnimationsForTesting() const;
AnimationStack* animationStack(const Element* element) const
{
if (ActiveAnimations* animations = element->activeAnimations())
@@ -72,7 +68,6 @@ private:
DocumentTimeline(Document*);
void dispatchEvents();
double m_currentTime;
- double m_zeroTimeAsPerfTime;
Document* m_document;
Vector<RefPtr<Player> > m_players;
diff --git a/chromium/third_party/WebKit/Source/core/animation/DocumentTimelineTest.cpp b/chromium/third_party/WebKit/Source/core/animation/DocumentTimelineTest.cpp
index e7d0e435c1d..ca515be0a69 100644
--- a/chromium/third_party/WebKit/Source/core/animation/DocumentTimelineTest.cpp
+++ b/chromium/third_party/WebKit/Source/core/animation/DocumentTimelineTest.cpp
@@ -51,7 +51,6 @@ protected:
document = Document::create();
element = Element::create(nullQName() , document.get());
timeline = DocumentTimeline::create(document.get());
- timeline->setZeroTimeAsPerfTime(0);
}
RefPtr<Document> document;
@@ -78,24 +77,6 @@ TEST_F(DocumentTimelineTest, EmptyKeyframeAnimation)
EXPECT_FLOAT_EQ(100, timeline->currentTime());
}
-TEST_F(DocumentTimelineTest, ZeroTimeAsPerfTime)
-{
- timeline = DocumentTimeline::create(document.get());
-
- timeline->serviceAnimations(100);
- EXPECT_TRUE(isNull(timeline->currentTime()));
-
- timeline->serviceAnimations(200);
- EXPECT_TRUE(isNull(timeline->currentTime()));
-
- timeline->setZeroTimeAsPerfTime(300);
- timeline->serviceAnimations(300);
- EXPECT_EQ(0, timeline->currentTime());
-
- timeline->serviceAnimations(400);
- EXPECT_EQ(100, timeline->currentTime());
-}
-
TEST_F(DocumentTimelineTest, PauseForTesting)
{
float seekTime = 1;
@@ -109,47 +90,4 @@ TEST_F(DocumentTimelineTest, PauseForTesting)
EXPECT_FLOAT_EQ(seekTime, player2->currentTime());
}
-TEST_F(DocumentTimelineTest, NumberOfActiveAnimations)
-{
- Timing timingForwardFill;
- timingForwardFill.hasIterationDuration = true;
- timingForwardFill.iterationDuration = 2;
-
- Timing timingNoFill;
- timingNoFill.hasIterationDuration = true;
- timingNoFill.iterationDuration = 2;
- timingNoFill.fillMode = Timing::FillModeNone;
-
- Timing timingBackwardFillDelay;
- timingBackwardFillDelay.hasIterationDuration = true;
- timingBackwardFillDelay.iterationDuration = 1;
- timingBackwardFillDelay.fillMode = Timing::FillModeBackwards;
- timingBackwardFillDelay.startDelay = 1;
-
- Timing timingNoFillDelay;
- timingNoFillDelay.hasIterationDuration = true;
- timingNoFillDelay.iterationDuration = 1;
- timingNoFillDelay.fillMode = Timing::FillModeNone;
- timingNoFillDelay.startDelay = 1;
-
- RefPtr<Animation> anim1 = Animation::create(element.get(), KeyframeAnimationEffect::create(KeyframeAnimationEffect::KeyframeVector()), timingForwardFill);
- RefPtr<Animation> anim2 = Animation::create(element.get(), KeyframeAnimationEffect::create(KeyframeAnimationEffect::KeyframeVector()), timingNoFill);
- RefPtr<Animation> anim3 = Animation::create(element.get(), KeyframeAnimationEffect::create(KeyframeAnimationEffect::KeyframeVector()), timingBackwardFillDelay);
- RefPtr<Animation> anim4 = Animation::create(element.get(), KeyframeAnimationEffect::create(KeyframeAnimationEffect::KeyframeVector()), timingNoFillDelay);
-
- RefPtr<Player> player1 = timeline->play(anim1.get());
- RefPtr<Player> player2 = timeline->play(anim2.get());
- RefPtr<Player> player3 = timeline->play(anim3.get());
- RefPtr<Player> player4 = timeline->play(anim4.get());
-
- timeline->serviceAnimations(0);
- EXPECT_EQ(4U, timeline->numberOfActiveAnimationsForTesting());
- timeline->serviceAnimations(0.5);
- EXPECT_EQ(4U, timeline->numberOfActiveAnimationsForTesting());
- timeline->serviceAnimations(1.5);
- EXPECT_EQ(4U, timeline->numberOfActiveAnimationsForTesting());
- timeline->serviceAnimations(3);
- EXPECT_EQ(1U, timeline->numberOfActiveAnimationsForTesting());
-}
-
}
diff --git a/chromium/third_party/WebKit/Source/core/animation/Player.cpp b/chromium/third_party/WebKit/Source/core/animation/Player.cpp
index 0d44da78a69..7af07e2d49d 100644
--- a/chromium/third_party/WebKit/Source/core/animation/Player.cpp
+++ b/chromium/third_party/WebKit/Source/core/animation/Player.cpp
@@ -99,7 +99,6 @@ void Player::cancel()
if (!m_content)
return;
- ASSERT(m_content->player() == this);
m_content->detach();
m_content = 0;
}
diff --git a/chromium/third_party/WebKit/Source/core/animation/PlayerTest.cpp b/chromium/third_party/WebKit/Source/core/animation/PlayerTest.cpp
index 744f2189b76..26970a998b5 100644
--- a/chromium/third_party/WebKit/Source/core/animation/PlayerTest.cpp
+++ b/chromium/third_party/WebKit/Source/core/animation/PlayerTest.cpp
@@ -48,7 +48,6 @@ protected:
document = Document::create();
timeline = DocumentTimeline::create(document.get());
player = Player::create(timeline.get(), 0);
- timeline->setZeroTimeAsPerfTime(0);
}
bool updateTimeline(double time)
diff --git a/chromium/third_party/WebKit/Source/core/animation/css/CSSAnimatableValueFactory.cpp b/chromium/third_party/WebKit/Source/core/animation/css/CSSAnimatableValueFactory.cpp
index 59381639cba..3d97ec3fff2 100644
--- a/chromium/third_party/WebKit/Source/core/animation/css/CSSAnimatableValueFactory.cpp
+++ b/chromium/third_party/WebKit/Source/core/animation/css/CSSAnimatableValueFactory.cpp
@@ -33,7 +33,6 @@
#include "CSSValueKeywords.h"
#include "core/animation/AnimatableNumber.h"
-#include "core/animation/AnimatableTransform.h"
#include "core/animation/AnimatableUnknown.h"
#include "core/platform/Length.h"
#include "core/rendering/style/RenderStyle.h"
@@ -113,6 +112,7 @@ namespace WebCore {
// CSSPropertyWebkitShapeInside
// CSSPropertyWebkitTextFillColor
// CSSPropertyWebkitTextStrokeColor
+// CSSPropertyWebkitTransform
// CSSPropertyWebkitTransformOriginZ
// CSSPropertyWidows
// CSSPropertyWordSpacing
@@ -207,8 +207,6 @@ PassRefPtr<AnimatableValue> CSSAnimatableValueFactory::create(CSSPropertyID prop
return createFromLength(style->perspectiveOriginX(), style);
case CSSPropertyWebkitPerspectiveOriginY:
return createFromLength(style->perspectiveOriginY(), style);
- case CSSPropertyWebkitTransform:
- return AnimatableTransform::create(style->transform());
case CSSPropertyWebkitTransformOriginX:
return createFromLength(style->transformOriginX(), style);
case CSSPropertyWebkitTransformOriginY:
diff --git a/chromium/third_party/WebKit/Source/core/animation/css/CSSAnimations.h b/chromium/third_party/WebKit/Source/core/animation/css/CSSAnimations.h
index bd3c4e9517c..45dcf84b59e 100644
--- a/chromium/third_party/WebKit/Source/core/animation/css/CSSAnimations.h
+++ b/chromium/third_party/WebKit/Source/core/animation/css/CSSAnimations.h
@@ -78,7 +78,7 @@ public:
bool isEmpty() const { return m_animations.isEmpty(); }
void cancel();
private:
- typedef HashMap<StringImpl*, RefPtr<Player> > AnimationMap;
+ typedef HashMap<StringImpl*, Player*> AnimationMap;
AnimationMap m_animations;
class EventDelegate FINAL : public TimedItemEventDelegate {
public:
diff --git a/chromium/third_party/WebKit/Source/core/core.gyp b/chromium/third_party/WebKit/Source/core/core.gyp
index 106900d4266..7bf2ad20d6f 100644
--- a/chromium/third_party/WebKit/Source/core/core.gyp
+++ b/chromium/third_party/WebKit/Source/core/core.gyp
@@ -623,6 +623,27 @@
['exclude', 'platform/graphics/cpu/arm/filters/.*NEON\\.(cpp|h)'],
],
'conditions': [
+ ['use_default_render_theme==1', {
+ 'sources/': [
+ ['exclude', 'platform/chromium/PlatformThemeChromiumWin.h'],
+ ['exclude', 'platform/chromium/PlatformThemeChromiumWin.cpp'],
+ ['exclude', 'platform/chromium/ScrollbarThemeChromiumWin.cpp'],
+ ['exclude', 'platform/chromium/ScrollbarThemeChromiumWin.h'],
+ ],
+ }, { # use_default_render_theme==0
+ 'sources/': [
+ ['exclude', 'platform/chromium/PlatformThemeChromiumDefault.cpp'],
+ ['exclude', 'platform/chromium/PlatformThemeChromiumDefault.h'],
+ ['exclude', 'platform/chromium/ScrollbarThemeChromiumDefault.cpp'],
+ ['exclude', 'platform/chromium/ScrollbarThemeChromiumDefault.h'],
+ ],
+ }],
+ ['use_default_render_theme==0 and OS!="android"', {
+ 'sources/': [
+ ['exclude', 'platform/chromium/ScrollbarThemeChromiumOverlay.cpp'],
+ ['exclude', 'platform/chromium/ScrollbarThemeChromiumOverlay.h'],
+ ]
+ }],
['OS=="linux" or OS=="android"', {
'sources/': [
# Cherry-pick files excluded by the broader regular expressions above.
@@ -649,9 +670,14 @@
['exclude', 'Linux\\.cpp$'],
],
}],
- ['toolkit_uses_gtk == 0', {
+ ['toolkit_uses_gtk == 1', {
+ 'sources/': [
+ # Cherry-pick files excluded by the broader regular expressions above.
+ ['include', 'platform/chromium/KeyCodeConversionGtk\\.cpp$'],
+ ],
+ }, { # toolkit_uses_gtk==0
'sources/': [
- ['exclude', 'platform/chromium/KeyCodeConversionGtk\\.cpp$'],
+ ['exclude', 'Gtk\\.cpp$'],
],
}],
['OS=="mac"', {
@@ -690,6 +716,9 @@
['include', 'platform/mac/KillRingMac\\.mm$'],
['include', 'platform/mac/LocalCurrentGraphicsContext\\.mm$'],
['include', 'platform/mac/NSScrollerImpDetails\\.mm$'],
+ ['include', 'platform/mac/ScrollbarThemeMac\\.mm$'],
+ ['include', 'platform/mac/ScrollbarThemeMacNonOverlayAPI\\.mm$'],
+ ['include', 'platform/mac/ScrollbarThemeMacOverlayAPI\\.mm$'],
['include', 'platform/mac/ScrollAnimatorMac\\.mm$'],
['include', 'platform/mac/ScrollElasticityController\\.mm$'],
['include', 'platform/mac/ThemeMac\\.h$'],
@@ -715,7 +744,9 @@
# included by regex above, instead.
['exclude', 'platform/graphics/skia/FontCustomPlatformDataSkia\\.cpp$'],
- ['exclude', 'platform/ScrollbarThemeNonMacCommon\\.(cpp|h)$'],
+ # The Mac currently uses ScrollbarThemeChromiumMac.mm, which is not
+ # related to ScrollbarThemeChromium.cpp.
+ ['exclude', 'platform/chromium/ScrollbarThemeChromium\\.cpp$'],
# Mac uses only ScrollAnimatorMac.
['exclude', 'platform/ScrollAnimatorNone\\.cpp$'],
@@ -740,7 +771,6 @@
},{ # OS!="mac"
'sources/': [
['exclude', 'Mac\\.(cpp|mm?)$'],
- ['exclude', 'ScrollbarThemeMac'],
# FIXME: We will eventually compile this too, but for now it's
# only used on mac.
@@ -756,10 +786,9 @@
'sources/': [
['exclude', 'Posix\\.cpp$'],
- ['include', 'platform/ScrollbarThemeWin\\.(cpp|h)$'],
- ['include', 'platform/graphics/chromium/TransparencyWin\\.(cpp|h)$'],
- ['include', 'platform/graphics/opentype/'],
- ['include', 'platform/graphics/skia/SkiaFontWin\\.(cpp|h)$'],
+ ['include', '/opentype/'],
+ ['include', '/SkiaFontWin\\.cpp$'],
+ ['include', '/TransparencyWin\\.cpp$'],
['exclude', 'platform/graphics/skia/FontCacheSkia\\.cpp$'],
@@ -815,22 +844,6 @@
['exclude', 'Android\\.cpp$'],
],
}],
- ['use_default_render_theme==1', {
- 'sources/': [
- ['exclude', 'platform/ScrollbarThemeWin\\.(cpp|h)'],
- ['exclude', 'platform/chromium/PlatformThemeChromiumWin\\.(cpp|h)'],
- ],
- }, { # use_default_render_theme==0
- 'sources/': [
- ['exclude', 'platform/ScrollbarThemeAuraOrGtk\\.(cpp|h)'],
- ['exclude', 'platform/chromium/PlatformThemeChromiumDefault\\.(cpp|h)'],
- ],
- }],
- ['use_default_render_theme==0 and OS!="android"', {
- 'sources/': [
- ['exclude', 'platform/ScrollbarThemeOverlay\\.(cpp|h)'],
- ]
- }],
],
},
{
diff --git a/chromium/third_party/WebKit/Source/core/core.gypi b/chromium/third_party/WebKit/Source/core/core.gypi
index 8d42702f791..fba11faa789 100644
--- a/chromium/third_party/WebKit/Source/core/core.gypi
+++ b/chromium/third_party/WebKit/Source/core/core.gypi
@@ -241,6 +241,7 @@
'page/EventSource.idl',
'page/History.idl',
'page/ImageBitmap.idl',
+ 'page/ImageBitmapFactories.idl',
'page/Location.idl',
'page/MemoryInfo.idl',
'page/Navigator.idl',
@@ -524,8 +525,6 @@
'animation/AnimatableNeutral.h',
'animation/AnimatableNumber.cpp',
'animation/AnimatableNumber.h',
- 'animation/AnimatableTransform.cpp',
- 'animation/AnimatableTransform.h',
'animation/AnimatableUnknown.h',
'animation/AnimatableValue.cpp',
'animation/AnimatableValue.h',
@@ -875,42 +874,6 @@
'editing/chromium/EditorChromium.cpp',
'editing/htmlediting.cpp',
'editing/markup.cpp',
- 'fetch/CSSStyleSheetResource.cpp',
- 'fetch/CSSStyleSheetResource.h',
- 'fetch/DocumentResource.cpp',
- 'fetch/DocumentResource.h',
- 'fetch/FontResource.cpp',
- 'fetch/FontResource.h',
- 'fetch/ImageResource.cpp',
- 'fetch/ImageResource.h',
- 'fetch/RawResource.cpp',
- 'fetch/RawResource.h',
- 'fetch/Resource.cpp',
- 'fetch/Resource.h',
- 'fetch/ResourceClientWalker.h',
- 'fetch/ResourceFetcher.cpp',
- 'fetch/ResourceFetcher.h',
- 'fetch/ResourceLoadNotifier.cpp',
- 'fetch/ResourceLoadNotifier.h',
- 'fetch/ResourceLoader.cpp',
- 'fetch/ResourceLoader.h',
- 'fetch/ResourceLoaderOptions.h',
- 'fetch/ResourcePtr.cpp',
- 'fetch/ResourcePtr.h',
- 'fetch/FetchRequest.cpp',
- 'fetch/FetchRequest.h',
- 'fetch/FetchInitiatorInfo.h',
- 'fetch/ScriptResource.cpp',
- 'fetch/ScriptResource.h',
- 'fetch/ShaderResource.cpp',
- 'fetch/ShaderResource.h',
- 'fetch/DocumentResourceReference.h',
- 'fetch/TextTrackResource.cpp',
- 'fetch/TextTrackResource.h',
- 'fetch/XSLStyleSheetResource.cpp',
- 'fetch/XSLStyleSheetResource.h',
- 'fetch/MemoryCache.cpp',
- 'fetch/MemoryCache.h',
'fileapi/Blob.cpp',
'fileapi/Blob.h',
'fileapi/BlobBuilder.cpp',
@@ -1107,6 +1070,9 @@
'loader/PrerendererClient.cpp',
'loader/PrerendererClient.h',
'loader/ProgressTracker.cpp',
+ 'loader/ResourceLoadNotifier.cpp',
+ 'loader/ResourceLoader.cpp',
+ 'loader/ResourceLoaderOptions.h',
'loader/SinkDocument.cpp',
'loader/SinkDocument.h',
'loader/SubstituteData.h',
@@ -1132,6 +1098,30 @@
'loader/archive/MHTMLArchive.h',
'loader/archive/MHTMLParser.cpp',
'loader/archive/MHTMLParser.h',
+ 'loader/cache/CSSStyleSheetResource.cpp',
+ 'loader/cache/CSSStyleSheetResource.h',
+ 'loader/cache/DocumentResource.cpp',
+ 'loader/cache/DocumentResource.h',
+ 'loader/cache/FontResource.cpp',
+ 'loader/cache/FontResource.h',
+ 'loader/cache/ImageResource.cpp',
+ 'loader/cache/RawResource.cpp',
+ 'loader/cache/Resource.cpp',
+ 'loader/cache/ResourceClientWalker.h',
+ 'loader/cache/ResourcePtr.cpp',
+ 'loader/cache/ResourceFetcher.cpp',
+ 'loader/cache/FetchRequest.cpp',
+ 'loader/cache/FetchInitiatorInfo.h',
+ 'loader/cache/ScriptResource.cpp',
+ 'loader/cache/ScriptResource.h',
+ 'loader/cache/ShaderResource.cpp',
+ 'loader/cache/ShaderResource.h',
+ 'loader/cache/DocumentResourceReference.h',
+ 'loader/cache/TextTrackResource.cpp',
+ 'loader/cache/TextTrackResource.h',
+ 'loader/cache/XSLStyleSheetResource.cpp',
+ 'loader/cache/XSLStyleSheetResource.h',
+ 'loader/cache/MemoryCache.cpp',
'page/AutoscrollController.cpp',
'page/AutoscrollController.h',
'page/BarProp.cpp',
@@ -1159,10 +1149,6 @@
'page/DOMWindow.h',
'page/DOMWindowBase64.cpp',
'page/DOMWindowBase64.h',
- 'page/DOMWindowLifecycleNotifier.cpp',
- 'page/DOMWindowLifecycleNotifier.h',
- 'page/DOMWindowLifecycleObserver.cpp',
- 'page/DOMWindowLifecycleObserver.h',
'page/DOMWindowTimers.cpp',
'page/DOMWindowTimers.h',
'page/DOMWindowPagePopup.cpp',
@@ -1185,6 +1171,8 @@
'page/History.h',
'page/ImageBitmap.cpp',
'page/ImageBitmap.h',
+ 'page/ImageBitmapFactories.cpp',
+ 'page/ImageBitmapFactories.h',
'page/LayoutMilestones.h',
'page/Location.cpp',
'page/Location.h',
@@ -1494,8 +1482,6 @@
'rendering/RenderWordBreak.h',
'rendering/RootInlineBox.cpp',
'rendering/ScrollBehavior.cpp',
- 'rendering/SubtreeLayoutScope.cpp',
- 'rendering/SubtreeLayoutScope.h',
'rendering/TableLayout.h',
'rendering/TrailingFloatsRootInlineBox.h',
'rendering/VerticalPositionCache.h',
@@ -1503,8 +1489,6 @@
'rendering/break_lines.h',
'rendering/shapes/PolygonShape.cpp',
'rendering/shapes/PolygonShape.h',
- 'rendering/shapes/RasterShape.cpp',
- 'rendering/shapes/RasterShape.h',
'rendering/shapes/RectangleShape.cpp',
'rendering/shapes/RectangleShape.h',
'rendering/shapes/Shape.cpp',
@@ -1764,11 +1748,7 @@
'dom/CustomElementDefinition.h',
'dom/CustomElementDescriptor.h',
'dom/CustomElementDescriptorHash.h',
- 'dom/CustomElementException.cpp',
- 'dom/CustomElementException.h',
'dom/CustomElementLifecycleCallbacks.h',
- 'dom/CustomElementObserver.cpp',
- 'dom/CustomElementObserver.h',
'dom/CustomElementRegistrationContext.cpp',
'dom/CustomElementRegistrationContext.h',
'dom/CustomElementRegistry.cpp',
@@ -1946,8 +1926,6 @@
'dom/SecurityPolicyViolationEvent.h',
'dom/SelectorQuery.cpp',
'dom/SelectorQuery.h',
- 'dom/ShadowTreeStyleSheetCollection.cpp',
- 'dom/ShadowTreeStyleSheetCollection.h',
'dom/SimulatedClickOptions.h',
'dom/SpaceSplitString.cpp',
'dom/StaticNodeList.cpp',
@@ -2605,25 +2583,7 @@
'platform/ScrollView.cpp',
'platform/ScrollableArea.cpp',
'platform/Scrollbar.cpp',
- 'platform/Scrollbar.h',
'platform/ScrollbarTheme.cpp',
- 'platform/ScrollbarTheme.h',
- 'platform/ScrollbarThemeAndroid.cpp',
- 'platform/ScrollbarThemeAuraOrGtk.cpp',
- 'platform/ScrollbarThemeAuraOrGtk.h',
- 'platform/ScrollbarThemeClient.h',
- 'platform/ScrollbarThemeMacCommon.h',
- 'platform/ScrollbarThemeMacCommon.mm',
- 'platform/ScrollbarThemeMacNonOverlayAPI.h',
- 'platform/ScrollbarThemeMacNonOverlayAPI.mm',
- 'platform/ScrollbarThemeMacOverlayAPI.h',
- 'platform/ScrollbarThemeMacOverlayAPI.mm',
- 'platform/ScrollbarThemeNonMacCommon.cpp',
- 'platform/ScrollbarThemeNonMacCommon.h',
- 'platform/ScrollbarThemeOverlay.cpp',
- 'platform/ScrollbarThemeOverlay.h',
- 'platform/ScrollbarThemeWin.cpp',
- 'platform/ScrollbarThemeWin.h',
'platform/SecureTextInput.cpp',
'platform/SecureTextInput.h',
'platform/SerializedResource.h',
@@ -2765,6 +2725,15 @@
'platform/chromium/Prerender.h',
'platform/chromium/PrerenderHandle.cpp',
'platform/chromium/SSLKeyGeneratorChromium.cpp',
+ 'platform/chromium/ScrollbarThemeChromium.cpp',
+ 'platform/chromium/ScrollbarThemeChromium.h',
+ 'platform/chromium/ScrollbarThemeChromiumAndroid.cpp',
+ 'platform/chromium/ScrollbarThemeChromiumDefault.cpp',
+ 'platform/chromium/ScrollbarThemeChromiumDefault.h',
+ 'platform/chromium/ScrollbarThemeChromiumOverlay.cpp',
+ 'platform/chromium/ScrollbarThemeChromiumOverlay.h',
+ 'platform/chromium/ScrollbarThemeChromiumWin.cpp',
+ 'platform/chromium/ScrollbarThemeChromiumWin.h',
'platform/chromium/SharedTimerChromium.cpp',
'platform/chromium/SoundChromiumPosix.cpp',
'platform/chromium/SoundChromiumWin.cpp',
@@ -3088,6 +3057,12 @@
'platform/mac/ScrollAnimatorMac.mm',
'platform/mac/ScrollElasticityController.h',
'platform/mac/ScrollElasticityController.mm',
+ 'platform/mac/ScrollbarThemeMac.h',
+ 'platform/mac/ScrollbarThemeMac.mm',
+ 'platform/mac/ScrollbarThemeMacNonOverlayAPI.h',
+ 'platform/mac/ScrollbarThemeMacNonOverlayAPI.mm',
+ 'platform/mac/ScrollbarThemeMacOverlayAPI.h',
+ 'platform/mac/ScrollbarThemeMacOverlayAPI.mm',
'platform/mac/ThemeMac.h',
'platform/mac/ThemeMac.mm',
'platform/mac/WebFontCache.mm',
@@ -3765,10 +3740,10 @@
'animation/TimedItemCalculationsTest.cpp',
'animation/TimedItemTest.cpp',
'css/CSSParserValuesTest.cpp',
- 'fetch/ImageResourceTest.cpp',
- 'fetch/MemoryCacheTest.cpp',
- 'fetch/ResourceFetcherTest.cpp',
'html/TimeRangesTest.cpp',
+ 'loader/cache/ImageResourceTest.cpp',
+ 'loader/cache/MemoryCacheTest.cpp',
+ 'loader/cache/ResourceFetcherTest.cpp',
'page/ImageBitmapTest.cpp',
'platform/DecimalTest.cpp',
'platform/SharedBufferTest.cpp',
diff --git a/chromium/third_party/WebKit/Source/core/core_derived_sources.gyp b/chromium/third_party/WebKit/Source/core/core_derived_sources.gyp
index e89bab627a6..7e09172cdc1 100644
--- a/chromium/third_party/WebKit/Source/core/core_derived_sources.gyp
+++ b/chromium/third_party/WebKit/Source/core/core_derived_sources.gyp
@@ -481,7 +481,7 @@
'scripts/Hasher.pm',
'scripts/StaticString.pm',
'scripts/make_names.pl',
- 'fetch/FetchInitiatorTypeNames.in',
+ 'loader/cache/FetchInitiatorTypeNames.in',
],
'outputs': [
'<(SHARED_INTERMEDIATE_DIR)/blink/FetchInitiatorTypeNames.cpp',
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSArrayFunctionValue.h b/chromium/third_party/WebKit/Source/core/css/CSSArrayFunctionValue.h
index 9325207b6b0..2e25e9cb3ca 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSArrayFunctionValue.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSArrayFunctionValue.h
@@ -50,7 +50,7 @@ public:
private:
CSSArrayFunctionValue();
- explicit CSSArrayFunctionValue(const CSSArrayFunctionValue& cloneFrom);
+ CSSArrayFunctionValue(const CSSArrayFunctionValue& cloneFrom);
};
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSCanvasValue.h b/chromium/third_party/WebKit/Source/core/css/CSSCanvasValue.h
index 8283adb124e..c2e7b779a1b 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSCanvasValue.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSCanvasValue.h
@@ -50,7 +50,7 @@ public:
bool equals(const CSSCanvasValue&) const;
private:
- explicit CSSCanvasValue(const String& name)
+ CSSCanvasValue(const String& name)
: CSSImageGeneratorValue(CanvasClass)
, m_canvasObserver(this)
, m_name(name)
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp b/chromium/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp
index 7285c6033ca..5484ae54383 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSComputedStyleDeclaration.cpp
@@ -83,14 +83,6 @@ namespace WebCore {
// NOTE: Do not use this list, use computableProperties() instead
// to respect runtime enabling of CSS properties.
static const CSSPropertyID staticComputableProperties[] = {
- CSSPropertyAnimationDelay,
- CSSPropertyAnimationDirection,
- CSSPropertyAnimationDuration,
- CSSPropertyAnimationFillMode,
- CSSPropertyAnimationIterationCount,
- CSSPropertyAnimationName,
- CSSPropertyAnimationPlayState,
- CSSPropertyAnimationTimingFunction,
CSSPropertyBackgroundAttachment,
CSSPropertyBackgroundBlendMode,
CSSPropertyBackgroundClip,
@@ -2338,48 +2330,24 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(CSSPropert
return cssValuePool().createIdentifierValue(CSSValueBorderBox);
case CSSPropertyWebkitAppRegion:
return cssValuePool().createIdentifierValue(style->getDraggableRegionMode() == DraggableRegionDrag ? CSSValueDrag : CSSValueNoDrag);
- case CSSPropertyAnimationDelay:
- if (!RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled())
- break;
case CSSPropertyWebkitAnimationDelay:
return getDelayValue(style->animations());
- case CSSPropertyAnimationDirection:
- if (!RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled())
- break;
case CSSPropertyWebkitAnimationDirection: {
RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
const CSSAnimationDataList* t = style->animations();
if (t) {
for (size_t i = 0; i < t->size(); ++i) {
- switch (t->animation(i)->direction()) {
- case CSSAnimationData::AnimationDirectionNormal:
- list->append(cssValuePool().createIdentifierValue(CSSValueNormal));
- break;
- case CSSAnimationData::AnimationDirectionAlternate:
+ if (t->animation(i)->direction())
list->append(cssValuePool().createIdentifierValue(CSSValueAlternate));
- break;
- case CSSAnimationData::AnimationDirectionReverse:
- list->append(cssValuePool().createIdentifierValue(CSSValueReverse));
- break;
- case CSSAnimationData::AnimationDirectionAlternateReverse:
- list->append(cssValuePool().createIdentifierValue(CSSValueAlternateReverse));
- break;
- default:
- ASSERT_NOT_REACHED();
- }
+ else
+ list->append(cssValuePool().createIdentifierValue(CSSValueNormal));
}
} else
list->append(cssValuePool().createIdentifierValue(CSSValueNormal));
return list.release();
}
- case CSSPropertyAnimationDuration:
- if (!RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled())
- break;
case CSSPropertyWebkitAnimationDuration:
return getDurationValue(style->animations());
- case CSSPropertyAnimationFillMode:
- if (!RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled())
- break;
case CSSPropertyWebkitAnimationFillMode: {
RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
const CSSAnimationDataList* t = style->animations();
@@ -2404,9 +2372,6 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(CSSPropert
list->append(cssValuePool().createIdentifierValue(CSSValueNone));
return list.release();
}
- case CSSPropertyAnimationIterationCount:
- if (!RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled())
- break;
case CSSPropertyWebkitAnimationIterationCount: {
RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
const CSSAnimationDataList* t = style->animations();
@@ -2422,9 +2387,6 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(CSSPropert
list->append(cssValuePool().createValue(CSSAnimationData::initialAnimationIterationCount(), CSSPrimitiveValue::CSS_NUMBER));
return list.release();
}
- case CSSPropertyAnimationName:
- if (!RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled())
- break;
case CSSPropertyWebkitAnimationName: {
RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
const CSSAnimationDataList* t = style->animations();
@@ -2435,9 +2397,6 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(CSSPropert
list->append(cssValuePool().createIdentifierValue(CSSValueNone));
return list.release();
}
- case CSSPropertyAnimationPlayState:
- if (!RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled())
- break;
case CSSPropertyWebkitAnimationPlayState: {
RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
const CSSAnimationDataList* t = style->animations();
@@ -2453,9 +2412,6 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(CSSPropert
list->append(cssValuePool().createIdentifierValue(CSSValueRunning));
return list.release();
}
- case CSSPropertyAnimationTimingFunction:
- if (!RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled())
- break;
case CSSPropertyWebkitAnimationTimingFunction:
return getTimingFunctionValue(style->animations());
case CSSPropertyWebkitAppearance:
@@ -2810,7 +2766,6 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(CSSPropert
break;
/* Unimplemented -webkit- properties */
- case CSSPropertyAnimation:
case CSSPropertyWebkitAnimation:
case CSSPropertyWebkitBorderRadius:
case CSSPropertyWebkitMarginCollapse:
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp b/chromium/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
index d409f79aafa..c48eaf220e0 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
@@ -27,7 +27,7 @@
#include "core/css/CSSCrossfadeValue.h"
#include "core/css/CSSImageValue.h"
-#include "core/fetch/ImageResource.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/platform/graphics/CrossfadeGeneratedImage.h"
#include "core/rendering/RenderObject.h"
#include "core/rendering/style/StyleFetchedImage.h"
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h b/chromium/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
index 4df75201818..450b6153caf 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
@@ -28,9 +28,9 @@
#include "core/css/CSSImageGeneratorValue.h"
#include "core/css/CSSPrimitiveValue.h"
-#include "core/fetch/ImageResource.h"
-#include "core/fetch/ImageResourceClient.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ImageResource.h"
+#include "core/loader/cache/ImageResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/graphics/Image.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSCursorImageValue.cpp b/chromium/third_party/WebKit/Source/core/css/CSSCursorImageValue.cpp
index dd68e0b9850..21deed71b99 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSCursorImageValue.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSCursorImageValue.cpp
@@ -25,8 +25,8 @@
#include "SVGNames.h"
#include "core/css/CSSImageSetValue.h"
#include "core/css/CSSImageValue.h"
-#include "core/fetch/ImageResource.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/ImageResource.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/rendering/style/StyleFetchedImage.h"
#include "core/rendering/style/StyleFetchedImageSet.h"
#include "core/rendering/style/StyleImage.h"
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSFilterValue.h b/chromium/third_party/WebKit/Source/core/css/CSSFilterValue.h
index 3398cfa788b..d937e0c201e 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSFilterValue.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSFilterValue.h
@@ -66,8 +66,8 @@ public:
bool equals(const CSSFilterValue&) const;
private:
- explicit CSSFilterValue(FilterOperationType);
- explicit CSSFilterValue(const CSSFilterValue& cloneFrom);
+ CSSFilterValue(FilterOperationType);
+ CSSFilterValue(const CSSFilterValue& cloneFrom);
FilterOperationType m_type;
};
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp b/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp
index c70ee4aa4b0..1f160aa51f7 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.cpp
@@ -28,7 +28,7 @@
#include "core/css/CSSFontFace.h"
#include "core/css/CSSFontSelector.h"
-#include "core/fetch/FontResource.h"
+#include "core/loader/cache/FontResource.h"
#include "core/platform/HistogramSupport.h"
#include "core/platform/graphics/FontCache.h"
#include "core/platform/graphics/FontDescription.h"
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.h b/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.h
index e99c8e52a86..aea2ac51258 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSource.h
@@ -26,8 +26,8 @@
#ifndef CSSFontFaceSource_h
#define CSSFontFaceSource_h
-#include "core/fetch/FontResource.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/FontResource.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/Timer.h"
#include "wtf/HashMap.h"
#include "wtf/text/AtomicString.h"
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp b/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp
index 7b3cef66d05..46fd349a0db 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp
@@ -30,9 +30,9 @@
#include "core/css/StyleSheetContents.h"
#include "core/dom/Document.h"
#include "core/dom/Node.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/FontResource.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/FontResource.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/platform/graphics/FontCustomPlatformData.h"
#include "core/svg/SVGFontFaceElement.h"
#include "wtf/text/StringBuilder.h"
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.h b/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.h
index 9129f1c9b4d..023e38ec181 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.h
@@ -27,7 +27,7 @@
#define CSSFontFaceSrcValue_h
#include "core/css/CSSValue.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "wtf/PassRefPtr.h"
#include "wtf/text/WTFString.h"
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSFontSelector.cpp b/chromium/third_party/WebKit/Source/core/css/CSSFontSelector.cpp
index 3bc725a2c93..f721acd1d2e 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSFontSelector.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSFontSelector.cpp
@@ -43,9 +43,9 @@
#include "core/css/StyleRule.h"
#include "core/css/resolver/StyleResolver.h"
#include "core/dom/Document.h"
-#include "core/fetch/FontResource.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/loader/FrameLoader.h"
+#include "core/loader/cache/FontResource.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/Frame.h"
#include "core/page/Settings.h"
#include "core/platform/graphics/FontCache.h"
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSFontSelector.h b/chromium/third_party/WebKit/Source/core/css/CSSFontSelector.h
index 306160f49c3..8d41ad2ba01 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSFontSelector.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSFontSelector.h
@@ -26,7 +26,7 @@
#ifndef CSSFontSelector_h
#define CSSFontSelector_h
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/Timer.h"
#include "core/platform/graphics/FontSelector.h"
#include "wtf/Forward.h"
@@ -74,7 +74,7 @@ public:
void beginLoadingFontSoon(FontResource*);
private:
- explicit CSSFontSelector(Document*);
+ CSSFontSelector(Document*);
void dispatchInvalidationCallbacks();
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSGradientValue.h b/chromium/third_party/WebKit/Source/core/css/CSSGradientValue.h
index 2eed10b981f..5c3c631d507 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSGradientValue.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSGradientValue.h
@@ -164,7 +164,7 @@ private:
{
}
- explicit CSSLinearGradientValue(const CSSLinearGradientValue& other)
+ CSSLinearGradientValue(const CSSLinearGradientValue& other)
: CSSGradientValue(other, LinearGradientClass, other.gradientType())
, m_angle(other.m_angle)
{
@@ -207,7 +207,7 @@ private:
{
}
- explicit CSSRadialGradientValue(const CSSRadialGradientValue& other)
+ CSSRadialGradientValue(const CSSRadialGradientValue& other)
: CSSGradientValue(other, RadialGradientClass, other.gradientType())
, m_firstRadius(other.m_firstRadius)
, m_secondRadius(other.m_secondRadius)
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.h b/chromium/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.h
index 4d967684ed4..8a1602410af 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSImageGeneratorValue.h
@@ -68,7 +68,7 @@ public:
void loadSubimages(ResourceFetcher*);
protected:
- explicit CSSImageGeneratorValue(ClassType);
+ CSSImageGeneratorValue(ClassType);
Image* getImage(RenderObject*, const IntSize&);
void putImage(const IntSize&, PassRefPtr<Image>);
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp b/chromium/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp
index 231244d3271..efae6467979 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp
@@ -30,9 +30,9 @@
#include "core/css/CSSImageValue.h"
#include "core/css/CSSPrimitiveValue.h"
#include "core/dom/Document.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ImageResource.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ImageResource.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/rendering/style/StyleFetchedImageSet.h"
#include "core/rendering/style/StylePendingImage.h"
#include "wtf/text/StringBuilder.h"
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSImageSetValue.h b/chromium/third_party/WebKit/Source/core/css/CSSImageSetValue.h
index 7f5a377441f..42fdae908ea 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSImageSetValue.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSImageSetValue.h
@@ -66,7 +66,7 @@ protected:
private:
CSSImageSetValue();
- explicit CSSImageSetValue(const CSSImageSetValue& cloneFrom);
+ CSSImageSetValue(const CSSImageSetValue& cloneFrom);
void fillImageSet();
static inline bool compareByScaleFactor(ImageWithScale first, ImageWithScale second) { return first.scaleFactor < second.scaleFactor; }
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSImageValue.cpp b/chromium/third_party/WebKit/Source/core/css/CSSImageValue.cpp
index c2b4cde2260..afd96591987 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSImageValue.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSImageValue.cpp
@@ -24,9 +24,9 @@
#include "FetchInitiatorTypeNames.h"
#include "core/css/CSSParser.h"
#include "core/dom/Document.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ImageResource.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ImageResource.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/rendering/style/StyleFetchedImage.h"
#include "core/rendering/style/StylePendingImage.h"
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSImageValue.h b/chromium/third_party/WebKit/Source/core/css/CSSImageValue.h
index 0e66982cb1a..1a9b3ea5852 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSImageValue.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSImageValue.h
@@ -22,7 +22,7 @@
#define CSSImageValue_h
#include "core/css/CSSValue.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "wtf/RefPtr.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSInitialValue.h b/chromium/third_party/WebKit/Source/core/css/CSSInitialValue.h
index f2bc029904f..4a0f53fb772 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSInitialValue.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSInitialValue.h
@@ -44,7 +44,7 @@ public:
bool equals(const CSSInitialValue&) const { return true; }
private:
- explicit CSSInitialValue(bool implicit)
+ CSSInitialValue(bool implicit)
: CSSValue(InitialClass)
, m_isImplicit(implicit)
{
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSKeyframeRule.cpp b/chromium/third_party/WebKit/Source/core/css/CSSKeyframeRule.cpp
index 672b726c4c7..6024c87c838 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSKeyframeRule.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSKeyframeRule.cpp
@@ -54,14 +54,14 @@ void StyleKeyframe::setProperties(PassRefPtr<StylePropertySet> properties)
}
/* static */
-void StyleKeyframe::parseKeyString(const String& s, Vector<double>& keys)
+void StyleKeyframe::parseKeyString(const String& s, Vector<float>& keys)
{
keys.clear();
Vector<String> strings;
s.split(',', strings);
for (size_t i = 0; i < strings.size(); ++i) {
- double key = -1;
+ float key = -1;
String cur = strings[i].stripWhiteSpace();
// For now the syntax MUST be 'xxx%' or 'from' or 'to', where xxx is a legal floating point number
@@ -70,7 +70,7 @@ void StyleKeyframe::parseKeyString(const String& s, Vector<double>& keys)
else if (cur == "to")
key = 1;
else if (cur.endsWith('%')) {
- double k = cur.substring(0, cur.length() - 1).toDouble();
+ float k = cur.substring(0, cur.length() - 1).toFloat();
if (k >= 0 && k <= 100)
key = k / 100;
}
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSKeyframeRule.h b/chromium/third_party/WebKit/Source/core/css/CSSKeyframeRule.h
index a2833a2d954..17a44829661 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSKeyframeRule.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSKeyframeRule.h
@@ -51,7 +51,7 @@ public:
// invalid string?
void setKeyText(const String& s) { m_key = s; }
- void getKeys(Vector<double>& keys) const { parseKeyString(m_key, keys); }
+ void getKeys(Vector<float>& keys) const { parseKeyString(m_key, keys); }
const StylePropertySet* properties() const { return m_properties.get(); }
MutableStylePropertySet* mutableProperties();
@@ -62,7 +62,7 @@ public:
private:
StyleKeyframe();
- static void parseKeyString(const String&, Vector<double>& keys);
+ static void parseKeyString(const String&, Vector<float>& keys);
RefPtr<StylePropertySet> m_properties;
// FIXME: This should be a parsed vector of floats.
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSKeyframesRule.h b/chromium/third_party/WebKit/Source/core/css/CSSKeyframesRule.h
index be2ba3cef38..cae53c61092 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSKeyframesRule.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSKeyframesRule.h
@@ -58,7 +58,7 @@ public:
private:
StyleRuleKeyframes();
- explicit StyleRuleKeyframes(const StyleRuleKeyframes&);
+ StyleRuleKeyframes(const StyleRuleKeyframes&);
Vector<RefPtr<StyleKeyframe> > m_keyframes;
AtomicString m_name;
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSLineBoxContainValue.h b/chromium/third_party/WebKit/Source/core/css/CSSLineBoxContainValue.h
index 6e5a050e525..de630498b07 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSLineBoxContainValue.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSLineBoxContainValue.h
@@ -53,7 +53,7 @@ private:
LineBoxContain m_value;
private:
- explicit CSSLineBoxContainValue(LineBoxContain);
+ CSSLineBoxContainValue(LineBoxContain);
};
} // namespace
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSParser-in.cpp b/chromium/third_party/WebKit/Source/core/css/CSSParser-in.cpp
index ee73ceef792..0e45c5c3823 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSParser-in.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSParser-in.cpp
@@ -2402,16 +2402,6 @@ bool CSSParser::parseValue(CSSPropertyID propId, bool important)
}
return false;
}
- case CSSPropertyAnimationDelay:
- case CSSPropertyAnimationDirection:
- case CSSPropertyAnimationDuration:
- case CSSPropertyAnimationFillMode:
- case CSSPropertyAnimationName:
- case CSSPropertyAnimationPlayState:
- case CSSPropertyAnimationIterationCount:
- case CSSPropertyAnimationTimingFunction:
- if (!RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled())
- break;
case CSSPropertyWebkitAnimationDelay:
case CSSPropertyWebkitAnimationDirection:
case CSSPropertyWebkitAnimationDuration:
@@ -2603,7 +2593,7 @@ bool CSSParser::parseValue(CSSPropertyID propId, bool important)
case CSSPropertyBorder:
// [ 'border-width' || 'border-style' || <color> ] | inherit
{
- if (parseShorthand(propId, parsingShorthandForProperty(CSSPropertyBorder), important)) {
+ if (parseShorthand(propId, borderShorthandForParsing(), important)) {
// The CSS3 Borders and Backgrounds specification says that border also resets border-image. It's as
// though a value of none was specified for the image.
addExpandedPropertyForValue(CSSPropertyBorderImage, cssValuePool().createImplicitInitialValue(), important);
@@ -2667,11 +2657,8 @@ bool CSSParser::parseValue(CSSPropertyID propId, bool important)
return parseShorthand(propId, webkitColumnRuleShorthand(), important);
case CSSPropertyWebkitTextStroke:
return parseShorthand(propId, webkitTextStrokeShorthand(), important);
- case CSSPropertyAnimation:
- if (!RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled())
- break;
case CSSPropertyWebkitAnimation:
- return parseAnimationShorthand(propId, important);
+ return parseAnimationShorthand(important);
case CSSPropertyTransition:
case CSSPropertyWebkitTransition:
return parseTransitionShorthand(propId, important);
@@ -3086,18 +3073,18 @@ void CSSParser::addAnimationValue(RefPtr<CSSValue>& lval, PassRefPtr<CSSValue> r
lval = rval;
}
-bool CSSParser::parseAnimationShorthand(CSSPropertyID propId, bool important)
+bool CSSParser::parseAnimationShorthand(bool important)
{
- const StylePropertyShorthand& animationProperties = parsingShorthandForProperty(propId);
+ const StylePropertyShorthand& animationProperties = webkitAnimationShorthandForParsing();
const unsigned numProperties = 7;
// The list of properties in the shorthand should be the same
// length as the list with animation name in last position, even though they are
// in a different order.
- ASSERT(numProperties == animationProperties.length());
- ASSERT(numProperties == shorthandForProperty(propId).length());
+ ASSERT(numProperties == webkitAnimationShorthandForParsing().length());
+ ASSERT(numProperties == webkitAnimationShorthand().length());
- ShorthandScope scope(this, propId);
+ ShorthandScope scope(this, CSSPropertyWebkitAnimation);
bool parsedProperty[numProperties] = { false };
AnimationParseContext context;
@@ -4463,7 +4450,6 @@ bool CSSParser::parseAnimationProperty(CSSPropertyID propId, RefPtr<CSSValue>& r
}
else {
switch (propId) {
- case CSSPropertyAnimationDelay:
case CSSPropertyWebkitAnimationDelay:
case CSSPropertyTransitionDelay:
case CSSPropertyWebkitTransitionDelay:
@@ -4471,13 +4457,11 @@ bool CSSParser::parseAnimationProperty(CSSPropertyID propId, RefPtr<CSSValue>& r
if (currValue)
m_valueList->next();
break;
- case CSSPropertyAnimationDirection:
case CSSPropertyWebkitAnimationDirection:
currValue = parseAnimationDirection();
if (currValue)
m_valueList->next();
break;
- case CSSPropertyAnimationDuration:
case CSSPropertyWebkitAnimationDuration:
case CSSPropertyTransitionDuration:
case CSSPropertyWebkitTransitionDuration:
@@ -4485,25 +4469,21 @@ bool CSSParser::parseAnimationProperty(CSSPropertyID propId, RefPtr<CSSValue>& r
if (currValue)
m_valueList->next();
break;
- case CSSPropertyAnimationFillMode:
case CSSPropertyWebkitAnimationFillMode:
currValue = parseAnimationFillMode();
if (currValue)
m_valueList->next();
break;
- case CSSPropertyAnimationIterationCount:
case CSSPropertyWebkitAnimationIterationCount:
currValue = parseAnimationIterationCount();
if (currValue)
m_valueList->next();
break;
- case CSSPropertyAnimationName:
case CSSPropertyWebkitAnimationName:
currValue = parseAnimationName();
if (currValue)
m_valueList->next();
break;
- case CSSPropertyAnimationPlayState:
case CSSPropertyWebkitAnimationPlayState:
currValue = parseAnimationPlayState();
if (currValue)
@@ -4517,7 +4497,6 @@ bool CSSParser::parseAnimationProperty(CSSPropertyID propId, RefPtr<CSSValue>& r
if (currValue)
m_valueList->next();
break;
- case CSSPropertyAnimationTimingFunction:
case CSSPropertyWebkitAnimationTimingFunction:
case CSSPropertyTransitionTimingFunction:
case CSSPropertyWebkitTransitionTimingFunction:
@@ -10226,7 +10205,7 @@ inline void CSSParser::detectAtToken(int length, bool hasEscape)
--length;
// charset, font-face, import, media, namespace, page, supports,
- // -webkit-keyframes, keyframes, and -webkit-mediaquery are not affected by hasEscape.
+ // -webkit-keyframes, and -webkit-mediaquery are not affected by hasEscape.
SWITCH(name, length) {
CASE("bottom-left") {
if (LIKELY(!hasEscape))
@@ -10262,9 +10241,6 @@ inline void CSSParser::detectAtToken(int length, bool hasEscape)
m_parsingMode = MediaQueryMode;
m_token = IMPORT_SYM;
}
- CASE("keyframes") {
- m_token = WEBKIT_KEYFRAMES_SYM;
- }
CASE("left-top") {
if (LIKELY(!hasEscape))
m_token = LEFTTOP_SYM;
@@ -11508,7 +11484,7 @@ StyleKeyframe* CSSParser::createKeyframe(CSSParserValueList* keys)
StringBuilder keyString;
for (unsigned i = 0; i < keys->size(); ++i) {
ASSERT(keys->valueAt(i)->unit == CSSPrimitiveValue::CSS_NUMBER);
- double key = keys->valueAt(i)->fValue;
+ float key = static_cast<float>(keys->valueAt(i)->fValue);
if (key < 0 || key > 100) {
// As per http://www.w3.org/TR/css3-animations/#keyframes,
// "If a keyframe selector specifies negative percentage values
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSParser.h b/chromium/third_party/WebKit/Source/core/css/CSSParser.h
index ce4532832fc..1f0ff6a0644 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSParser.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSParser.h
@@ -167,7 +167,7 @@ public:
bool parseCubicBezierTimingFunctionValue(CSSParserValueList*& args, double& result);
bool parseAnimationProperty(CSSPropertyID, RefPtr<CSSValue>&, AnimationParseContext&);
bool parseTransitionShorthand(CSSPropertyID, bool important);
- bool parseAnimationShorthand(CSSPropertyID, bool important);
+ bool parseAnimationShorthand(bool important);
PassRefPtr<CSSValue> parseColumnWidth();
PassRefPtr<CSSValue> parseColumnCount();
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSProperty.cpp b/chromium/third_party/WebKit/Source/core/css/CSSProperty.cpp
index 57912167f4e..9fee7be3cd0 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSProperty.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSProperty.cpp
@@ -361,15 +361,6 @@ bool CSSProperty::isInheritedProperty(CSSPropertyID propertyID)
case CSSPropertyWordWrap:
case CSSPropertyWritingMode:
return true;
- case CSSPropertyAnimation:
- case CSSPropertyAnimationDelay:
- case CSSPropertyAnimationDirection:
- case CSSPropertyAnimationDuration:
- case CSSPropertyAnimationFillMode:
- case CSSPropertyAnimationIterationCount:
- case CSSPropertyAnimationName:
- case CSSPropertyAnimationPlayState:
- case CSSPropertyAnimationTimingFunction:
case CSSPropertyAlignmentBaseline:
case CSSPropertyBackground:
case CSSPropertyBackgroundAttachment:
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSProperty.h b/chromium/third_party/WebKit/Source/core/css/CSSProperty.h
index fd802ecbe40..a400af1b582 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSProperty.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSProperty.h
@@ -22,7 +22,6 @@
#define CSSProperty_h
#include "CSSPropertyNames.h"
-#include "RuntimeEnabledFeatures.h"
#include "core/css/CSSValue.h"
#include "core/platform/text/TextDirection.h"
#include "core/platform/text/WritingMode.h"
@@ -90,38 +89,8 @@ private:
inline CSSPropertyID prefixingVariantForPropertyId(CSSPropertyID propId)
{
- if (!RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled() && (propId >= CSSPropertyWebkitAnimation && propId <= CSSPropertyAnimationTimingFunction))
- return propId;
-
CSSPropertyID propertyId = CSSPropertyInvalid;
switch (propId) {
- case CSSPropertyAnimation:
- propertyId = CSSPropertyWebkitAnimation;
- break;
- case CSSPropertyAnimationDelay:
- propertyId = CSSPropertyWebkitAnimationDelay;
- break;
- case CSSPropertyAnimationDirection:
- propertyId = CSSPropertyWebkitAnimationDirection;
- break;
- case CSSPropertyAnimationDuration:
- propertyId = CSSPropertyWebkitAnimationDuration;
- break;
- case CSSPropertyAnimationFillMode:
- propertyId = CSSPropertyWebkitAnimationFillMode;
- break;
- case CSSPropertyAnimationIterationCount:
- propertyId = CSSPropertyWebkitAnimationIterationCount;
- break;
- case CSSPropertyAnimationName:
- propertyId = CSSPropertyWebkitAnimationName;
- break;
- case CSSPropertyAnimationPlayState:
- propertyId = CSSPropertyWebkitAnimationPlayState;
- break;
- case CSSPropertyAnimationTimingFunction:
- propertyId = CSSPropertyWebkitAnimationTimingFunction;
- break;
case CSSPropertyTransitionDelay:
propertyId = CSSPropertyWebkitTransitionDelay;
break;
@@ -137,33 +106,6 @@ inline CSSPropertyID prefixingVariantForPropertyId(CSSPropertyID propId)
case CSSPropertyTransition:
propertyId = CSSPropertyWebkitTransition;
break;
- case CSSPropertyWebkitAnimation:
- propertyId = CSSPropertyAnimation;
- break;
- case CSSPropertyWebkitAnimationDelay:
- propertyId = CSSPropertyAnimationDelay;
- break;
- case CSSPropertyWebkitAnimationDirection:
- propertyId = CSSPropertyAnimationDirection;
- break;
- case CSSPropertyWebkitAnimationDuration:
- propertyId = CSSPropertyAnimationDuration;
- break;
- case CSSPropertyWebkitAnimationFillMode:
- propertyId = CSSPropertyAnimationFillMode;
- break;
- case CSSPropertyWebkitAnimationIterationCount:
- propertyId = CSSPropertyAnimationIterationCount;
- break;
- case CSSPropertyWebkitAnimationName:
- propertyId = CSSPropertyAnimationName;
- break;
- case CSSPropertyWebkitAnimationPlayState:
- propertyId = CSSPropertyAnimationPlayState;
- break;
- case CSSPropertyWebkitAnimationTimingFunction:
- propertyId = CSSPropertyAnimationTimingFunction;
- break;
case CSSPropertyWebkitTransitionDelay:
propertyId = CSSPropertyTransitionDelay;
break;
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSPropertyNames.in b/chromium/third_party/WebKit/Source/core/css/CSSPropertyNames.in
index 1a982238083..11f385b451a 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSPropertyNames.in
+++ b/chromium/third_party/WebKit/Source/core/css/CSSPropertyNames.in
@@ -19,15 +19,6 @@ display
-webkit-animation-name
-webkit-animation-play-state
-webkit-animation-timing-function
-animation
-animation-delay
-animation-direction
-animation-duration
-animation-fill-mode
-animation-iteration-count
-animation-name
-animation-play-state
-animation-timing-function
-webkit-transition
-webkit-transition-delay
-webkit-transition-duration
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.cpp b/chromium/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.cpp
index 85886e2374e..38a9874f755 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.cpp
@@ -29,9 +29,9 @@
#include "FetchInitiatorTypeNames.h"
#include "core/css/CSSParser.h"
#include "core/dom/Document.h"
-#include "core/fetch/DocumentResource.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/DocumentResource.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ResourceFetcher.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.h b/chromium/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.h
index 7e43406ffb5..5f132211c9c 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.h
+++ b/chromium/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.h
@@ -26,8 +26,8 @@
#define CSSSVGDocumentValue_h
#include "core/css/CSSValue.h"
-#include "core/fetch/DocumentResource.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/DocumentResource.h"
+#include "core/loader/cache/ResourcePtr.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSShaderValue.cpp b/chromium/third_party/WebKit/Source/core/css/CSSShaderValue.cpp
index bc8ce082d3e..a21af14661f 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSShaderValue.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/CSSShaderValue.cpp
@@ -34,8 +34,8 @@
#include "FetchInitiatorTypeNames.h"
#include "core/css/CSSParser.h"
#include "core/dom/Document.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/rendering/style/StyleFetchedShader.h"
#include "core/rendering/style/StylePendingShader.h"
#include "wtf/text/StringBuilder.h"
diff --git a/chromium/third_party/WebKit/Source/core/css/CSSShorthands.in b/chromium/third_party/WebKit/Source/core/css/CSSShorthands.in
index 9738a793d4d..04f9a632375 100644
--- a/chromium/third_party/WebKit/Source/core/css/CSSShorthands.in
+++ b/chromium/third_party/WebKit/Source/core/css/CSSShorthands.in
@@ -3,7 +3,6 @@
// followed by the longhands associated to the shorthand.
// Note: Mandatory blank line to skip parameter parsing phase
-animation longhands=animation-name;animation-duration;animation-timing-function;animation-delay;animation-iteration-count;animation-direction;animation-fill-mode, runtimeEnabledShorthand=CSSAnimationUnprefixed
background longhands=background-image;background-position-x;background-position-y;background-size;background-repeat-x;background-repeat-y;background-attachment;background-origin;background-clip;background-color
background-position longhands=background-position-x;background-position-y
background-repeat longhands=background-repeat-x;background-repeat-y
diff --git a/chromium/third_party/WebKit/Source/core/css/MediaQueryEvaluator.cpp b/chromium/third_party/WebKit/Source/core/css/MediaQueryEvaluator.cpp
index 42e71e531f9..413c80ea910 100644
--- a/chromium/third_party/WebKit/Source/core/css/MediaQueryEvaluator.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/MediaQueryEvaluator.cpp
@@ -272,8 +272,8 @@ static bool deviceAspectRatioMediaFeatureEval(CSSValue* value, RenderStyle*, Fra
static bool evalResolution(CSSValue* value, Frame* frame, MediaFeaturePrefix op)
{
- // FIXME: Possibly handle other media types than 'screen' and 'print'.
- float actualResolution = 0;
+ // FIXME: Possible handle other media types than 'screen' and 'print'.
+ float deviceScaleFactor = 0;
// This checks the actual media type applied to the document, and we know
// this method only got called if this media type matches the one defined
@@ -281,16 +281,16 @@ static bool evalResolution(CSSValue* value, Frame* frame, MediaFeaturePrefix op)
// media type of the query will either be "print" or "all".
String mediaType = frame->view()->mediaType();
if (equalIgnoringCase(mediaType, "screen"))
- actualResolution = clampTo<float>(frame->devicePixelRatio());
+ deviceScaleFactor = frame->page()->deviceScaleFactor();
else if (equalIgnoringCase(mediaType, "print")) {
// The resolution of images while printing should not depend on the DPI
// of the screen. Until we support proper ways of querying this info
// we use 300px which is considered minimum for current printers.
- actualResolution = 300 / cssPixelsPerInch;
+ deviceScaleFactor = 300 / cssPixelsPerInch;
}
if (!value)
- return !!actualResolution;
+ return !!deviceScaleFactor;
if (!value->isPrimitiveValue())
return false;
@@ -298,7 +298,7 @@ static bool evalResolution(CSSValue* value, Frame* frame, MediaFeaturePrefix op)
CSSPrimitiveValue* resolution = toCSSPrimitiveValue(value);
if (resolution->isNumber())
- return compareValue(actualResolution, resolution->getFloatValue(), op);
+ return compareValue(deviceScaleFactor, resolution->getFloatValue(), op);
if (!resolution->isResolution())
return false;
@@ -310,11 +310,11 @@ static bool evalResolution(CSSValue* value, Frame* frame, MediaFeaturePrefix op)
// approximates the reference pixel". With that in mind, allowing 2 decimal
// point precision seems appropriate.
return compareValue(
- floorf(0.5 + 100 * actualResolution) / 100,
+ floorf(0.5 + 100 * deviceScaleFactor) / 100,
floorf(0.5 + 100 * resolution->getFloatValue(CSSPrimitiveValue::CSS_DPPX)) / 100, op);
}
- return compareValue(actualResolution, resolution->getFloatValue(CSSPrimitiveValue::CSS_DPPX), op);
+ return compareValue(deviceScaleFactor, resolution->getFloatValue(CSSPrimitiveValue::CSS_DPPX), op);
}
static bool devicePixelRatioMediaFeatureEval(CSSValue *value, RenderStyle*, Frame* frame, MediaFeaturePrefix op)
diff --git a/chromium/third_party/WebKit/Source/core/css/StyleInvalidationAnalysis.cpp b/chromium/third_party/WebKit/Source/core/css/StyleInvalidationAnalysis.cpp
index 9dea9bac2be..25773727488 100644
--- a/chromium/third_party/WebKit/Source/core/css/StyleInvalidationAnalysis.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/StyleInvalidationAnalysis.cpp
@@ -88,34 +88,18 @@ static bool hasDistributedRule(StyleSheetContents* styleSheetContents)
return false;
}
-static bool hasAtHostRule(StyleSheetContents* styleSheetContents)
-{
- const Vector<RefPtr<StyleRuleBase> >& rules = styleSheetContents->childRules();
- for (unsigned i = 0; i < rules.size(); i++) {
- const StyleRuleBase* rule = rules[i].get();
- if (rule->isHostRule())
- return true;
- }
- return false;
-}
-
static Node* determineScopingNodeForStyleScoped(HTMLStyleElement* ownerElement, StyleSheetContents* styleSheetContents)
{
ASSERT(ownerElement && ownerElement->isRegisteredAsScoped());
- if (ownerElement->isInShadowTree()) {
- if (hasDistributedRule(styleSheetContents)) {
- ContainerNode* scope = ownerElement;
- do {
- scope = scope->containingShadowRoot()->shadowHost();
- } while (scope->isInShadowTree());
+ if (ownerElement->isInShadowTree() && hasDistributedRule(styleSheetContents)) {
+ ContainerNode* scope = ownerElement;
+ do {
+ scope = scope->containingShadowRoot()->shadowHost();
+ } while (scope->isInShadowTree());
- return scope;
- }
- if (ownerElement->isRegisteredAsScoped() && hasAtHostRule(styleSheetContents))
- return ownerElement->containingShadowRoot()->shadowHost();
+ return scope;
}
-
return ownerElement->isRegisteredInShadowRoot() ? ownerElement->containingShadowRoot()->shadowHost() : ownerElement->parentNode();
}
diff --git a/chromium/third_party/WebKit/Source/core/css/StylePropertyShorthandCustom.cpp b/chromium/third_party/WebKit/Source/core/css/StylePropertyShorthandCustom.cpp
index 1e6e628c340..e49efe5739f 100644
--- a/chromium/third_party/WebKit/Source/core/css/StylePropertyShorthandCustom.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/StylePropertyShorthandCustom.cpp
@@ -36,30 +36,6 @@ const StylePropertyShorthand& borderShorthandForParsing()
return borderForParsingLonghands;
}
-const StylePropertyShorthand& animationShorthandForParsing()
-{
- // When we parse the animation shorthand we need to look for animation-name
- // last because otherwise it might match against the keywords for fill mode,
- // timing functions and infinite iteration. This means that animation names
- // that are the same as keywords (e.g. 'forwards') won't always match in the
- // shorthand. In that case the authors should be using longhands (or
- // reconsidering their approach). This is covered by the animations spec
- // bug: https://www.w3.org/Bugs/Public/show_bug.cgi?id=14790
- // And in the spec (editor's draft) at:
- // http://dev.w3.org/csswg/css3-animations/#animation-shorthand-property
- static const CSSPropertyID animationPropertiesForParsing[] = {
- CSSPropertyAnimationDuration,
- CSSPropertyAnimationTimingFunction,
- CSSPropertyAnimationDelay,
- CSSPropertyAnimationIterationCount,
- CSSPropertyAnimationDirection,
- CSSPropertyAnimationFillMode,
- CSSPropertyAnimationName
- };
- DEFINE_STATIC_LOCAL(StylePropertyShorthand, webkitAnimationLonghandsForParsing, (CSSPropertyAnimation, animationPropertiesForParsing, WTF_ARRAY_LENGTH(animationPropertiesForParsing)));
- return webkitAnimationLonghandsForParsing;
-}
-
const StylePropertyShorthand& webkitAnimationShorthandForParsing()
{
// When we parse the animation shorthand we need to look for animation-name
@@ -84,21 +60,6 @@ const StylePropertyShorthand& webkitAnimationShorthandForParsing()
return webkitAnimationLonghandsForParsing;
}
-// Returns an empty list if the property is not a shorthand, otherwise the list of longhands for parsing.
-const StylePropertyShorthand& parsingShorthandForProperty(CSSPropertyID propertyID)
-{
- switch (propertyID) {
- case CSSPropertyAnimation:
- return animationShorthandForParsing();
- case CSSPropertyBorder:
- return borderShorthandForParsing();
- case CSSPropertyWebkitAnimation:
- return webkitAnimationShorthandForParsing();
- default:
- return shorthandForProperty(propertyID);
- }
-}
-
bool isExpandedShorthand(CSSPropertyID id)
{
// The system fonts bypass the normal style resolution by using RenderTheme,
diff --git a/chromium/third_party/WebKit/Source/core/css/StyleRuleImport.cpp b/chromium/third_party/WebKit/Source/core/css/StyleRuleImport.cpp
index 15d3d5ba498..cf728136525 100644
--- a/chromium/third_party/WebKit/Source/core/css/StyleRuleImport.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/StyleRuleImport.cpp
@@ -25,9 +25,9 @@
#include "FetchInitiatorTypeNames.h"
#include "core/css/StyleSheetContents.h"
#include "core/dom/Document.h"
-#include "core/fetch/CSSStyleSheetResource.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/CSSStyleSheetResource.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ResourceFetcher.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/css/StyleRuleImport.h b/chromium/third_party/WebKit/Source/core/css/StyleRuleImport.h
index c44253f53c9..40412e398c3 100644
--- a/chromium/third_party/WebKit/Source/core/css/StyleRuleImport.h
+++ b/chromium/third_party/WebKit/Source/core/css/StyleRuleImport.h
@@ -23,8 +23,8 @@
#define StyleRuleImport_h
#include "core/css/StyleRule.h"
-#include "core/fetch/ResourcePtr.h"
-#include "core/fetch/StyleSheetResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
+#include "core/loader/cache/StyleSheetResourceClient.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/css/StyleSheetContents.cpp b/chromium/third_party/WebKit/Source/core/css/StyleSheetContents.cpp
index b99216d84a2..163276bf41a 100644
--- a/chromium/third_party/WebKit/Source/core/css/StyleSheetContents.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/StyleSheetContents.cpp
@@ -28,7 +28,7 @@
#include "core/css/StyleRule.h"
#include "core/css/StyleRuleImport.h"
#include "core/dom/Node.h"
-#include "core/fetch/CSSStyleSheetResource.h"
+#include "core/loader/cache/CSSStyleSheetResource.h"
#include "weborigin/SecurityOrigin.h"
#include "wtf/Deque.h"
diff --git a/chromium/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp b/chromium/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp
index 208325e19e1..8fc95356f4a 100644
--- a/chromium/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp
@@ -32,7 +32,6 @@
#include "core/css/resolver/AnimatedStyleBuilder.h"
#include "core/animation/AnimatableNumber.h"
-#include "core/animation/AnimatableTransform.h"
#include "core/animation/AnimatableUnknown.h"
#include "core/animation/AnimatableValue.h"
#include "core/css/resolver/StyleBuilder.h"
@@ -123,9 +122,6 @@ void AnimatedStyleBuilder::applyProperty(CSSPropertyID property, StyleResolverSt
case CSSPropertyWebkitPerspectiveOriginY:
style->setPerspectiveOriginY(animatableValueToLength(value, state));
return;
- case CSSPropertyWebkitTransform:
- style->setTransform(toAnimatableTransform(value)->transformOperations());
- return;
case CSSPropertyWebkitTransformOriginX:
style->setTransformOriginX(animatableValueToLength(value, state));
return;
diff --git a/chromium/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp b/chromium/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp
index d3899ad1042..ee83ce26fad 100644
--- a/chromium/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp
@@ -56,11 +56,64 @@ namespace WebCore {
using namespace HTMLNames;
+static const unsigned cStyleSearchThreshold = 10;
+static const unsigned cStyleSearchLevelThreshold = 10;
+
static inline bool parentElementPreventsSharing(const Element* parentElement)
{
+ if (!parentElement)
+ return false;
return parentElement->hasFlagsSetDuringStylingOfChildren();
}
+Node* SharedStyleFinder::locateCousinList(Element* parent, unsigned& visitedNodeCount) const
+{
+ if (visitedNodeCount >= cStyleSearchThreshold * cStyleSearchLevelThreshold)
+ return 0;
+ if (!parent || !parent->isStyledElement())
+ return 0;
+ if (parent->hasScopedHTMLStyleChild())
+ return 0;
+ if (parent->inlineStyle())
+ return 0;
+ if (parent->isSVGElement() && toSVGElement(parent)->animatedSMILStyleProperties())
+ return 0;
+ if (parent->hasID() && m_features.idsInRules.contains(parent->idForStyleResolution().impl()))
+ return 0;
+ if (isShadowHost(parent) && parent->shadow()->containsActiveStyles())
+ return 0;
+
+ RenderStyle* parentStyle = parent->renderStyle();
+ unsigned subcount = 0;
+ Node* thisCousin = parent;
+ Node* currentNode = parent->previousSibling();
+
+ // Reserve the tries for this level. This effectively makes sure that the algorithm
+ // will never go deeper than cStyleSearchLevelThreshold levels into recursion.
+ visitedNodeCount += cStyleSearchThreshold;
+ while (thisCousin) {
+ while (currentNode) {
+ ++subcount;
+ if (!currentNode->hasScopedHTMLStyleChild() && currentNode->renderStyle() == parentStyle && currentNode->lastChild()
+ && currentNode->isElementNode() && !parentElementPreventsSharing(toElement(currentNode))
+ && !toElement(currentNode)->shadow()
+ ) {
+ // Adjust for unused reserved tries.
+ visitedNodeCount -= cStyleSearchThreshold - subcount;
+ return currentNode->lastChild();
+ }
+ if (subcount >= cStyleSearchThreshold)
+ return 0;
+ currentNode = currentNode->previousSibling();
+ }
+ currentNode = locateCousinList(thisCousin->parentElement(), visitedNodeCount);
+ thisCousin = currentNode;
+ }
+
+ return 0;
+}
+
+
bool SharedStyleFinder::canShareStyleWithControl(const ElementResolveContext& context, Element* element) const
{
if (!element->hasTagName(inputTag) || !context.element()->hasTagName(inputTag))
@@ -161,16 +214,9 @@ bool SharedStyleFinder::sharingCandidateHasIdenticalStyleAffectingAttributes(con
bool SharedStyleFinder::canShareStyleWithElement(const ElementResolveContext& context, Element* element) const
{
- if (context.element() == element)
- return false;
- Element* parent = element->parentElement();
RenderStyle* style = element->renderStyle();
if (!style)
return false;
- if (!parent)
- return false;
- if (context.element()->parentElement()->renderStyle() != parent->renderStyle())
- return false;
if (style->unique())
return false;
if (style->hasUniquePseudoStyle())
@@ -250,24 +296,22 @@ bool SharedStyleFinder::canShareStyleWithElement(const ElementResolveContext& co
return false;
}
- if (context.element()->parentElement() != parent) {
- if (!parent->isStyledElement())
- return false;
- if (parent->hasScopedHTMLStyleChild())
- return false;
- if (parent->inlineStyle())
- return false;
- if (parent->isSVGElement() && toSVGElement(parent)->animatedSMILStyleProperties())
- return false;
- if (parent->hasID() && m_features.idsInRules.contains(parent->idForStyleResolution().impl()))
- return false;
- if (parentElementPreventsSharing(parent))
- return false;
- }
-
return true;
}
+inline Element* SharedStyleFinder::findSiblingForStyleSharing(const ElementResolveContext& context, Node* node, unsigned& count) const
+{
+ for (; node; node = node->previousSibling()) {
+ if (!node->isStyledElement())
+ continue;
+ if (canShareStyleWithElement(context, toElement(node)))
+ break;
+ if (count++ == cStyleSearchThreshold)
+ return 0;
+ }
+ return toElement(node);
+}
+
#ifdef STYLE_STATS
Element* SharedStyleFinder::searchDocumentForSharedStyle(const ElementResolveContext& context) const
{
@@ -279,28 +323,10 @@ Element* SharedStyleFinder::searchDocumentForSharedStyle(const ElementResolveCon
}
#endif
-inline Element* SharedStyleFinder::findElementForStyleSharing(const ElementResolveContext& context) const
-{
- StyleSharingList& styleSharingList = m_styleResolver->styleSharingList();
- for (StyleSharingList::iterator iter = styleSharingList.begin(); iter != styleSharingList.end(); ++iter) {
- if (canShareStyleWithElement(context, *iter)) {
- Element* element = *iter;
- if (iter != styleSharingList.begin()) {
- // Move the element to the front of the LRU
- styleSharingList.remove(iter);
- styleSharingList.prepend(element);
- }
- return element;
- }
- }
- m_styleResolver->addToStyleSharingList(context.element());
- return 0;
-}
-
RenderStyle* SharedStyleFinder::locateSharedStyle(const ElementResolveContext& context, RenderStyle* newStyle)
{
STYLE_STATS_ADD_SEARCH();
- if (!context.element() || !context.element()->isStyledElement() || !context.element()->parentElement())
+ if (!context.element() || !context.element()->isStyledElement())
return 0;
// If the element has inline style it is probably unique.
@@ -344,7 +370,17 @@ RenderStyle* SharedStyleFinder::locateSharedStyle(const ElementResolveContext& c
// FIXME: This should be an explicit out parameter, instead of a member variable.
m_elementAffectedByClassRules = context.element() && context.element()->hasClass() && classNamesAffectedByRules(context.element()->classNames());
- Element* shareElement = findElementForStyleSharing(context);
+ // Check previous siblings and their cousins.
+ unsigned count = 0;
+ unsigned visitedNodeCount = 0;
+ Element* shareElement = 0;
+ Node* cousinList = context.element()->previousSibling();
+ while (cousinList) {
+ shareElement = findSiblingForStyleSharing(context, cousinList, count);
+ if (shareElement)
+ break;
+ cousinList = locateCousinList(cousinList->parentElement(), visitedNodeCount);
+ }
#ifdef STYLE_STATS
// FIXME: these stats don't to into account whether or not sibling/attribute
diff --git a/chromium/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.h b/chromium/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.h
index d407279a588..7734c3665d7 100644
--- a/chromium/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.h
+++ b/chromium/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.h
@@ -51,7 +51,8 @@ public:
RenderStyle* locateSharedStyle(const ElementResolveContext&, RenderStyle* newStyle);
private:
- Element* findElementForStyleSharing(const ElementResolveContext&) const;
+ Node* locateCousinList(Element* parent, unsigned& visitedNodeCount) const;
+ Element* findSiblingForStyleSharing(const ElementResolveContext&, Node*, unsigned& count) const;
// Only used when we're collecting stats on styles
Element* searchDocumentForSharedStyle(const ElementResolveContext&) const;
diff --git a/chromium/third_party/WebKit/Source/core/css/resolver/StyleBuilderCustom.cpp b/chromium/third_party/WebKit/Source/core/css/resolver/StyleBuilderCustom.cpp
index 5f494e42d41..f49afb1a607 100644
--- a/chromium/third_party/WebKit/Source/core/css/resolver/StyleBuilderCustom.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/resolver/StyleBuilderCustom.cpp
@@ -1395,7 +1395,6 @@ void StyleBuilder::oldApplyProperty(CSSPropertyID id, StyleResolverState& state,
state.setLineHeightValue(0);
state.fontBuilder().fromSystemFont(primitiveValue->getValueID(), state.style()->effectiveZoom());
return;
- case CSSPropertyAnimation:
case CSSPropertyBackground:
case CSSPropertyBackgroundPosition:
case CSSPropertyBackgroundRepeat:
@@ -1823,14 +1822,6 @@ void StyleBuilder::oldApplyProperty(CSSPropertyID id, StyleResolverState& state,
}
// These properties are aliased and we already applied the property on the prefixed version.
- case CSSPropertyAnimationDelay:
- case CSSPropertyAnimationDirection:
- case CSSPropertyAnimationDuration:
- case CSSPropertyAnimationFillMode:
- case CSSPropertyAnimationIterationCount:
- case CSSPropertyAnimationName:
- case CSSPropertyAnimationPlayState:
- case CSSPropertyAnimationTimingFunction:
case CSSPropertyTransitionDelay:
case CSSPropertyTransitionDuration:
case CSSPropertyTransitionProperty:
diff --git a/chromium/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp b/chromium/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
index 8070d0f3f27..4ce361fa0a3 100644
--- a/chromium/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
@@ -149,8 +149,8 @@ StyleResolver::StyleResolver(Document* document, bool matchAuthorAndUserStyles)
fontSelector()->addFontFaceRule((*it)->fontFaceRule());
}
#endif
-
- styleSheetCollection->appendActiveAuthorStyleSheets(this);
+ m_styleTree.setBuildInDocumentOrder(!styleSheetCollection->hasScopedStyleSheet());
+ appendAuthorStyleSheets(0, styleSheetCollection->activeAuthorStyleSheets());
}
void StyleResolver::appendAuthorStyleSheets(unsigned firstNew, const Vector<RefPtr<CSSStyleSheet> >& styleSheets)
@@ -170,10 +170,7 @@ void StyleResolver::appendAuthorStyleSheets(unsigned firstNew, const Vector<RefP
resolver->addRulesFromSheet(sheet, *m_medium, this);
m_inspectorCSSOMWrappers.collectFromStyleSheetIfNeeded(cssSheet);
}
-}
-void StyleResolver::finishAppendAuthorStyleSheets()
-{
collectFeatures();
if (document()->renderer() && document()->renderer()->style())
@@ -185,6 +182,7 @@ void StyleResolver::finishAppendAuthorStyleSheets()
void StyleResolver::resetAuthorStyle(const ContainerNode* scopingNode)
{
+ m_styleTree.clear();
ScopedStyleResolver* resolver = scopingNode ? m_styleTree.scopedStyleResolverFor(scopingNode) : m_styleTree.scopedStyleResolverForDocument();
if (!resolver)
return;
@@ -192,13 +190,8 @@ void StyleResolver::resetAuthorStyle(const ContainerNode* scopingNode)
m_ruleSets.shadowDistributedRules().reset(scopingNode);
resolver->resetAuthorStyle();
- if (!scopingNode)
- return;
-
- if (scopingNode->isShadowRoot())
- resetAtHostRules(scopingNode);
- if (!resolver->hasOnlyEmptyRuleSets())
+ if (!scopingNode || !resolver->hasOnlyEmptyRuleSets())
return;
m_styleTree.remove(scopingNode);
@@ -243,18 +236,6 @@ void StyleResolver::collectFeatures()
m_uncommonAttributeRuleSet = makeRuleSet(m_features.uncommonAttributeRules);
}
-void StyleResolver::addToStyleSharingList(Element* element)
-{
- if (m_styleSharingList.size() >= styleSharingListSize)
- m_styleSharingList.remove(--m_styleSharingList.end());
- m_styleSharingList.prepend(element);
-}
-
-void StyleResolver::clearStyleSharingList()
-{
- m_styleSharingList.clear();
-}
-
void StyleResolver::pushParentElement(Element* parent)
{
const ContainerNode* parentsParent = parent->parentOrShadowHostElement();
@@ -789,7 +770,7 @@ void StyleResolver::keyframeStylesForAnimation(Element* e, const RenderStyle* el
keyframeValue.addProperties(keyframe->properties());
// Add this keyframe style to all the indicated key times
- Vector<double> keys;
+ Vector<float> keys;
keyframe->getKeys(keys);
for (size_t keyIndex = 0; keyIndex < keys.size(); ++keyIndex) {
keyframeValue.setKey(keys[keyIndex]);
@@ -837,7 +818,7 @@ void StyleResolver::resolveKeyframes(Element* element, const RenderStyle* style,
for (size_t i = 0; i < styleKeyframes.size(); ++i) {
const StyleKeyframe* styleKeyframe = styleKeyframes[i].get();
RefPtr<RenderStyle> keyframeStyle = styleForKeyframe(element, style, styleKeyframe);
- Vector<double> offsets;
+ Vector<float> offsets;
styleKeyframe->getKeys(offsets);
RefPtr<Keyframe> firstOffsetKeyframe;
for (size_t j = 0; j < offsets.size(); ++j) {
@@ -921,7 +902,7 @@ const StylePropertySet* StyleResolver::firstKeyframeStyles(const Element* elemen
for (unsigned i = 0; i < styleKeyframes.size(); ++i) {
const StyleKeyframe* styleKeyframe = styleKeyframes[i].get();
- Vector<double> offsets;
+ Vector<float> offsets;
styleKeyframe->getKeys(offsets);
for (size_t j = 0; j < offsets.size(); ++j) {
if (!offsets[j]) {
diff --git a/chromium/third_party/WebKit/Source/core/css/resolver/StyleResolver.h b/chromium/third_party/WebKit/Source/core/css/resolver/StyleResolver.h
index 15db7d44f56..d9d14e9fc7e 100644
--- a/chromium/third_party/WebKit/Source/core/css/resolver/StyleResolver.h
+++ b/chromium/third_party/WebKit/Source/core/css/resolver/StyleResolver.h
@@ -36,7 +36,6 @@
#include "core/css/resolver/StyleBuilder.h"
#include "core/css/resolver/StyleResolverState.h"
#include "core/css/resolver/StyleResourceLoader.h"
-#include "wtf/Deque.h"
#include "wtf/HashMap.h"
#include "wtf/HashSet.h"
#include "wtf/RefPtr.h"
@@ -86,9 +85,6 @@ enum RuleMatchingBehavior {
MatchOnlyUserAgentRules,
};
-const unsigned styleSharingListSize = 20;
-typedef WTF::Deque<Element*, styleSharingListSize> StyleSharingList;
-
#undef STYLE_STATS
#ifdef STYLE_STATS
@@ -216,9 +212,10 @@ public:
// FIXME: It could be better to call m_ruleSets.appendAuthorStyleSheets() directly after we factor StyleRsolver further.
// https://bugs.webkit.org/show_bug.cgi?id=108890
void appendAuthorStyleSheets(unsigned firstNew, const Vector<RefPtr<CSSStyleSheet> >&);
+ // FIXME: resetAuthorStyle() will be removed when rulesets are reset in a per-scoping node manner.
+ void resetAuthorStyle();
void resetAuthorStyle(const ContainerNode*);
void resetAtHostRules(const ContainerNode*);
- void finishAppendAuthorStyleSheets();
DocumentRuleSets& ruleSets() { return m_ruleSets; }
const DocumentRuleSets& ruleSets() const { return m_ruleSets; }
@@ -279,11 +276,6 @@ public:
const RuleFeatureSet& ruleFeatureSet() const { return m_features; }
- StyleSharingList& styleSharingList() { return m_styleSharingList; }
-
- void addToStyleSharingList(Element*);
- void clearStyleSharingList();
-
#ifdef STYLE_STATS
ALWAYS_INLINE static StyleSharingStats& styleSharingStats() { return m_styleSharingStats; }
#endif
@@ -367,8 +359,6 @@ private:
StyleResourceLoader m_styleResourceLoader;
- StyleSharingList m_styleSharingList;
-
#ifdef STYLE_STATS
static StyleSharingStats m_styleSharingStats;
#endif
diff --git a/chromium/third_party/WebKit/Source/core/css/resolver/StyleResourceLoader.cpp b/chromium/third_party/WebKit/Source/core/css/resolver/StyleResourceLoader.cpp
index 3158763d320..bec09851013 100644
--- a/chromium/third_party/WebKit/Source/core/css/resolver/StyleResourceLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/css/resolver/StyleResourceLoader.cpp
@@ -29,7 +29,7 @@
#include "core/css/CSSSVGDocumentValue.h"
#include "core/css/CSSShaderValue.h"
#include "core/css/resolver/ElementStyleResources.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/platform/graphics/filters/custom/CustomFilterOperation.h"
#include "core/rendering/style/ContentData.h"
#include "core/rendering/style/CursorList.h"
diff --git a/chromium/third_party/WebKit/Source/core/dom/Clipboard.cpp b/chromium/third_party/WebKit/Source/core/dom/Clipboard.cpp
index ee98d9f9586..0c7f7252955 100644
--- a/chromium/third_party/WebKit/Source/core/dom/Clipboard.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/Clipboard.cpp
@@ -26,8 +26,8 @@
#include "config.h"
#include "core/dom/Clipboard.h"
-#include "core/fetch/ImageResource.h"
#include "core/fileapi/FileList.h"
+#include "core/loader/cache/ImageResource.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/dom/Clipboard.h b/chromium/third_party/WebKit/Source/core/dom/Clipboard.h
index bc861ded2e0..a32134b905c 100644
--- a/chromium/third_party/WebKit/Source/core/dom/Clipboard.h
+++ b/chromium/third_party/WebKit/Source/core/dom/Clipboard.h
@@ -27,7 +27,7 @@
#include "bindings/v8/ScriptWrappable.h"
#include "core/dom/ClipboardAccessPolicy.h"
#include "core/dom/Node.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/page/DragActions.h"
#include "core/platform/DragImage.h"
#include "core/platform/graphics/IntPoint.h"
diff --git a/chromium/third_party/WebKit/Source/core/dom/ContainerNode.cpp b/chromium/third_party/WebKit/Source/core/dom/ContainerNode.cpp
index 0fb80f01519..1b26b71ed40 100644
--- a/chromium/third_party/WebKit/Source/core/dom/ContainerNode.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/ContainerNode.cpp
@@ -25,7 +25,6 @@
#include "bindings/v8/ExceptionState.h"
#include "bindings/v8/ExceptionStatePlaceholder.h"
-#include "core/css/resolver/StyleResolver.h"
#include "core/dom/ChildListMutationScope.h"
#include "core/dom/ContainerNodeAlgorithms.h"
#include "core/dom/EventNames.h"
@@ -683,8 +682,6 @@ void ContainerNode::resumePostAttachCallbacks()
if (s_postAttachCallbackQueue)
dispatchPostAttachCallbacks();
- if (StyleResolver* resolver = document()->styleResolverIfExists())
- resolver->clearStyleSharingList();
}
--s_attachDepth;
}
@@ -1039,8 +1036,6 @@ static void updateTreeAfterInsertion(ContainerNode* parent, Node* child, AttachB
child->lazyAttach();
else
child->attach();
- if (StyleResolver* resolver = parent->document()->document()->styleResolverIfExists())
- resolver->clearStyleSharingList();
}
dispatchChildInsertionEvents(child);
diff --git a/chromium/third_party/WebKit/Source/core/dom/CustomElement.cpp b/chromium/third_party/WebKit/Source/core/dom/CustomElement.cpp
index 1e506c5dcd7..6ffcd2a9730 100644
--- a/chromium/third_party/WebKit/Source/core/dom/CustomElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/CustomElement.cpp
@@ -35,7 +35,7 @@
#include "MathMLNames.h"
#include "SVGNames.h"
#include "core/dom/CustomElementCallbackScheduler.h"
-#include "core/dom/CustomElementObserver.h"
+#include "core/dom/CustomElementUpgradeCandidateMap.h"
#include "core/dom/Element.h"
namespace WebCore {
@@ -131,13 +131,12 @@ void CustomElement::wasDestroyed(Element* element)
break;
case Element::UpgradeCandidate:
- CustomElementObserver::notifyElementWasDestroyed(element);
+ CustomElementUpgradeCandidateMap::elementWasDestroyed(element);
break;
case Element::Defined:
case Element::Upgraded:
definitions().remove(element);
- CustomElementObserver::notifyElementWasDestroyed(element);
break;
}
}
diff --git a/chromium/third_party/WebKit/Source/core/dom/CustomElementException.cpp b/chromium/third_party/WebKit/Source/core/dom/CustomElementException.cpp
deleted file mode 100644
index b5752a8c02d..00000000000
--- a/chromium/third_party/WebKit/Source/core/dom/CustomElementException.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name of Google Inc. nor the names of its contributors
- * may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "core/dom/CustomElementException.h"
-
-#include "bindings/v8/ExceptionState.h"
-#include "core/dom/ExceptionCode.h"
-
-namespace WebCore {
-
-String CustomElementException::preamble(const AtomicString& type)
-{
- return "Failed to call 'register' on 'Document' for type '" + type + "': ";
-}
-
-void CustomElementException::throwException(Reason reason, const AtomicString& type, ExceptionState& es)
-{
- switch (reason) {
- case CannotRegisterFromExtension:
- es.throwDOMException(NotSupportedError, preamble(type) + "elements cannot be registered from extensions.");
- return;
-
- case ConstructorPropertyNotConfigurable:
- es.throwDOMException(NotSupportedError, preamble(type) + "prototype constructor property is not configurable.");
- return;
-
- case ContextDestroyedCheckingPrototype:
- es.throwDOMException(InvalidStateError, preamble(type) + "the context is no longer valid.");
- return;
-
- case ContextDestroyedCreatingCallbacks:
- es.throwDOMException(InvalidStateError);
- return;
-
- case ContextDestroyedRegisteringDefinition:
- es.throwDOMException(NotSupportedError);
- return;
-
- case InvalidName:
- es.throwDOMException(InvalidCharacterError, preamble(type) + ": '" + type + "' is not a valid name.");
- return;
-
- case NotYetImplemented:
- es.throwDOMException(InvalidStateError);
- return;
-
- case PrototypeDoesNotExtendHTMLElementSVGElementNamespace:
- es.throwDOMException(NamespaceError, preamble(type) + "the prototype does not extend an HTML or SVG element.");
- return;
-
- case PrototypeDoesNotExtendHTMLElementSVGElementPrototype:
- es.throwDOMException(InvalidStateError, preamble(type) + "the prototype does not extend an HTML or SVG element.");
- return;
-
- case PrototypeInUse:
- es.throwDOMException(NotSupportedError, preamble(type) + "prototype is already in-use as an interface prototype object.");
- return;
-
- case PrototypeNotAnObject:
- es.throwDOMException(InvalidStateError, preamble(type) + "the prototype option is not an object.");
- return;
-
- case TypeAlreadyRegistered:
- es.throwDOMException(InvalidStateError, preamble(type) + "a type with that name is already registered.");
- return;
- }
-
- ASSERT_NOT_REACHED();
-}
-
-} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/dom/CustomElementException.h b/chromium/third_party/WebKit/Source/core/dom/CustomElementException.h
deleted file mode 100644
index 622ef220699..00000000000
--- a/chromium/third_party/WebKit/Source/core/dom/CustomElementException.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name of Google Inc. nor the names of its contributors
- * may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef CustomElementException_h
-#define CustomElementException_h
-
-#include "wtf/text/AtomicString.h"
-#include "wtf/text/WTFString.h"
-
-namespace WebCore {
-
-class ExceptionState;
-
-class CustomElementException {
-public:
- enum Reason {
- CannotRegisterFromExtension,
- ConstructorPropertyNotConfigurable,
- ContextDestroyedCheckingPrototype,
- ContextDestroyedCreatingCallbacks,
- ContextDestroyedRegisteringDefinition,
- InvalidName,
- NotYetImplemented,
- PrototypeDoesNotExtendHTMLElementSVGElementNamespace,
- PrototypeDoesNotExtendHTMLElementSVGElementPrototype,
- PrototypeInUse,
- PrototypeNotAnObject,
- TypeAlreadyRegistered
- };
-
- static void throwException(Reason, const AtomicString& type, ExceptionState&);
-
-private:
- CustomElementException();
-
- static String preamble(const AtomicString& type);
-};
-
-}
-
-#endif // CustomElementException_h
diff --git a/chromium/third_party/WebKit/Source/core/dom/CustomElementObserver.cpp b/chromium/third_party/WebKit/Source/core/dom/CustomElementObserver.cpp
deleted file mode 100644
index d4a9fba2842..00000000000
--- a/chromium/third_party/WebKit/Source/core/dom/CustomElementObserver.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name of Google Inc. nor the names of its contributors
- * may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "core/dom/CustomElementObserver.h"
-
-namespace WebCore {
-
-CustomElementObserver::ElementObserverMap& CustomElementObserver::elementObservers()
-{
- DEFINE_STATIC_LOCAL(ElementObserverMap, map, ());
- return map;
-}
-
-void CustomElementObserver::notifyElementWasDestroyed(Element* element)
-{
- ElementObserverMap::iterator it = elementObservers().find(element);
- if (it == elementObservers().end())
- return;
- it->value->elementWasDestroyed(element);
-}
-
-void CustomElementObserver::observe(Element* element)
-{
- ElementObserverMap::AddResult result = elementObservers().add(element, this);
- ASSERT(result.isNewEntry);
-}
-
-void CustomElementObserver::unobserve(Element* element)
-{
- CustomElementObserver* observer = elementObservers().take(element);
- ASSERT(observer == this);
-}
-
-} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/dom/CustomElementObserver.h b/chromium/third_party/WebKit/Source/core/dom/CustomElementObserver.h
deleted file mode 100644
index 39d702e6e92..00000000000
--- a/chromium/third_party/WebKit/Source/core/dom/CustomElementObserver.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name of Google Inc. nor the names of its contributors
- * may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef CustomElementObserver_h
-#define CustomElementObserver_h
-
-#include "wtf/HashMap.h"
-
-namespace WebCore {
-
-class Element;
-
-class CustomElementObserver {
-public:
- CustomElementObserver() { }
- virtual ~CustomElementObserver() { }
-
- // API for CustomElement to kick off notifications
-
- static void notifyElementWasDestroyed(Element*);
-
-protected:
- void observe(Element*);
- void unobserve(Element*);
-
- virtual void elementWasDestroyed(Element* element) { unobserve(element); }
-
-private:
- // Maps elements to the observer watching them. At most one per
- // element at a time.
- typedef HashMap<Element*, CustomElementObserver*> ElementObserverMap;
- static ElementObserverMap& elementObservers();
-};
-
-}
-
-#endif // CustomElementObserver_h
diff --git a/chromium/third_party/WebKit/Source/core/dom/CustomElementRegistry.cpp b/chromium/third_party/WebKit/Source/core/dom/CustomElementRegistry.cpp
index 472cde1e9d2..9d9195cef5a 100644
--- a/chromium/third_party/WebKit/Source/core/dom/CustomElementRegistry.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/CustomElementRegistry.cpp
@@ -34,11 +34,12 @@
#include "HTMLNames.h"
#include "SVGNames.h"
#include "bindings/v8/CustomElementConstructorBuilder.h"
+#include "bindings/v8/ExceptionState.h"
#include "core/dom/CustomElement.h"
#include "core/dom/CustomElementDefinition.h"
-#include "core/dom/CustomElementException.h"
#include "core/dom/CustomElementRegistrationContext.h"
#include "core/dom/DocumentLifecycleObserver.h"
+#include "core/dom/ExceptionCode.h"
namespace WebCore {
@@ -66,30 +67,31 @@ CustomElementDefinition* CustomElementRegistry::registerElement(Document* docume
// consolidated in one place.
RegistrationContextObserver observer(document);
- AtomicString type = userSuppliedName.lower();
-
if (!constructorBuilder->isFeatureAllowed()) {
- CustomElementException::throwException(CustomElementException::CannotRegisterFromExtension, type, es);
+ es.throwDOMException(NotSupportedError);
return 0;
}
+ AtomicString type = userSuppliedName.lower();
if (!CustomElement::isValidTypeName(type)) {
- CustomElementException::throwException(CustomElementException::InvalidName, type, es);
+ es.throwDOMException(InvalidCharacterError);
return 0;
}
- if (!constructorBuilder->validateOptions(type, es))
+ if (!constructorBuilder->validateOptions()) {
+ es.throwDOMException(InvalidStateError);
return 0;
+ }
QualifiedName tagName = nullQName();
if (!constructorBuilder->findTagName(type, tagName)) {
- CustomElementException::throwException(CustomElementException::PrototypeDoesNotExtendHTMLElementSVGElementNamespace, type, es);
+ es.throwDOMException(NamespaceError);
return 0;
}
ASSERT(tagName.namespaceURI() == HTMLNames::xhtmlNamespaceURI || tagName.namespaceURI() == SVGNames::svgNamespaceURI);
if (m_registeredTypeNames.contains(type)) {
- CustomElementException::throwException(CustomElementException::TypeAlreadyRegistered, type, es);
+ es.throwDOMException(InvalidStateError);
return 0;
}
@@ -100,21 +102,23 @@ CustomElementDefinition* CustomElementRegistry::registerElement(Document* docume
// Consulting the constructor builder could execute script and
// kill the document.
if (observer.registrationContextWentAway()) {
- CustomElementException::throwException(CustomElementException::ContextDestroyedCreatingCallbacks, type, es);
+ es.throwDOMException(InvalidStateError);
return 0;
}
const CustomElementDescriptor descriptor(type, tagName.namespaceURI(), tagName.localName());
RefPtr<CustomElementDefinition> definition = CustomElementDefinition::create(descriptor, lifecycleCallbacks);
- if (!constructorBuilder->createConstructor(document, definition.get(), es))
+ if (!constructorBuilder->createConstructor(document, definition.get())) {
+ es.throwDOMException(NotSupportedError);
return 0;
+ }
m_definitions.add(descriptor, definition);
m_registeredTypeNames.add(descriptor.type());
if (!constructorBuilder->didRegisterDefinition(definition.get())) {
- CustomElementException::throwException(CustomElementException::ContextDestroyedRegisteringDefinition, type, es);
+ es.throwDOMException(NotSupportedError);
return 0;
}
diff --git a/chromium/third_party/WebKit/Source/core/dom/CustomElementUpgradeCandidateMap.cpp b/chromium/third_party/WebKit/Source/core/dom/CustomElementUpgradeCandidateMap.cpp
index 7dda7901d45..c84bcb7dec5 100644
--- a/chromium/third_party/WebKit/Source/core/dom/CustomElementUpgradeCandidateMap.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/CustomElementUpgradeCandidateMap.cpp
@@ -39,14 +39,14 @@ CustomElementUpgradeCandidateMap::~CustomElementUpgradeCandidateMap()
{
UpgradeCandidateMap::const_iterator::Keys end = m_upgradeCandidates.end().keys();
for (UpgradeCandidateMap::const_iterator::Keys it = m_upgradeCandidates.begin().keys(); it != end; ++it)
- unobserve(*it);
+ unregisterForElementDestructionNotification(*it, this);
}
void CustomElementUpgradeCandidateMap::add(const CustomElementDescriptor& descriptor, Element* element)
{
element->setCustomElementState(Element::UpgradeCandidate);
- observe(element);
+ registerForElementDestructionNotification(element, this);
UpgradeCandidateMap::AddResult result = m_upgradeCandidates.add(element, descriptor);
ASSERT(result.isNewEntry);
@@ -59,18 +59,8 @@ void CustomElementUpgradeCandidateMap::add(const CustomElementDescriptor& descri
void CustomElementUpgradeCandidateMap::remove(Element* element)
{
- unobserve(element);
- removeCommon(element);
-}
-
-void CustomElementUpgradeCandidateMap::elementWasDestroyed(Element* element)
-{
- CustomElementObserver::elementWasDestroyed(element);
- removeCommon(element);
-}
+ unregisterForElementDestructionNotification(element, this);
-void CustomElementUpgradeCandidateMap::removeCommon(Element* element)
-{
UpgradeCandidateMap::iterator candidate = m_upgradeCandidates.find(element);
ASSERT(candidate != m_upgradeCandidates.end());
@@ -85,11 +75,37 @@ ListHashSet<Element*> CustomElementUpgradeCandidateMap::takeUpgradeCandidatesFor
const ListHashSet<Element*>& candidates = m_unresolvedDefinitions.take(descriptor);
for (ElementSet::const_iterator candidate = candidates.begin(); candidate != candidates.end(); ++candidate) {
- unobserve(*candidate);
+ unregisterForElementDestructionNotification(*candidate, this);
m_upgradeCandidates.remove(*candidate);
}
return candidates;
}
+void CustomElementUpgradeCandidateMap::elementWasDestroyed(Element* element)
+{
+ DestructionObserverMap::iterator it = destructionObservers().find(element);
+ if (it == destructionObservers().end())
+ return;
+ it->value->remove(element); // will also remove the destruction observer
+}
+
+CustomElementUpgradeCandidateMap::DestructionObserverMap& CustomElementUpgradeCandidateMap::destructionObservers()
+{
+ DEFINE_STATIC_LOCAL(DestructionObserverMap, map, ());
+ return map;
+}
+
+void CustomElementUpgradeCandidateMap::registerForElementDestructionNotification(Element* element, CustomElementUpgradeCandidateMap* observer)
+{
+ DestructionObserverMap::AddResult result = destructionObservers().add(element, observer);
+ ASSERT(result.isNewEntry);
+}
+
+void CustomElementUpgradeCandidateMap::unregisterForElementDestructionNotification(Element* element, CustomElementUpgradeCandidateMap* observer)
+{
+ CustomElementUpgradeCandidateMap* map = destructionObservers().take(element);
+ ASSERT(map == observer);
+}
+
}
diff --git a/chromium/third_party/WebKit/Source/core/dom/CustomElementUpgradeCandidateMap.h b/chromium/third_party/WebKit/Source/core/dom/CustomElementUpgradeCandidateMap.h
index 0fef2f85969..2814c0a2d20 100644
--- a/chromium/third_party/WebKit/Source/core/dom/CustomElementUpgradeCandidateMap.h
+++ b/chromium/third_party/WebKit/Source/core/dom/CustomElementUpgradeCandidateMap.h
@@ -33,7 +33,6 @@
#include "core/dom/CustomElementDescriptor.h"
#include "core/dom/CustomElementDescriptorHash.h"
-#include "core/dom/CustomElementObserver.h"
#include "wtf/HashMap.h"
#include "wtf/ListHashSet.h"
#include "wtf/Noncopyable.h"
@@ -42,23 +41,26 @@ namespace WebCore {
class Element;
-class CustomElementUpgradeCandidateMap : CustomElementObserver {
+class CustomElementUpgradeCandidateMap {
WTF_MAKE_NONCOPYABLE(CustomElementUpgradeCandidateMap);
public:
CustomElementUpgradeCandidateMap() { }
~CustomElementUpgradeCandidateMap();
- // API for CustomElementRegistrationContext to save and take candidates
-
- typedef ListHashSet<Element*> ElementSet;
+ static void elementWasDestroyed(Element*);
void add(const CustomElementDescriptor&, Element*);
void remove(Element*);
+
+ typedef ListHashSet<Element*> ElementSet;
ElementSet takeUpgradeCandidatesFor(const CustomElementDescriptor&);
private:
- virtual void elementWasDestroyed(Element*) OVERRIDE;
- void removeCommon(Element*);
+ // Maps elements to upgrade candidate maps observing their destruction
+ typedef HashMap<Element*, CustomElementUpgradeCandidateMap*> DestructionObserverMap;
+ static DestructionObserverMap& destructionObservers();
+ static void registerForElementDestructionNotification(Element*, CustomElementUpgradeCandidateMap*);
+ static void unregisterForElementDestructionNotification(Element*, CustomElementUpgradeCandidateMap*);
typedef HashMap<Element*, CustomElementDescriptor> UpgradeCandidateMap;
UpgradeCandidateMap m_upgradeCandidates;
diff --git a/chromium/third_party/WebKit/Source/core/dom/DataTransferItemList.h b/chromium/third_party/WebKit/Source/core/dom/DataTransferItemList.h
index 90d847f886a..91fd9679e1d 100644
--- a/chromium/third_party/WebKit/Source/core/dom/DataTransferItemList.h
+++ b/chromium/third_party/WebKit/Source/core/dom/DataTransferItemList.h
@@ -56,8 +56,8 @@ public:
virtual PassRefPtr<DataTransferItem> item(unsigned long index) = 0;
virtual void deleteItem(unsigned long index, ExceptionState&) = 0;
virtual void clear() = 0;
- virtual PassRefPtr<DataTransferItem> add(const String& data, const String& type, ExceptionState&) = 0;
- virtual PassRefPtr<DataTransferItem> add(PassRefPtr<File>) = 0;
+ virtual void add(const String& data, const String& type, ExceptionState&) = 0;
+ virtual void add(PassRefPtr<File>) = 0;
};
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/dom/DataTransferItemList.idl b/chromium/third_party/WebKit/Source/core/dom/DataTransferItemList.idl
index 0babe031c24..eec5c0c5020 100644
--- a/chromium/third_party/WebKit/Source/core/dom/DataTransferItemList.idl
+++ b/chromium/third_party/WebKit/Source/core/dom/DataTransferItemList.idl
@@ -28,13 +28,15 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-interface DataTransferItemList {
+[
+ NoInterfaceObject
+] interface DataTransferItemList {
readonly attribute long length;
- [ImplementedAs=item] getter DataTransferItem (unsigned long index);
+ getter DataTransferItem item([Default=Undefined] optional unsigned long index);
- [RaisesException, ImplementedAs=deleteItem] void remove(unsigned long index);
void clear();
- DataTransferItem add(File? file);
- [RaisesException] DataTransferItem add(DOMString data, DOMString type);
+ void add(File? file);
+ [RaisesException] void add([Default=Undefined] optional DOMString data,
+ [Default=Undefined] optional DOMString type);
};
diff --git a/chromium/third_party/WebKit/Source/core/dom/Document.cpp b/chromium/third_party/WebKit/Source/core/dom/Document.cpp
index 82367ea555d..62dee7a7bbf 100644
--- a/chromium/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/Document.cpp
@@ -51,7 +51,6 @@
#include "core/css/StyleSheetList.h"
#include "core/css/resolver/StyleResolver.h"
#include "core/dom/Attr.h"
-#include "core/dom/BeforeUnloadEvent.h"
#include "core/dom/CDATASection.h"
#include "core/dom/Comment.h"
#include "core/dom/ContextFeatures.h"
@@ -98,7 +97,6 @@
#include "core/dom/shadow/ShadowRoot.h"
#include "core/editing/Editor.h"
#include "core/editing/FrameSelection.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/html/FormController.h"
#include "core/html/HTMLAllCollection.h"
#include "core/html/HTMLAnchorElement.h"
@@ -110,7 +108,6 @@
#include "core/html/HTMLHtmlElement.h"
#include "core/html/HTMLIFrameElement.h"
#include "core/html/HTMLImport.h"
-#include "core/html/HTMLInputElement.h"
#include "core/html/HTMLLinkElement.h"
#include "core/html/HTMLNameCollection.h"
#include "core/html/HTMLScriptElement.h"
@@ -131,6 +128,7 @@
#include "core/loader/Prerenderer.h"
#include "core/loader/TextResourceDecoder.h"
#include "core/loader/appcache/ApplicationCacheHost.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/Chrome.h"
#include "core/page/ChromeClient.h"
#include "core/page/ContentSecurityPolicy.h"
@@ -146,6 +144,7 @@
#include "core/page/PageConsole.h"
#include "core/page/PointerLockController.h"
#include "core/page/Settings.h"
+#include "core/page/ValidationMessageClient.h"
#include "core/page/animation/AnimationController.h"
#include "core/page/scrolling/ScrollingCoordinator.h"
#include "core/platform/DateComponents.h"
@@ -436,7 +435,6 @@ Document::Document(const DocumentInit& initializer, DocumentClassFlags documentC
, m_referrerPolicy(ReferrerPolicyDefault)
, m_directionSetOnDocumentElement(false)
, m_writingModeSetOnDocumentElement(false)
- , m_didAllowNavigationViaBeforeUnloadConfirmationPanel(false)
, m_writeRecursionIsTooDeep(false)
, m_writeRecursionDepth(0)
, m_wheelEventHandlerCount(0)
@@ -1088,11 +1086,8 @@ void Document::setReadyState(ReadyState readyState)
m_documentTiming.domLoading = monotonicallyIncreasingTime();
break;
case Interactive:
- if (!m_documentTiming.domInteractive) {
+ if (!m_documentTiming.domInteractive)
m_documentTiming.domInteractive = monotonicallyIncreasingTime();
- if (RuntimeEnabledFeatures::webAnimationsEnabled())
- m_timeline->setZeroTimeAsPerfTime(m_documentTiming.domInteractive);
- }
break;
case Complete:
if (!m_documentTiming.domComplete)
@@ -1298,7 +1293,6 @@ void Document::updateTitle(const StringWithDirection& title)
m_rawTitle = title;
- StringWithDirection oldTitle = m_title;
if (m_rawTitle.string().isEmpty())
m_title = StringWithDirection();
else {
@@ -1307,11 +1301,8 @@ void Document::updateTitle(const StringWithDirection& title)
else
m_title = canonicalizedTitle<UChar>(this, m_rawTitle);
}
-
- if (!m_frame || oldTitle == m_title)
- return;
- m_frame->loader()->history()->setCurrentItemTitle(m_title);
- m_frame->loader()->client()->dispatchDidReceiveTitle(m_title);
+ if (Frame* f = frame())
+ f->loader()->setTitle(m_title);
}
void Document::setTitle(const String& title)
@@ -1680,10 +1671,8 @@ void Document::recalcStyle(StyleChange change)
m_inStyleRecalc = false;
// Pseudo element removal and similar may only work with these flags still set. Reset them after the style recalc.
- if (m_styleResolver) {
+ if (m_styleResolver)
m_styleSheetCollection->resetCSSFeatureFlags(m_styleResolver->ruleFeatureSet());
- m_styleResolver->clearStyleSharingList();
- }
if (frameView) {
frameView->resumeScheduledEvents();
@@ -1899,8 +1888,11 @@ void Document::detach(const AttachContext& context)
{
ASSERT(attached());
- if (page())
- page()->documentDetached(this);
+ if (page()) {
+ page()->pointerLockController()->documentDetached(this);
+ if (ValidationMessageClient* client = page()->validationMessageClient())
+ client->documentDetached(*this);
+ }
if (this == topDocument())
clearAXObjectCache();
@@ -2330,95 +2322,6 @@ void Document::implicitClose()
accessSVGExtensions()->startAnimations();
}
-bool Document::dispatchBeforeUnloadEvent(Chrome& chrome, Document* navigatingDocument)
-{
- if (!m_domWindow)
- return true;
-
- if (!body())
- return true;
-
- RefPtr<Document> protect(this);
-
- RefPtr<BeforeUnloadEvent> beforeUnloadEvent = BeforeUnloadEvent::create();
- m_loadEventProgress = BeforeUnloadEventInProgress;
- dispatchWindowEvent(beforeUnloadEvent.get(), this);
- m_loadEventProgress = BeforeUnloadEventCompleted;
- if (!beforeUnloadEvent->defaultPrevented())
- defaultEventHandler(beforeUnloadEvent.get());
- if (beforeUnloadEvent->result().isNull())
- return true;
-
- if (navigatingDocument->m_didAllowNavigationViaBeforeUnloadConfirmationPanel) {
- addConsoleMessage(JSMessageSource, ErrorMessageLevel, "Blocked attempt to show multiple 'beforeunload' confirmation panels for a single navigation.");
- return true;
- }
-
- String text = displayStringModifiedByEncoding(beforeUnloadEvent->result());
- if (chrome.runBeforeUnloadConfirmPanel(text, m_frame)) {
- navigatingDocument->m_didAllowNavigationViaBeforeUnloadConfirmationPanel = true;
- return true;
- }
- return false;
-}
-
-void Document::dispatchUnloadEvents()
-{
- RefPtr<Document> protect(this);
- if (m_parser)
- m_parser->stopParsing();
-
- if (m_loadEventProgress >= LoadEventTried && m_loadEventProgress <= UnloadEventInProgress) {
- Element* currentFocusedElement = focusedElement();
- if (currentFocusedElement && currentFocusedElement->hasTagName(inputTag))
- toHTMLInputElement(currentFocusedElement)->endEditing();
- if (m_loadEventProgress < PageHideInProgress) {
- m_loadEventProgress = PageHideInProgress;
- dispatchWindowEvent(PageTransitionEvent::create(eventNames().pagehideEvent, false), this);
- if (!m_frame)
- return;
-
- // The DocumentLoader (and thus its DocumentLoadTiming) might get destroyed
- // while dispatching the event, so protect it to prevent writing the end
- // time into freed memory.
- RefPtr<DocumentLoader> documentLoader = m_frame->loader()->provisionalDocumentLoader();
- m_loadEventProgress = UnloadEventInProgress;
- RefPtr<Event> unloadEvent(Event::create(eventNames().unloadEvent, false, false));
- if (documentLoader && !documentLoader->timing()->unloadEventStart() && !documentLoader->timing()->unloadEventEnd()) {
- DocumentLoadTiming* timing = documentLoader->timing();
- ASSERT(timing->navigationStart());
- timing->markUnloadEventStart();
- dispatchWindowEvent(unloadEvent, this);
- timing->markUnloadEventEnd();
- } else {
- m_frame->domWindow()->dispatchEvent(unloadEvent, m_frame->document());
- }
- }
- updateStyleIfNeeded();
- m_loadEventProgress = UnloadEventHandled;
- }
-
- if (!m_frame)
- return;
-
- // Don't remove event listeners from a transitional empty document (see https://bugs.webkit.org/show_bug.cgi?id=28716 for more information).
- bool keepEventListeners = m_frame->loader()->stateMachine()->isDisplayingInitialEmptyDocument() && m_frame->loader()->provisionalDocumentLoader()
- && isSecureTransitionTo(m_frame->loader()->provisionalDocumentLoader()->url());
- if (!keepEventListeners)
- removeAllEventListeners();
-}
-
-Document::PageDismissalType Document::pageDismissalEventBeingDispatched() const
-{
- if (m_loadEventProgress == BeforeUnloadEventInProgress)
- return BeforeUnloadDismissal;
- if (m_loadEventProgress == PageHideInProgress)
- return PageHideDismissal;
- if (m_loadEventProgress == UnloadEventInProgress)
- return UnloadDismissal;
- return NoDismissal;
-}
-
void Document::setParsing(bool b)
{
m_bParsing = b;
@@ -2710,7 +2613,6 @@ Frame* Document::findUnsafeParentScrollPropagationBoundary()
void Document::seamlessParentUpdatedStylesheets()
{
- m_styleSheetCollection->didModifySeamlessParentStyleSheet();
styleResolverChanged(RecalcStyleImmediately);
}
@@ -4730,18 +4632,18 @@ void Document::webkitExitPointerLock()
{
if (!page())
return;
- if (Element* target = page()->pointerLockController().element()) {
+ if (Element* target = page()->pointerLockController()->element()) {
if (target->document() != this)
return;
}
- page()->pointerLockController().requestPointerUnlock();
+ page()->pointerLockController()->requestPointerUnlock();
}
Element* Document::webkitPointerLockElement() const
{
- if (!page() || page()->pointerLockController().lockPending())
+ if (!page() || page()->pointerLockController()->lockPending())
return 0;
- if (Element* element = page()->pointerLockController().element()) {
+ if (Element* element = page()->pointerLockController()->element()) {
if (element->document() == this)
return element;
}
diff --git a/chromium/third_party/WebKit/Source/core/dom/Document.h b/chromium/third_party/WebKit/Source/core/dom/Document.h
index f6aadfd9832..cd905432eef 100644
--- a/chromium/third_party/WebKit/Source/core/dom/Document.h
+++ b/chromium/third_party/WebKit/Source/core/dom/Document.h
@@ -67,7 +67,6 @@ class CSSStyleSheetResource;
class ScriptResource;
class CanvasRenderingContext;
class CharacterData;
-class Chrome;
class Comment;
class ContentSecurityPolicyResponseHeaders;
class ContextFeatures;
@@ -546,17 +545,6 @@ public:
// implicitClose() actually does the work of closing the input stream.
void implicitClose();
- bool dispatchBeforeUnloadEvent(Chrome&, Document* navigatingDocument);
- void dispatchUnloadEvents();
-
- enum PageDismissalType {
- NoDismissal = 0,
- BeforeUnloadDismissal = 1,
- PageHideDismissal = 2,
- UnloadDismissal = 3
- };
- PageDismissalType pageDismissalEventBeingDispatched() const;
-
void cancelParsing();
void write(const SegmentedString& text, Document* ownerDocument = 0);
@@ -766,8 +754,6 @@ public:
String title() const { return m_title.string(); }
void setTitle(const String&);
- const StringWithDirection& titleWithDirection() const { return m_title; }
-
Element* titleElement() const { return m_titleElement.get(); }
void setTitleElement(const StringWithDirection&, Element* titleElement);
void removeTitle(Element* titleElement);
@@ -928,15 +914,15 @@ public:
LoadEventTried,
LoadEventInProgress,
LoadEventCompleted,
- BeforeUnloadEventInProgress,
- BeforeUnloadEventCompleted,
- PageHideInProgress,
UnloadEventInProgress,
UnloadEventHandled
};
bool loadEventStillNeeded() const { return m_loadEventProgress == LoadEventNotRun; }
bool processingLoadEvent() const { return m_loadEventProgress == LoadEventInProgress; }
bool loadEventFinished() const { return m_loadEventProgress >= LoadEventCompleted; }
+ bool unloadEventStillNeeded() const { return m_loadEventProgress >= LoadEventTried && m_loadEventProgress <= UnloadEventInProgress; }
+ void unloadEventStarted() { m_loadEventProgress = UnloadEventInProgress; }
+ void unloadEventWasHandled() { m_loadEventProgress = UnloadEventHandled; }
virtual bool isContextThread() const;
virtual bool isJSExecutionForbidden() const { return false; }
@@ -1331,8 +1317,6 @@ private:
bool m_directionSetOnDocumentElement;
bool m_writingModeSetOnDocumentElement;
- bool m_didAllowNavigationViaBeforeUnloadConfirmationPanel;
-
DocumentTiming m_documentTiming;
RefPtr<MediaQueryMatcher> m_mediaQueryMatcher;
bool m_writeRecursionIsTooDeep;
diff --git a/chromium/third_party/WebKit/Source/core/dom/Document.idl b/chromium/third_party/WebKit/Source/core/dom/Document.idl
index c27623ad891..0fc91ba9df1 100644
--- a/chromium/third_party/WebKit/Source/core/dom/Document.idl
+++ b/chromium/third_party/WebKit/Source/core/dom/Document.idl
@@ -33,10 +33,10 @@ callback CustomElementConstructor = Element ();
DocumentFragment createDocumentFragment();
[PerWorldBindings] Text createTextNode([Default=Undefined] optional DOMString data);
Comment createComment([Default=Undefined] optional DOMString data);
- [RaisesException, MeasureAs=DocumentCreateCDATASection] CDATASection createCDATASection([Default=Undefined] optional DOMString data); // Removed from DOM4.
+ [RaisesException] CDATASection createCDATASection([Default=Undefined] optional DOMString data);
[RaisesException] ProcessingInstruction createProcessingInstruction([Default=Undefined] optional DOMString target,
[Default=Undefined] optional DOMString data);
- [RaisesException, MeasureAs=DocumentCreateAttribute] Attr createAttribute([Default=Undefined] optional DOMString name); // Removed from DOM4.
+ [RaisesException] Attr createAttribute([Default=Undefined] optional DOMString name);
[PerWorldBindings] NodeList getElementsByTagName([Default=Undefined] optional DOMString tagname);
// Introduced in DOM Level 2:
@@ -45,19 +45,19 @@ callback CustomElementConstructor = Element ();
optional boolean deep);
[CustomElementCallbacks=Enable, PerWorldBindings, ActivityLog=AccessForIsolatedWorlds, RaisesException] Element createElementNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
[TreatNullAs=NullString,Default=Undefined] optional DOMString qualifiedName);
- [RaisesException, MeasureAs=DocumentCreateAttributeNS] Attr createAttributeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
- [TreatNullAs=NullString,Default=Undefined] optional DOMString qualifiedName); // Removed from DOM4.
+ [RaisesException] Attr createAttributeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
+ [TreatNullAs=NullString,Default=Undefined] optional DOMString qualifiedName);
NodeList getElementsByTagNameNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
[Default=Undefined] optional DOMString localName);
[PerWorldBindings] Element getElementById([Default=Undefined] optional DOMString elementId);
// DOM Level 3 Core
- [TreatReturnedNullStringAs=Null, MeasureAs=DocumentInputEncoding] readonly attribute DOMString inputEncoding; // Removed from DOM4.
+ [TreatReturnedNullStringAs=Null] readonly attribute DOMString inputEncoding;
- [TreatReturnedNullStringAs=Null, MeasureAs=DocumentXMLEncoding] readonly attribute DOMString xmlEncoding; // Removed from DOM4.
- [TreatReturnedNullStringAs=Null, TreatNullAs=NullString, SetterRaisesException, MeasureAs=DocumentXMLVersion] attribute DOMString xmlVersion; // Removed from DOM4.
- [SetterRaisesException, MeasureAs=DocumentXMLStandalone] attribute boolean xmlStandalone; // Removed from DOM4.
+ [TreatReturnedNullStringAs=Null] readonly attribute DOMString xmlEncoding;
+ [TreatReturnedNullStringAs=Null, TreatNullAs=NullString, SetterRaisesException] attribute DOMString xmlVersion;
+ [SetterRaisesException] attribute boolean xmlStandalone;
[RaisesException, CustomElementCallbacks=Enable] Node adoptNode([Default=Undefined] optional Node source);
diff --git a/chromium/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.cpp b/chromium/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.cpp
index 5e24213368a..74ef2b1164a 100644
--- a/chromium/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.cpp
@@ -37,8 +37,6 @@
#include "core/dom/Document.h"
#include "core/dom/Element.h"
#include "core/dom/ProcessingInstruction.h"
-#include "core/dom/ShadowTreeStyleSheetCollection.h"
-#include "core/dom/shadow/ShadowRoot.h"
#include "core/html/HTMLIFrameElement.h"
#include "core/html/HTMLLinkElement.h"
#include "core/html/HTMLStyleElement.h"
@@ -65,7 +63,6 @@ DocumentStyleSheetCollection::DocumentStyleSheetCollection(Document* document)
, m_usesBeforeAfterRulesOverride(false)
, m_usesRemUnits(false)
, m_collectionForDocument(document)
- , m_needsDocumentStyleSheetsUpdate(true)
{
}
@@ -83,55 +80,6 @@ DocumentStyleSheetCollection::~DocumentStyleSheetCollection()
m_authorStyleSheets[i]->clearOwnerNode();
}
-void DocumentStyleSheetCollection::insertTreeScopeInDocumentOrder(TreeScopeSet& treeScopes, TreeScope* treeScope)
-{
- if (treeScopes.isEmpty()) {
- treeScopes.add(treeScope);
- return;
- }
- if (treeScopes.contains(treeScope))
- return;
-
- TreeScopeSet::iterator begin = treeScopes.begin();
- TreeScopeSet::iterator end = treeScopes.end();
- TreeScopeSet::iterator it = end;
- TreeScope* followingTreeScope = 0;
- do {
- --it;
- TreeScope* n = *it;
- unsigned short position = n->comparePosition(treeScope);
- if (position & Node::DOCUMENT_POSITION_FOLLOWING) {
- treeScopes.insertBefore(followingTreeScope, treeScope);
- return;
- }
- followingTreeScope = n;
- } while (it != begin);
-
- treeScopes.insertBefore(followingTreeScope, treeScope);
-}
-
-StyleSheetCollection* DocumentStyleSheetCollection::ensureStyleSheetCollectionFor(TreeScope* treeScope)
-{
- if (treeScope == m_document)
- return &m_collectionForDocument;
-
- HashMap<TreeScope*, OwnPtr<StyleSheetCollection> >::AddResult result = m_styleSheetCollectionMap.add(treeScope, nullptr);
- if (result.isNewEntry)
- result.iterator->value = adoptPtr(new ShadowTreeStyleSheetCollection(toShadowRoot(treeScope)));
- return result.iterator->value.get();
-}
-
-StyleSheetCollection* DocumentStyleSheetCollection::styleSheetCollectionFor(TreeScope* treeScope)
-{
- if (treeScope == m_document)
- return &m_collectionForDocument;
-
- HashMap<TreeScope*, OwnPtr<StyleSheetCollection> >::iterator it = m_styleSheetCollectionMap.find(treeScope);
- if (it == m_styleSheetCollectionMap.end())
- return 0;
- return it->value.get();
-}
-
const Vector<RefPtr<StyleSheet> >& DocumentStyleSheetCollection::styleSheetsForStyleSheetList()
{
return m_collectionForDocument.styleSheetsForStyleSheetList();
@@ -142,19 +90,6 @@ const Vector<RefPtr<CSSStyleSheet> >& DocumentStyleSheetCollection::activeAuthor
return m_collectionForDocument.activeAuthorStyleSheets();
}
-void DocumentStyleSheetCollection::getActiveAuthorStyleSheets(Vector<const Vector<RefPtr<CSSStyleSheet> >*>& activeAuthorStyleSheets) const
-{
- activeAuthorStyleSheets.append(&m_collectionForDocument.activeAuthorStyleSheets());
-
- HashMap<TreeScope*, OwnPtr<StyleSheetCollection> >::const_iterator::Values begin = m_styleSheetCollectionMap.values().begin();
- HashMap<TreeScope*, OwnPtr<StyleSheetCollection> >::const_iterator::Values end = m_styleSheetCollectionMap.values().end();
- HashMap<TreeScope*, OwnPtr<StyleSheetCollection> >::const_iterator::Values it = begin;
- for (; it != end; ++it) {
- const StyleSheetCollection* collection = it->get();
- activeAuthorStyleSheets.append(&collection->activeAuthorStyleSheets());
- }
-}
-
void DocumentStyleSheetCollection::combineCSSFeatureFlags(const RuleFeatureSet& features)
{
// Delay resetting the flags until after next style recalc since unapplying the style may not work without these set (this is true at least with before/after).
@@ -253,7 +188,6 @@ void DocumentStyleSheetCollection::updateInjectedStyleSheetCache() const
void DocumentStyleSheetCollection::invalidateInjectedStyleSheetCache()
{
m_injectedStyleSheetCacheValid = false;
- m_needsDocumentStyleSheetsUpdate = true;
// FIXME: updateInjectedStyleSheetCache is called inside StyleSheetCollection::updateActiveStyleSheets
// and batch updates lots of sheets so we can't call addedStyleSheet() or removedStyleSheet().
m_document->styleResolverChanged(DeferRecalcStyle);
@@ -264,7 +198,6 @@ void DocumentStyleSheetCollection::addAuthorSheet(PassRefPtr<StyleSheetContents>
ASSERT(!authorSheet->isUserStyleSheet());
m_authorStyleSheets.append(CSSStyleSheet::create(authorSheet, m_document));
m_document->addedStyleSheet(m_authorStyleSheets.last().get(), RecalcStyleImmediately);
- m_needsDocumentStyleSheetsUpdate = true;
}
void DocumentStyleSheetCollection::addUserSheet(PassRefPtr<StyleSheetContents> userSheet)
@@ -272,23 +205,16 @@ void DocumentStyleSheetCollection::addUserSheet(PassRefPtr<StyleSheetContents> u
ASSERT(userSheet->isUserStyleSheet());
m_userStyleSheets.append(CSSStyleSheet::create(userSheet, m_document));
m_document->addedStyleSheet(m_userStyleSheets.last().get(), RecalcStyleImmediately);
- m_needsDocumentStyleSheetsUpdate = true;
}
// This method is called whenever a top-level stylesheet has finished loading.
-void DocumentStyleSheetCollection::removePendingSheet(Node* styleSheetCandidateNode, RemovePendingSheetNotificationType notification)
+void DocumentStyleSheetCollection::removePendingSheet(RemovePendingSheetNotificationType notification)
{
// Make sure we knew this sheet was pending, and that our count isn't out of sync.
ASSERT(m_pendingStylesheets > 0);
m_pendingStylesheets--;
- TreeScope* treeScope = isHTMLStyleElement(styleSheetCandidateNode) ? styleSheetCandidateNode->treeScope() : m_document;
- if (treeScope == m_document)
- m_needsDocumentStyleSheetsUpdate = true;
- else
- m_dirtyTreeScopes.add(treeScope);
-
if (m_pendingStylesheets)
return;
@@ -304,59 +230,21 @@ void DocumentStyleSheetCollection::removePendingSheet(Node* styleSheetCandidateN
void DocumentStyleSheetCollection::addStyleSheetCandidateNode(Node* node, bool createdByParser)
{
- if (!node->inDocument())
- return;
-
- TreeScope* treeScope = isHTMLStyleElement(node) ? node->treeScope() : m_document;
- ASSERT(isHTMLStyleElement(node) || treeScope == m_document);
-
- StyleSheetCollection* collection = ensureStyleSheetCollectionFor(treeScope);
- ASSERT(collection);
- collection->addStyleSheetCandidateNode(node, createdByParser);
-
- if (treeScope == m_document) {
- m_needsDocumentStyleSheetsUpdate = true;
- return;
- }
-
- insertTreeScopeInDocumentOrder(m_activeTreeScopes, treeScope);
- m_dirtyTreeScopes.add(treeScope);
+ m_collectionForDocument.addStyleSheetCandidateNode(node, createdByParser);
}
void DocumentStyleSheetCollection::removeStyleSheetCandidateNode(Node* node, ContainerNode* scopingNode)
{
- TreeScope* treeScope = scopingNode ? scopingNode->treeScope() : m_document;
- ASSERT(isHTMLStyleElement(node) || treeScope == m_document);
-
- StyleSheetCollection* collection = styleSheetCollectionFor(treeScope);
- ASSERT(collection);
- collection->removeStyleSheetCandidateNode(node, scopingNode);
-
- if (treeScope == m_document) {
- m_needsDocumentStyleSheetsUpdate = true;
- return;
- }
- m_dirtyTreeScopes.add(treeScope);
- m_activeTreeScopes.remove(treeScope);
+ m_collectionForDocument.removeStyleSheetCandidateNode(node, scopingNode);
}
-void DocumentStyleSheetCollection::modifiedStyleSheetCandidateNode(Node* node)
+static bool styleSheetsUseRemUnits(const Vector<RefPtr<CSSStyleSheet> >& sheets)
{
- if (!node->inDocument())
- return;
-
- TreeScope* treeScope = isHTMLStyleElement(node) ? node->treeScope() : m_document;
- ASSERT(isHTMLStyleElement(node) || treeScope == m_document);
- if (treeScope == m_document) {
- m_needsDocumentStyleSheetsUpdate = true;
- return;
+ for (unsigned i = 0; i < sheets.size(); ++i) {
+ if (sheets[i]->contents()->usesRemUnits())
+ return true;
}
- m_dirtyTreeScopes.add(treeScope);
-}
-
-bool DocumentStyleSheetCollection::shouldUpdateShadowTreeStyleSheetCollection(StyleResolverUpdateMode updateMode)
-{
- return !m_dirtyTreeScopes.isEmpty() || updateMode == FullStyleUpdate;
+ return false;
}
bool DocumentStyleSheetCollection::updateActiveStyleSheets(StyleResolverUpdateMode updateMode)
@@ -372,91 +260,18 @@ bool DocumentStyleSheetCollection::updateActiveStyleSheets(StyleResolverUpdateMo
if (!m_document->renderer() || !m_document->attached())
return false;
- bool requiresFullStyleRecalc = false;
- if (m_needsDocumentStyleSheetsUpdate || updateMode == FullStyleUpdate)
- requiresFullStyleRecalc = m_collectionForDocument.updateActiveStyleSheets(this, updateMode);
-
- if (shouldUpdateShadowTreeStyleSheetCollection(updateMode)) {
- TreeScopeSet treeScopes = updateMode == FullStyleUpdate ? m_activeTreeScopes : m_dirtyTreeScopes;
- HashSet<TreeScope*> treeScopesRemoved;
-
- for (TreeScopeSet::iterator it = treeScopes.begin(); it != treeScopes.end(); ++it) {
- TreeScope* treeScope = *it;
- ASSERT(treeScope != m_document);
- ShadowTreeStyleSheetCollection* collection = static_cast<ShadowTreeStyleSheetCollection*>(styleSheetCollectionFor(treeScope));
- ASSERT(collection);
- collection->updateActiveStyleSheets(this, updateMode);
- if (!collection->hasStyleSheetCandidateNodes())
- treeScopesRemoved.add(treeScope);
- }
- if (!treeScopesRemoved.isEmpty())
- for (HashSet<TreeScope*>::iterator it = treeScopesRemoved.begin(); it != treeScopesRemoved.end(); ++it)
- m_activeTreeScopes.remove(*it);
- m_dirtyTreeScopes.clear();
- }
-
- if (StyleResolver* styleResolver = m_document->styleResolverIfExists()) {
- styleResolver->finishAppendAuthorStyleSheets();
- resetCSSFeatureFlags(styleResolver->ruleFeatureSet());
- }
-
+ StyleSheetCollection::StyleResolverUpdateType styleResolverUpdateType;
+ bool requiresFullStyleRecalc = m_collectionForDocument.updateActiveStyleSheets(this, updateMode, styleResolverUpdateType);
m_needsUpdateActiveStylesheetsOnStyleRecalc = false;
- activeStyleSheetsUpdatedForInspector();
- m_usesRemUnits = m_collectionForDocument.usesRemUnits();
-
- if (m_needsDocumentStyleSheetsUpdate || updateMode == FullStyleUpdate) {
- m_document->notifySeamlessChildDocumentsOfStylesheetUpdate();
- m_needsDocumentStyleSheetsUpdate = false;
- }
-
- return requiresFullStyleRecalc;
-}
-
-void DocumentStyleSheetCollection::activeStyleSheetsUpdatedForInspector()
-{
- if (m_activeTreeScopes.isEmpty()) {
- InspectorInstrumentation::activeStyleSheetsUpdated(m_document, m_collectionForDocument.styleSheetsForStyleSheetList());
- return;
- }
- Vector<RefPtr<StyleSheet> > activeStyleSheets;
- activeStyleSheets.append(m_collectionForDocument.styleSheetsForStyleSheetList());
+ if (styleResolverUpdateType != StyleSheetCollection::Reconstruct)
+ resetCSSFeatureFlags(m_document->styleResolver()->ruleFeatureSet());
- TreeScopeSet::iterator begin = m_activeTreeScopes.begin();
- TreeScopeSet::iterator end = m_activeTreeScopes.end();
- for (TreeScopeSet::iterator it = begin; it != end; ++it) {
- if (StyleSheetCollection* collection = m_styleSheetCollectionMap.get(*it))
- activeStyleSheets.append(collection->styleSheetsForStyleSheetList());
- }
+ InspectorInstrumentation::activeStyleSheetsUpdated(m_document, m_collectionForDocument.styleSheetsForStyleSheetList());
+ m_usesRemUnits = styleSheetsUseRemUnits(m_collectionForDocument.activeAuthorStyleSheets());
+ m_document->notifySeamlessChildDocumentsOfStylesheetUpdate();
- // FIXME: Inspector needs a vector which has all active stylesheets.
- // However, creating such a large vector might cause performance regression.
- // Need to implement some smarter solution.
- InspectorInstrumentation::activeStyleSheetsUpdated(m_document, activeStyleSheets);
-}
-
-void DocumentStyleSheetCollection::didRemoveShadowRoot(ShadowRoot* shadowRoot)
-{
- m_styleSheetCollectionMap.remove(shadowRoot);
-}
-
-void DocumentStyleSheetCollection::appendActiveAuthorStyleSheets(StyleResolver* styleResolver)
-{
- ASSERT(styleResolver);
-
- styleResolver->setBuildScopedStyleTreeInDocumentOrder(true);
- styleResolver->appendAuthorStyleSheets(0, m_collectionForDocument.activeAuthorStyleSheets());
-
- TreeScopeSet::iterator begin = m_activeTreeScopes.begin();
- TreeScopeSet::iterator end = m_activeTreeScopes.end();
- for (TreeScopeSet::iterator it = begin; it != end; ++it) {
- if (StyleSheetCollection* collection = m_styleSheetCollectionMap.get(*it)) {
- styleResolver->setBuildScopedStyleTreeInDocumentOrder(!collection->scopingNodesForStyleScoped());
- styleResolver->appendAuthorStyleSheets(0, collection->activeAuthorStyleSheets());
- }
- }
- styleResolver->finishAppendAuthorStyleSheets();
- styleResolver->setBuildScopedStyleTreeInDocumentOrder(false);
+ return requiresFullStyleRecalc;
}
}
diff --git a/chromium/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.h b/chromium/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.h
index 2dd47c549f7..bbafeb858e6 100644
--- a/chromium/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.h
+++ b/chromium/third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.h
@@ -64,7 +64,6 @@ public:
void addStyleSheetCandidateNode(Node*, bool createdByParser);
void removeStyleSheetCandidateNode(Node*, ContainerNode* scopingNode = 0);
- void modifiedStyleSheetCandidateNode(Node*);
void clearPageUserSheet();
void updatePageUserSheet();
@@ -88,7 +87,7 @@ public:
RemovePendingSheetNotifyImmediately,
RemovePendingSheetNotifyLater
};
- void removePendingSheet(Node* styleSheetCandidateNode, RemovePendingSheetNotificationType = RemovePendingSheetNotifyImmediately);
+ void removePendingSheet(RemovePendingSheetNotificationType = RemovePendingSheetNotifyImmediately);
bool hasPendingSheets() const { return m_pendingStylesheets > 0; }
@@ -106,22 +105,9 @@ public:
void combineCSSFeatureFlags(const RuleFeatureSet&);
void resetCSSFeatureFlags(const RuleFeatureSet&);
- void didModifySeamlessParentStyleSheet() { m_needsDocumentStyleSheetsUpdate = true; }
- void didRemoveShadowRoot(ShadowRoot*);
- void appendActiveAuthorStyleSheets(StyleResolver*);
- void getActiveAuthorStyleSheets(Vector<const Vector<RefPtr<CSSStyleSheet> >*>& activeAuthorStyleSheets) const;
-
private:
DocumentStyleSheetCollection(Document*);
- StyleSheetCollection* ensureStyleSheetCollectionFor(TreeScope*);
- StyleSheetCollection* styleSheetCollectionFor(TreeScope*);
- void activeStyleSheetsUpdatedForInspector();
- bool shouldUpdateShadowTreeStyleSheetCollection(StyleResolverUpdateMode);
-
- typedef ListHashSet<TreeScope*, 16> TreeScopeSet;
- static void insertTreeScopeInDocumentOrder(TreeScopeSet&, TreeScope*);
-
Document* m_document;
// Track the number of currently loading top-level stylesheets needed for rendering.
@@ -139,14 +125,10 @@ private:
Vector<RefPtr<CSSStyleSheet> > m_userStyleSheets;
Vector<RefPtr<CSSStyleSheet> > m_authorStyleSheets;
+ bool m_hadActiveLoadingStylesheet;
bool m_needsUpdateActiveStylesheetsOnStyleRecalc;
- StyleSheetCollectionForDocument m_collectionForDocument;
- HashMap<TreeScope*, OwnPtr<StyleSheetCollection> > m_styleSheetCollectionMap;
-
- TreeScopeSet m_dirtyTreeScopes;
- TreeScopeSet m_activeTreeScopes;
- bool m_needsDocumentStyleSheetsUpdate;
+ StyleSheetCollection m_collectionForDocument;
String m_preferredStylesheetSetName;
String m_selectedStylesheetSetName;
diff --git a/chromium/third_party/WebKit/Source/core/dom/DocumentType.idl b/chromium/third_party/WebKit/Source/core/dom/DocumentType.idl
index 510240a1362..8f192f3f562 100644
--- a/chromium/third_party/WebKit/Source/core/dom/DocumentType.idl
+++ b/chromium/third_party/WebKit/Source/core/dom/DocumentType.idl
@@ -22,14 +22,14 @@ interface DocumentType : Node {
// DOM Level 1
readonly attribute DOMString name;
- [MeasureAs=DocumentTypeEntities] readonly attribute NamedNodeMap entities; // Removed from DOM4.
- [MeasureAs=DocumentTypeNotations] readonly attribute NamedNodeMap notations; // Removed from DOM4.
+ readonly attribute NamedNodeMap entities;
+ readonly attribute NamedNodeMap notations;
// DOM Level 2
[TreatReturnedNullStringAs=Null] readonly attribute DOMString publicId;
[TreatReturnedNullStringAs=Null] readonly attribute DOMString systemId;
- [TreatReturnedNullStringAs=Null, MeasureAs=DocumentTypeInternalSubset] readonly attribute DOMString internalSubset; // Removed from DOM4.
+ [TreatReturnedNullStringAs=Null] readonly attribute DOMString internalSubset;
};
DocumentType implements ChildNode;
diff --git a/chromium/third_party/WebKit/Source/core/dom/Element.cpp b/chromium/third_party/WebKit/Source/core/dom/Element.cpp
index ade43c82f1f..b7147bcdc82 100644
--- a/chromium/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/Element.cpp
@@ -1279,7 +1279,7 @@ void Element::removedFrom(ContainerNode* insertionPoint)
setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(false);
if (document()->page())
- document()->page()->pointerLockController().elementRemoved(this);
+ document()->page()->pointerLockController()->elementRemoved(this);
setSavedLayerScrollOffset(IntSize());
@@ -1318,16 +1318,6 @@ void Element::attach(const AttachContext& context)
StyleResolverParentPusher parentPusher(this);
WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates;
- // We've already been through detach when doing a lazyAttach, but we might
- // need to clear any state that's been added since then.
- if (hasRareData() && styleChangeType() == LazyAttachStyleChange) {
- ElementRareData* data = elementRareData();
- data->clearComputedStyle();
- data->resetDynamicRestyleObservations();
- if (!context.resolvedStyle)
- data->resetStyleState();
- }
-
NodeRenderingContext(this, context.resolvedStyle).createRendererForElementIfNeeded();
createPseudoElementIfNeeded(BEFORE);
@@ -1511,9 +1501,6 @@ bool Element::recalcStyle(StyleChange change)
change = Force;
else if (change != Force)
change = localChange;
- } else {
- // We still want to seed the style sharing list when just walking the tree to maximize sharing.
- document()->styleResolver()->addToStyleSharingList(this);
}
StyleResolverParentPusher parentPusher(this);
@@ -1547,11 +1534,10 @@ bool Element::recalcStyle(StyleChange change)
} else if (child->isElementNode()) {
Element* element = toElement(child);
- bool childRulesChanged = element->needsStyleRecalc() && element->styleChangeType() >= SubtreeStyleChange;
-
if (forceCheckOfNextElementSibling || forceCheckOfAnyElementSibling)
element->setNeedsStyleRecalc();
+ bool childRulesChanged = element->needsStyleRecalc() && element->styleChangeType() >= SubtreeStyleChange;
forceCheckOfNextElementSibling = childRulesChanged && hasDirectAdjacentRules;
forceCheckOfAnyElementSibling = forceCheckOfAnyElementSibling || (childRulesChanged && hasIndirectAdjacentRules);
@@ -1642,6 +1628,12 @@ ShadowRoot* Element::ensureUserAgentShadowRoot()
return shadowRoot;
}
+Element* Element::uaShadowElementById(const AtomicString& id) const
+{
+ ShadowRoot* shadowRoot = userAgentShadowRoot();
+ return shadowRoot ? shadowRoot->getElementById(id) : 0;
+}
+
bool Element::supportsShadowElementForUserAgentShadow() const
{
return true;
@@ -2638,7 +2630,7 @@ void Element::setIsInTopLayer(bool inTopLayer)
void Element::webkitRequestPointerLock()
{
if (document()->page())
- document()->page()->pointerLockController().requestPointerLock(this);
+ document()->page()->pointerLockController()->requestPointerLock(this);
}
SpellcheckAttributeState Element::spellcheckAttributeState() const
diff --git a/chromium/third_party/WebKit/Source/core/dom/Element.h b/chromium/third_party/WebKit/Source/core/dom/Element.h
index f90ed9e58dd..7b075ce8638 100644
--- a/chromium/third_party/WebKit/Source/core/dom/Element.h
+++ b/chromium/third_party/WebKit/Source/core/dom/Element.h
@@ -446,6 +446,7 @@ public:
ShadowRoot* userAgentShadowRoot() const;
ShadowRoot* ensureUserAgentShadowRoot();
+ Element* uaShadowElementById(const AtomicString& id) const;
virtual bool supportsShadowElementForUserAgentShadow() const;
virtual const AtomicString& shadowPseudoId() const { return !part().isEmpty() ? part() : pseudo(); }
diff --git a/chromium/third_party/WebKit/Source/core/dom/Element.idl b/chromium/third_party/WebKit/Source/core/dom/Element.idl
index 72241970591..0137af97e90 100644
--- a/chromium/third_party/WebKit/Source/core/dom/Element.idl
+++ b/chromium/third_party/WebKit/Source/core/dom/Element.idl
@@ -30,9 +30,9 @@
[RaisesException, CustomElementCallbacks=Enable] void setAttribute([Default=Undefined] optional DOMString name,
[Default=Undefined] optional DOMString value);
[CustomElementCallbacks=Enable] void removeAttribute([Default=Undefined] optional DOMString name);
- [MeasureAs=ElementGetAttributeNode] Attr getAttributeNode([Default=Undefined] optional DOMString name); // Removed from DOM4.
- [RaisesException, CustomElementCallbacks=Enable, MeasureAs=ElementSetAttributeNode] Attr setAttributeNode([Default=Undefined, StrictTypeChecking] optional Attr newAttr); // Removed from DOM4.
- [RaisesException, CustomElementCallbacks=Enable, MeasureAs=ElementRemoveAttributeNode] Attr removeAttributeNode([Default=Undefined, StrictTypeChecking] optional Attr oldAttr); // Removed from DOM4.
+ Attr getAttributeNode([Default=Undefined] optional DOMString name);
+ [RaisesException, CustomElementCallbacks=Enable] Attr setAttributeNode([Default=Undefined, StrictTypeChecking] optional Attr newAttr);
+ [RaisesException, CustomElementCallbacks=Enable] Attr removeAttributeNode([Default=Undefined, StrictTypeChecking] optional Attr oldAttr);
[PerWorldBindings] NodeList getElementsByTagName([Default=Undefined] optional DOMString name);
// For ObjC this is defined on Node for legacy support.
@@ -50,8 +50,8 @@
DOMString localName);
NodeList getElementsByTagNameNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
[Default=Undefined] optional DOMString localName);
- [MeasureAs=ElementGetAttributeNodeNS] Attr getAttributeNodeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
- [Default=Undefined] optional DOMString localName); // Removed from DOM4.
+ Attr getAttributeNodeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
+ [Default=Undefined] optional DOMString localName);
[RaisesException, CustomElementCallbacks=Enable] Attr setAttributeNodeNS([Default=Undefined, StrictTypeChecking] optional Attr newAttr);
boolean hasAttribute(DOMString name);
boolean hasAttributeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
diff --git a/chromium/third_party/WebKit/Source/core/dom/Node.cpp b/chromium/third_party/WebKit/Source/core/dom/Node.cpp
index 981e4afc5c4..39360244d6c 100644
--- a/chromium/third_party/WebKit/Source/core/dom/Node.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/Node.cpp
@@ -1030,33 +1030,6 @@ bool Node::containsIncludingHostElements(const Node* node) const
return false;
}
-inline void Node::detachNode(Node* root, const AttachContext& context)
-{
- Node* node = root;
- while (node) {
- if (node->styleChangeType() == LazyAttachStyleChange) {
- // FIXME: This is needed because Node::lazyAttach marks nodes as being attached even
- // though they've never been through attach(). This allows us to avoid doing all the
- // virtual calls to detach() and other associated work.
- node->clearAttached();
- node->clearChildNeedsStyleRecalc();
-
- for (ShadowRoot* shadowRoot = node->youngestShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot())
- detachNode(shadowRoot, context);
-
- node = NodeTraversal::next(node, root);
- continue;
- }
- // Handle normal reattaches from style recalc (ex. display type changes)
- // or descendants of lazy attached nodes that got actually attached, for example,
- // by innerHTML or editing.
- // FIXME: innerHTML and editing should also lazyAttach.
- if (node->attached())
- node->detach(context);
- node = NodeTraversal::nextSkippingChildren(node, root);
- }
-}
-
void Node::reattach(const AttachContext& context)
{
// FIXME: Text::updateTextRenderer calls reattach outside a style recalc.
@@ -1064,7 +1037,8 @@ void Node::reattach(const AttachContext& context)
AttachContext reattachContext(context);
reattachContext.performingReattach = true;
- detachNode(this, reattachContext);
+ if (attached())
+ detach(reattachContext);
attach(reattachContext);
}
@@ -1136,7 +1110,7 @@ void Node::detach(const AttachContext& context)
}
}
- clearAttached();
+ clearFlag(IsAttachedFlag);
#ifndef NDEBUG
detachingNode = 0;
@@ -2490,8 +2464,9 @@ void Node::defaultEventHandler(Event* event)
if (dispatchDOMActivateEvent(detail, event))
event->setDefaultHandled();
} else if (eventType == eventNames().contextmenuEvent) {
- if (Page* page = document()->page())
- page->contextMenuController().handleContextMenuEvent(event);
+ if (Frame* frame = document()->frame())
+ if (Page* page = frame->page())
+ page->contextMenuController()->handleContextMenuEvent(event);
} else if (eventType == eventNames().textInputEvent) {
if (event->hasInterface(eventNames().interfaceForTextEvent))
if (Frame* frame = document()->frame())
@@ -2648,14 +2623,15 @@ PassRefPtr<NodeList> Node::getDestinationInsertionPoints()
document()->updateDistributionForNodeIfNeeded(this);
Vector<InsertionPoint*, 8> insertionPoints;
collectInsertionPointsWhereNodeIsDistributed(this, insertionPoints);
- Vector<RefPtr<Node> > filteredInsertionPoints;
for (size_t i = 0; i < insertionPoints.size(); ++i) {
InsertionPoint* insertionPoint = insertionPoints[i];
ASSERT(insertionPoint->containingShadowRoot());
- if (insertionPoint->containingShadowRoot()->type() != ShadowRoot::UserAgentShadowRoot)
- filteredInsertionPoints.append(insertionPoint);
+ if (insertionPoint->containingShadowRoot()->type() == ShadowRoot::UserAgentShadowRoot)
+ return StaticNodeList::createEmpty();
}
- return StaticNodeList::adopt(filteredInsertionPoints);
+ Vector<RefPtr<Node> > asNodes;
+ asNodes.appendRange(insertionPoints.begin(), insertionPoints.end());
+ return StaticNodeList::adopt(asNodes);
}
void Node::registerScopedHTMLStyleChild()
diff --git a/chromium/third_party/WebKit/Source/core/dom/Node.h b/chromium/third_party/WebKit/Source/core/dom/Node.h
index 92a02e3713a..a651d060e69 100644
--- a/chromium/third_party/WebKit/Source/core/dom/Node.h
+++ b/chromium/third_party/WebKit/Source/core/dom/Node.h
@@ -839,9 +839,6 @@ private:
void setStyleChange(StyleChangeType);
- void detachNode(Node*, const AttachContext&);
- void clearAttached() { clearFlag(IsAttachedFlag); }
-
// Used to share code between lazyAttach and setNeedsStyleRecalc.
void markAncestorsWithChildNeedsStyleRecalc();
diff --git a/chromium/third_party/WebKit/Source/core/dom/Node.idl b/chromium/third_party/WebKit/Source/core/dom/Node.idl
index 55643f02a63..0c7c5a12526 100644
--- a/chromium/third_party/WebKit/Source/core/dom/Node.idl
+++ b/chromium/third_party/WebKit/Source/core/dom/Node.idl
@@ -61,11 +61,11 @@
[CustomElementCallbacks=Enable] void normalize();
// Introduced in DOM Level 2:
- [MeasureAs=NodeIsSupported] boolean isSupported([Default=Undefined] optional DOMString feature,
- [TreatNullAs=NullString,Default=Undefined] optional DOMString version); // Removed in DOM4.
+ boolean isSupported([Default=Undefined] optional DOMString feature,
+ [TreatNullAs=NullString,Default=Undefined] optional DOMString version);
- [TreatReturnedNullStringAs=Null, PerWorldBindings, MeasureAs=NodeNamespaceURI] readonly attribute DOMString namespaceURI; // Removed from DOM4.
- [TreatReturnedNullStringAs=Null, TreatNullAs=NullString, PerWorldBindings, SetterRaisesException, MeasureAs=NodePrefix] attribute DOMString prefix; // Removed from DOM4.
+ [TreatReturnedNullStringAs=Null, PerWorldBindings] readonly attribute DOMString namespaceURI;
+ [TreatReturnedNullStringAs=Null, TreatNullAs=NullString, PerWorldBindings, SetterRaisesException] attribute DOMString prefix;
[TreatReturnedNullStringAs=Null, PerWorldBindings] readonly attribute DOMString localName;
// Introduced in DOM Level 3:
@@ -74,7 +74,7 @@
// FIXME: the spec says this can also raise on retrieval.
[TreatReturnedNullStringAs=Null, TreatNullAs=NullString, PerWorldBindings, SetterRaisesException, CustomElementCallbacks=Enable] attribute DOMString textContent;
- [MeasureAs=NodeIsSameNode] boolean isSameNode([Default=Undefined] optional Node other); // Removed in DOM4.
+ boolean isSameNode([Default=Undefined] optional Node other);
boolean isEqualNode([Default=Undefined] optional Node other);
[TreatReturnedNullStringAs=Null] DOMString lookupPrefix([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI);
boolean isDefaultNamespace([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI);
diff --git a/chromium/third_party/WebKit/Source/core/dom/PendingScript.cpp b/chromium/third_party/WebKit/Source/core/dom/PendingScript.cpp
index 6ad05cfed0e..aab3343f3fe 100644
--- a/chromium/third_party/WebKit/Source/core/dom/PendingScript.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/PendingScript.cpp
@@ -27,7 +27,7 @@
#include "core/dom/PendingScript.h"
#include "core/dom/Element.h"
-#include "core/fetch/ScriptResource.h"
+#include "core/loader/cache/ScriptResource.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/dom/PendingScript.h b/chromium/third_party/WebKit/Source/core/dom/PendingScript.h
index 0f169a9cabe..bf902b21987 100644
--- a/chromium/third_party/WebKit/Source/core/dom/PendingScript.h
+++ b/chromium/third_party/WebKit/Source/core/dom/PendingScript.h
@@ -26,8 +26,8 @@
#ifndef PendingScript_h
#define PendingScript_h
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "wtf/PassRefPtr.h"
#include "wtf/RefPtr.h"
#include "wtf/text/TextPosition.h"
diff --git a/chromium/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp b/chromium/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp
index cf915dc2dc7..def6f8efa93 100644
--- a/chromium/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp
@@ -27,10 +27,10 @@
#include "core/css/StyleSheetContents.h"
#include "core/dom/Document.h"
#include "core/dom/DocumentStyleSheetCollection.h"
-#include "core/fetch/CSSStyleSheetResource.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ResourceFetcher.h"
-#include "core/fetch/XSLStyleSheetResource.h"
+#include "core/loader/cache/CSSStyleSheetResource.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ResourceFetcher.h"
+#include "core/loader/cache/XSLStyleSheetResource.h"
#include "core/xml/XSLStyleSheet.h"
#include "core/xml/parser/XMLDocumentParser.h" // for parseAttributes()
@@ -170,7 +170,7 @@ void ProcessingInstruction::checkStyleSheet()
else {
// The request may have been denied if (for example) the stylesheet is local and the document is remote.
m_loading = false;
- document()->styleSheetCollection()->removePendingSheet(this);
+ document()->styleSheetCollection()->removePendingSheet();
}
}
}
@@ -188,7 +188,7 @@ bool ProcessingInstruction::isLoading() const
bool ProcessingInstruction::sheetLoaded()
{
if (!isLoading()) {
- document()->styleSheetCollection()->removePendingSheet(this);
+ document()->styleSheetCollection()->removePendingSheet();
return true;
}
return false;
diff --git a/chromium/third_party/WebKit/Source/core/dom/ProcessingInstruction.h b/chromium/third_party/WebKit/Source/core/dom/ProcessingInstruction.h
index d8c837bcff9..1ae797633e1 100644
--- a/chromium/third_party/WebKit/Source/core/dom/ProcessingInstruction.h
+++ b/chromium/third_party/WebKit/Source/core/dom/ProcessingInstruction.h
@@ -23,8 +23,8 @@
#define ProcessingInstruction_h
#include "core/dom/Node.h"
-#include "core/fetch/ResourcePtr.h"
-#include "core/fetch/StyleSheetResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
+#include "core/loader/cache/StyleSheetResourceClient.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/dom/ScriptLoader.cpp b/chromium/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
index 55d6844df0d..6d1c06b4b70 100644
--- a/chromium/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
@@ -35,12 +35,12 @@
#include "core/dom/ScriptRunner.h"
#include "core/dom/ScriptableDocumentParser.h"
#include "core/dom/Text.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ResourceFetcher.h"
-#include "core/fetch/ScriptResource.h"
#include "core/html/HTMLImport.h"
#include "core/html/HTMLScriptElement.h"
#include "core/html/parser/HTMLParserIdioms.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ResourceFetcher.h"
+#include "core/loader/cache/ScriptResource.h"
#include "core/page/ContentSecurityPolicy.h"
#include "core/page/Frame.h"
#include "core/platform/MIMETypeRegistry.h"
diff --git a/chromium/third_party/WebKit/Source/core/dom/ScriptLoader.h b/chromium/third_party/WebKit/Source/core/dom/ScriptLoader.h
index dfa88184585..390d83a2f89 100644
--- a/chromium/third_party/WebKit/Source/core/dom/ScriptLoader.h
+++ b/chromium/third_party/WebKit/Source/core/dom/ScriptLoader.h
@@ -21,8 +21,8 @@
#ifndef ScriptLoader_h
#define ScriptLoader_h
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "wtf/text/TextPosition.h"
#include "wtf/text/WTFString.h"
diff --git a/chromium/third_party/WebKit/Source/core/dom/ScriptRunner.cpp b/chromium/third_party/WebKit/Source/core/dom/ScriptRunner.cpp
index f63ab5056c0..d25001e0f42 100644
--- a/chromium/third_party/WebKit/Source/core/dom/ScriptRunner.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/ScriptRunner.cpp
@@ -30,7 +30,7 @@
#include "core/dom/Element.h"
#include "core/dom/PendingScript.h"
#include "core/dom/ScriptLoader.h"
-#include "core/fetch/ScriptResource.h"
+#include "core/loader/cache/ScriptResource.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/dom/ScriptRunner.h b/chromium/third_party/WebKit/Source/core/dom/ScriptRunner.h
index b793589a8e8..ef9e270b5c9 100644
--- a/chromium/third_party/WebKit/Source/core/dom/ScriptRunner.h
+++ b/chromium/third_party/WebKit/Source/core/dom/ScriptRunner.h
@@ -26,7 +26,7 @@
#ifndef ScriptRunner_h
#define ScriptRunner_h
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/Timer.h"
#include "wtf/HashMap.h"
#include "wtf/Noncopyable.h"
diff --git a/chromium/third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.cpp b/chromium/third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.cpp
deleted file mode 100644
index 2c53a058c09..00000000000
--- a/chromium/third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
- * (C) 1999 Antti Koivisto (koivisto@kde.org)
- * (C) 2001 Dirk Mueller (mueller@kde.org)
- * (C) 2006 Alexey Proskuryakov (ap@webkit.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All rights reserved.
- * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
- * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-#include "core/dom/ShadowTreeStyleSheetCollection.h"
-
-#include "HTMLNames.h"
-#include "core/css/CSSStyleSheet.h"
-#include "core/css/resolver/StyleResolver.h"
-#include "core/dom/Document.h"
-#include "core/dom/DocumentStyleSheetCollection.h"
-#include "core/dom/Element.h"
-#include "core/dom/shadow/ShadowRoot.h"
-#include "core/html/HTMLStyleElement.h"
-#include "core/page/Settings.h"
-
-namespace WebCore {
-
-using namespace HTMLNames;
-
-ShadowTreeStyleSheetCollection::ShadowTreeStyleSheetCollection(ShadowRoot* shadowRoot)
- : StyleSheetCollection(shadowRoot)
-{
-}
-
-void ShadowTreeStyleSheetCollection::collectStyleSheets(DocumentStyleSheetCollection* collections, Vector<RefPtr<StyleSheet> >& styleSheets, Vector<RefPtr<CSSStyleSheet> >& activeSheets)
-{
- if (document()->settings() && !document()->settings()->authorAndUserStylesEnabled())
- return;
-
- DocumentOrderedList::iterator begin = m_styleSheetCandidateNodes.begin();
- DocumentOrderedList::iterator end = m_styleSheetCandidateNodes.end();
- for (DocumentOrderedList::iterator it = begin; it != end; ++it) {
- Node* node = *it;
- StyleSheet* sheet = 0;
- CSSStyleSheet* activeSheet = 0;
-
- if (!node->isHTMLElement() || !node->hasTagName(styleTag))
- continue;
-
- Element* element = toElement(node);
- AtomicString title = element->getAttribute(titleAttr);
- bool enabledViaScript = false;
-
- sheet = static_cast<HTMLStyleElement*>(node)->sheet();
- if (sheet && !sheet->disabled() && sheet->isCSSStyleSheet())
- activeSheet = static_cast<CSSStyleSheet*>(sheet);
-
- // FIXME: clarify how PREFERRED or ALTERNATE works in shadow trees.
- // Should we set preferred/selected stylesheets name in shadow trees and
- // use the name in document?
- AtomicString rel = element->getAttribute(relAttr);
- if (!enabledViaScript && sheet && !title.isEmpty()) {
- if (collections->preferredStylesheetSetName().isEmpty()) {
- if (element->hasLocalName(styleTag) || !rel.contains("alternate")) {
- collections->setPreferredStylesheetSetName(title);
- collections->setSelectedStylesheetSetName(title);
- }
- }
- if (title != collections->preferredStylesheetSetName())
- activeSheet = 0;
- }
-
- if (rel.contains("alternate") && title.isEmpty())
- activeSheet = 0;
-
- if (sheet)
- styleSheets.append(sheet);
- if (activeSheet)
- activeSheets.append(activeSheet);
- }
-}
-
-bool ShadowTreeStyleSheetCollection::updateActiveStyleSheets(DocumentStyleSheetCollection* collections, StyleResolverUpdateMode updateMode)
-{
- Vector<RefPtr<StyleSheet> > styleSheets;
- Vector<RefPtr<CSSStyleSheet> > activeCSSStyleSheets;
- collectStyleSheets(collections, styleSheets, activeCSSStyleSheets);
-
- bool requiresFullStyleRecalc = true;
-
- // If we have already decided to destroy StyleResolver, we don't need to analyze. Reconstruction will take care.
- if (StyleResolver* styleResolver = document()->styleResolverIfExists()) {
- StyleResolverUpdateType styleResolverUpdateType;
-
- analyzeStyleSheetChange(updateMode, activeAuthorStyleSheets(), activeCSSStyleSheets, styleResolverUpdateType, requiresFullStyleRecalc);
-
- // FIXME: We might have already had styles in child treescope. In this case, we cannot use buildScopedStyleTreeInDocumentOrder.
- // Need to change "false" to some valid condition.
- styleResolver->setBuildScopedStyleTreeInDocumentOrder(false);
- if (styleResolverUpdateType == Reset || styleResolverUpdateType == Reconstruct) {
- // We should not destroy StyleResolver when we find any stylesheet update in a shadow tree.
- // In this case, we will reset rulesets created from style elements in the shadow tree.
- resetAllRuleSetsInTreeScope(styleResolver);
- styleResolver->appendAuthorStyleSheets(0, activeCSSStyleSheets);
- } else {
- ASSERT(styleResolverUpdateType == Additive);
- styleResolver->appendAuthorStyleSheets(m_activeAuthorStyleSheets.size(), activeCSSStyleSheets);
- }
- }
- m_scopingNodesForStyleScoped.didRemoveScopingNodes();
- m_activeAuthorStyleSheets.swap(activeCSSStyleSheets);
- m_styleSheetsForStyleSheetList.swap(styleSheets);
- updateUsesRemUnits();
-
- return requiresFullStyleRecalc;
-}
-
-}
diff --git a/chromium/third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.h b/chromium/third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.h
deleted file mode 100644
index e3984406ef3..00000000000
--- a/chromium/third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
- * (C) 1999 Antti Koivisto (koivisto@kde.org)
- * (C) 2001 Dirk Mueller (mueller@kde.org)
- * (C) 2006 Alexey Proskuryakov (ap@webkit.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All rights reserved.
- * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
- * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef ShadowTreeStyleSheetCollection_h
-#define ShadowTreeStyleSheetCollection_h
-
-#include "core/dom/StyleSheetCollection.h"
-
-namespace WebCore {
-
-class CSSStyleSheet;
-class DocumentStyleSheetCollection;
-class ShadowRoot;
-class StyleSheet;
-class StyleSheetCollection;
-
-class ShadowTreeStyleSheetCollection FINAL : public StyleSheetCollection {
- WTF_MAKE_NONCOPYABLE(ShadowTreeStyleSheetCollection); WTF_MAKE_FAST_ALLOCATED;
-public:
- explicit ShadowTreeStyleSheetCollection(ShadowRoot*);
-
- bool updateActiveStyleSheets(DocumentStyleSheetCollection*, StyleResolverUpdateMode);
-
-private:
- void collectStyleSheets(DocumentStyleSheetCollection*, Vector<RefPtr<StyleSheet> >& styleSheets, Vector<RefPtr<CSSStyleSheet> >& activeSheets);
-};
-
-}
-
-#endif
-
diff --git a/chromium/third_party/WebKit/Source/core/dom/StyleElement.cpp b/chromium/third_party/WebKit/Source/core/dom/StyleElement.cpp
index 8f31ee46d6d..0320d1670ee 100644
--- a/chromium/third_party/WebKit/Source/core/dom/StyleElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/StyleElement.cpp
@@ -127,7 +127,7 @@ void StyleElement::createSheet(Element* e, const String& text)
Document* document = e->document();
if (m_sheet) {
if (m_sheet->isLoading())
- document->styleSheetCollection()->removePendingSheet(e);
+ document->styleSheetCollection()->removePendingSheet();
clearSheet();
}
@@ -169,7 +169,7 @@ bool StyleElement::sheetLoaded(Document* document)
if (isLoading())
return false;
- document->styleSheetCollection()->removePendingSheet(m_sheet->ownerNode());
+ document->styleSheetCollection()->removePendingSheet();
return true;
}
diff --git a/chromium/third_party/WebKit/Source/core/dom/StyleSheetCollection.cpp b/chromium/third_party/WebKit/Source/core/dom/StyleSheetCollection.cpp
index a665b8074de..80ca3d2a967 100644
--- a/chromium/third_party/WebKit/Source/core/dom/StyleSheetCollection.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/StyleSheetCollection.cpp
@@ -37,11 +37,13 @@
#include "core/dom/DocumentStyleSheetCollection.h"
#include "core/dom/Element.h"
#include "core/dom/ProcessingInstruction.h"
-#include "core/dom/shadow/ShadowRoot.h"
#include "core/html/HTMLIFrameElement.h"
#include "core/html/HTMLLinkElement.h"
#include "core/html/HTMLStyleElement.h"
+#include "core/page/Page.h"
+#include "core/page/PageGroup.h"
#include "core/page/Settings.h"
+#include "core/page/UserContentURLPattern.h"
#include "core/svg/SVGStyleElement.h"
namespace WebCore {
@@ -84,115 +86,7 @@ void StyleSheetCollection::removeStyleSheetCandidateNode(Node* node, ContainerNo
m_scopingNodesForStyleScoped.remove(scopingNode);
}
-StyleSheetCollection::StyleResolverUpdateType StyleSheetCollection::compareStyleSheets(const Vector<RefPtr<CSSStyleSheet> >& oldStyleSheets, const Vector<RefPtr<CSSStyleSheet> >& newStylesheets, Vector<StyleSheetContents*>& addedSheets)
-{
- // Find out which stylesheets are new.
- unsigned newStylesheetCount = newStylesheets.size();
- unsigned oldStylesheetCount = oldStyleSheets.size();
- if (newStylesheetCount < oldStylesheetCount)
- return Reconstruct;
-
- unsigned newIndex = 0;
- for (unsigned oldIndex = 0; oldIndex < oldStylesheetCount; ++oldIndex) {
- if (newIndex >= newStylesheetCount)
- return Reconstruct;
- while (oldStyleSheets[oldIndex] != newStylesheets[newIndex]) {
- addedSheets.append(newStylesheets[newIndex]->contents());
- ++newIndex;
- if (newIndex == newStylesheetCount)
- return Reconstruct;
- }
- ++newIndex;
- }
- bool hasInsertions = !addedSheets.isEmpty();
- while (newIndex < newStylesheetCount) {
- addedSheets.append(newStylesheets[newIndex]->contents());
- ++newIndex;
- }
- // If all new sheets were added at the end of the list we can just add them to existing StyleResolver.
- // If there were insertions we need to re-add all the stylesheets so rules are ordered correctly.
- return hasInsertions ? Reset : Additive;
-}
-
-bool StyleSheetCollection::activeLoadingStyleSheetLoaded(const Vector<RefPtr<CSSStyleSheet> >& newStyleSheets)
-{
- // StyleSheets of <style> elements that @import stylesheets are active but loading. We need to trigger a full recalc when such loads are done.
- bool hasActiveLoadingStylesheet = false;
- unsigned newStylesheetCount = newStyleSheets.size();
- for (unsigned i = 0; i < newStylesheetCount; ++i) {
- if (newStyleSheets[i]->isLoading())
- hasActiveLoadingStylesheet = true;
- }
- if (m_hadActiveLoadingStylesheet && !hasActiveLoadingStylesheet) {
- m_hadActiveLoadingStylesheet = false;
- return true;
- }
- m_hadActiveLoadingStylesheet = hasActiveLoadingStylesheet;
- return false;
-}
-
-void StyleSheetCollection::analyzeStyleSheetChange(StyleResolverUpdateMode updateMode, const Vector<RefPtr<CSSStyleSheet> >& oldStyleSheets, const Vector<RefPtr<CSSStyleSheet> >& newStyleSheets, StyleResolverUpdateType& styleResolverUpdateType, bool& requiresFullStyleRecalc)
-{
- styleResolverUpdateType = Reconstruct;
- requiresFullStyleRecalc = true;
-
- if (activeLoadingStyleSheetLoaded(newStyleSheets))
- return;
-
- if (updateMode != AnalyzedStyleUpdate)
- return;
- if (!document()->styleResolverIfExists())
- return;
-
- // Find out which stylesheets are new.
- Vector<StyleSheetContents*> addedSheets;
- styleResolverUpdateType = compareStyleSheets(oldStyleSheets, newStyleSheets, addedSheets);
-
- // If we are already parsing the body and so may have significant amount of elements, put some effort into trying to avoid style recalcs.
- if (!document()->body() || document()->hasNodesWithPlaceholderStyle())
- return;
- StyleInvalidationAnalysis invalidationAnalysis(addedSheets);
- if (invalidationAnalysis.dirtiesAllStyle())
- return;
- invalidationAnalysis.invalidateStyle(document());
- requiresFullStyleRecalc = false;
-}
-
-void StyleSheetCollection::resetAllRuleSetsInTreeScope(StyleResolver* styleResolver)
-{
- // FIXME: If many web developers use style scoped, implement reset RuleSets in per-scoping node manner.
- if (DocumentOrderedList* styleScopedScopingNodes = scopingNodesForStyleScoped()) {
- for (DocumentOrderedList::iterator it = styleScopedScopingNodes->begin(); it != styleScopedScopingNodes->end(); ++it)
- styleResolver->resetAuthorStyle(toContainerNode(*it));
- }
- if (ListHashSet<Node*, 4>* removedNodes = scopingNodesRemoved()) {
- for (ListHashSet<Node*, 4>::iterator it = removedNodes->begin(); it != removedNodes->end(); ++it)
- styleResolver->resetAuthorStyle(toContainerNode(*it));
- }
- styleResolver->resetAuthorStyle(toContainerNode(m_treeScope->rootNode()));
-}
-
-static bool styleSheetsUseRemUnits(const Vector<RefPtr<CSSStyleSheet> >& sheets)
-{
- for (unsigned i = 0; i < sheets.size(); ++i) {
- if (sheets[i]->contents()->usesRemUnits())
- return true;
- }
- return false;
-}
-
-void StyleSheetCollection::updateUsesRemUnits()
-{
- m_usesRemUnits = styleSheetsUseRemUnits(m_activeAuthorStyleSheets);
-}
-
-StyleSheetCollectionForDocument::StyleSheetCollectionForDocument(TreeScope* treeScope)
- : StyleSheetCollection(treeScope)
-{
- ASSERT(treeScope->rootNode() == treeScope->rootNode()->document());
-}
-
-void StyleSheetCollectionForDocument::collectStyleSheets(DocumentStyleSheetCollection* collections, Vector<RefPtr<StyleSheet> >& styleSheets, Vector<RefPtr<CSSStyleSheet> >& activeSheets)
+void StyleSheetCollection::collectStyleSheets(DocumentStyleSheetCollection* collections, Vector<RefPtr<StyleSheet> >& styleSheets, Vector<RefPtr<CSSStyleSheet> >& activeSheets)
{
if (document()->settings() && !document()->settings()->authorAndUserStylesEnabled())
return;
@@ -279,6 +173,80 @@ void StyleSheetCollectionForDocument::collectStyleSheets(DocumentStyleSheetColle
}
}
+StyleSheetCollection::StyleResolverUpdateType StyleSheetCollection::compareStyleSheets(const Vector<RefPtr<CSSStyleSheet> >& oldStyleSheets, const Vector<RefPtr<CSSStyleSheet> >& newStylesheets, Vector<StyleSheetContents*>& addedSheets)
+{
+ // Find out which stylesheets are new.
+ unsigned newStylesheetCount = newStylesheets.size();
+ unsigned oldStylesheetCount = oldStyleSheets.size();
+ if (newStylesheetCount < oldStylesheetCount)
+ return Reconstruct;
+
+ unsigned newIndex = 0;
+ for (unsigned oldIndex = 0; oldIndex < oldStylesheetCount; ++oldIndex) {
+ if (newIndex >= newStylesheetCount)
+ return Reconstruct;
+ while (oldStyleSheets[oldIndex] != newStylesheets[newIndex]) {
+ addedSheets.append(newStylesheets[newIndex]->contents());
+ ++newIndex;
+ if (newIndex == newStylesheetCount)
+ return Reconstruct;
+ }
+ ++newIndex;
+ }
+ bool hasInsertions = !addedSheets.isEmpty();
+ while (newIndex < newStylesheetCount) {
+ addedSheets.append(newStylesheets[newIndex]->contents());
+ ++newIndex;
+ }
+ // If all new sheets were added at the end of the list we can just add them to existing StyleResolver.
+ // If there were insertions we need to re-add all the stylesheets so rules are ordered correctly.
+ return hasInsertions ? Reset : Additive;
+}
+
+bool StyleSheetCollection::activeLoadingStyleSheetLoaded(const Vector<RefPtr<CSSStyleSheet> >& newStyleSheets)
+{
+ // StyleSheets of <style> elements that @import stylesheets are active but loading. We need to trigger a full recalc when such loads are done.
+ bool hasActiveLoadingStylesheet = false;
+ unsigned newStylesheetCount = newStyleSheets.size();
+ for (unsigned i = 0; i < newStylesheetCount; ++i) {
+ if (newStyleSheets[i]->isLoading())
+ hasActiveLoadingStylesheet = true;
+ }
+ if (m_hadActiveLoadingStylesheet && !hasActiveLoadingStylesheet) {
+ m_hadActiveLoadingStylesheet = false;
+ return true;
+ }
+ m_hadActiveLoadingStylesheet = hasActiveLoadingStylesheet;
+ return false;
+}
+
+void StyleSheetCollection::analyzeStyleSheetChange(StyleResolverUpdateMode updateMode, const Vector<RefPtr<CSSStyleSheet> >& oldStyleSheets, const Vector<RefPtr<CSSStyleSheet> >& newStyleSheets, StyleResolverUpdateType& styleResolverUpdateType, bool& requiresFullStyleRecalc)
+{
+ styleResolverUpdateType = Reconstruct;
+ requiresFullStyleRecalc = true;
+
+ if (activeLoadingStyleSheetLoaded(newStyleSheets))
+ return;
+
+ if (updateMode != AnalyzedStyleUpdate)
+ return;
+ if (!document()->styleResolverIfExists())
+ return;
+
+ // Find out which stylesheets are new.
+ Vector<StyleSheetContents*> addedSheets;
+ styleResolverUpdateType = compareStyleSheets(oldStyleSheets, newStyleSheets, addedSheets);
+
+ // If we are already parsing the body and so may have significant amount of elements, put some effort into trying to avoid style recalcs.
+ if (!document()->body() || document()->hasNodesWithPlaceholderStyle())
+ return;
+ StyleInvalidationAnalysis invalidationAnalysis(addedSheets);
+ if (invalidationAnalysis.dirtiesAllStyle())
+ return;
+ invalidationAnalysis.invalidateStyle(document());
+ requiresFullStyleRecalc = false;
+}
+
static void collectActiveCSSStyleSheetsFromSeamlessParents(Vector<RefPtr<CSSStyleSheet> >& sheets, Document* document)
{
HTMLIFrameElement* seamlessParentIFrame = document->seamlessParentIFrame();
@@ -287,7 +255,7 @@ static void collectActiveCSSStyleSheetsFromSeamlessParents(Vector<RefPtr<CSSStyl
sheets.append(seamlessParentIFrame->document()->styleSheetCollection()->activeAuthorStyleSheets());
}
-bool StyleSheetCollectionForDocument::updateActiveStyleSheets(DocumentStyleSheetCollection* collections, StyleResolverUpdateMode updateMode)
+bool StyleSheetCollection::updateActiveStyleSheets(DocumentStyleSheetCollection* collections, StyleResolverUpdateMode updateMode, StyleResolverUpdateType& styleResolverUpdateType)
{
Vector<RefPtr<StyleSheet> > styleSheets;
Vector<RefPtr<CSSStyleSheet> > activeCSSStyleSheets;
@@ -296,20 +264,25 @@ bool StyleSheetCollectionForDocument::updateActiveStyleSheets(DocumentStyleSheet
collectActiveCSSStyleSheetsFromSeamlessParents(activeCSSStyleSheets, document());
collectStyleSheets(collections, styleSheets, activeCSSStyleSheets);
- StyleResolverUpdateType styleResolverUpdateType;
bool requiresFullStyleRecalc;
analyzeStyleSheetChange(updateMode, activeAuthorStyleSheets(), activeCSSStyleSheets, styleResolverUpdateType, requiresFullStyleRecalc);
if (styleResolverUpdateType == Reconstruct) {
document()->clearStyleResolver();
} else {
- StyleResolver* styleResolver = document()->styleResolverIfExists();
- ASSERT(styleResolver);
- // FIXME: We might have already had styles in child treescope. In this case, we cannot use buildScopedStyleTreeInDocumentOrder.
- // Need to change "false" to some valid condition.
- styleResolver->setBuildScopedStyleTreeInDocumentOrder(false);
+ StyleResolver* styleResolver = document()->styleResolver();
+ styleResolver->setBuildScopedStyleTreeInDocumentOrder(!scopingNodesForStyleScoped());
if (styleResolverUpdateType == Reset) {
- resetAllRuleSetsInTreeScope(styleResolver);
+ if (DocumentOrderedList* styleScopedScopingNodes = scopingNodesForStyleScoped()) {
+ for (DocumentOrderedList::iterator it = styleScopedScopingNodes->begin(); it != styleScopedScopingNodes->end(); ++it)
+ styleResolver->resetAuthorStyle(toContainerNode(*it));
+ }
+ if (ListHashSet<Node*, 4>* removedNodes = scopingNodesRemoved()) {
+ for (ListHashSet<Node*, 4>::iterator it = removedNodes->begin(); it != removedNodes->end(); ++it)
+ styleResolver->resetAuthorStyle(toContainerNode(*it));
+ }
+ ASSERT(m_treeScope->rootNode() == document());
+ styleResolver->resetAuthorStyle(toContainerNode(m_treeScope->rootNode()));
styleResolver->appendAuthorStyleSheets(0, activeCSSStyleSheets);
} else {
ASSERT(styleResolverUpdateType == Additive);
@@ -319,7 +292,6 @@ bool StyleSheetCollectionForDocument::updateActiveStyleSheets(DocumentStyleSheet
m_scopingNodesForStyleScoped.didRemoveScopingNodes();
m_activeAuthorStyleSheets.swap(activeCSSStyleSheets);
m_styleSheetsForStyleSheetList.swap(styleSheets);
- updateUsesRemUnits();
return requiresFullStyleRecalc;
}
diff --git a/chromium/third_party/WebKit/Source/core/dom/StyleSheetCollection.h b/chromium/third_party/WebKit/Source/core/dom/StyleSheetCollection.h
index ce410343379..91da7850001 100644
--- a/chromium/third_party/WebKit/Source/core/dom/StyleSheetCollection.h
+++ b/chromium/third_party/WebKit/Source/core/dom/StyleSheetCollection.h
@@ -52,63 +52,47 @@ class StyleSheetList;
class StyleSheetCollection {
WTF_MAKE_NONCOPYABLE(StyleSheetCollection); WTF_MAKE_FAST_ALLOCATED;
public:
+ explicit StyleSheetCollection(TreeScope*);
+
void addStyleSheetCandidateNode(Node*, bool createdByParser);
void removeStyleSheetCandidateNode(Node*, ContainerNode* scopingNode);
- bool hasStyleSheetCandidateNodes() const { return !m_styleSheetCandidateNodes.isEmpty(); }
Vector<RefPtr<CSSStyleSheet> >& activeAuthorStyleSheets() { return m_activeAuthorStyleSheets; }
Vector<RefPtr<StyleSheet> >& styleSheetsForStyleSheetList() { return m_styleSheetsForStyleSheetList; }
const Vector<RefPtr<CSSStyleSheet> >& activeAuthorStyleSheets() const { return m_activeAuthorStyleSheets; }
const Vector<RefPtr<StyleSheet> >& styleSheetsForStyleSheetList() const { return m_styleSheetsForStyleSheetList; }
- bool usesRemUnits() const { return m_usesRemUnits; }
-
DocumentOrderedList& styleSheetCandidateNodes() { return m_styleSheetCandidateNodes; }
DocumentOrderedList* scopingNodesForStyleScoped() { return m_scopingNodesForStyleScoped.scopingNodes(); }
ListHashSet<Node*, 4>* scopingNodesRemoved() { return m_scopingNodesForStyleScoped.scopingNodesRemoved(); }
-protected:
- explicit StyleSheetCollection(TreeScope*);
-
- Document* document() { return m_treeScope->documentScope(); }
-
enum StyleResolverUpdateType {
Reconstruct,
Reset,
Additive
};
- void analyzeStyleSheetChange(StyleResolverUpdateMode, const Vector<RefPtr<CSSStyleSheet> >& oldStyleSheets, const Vector<RefPtr<CSSStyleSheet> >& newStylesheets, StyleResolverUpdateType&, bool& requiresFullStyleRecalc);
- void resetAllRuleSetsInTreeScope(StyleResolver*);
- void updateUsesRemUnits();
+ bool updateActiveStyleSheets(DocumentStyleSheetCollection*, StyleResolverUpdateMode, StyleResolverUpdateType&);
private:
+ Document* document() { return m_treeScope->documentScope(); }
+
+ void collectStyleSheets(DocumentStyleSheetCollection* collections, Vector<RefPtr<StyleSheet> >& styleSheets, Vector<RefPtr<CSSStyleSheet> >& activeSheets);
+
StyleResolverUpdateType compareStyleSheets(const Vector<RefPtr<CSSStyleSheet> >& oldStyleSheets, const Vector<RefPtr<CSSStyleSheet> >& newStylesheets, Vector<StyleSheetContents*>& addedSheets);
bool activeLoadingStyleSheetLoaded(const Vector<RefPtr<CSSStyleSheet> >& newStyleSheets);
-protected:
+ void analyzeStyleSheetChange(StyleResolverUpdateMode, const Vector<RefPtr<CSSStyleSheet> >& oldStyleSheets, const Vector<RefPtr<CSSStyleSheet> >& newStylesheets, StyleResolverUpdateType&, bool& requiresFullStyleRecalc);
+
Vector<RefPtr<StyleSheet> > m_styleSheetsForStyleSheetList;
Vector<RefPtr<CSSStyleSheet> > m_activeAuthorStyleSheets;
TreeScope* m_treeScope;
bool m_hadActiveLoadingStylesheet;
- bool m_usesRemUnits;
DocumentOrderedList m_styleSheetCandidateNodes;
StyleSheetScopingNodeList m_scopingNodesForStyleScoped;
};
-// FIXME: rename this class to DocumentStyleSheetCollection.
-class StyleSheetCollectionForDocument FINAL : public StyleSheetCollection {
- WTF_MAKE_NONCOPYABLE(StyleSheetCollectionForDocument); WTF_MAKE_FAST_ALLOCATED;
-public:
- explicit StyleSheetCollectionForDocument(TreeScope*);
-
- bool updateActiveStyleSheets(DocumentStyleSheetCollection*, StyleResolverUpdateMode);
-
-private:
- void collectStyleSheets(DocumentStyleSheetCollection*, Vector<RefPtr<StyleSheet> >& styleSheets, Vector<RefPtr<CSSStyleSheet> >& activeSheets);
-};
-
}
#endif
diff --git a/chromium/third_party/WebKit/Source/core/dom/shadow/ContentDistributor.cpp b/chromium/third_party/WebKit/Source/core/dom/shadow/ContentDistributor.cpp
index de321d98914..9bbccdc5711 100644
--- a/chromium/third_party/WebKit/Source/core/dom/shadow/ContentDistributor.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/shadow/ContentDistributor.cpp
@@ -33,6 +33,7 @@
#include "core/html/shadow/HTMLContentElement.h"
#include "core/html/shadow/HTMLShadowElement.h"
+
namespace WebCore {
void ContentDistribution::swap(ContentDistribution& other)
@@ -156,6 +157,8 @@ InsertionPoint* ContentDistributor::findInsertionPointFor(const Node* key) const
void ContentDistributor::populate(Node* node, Vector<Node*>& pool)
{
+ node->lazyReattachIfAttached();
+
if (!isActiveInsertionPoint(node)) {
pool.append(node);
return;
@@ -224,14 +227,6 @@ void ContentDistributor::distribute(Element* host)
if (ElementShadow* shadow = shadowOfParentForDistribution(shadowElement))
shadow->setNeedsDistributionRecalc();
}
-
- // Detach all nodes that were not distributed and have a renderer.
- for (size_t i = 0; i < pool.size(); ++i) {
- if (distributed[i])
- continue;
- if (pool[i]->renderer())
- pool[i]->lazyReattachIfAttached();
- }
}
void ContentDistributor::distributeSelectionsTo(InsertionPoint* insertionPoint, const Vector<Node*>& pool, Vector<bool>& distributed)
@@ -251,6 +246,7 @@ void ContentDistributor::distributeSelectionsTo(InsertionPoint* insertionPoint,
distributed[i] = true;
}
+ insertionPoint->lazyReattachIfAttached();
insertionPoint->setDistribution(distribution);
}
@@ -258,6 +254,7 @@ void ContentDistributor::distributeNodeChildrenTo(InsertionPoint* insertionPoint
{
ContentDistribution distribution;
for (Node* node = containerNode->firstChild(); node; node = node->nextSibling()) {
+ node->lazyReattachIfAttached();
if (isActiveInsertionPoint(node)) {
InsertionPoint* innerInsertionPoint = toInsertionPoint(node);
if (innerInsertionPoint->hasDistribution()) {
@@ -277,6 +274,7 @@ void ContentDistributor::distributeNodeChildrenTo(InsertionPoint* insertionPoint
}
}
+ insertionPoint->lazyReattachIfAttached();
insertionPoint->setDistribution(distribution);
}
diff --git a/chromium/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.cpp b/chromium/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.cpp
index c00c3c90c01..b4626d77409 100644
--- a/chromium/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.cpp
@@ -52,48 +52,6 @@ InsertionPoint::~InsertionPoint()
{
}
-void InsertionPoint::setDistribution(ContentDistribution& distribution)
-{
- if (shouldUseFallbackElements()) {
- for (Node* child = firstChild(); child; child = child->nextSibling())
- child->lazyReattachIfAttached();
- }
-
- // Attempt not to reattach nodes that would be distributed to the exact same
- // location by comparing the old and new distributions.
-
- size_t i = 0;
- size_t j = 0;
-
- for ( ; i < m_distribution.size() && j < distribution.size(); ++i, ++j) {
- if (m_distribution.size() < distribution.size()) {
- // If the new distribution is larger than the old one, reattach all nodes in
- // the new distribution that were inserted.
- for ( ; j < distribution.size() && m_distribution.at(i) != distribution.at(j); ++j)
- distribution.at(j)->lazyReattachIfAttached();
- } else if (m_distribution.size() > distribution.size()) {
- // If the old distribution is larger than the new one, reattach all nodes in
- // the old distribution that were removed.
- for ( ; i < m_distribution.size() && m_distribution.at(i) != distribution.at(j); ++i)
- m_distribution.at(i)->lazyReattachIfAttached();
- } else if (m_distribution.at(i) != distribution.at(j)) {
- // If both distributions are the same length reattach both old and new.
- m_distribution.at(i)->lazyReattachIfAttached();
- distribution.at(j)->lazyReattachIfAttached();
- }
- }
-
- // If we hit the end of either list above we need to reattach all remaining nodes.
-
- for ( ; i < m_distribution.size(); ++i)
- m_distribution.at(i)->lazyReattachIfAttached();
-
- for ( ; j < distribution.size(); ++j)
- distribution.at(j)->lazyReattachIfAttached();
-
- m_distribution.swap(distribution);
-}
-
void InsertionPoint::attach(const AttachContext& context)
{
for (size_t i = 0; i < m_distribution.size(); ++i) {
diff --git a/chromium/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.h b/chromium/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.h
index b7031292e6f..993ea347969 100644
--- a/chromium/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.h
+++ b/chromium/third_party/WebKit/Source/core/dom/shadow/InsertionPoint.h
@@ -44,7 +44,7 @@ public:
virtual ~InsertionPoint();
bool hasDistribution() const { return !m_distribution.isEmpty(); }
- void setDistribution(ContentDistribution&);
+ void setDistribution(ContentDistribution& distribution) { m_distribution.swap(distribution); }
void clearDistribution() { m_distribution.clear(); }
bool isActive() const;
diff --git a/chromium/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.cpp b/chromium/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.cpp
index 1385db124da..a218b17f3a8 100644
--- a/chromium/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.cpp
+++ b/chromium/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.cpp
@@ -29,7 +29,6 @@
#include "bindings/v8/ExceptionState.h"
#include "core/css/resolver/StyleResolver.h"
-#include "core/dom/DocumentStyleSheetCollection.h"
#include "core/dom/Text.h"
#include "core/dom/shadow/ContentDistributor.h"
#include "core/dom/shadow/ElementShadow.h"
@@ -77,8 +76,6 @@ ShadowRoot::~ShadowRoot()
ASSERT(!m_prev);
ASSERT(!m_next);
- documentInternal()->styleSheetCollection()->didRemoveShadowRoot(this);
-
// We cannot let ContainerNode destructor call willBeDeletedFrom()
// for this ShadowRoot instance because TreeScope destructor
// clears Node::m_treeScope thus ContainerNode is no longer able
diff --git a/chromium/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.h b/chromium/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.h
index 993fdb2efd2..3bfcc3dd49f 100644
--- a/chromium/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.h
+++ b/chromium/third_party/WebKit/Source/core/dom/shadow/ShadowRoot.h
@@ -149,17 +149,6 @@ inline ShadowRoot* toShadowRoot(Node* node)
return const_cast<ShadowRoot*>(toShadowRoot(static_cast<const Node*>(node)));
}
-inline const ShadowRoot* toShadowRoot(const TreeScope* treeScope)
-{
- ASSERT_WITH_SECURITY_IMPLICATION(!treeScope || (treeScope->rootNode() && treeScope->rootNode()->isShadowRoot()));
- return static_cast<const ShadowRoot*>(treeScope);
-}
-
-inline ShadowRoot* toShadowRoot(TreeScope* treeScope)
-{
- return const_cast<ShadowRoot*>(toShadowRoot(static_cast<const TreeScope*>(treeScope)));
-}
-
} // namespace
#endif
diff --git a/chromium/third_party/WebKit/Source/core/editing/Editor.cpp b/chromium/third_party/WebKit/Source/core/editing/Editor.cpp
index 340f11ad0c7..5931025ea9a 100644
--- a/chromium/third_party/WebKit/Source/core/editing/Editor.cpp
+++ b/chromium/third_party/WebKit/Source/core/editing/Editor.cpp
@@ -60,10 +60,10 @@
#include "core/editing/VisibleUnits.h"
#include "core/editing/htmlediting.h"
#include "core/editing/markup.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/html/HTMLImageElement.h"
#include "core/html/HTMLInputElement.h"
#include "core/html/HTMLTextAreaElement.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/EditorClient.h"
#include "core/page/EventHandler.h"
#include "core/page/FocusController.h"
diff --git a/chromium/third_party/WebKit/Source/core/features.gypi b/chromium/third_party/WebKit/Source/core/features.gypi
index 40a89de7eb2..3ed82e7f0ef 100644
--- a/chromium/third_party/WebKit/Source/core/features.gypi
+++ b/chromium/third_party/WebKit/Source/core/features.gypi
@@ -63,6 +63,7 @@
'ENABLE_MEDIA_CAPTURE=1',
'ENABLE_NOTIFICATIONS=0',
'ENABLE_ORIENTATION_EVENTS=1',
+ 'ENABLE_PRINTING=0',
'ENABLE_NAVIGATOR_CONTENT_UTILS=0',
'WTF_USE_NATIVE_FULLSCREEN_VIDEO=1',
],
@@ -77,6 +78,7 @@
'ENABLE_NAVIGATOR_CONTENT_UTILS=1',
'ENABLE_NOTIFICATIONS=1',
'ENABLE_ORIENTATION_EVENTS=0',
+ 'ENABLE_PRINTING=1',
'ENABLE_WEB_AUDIO=1',
],
}],
diff --git a/chromium/third_party/WebKit/Source/core/history/BackForwardClient.h b/chromium/third_party/WebKit/Source/core/history/BackForwardClient.h
index 0a3cf738f91..3bbc8bc4032 100644
--- a/chromium/third_party/WebKit/Source/core/history/BackForwardClient.h
+++ b/chromium/third_party/WebKit/Source/core/history/BackForwardClient.h
@@ -38,9 +38,17 @@ class BackForwardClient {
public:
virtual ~BackForwardClient() { }
- virtual void didAddItem() = 0;
+ virtual void addItem(PassRefPtr<HistoryItem>) = 0;
+
+ virtual void goToItem(HistoryItem*) = 0;
+
+ virtual HistoryItem* itemAtIndex(int) = 0;
virtual int backListCount() = 0;
virtual int forwardListCount() = 0;
+
+ virtual bool isActive() = 0;
+
+ virtual void close() = 0;
};
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/history/BackForwardController.cpp b/chromium/third_party/WebKit/Source/core/history/BackForwardController.cpp
index 45fde048b80..5e59897c5bd 100644
--- a/chromium/third_party/WebKit/Source/core/history/BackForwardController.cpp
+++ b/chromium/third_party/WebKit/Source/core/history/BackForwardController.cpp
@@ -28,9 +28,6 @@
#include "core/history/BackForwardClient.h"
#include "core/history/HistoryItem.h"
-#include "core/loader/FrameLoader.h"
-#include "core/loader/FrameLoaderClient.h"
-#include "core/page/Frame.h"
#include "core/page/Page.h"
namespace WebCore {
@@ -51,29 +48,58 @@ PassOwnPtr<BackForwardController> BackForwardController::create(Page* page, Back
return adoptPtr(new BackForwardController(page, client));
}
-bool BackForwardController::goBackOrForward(int distance)
+void BackForwardController::goBackOrForward(int distance)
{
- ASSERT(distance);
- if (distance > forwardCount())
- distance = forwardCount();
- else if (distance < -backCount())
- distance = backCount();
-
- if (!distance)
- return false;
- m_page->mainFrame()->loader()->client()->navigateBackForward(distance);
- return true;
+ if (distance == 0)
+ return;
+
+ HistoryItem* item = itemAtIndex(distance);
+ if (!item) {
+ if (distance > 0) {
+ if (forwardCount())
+ item = itemAtIndex(forwardCount());
+ } else {
+ if (backCount())
+ item = itemAtIndex(-backCount());
+ }
+ }
+
+ if (!item)
+ return;
+
+ m_page->goToItem(item);
+}
+
+bool BackForwardController::goBack()
+{
+ HistoryItem* item = backItem();
+
+ if (item) {
+ m_page->goToItem(item);
+ return true;
+ }
+ return false;
+}
+
+bool BackForwardController::goForward()
+{
+ HistoryItem* item = forwardItem();
+
+ if (item) {
+ m_page->goToItem(item);
+ return true;
+ }
+ return false;
}
void BackForwardController::addItem(PassRefPtr<HistoryItem> item)
{
- m_currentItem = item;
- m_client->didAddItem();
+ m_client->addItem(item);
}
void BackForwardController::setCurrentItem(HistoryItem* item)
{
- m_currentItem = item;
+ m_client->goToItem(item);
}
int BackForwardController::count() const
@@ -91,4 +117,19 @@ int BackForwardController::forwardCount() const
return m_client->forwardListCount();
}
+HistoryItem* BackForwardController::itemAtIndex(int i)
+{
+ return m_client->itemAtIndex(i);
+}
+
+bool BackForwardController::isActive()
+{
+ return m_client->isActive();
+}
+
+void BackForwardController::close()
+{
+ m_client->close();
+}
+
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/history/BackForwardController.h b/chromium/third_party/WebKit/Source/core/history/BackForwardController.h
index 79c48a02a5a..d315fd6dfaa 100644
--- a/chromium/third_party/WebKit/Source/core/history/BackForwardController.h
+++ b/chromium/third_party/WebKit/Source/core/history/BackForwardController.h
@@ -46,26 +46,33 @@ public:
BackForwardClient* client() const { return m_client; }
- bool goBackOrForward(int distance);
- bool goBack() { return goBackOrForward(-1); }
- bool goForward() { return goBackOrForward(1); }
+ void goBackOrForward(int distance);
+
+ bool goBack();
+ bool goForward();
void addItem(PassRefPtr<HistoryItem>);
void setCurrentItem(HistoryItem*);
- HistoryItem* currentItem() { return m_currentItem.get(); }
int count() const;
int backCount() const;
int forwardCount() const;
+ HistoryItem* itemAtIndex(int);
+
+ bool isActive();
+
+ void close();
+
+ HistoryItem* backItem() { return itemAtIndex(-1); }
+ HistoryItem* currentItem() { return itemAtIndex(0); }
+ HistoryItem* forwardItem() { return itemAtIndex(1); }
+
private:
BackForwardController(Page*, BackForwardClient*);
Page* m_page;
BackForwardClient* m_client;
-
- // FIXME: Ideally, we could derive this from HistoryController, but the rules for setting it are non-obvious.
- RefPtr<HistoryItem> m_currentItem;
};
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/history/HistoryItem.cpp b/chromium/third_party/WebKit/Source/core/history/HistoryItem.cpp
index 4db012dd42e..1a2c317a1d5 100644
--- a/chromium/third_party/WebKit/Source/core/history/HistoryItem.cpp
+++ b/chromium/third_party/WebKit/Source/core/history/HistoryItem.cpp
@@ -53,6 +53,18 @@ HistoryItem::HistoryItem()
{
}
+HistoryItem::HistoryItem(const String& urlString)
+ : m_urlString(urlString)
+ , m_originalURLString(urlString)
+ , m_lastVisitedTime(0)
+ , m_pageScaleFactor(0)
+ , m_isTargetItem(false)
+ , m_visitCount(0)
+ , m_itemSequenceNumber(generateSequenceNumber())
+ , m_documentSequenceNumber(generateSequenceNumber())
+{
+}
+
HistoryItem::~HistoryItem()
{
}
diff --git a/chromium/third_party/WebKit/Source/core/history/HistoryItem.h b/chromium/third_party/WebKit/Source/core/history/HistoryItem.h
index 8ac78ab71be..5b7119c6c7a 100644
--- a/chromium/third_party/WebKit/Source/core/history/HistoryItem.h
+++ b/chromium/third_party/WebKit/Source/core/history/HistoryItem.h
@@ -46,6 +46,10 @@ typedef Vector<RefPtr<HistoryItem> > HistoryItemVector;
class HistoryItem : public RefCounted<HistoryItem> {
public:
static PassRefPtr<HistoryItem> create() { return adoptRef(new HistoryItem); }
+ static PassRefPtr<HistoryItem> create(const String& urlString)
+ {
+ return adoptRef(new HistoryItem(urlString));
+ }
~HistoryItem();
@@ -132,6 +136,8 @@ public:
private:
HistoryItem();
+ explicit HistoryItem(const String& urlString);
+
explicit HistoryItem(const HistoryItem&);
void recordVisitAtTime(double);
diff --git a/chromium/third_party/WebKit/Source/core/html/BaseMultipleFieldsDateAndTimeInputType.cpp b/chromium/third_party/WebKit/Source/core/html/BaseMultipleFieldsDateAndTimeInputType.cpp
index 1c3a2a0ac8c..8ea2d94ce4e 100644
--- a/chromium/third_party/WebKit/Source/core/html/BaseMultipleFieldsDateAndTimeInputType.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/BaseMultipleFieldsDateAndTimeInputType.cpp
@@ -130,22 +130,22 @@ bool DateTimeFormatValidator::validateFormat(const String& format, const BaseMul
DateTimeEditElement* BaseMultipleFieldsDateAndTimeInputType::dateTimeEditElement() const
{
- return toDateTimeEditElement(element()->userAgentShadowRoot()->getElementById(ShadowElementNames::dateTimeEdit()));
+ return toDateTimeEditElement(element()->uaShadowElementById(ShadowElementNames::dateTimeEdit()));
}
SpinButtonElement* BaseMultipleFieldsDateAndTimeInputType::spinButtonElement() const
{
- return toSpinButtonElement(element()->userAgentShadowRoot()->getElementById(ShadowElementNames::spinButton()));
+ return toSpinButtonElement(element()->uaShadowElementById(ShadowElementNames::spinButton()));
}
ClearButtonElement* BaseMultipleFieldsDateAndTimeInputType::clearButtonElement() const
{
- return toClearButtonElement(element()->userAgentShadowRoot()->getElementById(ShadowElementNames::clearButton()));
+ return toClearButtonElement(element()->uaShadowElementById(ShadowElementNames::clearButton()));
}
PickerIndicatorElement* BaseMultipleFieldsDateAndTimeInputType::pickerIndicatorElement() const
{
- return toPickerIndicatorElement(element()->userAgentShadowRoot()->getElementById(ShadowElementNames::pickerIndicator()));
+ return toPickerIndicatorElement(element()->uaShadowElementById(ShadowElementNames::pickerIndicator()));
}
inline bool BaseMultipleFieldsDateAndTimeInputType::containsFocusedShadowElement() const
diff --git a/chromium/third_party/WebKit/Source/core/html/DOMURL.cpp b/chromium/third_party/WebKit/Source/core/html/DOMURL.cpp
index a7b7f7175cb..360cc2ff526 100644
--- a/chromium/third_party/WebKit/Source/core/html/DOMURL.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/DOMURL.cpp
@@ -29,10 +29,10 @@
#include "core/html/DOMURL.h"
#include "core/dom/ScriptExecutionContext.h"
-#include "core/fetch/MemoryCache.h"
#include "core/fileapi/Blob.h"
#include "core/fileapi/BlobURL.h"
#include "core/html/PublicURLManager.h"
+#include "core/loader/cache/MemoryCache.h"
#include "weborigin/KURL.h"
#include "wtf/MainThread.h"
diff --git a/chromium/third_party/WebKit/Source/core/html/FormAssociatedElement.cpp b/chromium/third_party/WebKit/Source/core/html/FormAssociatedElement.cpp
index 58f6654ae4c..a31e058e88b 100644
--- a/chromium/third_party/WebKit/Source/core/html/FormAssociatedElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/FormAssociatedElement.cpp
@@ -75,9 +75,6 @@ void FormAssociatedElement::didMoveToNewDocument(Document* oldDocument)
void FormAssociatedElement::insertedInto(ContainerNode* insertionPoint)
{
- if (m_form && insertionPoint->highestAncestor() != m_form->highestAncestor())
- setForm(0);
-
resetFormOwner();
if (!insertionPoint->inDocument())
return;
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLCollection.cpp b/chromium/third_party/WebKit/Source/core/html/HTMLCollection.cpp
index f4d175a0bde..613c57a069b 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLCollection.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLCollection.cpp
@@ -211,7 +211,7 @@ template <> inline bool isMatchingElement(const HTMLCollection* htmlCollection,
case MapAreas:
return element->hasLocalName(areaTag);
case DocApplets:
- return element->hasLocalName(appletTag) || (element->hasLocalName(objectTag) && toHTMLObjectElement(element)->containsJavaApplet());
+ return element->hasLocalName(appletTag) || (element->hasLocalName(objectTag) && static_cast<HTMLObjectElement*>(element)->containsJavaApplet());
case DocEmbeds:
return element->hasLocalName(embedTag);
case DocLinks:
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLDocument.h b/chromium/third_party/WebKit/Source/core/html/HTMLDocument.h
index 927fdca66d8..993fbc0cb36 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLDocument.h
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLDocument.h
@@ -24,7 +24,7 @@
#define HTMLDocument_h
#include "core/dom/Document.h"
-#include "core/fetch/ResourceClient.h"
+#include "core/loader/cache/ResourceClient.h"
#include "wtf/HashCountedSet.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLElement.cpp b/chromium/third_party/WebKit/Source/core/html/HTMLElement.cpp
index 4e19dd02b72..6692228f53d 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLElement.cpp
@@ -1080,11 +1080,6 @@ void HTMLElement::handleKeypressEvent(KeyboardEvent* event)
{
if (!document()->settings() || !document()->settings()->spatialNavigationEnabled() || !supportsFocus())
return;
- // if the element is a text form control (like <input type=text> or <textarea>)
- // or has contentEditable attribute on, we should enter a space or newline
- // even in spatial navigation mode instead of handling it as a "click" action.
- if (isTextFormControl() || isContentEditable())
- return;
int charCode = event->charCode();
if (charCode == '\r' || charCode == ' ') {
dispatchSimulatedClick(event);
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLEmbedElement.cpp b/chromium/third_party/WebKit/Source/core/html/HTMLEmbedElement.cpp
index a04335ce91b..e0c1e7e4a39 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLEmbedElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLEmbedElement.cpp
@@ -183,7 +183,7 @@ bool HTMLEmbedElement::rendererIsNeeded(const NodeRenderingContext& context)
ContainerNode* p = parentNode();
if (p && p->hasTagName(objectTag)) {
ASSERT(p->renderer());
- if (!toHTMLObjectElement(p)->useFallbackContent()) {
+ if (!static_cast<HTMLObjectElement*>(p)->useFallbackContent()) {
ASSERT(!p->renderer()->isEmbeddedObject());
return false;
}
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLFieldSetElement.cpp b/chromium/third_party/WebKit/Source/core/html/HTMLFieldSetElement.cpp
index d9ceedd819f..b3f3e9c8fc6 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLFieldSetElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLFieldSetElement.cpp
@@ -116,7 +116,7 @@ void HTMLFieldSetElement::refreshElementsIfNeeded() const
for (Element* element = ElementTraversal::firstWithin(this); element; element = ElementTraversal::next(element, this)) {
if (element->hasTagName(objectTag)) {
- m_associatedElements.append(toHTMLObjectElement(element));
+ m_associatedElements.append(static_cast<HTMLObjectElement*>(element));
continue;
}
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLImageElement.cpp b/chromium/third_party/WebKit/Source/core/html/HTMLImageElement.cpp
index 2f54b1083fc..571462bafbd 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLImageElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLImageElement.cpp
@@ -28,9 +28,9 @@
#include "bindings/v8/ScriptEventListener.h"
#include "core/dom/Attribute.h"
#include "core/dom/EventNames.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLFormElement.h"
#include "core/html/parser/HTMLParserIdioms.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/rendering/RenderImage.h"
using namespace std;
@@ -179,11 +179,6 @@ void HTMLImageElement::attach(const AttachContext& context)
Node::InsertionNotificationRequest HTMLImageElement::insertedInto(ContainerNode* insertionPoint)
{
// m_form can be non-null if it was set in constructor.
- if (m_form && insertionPoint->highestAncestor() != m_form->highestAncestor()) {
- m_form->removeImgElement(this);
- m_form = 0;
- }
-
if (!m_form) {
m_form = findFormAncestor();
if (m_form)
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLImageLoader.cpp b/chromium/third_party/WebKit/Source/core/html/HTMLImageLoader.cpp
index f4954f7ab64..6b966acb800 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLImageLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLImageLoader.cpp
@@ -26,10 +26,10 @@
#include "core/dom/Element.h"
#include "core/dom/Event.h"
#include "core/dom/EventNames.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLObjectElement.h"
#include "core/html/HTMLVideoElement.h"
#include "core/html/parser/HTMLParserIdioms.h"
+#include "core/loader/cache/ImageResource.h"
namespace WebCore {
@@ -69,7 +69,7 @@ void HTMLImageLoader::notifyFinished(Resource*)
bool loadError = cachedImage->errorOccurred() || cachedImage->response().httpStatusCode() >= 400;
if (loadError && element->hasTagName(HTMLNames::objectTag))
- toHTMLObjectElement(element.get())->renderFallbackContent();
+ static_cast<HTMLObjectElement*>(element.get())->renderFallbackContent();
}
}
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLImportLoader.cpp b/chromium/third_party/WebKit/Source/core/html/HTMLImportLoader.cpp
index 7cfbd2924ea..ef2d766d7ee 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLImportLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLImportLoader.cpp
@@ -32,19 +32,21 @@
#include "core/html/HTMLImportLoader.h"
#include "core/dom/Document.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/html/HTMLDocument.h"
#include "core/html/HTMLImportLoaderClient.h"
#include "core/loader/DocumentWriter.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/ContentSecurityPolicyResponseHeaders.h"
namespace WebCore {
-HTMLImportLoader::HTMLImportLoader(HTMLImport* parent, const KURL& url)
+HTMLImportLoader::HTMLImportLoader(HTMLImport* parent, const KURL& url, const ResourcePtr<RawResource>& resource)
: m_parent(parent)
, m_state(StateLoading)
+ , m_resource(resource)
, m_url(url)
{
+ m_resource->addClient(this);
}
HTMLImportLoader::~HTMLImportLoader()
@@ -56,12 +58,6 @@ HTMLImportLoader::~HTMLImportLoader()
m_resource->removeClient(this);
}
-void HTMLImportLoader::setResource(const ResourcePtr<RawResource>& resource)
-{
- m_resource = resource;
- m_resource->addClient(this);
-}
-
void HTMLImportLoader::responseReceived(Resource*, const ResourceResponse& response)
{
setState(startWritingAndParsing(response));
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLImportLoader.h b/chromium/third_party/WebKit/Source/core/html/HTMLImportLoader.h
index 5406049ac84..4b9b3996b2f 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLImportLoader.h
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLImportLoader.h
@@ -31,9 +31,9 @@
#ifndef HTMLImportLoader_h
#define HTMLImportLoader_h
-#include "core/fetch/RawResource.h"
-#include "core/fetch/ResourcePtr.h"
#include "core/html/HTMLImport.h"
+#include "core/loader/cache/RawResource.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "weborigin/KURL.h"
#include "wtf/RefCounted.h"
#include "wtf/Vector.h"
@@ -52,13 +52,12 @@ public:
StateReady
};
- HTMLImportLoader(HTMLImport*, const KURL&);
+ HTMLImportLoader(HTMLImport*, const KURL&, const ResourcePtr<RawResource>&);
virtual ~HTMLImportLoader();
Document* importedDocument() const;
const KURL& url() const { return m_url; }
- void setResource(const ResourcePtr<RawResource>&);
void addClient(HTMLImportLoaderClient*);
void removeClient(HTMLImportLoaderClient*);
void importDestroyed();
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLImportsController.cpp b/chromium/third_party/WebKit/Source/core/html/HTMLImportsController.cpp
index 9ebaa5c4637..cb2107ab860 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLImportsController.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLImportsController.cpp
@@ -32,9 +32,9 @@
#include "core/html/HTMLImportsController.h"
#include "core/dom/Document.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/html/HTMLImportLoader.h"
#include "core/html/HTMLImportLoaderClient.h"
+#include "core/loader/cache/ResourceFetcher.h"
namespace WebCore {
@@ -78,14 +78,9 @@ PassRefPtr<HTMLImportLoader> HTMLImportsController::createLoader(HTMLImport* par
if (!resource)
return 0;
- RefPtr<HTMLImportLoader> loader = adoptRef(new HTMLImportLoader(parent, request.url()));
+ RefPtr<HTMLImportLoader> loader = adoptRef(new HTMLImportLoader(parent, request.url(), resource));
parent->appendChild(loader.get());
m_imports.append(loader);
-
- // We set resource after the import tree is built since
- // Resource::addClient() immediately calls back to feed the bytes when the resource is cached.
- loader->setResource(resource);
-
return loader.release();
}
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLImportsController.h b/chromium/third_party/WebKit/Source/core/html/HTMLImportsController.h
index 0a06c4ef1fb..b106d8ac358 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLImportsController.h
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLImportsController.h
@@ -31,9 +31,9 @@
#ifndef HTMLImportsController_h
#define HTMLImportsController_h
-#include "core/fetch/RawResource.h"
#include "core/html/HTMLImport.h"
#include "core/html/LinkResource.h"
+#include "core/loader/cache/RawResource.h"
#include "core/platform/Supplementable.h"
#include "core/platform/Timer.h"
#include "wtf/FastAllocBase.h"
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp b/chromium/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp
index abc47635a06..cf9220a68c4 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp
@@ -37,12 +37,12 @@
#include "core/dom/DocumentStyleSheetCollection.h"
#include "core/dom/Event.h"
#include "core/dom/EventSender.h"
-#include "core/fetch/CSSStyleSheetResource.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/html/LinkImport.h"
#include "core/loader/FrameLoader.h"
#include "core/loader/FrameLoaderClient.h"
+#include "core/loader/cache/CSSStyleSheetResource.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/ContentSecurityPolicy.h"
#include "core/page/Frame.h"
#include "core/page/FrameView.h"
@@ -507,8 +507,6 @@ void LinkStyle::removePendingSheet(RemovePendingSheetNotificationType notificati
if (type == None)
return;
if (type == NonBlocking) {
- // Tell StyleSheetCollections to re-compute styleSheets of this m_owner's treescope.
- m_owner->document()->styleSheetCollection()->modifiedStyleSheetCandidateNode(m_owner);
// Document::removePendingSheet() triggers the style selector recalc for blocking sheets.
// FIXME: We don't have enough knowledge at this point to know if we're adding or removing a sheet
// so we can't call addedStyleSheet() or removedStyleSheet().
@@ -516,7 +514,7 @@ void LinkStyle::removePendingSheet(RemovePendingSheetNotificationType notificati
return;
}
- m_owner->document()->styleSheetCollection()->removePendingSheet(m_owner,
+ m_owner->document()->styleSheetCollection()->removePendingSheet(
notification == RemovePendingSheetNotifyImmediately
? DocumentStyleSheetCollection::RemovePendingSheetNotifyImmediately
: DocumentStyleSheetCollection::RemovePendingSheetNotifyLater);
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLLinkElement.h b/chromium/third_party/WebKit/Source/core/html/HTMLLinkElement.h
index 213a40d8c63..9d10b261a86 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLLinkElement.h
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLLinkElement.h
@@ -26,14 +26,14 @@
#include "core/css/CSSStyleSheet.h"
#include "core/dom/IconURL.h"
-#include "core/fetch/ResourcePtr.h"
-#include "core/fetch/StyleSheetResourceClient.h"
#include "core/html/DOMSettableTokenList.h"
#include "core/html/HTMLElement.h"
#include "core/html/LinkRelAttribute.h"
#include "core/html/LinkResource.h"
#include "core/loader/LinkLoader.h"
#include "core/loader/LinkLoaderClient.h"
+#include "core/loader/cache/ResourcePtr.h"
+#include "core/loader/cache/StyleSheetResourceClient.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLNameCollection.cpp b/chromium/third_party/WebKit/Source/core/html/HTMLNameCollection.cpp
index f4e5065cfaa..6e637b21300 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLNameCollection.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLNameCollection.cpp
@@ -87,7 +87,7 @@ Element* HTMLNameCollection::virtualItemAfter(unsigned& offsetInArray, Element*
return current;
} else if (current->hasTagName(objectTag)) {
if ((current->getNameAttribute() == m_name || current->getIdAttribute() == m_name)
- && toHTMLObjectElement(current)->isDocNamedItem())
+ && static_cast<HTMLObjectElement*>(current)->isDocNamedItem())
return current;
} else if (current->hasTagName(imgTag)) {
if (current->getNameAttribute() == m_name || (current->getIdAttribute() == m_name && current->hasName()))
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLObjectElement.cpp b/chromium/third_party/WebKit/Source/core/html/HTMLObjectElement.cpp
index 3abb23644af..0dd38fd488b 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLObjectElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLObjectElement.cpp
@@ -31,13 +31,13 @@
#include "core/dom/NodeList.h"
#include "core/dom/NodeTraversal.h"
#include "core/dom/Text.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/FormDataList.h"
#include "core/html/HTMLDocument.h"
#include "core/html/HTMLImageLoader.h"
#include "core/html/HTMLMetaElement.h"
#include "core/html/HTMLParamElement.h"
#include "core/html/parser/HTMLParserIdioms.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/Frame.h"
#include "core/page/Page.h"
#include "core/page/Settings.h"
@@ -450,7 +450,8 @@ bool HTMLObjectElement::containsJavaApplet() const
&& equalIgnoringCase(child->getNameAttribute(), "type")
&& MIMETypeRegistry::isJavaAppletMIMEType(child->getAttribute(valueAttr).string()))
return true;
- if (child->hasTagName(objectTag) && toHTMLObjectElement(child)->containsJavaApplet())
+ if (child->hasTagName(objectTag)
+ && static_cast<HTMLObjectElement*>(child)->containsJavaApplet())
return true;
if (child->hasTagName(appletTag))
return true;
diff --git a/chromium/third_party/WebKit/Source/core/html/HTMLObjectElement.h b/chromium/third_party/WebKit/Source/core/html/HTMLObjectElement.h
index 09de9171cd0..5b8d1d2bb40 100644
--- a/chromium/third_party/WebKit/Source/core/html/HTMLObjectElement.h
+++ b/chromium/third_party/WebKit/Source/core/html/HTMLObjectElement.h
@@ -109,12 +109,6 @@ private:
bool m_useFallbackContent : 1;
};
-inline HTMLObjectElement* toHTMLObjectElement(Node* node)
-{
- ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(HTMLNames::objectTag));
- return static_cast<HTMLObjectElement*>(node);
-}
-
}
#endif
diff --git a/chromium/third_party/WebKit/Source/core/html/ImageDocument.cpp b/chromium/third_party/WebKit/Source/core/html/ImageDocument.cpp
index 5015382d88b..64a0dc19c21 100644
--- a/chromium/third_party/WebKit/Source/core/html/ImageDocument.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/ImageDocument.cpp
@@ -31,7 +31,6 @@
#include "core/dom/EventNames.h"
#include "core/dom/MouseEvent.h"
#include "core/dom/RawDataDocumentParser.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLBodyElement.h"
#include "core/html/HTMLHeadElement.h"
#include "core/html/HTMLHtmlElement.h"
@@ -40,6 +39,7 @@
#include "core/loader/DocumentLoader.h"
#include "core/loader/FrameLoader.h"
#include "core/loader/FrameLoaderClient.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/Frame.h"
#include "core/page/FrameView.h"
#include "core/page/Page.h"
diff --git a/chromium/third_party/WebKit/Source/core/html/ImageInputType.cpp b/chromium/third_party/WebKit/Source/core/html/ImageInputType.cpp
index 85b049e6f3e..2ad3d907af8 100644
--- a/chromium/third_party/WebKit/Source/core/html/ImageInputType.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/ImageInputType.cpp
@@ -25,13 +25,13 @@
#include "HTMLNames.h"
#include "core/dom/MouseEvent.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/FormDataList.h"
#include "core/html/HTMLFormElement.h"
#include "core/html/HTMLImageLoader.h"
#include "core/html/HTMLInputElement.h"
#include "core/html/InputTypeNames.h"
#include "core/html/parser/HTMLParserIdioms.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/rendering/RenderImage.h"
#include "wtf/PassOwnPtr.h"
diff --git a/chromium/third_party/WebKit/Source/core/html/LinkResource.h b/chromium/third_party/WebKit/Source/core/html/LinkResource.h
index b4eeb3d44ad..8c6c84e0fda 100644
--- a/chromium/third_party/WebKit/Source/core/html/LinkResource.h
+++ b/chromium/third_party/WebKit/Source/core/html/LinkResource.h
@@ -31,7 +31,7 @@
#ifndef LinkResource_h
#define LinkResource_h
-#include "core/fetch/FetchRequest.h"
+#include "core/loader/cache/FetchRequest.h"
#include "weborigin/KURL.h"
#include "wtf/RefCounted.h"
#include "wtf/text/WTFString.h"
diff --git a/chromium/third_party/WebKit/Source/core/html/RadioNodeList.cpp b/chromium/third_party/WebKit/Source/core/html/RadioNodeList.cpp
index 0522f12ec50..5768dcf135e 100644
--- a/chromium/third_party/WebKit/Source/core/html/RadioNodeList.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/RadioNodeList.cpp
@@ -90,7 +90,7 @@ bool RadioNodeList::checkElementMatchesRadioNodeListFilter(Element* testElement)
if (ownerNode()->hasTagName(formTag)) {
HTMLFormElement* formElement = 0;
if (testElement->hasTagName(objectTag))
- formElement = toHTMLObjectElement(testElement)->form();
+ formElement = static_cast<HTMLObjectElement*>(testElement)->form();
else
formElement = toHTMLFormControlElement(testElement)->form();
if (!formElement || formElement != ownerNode())
diff --git a/chromium/third_party/WebKit/Source/core/html/SearchInputType.cpp b/chromium/third_party/WebKit/Source/core/html/SearchInputType.cpp
index b68d9a486a6..3982770bd93 100644
--- a/chromium/third_party/WebKit/Source/core/html/SearchInputType.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/SearchInputType.cpp
@@ -34,7 +34,6 @@
#include "HTMLNames.h"
#include "bindings/v8/ExceptionStatePlaceholder.h"
#include "core/dom/KeyboardEvent.h"
-#include "core/dom/shadow/ShadowRoot.h"
#include "core/html/HTMLInputElement.h"
#include "core/html/InputTypeNames.h"
#include "core/html/shadow/ShadowElementNames.h"
@@ -151,7 +150,7 @@ bool SearchInputType::searchEventsShouldBeDispatched() const
void SearchInputType::didSetValueByUserEdit(ValueChangeState state)
{
- if (element()->userAgentShadowRoot()->getElementById(ShadowElementNames::clearButton()))
+ if (element()->uaShadowElementById(ShadowElementNames::clearButton()))
toRenderSearchField(element()->renderer())->updateCancelButtonVisibility();
// If the incremental attribute is set, then dispatch the search event
diff --git a/chromium/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp b/chromium/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
index 4f362bcda9f..71580c98a9f 100644
--- a/chromium/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext.cpp
@@ -26,11 +26,11 @@
#include "config.h"
#include "core/html/canvas/CanvasRenderingContext.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLCanvasElement.h"
#include "core/html/HTMLImageElement.h"
#include "core/html/HTMLVideoElement.h"
#include "core/html/canvas/CanvasPattern.h"
+#include "core/loader/cache/ImageResource.h"
#include "weborigin/SecurityOrigin.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext2D.cpp b/chromium/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext2D.cpp
index 176cb57349a..feff097a1ff 100644
--- a/chromium/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext2D.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/canvas/CanvasRenderingContext2D.cpp
@@ -42,7 +42,6 @@
#include "core/css/StylePropertySet.h"
#include "core/css/resolver/StyleResolver.h"
#include "core/dom/ExceptionCode.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLCanvasElement.h"
#include "core/html/HTMLImageElement.h"
#include "core/html/HTMLMediaElement.h"
@@ -54,6 +53,7 @@
#include "core/html/canvas/CanvasPattern.h"
#include "core/html/canvas/CanvasStyle.h"
#include "core/html/canvas/DOMPath.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/ImageBitmap.h"
#include "core/platform/graphics/DrawLooper.h"
#include "core/platform/graphics/FloatQuad.h"
diff --git a/chromium/third_party/WebKit/Source/core/html/canvas/WebGLRenderingContext.cpp b/chromium/third_party/WebKit/Source/core/html/canvas/WebGLRenderingContext.cpp
index 6eaec39cd93..01e667d5559 100644
--- a/chromium/third_party/WebKit/Source/core/html/canvas/WebGLRenderingContext.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/canvas/WebGLRenderingContext.cpp
@@ -29,7 +29,6 @@
#include "RuntimeEnabledFeatures.h"
#include "bindings/v8/ExceptionState.h"
#include "core/dom/ExceptionCode.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLCanvasElement.h"
#include "core/html/HTMLImageElement.h"
#include "core/html/HTMLVideoElement.h"
@@ -67,6 +66,7 @@
#include "core/inspector/InspectorInstrumentation.h"
#include "core/loader/FrameLoader.h"
#include "core/loader/FrameLoaderClient.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/Frame.h"
#include "core/page/Page.h"
#include "core/page/Settings.h"
@@ -553,8 +553,6 @@ WebGLRenderingContext::WebGLRenderingContext(HTMLCanvasElement* passedCanvas, Pa
, m_numGLErrorsToConsoleAllowed(maxGLErrorsAllowedToConsole)
, m_multisamplingAllowed(false)
, m_multisamplingObserverRegistered(false)
- , m_onePlusMaxEnabledAttribIndex(0)
- , m_onePlusMaxNonDefaultTextureUnit(0)
{
ASSERT(m_context);
ScriptWrappable::init(this);
@@ -578,31 +576,32 @@ WebGLRenderingContext::WebGLRenderingContext(HTMLCanvasElement* passedCanvas, Pa
}
// Register extensions.
+ static const char* unprefixed[] = { "", 0, };
static const char* webkitPrefix[] = { "WEBKIT_", 0, };
static const char* bothPrefixes[] = { "", "WEBKIT_", 0, };
- registerExtension<ANGLEInstancedArrays>(m_angleInstancedArrays);
- registerExtension<EXTTextureFilterAnisotropic>(m_extTextureFilterAnisotropic, PrefixedExtension, webkitPrefix);
- registerExtension<OESElementIndexUint>(m_oesElementIndexUint);
- registerExtension<OESStandardDerivatives>(m_oesStandardDerivatives);
- registerExtension<OESTextureFloat>(m_oesTextureFloat);
- registerExtension<OESTextureFloatLinear>(m_oesTextureFloatLinear);
- registerExtension<OESTextureHalfFloat>(m_oesTextureHalfFloat);
- registerExtension<OESTextureHalfFloatLinear>(m_oesTextureHalfFloatLinear);
- registerExtension<OESVertexArrayObject>(m_oesVertexArrayObject);
- registerExtension<WebGLCompressedTextureATC>(m_webglCompressedTextureATC, PrefixedExtension, webkitPrefix);
- registerExtension<WebGLCompressedTexturePVRTC>(m_webglCompressedTexturePVRTC, PrefixedExtension, webkitPrefix);
- registerExtension<WebGLCompressedTextureS3TC>(m_webglCompressedTextureS3TC, PrefixedExtension, bothPrefixes);
- registerExtension<WebGLDepthTexture>(m_webglDepthTexture, PrefixedExtension, bothPrefixes);
- registerExtension<WebGLLoseContext>(m_webglLoseContext, ApprovedExtension, bothPrefixes);
+ registerExtension<EXTTextureFilterAnisotropic>(m_extTextureFilterAnisotropic, false, false, true, webkitPrefix);
+ registerExtension<OESElementIndexUint>(m_oesElementIndexUint, false, false, false, unprefixed);
+ registerExtension<OESStandardDerivatives>(m_oesStandardDerivatives, false, false, false, unprefixed);
+ registerExtension<OESTextureFloat>(m_oesTextureFloat, false, false, false, unprefixed);
+ registerExtension<OESTextureFloatLinear>(m_oesTextureFloatLinear, false, false, false, unprefixed);
+ registerExtension<OESTextureHalfFloat>(m_oesTextureHalfFloat, false, false, false, unprefixed);
+ registerExtension<OESTextureHalfFloatLinear>(m_oesTextureHalfFloatLinear, false, false, false, unprefixed);
+ registerExtension<OESVertexArrayObject>(m_oesVertexArrayObject, false, false, false, unprefixed);
+ registerExtension<WebGLCompressedTextureATC>(m_webglCompressedTextureATC, false, false, true, webkitPrefix);
+ registerExtension<WebGLCompressedTexturePVRTC>(m_webglCompressedTexturePVRTC, false, false, true, webkitPrefix);
+ registerExtension<WebGLCompressedTextureS3TC>(m_webglCompressedTextureS3TC, false, false, true, bothPrefixes);
+ registerExtension<WebGLDepthTexture>(m_webglDepthTexture, false, false, true, bothPrefixes);
+ registerExtension<WebGLLoseContext>(m_webglLoseContext, false, false, false, bothPrefixes);
// Register draft extensions.
- registerExtension<EXTFragDepth>(m_extFragDepth, DraftExtension);
- registerExtension<WebGLDrawBuffers>(m_webglDrawBuffers, DraftExtension);
+ registerExtension<ANGLEInstancedArrays>(m_angleInstancedArrays, false, true, false, unprefixed);
+ registerExtension<EXTFragDepth>(m_extFragDepth, false, true, false, unprefixed);
+ registerExtension<WebGLDrawBuffers>(m_webglDrawBuffers, false, true, false, unprefixed);
// Register privileged extensions.
- registerExtension<WebGLDebugRendererInfo>(m_webglDebugRendererInfo, PrivilegedExtension);
- registerExtension<WebGLDebugShaders>(m_webglDebugShaders, PrivilegedExtension);
+ registerExtension<WebGLDebugRendererInfo>(m_webglDebugRendererInfo, true, false, false, unprefixed);
+ registerExtension<WebGLDebugShaders>(m_webglDebugShaders, true, false, false, unprefixed);
}
void WebGLRenderingContext::initializeNewContext()
@@ -1140,17 +1139,9 @@ void WebGLRenderingContext::bindTexture(GC3Denum target, WebGLTexture* texture)
synthesizeGLError(GraphicsContext3D::INVALID_ENUM, "bindTexture", "invalid target");
return;
}
-
m_context->bindTexture(target, objectOrZero(texture));
- if (texture) {
+ if (texture)
texture->setTarget(target, maxLevel);
- m_onePlusMaxNonDefaultTextureUnit = max(m_activeTextureUnit + 1, m_onePlusMaxNonDefaultTextureUnit);
- } else {
- // If the disabled index is the current maximum, trace backwards to find the new max enabled texture index
- if (m_onePlusMaxNonDefaultTextureUnit == m_activeTextureUnit + 1) {
- findNewMaxNonDefaultTextureUnit();
- }
- }
// Note: previously we used to automatically set the TEXTURE_WRAP_R
// repeat mode to CLAMP_TO_EDGE for cube map textures, because OpenGL
@@ -1389,7 +1380,7 @@ void WebGLRenderingContext::compressedTexImage2D(GC3Denum target, GC3Dint level,
synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "compressedTexImage2D", "border not 0");
return;
}
- if (!validateCompressedTexDimensions("compressedTexImage2D", NotTexSubImage2D, target, level, width, height, internalformat))
+ if (!validateCompressedTexDimensions("compressedTexImage2D", level, width, height, internalformat))
return;
if (!validateCompressedTexFuncData("compressedTexImage2D", width, height, internalformat, data))
return;
@@ -1665,27 +1656,17 @@ void WebGLRenderingContext::deleteTexture(WebGLTexture* texture)
{
if (!deleteObject(texture))
return;
-
- int maxBoundTextureIndex = -1;
- for (size_t i = 0; i < m_onePlusMaxNonDefaultTextureUnit; ++i) {
+ for (size_t i = 0; i < m_textureUnits.size(); ++i) {
if (texture == m_textureUnits[i].m_texture2DBinding) {
m_textureUnits[i].m_texture2DBinding = 0;
- maxBoundTextureIndex = i;
if (!i)
m_drawingBuffer->setTexture2DBinding(0);
}
- if (texture == m_textureUnits[i].m_textureCubeMapBinding) {
+ if (texture == m_textureUnits[i].m_textureCubeMapBinding)
m_textureUnits[i].m_textureCubeMapBinding = 0;
- maxBoundTextureIndex = i;
- }
}
if (m_framebufferBinding)
m_framebufferBinding->removeAttachmentFromBoundFramebuffer(texture);
-
- // If the deleted was bound to the the current maximum index, trace backwards to find the new max texture index
- if (m_onePlusMaxNonDefaultTextureUnit == maxBoundTextureIndex + 1) {
- findNewMaxNonDefaultTextureUnit();
- }
}
void WebGLRenderingContext::depthFunc(GC3Denum func)
@@ -1755,12 +1736,6 @@ void WebGLRenderingContext::disableVertexAttribArray(GC3Duint index)
WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArrayObject->getVertexAttribState(index);
state.enabled = false;
-
- // If the disabled index is the current maximum, trace backwards to find the new max enabled attrib index
- if (m_onePlusMaxEnabledAttribIndex == index + 1) {
- findNewMaxEnabledAttribIndex();
- }
-
m_context->disableVertexAttribArray(index);
}
@@ -1770,7 +1745,7 @@ bool WebGLRenderingContext::validateRenderingState()
return false;
// Look in each enabled vertex attrib and check if they've been bound to a buffer.
- for (unsigned i = 0; i < m_onePlusMaxEnabledAttribIndex; ++i) {
+ for (unsigned i = 0; i < m_maxVertexAttribs; ++i) {
const WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArrayObject->getVertexAttribState(i);
if (state.enabled
&& (!state.bufferBinding || !state.bufferBinding->object()))
@@ -1879,8 +1854,6 @@ void WebGLRenderingContext::enableVertexAttribArray(GC3Duint index)
WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArrayObject->getVertexAttribState(index);
state.enabled = true;
- m_onePlusMaxEnabledAttribIndex = max(index + 1, m_onePlusMaxEnabledAttribIndex);
-
m_context->enableVertexAttribArray(index);
}
@@ -2137,9 +2110,7 @@ GC3Denum WebGLRenderingContext::getError()
bool WebGLRenderingContext::ExtensionTracker::matchesNameWithPrefixes(const String& name) const
{
- static const char* unprefixed[] = { "", 0, };
-
- const char** prefixes = m_prefixes ? m_prefixes : unprefixed;
+ const char** prefixes = m_prefixes;
for (; *prefixes; ++prefixes) {
String prefixedName = String(*prefixes) + getExtensionName();
if (equalIgnoringCase(prefixedName, name)) {
@@ -4307,7 +4278,7 @@ void WebGLRenderingContext::handleTextureCompleteness(const char* functionName,
bool resetActiveUnit = false;
WebGLTexture::TextureExtensionFlag flag = static_cast<WebGLTexture::TextureExtensionFlag>((m_oesTextureFloatLinear ? WebGLTexture::TextureFloatLinearExtensionEnabled : 0)
| (m_oesTextureHalfFloatLinear ? WebGLTexture::TextureHalfFloatLinearExtensionEnabled : 0));
- for (unsigned ii = 0; ii < m_onePlusMaxNonDefaultTextureUnit; ++ii) {
+ for (unsigned ii = 0; ii < m_textureUnits.size(); ++ii) {
if ((m_textureUnits[ii].m_texture2DBinding.get() && m_textureUnits[ii].m_texture2DBinding->needToUseBlackTexture(flag))
|| (m_textureUnits[ii].m_textureCubeMapBinding.get() && m_textureUnits[ii].m_textureCubeMapBinding->needToUseBlackTexture(flag))) {
if (ii != m_activeTextureUnit) {
@@ -4585,7 +4556,7 @@ bool WebGLRenderingContext::validateTexFuncLevel(const char* functionName, GC3De
}
switch (target) {
case GraphicsContext3D::TEXTURE_2D:
- if (level >= m_maxTextureLevel) {
+ if (level > m_maxTextureLevel) {
synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "level out of range");
return false;
}
@@ -4596,7 +4567,7 @@ bool WebGLRenderingContext::validateTexFuncLevel(const char* functionName, GC3De
case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Y:
case GraphicsContext3D::TEXTURE_CUBE_MAP_POSITIVE_Z:
case GraphicsContext3D::TEXTURE_CUBE_MAP_NEGATIVE_Z:
- if (level >= m_maxCubeMapTextureLevel) {
+ if (level > m_maxCubeMapTextureLevel) {
synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "level out of range");
return false;
}
@@ -4607,9 +4578,19 @@ bool WebGLRenderingContext::validateTexFuncLevel(const char* functionName, GC3De
return true;
}
-bool WebGLRenderingContext::validateTexFuncDimensions(const char* functionName, TexFuncValidationFunctionType functionType,
- GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei height)
+bool WebGLRenderingContext::validateTexFuncParameters(const char* functionName,
+ TexFuncValidationFunctionType functionType,
+ GC3Denum target, GC3Dint level,
+ GC3Denum internalformat,
+ GC3Dsizei width, GC3Dsizei height, GC3Dint border,
+ GC3Denum format, GC3Denum type)
{
+ // We absolutely have to validate the format and type combination.
+ // The texImage2D entry points taking HTMLImage, etc. will produce
+ // temporary data based on this combination, so it must be legal.
+ if (!validateTexFuncFormatAndType(functionName, format, type, level) || !validateTexFuncLevel(functionName, target, level))
+ return false;
+
if (width < 0 || height < 0) {
synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "width or height < 0");
return false;
@@ -4617,7 +4598,7 @@ bool WebGLRenderingContext::validateTexFuncDimensions(const char* functionName,
switch (target) {
case GraphicsContext3D::TEXTURE_2D:
- if (width > (m_maxTextureSize >> level) || height > (m_maxTextureSize >> level)) {
+ if (width > m_maxTextureSize || height > m_maxTextureSize) {
synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "width or height out of range");
return false;
}
@@ -4634,7 +4615,7 @@ bool WebGLRenderingContext::validateTexFuncDimensions(const char* functionName,
}
// No need to check height here. For texImage width == height.
// For texSubImage that will be checked when checking yoffset + height is in range.
- if (width > (m_maxCubeMapTextureSize >> level)) {
+ if (width > m_maxCubeMapTextureSize) {
synthesizeGLError(GraphicsContext3D::INVALID_VALUE, functionName, "width or height out of range for cube map");
return false;
}
@@ -4643,20 +4624,6 @@ bool WebGLRenderingContext::validateTexFuncDimensions(const char* functionName,
synthesizeGLError(GraphicsContext3D::INVALID_ENUM, functionName, "invalid target");
return false;
}
- return true;
-}
-
-bool WebGLRenderingContext::validateTexFuncParameters(const char* functionName, TexFuncValidationFunctionType functionType, GC3Denum target,
- GC3Dint level, GC3Denum internalformat, GC3Dsizei width, GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type)
-{
- // We absolutely have to validate the format and type combination.
- // The texImage2D entry points taking HTMLImage, etc. will produce
- // temporary data based on this combination, so it must be legal.
- if (!validateTexFuncFormatAndType(functionName, format, type, level) || !validateTexFuncLevel(functionName, target, level))
- return false;
-
- if (!validateTexFuncDimensions(functionName, functionType, target, level, width, height))
- return false;
if (format != internalformat) {
synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "format != internalformat");
@@ -4823,11 +4790,8 @@ bool WebGLRenderingContext::validateCompressedTexFuncData(const char* functionNa
return true;
}
-bool WebGLRenderingContext::validateCompressedTexDimensions(const char* functionName, TexFuncValidationFunctionType functionType, GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei height, GC3Denum format)
+bool WebGLRenderingContext::validateCompressedTexDimensions(const char* functionName, GC3Dint level, GC3Dsizei width, GC3Dsizei height, GC3Denum format)
{
- if (!validateTexFuncDimensions(functionName, functionType, target, level, width, height))
- return false;
-
switch (format) {
case Extensions3D::COMPRESSED_RGB_S3TC_DXT1_EXT:
case Extensions3D::COMPRESSED_RGBA_S3TC_DXT1_EXT:
@@ -4872,7 +4836,7 @@ bool WebGLRenderingContext::validateCompressedTexSubDimensions(const char* funct
synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, functionName, "dimensions out of range");
return false;
}
- return validateCompressedTexDimensions(functionName, TexSubImage2D, target, level, width, height, format);
+ return validateCompressedTexDimensions(functionName, level, width, height, format);
}
default:
return false;
@@ -5233,7 +5197,7 @@ bool WebGLRenderingContext::validateDrawInstanced(const char* functionName, GC3D
}
// Ensure at least one enabled vertex attrib has a divisor of 0.
- for (unsigned i = 0; i < m_onePlusMaxEnabledAttribIndex; ++i) {
+ for (unsigned i = 0; i < m_maxVertexAttribs; ++i) {
const WebGLVertexArrayObjectOES::VertexAttribState& state = m_boundVertexArrayObject->getVertexAttribState(i);
if (state.enabled && !state.divisor)
return true;
@@ -5558,31 +5522,4 @@ void WebGLRenderingContext::multisamplingChanged(bool enabled)
}
}
-void WebGLRenderingContext::findNewMaxEnabledAttribIndex()
-{
- // Trace backwards from the current max to find the new max enabled attrib index
- int startIndex = m_onePlusMaxEnabledAttribIndex - 1;
- for (int i = startIndex; i >= 0; --i) {
- if (m_boundVertexArrayObject->getVertexAttribState(i).enabled) {
- m_onePlusMaxEnabledAttribIndex = i + 1;
- return;
- }
- }
- m_onePlusMaxEnabledAttribIndex = 0;
-}
-
-void WebGLRenderingContext::findNewMaxNonDefaultTextureUnit()
-{
- // Trace backwards from the current max to find the new max non-default texture unit
- int startIndex = m_onePlusMaxNonDefaultTextureUnit - 1;
- for (int i = startIndex; i >= 0; --i) {
- if (m_textureUnits[i].m_texture2DBinding
- || m_textureUnits[i].m_textureCubeMapBinding) {
- m_onePlusMaxNonDefaultTextureUnit = i + 1;
- return;
- }
- }
- m_onePlusMaxNonDefaultTextureUnit = 0;
-}
-
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/html/canvas/WebGLRenderingContext.h b/chromium/third_party/WebKit/Source/core/html/canvas/WebGLRenderingContext.h
index 386bb374675..39aeae7a0c7 100644
--- a/chromium/third_party/WebKit/Source/core/html/canvas/WebGLRenderingContext.h
+++ b/chromium/third_party/WebKit/Source/core/html/canvas/WebGLRenderingContext.h
@@ -506,12 +506,6 @@ public:
bool m_synthesizedErrorsToConsole;
int m_numGLErrorsToConsoleAllowed;
- bool m_multisamplingAllowed;
- bool m_multisamplingObserverRegistered;
-
- GC3Duint m_onePlusMaxEnabledAttribIndex;
- unsigned long m_onePlusMaxNonDefaultTextureUnit;
-
// Enabled extension objects.
RefPtr<ANGLEInstancedArrays> m_angleInstancedArrays;
RefPtr<EXTFragDepth> m_extFragDepth;
@@ -532,19 +526,12 @@ public:
RefPtr<WebGLCompressedTextureS3TC> m_webglCompressedTextureS3TC;
RefPtr<WebGLDepthTexture> m_webglDepthTexture;
- enum ExtensionFlags {
- ApprovedExtension = 0x00,
- DraftExtension = 0x01,
- PrivilegedExtension = 0x02,
- PrefixedExtension = 0x04,
- };
-
class ExtensionTracker {
public:
- ExtensionTracker(ExtensionFlags flags, const char** prefixes)
- : m_privileged(flags & PrivilegedExtension)
- , m_draft(flags & DraftExtension)
- , m_prefixed(flags & PrefixedExtension)
+ ExtensionTracker(bool privileged, bool draft, bool prefixed, const char** prefixes)
+ : m_privileged(privileged)
+ , m_draft(draft)
+ , m_prefixed(prefixed)
, m_prefixes(prefixes)
{
}
@@ -585,8 +572,8 @@ public:
template <typename T>
class TypedExtensionTracker : public ExtensionTracker {
public:
- TypedExtensionTracker(RefPtr<T>& extensionField, ExtensionFlags flags, const char** prefixes)
- : ExtensionTracker(flags, prefixes)
+ TypedExtensionTracker(RefPtr<T>& extensionField, bool privileged, bool draft, bool prefixed, const char** prefixes)
+ : ExtensionTracker(privileged, draft, prefixed, prefixes)
, m_extensionField(extensionField)
{
}
@@ -633,9 +620,9 @@ public:
Vector<ExtensionTracker*> m_extensions;
template <typename T>
- void registerExtension(RefPtr<T>& extensionPtr, ExtensionFlags flags = ApprovedExtension, const char** prefixes = 0)
+ void registerExtension(RefPtr<T>& extensionPtr, bool privileged, bool draft, bool prefixed, const char** prefixes)
{
- m_extensions.append(new TypedExtensionTracker<T>(extensionPtr, flags, prefixes));
+ m_extensions.append(new TypedExtensionTracker<T>(extensionPtr, privileged, draft, prefixed, prefixes));
}
// Errors raised by synthesizeGLError() while the context is lost.
@@ -723,11 +710,6 @@ public:
bool validateTexFunc(const char* functionName, TexFuncValidationFunctionType, TexFuncValidationSourceType, GC3Denum target, GC3Dint level, GC3Denum internalformat, GC3Dsizei width,
GC3Dsizei height, GC3Dint border, GC3Denum format, GC3Denum type, GC3Dint xoffset, GC3Dint yoffset);
- // Helper function to check input width and height for functions {copy, compressed}Tex{Sub}Image.
- // Generates GL error and returns false if width or height is invalid.
- bool validateTexFuncDimensions(const char* functionName, TexFuncValidationFunctionType,
- GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei height);
-
// Helper function to check input parameters for functions {copy}Tex{Sub}Image.
// Generates GL error and returns false if parameters are invalid.
bool validateTexFuncParameters(const char* functionName,
@@ -768,7 +750,7 @@ public:
// Helper function to validate compressed texture dimensions are valid for
// the given format.
- bool validateCompressedTexDimensions(const char* functionName, TexFuncValidationFunctionType, GC3Denum target, GC3Dint level, GC3Dsizei width, GC3Dsizei height, GC3Denum format);
+ bool validateCompressedTexDimensions(const char* functionName, GC3Dint level, GC3Dsizei width, GC3Dsizei height, GC3Denum format);
// Helper function to validate compressed texture dimensions are valid for
// the given format.
@@ -891,9 +873,8 @@ public:
void restoreCurrentTexture2D();
virtual void multisamplingChanged(bool);
-
- void findNewMaxEnabledAttribIndex();
- void findNewMaxNonDefaultTextureUnit();
+ bool m_multisamplingAllowed;
+ bool m_multisamplingObserverRegistered;
friend class WebGLStateRestorer;
friend class WebGLRenderingContextEvictionManager;
diff --git a/chromium/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.h b/chromium/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.h
index a30571440e0..1a1e2d7add1 100644
--- a/chromium/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.h
+++ b/chromium/third_party/WebKit/Source/core/html/parser/HTMLDocumentParser.h
@@ -28,7 +28,6 @@
#include "core/dom/ParserContentPolicy.h"
#include "core/dom/ScriptableDocumentParser.h"
-#include "core/fetch/ResourceClient.h"
#include "core/html/parser/BackgroundHTMLInputStream.h"
#include "core/html/parser/CompactHTMLToken.h"
#include "core/html/parser/HTMLInputStream.h"
@@ -41,6 +40,7 @@
#include "core/html/parser/HTMLTreeBuilderSimulator.h"
#include "core/html/parser/XSSAuditor.h"
#include "core/html/parser/XSSAuditorDelegate.h"
+#include "core/loader/cache/ResourceClient.h"
#include "core/platform/text/SegmentedString.h"
#include "wtf/Deque.h"
#include "wtf/OwnPtr.h"
diff --git a/chromium/third_party/WebKit/Source/core/html/parser/HTMLResourcePreloader.cpp b/chromium/third_party/WebKit/Source/core/html/parser/HTMLResourcePreloader.cpp
index 1d5317c4775..4960d81c30e 100644
--- a/chromium/third_party/WebKit/Source/core/html/parser/HTMLResourcePreloader.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/parser/HTMLResourcePreloader.cpp
@@ -27,9 +27,9 @@
#include "core/html/parser/HTMLResourcePreloader.h"
#include "core/dom/Document.h"
-#include "core/fetch/FetchInitiatorInfo.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/html/HTMLImport.h"
+#include "core/loader/cache/FetchInitiatorInfo.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/css/MediaList.h"
#include "core/css/MediaQueryEvaluator.h"
#include "core/platform/HistogramSupport.h"
diff --git a/chromium/third_party/WebKit/Source/core/html/parser/HTMLResourcePreloader.h b/chromium/third_party/WebKit/Source/core/html/parser/HTMLResourcePreloader.h
index 75c620d86a8..1b94671ccc6 100644
--- a/chromium/third_party/WebKit/Source/core/html/parser/HTMLResourcePreloader.h
+++ b/chromium/third_party/WebKit/Source/core/html/parser/HTMLResourcePreloader.h
@@ -26,8 +26,8 @@
#ifndef HTMLResourcePreloader_h
#define HTMLResourcePreloader_h
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/Resource.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/Resource.h"
#include "wtf/CurrentTime.h"
#include "wtf/text/TextPosition.h"
diff --git a/chromium/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp b/chromium/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp
index 9fd75103758..5141c82a9d6 100644
--- a/chromium/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp
@@ -32,10 +32,10 @@
#include "core/dom/IgnoreDestructiveWriteCountIncrementer.h"
#include "core/dom/Microtask.h"
#include "core/dom/ScriptLoader.h"
-#include "core/fetch/ScriptResource.h"
#include "core/html/parser/HTMLInputStream.h"
#include "core/html/parser/HTMLScriptRunnerHost.h"
#include "core/html/parser/NestingLevelIncrementer.h"
+#include "core/loader/cache/ScriptResource.h"
#include "core/page/Frame.h"
#include "core/platform/NotImplemented.h"
diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.cpp
index d9b59c6be6c..fda494d7df8 100644
--- a/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/shadow/DateTimeFieldElements.cpp
@@ -141,9 +141,10 @@ void DateTimeHourFieldElementBase::setValueAsDateTimeFieldsState(const DateTimeF
return;
}
- const int hour11 = hour12 == 12 ? 0 : hour12;
- const int hour23 = dateTimeFieldsState.ampm() == DateTimeFieldsState::AMPMValuePM ? hour11 + 12 : hour11;
- setValueAsInteger(hour23);
+ if (dateTimeFieldsState.ampm() == DateTimeFieldsState::AMPMValuePM)
+ setValueAsInteger((hour12 + 12) % 24);
+ else
+ setValueAsInteger(hour12 % 12);
}
// ----------------------------
@@ -255,7 +256,7 @@ void DateTimeHour23FieldElement::populateDateTimeFieldsState(DateTimeFieldsState
const int value = valueAsInteger();
- dateTimeFieldsState.setHour(value % 12 ? value % 12 : 12);
+ dateTimeFieldsState.setHour(value ? value % 12 : 12);
dateTimeFieldsState.setAMPM(value >= 12 ? DateTimeFieldsState::AMPMValuePM : DateTimeFieldsState::AMPMValueAM);
}
diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.cpp b/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.cpp
index 8f6b3c6f85e..81b52fb9bbb 100644
--- a/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.cpp
@@ -37,9 +37,9 @@
#include "core/dom/NodeRenderStyle.h"
#include "core/dom/shadow/ElementShadow.h"
#include "core/dom/shadow/ShadowRoot.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLInputElement.h"
#include "core/html/shadow/HTMLShadowElement.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/Chrome.h"
#include "core/page/ChromeClient.h"
#include "core/page/Page.h"
diff --git a/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.h b/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.h
index 3a3d7c1c214..20320345bc4 100644
--- a/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.h
+++ b/chromium/third_party/WebKit/Source/core/html/shadow/PasswordGeneratorButtonElement.h
@@ -31,8 +31,8 @@
#ifndef PasswordGeneratorButtonElement_h
#define PasswordGeneratorButtonElement_h
-#include "core/fetch/ResourcePtr.h"
#include "core/html/HTMLDivElement.h"
+#include "core/loader/cache/ResourcePtr.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InjectedScriptCanvasModuleSource.js b/chromium/third_party/WebKit/Source/core/inspector/InjectedScriptCanvasModuleSource.js
index 00d50cf82c8..c4bd77f5977 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InjectedScriptCanvasModuleSource.js
+++ b/chromium/third_party/WebKit/Source/core/inspector/InjectedScriptCanvasModuleSource.js
@@ -185,16 +185,6 @@ var TypeUtils = {
},
/**
- * @param {string} property
- * @param {!Object} obj
- * @return {boolean}
- */
- isEnumPropertyName: function(property, obj)
- {
- return (/^[A-Z][A-Z0-9_]+$/.test(property) && typeof obj[property] === "number");
- },
-
- /**
* @return {CanvasRenderingContext2D}
*/
_dummyCanvas2dContext: function()
@@ -209,7 +199,7 @@ var TypeUtils = {
}
}
-/** @typedef {{name:string, valueIsEnum:(boolean|undefined), value:*, values:(!Array.<TypeUtils.InternalResourceStateDescriptor>|undefined), isArray:(boolean|undefined)}} */
+/** @typedef {{name: string, value: *, values: (!Array.<TypeUtils.InternalResourceStateDescriptor>|undefined)}} */
TypeUtils.InternalResourceStateDescriptor;
/**
@@ -495,13 +485,6 @@ Call.prototype = {
*/
replay: function(replayableCall, cache)
{
- var replayableResult = replayableCall.result();
- if (replayableResult instanceof ReplayableResource && !cache.has(replayableResult.id())) {
- var resource = replayableResult.replay(cache);
- console.assert(resource.calls().length > 0, "Expected create* call for the Resource");
- return resource.calls()[0];
- }
-
var replayObject = ReplayableResource.replay(replayableCall.replayableResource(), cache);
var replayArgs = replayableCall.args().map(function(obj) {
return ReplayableResource.replay(obj, cache);
@@ -514,9 +497,8 @@ Call.prototype = {
var replayFunction = replayObject[replayableCall.functionName()];
console.assert(typeof replayFunction === "function", "Expected a function to replay");
replayResult = replayFunction.apply(replayObject, replayArgs);
-
- if (replayableResult instanceof ReplayableResource) {
- var resource = replayableResult.replay(cache);
+ if (replayableCall.result() instanceof ReplayableResource) {
+ var resource = replayableCall.result().replay(cache);
if (!resource.wrappedObject())
resource.setWrappedObject(replayResult);
}
@@ -531,11 +513,6 @@ Call.prototype = {
var attachments = replayableCall.attachments();
if (attachments)
this._attachments = TypeUtils.cloneObject(attachments);
-
- var thisResource = Resource.forObject(replayObject);
- if (thisResource)
- thisResource.onCallReplayed(this);
-
return this;
}
}
@@ -801,7 +778,7 @@ Resource.prototype = {
},
/**
- * @return {!Array.<!Call>}
+ * @return {!Array.<Call>}
*/
calls: function()
{
@@ -845,7 +822,6 @@ Resource.prototype = {
var pname = statePropertyNames[i];
result.push({ name: pname, value: proxyObject[pname] });
}
- result.push({ name: "context", value: this.contextResource() });
return result;
},
@@ -935,14 +911,6 @@ Resource.prototype = {
},
/**
- * @param {!Call} call
- */
- onCallReplayed: function(call)
- {
- // Ignore by default.
- },
-
- /**
* @param {!Object} object
*/
_bindObjectToResource: function(object)
@@ -993,7 +961,7 @@ Resource.prototype = {
proxy[property] = this._wrapCustomFunction(this, wrappedObject, wrappedObject[property], property, customWrapFunction);
else
proxy[property] = this._wrapFunction(this, wrappedObject, wrappedObject[property], property);
- } else if (TypeUtils.isEnumPropertyName(property, wrappedObject)) {
+ } else if (/^[A-Z0-9_]+$/.test(property) && typeof wrappedObject[property] === "number") {
// Fast access to enums and constants.
proxy[property] = wrappedObject[property];
} else {
@@ -1389,8 +1357,8 @@ WebGLBoundResource.prototype = {
*/
pushBinding: function(target, bindMethodName)
{
- if (this._state.bindTarget !== target) {
- this._state.bindTarget = target;
+ if (this._state.BINDING !== target) {
+ this._state.BINDING = target;
this.pushCall(new Call(WebGLRenderingContextResource.forObject(this), bindMethodName, [target, this]));
}
},
@@ -1411,66 +1379,6 @@ function WebGLTextureResource(wrappedObject, name)
WebGLTextureResource.prototype = {
/**
- * @override (overrides @return type)
- * @return {WebGLTexture}
- */
- wrappedObject: function()
- {
- return this._wrappedObject;
- },
-
- /**
- * @override
- * @return {!Array.<TypeUtils.InternalResourceStateDescriptor>}
- */
- currentState: function()
- {
- var result = [];
- var glResource = WebGLRenderingContextResource.forObject(this);
- var gl = glResource.wrappedObject();
- var texture = this.wrappedObject();
- if (!gl || !texture)
- return result;
- result.push({ name: "isTexture", value: gl.isTexture(texture) });
- result.push({ name: "context", value: this.contextResource() });
-
- var target = this._state.bindTarget;
- if (typeof target !== "number")
- return result;
-
- var bindingParameter;
- switch (target) {
- case gl.TEXTURE_2D:
- bindingParameter = gl.TEXTURE_BINDING_2D;
- break;
- case gl.TEXTURE_CUBE_MAP:
- bindingParameter = gl.TEXTURE_BINDING_CUBE_MAP;
- break;
- default:
- console.error("ASSERT_NOT_REACHED: unknown texture target " + target);
- return result;
- }
- result.push({ name: "target", value: target, valueIsEnum: true });
-
- var oldTexture = /** @type {WebGLTexture} */ (gl.getParameter(bindingParameter));
- if (oldTexture !== texture)
- gl.bindTexture(target, texture);
-
- var textureParameters = [
- "TEXTURE_MAG_FILTER",
- "TEXTURE_MIN_FILTER",
- "TEXTURE_WRAP_S",
- "TEXTURE_WRAP_T",
- "TEXTURE_MAX_ANISOTROPY_EXT" // EXT_texture_filter_anisotropic extension
- ];
- glResource.queryStateValues(gl.getTexParameter, target, textureParameters, result);
-
- if (oldTexture !== texture)
- gl.bindTexture(target, oldTexture);
- return result;
- },
-
- /**
* @override
* @param {!Object} data
* @param {!Cache.<Resource>} cache
@@ -1572,83 +1480,18 @@ WebGLProgramResource.prototype = {
/**
* @override
- * @return {!Array.<TypeUtils.InternalResourceStateDescriptor>}
+ * @param {!Object} data
+ * @param {!Cache.<ReplayableResource>} cache
*/
- currentState: function()
+ _populateReplayableData: function(data, cache)
{
- /**
- * @param {!Object} obj
- * @param {!Array.<TypeUtils.InternalResourceStateDescriptor>} output
- */
- function convertToStateDescriptors(obj, output)
- {
- for (var pname in obj)
- output.push({ name: pname, value: obj[pname], valueIsEnum: (pname === "type") });
- }
-
- var result = [];
- var program = this.wrappedObject();
- if (!program)
- return result;
var glResource = WebGLRenderingContextResource.forObject(this);
var gl = glResource.wrappedObject();
- var programParameters = ["DELETE_STATUS", "LINK_STATUS", "VALIDATE_STATUS"];
- glResource.queryStateValues(gl.getProgramParameter, program, programParameters, result);
- result.push({ name: "getProgramInfoLog", value: gl.getProgramInfoLog(program) });
- result.push({ name: "isProgram", value: gl.isProgram(program) });
- result.push({ name: "context", value: this.contextResource() });
-
- // ATTACHED_SHADERS
- var callFormatter = CallFormatter.forResource(this);
- var shaders = gl.getAttachedShaders(program) || [];
- var shaderDescriptors = [];
- for (var i = 0, n = shaders.length; i < n; ++i) {
- var shaderResource = Resource.forObject(shaders[i]);
- var pname = callFormatter.enumNameForValue(shaderResource.type());
- shaderDescriptors.push({ name: pname, value: shaderResource });
- }
- result.push({ name: "ATTACHED_SHADERS", values: shaderDescriptors, isArray: true });
-
- // ACTIVE_UNIFORMS
- var uniformDescriptors = [];
- var uniforms = this._activeUniforms(true);
- for (var i = 0, n = uniforms.length; i < n; ++i) {
- var pname = "" + i;
- var values = [];
- convertToStateDescriptors(uniforms[i], values);
- uniformDescriptors.push({ name: pname, values: values });
- }
- result.push({ name: "ACTIVE_UNIFORMS", values: uniformDescriptors, isArray: true });
-
- // ACTIVE_ATTRIBUTES
- var attributesCount = /** @type {number} */ (gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES));
- var attributeDescriptors = [];
- for (var i = 0; i < attributesCount; ++i) {
- var activeInfo = gl.getActiveAttrib(program, i);
- if (!activeInfo)
- continue;
- var pname = "" + i;
- var values = [];
- convertToStateDescriptors(activeInfo, values);
- attributeDescriptors.push({ name: pname, values: values });
- }
- result.push({ name: "ACTIVE_ATTRIBUTES", values: attributeDescriptors, isArray: true });
+ var program = this.wrappedObject();
- return result;
- },
+ var originalErrors = glResource.getAllErrors();
- /**
- * @param {boolean=} includeAllInfo
- * @return {!Array.<{name:string, type:number, value:*, size:(number|undefined)}>}
- */
- _activeUniforms: function(includeAllInfo)
- {
var uniforms = [];
- var program = this.wrappedObject();
- if (!program)
- return uniforms;
-
- var gl = WebGLRenderingContextResource.forObject(this).wrappedObject();
var uniformsCount = /** @type {number} */ (gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS));
for (var i = 0; i < uniformsCount; ++i) {
var activeInfo = gl.getActiveUniform(program, i);
@@ -1658,27 +1501,14 @@ WebGLProgramResource.prototype = {
if (!uniformLocation)
continue;
var value = gl.getUniform(program, uniformLocation);
- var item = Object.create(null);
- item.name = activeInfo.name;
- item.type = activeInfo.type;
- item.value = value;
- if (includeAllInfo)
- item.size = activeInfo.size;
- uniforms.push(item);
+ uniforms.push({
+ name: activeInfo.name,
+ type: activeInfo.type,
+ value: value
+ });
}
- return uniforms;
- },
+ data.uniforms = uniforms;
- /**
- * @override
- * @param {!Object} data
- * @param {!Cache.<ReplayableResource>} cache
- */
- _populateReplayableData: function(data, cache)
- {
- var glResource = WebGLRenderingContextResource.forObject(this);
- var originalErrors = glResource.getAllErrors();
- data.uniforms = this._activeUniforms();
glResource.restoreErrors(originalErrors);
},
@@ -1775,15 +1605,6 @@ function WebGLShaderResource(wrappedObject, name)
WebGLShaderResource.prototype = {
/**
- * @override (overrides @return type)
- * @return {WebGLShader}
- */
- wrappedObject: function()
- {
- return this._wrappedObject;
- },
-
- /**
* @return {number}
*/
type: function()
@@ -1797,36 +1618,6 @@ WebGLShaderResource.prototype = {
/**
* @override
- * @return {!Array.<TypeUtils.InternalResourceStateDescriptor>}
- */
- currentState: function()
- {
- var result = [];
- var shader = this.wrappedObject();
- if (!shader)
- return result;
- var glResource = WebGLRenderingContextResource.forObject(this);
- var gl = glResource.wrappedObject();
- var shaderParameters = ["SHADER_TYPE", "DELETE_STATUS", "COMPILE_STATUS"];
- glResource.queryStateValues(gl.getShaderParameter, shader, shaderParameters, result);
- result.push({ name: "getShaderInfoLog", value: gl.getShaderInfoLog(shader) });
- result.push({ name: "getShaderSource", value: gl.getShaderSource(shader) });
- result.push({ name: "isShader", value: gl.isShader(shader) });
- result.push({ name: "context", value: this.contextResource() });
-
- // getShaderPrecisionFormat
- var shaderType = this.type();
- var precisionValues = [];
- var precisionParameters = ["LOW_FLOAT", "MEDIUM_FLOAT", "HIGH_FLOAT", "LOW_INT", "MEDIUM_INT", "HIGH_INT"];
- for (var i = 0, pname; pname = precisionParameters[i]; ++i)
- precisionValues.push({ name: pname, value: gl.getShaderPrecisionFormat(shaderType, gl[pname]) });
- result.push({ name: "getShaderPrecisionFormat", values: precisionValues });
-
- return result;
- },
-
- /**
- * @override
* @param {!Call} call
*/
pushCall: function(call)
@@ -1852,60 +1643,6 @@ function WebGLBufferResource(wrappedObject, name)
WebGLBufferResource.prototype = {
/**
- * @override (overrides @return type)
- * @return {WebGLBuffer}
- */
- wrappedObject: function()
- {
- return this._wrappedObject;
- },
-
- /**
- * @override
- * @return {!Array.<TypeUtils.InternalResourceStateDescriptor>}
- */
- currentState: function()
- {
- var result = [];
- var glResource = WebGLRenderingContextResource.forObject(this);
- var gl = glResource.wrappedObject();
- var buffer = this.wrappedObject();
- if (!gl || !buffer)
- return result;
- result.push({ name: "isBuffer", value: gl.isBuffer(buffer) });
- result.push({ name: "context", value: this.contextResource() });
-
- var target = this._state.bindTarget;
- if (typeof target !== "number")
- return result;
-
- var bindingParameter;
- switch (target) {
- case gl.ARRAY_BUFFER:
- bindingParameter = gl.ARRAY_BUFFER_BINDING;
- break;
- case gl.ELEMENT_ARRAY_BUFFER:
- bindingParameter = gl.ELEMENT_ARRAY_BUFFER_BINDING;
- break;
- default:
- console.error("ASSERT_NOT_REACHED: unknown buffer target " + target);
- return result;
- }
- result.push({ name: "target", value: target, valueIsEnum: true });
-
- var oldBuffer = /** @type {WebGLBuffer} */ (gl.getParameter(bindingParameter));
- if (oldBuffer !== buffer)
- gl.bindBuffer(target, buffer);
-
- var bufferParameters = ["BUFFER_SIZE", "BUFFER_USAGE"];
- glResource.queryStateValues(gl.getBufferParameter, target, bufferParameters, result);
-
- if (oldBuffer !== buffer)
- gl.bindBuffer(target, oldBuffer);
- return result;
- },
-
- /**
* @override
* @param {!Call} call
*/
@@ -1932,50 +1669,6 @@ function WebGLFramebufferResource(wrappedObject, name)
WebGLFramebufferResource.prototype = {
/**
- * @override (overrides @return type)
- * @return {WebGLFramebuffer}
- */
- wrappedObject: function()
- {
- return this._wrappedObject;
- },
-
- /**
- * @override
- * @return {!Array.<TypeUtils.InternalResourceStateDescriptor>}
- */
- currentState: function()
- {
- var result = [];
- var framebuffer = this.wrappedObject();
- if (!framebuffer)
- return result;
- var gl = WebGLRenderingContextResource.forObject(this).wrappedObject();
-
- var oldFramebuffer = /** @type {WebGLFramebuffer} */ (gl.getParameter(gl.FRAMEBUFFER_BINDING));
- if (oldFramebuffer !== framebuffer)
- gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
-
- var attachmentParameters = ["COLOR_ATTACHMENT0", "DEPTH_ATTACHMENT", "STENCIL_ATTACHMENT"];
- var framebufferParameters = ["FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE", "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME", "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL", "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"];
- for (var i = 0, attachment; attachment = attachmentParameters[i]; ++i) {
- var values = [];
- for (var j = 0, pname; pname = framebufferParameters[j]; ++j) {
- var value = gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl[attachment], gl[pname]);
- value = Resource.forObject(value) || value;
- values.push({ name: pname, value: value, valueIsEnum: WebGLRenderingContextResource.GetResultIsEnum[pname] });
- }
- result.push({ name: attachment, values: values });
- }
- result.push({ name: "isFramebuffer", value: gl.isFramebuffer(framebuffer) });
- result.push({ name: "context", value: this.contextResource() });
-
- if (oldFramebuffer !== framebuffer)
- gl.bindFramebuffer(gl.FRAMEBUFFER, oldFramebuffer);
- return result;
- },
-
- /**
* @override
* @param {!Call} call
*/
@@ -2001,42 +1694,6 @@ function WebGLRenderbufferResource(wrappedObject, name)
WebGLRenderbufferResource.prototype = {
/**
- * @override (overrides @return type)
- * @return {WebGLRenderbuffer}
- */
- wrappedObject: function()
- {
- return this._wrappedObject;
- },
-
- /**
- * @override
- * @return {!Array.<TypeUtils.InternalResourceStateDescriptor>}
- */
- currentState: function()
- {
- var result = [];
- var renderbuffer = this.wrappedObject();
- if (!renderbuffer)
- return result;
- var glResource = WebGLRenderingContextResource.forObject(this);
- var gl = glResource.wrappedObject();
-
- var oldRenderbuffer = /** @type {WebGLRenderbuffer} */ (gl.getParameter(gl.RENDERBUFFER_BINDING));
- if (oldRenderbuffer !== renderbuffer)
- gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);
-
- var renderbufferParameters = ["RENDERBUFFER_WIDTH", "RENDERBUFFER_HEIGHT", "RENDERBUFFER_INTERNAL_FORMAT", "RENDERBUFFER_RED_SIZE", "RENDERBUFFER_GREEN_SIZE", "RENDERBUFFER_BLUE_SIZE", "RENDERBUFFER_ALPHA_SIZE", "RENDERBUFFER_DEPTH_SIZE", "RENDERBUFFER_STENCIL_SIZE"];
- glResource.queryStateValues(gl.getRenderbufferParameter, gl.RENDERBUFFER, renderbufferParameters, result);
- result.push({ name: "isRenderbuffer", value: gl.isRenderbuffer(renderbuffer) });
- result.push({ name: "context", value: this.contextResource() });
-
- if (oldRenderbuffer !== renderbuffer)
- gl.bindRenderbuffer(gl.RENDERBUFFER, oldRenderbuffer);
- return result;
- },
-
- /**
* @override
* @param {!Call} call
*/
@@ -2051,122 +1708,6 @@ WebGLRenderbufferResource.prototype = {
/**
* @constructor
- * @extends {Resource}
- * @param {!Object} wrappedObject
- * @param {string} name
- */
-function WebGLUniformLocationResource(wrappedObject, name)
-{
- Resource.call(this, wrappedObject, name);
-}
-
-WebGLUniformLocationResource.prototype = {
- /**
- * @override (overrides @return type)
- * @return {WebGLUniformLocation}
- */
- wrappedObject: function()
- {
- return this._wrappedObject;
- },
-
- /**
- * @return {WebGLProgramResource}
- */
- program: function()
- {
- var call = this._calls[0];
- if (call && call.functionName() === "getUniformLocation")
- return /** @type {WebGLProgramResource} */ (Resource.forObject(call.args()[0]));
- console.error("ASSERT_NOT_REACHED: Failed to restore WebGLUniformLocation from the log.", call);
- return null;
- },
-
- /**
- * @return {string}
- */
- name: function()
- {
- var call = this._calls[0];
- if (call && call.functionName() === "getUniformLocation")
- return call.args()[1];
- console.error("ASSERT_NOT_REACHED: Failed to restore WebGLUniformLocation from the log.", call);
- return "";
- },
-
- /**
- * @override
- * @return {!Array.<TypeUtils.InternalResourceStateDescriptor>}
- */
- currentState: function()
- {
- var result = [];
- var location = this.wrappedObject();
- if (!location)
- return result;
- var programResource = this.program();
- var program = programResource && programResource.wrappedObject();
- if (!program)
- return result;
- var gl = WebGLRenderingContextResource.forObject(this).wrappedObject();
- var uniformValue = gl.getUniform(program, location);
- var name = this.name();
- result.push({ name: "name", value: name });
- result.push({ name: "program", value: programResource });
- result.push({ name: "value", value: uniformValue });
- result.push({ name: "context", value: this.contextResource() });
-
- if (typeof this._type !== "number") {
- var altName = name + "[0]";
- var uniformsCount = /** @type {number} */ (gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS));
- for (var i = 0; i < uniformsCount; ++i) {
- var activeInfo = gl.getActiveUniform(program, i);
- if (!activeInfo)
- continue;
- if (activeInfo.name === name || activeInfo.name === altName) {
- this._type = activeInfo.type;
- this._size = activeInfo.size;
- if (activeInfo.name === name)
- break;
- }
- }
- }
- if (typeof this._type === "number")
- result.push({ name: "type", value: this._type, valueIsEnum: true });
- if (typeof this._size === "number")
- result.push({ name: "size", value: this._size });
-
- return result;
- },
-
- /**
- * @override
- * @param {!Object} data
- * @param {!Cache.<ReplayableResource>} cache
- */
- _populateReplayableData: function(data, cache)
- {
- data.type = this._type;
- data.size = this._size;
- },
-
- /**
- * @override
- * @param {!Object} data
- * @param {!Cache.<Resource>} cache
- */
- _doReplayCalls: function(data, cache)
- {
- this._type = data.type;
- this._size = data.size;
- Resource.prototype._doReplayCalls.call(this, data, cache);
- },
-
- __proto__: Resource.prototype
-}
-
-/**
- * @constructor
* @extends {ContextResource}
* @param {!WebGLRenderingContext} glContext
*/
@@ -2175,10 +1716,8 @@ function WebGLRenderingContextResource(glContext)
ContextResource.call(this, glContext, "WebGLRenderingContext");
/** @type {Object.<number, boolean>} */
this._customErrors = null;
- /** @type {!Object.<string, string>} */
+ /** @type {!Object.<string, boolean>} */
this._extensions = {};
- /** @type {!Object.<string, number>} */
- this._extensionEnums = {};
}
/**
@@ -2232,7 +1771,6 @@ WebGLRenderingContextResource.StateParameters = [
"DEPTH_RANGE",
"DEPTH_WRITEMASK",
"ELEMENT_ARRAY_BUFFER_BINDING",
- "FRAGMENT_SHADER_DERIVATIVE_HINT_OES", // OES_standard_derivatives extension
"FRAMEBUFFER_BINDING",
"FRONT_FACE",
"GENERATE_MIPMAP_HINT",
@@ -2263,56 +1801,10 @@ WebGLRenderingContextResource.StateParameters = [
"UNPACK_COLORSPACE_CONVERSION_WEBGL",
"UNPACK_FLIP_Y_WEBGL",
"UNPACK_PREMULTIPLY_ALPHA_WEBGL",
- "VERTEX_ARRAY_BINDING_OES", // OES_vertex_array_object extension
"VIEWPORT"
];
/**
- * True for those enums that return also an enum via a getter API method (e.g. getParameter, getShaderParameter, etc.).
- * @const
- * @type {!Object.<string, boolean>}
- */
-WebGLRenderingContextResource.GetResultIsEnum = TypeUtils.createPrefixedPropertyNamesSet([
- // gl.getParameter()
- "ACTIVE_TEXTURE",
- "BLEND_DST_ALPHA",
- "BLEND_DST_RGB",
- "BLEND_EQUATION_ALPHA",
- "BLEND_EQUATION_RGB",
- "BLEND_SRC_ALPHA",
- "BLEND_SRC_RGB",
- "CULL_FACE_MODE",
- "DEPTH_FUNC",
- "FRONT_FACE",
- "GENERATE_MIPMAP_HINT",
- "FRAGMENT_SHADER_DERIVATIVE_HINT_OES",
- "STENCIL_BACK_FAIL",
- "STENCIL_BACK_FUNC",
- "STENCIL_BACK_PASS_DEPTH_FAIL",
- "STENCIL_BACK_PASS_DEPTH_PASS",
- "STENCIL_FAIL",
- "STENCIL_FUNC",
- "STENCIL_PASS_DEPTH_FAIL",
- "STENCIL_PASS_DEPTH_PASS",
- "UNPACK_COLORSPACE_CONVERSION_WEBGL",
- // gl.getBufferParameter()
- "BUFFER_USAGE",
- // gl.getFramebufferAttachmentParameter()
- "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE",
- // gl.getRenderbufferParameter()
- "RENDERBUFFER_INTERNAL_FORMAT",
- // gl.getTexParameter()
- "TEXTURE_MAG_FILTER",
- "TEXTURE_MIN_FILTER",
- "TEXTURE_WRAP_S",
- "TEXTURE_WRAP_T",
- // gl.getShaderParameter()
- "SHADER_TYPE",
- // gl.getVertexAttrib()
- "VERTEX_ATTRIB_ARRAY_TYPE"
-]);
-
-/**
* @const
* @type {!Object.<string, boolean>}
*/
@@ -2429,51 +1921,11 @@ WebGLRenderingContextResource.prototype = {
/**
* @param {string} name
- * @param {Object} obj
*/
- registerWebGLExtension: function(name, obj)
+ addExtension: function(name)
{
// FIXME: Wrap OES_vertex_array_object extension.
- var lowerName = name.toLowerCase();
- if (obj && !this._extensions[lowerName]) {
- this._extensions[lowerName] = name;
- for (var property in obj) {
- if (TypeUtils.isEnumPropertyName(property, obj))
- this._extensionEnums[property] = /** @type {number} */ (obj[property]);
- }
- }
- },
-
- /**
- * @param {string} name
- * @return {number|undefined}
- */
- _enumValueForName: function(name)
- {
- if (typeof this._extensionEnums[name] === "number")
- return this._extensionEnums[name];
- var gl = this.wrappedObject();
- return (typeof gl[name] === "number" ? gl[name] : undefined);
- },
-
- /**
- * @param {function(this:WebGLRenderingContext, T, number):*} func
- * @param {T} targetOrWebGLObject
- * @param {!Array.<string>} pnames
- * @param {!Array.<TypeUtils.InternalResourceStateDescriptor>} output
- * @template T
- */
- queryStateValues: function(func, targetOrWebGLObject, pnames, output)
- {
- var gl = this.wrappedObject();
- for (var i = 0, pname; pname = pnames[i]; ++i) {
- var enumValue = this._enumValueForName(pname);
- if (typeof enumValue !== "number")
- continue;
- var value = func.call(gl, targetOrWebGLObject, enumValue);
- value = Resource.forObject(value) || value;
- output.push({ name: pname, value: value, valueIsEnum: WebGLRenderingContextResource.GetResultIsEnum[pname] });
- }
+ this._extensions[name.toLowerCase()] = true;
},
/**
@@ -2489,10 +1941,9 @@ WebGLRenderingContextResource.prototype = {
function convertToStateDescriptors(obj, output)
{
for (var pname in obj)
- output.push({ name: pname, value: obj[pname], valueIsEnum: WebGLRenderingContextResource.GetResultIsEnum[pname] });
+ output.push({ name: pname, value: obj[pname] });
}
- var gl = this.wrappedObject();
var glState = this._internalCurrentState(null);
// VERTEX_ATTRIB_ARRAYS
@@ -2517,30 +1968,13 @@ WebGLRenderingContextResource.prototype = {
var result = [];
convertToStateDescriptors(glState, result);
- result.push({ name: "VERTEX_ATTRIB_ARRAYS", values: vertexAttribStates, isArray: true });
- result.push({ name: "TEXTURE_UNITS", values: textureUnits, isArray: true });
-
- var textureBindingParameters = ["TEXTURE_BINDING_2D", "TEXTURE_BINDING_CUBE_MAP"];
- for (var i = 0, pname; pname = textureBindingParameters[i]; ++i) {
- var value = gl.getParameter(gl[pname]);
- value = Resource.forObject(value) || value;
- result.push({ name: pname, value: value });
- }
-
- // ENABLED_EXTENSIONS
- var enabledExtensions = [];
- for (var lowerName in this._extensions) {
- var pname = this._extensions[lowerName];
- var value = gl.getExtension(pname);
- value = Resource.forObject(value) || value;
- enabledExtensions.push({ name: pname, value: value });
- }
- result.push({ name: "ENABLED_EXTENSIONS", values: enabledExtensions, isArray: true });
-
+ result.push({ name: "VERTEX_ATTRIB_ARRAYS[" + vertexAttribStates.length + "]", values: vertexAttribStates });
+ result.push({ name: "TEXTURE_UNITS[" + textureUnits.length + "]", values: textureUnits });
return result;
},
/**
+ * @override
* @param {?Cache.<ReplayableResource>} cache
* @return {!Object.<string, *>}
*/
@@ -2563,33 +1997,20 @@ WebGLRenderingContextResource.prototype = {
WebGLRenderingContextResource.GLCapabilities.forEach(function(parameter) {
glState[parameter] = gl.isEnabled(gl[parameter]);
});
- for (var i = 0, pname; pname = WebGLRenderingContextResource.StateParameters[i]; ++i) {
- var enumValue = this._enumValueForName(pname);
- if (typeof enumValue === "number")
- glState[pname] = maybeToReplayable(gl.getParameter(enumValue));
- }
+ WebGLRenderingContextResource.StateParameters.forEach(function(parameter) {
+ glState[parameter] = maybeToReplayable(gl.getParameter(gl[parameter]));
+ });
// VERTEX_ATTRIB_ARRAYS
var maxVertexAttribs = /** @type {number} */ (gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
- var vertexAttribParameters = [
- "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING",
- "VERTEX_ATTRIB_ARRAY_ENABLED",
- "VERTEX_ATTRIB_ARRAY_SIZE",
- "VERTEX_ATTRIB_ARRAY_STRIDE",
- "VERTEX_ATTRIB_ARRAY_TYPE",
- "VERTEX_ATTRIB_ARRAY_NORMALIZED",
- "CURRENT_VERTEX_ATTRIB",
- "VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE" // ANGLE_instanced_arrays extension
- ];
+ var vertexAttribParameters = ["VERTEX_ATTRIB_ARRAY_BUFFER_BINDING", "VERTEX_ATTRIB_ARRAY_ENABLED", "VERTEX_ATTRIB_ARRAY_SIZE", "VERTEX_ATTRIB_ARRAY_STRIDE", "VERTEX_ATTRIB_ARRAY_TYPE", "VERTEX_ATTRIB_ARRAY_NORMALIZED", "CURRENT_VERTEX_ATTRIB"];
var vertexAttribStates = [];
- for (var index = 0; index < maxVertexAttribs; ++index) {
+ for (var i = 0; i < maxVertexAttribs; ++i) {
var state = Object.create(null);
- for (var i = 0, pname; pname = vertexAttribParameters[i]; ++i) {
- var enumValue = this._enumValueForName(pname);
- if (typeof enumValue === "number")
- state[pname] = maybeToReplayable(gl.getVertexAttrib(index, enumValue));
- }
- state.VERTEX_ATTRIB_ARRAY_POINTER = gl.getVertexAttribOffset(index, gl.VERTEX_ATTRIB_ARRAY_POINTER);
+ vertexAttribParameters.forEach(function(attribParameter) {
+ state[attribParameter] = maybeToReplayable(gl.getVertexAttrib(i, gl[attribParameter]));
+ });
+ state.VERTEX_ATTRIB_ARRAY_POINTER = gl.getVertexAttribOffset(i, gl.VERTEX_ATTRIB_ARRAY_POINTER);
vertexAttribStates.push(state);
}
glState.VERTEX_ATTRIB_ARRAYS = vertexAttribStates;
@@ -2623,7 +2044,6 @@ WebGLRenderingContextResource.prototype = {
data.originalCanvas = gl.canvas;
data.originalContextAttributes = gl.getContextAttributes();
data.extensions = TypeUtils.cloneObject(this._extensions);
- data.extensionEnums = TypeUtils.cloneObject(this._extensionEnums);
data.glState = this._internalCurrentState(cache);
},
@@ -2636,7 +2056,6 @@ WebGLRenderingContextResource.prototype = {
{
this._customErrors = null;
this._extensions = TypeUtils.cloneObject(data.extensions) || {};
- this._extensionEnums = TypeUtils.cloneObject(data.extensionEnums) || {};
var canvas = data.originalCanvas.cloneNode(true);
var replayContext = null;
@@ -2684,10 +2103,6 @@ WebGLRenderingContextResource.prototype = {
gl.hint(gl.GENERATE_MIPMAP_HINT, glState.GENERATE_MIPMAP_HINT);
gl.lineWidth(glState.LINE_WIDTH);
- var enumValue = this._enumValueForName("FRAGMENT_SHADER_DERIVATIVE_HINT_OES");
- if (typeof enumValue === "number")
- gl.hint(enumValue, glState.FRAGMENT_SHADER_DERIVATIVE_HINT_OES);
-
WebGLRenderingContextResource.PixelStoreParameters.forEach(function(parameter) {
gl.pixelStorei(gl[parameter], glState[parameter]);
});
@@ -2795,30 +2210,6 @@ WebGLRenderingContextResource.prototype = {
/**
* @override
- * @param {!Call} call
- */
- onCallReplayed: function(call)
- {
- var functionName = call.functionName();
- var args = call.args();
- switch (functionName) {
- case "bindBuffer":
- case "bindFramebuffer":
- case "bindRenderbuffer":
- case "bindTexture":
- // Update BINDING state for Resources in the replay world.
- var resource = Resource.forObject(args[1]);
- if (resource)
- resource.pushBinding(args[0], functionName);
- break;
- case "getExtension":
- this.registerWebGLExtension(args[0], /** @type {Object} */ (call.result()));
- break;
- }
- },
-
- /**
- * @override
* @return {!Object.<string, Function>}
*/
_customWrapFunctions: function()
@@ -2833,7 +2224,7 @@ WebGLRenderingContextResource.prototype = {
wrapFunctions["createTexture"] = Resource.WrapFunction.resourceFactoryMethod(WebGLTextureResource, "WebGLTexture");
wrapFunctions["createFramebuffer"] = Resource.WrapFunction.resourceFactoryMethod(WebGLFramebufferResource, "WebGLFramebuffer");
wrapFunctions["createRenderbuffer"] = Resource.WrapFunction.resourceFactoryMethod(WebGLRenderbufferResource, "WebGLRenderbuffer");
- wrapFunctions["getUniformLocation"] = Resource.WrapFunction.resourceFactoryMethod(WebGLUniformLocationResource, "WebGLUniformLocation");
+ wrapFunctions["getUniformLocation"] = Resource.WrapFunction.resourceFactoryMethod(Resource, "WebGLUniformLocation");
/**
* @param {string} methodName
@@ -2903,7 +2294,7 @@ WebGLRenderingContextResource.prototype = {
*/
wrapFunctions["getExtension"] = function(name)
{
- this._resource.registerWebGLExtension(name, this.result());
+ this._resource.addExtension(name);
}
//
@@ -2949,7 +2340,6 @@ WebGLRenderingContextResource.prototype = {
*/
wrapFunctions["bindBuffer"] = wrapFunctions["bindFramebuffer"] = wrapFunctions["bindRenderbuffer"] = function(target, obj)
{
- this._resource.currentBinding(target); // To call WebGLBoundResource.prototype.pushBinding().
this._resource._registerBoundResource("__bindBuffer_" + target, obj);
}
/**
@@ -2959,7 +2349,6 @@ WebGLRenderingContextResource.prototype = {
*/
wrapFunctions["bindTexture"] = function(target, obj)
{
- this._resource.currentBinding(target); // To call WebGLBoundResource.prototype.pushBinding().
var gl = /** @type {WebGLRenderingContext} */ (this._originalObject);
var currentTextureBinding = /** @type {number} */ (gl.getParameter(gl.ACTIVE_TEXTURE));
this._resource._registerBoundResource("__bindTexture_" + target + "_" + currentTextureBinding, obj);
@@ -3108,7 +2497,6 @@ CanvasRenderingContext2DResource.prototype = {
var state = this._internalCurrentState(null);
for (var pname in state)
result.push({ name: pname, value: state[pname] });
- result.push({ name: "context", value: this.contextResource() });
return result;
},
@@ -3428,36 +2816,31 @@ function CallFormatter(drawingMethodNames)
CallFormatter.prototype = {
/**
* @param {!ReplayableCall} replayableCall
- * @param {string=} objectGroup
* @return {!Object}
*/
- formatCall: function(replayableCall, objectGroup)
+ formatCall: function(replayableCall)
{
var result = {};
var functionName = replayableCall.functionName();
if (functionName) {
result.functionName = functionName;
- result.arguments = [];
- var args = replayableCall.args();
- for (var i = 0, n = args.length; i < n; ++i)
- result.arguments.push(this.formatValue(args[i], objectGroup));
+ result.arguments = replayableCall.args().map(this.formatValue.bind(this));
if (replayableCall.result() !== undefined)
- result.result = this.formatValue(replayableCall.result(), objectGroup);
+ result.result = this.formatValue(replayableCall.result());
if (this._drawingMethodNames[functionName])
result.isDrawingCall = true;
} else {
result.property = replayableCall.propertyName();
- result.value = this.formatValue(replayableCall.propertyValue(), objectGroup);
+ result.value = this.formatValue(replayableCall.propertyValue());
}
return result;
},
/**
* @param {*} value
- * @param {string=} objectGroup
* @return {!CanvasAgent.CallArgument}
*/
- formatValue: function(value, objectGroup)
+ formatValue: function(value)
{
if (value instanceof Resource || value instanceof ReplayableResource) {
return {
@@ -3466,70 +2849,31 @@ CallFormatter.prototype = {
};
}
- var remoteObject = injectedScript.wrapObject(value, objectGroup || "", true, false);
- var description = remoteObject.description || ("" + value);
-
+ var remoteObject = injectedScript.wrapObject(value, "", true, false);
var result = {
- description: description,
+ description: remoteObject.description || ("" + value),
type: /** @type {CanvasAgent.CallArgumentType} */ (remoteObject.type)
};
if (remoteObject.subtype)
result.subtype = /** @type {CanvasAgent.CallArgumentSubtype} */ (remoteObject.subtype);
- if (remoteObject.objectId) {
- if (objectGroup)
- result.remoteObject = remoteObject;
- else
- injectedScript.releaseObject(remoteObject.objectId);
- }
+ if (remoteObject.objectId)
+ injectedScript.releaseObject(remoteObject.objectId);
return result;
},
/**
- * @param {string} name
- * @return {?string}
- */
- enumValueForName: function(name)
- {
- return null;
- },
-
- /**
- * @param {number} value
- * @param {Array.<string>=} options
- * @return {?string}
- */
- enumNameForValue: function(value, options)
- {
- return null;
- },
-
- /**
* @param {!Array.<TypeUtils.InternalResourceStateDescriptor>} descriptors
- * @param {string=} objectGroup
* @return {!Array.<!CanvasAgent.ResourceStateDescriptor>}
*/
- formatResourceStateDescriptors: function(descriptors, objectGroup)
+ convertResourceStateDescriptors: function(descriptors)
{
var result = [];
for (var i = 0, n = descriptors.length; i < n; ++i) {
var d = descriptors[i];
- var item;
if (d.values)
- item = { name: d.name, values: this.formatResourceStateDescriptors(d.values, objectGroup) };
- else {
- item = { name: d.name, value: this.formatValue(d.value, objectGroup) };
- if (d.valueIsEnum && typeof d.value === "number") {
- var enumName = this.enumNameForValue(d.value);
- if (enumName)
- item.value.enumName = enumName;
- }
- }
- var enumValue = this.enumValueForName(d.name);
- if (enumValue)
- item.enumValueForName = enumValue;
- if (d.isArray)
- item.isArray = true;
- result.push(item);
+ result.push({ name: d.name, values: this.convertResourceStateDescriptors(d.values) });
+ else
+ result.push({ name: d.name, value: this.formatValue(d.value) });
}
return result;
}
@@ -3652,12 +2996,11 @@ WebGLCallFormatter.prototype = {
/**
* @override
* @param {!ReplayableCall} replayableCall
- * @param {string=} objectGroup
* @return {!Object}
*/
- formatCall: function(replayableCall, objectGroup)
+ formatCall: function(replayableCall)
{
- var result = CallFormatter.prototype.formatCall.call(this, replayableCall, objectGroup);
+ var result = CallFormatter.prototype.formatCall.call(this, replayableCall);
if (!result.functionName)
return result;
var enumsInfo = this._findEnumsInfo(replayableCall);
@@ -3667,52 +3010,23 @@ WebGLCallFormatter.prototype = {
for (var i = 0, n = enumArgsIndexes.length; i < n; ++i) {
var index = enumArgsIndexes[i];
var callArgument = result.arguments[index];
- this._formatEnumValue(callArgument, enumsInfo["hints"]);
+ if (callArgument && !isNaN(callArgument.description))
+ callArgument.description = this._enumValueToString(+callArgument.description, enumsInfo["hints"]) || callArgument.description;
}
var bitfieldArgsIndexes = enumsInfo["bitfield"] || [];
for (var i = 0, n = bitfieldArgsIndexes.length; i < n; ++i) {
var index = bitfieldArgsIndexes[i];
var callArgument = result.arguments[index];
- this._formatEnumBitmaskValue(callArgument, enumsInfo["hints"]);
+ if (callArgument && !isNaN(callArgument.description))
+ callArgument.description = this._enumBitmaskToString(+callArgument.description, enumsInfo["hints"]) || callArgument.description;
}
- if (enumsInfo.returnType === "enum")
- this._formatEnumValue(result.result, enumsInfo["hints"]);
- else if (enumsInfo.returnType === "bitfield")
- this._formatEnumBitmaskValue(result.result, enumsInfo["hints"]);
- return result;
- },
-
- /**
- * @override
- * @param {string} name
- * @return {?string}
- */
- enumValueForName: function(name)
- {
- this._initialize();
- if (name in this._enumNameToValue)
- return "" + this._enumNameToValue[name];
- return null;
- },
-
- /**
- * @override
- * @param {number} value
- * @param {Array.<string>=} options
- * @return {?string}
- */
- enumNameForValue: function(value, options)
- {
- this._initialize();
- options = options || [];
- for (var i = 0, n = options.length; i < n; ++i) {
- if (this._enumNameToValue[options[i]] === value)
- return options[i];
+ if (enumsInfo.returnType && result.result) {
+ if (enumsInfo.returnType === "enum")
+ result.result.description = this._enumValueToString(+result.result.description, enumsInfo["hints"]) || result.result.description;
+ else if (enumsInfo.returnType === "bitfield")
+ result.result.description = this._enumBitmaskToString(+result.result.description, enumsInfo["hints"]) || result.result.description;
}
- var names = this._enumValueToNames[value];
- if (!names || names.length !== 1)
- return null;
- return names[0];
+ return result;
},
/**
@@ -3749,30 +3063,34 @@ WebGLCallFormatter.prototype = {
},
/**
- * @param {?CanvasAgent.CallArgument|undefined} callArgument
+ * @param {number} value
* @param {Array.<string>=} options
+ * @return {string}
*/
- _formatEnumValue: function(callArgument, options)
+ _enumValueToString: function(value, options)
{
- if (!callArgument || isNaN(callArgument.description))
- return;
this._initialize();
- var value = +callArgument.description;
- var enumName = this.enumNameForValue(value, options);
- if (enumName)
- callArgument.enumName = enumName;
+ options = options || [];
+ for (var i = 0, n = options.length; i < n; ++i) {
+ if (this._enumNameToValue[options[i]] === value)
+ return options[i];
+ }
+ var names = this._enumValueToNames[value];
+ if (!names || names.length !== 1) {
+ console.warn("Ambiguous WebGL enum names for value " + value + ": " + names);
+ return "";
+ }
+ return names[0];
},
/**
- * @param {?CanvasAgent.CallArgument|undefined} callArgument
+ * @param {number} value
* @param {Array.<string>=} options
+ * @return {string}
*/
- _formatEnumBitmaskValue: function(callArgument, options)
+ _enumBitmaskToString: function(value, options)
{
- if (!callArgument || isNaN(callArgument.description))
- return;
this._initialize();
- var value = +callArgument.description;
options = options || [];
/** @type {!Array.<string>} */
var result = [];
@@ -3789,13 +3107,13 @@ WebGLCallFormatter.prototype = {
var names = this._enumValueToNames[bitValue];
if (!names || names.length !== 1) {
console.warn("Ambiguous WebGL enum names for value " + bitValue + ": " + names);
- return;
+ return "";
}
result.push(names[0]);
value = nextValue;
}
result.sort();
- callArgument.enumName = result.join(" | ");
+ return result.join(" | ");
},
_initialize: function()
@@ -3817,7 +3135,7 @@ WebGLCallFormatter.prototype = {
if (!obj)
return;
for (var property in obj) {
- if (TypeUtils.isEnumPropertyName(property, obj)) {
+ if (/^[A-Z0-9_]+$/.test(property) && typeof obj[property] === "number") {
var value = /** @type {number} */ (obj[property]);
this._enumNameToValue[property] = value;
var names = this._enumValueToNames[value];
@@ -4253,7 +3571,6 @@ InjectedCanvasModule.prototype = {
this._manager.dropTraceLog(traceLog);
delete this._traceLogs[id];
delete this._traceLogPlayers[id];
- injectedScript.releaseObjectGroup(id);
},
/**
@@ -4326,8 +3643,6 @@ InjectedCanvasModule.prototype = {
return "Error: Trace log with the given ID not found.";
this._traceLogPlayers[traceLogId] = this._traceLogPlayers[traceLogId] || new TraceLogPlayer(traceLog);
- injectedScript.releaseObjectGroup(traceLogId);
-
var beforeTime = TypeUtils.now();
var lastCall = this._traceLogPlayers[traceLogId].stepTo(stepNo);
var replayTime = Math.max(0, TypeUtils.now() - beforeTime);
@@ -4432,7 +3747,7 @@ InjectedCanvasModule.prototype = {
};
if (resource) {
result.imageURL = overrideImageURL || resource.toDataURL();
- result.descriptors = CallFormatter.forResource(resource).formatResourceStateDescriptors(resource.currentState(), traceLogId);
+ result.descriptors = CallFormatter.forResource(resource).convertResourceStateDescriptors(resource.currentState());
}
return result;
},
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InjectedScriptSource.js b/chromium/third_party/WebKit/Source/core/inspector/InjectedScriptSource.js
index 49b35ba0992..437ea48932c 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InjectedScriptSource.js
+++ b/chromium/third_party/WebKit/Source/core/inspector/InjectedScriptSource.js
@@ -939,7 +939,7 @@ InjectedScript.RemoteObject.prototype = {
* @param {Object} object
* @param {Array.<string>=} firstLevelKeys
* @param {?Array.<string>=} secondLevelKeys
- * @return {!RuntimeAgent.ObjectPreview} preview
+ * @return {Object} preview
*/
_generatePreview: function(object, firstLevelKeys, secondLevelKeys)
{
@@ -956,20 +956,20 @@ InjectedScript.RemoteObject.prototype = {
indexes: isTableRowsRequest ? 1000 : Math.max(100, firstLevelKeysCount)
};
for (var o = object; injectedScript._isDefined(o); o = o.__proto__)
- this._generateProtoPreview(/** @type {!Object} */ (o), preview, propertiesThreshold, firstLevelKeys, secondLevelKeys);
+ this._generateProtoPreview(o, preview, propertiesThreshold, firstLevelKeys, secondLevelKeys);
return preview;
},
/**
- * @param {!Object} object
- * @param {!RuntimeAgent.ObjectPreview} preview
- * @param {!Object} propertiesThreshold
+ * @param {Object} object
+ * @param {Object} preview
+ * @param {Object} propertiesThreshold
* @param {Array.<string>=} firstLevelKeys
* @param {Array.<string>=} secondLevelKeys
*/
_generateProtoPreview: function(object, preview, propertiesThreshold, firstLevelKeys, secondLevelKeys)
{
- var propertyNames = firstLevelKeys ? firstLevelKeys : Object.keys(object);
+ var propertyNames = firstLevelKeys ? firstLevelKeys : Object.keys(/** @type {!Object} */ (object));
try {
for (var i = 0; i < propertyNames.length; ++i) {
if (!propertiesThreshold.properties || !propertiesThreshold.indexes) {
@@ -981,7 +981,7 @@ InjectedScript.RemoteObject.prototype = {
if (this.subtype === "array" && name === "length")
continue;
- var descriptor = Object.getOwnPropertyDescriptor(object, name);
+ var descriptor = Object.getOwnPropertyDescriptor(/** @type {!Object} */ (object), name);
if (!("value" in descriptor) || !descriptor.enumerable) {
preview.lossless = false;
continue;
@@ -1036,9 +1036,9 @@ InjectedScript.RemoteObject.prototype = {
},
/**
- * @param {!RuntimeAgent.ObjectPreview} preview
- * @param {!Object} property
- * @param {!Object} propertiesThreshold
+ * @param {Object} preview
+ * @param {Object} property
+ * @param {Object} propertiesThreshold
*/
_appendPropertyPreview: function(preview, property, propertiesThreshold)
{
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorController.cpp b/chromium/third_party/WebKit/Source/core/inspector/InspectorController.cpp
index fdb31a51c32..a9cb37b199a 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorController.cpp
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorController.cpp
@@ -322,15 +322,6 @@ Node* InspectorController::highlightedNode() const
return m_overlay->highlightedNode();
}
-bool InspectorController::handleGestureEvent(Frame* frame, const PlatformGestureEvent& event)
-{
- // Overlay should not consume events.
- m_overlay->handleGestureEvent(event);
- if (InspectorDOMAgent* domAgent = m_instrumentingAgents->inspectorDOMAgent())
- return domAgent->handleGestureEvent(frame, event);
- return false;
-}
-
bool InspectorController::handleMouseEvent(Frame* frame, const PlatformMouseEvent& event)
{
// Overlay should not consume events.
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorController.h b/chromium/third_party/WebKit/Source/core/inspector/InspectorController.h
index 95f036886a2..42f224add2a 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorController.h
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorController.h
@@ -55,7 +55,6 @@ class InspectorState;
class InstrumentingAgents;
class IntSize;
class Page;
-class PlatformGestureEvent;
class PlatformMouseEvent;
class PlatformTouchEvent;
class PostWorkerNotificationToFrontendTask;
@@ -95,7 +94,6 @@ public:
void hideHighlight();
Node* highlightedNode() const;
- bool handleGestureEvent(Frame*, const PlatformGestureEvent&);
bool handleMouseEvent(Frame*, const PlatformMouseEvent&);
bool handleTouchEvent(Frame*, const PlatformTouchEvent&);
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp b/chromium/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
index 39976bdf548..a4f32e2453b 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
@@ -70,7 +70,6 @@
#include "core/page/Frame.h"
#include "core/page/FrameTree.h"
#include "core/page/Page.h"
-#include "core/platform/PlatformGestureEvent.h"
#include "core/platform/PlatformMouseEvent.h"
#include "core/platform/PlatformTouchEvent.h"
#include "core/rendering/HitTestResult.h"
@@ -163,11 +162,6 @@ static Node* hoveredNodeForPoint(Frame* frame, const IntPoint& point, bool ignor
return node;
}
-static Node* hoveredNodeForEvent(Frame* frame, const PlatformGestureEvent& event, bool ignorePointerEventsNone)
-{
- return hoveredNodeForPoint(frame, event.position(), ignorePointerEventsNone);
-}
-
static Node* hoveredNodeForEvent(Frame* frame, const PlatformMouseEvent& event, bool ignorePointerEventsNone)
{
return hoveredNodeForPoint(frame, event.position(), ignorePointerEventsNone);
@@ -1059,19 +1053,6 @@ bool InspectorDOMAgent::handleMousePress()
return false;
}
-bool InspectorDOMAgent::handleGestureEvent(Frame* frame, const PlatformGestureEvent& event)
-{
- if (m_searchingForNode == NotSearching || event.type() != PlatformEvent::GestureTap)
- return false;
- Node* node = hoveredNodeForEvent(frame, event, false);
- if (node && m_inspectModeHighlightConfig) {
- m_overlay->highlightNode(node, 0 /* eventTarget */, *m_inspectModeHighlightConfig);
- inspect(node);
- return true;
- }
- return false;
-}
-
bool InspectorDOMAgent::handleTouchEvent(Frame* frame, const PlatformTouchEvent& event)
{
if (m_searchingForNode == NotSearching)
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h b/chromium/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h
index 6cba33dc2fa..e0a0362425e 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h
@@ -60,7 +60,6 @@ class InspectorPageAgent;
class InspectorState;
class InstrumentingAgents;
class Node;
-class PlatformGestureEvent;
class PlatformTouchEvent;
class RevalidateStyleAttributeTask;
class ShadowRoot;
@@ -181,7 +180,6 @@ public:
PassRefPtr<TypeBuilder::Runtime::RemoteObject> resolveNode(Node*, const String& objectGroup);
bool handleMousePress();
- bool handleGestureEvent(Frame*, const PlatformGestureEvent&);
bool handleTouchEvent(Frame*, const PlatformTouchEvent&);
void handleMouseMove(Frame*, const PlatformMouseEvent&);
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp b/chromium/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp
index 19d838035b3..9f260a48355 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorDebuggerAgent.cpp
@@ -34,7 +34,6 @@
#include "InspectorFrontend.h"
#include "bindings/v8/ScriptDebugServer.h"
#include "bindings/v8/ScriptObject.h"
-#include "core/fetch/Resource.h"
#include "core/inspector/ContentSearchUtils.h"
#include "core/inspector/InjectedScript.h"
#include "core/inspector/InjectedScriptManager.h"
@@ -43,6 +42,7 @@
#include "core/inspector/InstrumentingAgents.h"
#include "core/inspector/ScriptArguments.h"
#include "core/inspector/ScriptCallStack.h"
+#include "core/loader/cache/Resource.h"
#include "core/platform/JSONValues.h"
#include "core/platform/text/RegularExpression.h"
#include "wtf/text/WTFString.h"
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorFrontendHost.cpp b/chromium/third_party/WebKit/Source/core/inspector/InspectorFrontendHost.cpp
index 6f0d3bf04bd..333afc2baca 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorFrontendHost.cpp
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorFrontendHost.cpp
@@ -247,7 +247,8 @@ void InspectorFrontendHost::showContextMenu(Event* event, const Vector<ContextMe
return;
}
RefPtr<FrontendMenuProvider> menuProvider = FrontendMenuProvider::create(this, frontendApiObject, items);
- m_frontendPage->contextMenuController().showContextMenu(event, menuProvider);
+ ContextMenuController* menuController = m_frontendPage->contextMenuController();
+ menuController->showContextMenu(event, menuProvider);
m_menuProvider = menuProvider.get();
}
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp b/chromium/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp
index 2f16ff13169..5cffed0ac74 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp
@@ -31,7 +31,6 @@
#include "config.h"
#include "core/inspector/InspectorInstrumentation.h"
-#include "core/fetch/FetchInitiatorInfo.h"
#include "core/inspector/InspectorAgent.h"
#include "core/inspector/InspectorCSSAgent.h"
#include "core/inspector/InspectorConsoleAgent.h"
@@ -42,6 +41,7 @@
#include "core/inspector/InspectorTimelineAgent.h"
#include "core/inspector/InstrumentingAgents.h"
#include "core/inspector/WorkerInspectorController.h"
+#include "core/loader/cache/FetchInitiatorInfo.h"
#include "core/workers/WorkerGlobalScope.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorOverlay.cpp b/chromium/third_party/WebKit/Source/core/inspector/InspectorOverlay.cpp
index 6ac89394e66..25ea756f3f4 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorOverlay.cpp
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorOverlay.cpp
@@ -255,14 +255,6 @@ void InspectorOverlay::invalidate()
m_client->highlight();
}
-bool InspectorOverlay::handleGestureEvent(const PlatformGestureEvent& event)
-{
- if (isEmpty())
- return false;
-
- return overlayPage()->mainFrame()->eventHandler()->handleGestureEvent(event);
-}
-
bool InspectorOverlay::handleMouseEvent(const PlatformMouseEvent& event)
{
if (isEmpty())
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorOverlay.h b/chromium/third_party/WebKit/Source/core/inspector/InspectorOverlay.h
index 2defc500952..a9863eeba81 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorOverlay.h
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorOverlay.h
@@ -49,7 +49,6 @@ class InspectorOverlayHost;
class JSONValue;
class Node;
class Page;
-class PlatformGestureEvent;
class PlatformMouseEvent;
class PlatformTouchEvent;
@@ -127,7 +126,6 @@ public:
void drawOutline(GraphicsContext*, const LayoutRect&, const Color&);
void getHighlight(Highlight*) const;
void resize(const IntSize&);
- bool handleGestureEvent(const PlatformGestureEvent&);
bool handleMouseEvent(const PlatformMouseEvent&);
bool handleTouchEvent(const PlatformTouchEvent&);
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp b/chromium/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp
index a428616881b..9a939cdd47f 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp
@@ -39,13 +39,6 @@
#include "core/dom/DeviceOrientationController.h"
#include "core/dom/Document.h"
#include "core/dom/UserGestureIndicator.h"
-#include "core/fetch/CSSStyleSheetResource.h"
-#include "core/fetch/FontResource.h"
-#include "core/fetch/ImageResource.h"
-#include "core/fetch/MemoryCache.h"
-#include "core/fetch/Resource.h"
-#include "core/fetch/ResourceFetcher.h"
-#include "core/fetch/ScriptResource.h"
#include "core/html/HTMLFrameOwnerElement.h"
#include "core/inspector/ContentSearchUtils.h"
#include "core/inspector/DOMPatchSupport.h"
@@ -61,6 +54,13 @@
#include "core/loader/FrameLoadRequest.h"
#include "core/loader/FrameLoader.h"
#include "core/loader/TextResourceDecoder.h"
+#include "core/loader/cache/CSSStyleSheetResource.h"
+#include "core/loader/cache/FontResource.h"
+#include "core/loader/cache/ImageResource.h"
+#include "core/loader/cache/MemoryCache.h"
+#include "core/loader/cache/Resource.h"
+#include "core/loader/cache/ResourceFetcher.h"
+#include "core/loader/cache/ScriptResource.h"
#include "core/page/Frame.h"
#include "core/page/FrameView.h"
#include "core/page/Page.h"
@@ -396,7 +396,7 @@ void InspectorPageAgent::disable(ErrorString*)
setShowPaintRects(0, false);
setShowDebugBorders(0, false);
setShowFPSCounter(0, false);
- setEmulatedMedia(0, String());
+ setEmulatedMedia(0, "");
setContinuousPaintingEnabled(0, false);
setShowScrollBottleneckRects(0, false);
setShowViewportSizeOnResize(0, false, 0);
@@ -693,7 +693,7 @@ bool InspectorPageAgent::deviceMetricsChanged(int width, int height, double font
// These two always fit an int.
int currentWidth = static_cast<int>(m_state->getLong(PageAgentState::pageAgentScreenWidthOverride));
int currentHeight = static_cast<int>(m_state->getLong(PageAgentState::pageAgentScreenHeightOverride));
- double currentFontScaleFactor = m_state->getDouble(PageAgentState::pageAgentFontScaleFactorOverride, 1);
+ double currentFontScaleFactor = m_state->getDouble(PageAgentState::pageAgentFontScaleFactorOverride);
bool currentFitWindow = m_state->getBoolean(PageAgentState::pageAgentFitWindow);
return width != currentWidth || height != currentHeight || fontScaleFactor != currentFontScaleFactor || fitWindow != currentFitWindow;
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.cpp b/chromium/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.cpp
index 953542430d8..d0375e75011 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.cpp
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorProfilerAgent.cpp
@@ -162,6 +162,7 @@ void InspectorProfilerAgent::getCPUProfile(ErrorString* errorString, int rawUid,
}
profileObject = TypeBuilder::Profiler::CPUProfile::create()
.setHead(it->value->buildInspectorObjectForHead())
+ .setIdleTime(it->value->idleTime())
.setStartTime(it->value->startTime())
.setEndTime(it->value->endTime());
profileObject->setSamples(it->value->buildInspectorObjectForSamples());
@@ -268,7 +269,6 @@ void InspectorProfilerAgent::willProcessTask()
{
if (!m_profileNameIdleTimeMap || !m_profileNameIdleTimeMap->size())
return;
- ScriptProfiler::setIdle(false);
if (!m_previousTaskEndTime)
return;
@@ -284,7 +284,6 @@ void InspectorProfilerAgent::didProcessTask()
if (!m_profileNameIdleTimeMap || !m_profileNameIdleTimeMap->size())
return;
m_previousTaskEndTime = WTF::monotonicallyIncreasingTime();
- ScriptProfiler::setIdle(true);
}
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp b/chromium/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
index 1b6317af76d..14c54bb35a2 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
@@ -36,10 +36,6 @@
#include "bindings/v8/ScriptCallStackFactory.h"
#include "core/dom/Document.h"
#include "core/dom/ScriptableDocumentParser.h"
-#include "core/fetch/FetchInitiatorInfo.h"
-#include "core/fetch/MemoryCache.h"
-#include "core/fetch/Resource.h"
-#include "core/fetch/ResourceLoader.h"
#include "core/inspector/IdentifiersFactory.h"
#include "core/inspector/InspectorClient.h"
#include "core/inspector/InspectorOverlay.h"
@@ -51,8 +47,12 @@
#include "core/loader/DocumentLoader.h"
#include "core/loader/DocumentThreadableLoader.h"
#include "core/loader/FrameLoader.h"
+#include "core/loader/ResourceLoader.h"
#include "core/loader/ThreadableLoader.h"
#include "core/loader/ThreadableLoaderClient.h"
+#include "core/loader/cache/FetchInitiatorInfo.h"
+#include "core/loader/cache/MemoryCache.h"
+#include "core/loader/cache/Resource.h"
#include "core/page/Frame.h"
#include "core/page/Page.h"
#include "core/platform/JSONValues.h"
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorState.cpp b/chromium/third_party/WebKit/Source/core/inspector/InspectorState.cpp
index 8e25c288f78..2ed6d20664c 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorState.cpp
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorState.cpp
@@ -84,14 +84,8 @@ String InspectorState::getString(const String& propertyName)
long InspectorState::getLong(const String& propertyName)
{
- return getLong(propertyName, 0);
-}
-
-
-long InspectorState::getLong(const String& propertyName, long defaultValue)
-{
JSONObject::iterator it = m_properties->find(propertyName);
- long value = defaultValue;
+ long value = 0;
if (it != m_properties->end())
it->value->asNumber(&value);
return value;
@@ -99,13 +93,8 @@ long InspectorState::getLong(const String& propertyName, long defaultValue)
double InspectorState::getDouble(const String& propertyName)
{
- return getDouble(propertyName, 0);
-}
-
-double InspectorState::getDouble(const String& propertyName, double defaultValue)
-{
JSONObject::iterator it = m_properties->find(propertyName);
- double value = defaultValue;
+ double value = 0;
if (it != m_properties->end())
it->value->asNumber(&value);
return value;
diff --git a/chromium/third_party/WebKit/Source/core/inspector/InspectorState.h b/chromium/third_party/WebKit/Source/core/inspector/InspectorState.h
index 0679736b33d..7fe1f500d5d 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/InspectorState.h
+++ b/chromium/third_party/WebKit/Source/core/inspector/InspectorState.h
@@ -60,9 +60,7 @@ public:
bool getBoolean(const String& propertyName);
String getString(const String& propertyName);
long getLong(const String& propertyName);
- long getLong(const String& propertyName, long defaultValue);
double getDouble(const String& propertyName);
- double getDouble(const String& propertyName, double defaultValue);
PassRefPtr<JSONObject> getObject(const String& propertyName);
void setBoolean(const String& propertyName, bool value) { setValue(propertyName, JSONBasicValue::create(value)); }
diff --git a/chromium/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp b/chromium/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp
index f5c8abefe9e..cc210a91a6b 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp
+++ b/chromium/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp
@@ -30,8 +30,8 @@
#include "core/inspector/NetworkResourcesData.h"
#include "core/dom/DOMImplementation.h"
-#include "core/fetch/Resource.h"
#include "core/loader/TextResourceDecoder.h"
+#include "core/loader/cache/Resource.h"
#include "core/platform/SharedBuffer.h"
#include "core/platform/network/ResourceResponse.h"
diff --git a/chromium/third_party/WebKit/Source/core/inspector/ScriptProfile.cpp b/chromium/third_party/WebKit/Source/core/inspector/ScriptProfile.cpp
index 5db3af7bf14..513586b69f2 100644
--- a/chromium/third_party/WebKit/Source/core/inspector/ScriptProfile.cpp
+++ b/chromium/third_party/WebKit/Source/core/inspector/ScriptProfile.cpp
@@ -85,7 +85,7 @@ static PassRefPtr<TypeBuilder::Profiler::CPUProfileNode> buildInspectorObjectFor
.setScriptId(String::number(node->GetScriptId()))
.setUrl(toWebCoreString(node->GetScriptResourceName()))
.setLineNumber(node->GetLineNumber())
- .setHitCount(node->GetHitCount())
+ .setHitCount(node->GetSelfSamplesCount())
.setCallUID(node->GetCallUid())
.setChildren(children.release());
result->setId(node->GetNodeId());
diff --git a/chromium/third_party/WebKit/Source/core/loader/CrossOriginAccessControl.cpp b/chromium/third_party/WebKit/Source/core/loader/CrossOriginAccessControl.cpp
index edfbb620835..6c4fbf0f83c 100644
--- a/chromium/third_party/WebKit/Source/core/loader/CrossOriginAccessControl.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/CrossOriginAccessControl.cpp
@@ -148,24 +148,17 @@ bool passesAccessControlCheck(const ResourceResponse& response, StoredCredential
// FIXME: Access-Control-Allow-Origin can contain a list of origins.
if (accessControlOriginString != securityOrigin->toString()) {
- if (accessControlOriginString == "*") {
- errorDescription = "Wildcards cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin '" + securityOrigin->toString() + "' is therefore not allowed access.";
- } else if (accessControlOriginString.isEmpty()) {
- errorDescription = "No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '" + securityOrigin->toString() + "' is therefore not allowed access.";
- } else {
- KURL headerOrigin(KURL(), accessControlOriginString);
- if (!headerOrigin.isValid())
- errorDescription = "The 'Access-Control-Allow-Origin' header contains the invalid value '" + accessControlOriginString + "'. Origin '" + securityOrigin->toString() + "' is therefore not allowed access.";
- else
- errorDescription = "The 'Access-Control-Allow-Origin' whitelists only '" + accessControlOriginString + "'. Origin '" + securityOrigin->toString() + "' is not in the list, and is therefore not allowed access.";
- }
+ if (accessControlOriginString == "*")
+ errorDescription = "Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true.";
+ else
+ errorDescription = "Origin " + securityOrigin->toString() + " is not allowed by Access-Control-Allow-Origin.";
return false;
}
if (includeCredentials == AllowStoredCredentials) {
const String& accessControlCredentialsString = response.httpHeaderField(accessControlAllowCredentials);
if (accessControlCredentialsString != "true") {
- errorDescription = "Credentials flag is 'true', but the 'Access-Control-Allow-Credentials' header is '" + accessControlCredentialsString + "'. It must be 'true' to allow credentials.";
+ errorDescription = "Credentials flag is true, but Access-Control-Allow-Credentials is not \"true\".";
return false;
}
}
diff --git a/chromium/third_party/WebKit/Source/core/loader/CrossOriginAccessControl.h b/chromium/third_party/WebKit/Source/core/loader/CrossOriginAccessControl.h
index 0d58400e69c..a660e01f3fc 100644
--- a/chromium/third_party/WebKit/Source/core/loader/CrossOriginAccessControl.h
+++ b/chromium/third_party/WebKit/Source/core/loader/CrossOriginAccessControl.h
@@ -27,7 +27,7 @@
#ifndef CrossOriginAccessControl_h
#define CrossOriginAccessControl_h
-#include "core/fetch/ResourceLoaderOptions.h"
+#include "core/loader/ResourceLoaderOptions.h"
#include "core/platform/network/ResourceRequest.h"
#include "wtf/Forward.h"
#include "wtf/HashSet.h"
diff --git a/chromium/third_party/WebKit/Source/core/loader/CrossOriginPreflightResultCache.h b/chromium/third_party/WebKit/Source/core/loader/CrossOriginPreflightResultCache.h
index 3911a2c1373..0006d48b7d8 100644
--- a/chromium/third_party/WebKit/Source/core/loader/CrossOriginPreflightResultCache.h
+++ b/chromium/third_party/WebKit/Source/core/loader/CrossOriginPreflightResultCache.h
@@ -27,7 +27,7 @@
#ifndef CrossOriginPreflightResultCache_h
#define CrossOriginPreflightResultCache_h
-#include "core/fetch/ResourceLoaderOptions.h"
+#include "core/loader/ResourceLoaderOptions.h"
#include "weborigin/KURLHash.h"
#include "wtf/HashMap.h"
#include "wtf/HashSet.h"
diff --git a/chromium/third_party/WebKit/Source/core/loader/DocumentLoader.cpp b/chromium/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
index 73f7c6e4040..bb5a31827b3 100644
--- a/chromium/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
@@ -36,20 +36,20 @@
#include "core/dom/Document.h"
#include "core/dom/DocumentParser.h"
#include "core/dom/Event.h"
-#include "core/fetch/MemoryCache.h"
-#include "core/fetch/ResourceFetcher.h"
-#include "core/fetch/ResourceLoader.h"
#include "core/html/HTMLFrameOwnerElement.h"
#include "core/inspector/InspectorInstrumentation.h"
#include "core/loader/DocumentWriter.h"
#include "core/loader/FrameLoader.h"
#include "core/loader/FrameLoaderClient.h"
+#include "core/loader/ResourceLoader.h"
#include "core/loader/SinkDocument.h"
#include "core/loader/TextResourceDecoder.h"
#include "core/loader/UniqueIdentifier.h"
#include "core/loader/appcache/ApplicationCacheHost.h"
#include "core/loader/archive/ArchiveResourceCollection.h"
#include "core/loader/archive/MHTMLArchive.h"
+#include "core/loader/cache/MemoryCache.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/DOMWindow.h"
#include "core/page/Frame.h"
#include "core/page/FrameTree.h"
@@ -240,7 +240,7 @@ void DocumentLoader::stopLoading()
Document* doc = m_frame->document();
if (loading || doc->parsing())
- m_frame->loader()->stopLoading();
+ m_frame->loader()->stopLoading(UnloadEventPolicyNone);
}
// Always cancel multipart loaders
@@ -807,6 +807,15 @@ bool DocumentLoader::scheduleArchiveLoad(Resource* cachedResource, const Resourc
return true;
}
+void DocumentLoader::setTitle(const StringWithDirection& title)
+{
+ if (m_pageTitle == title)
+ return;
+
+ m_pageTitle = title;
+ frameLoader()->didChangeTitle(this);
+}
+
KURL DocumentLoader::urlForHistory() const
{
// Return the URL to be used for history and B/F list.
diff --git a/chromium/third_party/WebKit/Source/core/loader/DocumentLoader.h b/chromium/third_party/WebKit/Source/core/loader/DocumentLoader.h
index 9797bbf56cc..112292e661e 100644
--- a/chromium/third_party/WebKit/Source/core/loader/DocumentLoader.h
+++ b/chromium/third_party/WebKit/Source/core/loader/DocumentLoader.h
@@ -30,13 +30,13 @@
#ifndef DocumentLoader_h
#define DocumentLoader_h
-#include "core/fetch/RawResource.h"
-#include "core/fetch/ResourceLoaderOptions.h"
-#include "core/fetch/ResourcePtr.h"
#include "core/loader/DocumentLoadTiming.h"
#include "core/loader/DocumentWriter.h"
#include "core/loader/NavigationAction.h"
+#include "core/loader/ResourceLoaderOptions.h"
#include "core/loader/SubstituteData.h"
+#include "core/loader/cache/RawResource.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/Timer.h"
#include "core/platform/network/ResourceError.h"
#include "core/platform/network/ResourceRequest.h"
@@ -120,6 +120,7 @@ namespace WebCore {
bool replacesCurrentHistoryItem() const { return m_replacesCurrentHistoryItem; }
void setReplacesCurrentHistoryItem(bool replacesCurrentHistoryItem) { m_replacesCurrentHistoryItem = replacesCurrentHistoryItem; }
bool isLoadingInAPISense() const;
+ void setTitle(const StringWithDirection&);
const String& overrideEncoding() const { return m_overrideEncoding; }
bool scheduleArchiveLoad(Resource*, const ResourceRequest&);
@@ -134,6 +135,7 @@ namespace WebCore {
void setTriggeringAction(const NavigationAction& action) { m_triggeringAction = action; }
void setOverrideEncoding(const String& encoding) { m_overrideEncoding = encoding; }
+ const StringWithDirection& title() const { return m_pageTitle; }
KURL urlForHistory() const;
@@ -249,6 +251,8 @@ namespace WebCore {
bool m_isClientRedirect;
bool m_replacesCurrentHistoryItem;
+ StringWithDirection m_pageTitle;
+
String m_overrideEncoding;
// The action that triggered loading - we keep this around for the
diff --git a/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp b/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
index f8e5c83c26b..f7e05443729 100644
--- a/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
@@ -33,15 +33,15 @@
#include "core/loader/DocumentThreadableLoader.h"
#include "core/dom/Document.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/RawResource.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/inspector/InspectorInstrumentation.h"
#include "core/loader/CrossOriginAccessControl.h"
#include "core/loader/CrossOriginPreflightResultCache.h"
#include "core/loader/DocumentThreadableLoaderClient.h"
#include "core/loader/FrameLoader.h"
#include "core/loader/ThreadableLoaderClient.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/RawResource.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/ContentSecurityPolicy.h"
#include "core/page/Frame.h"
#include "core/platform/network/ResourceError.h"
diff --git a/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h b/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
index 4e44cfb60e6..06e85eb31e7 100644
--- a/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
+++ b/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
@@ -32,9 +32,9 @@
#ifndef DocumentThreadableLoader_h
#define DocumentThreadableLoader_h
-#include "core/fetch/RawResource.h"
-#include "core/fetch/ResourcePtr.h"
#include "core/loader/ThreadableLoader.h"
+#include "core/loader/cache/RawResource.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/Timer.h"
#include "core/platform/network/ResourceError.h"
#include "wtf/Forward.h"
diff --git a/chromium/third_party/WebKit/Source/core/loader/EmptyClients.h b/chromium/third_party/WebKit/Source/core/loader/EmptyClients.h
index cf92613977b..09da78f3845 100644
--- a/chromium/third_party/WebKit/Source/core/loader/EmptyClients.h
+++ b/chromium/third_party/WebKit/Source/core/loader/EmptyClients.h
@@ -228,7 +228,8 @@ public:
virtual void transitionToCommittedForNewPage() OVERRIDE { }
- virtual void navigateBackForward(int offset) const OVERRIDE { }
+ virtual bool shouldGoToHistoryItem(HistoryItem*) const OVERRIDE { return false; }
+ virtual bool shouldStopLoadingForHistoryItem(HistoryItem*) const OVERRIDE { return false; }
virtual void didDisplayInsecureContent() OVERRIDE { }
virtual void didRunInsecureContent(SecurityOrigin*, const KURL&) OVERRIDE { }
virtual void didDetectXSS(const KURL&, bool) OVERRIDE { }
@@ -323,7 +324,6 @@ public:
EmptyContextMenuClient() { }
virtual ~EmptyContextMenuClient() { }
virtual void showContextMenu(const ContextMenu*) OVERRIDE { }
- virtual void clearContextMenu() OVERRIDE { }
};
class EmptyDragClient : public DragClient {
@@ -360,9 +360,13 @@ public:
class EmptyBackForwardClient : public BackForwardClient {
public:
- virtual void didAddItem() OVERRIDE { }
+ virtual void addItem(PassRefPtr<HistoryItem>) OVERRIDE { }
+ virtual void goToItem(HistoryItem*) OVERRIDE { }
+ virtual HistoryItem* itemAtIndex(int) OVERRIDE { return 0; }
virtual int backListCount() OVERRIDE { return 0; }
virtual int forwardListCount() OVERRIDE { return 0; }
+ virtual bool isActive() OVERRIDE { return false; }
+ virtual void close() OVERRIDE { }
};
void fillWithEmptyClients(Page::PageClients&);
diff --git a/chromium/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/chromium/third_party/WebKit/Source/core/loader/FrameLoader.cpp
index aadc4413c1c..1cfc5ca8cee 100644
--- a/chromium/third_party/WebKit/Source/core/loader/FrameLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/FrameLoader.cpp
@@ -39,17 +39,17 @@
#include "bindings/v8/DOMWrapperWorld.h"
#include "bindings/v8/ScriptController.h"
#include "bindings/v8/SerializedScriptValue.h"
+#include "core/dom/BeforeUnloadEvent.h"
#include "core/dom/Document.h"
#include "core/dom/Element.h"
#include "core/dom/Event.h"
#include "core/dom/EventNames.h"
#include "core/dom/PageTransitionEvent.h"
#include "core/editing/Editor.h"
-#include "core/fetch/ResourceFetcher.h"
-#include "core/fetch/ResourceLoader.h"
#include "core/history/BackForwardController.h"
#include "core/history/HistoryItem.h"
#include "core/html/HTMLFormElement.h"
+#include "core/html/HTMLInputElement.h"
#include "core/html/HTMLObjectElement.h"
#include "core/html/parser/HTMLParserIdioms.h"
#include "core/inspector/InspectorController.h"
@@ -62,8 +62,10 @@
#include "core/loader/FrameLoaderClient.h"
#include "core/loader/IconController.h"
#include "core/loader/ProgressTracker.h"
+#include "core/loader/ResourceLoader.h"
#include "core/loader/UniqueIdentifier.h"
#include "core/loader/appcache/ApplicationCacheHost.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/Chrome.h"
#include "core/page/ChromeClient.h"
#include "core/page/ContentSecurityPolicy.h"
@@ -158,6 +160,7 @@ FrameLoader::FrameLoader(Frame* frame, FrameLoaderClient* client)
, m_state(FrameStateProvisional)
, m_loadType(FrameLoadTypeStandard)
, m_inStopAllLoaders(false)
+ , m_pageDismissalEventBeingDispatched(NoDismissal)
, m_isComplete(false)
, m_containsPlugins(false)
, m_needsClear(false)
@@ -170,6 +173,7 @@ FrameLoader::FrameLoader(Frame* frame, FrameLoaderClient* client)
, m_suppressOpenerInNewFrame(false)
, m_startingClientRedirect(false)
, m_forcedSandboxFlags(SandboxNone)
+ , m_hasAllowedNavigationViaBeforeUnloadConfirmationPanel(false)
{
}
@@ -275,8 +279,58 @@ void FrameLoader::submitForm(PassRefPtr<FormSubmission> submission)
targetFrame->navigationScheduler()->scheduleFormSubmission(submission);
}
-void FrameLoader::stopLoading()
-{
+void FrameLoader::stopLoading(UnloadEventPolicy unloadEventPolicy)
+{
+ if (m_frame->document() && m_frame->document()->parser())
+ m_frame->document()->parser()->stopParsing();
+
+ if (unloadEventPolicy != UnloadEventPolicyNone) {
+ if (m_frame->document()) {
+ if (m_frame->document()->unloadEventStillNeeded()) {
+ m_frame->document()->unloadEventStarted();
+ Element* currentFocusedElement = m_frame->document()->focusedElement();
+ if (currentFocusedElement && currentFocusedElement->hasTagName(inputTag))
+ toHTMLInputElement(currentFocusedElement)->endEditing();
+ if (m_pageDismissalEventBeingDispatched == NoDismissal) {
+ if (unloadEventPolicy == UnloadEventPolicyUnloadAndPageHide) {
+ m_pageDismissalEventBeingDispatched = PageHideDismissal;
+ m_frame->domWindow()->dispatchEvent(PageTransitionEvent::create(eventNames().pagehideEvent, false), m_frame->document());
+ }
+ RefPtr<Event> unloadEvent(Event::create(eventNames().unloadEvent, false, false));
+ // The DocumentLoader (and thus its DocumentLoadTiming) might get destroyed
+ // while dispatching the event, so protect it to prevent writing the end
+ // time into freed memory.
+ RefPtr<DocumentLoader> documentLoader = m_provisionalDocumentLoader;
+ m_pageDismissalEventBeingDispatched = UnloadDismissal;
+ if (documentLoader && !documentLoader->timing()->unloadEventStart() && !documentLoader->timing()->unloadEventEnd()) {
+ DocumentLoadTiming* timing = documentLoader->timing();
+ ASSERT(timing->navigationStart());
+ timing->markUnloadEventStart();
+ m_frame->domWindow()->dispatchEvent(unloadEvent, m_frame->document());
+ timing->markUnloadEventEnd();
+ } else {
+ m_frame->domWindow()->dispatchEvent(unloadEvent, m_frame->document());
+ }
+ }
+ m_pageDismissalEventBeingDispatched = NoDismissal;
+ if (m_frame->document()) {
+ m_frame->document()->updateStyleIfNeeded();
+ m_frame->document()->unloadEventWasHandled();
+ }
+ }
+ }
+
+ // Dispatching the unload event could have made m_frame->document() null.
+ if (m_frame->document()) {
+ // Don't remove event listeners from a transitional empty document (see bug 28716 for more information).
+ bool keepEventListeners = m_stateMachine.isDisplayingInitialEmptyDocument() && m_provisionalDocumentLoader
+ && m_frame->document()->isSecureTransitionTo(m_provisionalDocumentLoader->url());
+
+ if (!keepEventListeners)
+ m_frame->document()->removeAllEventListeners();
+ }
+ }
+
m_isComplete = true; // to avoid calling completed() in finishedParsing()
if (m_frame->document() && m_frame->document()->parsing()) {
@@ -314,9 +368,8 @@ bool FrameLoader::closeURL()
history()->saveDocumentState();
// Should only send the pagehide event here if the current document exists.
- if (m_frame->document())
- m_frame->document()->dispatchUnloadEvents();
- stopLoading();
+ Document* currentDocument = m_frame->document();
+ stopLoading(currentDocument ? UnloadEventPolicyUnloadAndPageHide : UnloadEventPolicyUnloadOnly);
m_frame->editor()->clearUndoRedoOperations();
return true;
@@ -403,6 +456,13 @@ void FrameLoader::receivedFirstData()
dispatchDidCommitLoad();
dispatchDidClearWindowObjectsInAllWorlds();
+
+ if (m_documentLoader) {
+ StringWithDirection ptitle = m_documentLoader->title();
+ // If we have a title let the WebView know about it.
+ if (!ptitle.isNull())
+ m_client->dispatchDidReceiveTitle(ptitle);
+ }
}
void FrameLoader::setOutgoingReferrer(const KURL& url)
@@ -627,7 +687,7 @@ void FrameLoader::handleFallbackContent()
HTMLFrameOwnerElement* owner = m_frame->ownerElement();
if (!owner || !owner->hasTagName(objectTag))
return;
- toHTMLObjectElement(owner)->renderFallbackContent();
+ static_cast<HTMLObjectElement*>(owner)->renderFallbackContent();
}
bool FrameLoader::allowPlugins(ReasonForCallingAllowPlugins reason)
@@ -673,7 +733,6 @@ void FrameLoader::updateForSameDocumentNavigation(const KURL& newURL, SameDocume
m_documentLoader->appendRedirect(newURL);
m_client->dispatchDidNavigateWithinPage();
- m_client->dispatchDidReceiveTitle(m_frame->document()->titleWithDirection());
if (m_frame->document()->loadEventFinished())
m_client->postProgressFinishedNotification();
@@ -744,7 +803,10 @@ void FrameLoader::prepareForHistoryNavigation()
RefPtr<HistoryItem> currentItem = history()->currentItem();
if (!currentItem) {
insertDummyHistoryItem();
+
ASSERT(stateMachine()->isDisplayingInitialEmptyDocument());
+ stateMachine()->advanceTo(FrameLoaderStateMachine::StartedFirstRealLoad);
+ stateMachine()->advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocumentPostCommit);
stateMachine()->advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad);
}
}
@@ -922,7 +984,7 @@ void FrameLoader::reload(ReloadPolicy reloadPolicy, const KURL& overrideURL, con
void FrameLoader::stopAllLoaders(ClearProvisionalItemPolicy clearProvisionalItemPolicy)
{
- if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::NoDismissal)
+ if (m_pageDismissalEventBeingDispatched != NoDismissal)
return;
// If this method is called from within this method, infinite recursion can occur (3442218). Avoid this.
@@ -1013,6 +1075,8 @@ void FrameLoader::commitProvisionalLoad()
pdl->timing()->setHasSameOriginAsPreviousDocument(securityOrigin->canRequest(m_frame->document()->url()));
}
+ clearAllowNavigationViaBeforeUnloadConfirmationPanel();
+
// The call to closeURL() invokes the unload event handler, which can execute arbitrary
// JavaScript. If the script initiates a new load, we need to abandon the current load,
// or the two will stomp each other.
@@ -1488,7 +1552,7 @@ bool FrameLoader::shouldClose()
for (i = 0; i < targetFrames.size(); i++) {
if (!targetFrames[i]->tree()->isDescendantOf(m_frame))
continue;
- if (!targetFrames[i]->document()->dispatchBeforeUnloadEvent(page->chrome(), m_frame->document()))
+ if (!targetFrames[i]->loader()->fireBeforeUnloadEvent(page->chrome(), this))
break;
}
@@ -1502,10 +1566,43 @@ bool FrameLoader::shouldClose()
return shouldClose;
}
+bool FrameLoader::fireBeforeUnloadEvent(Chrome& chrome, FrameLoader* navigatingFrameLoader)
+{
+ DOMWindow* domWindow = m_frame->domWindow();
+ if (!domWindow)
+ return true;
+
+ RefPtr<Document> document = m_frame->document();
+ if (!document->body())
+ return true;
+
+ RefPtr<BeforeUnloadEvent> beforeUnloadEvent = BeforeUnloadEvent::create();
+ m_pageDismissalEventBeingDispatched = BeforeUnloadDismissal;
+ domWindow->dispatchEvent(beforeUnloadEvent.get(), domWindow->document());
+ m_pageDismissalEventBeingDispatched = NoDismissal;
+
+ if (!beforeUnloadEvent->defaultPrevented())
+ document->defaultEventHandler(beforeUnloadEvent.get());
+ if (beforeUnloadEvent->result().isNull())
+ return true;
+
+ if (navigatingFrameLoader->hasAllowedNavigationViaBeforeUnloadConfirmationPanel()) {
+ m_frame->document()->addConsoleMessage(JSMessageSource, ErrorMessageLevel, "Blocked attempt to show multiple 'beforeunload' confirmation panels for a single navigation.");
+ return true;
+ }
+
+ String text = document->displayStringModifiedByEncoding(beforeUnloadEvent->result());
+ if (chrome.runBeforeUnloadConfirmPanel(text, m_frame)) {
+ navigatingFrameLoader->didAllowNavigationViaBeforeUnloadConfirmationPanel();
+ return true;
+ }
+ return false;
+}
+
void FrameLoader::loadWithNavigationAction(const ResourceRequest& request, const NavigationAction& action, FrameLoadType type, PassRefPtr<FormState> formState, const SubstituteData& substituteData, const String& overrideEncoding)
{
ASSERT(m_client->hasWebView());
- if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::NoDismissal)
+ if (m_pageDismissalEventBeingDispatched != NoDismissal)
return;
// We skip dispatching the beforeload event on the frame owner if we've already committed a real
@@ -1569,7 +1666,7 @@ void FrameLoader::loadWithNavigationAction(const ResourceRequest& request, const
void FrameLoader::checkNewWindowPolicyAndContinue(PassRefPtr<FormState> formState, const String& frameName, const NavigationAction& action)
{
- if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::NoDismissal)
+ if (m_pageDismissalEventBeingDispatched != NoDismissal)
return;
if (m_frame->document() && m_frame->document()->isSandboxed(SandboxPopups))
@@ -1819,6 +1916,11 @@ void FrameLoader::insertDummyHistoryItem()
frame()->page()->backForward()->setCurrentItem(currentItem.get());
}
+void FrameLoader::setTitle(const StringWithDirection& title)
+{
+ documentLoader()->setTitle(title);
+}
+
String FrameLoader::referrer() const
{
return m_documentLoader ? m_documentLoader->request().httpReferrer() : "";
@@ -1863,6 +1965,15 @@ SandboxFlags FrameLoader::effectiveSandboxFlags() const
return flags;
}
+void FrameLoader::didChangeTitle(DocumentLoader* loader)
+{
+ if (loader == m_documentLoader) {
+ // Must update the entries in the back-forward list too.
+ history()->setCurrentItemTitle(loader->title());
+ m_client->dispatchDidReceiveTitle(loader->title());
+ }
+}
+
void FrameLoader::dispatchDidCommitLoad()
{
m_client->dispatchDidCommitLoad();
diff --git a/chromium/third_party/WebKit/Source/core/loader/FrameLoader.h b/chromium/third_party/WebKit/Source/core/loader/FrameLoader.h
index 157ffba8f6c..9fb25273c3e 100644
--- a/chromium/third_party/WebKit/Source/core/loader/FrameLoader.h
+++ b/chromium/third_party/WebKit/Source/core/loader/FrameLoader.h
@@ -34,13 +34,13 @@
#include "core/dom/IconURL.h"
#include "core/dom/SecurityContext.h"
-#include "core/fetch/CachePolicy.h"
-#include "core/fetch/ResourceLoadNotifier.h"
-#include "core/fetch/ResourceLoaderOptions.h"
#include "core/loader/FrameLoaderStateMachine.h"
#include "core/loader/FrameLoaderTypes.h"
#include "core/loader/HistoryController.h"
#include "core/loader/MixedContentChecker.h"
+#include "core/loader/ResourceLoadNotifier.h"
+#include "core/loader/ResourceLoaderOptions.h"
+#include "core/loader/cache/CachePolicy.h"
#include "core/page/LayoutMilestones.h"
#include "core/platform/Timer.h"
#include "wtf/Forward.h"
@@ -109,7 +109,7 @@ public:
void stopAllLoaders(ClearProvisionalItemPolicy = ShouldClearProvisionalItem);
void stopForUserCancel(bool deferCheckLoadComplete = false);
void stop();
- void stopLoading();
+ void stopLoading(UnloadEventPolicy);
bool closeURL();
void cancelAndClear();
// FIXME: clear() is trying to do too many things. We should break it down into smaller functions (ideally with fewer raw Boolean parameters).
@@ -142,6 +142,7 @@ public:
bool isLoadingMainFrame() const;
bool subframeIsLoading() const;
+ void didChangeTitle(DocumentLoader*);
bool shouldTreatURLAsSrcdocDocument(const KURL&) const;
@@ -201,6 +202,8 @@ public:
bool isComplete() const;
+ void setTitle(const StringWithDirection&);
+
void commitProvisionalLoad();
FrameLoaderStateMachine* stateMachine() const { return &m_stateMachine; }
@@ -224,6 +227,14 @@ public:
bool containsPlugins() const { return m_containsPlugins; }
bool allowPlugins(ReasonForCallingAllowPlugins);
+ enum PageDismissalType {
+ NoDismissal = 0,
+ BeforeUnloadDismissal = 1,
+ PageHideDismissal = 2,
+ UnloadDismissal = 3
+ };
+ PageDismissalType pageDismissalEventBeingDispatched() const { return m_pageDismissalEventBeingDispatched; }
+
void updateForSameDocumentNavigation(const KURL&, SameDocumentNavigationSource, PassRefPtr<SerializedScriptValue>, const String& title);
private:
@@ -241,6 +252,11 @@ private:
SubstituteData defaultSubstituteDataForURL(const KURL&);
+ bool fireBeforeUnloadEvent(Chrome&, FrameLoader*);
+ bool hasAllowedNavigationViaBeforeUnloadConfirmationPanel() const { return m_hasAllowedNavigationViaBeforeUnloadConfirmationPanel; }
+ void didAllowNavigationViaBeforeUnloadConfirmationPanel() { m_hasAllowedNavigationViaBeforeUnloadConfirmationPanel = true; }
+ void clearAllowNavigationViaBeforeUnloadConfirmationPanel() { m_hasAllowedNavigationViaBeforeUnloadConfirmationPanel = false; }
+
void checkNavigationPolicyAndContinueFragmentScroll(const NavigationAction&, bool isNewNavigation);
void checkNewWindowPolicyAndContinue(PassRefPtr<FormState>, const String& frameName, const NavigationAction&);
@@ -300,6 +316,7 @@ private:
String m_outgoingReferrer;
+ PageDismissalType m_pageDismissalEventBeingDispatched;
bool m_isComplete;
bool m_needsClear;
@@ -321,6 +338,8 @@ private:
SandboxFlags m_forcedSandboxFlags;
+ bool m_hasAllowedNavigationViaBeforeUnloadConfirmationPanel;
+
RefPtr<HistoryItem> m_requestedHistoryItem;
};
diff --git a/chromium/third_party/WebKit/Source/core/loader/FrameLoaderClient.h b/chromium/third_party/WebKit/Source/core/loader/FrameLoaderClient.h
index 8a0924a2b2e..f02a306c464 100644
--- a/chromium/third_party/WebKit/Source/core/loader/FrameLoaderClient.h
+++ b/chromium/third_party/WebKit/Source/core/loader/FrameLoaderClient.h
@@ -128,7 +128,8 @@ class FetchRequest;
virtual void loadURLExternally(const ResourceRequest&, NavigationPolicy, const String& suggestedName = String()) = 0;
- virtual void navigateBackForward(int offset) const = 0;
+ virtual bool shouldGoToHistoryItem(HistoryItem*) const = 0;
+ virtual bool shouldStopLoadingForHistoryItem(HistoryItem*) const = 0;
// Another page has accessed the initial empty document of this frame.
// It is no longer safe to display a provisional URL, since a URL spoof
diff --git a/chromium/third_party/WebKit/Source/core/loader/FrameLoaderStateMachine.cpp b/chromium/third_party/WebKit/Source/core/loader/FrameLoaderStateMachine.cpp
index 52957e41884..4cff5c7794e 100644
--- a/chromium/third_party/WebKit/Source/core/loader/FrameLoaderStateMachine.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/FrameLoaderStateMachine.cpp
@@ -61,7 +61,7 @@ bool FrameLoaderStateMachine::isDisplayingInitialEmptyDocument() const
void FrameLoaderStateMachine::advanceTo(State state)
{
- ASSERT(m_state < state);
+ ASSERT(State(m_state + 1) == state);
m_state = state;
}
diff --git a/chromium/third_party/WebKit/Source/core/loader/FrameLoaderTypes.h b/chromium/third_party/WebKit/Source/core/loader/FrameLoaderTypes.h
index 1ef7b5dfddb..a7444ba8409 100644
--- a/chromium/third_party/WebKit/Source/core/loader/FrameLoaderTypes.h
+++ b/chromium/third_party/WebKit/Source/core/loader/FrameLoaderTypes.h
@@ -71,6 +71,12 @@ namespace WebCore {
ObjectContentOtherPlugin
};
+ enum UnloadEventPolicy {
+ UnloadEventPolicyNone,
+ UnloadEventPolicyUnloadOnly,
+ UnloadEventPolicyUnloadAndPageHide
+ };
+
enum ShouldSendReferrer {
MaybeSendReferrer,
NeverSendReferrer
diff --git a/chromium/third_party/WebKit/Source/core/loader/HistoryController.cpp b/chromium/third_party/WebKit/Source/core/loader/HistoryController.cpp
index 7db88749b4e..900765c8a77 100644
--- a/chromium/third_party/WebKit/Source/core/loader/HistoryController.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/HistoryController.cpp
@@ -196,8 +196,12 @@ bool HistoryController::shouldStopLoadingForHistoryItem(HistoryItem* targetItem)
{
if (!m_currentItem)
return false;
+
// Don't abort the current load if we're navigating within the current document.
- return !m_currentItem->shouldDoSameDocumentNavigationTo(targetItem);
+ if (m_currentItem->shouldDoSameDocumentNavigationTo(targetItem))
+ return false;
+
+ return m_frame->loader()->client()->shouldStopLoadingForHistoryItem(targetItem);
}
// Main funnel for navigating to a previous location (back/forward, non-search snap-back)
@@ -213,6 +217,8 @@ void HistoryController::goToItem(HistoryItem* targetItem)
Page* page = m_frame->page();
if (!page)
return;
+ if (!m_frame->loader()->client()->shouldGoToHistoryItem(targetItem))
+ return;
if (m_defersLoading) {
m_deferredItem = targetItem;
return;
@@ -245,7 +251,8 @@ void HistoryController::setDefersLoading(bool defer)
void HistoryController::updateForBackForwardNavigation()
{
#if !LOG_DISABLED
- LOG(History, "WebCoreHistory: Updating History for back/forward navigation in frame %s", m_frame->document()->title().utf8().data());
+ if (m_frame->loader()->documentLoader())
+ LOG(History, "WebCoreHistory: Updating History for back/forward navigation in frame %s", m_frame->loader()->documentLoader()->title().string().utf8().data());
#endif
saveScrollPositionAndViewStateToItem(m_previousItem.get());
@@ -258,7 +265,8 @@ void HistoryController::updateForBackForwardNavigation()
void HistoryController::updateForReload()
{
#if !LOG_DISABLED
- LOG(History, "WebCoreHistory: Updating History for reload in frame %s", m_frame->document()->title().utf8().data());
+ if (m_frame->loader()->documentLoader())
+ LOG(History, "WebCoreHistory: Updating History for reload in frame %s", m_frame->loader()->documentLoader()->title().string().utf8().data());
#endif
if (m_currentItem) {
@@ -287,7 +295,7 @@ void HistoryController::updateForStandardLoad()
void HistoryController::updateForRedirectWithLockedBackForwardList()
{
#if !LOG_DISABLED
- LOG(History, "WebCoreHistory: Updating History for redirect load in frame %s", m_frame->document()->title().utf8().data());
+ LOG(History, "WebCoreHistory: Updating History for redirect load in frame %s", m_frame->loader()->documentLoader()->title().string().utf8().data());
#endif
if (!m_currentItem && !m_frame->tree()->parent()) {
@@ -309,8 +317,8 @@ void HistoryController::updateForCommit()
{
FrameLoader* frameLoader = m_frame->loader();
#if !LOG_DISABLED
- if (m_frame->document())
- LOG(History, "WebCoreHistory: Updating History for commit in frame %s", m_frame->document()->title().utf8().data());
+ if (frameLoader->documentLoader())
+ LOG(History, "WebCoreHistory: Updating History for commit in frame %s", frameLoader->documentLoader()->title().string().utf8().data());
#endif
FrameLoadType type = frameLoader->loadType();
if (isBackForwardLoadType(type) || (isReloadTypeWithProvisionalItem(type) && !frameLoader->documentLoader()->unreachableURL().isEmpty())) {
@@ -487,12 +495,13 @@ void HistoryController::initializeItem(HistoryItem* item)
Frame* parentFrame = m_frame->tree()->parent();
String parent = parentFrame ? parentFrame->tree()->uniqueName() : "";
+ StringWithDirection title = documentLoader->title();
item->setURL(url);
item->setTarget(m_frame->tree()->uniqueName());
item->setParent(parent);
// FIXME: should store title directionality in history as well.
- item->setTitle(m_frame->document()->title());
+ item->setTitle(title.string());
item->setOriginalURLString(originalURL.string());
// Save form state if this is a POST
@@ -695,6 +704,7 @@ void HistoryController::pushState(PassRefPtr<SerializedScriptValue> stateObject,
m_currentItem->setTitle(title);
m_currentItem->setStateObject(stateObject);
m_currentItem->setURLString(urlString);
+
page->backForward()->addItem(topItem.release());
}
diff --git a/chromium/third_party/WebKit/Source/core/loader/ImageLoader.cpp b/chromium/third_party/WebKit/Source/core/loader/ImageLoader.cpp
index 84132cfbb8b..668cb97f3ec 100644
--- a/chromium/third_party/WebKit/Source/core/loader/ImageLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/ImageLoader.cpp
@@ -27,12 +27,12 @@
#include "core/dom/Element.h"
#include "core/dom/Event.h"
#include "core/dom/EventSender.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ImageResource.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/html/HTMLObjectElement.h"
#include "core/html/parser/HTMLParserIdioms.h"
#include "core/loader/CrossOriginAccessControl.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ImageResource.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/Frame.h"
#include "core/rendering/RenderImage.h"
#include "core/rendering/RenderVideo.h"
@@ -61,7 +61,8 @@ static ImageEventSender& errorEventSender()
static inline bool pageIsBeingDismissed(Document* document)
{
- return document->pageDismissalEventBeingDispatched() != Document::NoDismissal;
+ Frame* frame = document->frame();
+ return frame && frame->loader()->pageDismissalEventBeingDispatched() != FrameLoader::NoDismissal;
}
ImageLoader::ImageLoader(Element* element)
@@ -394,7 +395,7 @@ void ImageLoader::dispatchPendingBeforeLoadEvent()
m_hasPendingLoadEvent = false;
if (m_element->hasTagName(HTMLNames::objectTag))
- toHTMLObjectElement(m_element)->renderFallbackContent();
+ static_cast<HTMLObjectElement*>(m_element)->renderFallbackContent();
// Only consider updating the protection ref-count of the Element immediately before returning
// from this function as doing so might result in the destruction of this ImageLoader.
diff --git a/chromium/third_party/WebKit/Source/core/loader/ImageLoader.h b/chromium/third_party/WebKit/Source/core/loader/ImageLoader.h
index 6c1274fd3a6..dfb6ad0ddeb 100644
--- a/chromium/third_party/WebKit/Source/core/loader/ImageLoader.h
+++ b/chromium/third_party/WebKit/Source/core/loader/ImageLoader.h
@@ -23,9 +23,9 @@
#ifndef ImageLoader_h
#define ImageLoader_h
-#include "core/fetch/ImageResource.h"
-#include "core/fetch/ImageResourceClient.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ImageResource.h"
+#include "core/loader/cache/ImageResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "wtf/HashSet.h"
#include "wtf/text/AtomicString.h"
diff --git a/chromium/third_party/WebKit/Source/core/loader/LinkLoader.cpp b/chromium/third_party/WebKit/Source/core/loader/LinkLoader.cpp
index c487098ea88..256de17e5a2 100644
--- a/chromium/third_party/WebKit/Source/core/loader/LinkLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/LinkLoader.cpp
@@ -34,10 +34,10 @@
#include "FetchInitiatorTypeNames.h"
#include "core/dom/Document.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/html/LinkRelAttribute.h"
#include "core/loader/Prerenderer.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/Settings.h"
#include "core/platform/PrerenderHandle.h"
#include "core/platform/network/DNS.h"
diff --git a/chromium/third_party/WebKit/Source/core/loader/LinkLoader.h b/chromium/third_party/WebKit/Source/core/loader/LinkLoader.h
index 086be49e4bc..21a6281fa09 100644
--- a/chromium/third_party/WebKit/Source/core/loader/LinkLoader.h
+++ b/chromium/third_party/WebKit/Source/core/loader/LinkLoader.h
@@ -32,9 +32,9 @@
#ifndef LinkLoader_h
#define LinkLoader_h
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourcePtr.h"
#include "core/loader/LinkLoaderClient.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/PrerenderClient.h"
#include "core/platform/Timer.h"
#include "wtf/RefPtr.h"
diff --git a/chromium/third_party/WebKit/Source/core/loader/MixedContentChecker.cpp b/chromium/third_party/WebKit/Source/core/loader/MixedContentChecker.cpp
index ac812e0edf8..707de33b695 100644
--- a/chromium/third_party/WebKit/Source/core/loader/MixedContentChecker.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/MixedContentChecker.cpp
@@ -91,7 +91,7 @@ bool MixedContentChecker::canRunInsecureContent(SecurityOrigin* securityOrigin,
void MixedContentChecker::logWarning(bool allowed, const String& action, const KURL& target) const
{
- String message = String(allowed ? "" : "[blocked] ") + "The page at '" + m_frame->document()->url().elidedString() + "' was loaded over HTTPS, but " + action + " insecure content from '" + target.elidedString() + "': this content should also be loaded over HTTPS.\n";
+ String message = String(allowed ? "" : "[blocked] ") + "The page at " + m_frame->document()->url().elidedString() + " " + action + " insecure content from " + target.elidedString() + ".\n";
m_frame->document()->addConsoleMessage(SecurityMessageSource, WarningMessageLevel, message);
}
diff --git a/chromium/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp b/chromium/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp
index 700d036e14a..9547744fdf6 100644
--- a/chromium/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/NavigationScheduler.cpp
@@ -437,8 +437,7 @@ void NavigationScheduler::schedule(PassOwnPtr<ScheduledNavigation> redirect)
if (redirect->wasDuringLoad()) {
if (DocumentLoader* provisionalDocumentLoader = m_frame->loader()->provisionalDocumentLoader())
provisionalDocumentLoader->stopLoading();
- m_frame->document()->dispatchUnloadEvents();
- m_frame->loader()->stopLoading();
+ m_frame->loader()->stopLoading(UnloadEventPolicyUnloadAndPageHide);
}
cancel();
diff --git a/chromium/third_party/WebKit/Source/core/loader/PingLoader.h b/chromium/third_party/WebKit/Source/core/loader/PingLoader.h
index 80f7070aef7..a25a5c68eb0 100644
--- a/chromium/third_party/WebKit/Source/core/loader/PingLoader.h
+++ b/chromium/third_party/WebKit/Source/core/loader/PingLoader.h
@@ -32,7 +32,7 @@
#ifndef PingLoader_h
#define PingLoader_h
-#include "core/fetch/ResourceLoaderOptions.h"
+#include "core/loader/ResourceLoaderOptions.h"
#include "core/platform/Timer.h"
#include "public/platform/WebURLLoaderClient.h"
#include "wtf/Noncopyable.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoadNotifier.cpp b/chromium/third_party/WebKit/Source/core/loader/ResourceLoadNotifier.cpp
index 1aca1a9204d..2804a0d565a 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoadNotifier.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/ResourceLoadNotifier.cpp
@@ -29,7 +29,7 @@
*/
#include "config.h"
-#include "core/fetch/ResourceLoadNotifier.h"
+#include "core/loader/ResourceLoadNotifier.h"
#include "core/inspector/InspectorInstrumentation.h"
#include "core/loader/DocumentLoader.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoadNotifier.h b/chromium/third_party/WebKit/Source/core/loader/ResourceLoadNotifier.h
index 65d0f7b9e99..5e1c5a4dac1 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoadNotifier.h
+++ b/chromium/third_party/WebKit/Source/core/loader/ResourceLoadNotifier.h
@@ -30,7 +30,7 @@
#ifndef ResourceLoadNotifier_h
#define ResourceLoadNotifier_h
-#include "core/fetch/FetchInitiatorInfo.h"
+#include "core/loader/cache/FetchInitiatorInfo.h"
#include "wtf/Noncopyable.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp b/chromium/third_party/WebKit/Source/core/loader/ResourceLoader.cpp
index 987cbc50b51..389cab47d95 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/ResourceLoader.cpp
@@ -28,11 +28,11 @@
*/
#include "config.h"
-#include "core/fetch/ResourceLoader.h"
+#include "core/loader/ResourceLoader.h"
-#include "core/fetch/Resource.h"
-#include "core/fetch/ResourceLoaderHost.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/ResourceLoaderHost.h"
+#include "core/loader/cache/Resource.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/Logging.h"
#include "core/platform/SharedBuffer.h"
#include "core/platform/chromium/support/WrappedResourceRequest.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoader.h b/chromium/third_party/WebKit/Source/core/loader/ResourceLoader.h
index d298e950ba4..f7615bb2e2e 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoader.h
+++ b/chromium/third_party/WebKit/Source/core/loader/ResourceLoader.h
@@ -29,7 +29,7 @@
#ifndef ResourceLoader_h
#define ResourceLoader_h
-#include "core/fetch/ResourceLoaderOptions.h"
+#include "core/loader/ResourceLoaderOptions.h"
#include "core/platform/network/ResourceRequest.h"
#include "public/platform/WebURLLoader.h"
#include "public/platform/WebURLLoaderClient.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoaderHost.h b/chromium/third_party/WebKit/Source/core/loader/ResourceLoaderHost.h
index 5860b9650bd..5860b9650bd 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoaderHost.h
+++ b/chromium/third_party/WebKit/Source/core/loader/ResourceLoaderHost.h
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoaderOptions.h b/chromium/third_party/WebKit/Source/core/loader/ResourceLoaderOptions.h
index 187efc3ac96..423519b63f4 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoaderOptions.h
+++ b/chromium/third_party/WebKit/Source/core/loader/ResourceLoaderOptions.h
@@ -31,7 +31,7 @@
#ifndef ResourceLoaderOptions_h
#define ResourceLoaderOptions_h
-#include "core/fetch/FetchInitiatorInfo.h"
+#include "core/loader/cache/FetchInitiatorInfo.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/loader/TextTrackLoader.cpp b/chromium/third_party/WebKit/Source/core/loader/TextTrackLoader.cpp
index a8e1b70155a..9c548ebb140 100644
--- a/chromium/third_party/WebKit/Source/core/loader/TextTrackLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/TextTrackLoader.cpp
@@ -29,11 +29,11 @@
#include "FetchInitiatorTypeNames.h"
#include "core/dom/Document.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ResourceFetcher.h"
-#include "core/fetch/TextTrackResource.h"
#include "core/html/track/WebVTTParser.h"
#include "core/loader/CrossOriginAccessControl.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ResourceFetcher.h"
+#include "core/loader/cache/TextTrackResource.h"
#include "core/platform/Logging.h"
#include "core/platform/SharedBuffer.h"
#include "weborigin/SecurityOrigin.h"
diff --git a/chromium/third_party/WebKit/Source/core/loader/TextTrackLoader.h b/chromium/third_party/WebKit/Source/core/loader/TextTrackLoader.h
index 4eb68a81aa6..dd2feeb8293 100644
--- a/chromium/third_party/WebKit/Source/core/loader/TextTrackLoader.h
+++ b/chromium/third_party/WebKit/Source/core/loader/TextTrackLoader.h
@@ -26,10 +26,10 @@
#ifndef TextTrackLoader_h
#define TextTrackLoader_h
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourcePtr.h"
-#include "core/fetch/TextTrackResource.h"
#include "core/html/track/WebVTTParser.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
+#include "core/loader/cache/TextTrackResource.h"
#include "core/platform/Timer.h"
#include "wtf/OwnPtr.h"
diff --git a/chromium/third_party/WebKit/Source/core/loader/ThreadableLoader.h b/chromium/third_party/WebKit/Source/core/loader/ThreadableLoader.h
index a2afdd11b6b..6df1a5ce0a0 100644
--- a/chromium/third_party/WebKit/Source/core/loader/ThreadableLoader.h
+++ b/chromium/third_party/WebKit/Source/core/loader/ThreadableLoader.h
@@ -31,7 +31,7 @@
#ifndef ThreadableLoader_h
#define ThreadableLoader_h
-#include "core/fetch/ResourceLoaderOptions.h"
+#include "core/loader/ResourceLoaderOptions.h"
#include "weborigin/SecurityOrigin.h"
#include "wtf/Noncopyable.h"
#include "wtf/PassRefPtr.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/CSSStyleSheetResource.cpp
index 20be5179f25..53398a20d92 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/CSSStyleSheetResource.cpp
@@ -25,12 +25,12 @@
*/
#include "config.h"
-#include "core/fetch/CSSStyleSheetResource.h"
+#include "core/loader/cache/CSSStyleSheetResource.h"
#include "core/css/StyleSheetContents.h"
-#include "core/fetch/ResourceClientWalker.h"
-#include "core/fetch/StyleSheetResourceClient.h"
#include "core/loader/TextResourceDecoder.h"
+#include "core/loader/cache/ResourceClientWalker.h"
+#include "core/loader/cache/StyleSheetResourceClient.h"
#include "core/platform/SharedBuffer.h"
#include "core/platform/network/HTTPParsers.h"
#include "wtf/CurrentTime.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.h b/chromium/third_party/WebKit/Source/core/loader/cache/CSSStyleSheetResource.h
index 3ecf34ba82e..b01fa8667f3 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/CSSStyleSheetResource.h
@@ -26,7 +26,7 @@
#ifndef CSSStyleSheetResource_h
#define CSSStyleSheetResource_h
-#include "core/fetch/Resource.h"
+#include "core/loader/cache/Resource.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/CachePolicy.h b/chromium/third_party/WebKit/Source/core/loader/cache/CachePolicy.h
index bffddfe1d96..a44c32d26cc 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/CachePolicy.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/CachePolicy.h
@@ -28,13 +28,13 @@
namespace WebCore {
-enum CachePolicy {
- CachePolicyCache,
- CachePolicyVerify,
- CachePolicyRevalidate,
- CachePolicyReload,
- CachePolicyHistoryBuffer
-};
+ enum CachePolicy {
+ CachePolicyCache,
+ CachePolicyVerify,
+ CachePolicyRevalidate,
+ CachePolicyReload,
+ CachePolicyHistoryBuffer
+ };
}
diff --git a/chromium/third_party/WebKit/Source/core/fetch/DocumentResource.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/DocumentResource.cpp
index 5c18d847e45..27503416f14 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/DocumentResource.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/DocumentResource.cpp
@@ -22,10 +22,10 @@
#include "config.h"
-#include "core/fetch/DocumentResource.h"
+#include "core/loader/cache/DocumentResource.h"
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/SharedBuffer.h"
#include "core/svg/SVGDocument.h"
#include "wtf/text/StringBuilder.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/DocumentResource.h b/chromium/third_party/WebKit/Source/core/loader/cache/DocumentResource.h
index 58b8ac0621f..62379d70925 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/DocumentResource.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/DocumentResource.h
@@ -23,10 +23,10 @@
#ifndef DocumentResource_h
#define DocumentResource_h
-#include "core/fetch/Resource.h"
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourcePtr.h"
#include "core/loader/TextResourceDecoder.h"
+#include "core/loader/cache/Resource.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/DocumentResourceReference.h b/chromium/third_party/WebKit/Source/core/loader/cache/DocumentResourceReference.h
index 9e8433583f9..4d7009cb434 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/DocumentResourceReference.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/DocumentResourceReference.h
@@ -26,8 +26,8 @@
#ifndef DocumentResourceReference_h
#define DocumentResourceReference_h
-#include "core/fetch/DocumentResource.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/DocumentResource.h"
+#include "core/loader/cache/ResourcePtr.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/FetchInitiatorInfo.h b/chromium/third_party/WebKit/Source/core/loader/cache/FetchInitiatorInfo.h
index c5e9b3a67b8..c5e9b3a67b8 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/FetchInitiatorInfo.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/FetchInitiatorInfo.h
diff --git a/chromium/third_party/WebKit/Source/core/fetch/FetchInitiatorTypeNames.in b/chromium/third_party/WebKit/Source/core/loader/cache/FetchInitiatorTypeNames.in
index 7356271ceb4..7356271ceb4 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/FetchInitiatorTypeNames.in
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/FetchInitiatorTypeNames.in
diff --git a/chromium/third_party/WebKit/Source/core/fetch/FetchRequest.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/FetchRequest.cpp
index ba22c78bcb1..57268b2979e 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/FetchRequest.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/FetchRequest.cpp
@@ -24,12 +24,12 @@
*/
#include "config.h"
-#include "core/fetch/FetchRequest.h"
+#include "core/loader/cache/FetchRequest.h"
#include "core/dom/Element.h"
-#include "core/fetch/FetchInitiatorInfo.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/loader/CrossOriginAccessControl.h"
+#include "core/loader/cache/FetchInitiatorInfo.h"
+#include "core/loader/cache/ResourceFetcher.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/FetchRequest.h b/chromium/third_party/WebKit/Source/core/loader/cache/FetchRequest.h
index b9d5fec3978..974fff2b36b 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/FetchRequest.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/FetchRequest.h
@@ -27,8 +27,8 @@
#define FetchRequest_h
#include "core/dom/Element.h"
-#include "core/fetch/FetchInitiatorInfo.h"
-#include "core/fetch/ResourceLoaderOptions.h"
+#include "core/loader/ResourceLoaderOptions.h"
+#include "core/loader/cache/FetchInitiatorInfo.h"
#include "core/platform/network/ResourceLoadPriority.h"
#include "core/platform/network/ResourceRequest.h"
#include "wtf/text/AtomicString.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/FontResource.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/FontResource.cpp
index 7fe82f41691..90b527783bf 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/FontResource.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/FontResource.cpp
@@ -25,11 +25,11 @@
*/
#include "config.h"
-#include "core/fetch/FontResource.h"
+#include "core/loader/cache/FontResource.h"
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourceClientWalker.h"
#include "core/loader/TextResourceDecoder.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourceClientWalker.h"
#include "core/platform/SharedBuffer.h"
#include "core/platform/graphics/FontCustomPlatformData.h"
#include "core/platform/graphics/FontPlatformData.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/FontResource.h b/chromium/third_party/WebKit/Source/core/loader/cache/FontResource.h
index 42b4f7029d5..5997f1e9b98 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/FontResource.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/FontResource.h
@@ -26,8 +26,8 @@
#ifndef FontResource_h
#define FontResource_h
-#include "core/fetch/Resource.h"
-#include "core/fetch/ResourceClient.h"
+#include "core/loader/cache/Resource.h"
+#include "core/loader/cache/ResourceClient.h"
#include "core/platform/graphics/FontOrientation.h"
#include "core/platform/graphics/FontWidthVariant.h"
#include "wtf/OwnPtr.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ImageResource.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/ImageResource.cpp
index 1fec3b78035..c07d864d850 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ImageResource.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ImageResource.cpp
@@ -22,13 +22,13 @@
*/
#include "config.h"
-#include "core/fetch/ImageResource.h"
+#include "core/loader/cache/ImageResource.h"
-#include "core/fetch/ImageResourceClient.h"
-#include "core/fetch/MemoryCache.h"
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourceClientWalker.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/ImageResourceClient.h"
+#include "core/loader/cache/MemoryCache.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourceClientWalker.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/FrameView.h"
#include "core/platform/SharedBuffer.h"
#include "core/platform/graphics/BitmapImage.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ImageResource.h b/chromium/third_party/WebKit/Source/core/loader/cache/ImageResource.h
index 0ae33ff434e..5bee694c78c 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ImageResource.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ImageResource.h
@@ -23,7 +23,7 @@
#ifndef ImageResource_h
#define ImageResource_h
-#include "core/fetch/Resource.h"
+#include "core/loader/cache/Resource.h"
#include "core/platform/graphics/ImageObserver.h"
#include "core/platform/graphics/IntRect.h"
#include "core/platform/graphics/IntSizeHash.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ImageResourceClient.h b/chromium/third_party/WebKit/Source/core/loader/cache/ImageResourceClient.h
index 900550e618e..4cea375612c 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ImageResourceClient.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ImageResourceClient.h
@@ -23,7 +23,7 @@
#ifndef ImageResourceClient_h
#define ImageResourceClient_h
-#include "core/fetch/ResourceClient.h"
+#include "core/loader/cache/ResourceClient.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/ImageResourceTest.cpp
index f1a269a5478..37d558b8d57 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ImageResourceTest.cpp
@@ -29,15 +29,15 @@
*/
#include "config.h"
-#include "core/fetch/ImageResource.h"
+#include "core/loader/cache/ImageResource.h"
-#include "core/fetch/ImageResourceClient.h"
-#include "core/fetch/MemoryCache.h"
-#include "core/fetch/MockImageResourceClient.h"
-#include "core/fetch/ResourceFetcher.h"
-#include "core/fetch/ResourcePtr.h"
#include "core/loader/DocumentLoader.h"
#include "core/loader/EmptyClients.h"
+#include "core/loader/cache/ImageResourceClient.h"
+#include "core/loader/cache/MemoryCache.h"
+#include "core/loader/cache/MockImageResourceClient.h"
+#include "core/loader/cache/ResourceFetcher.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/page/Frame.h"
#include "core/page/FrameView.h"
#include "core/page/Page.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/MemoryCache.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/MemoryCache.cpp
index 8024b2073b7..c51f5446e3c 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/MemoryCache.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/MemoryCache.cpp
@@ -21,18 +21,19 @@
*/
#include "config.h"
-#include "core/fetch/MemoryCache.h"
+#include "core/loader/cache/MemoryCache.h"
+#include <stdio.h>
#include "core/dom/CrossThreadTask.h"
#include "core/dom/Document.h"
-#include "core/fetch/Resource.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/Resource.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/page/FrameView.h"
#include "core/platform/Logging.h"
+#include "core/platform/chromium/TraceEvent.h"
#include "core/workers/WorkerGlobalScope.h"
#include "core/workers/WorkerLoaderProxy.h"
#include "core/workers/WorkerThread.h"
-#include "public/platform/Platform.h"
#include "weborigin/SecurityOrigin.h"
#include "weborigin/SecurityOriginHash.h"
#include "wtf/Assertions.h"
@@ -40,7 +41,6 @@
#include "wtf/MathExtras.h"
#include "wtf/TemporaryChange.h"
#include "wtf/text/CString.h"
-#include <stdio.h>
using namespace std;
@@ -297,9 +297,8 @@ void MemoryCache::evict(Resource* resource)
removeFromLRUList(resource);
removeFromLiveDecodedResourcesList(resource);
adjustSize(resource->hasClients(), -static_cast<int>(resource->size()));
- } else {
+ } else
ASSERT(m_resources.get(resource->url()) != resource);
- }
resource->deleteIfPossible();
}
@@ -319,7 +318,7 @@ MemoryCache::LRUList* MemoryCache::lruListFor(Resource* resource)
void MemoryCache::removeFromLRUList(Resource* resource)
{
// If we've never been accessed, then we're brand new and not in any list.
- if (!resource->accessCount())
+ if (resource->accessCount() == 0)
return;
#if !ASSERT_DISABLED
@@ -346,7 +345,7 @@ void MemoryCache::removeFromLRUList(Resource* resource)
Resource* next = resource->m_nextInAllResourcesList;
Resource* prev = resource->m_prevInAllResourcesList;
- if (!next && !prev && list->m_head != resource)
+ if (next == 0 && prev == 0 && list->m_head != resource)
return;
resource->m_nextInAllResourcesList = 0;
@@ -561,8 +560,7 @@ void MemoryCache::evictResources()
void MemoryCache::prune()
{
- ASSERT(WebKit::Platform::current()); // This method should not be called after WebKit::shutdown().
-
+ TRACE_EVENT0("renderer", "MemoryCache::prune()");
if (m_liveSize + m_deadSize <= m_capacity && m_maxDeadCapacity && m_deadSize <= m_maxDeadCapacity) // Fast path.
return;
if (m_inPruneResources)
diff --git a/chromium/third_party/WebKit/Source/core/fetch/MemoryCache.h b/chromium/third_party/WebKit/Source/core/loader/cache/MemoryCache.h
index d4aad799bbf..f174a11b9bf 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/MemoryCache.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/MemoryCache.h
@@ -22,10 +22,10 @@
pages from the web. It has a memory cache for these objects.
*/
-#ifndef MemoryCache_h
-#define MemoryCache_h
+#ifndef Cache_h
+#define Cache_h
-#include "core/fetch/Resource.h"
+#include "core/loader/cache/Resource.h"
#include "wtf/HashMap.h"
#include "wtf/Noncopyable.h"
#include "wtf/Vector.h"
@@ -181,7 +181,7 @@ private:
unsigned m_liveSize; // The number of bytes currently consumed by "live" resources in the cache.
unsigned m_deadSize; // The number of bytes currently consumed by "dead" resources in the cache.
- // Size-adjusted and popularity-aware LRU list collection for cache objects. This collection can hold
+ // Size-adjusted and popularity-aware LRU list collection for cache objects. This collection can hold
// more resources than the cached resource map, since it can also hold "stale" multiple versions of objects that are
// waiting to die when the clients referencing them go away.
Vector<LRUList, 32> m_allResources;
diff --git a/chromium/third_party/WebKit/Source/core/fetch/MemoryCacheTest.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/MemoryCacheTest.cpp
index 842bddbd928..1a365179772 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/MemoryCacheTest.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/MemoryCacheTest.cpp
@@ -29,11 +29,11 @@
*/
#include "config.h"
-#include "core/fetch/MemoryCache.h"
+#include "core/loader/cache/MemoryCache.h"
-#include "core/fetch/MockImageResourceClient.h"
-#include "core/fetch/RawResource.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/MockImageResourceClient.h"
+#include "core/loader/cache/RawResource.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/network/ResourceRequest.h"
#include "wtf/OwnPtr.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/MockImageResourceClient.h b/chromium/third_party/WebKit/Source/core/loader/cache/MockImageResourceClient.h
index 676c95ac5cf..adaa90f527a 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/MockImageResourceClient.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/MockImageResourceClient.h
@@ -31,7 +31,7 @@
#ifndef MockImageResourceClient_h
#define MockImageResourceClient_h
-#include "core/fetch/ImageResourceClient.h"
+#include "core/loader/cache/ImageResourceClient.h"
#include "core/page/Frame.h"
#include "core/platform/graphics/Image.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/RawResource.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/RawResource.cpp
index 5745d93c470..a2a0dc4eacd 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/RawResource.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/RawResource.cpp
@@ -24,12 +24,12 @@
*/
#include "config.h"
-#include "core/fetch/RawResource.h"
+#include "core/loader/cache/RawResource.h"
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourceClientWalker.h"
-#include "core/fetch/ResourceFetcher.h"
-#include "core/fetch/ResourceLoader.h"
+#include "core/loader/ResourceLoader.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourceClientWalker.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/platform/SharedBuffer.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/RawResource.h b/chromium/third_party/WebKit/Source/core/loader/cache/RawResource.h
index 0ed0bc08ce1..05cf3f4d8bf 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/RawResource.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/RawResource.h
@@ -23,8 +23,8 @@
#ifndef RawResource_h
#define RawResource_h
-#include "core/fetch/Resource.h"
-#include "core/fetch/ResourceClient.h"
+#include "core/loader/cache/Resource.h"
+#include "core/loader/cache/ResourceClient.h"
namespace WebCore {
class RawResourceCallback;
diff --git a/chromium/third_party/WebKit/Source/core/fetch/Resource.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/Resource.cpp
index 3c7eaab2a98..ae832e127d3 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/Resource.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/Resource.cpp
@@ -22,17 +22,17 @@
*/
#include "config.h"
-#include "core/fetch/Resource.h"
-
-#include "core/fetch/MemoryCache.h"
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourceClientWalker.h"
-#include "core/fetch/ResourceFetcher.h"
-#include "core/fetch/ResourceLoader.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/Resource.h"
+
#include "core/inspector/InspectorInstrumentation.h"
#include "core/loader/CachedMetadata.h"
#include "core/loader/CrossOriginAccessControl.h"
+#include "core/loader/ResourceLoader.h"
+#include "core/loader/cache/MemoryCache.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourceClientWalker.h"
+#include "core/loader/cache/ResourceFetcher.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/Logging.h"
#include "core/platform/PurgeableBuffer.h"
#include "core/platform/SharedBuffer.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/Resource.h b/chromium/third_party/WebKit/Source/core/loader/cache/Resource.h
index 0f6759218b6..dd092e3e9f9 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/Resource.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/Resource.h
@@ -23,8 +23,8 @@
#ifndef Resource_h
#define Resource_h
-#include "core/fetch/CachePolicy.h"
-#include "core/fetch/ResourceLoaderOptions.h"
+#include "core/loader/ResourceLoaderOptions.h"
+#include "core/loader/cache/CachePolicy.h"
#include "core/platform/Timer.h"
#include "core/platform/network/ResourceError.h"
#include "core/platform/network/ResourceLoadPriority.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourceClient.h b/chromium/third_party/WebKit/Source/core/loader/cache/ResourceClient.h
index ae7b7bbcf0c..ae7b7bbcf0c 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourceClient.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ResourceClient.h
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourceClientWalker.h b/chromium/third_party/WebKit/Source/core/loader/cache/ResourceClientWalker.h
index cd24b821dfe..aff5f1dcd0b 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourceClientWalker.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ResourceClientWalker.h
@@ -25,7 +25,7 @@
#ifndef ResourceClientWalker_h
#define ResourceClientWalker_h
-#include "core/fetch/ResourceClient.h"
+#include "core/loader/cache/ResourceClient.h"
#include "wtf/HashCountedSet.h"
#include "wtf/Vector.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/ResourceFetcher.cpp
index 65f5e86d0aa..28d7c8ced74 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ResourceFetcher.cpp
@@ -25,21 +25,10 @@
*/
#include "config.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "bindings/v8/ScriptController.h"
#include "core/dom/Document.h"
-#include "core/fetch/CSSStyleSheetResource.h"
-#include "core/fetch/DocumentResource.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/FontResource.h"
-#include "core/fetch/ImageResource.h"
-#include "core/fetch/MemoryCache.h"
-#include "core/fetch/RawResource.h"
-#include "core/fetch/ScriptResource.h"
-#include "core/fetch/ShaderResource.h"
-#include "core/fetch/TextTrackResource.h"
-#include "core/fetch/XSLStyleSheetResource.h"
#include "core/html/HTMLElement.h"
#include "core/html/HTMLFrameOwnerElement.h"
#include "core/html/HTMLImport.h"
@@ -50,6 +39,17 @@
#include "core/loader/PingLoader.h"
#include "core/loader/UniqueIdentifier.h"
#include "core/loader/appcache/ApplicationCacheHost.h"
+#include "core/loader/cache/CSSStyleSheetResource.h"
+#include "core/loader/cache/DocumentResource.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/FontResource.h"
+#include "core/loader/cache/ImageResource.h"
+#include "core/loader/cache/MemoryCache.h"
+#include "core/loader/cache/RawResource.h"
+#include "core/loader/cache/ScriptResource.h"
+#include "core/loader/cache/ShaderResource.h"
+#include "core/loader/cache/TextTrackResource.h"
+#include "core/loader/cache/XSLStyleSheetResource.h"
#include "core/page/ContentSecurityPolicy.h"
#include "core/page/DOMWindow.h"
#include "core/page/Frame.h"
@@ -204,7 +204,7 @@ Frame* ResourceFetcher::frame() const
ResourcePtr<ImageResource> ResourceFetcher::requestImage(FetchRequest& request)
{
if (Frame* f = frame()) {
- if (f->document()->pageDismissalEventBeingDispatched() != Document::NoDismissal) {
+ if (f->loader()->pageDismissalEventBeingDispatched() != FrameLoader::NoDismissal) {
KURL requestURL = request.resourceRequest().url();
if (requestURL.isValid() && canRequest(Resource::Image, requestURL, request.options(), request.forPreload()))
PingLoader::loadImage(f, requestURL);
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourceFetcher.h b/chromium/third_party/WebKit/Source/core/loader/cache/ResourceFetcher.h
index 4f4671011cf..c2ffa7ade12 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourceFetcher.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ResourceFetcher.h
@@ -26,12 +26,12 @@
#ifndef ResourceFetcher_h
#define ResourceFetcher_h
-#include "core/fetch/CachePolicy.h"
-#include "core/fetch/FetchInitiatorInfo.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/Resource.h"
-#include "core/fetch/ResourceLoaderHost.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/ResourceLoaderHost.h"
+#include "core/loader/cache/CachePolicy.h"
+#include "core/loader/cache/FetchInitiatorInfo.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/Resource.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/Timer.h"
#include "wtf/Deque.h"
#include "wtf/HashMap.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/ResourceFetcherTest.cpp
index 951dbfb0f16..977f519ee80 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ResourceFetcherTest.cpp
@@ -29,14 +29,14 @@
*/
#include "config.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/ResourceFetcher.h"
-#include "core/fetch/FetchInitiatorInfo.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/MemoryCache.h"
-#include "core/fetch/ResourcePtr.h"
#include "core/html/HTMLDocument.h"
#include "core/loader/DocumentLoader.h"
+#include "core/loader/cache/FetchInitiatorInfo.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/MemoryCache.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/network/ResourceRequest.h"
#include <gtest/gtest.h>
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourcePtr.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/ResourcePtr.cpp
index 4ae11a549b6..bbb43520d88 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourcePtr.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ResourcePtr.cpp
@@ -24,7 +24,7 @@
*/
#include "config.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ResourcePtr.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourcePtr.h b/chromium/third_party/WebKit/Source/core/loader/cache/ResourcePtr.h
index a9bdd5fcd79..dda4d2d748b 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourcePtr.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ResourcePtr.h
@@ -26,7 +26,7 @@
#ifndef ResourcePtr_h
#define ResourcePtr_h
-#include "core/fetch/Resource.h"
+#include "core/loader/cache/Resource.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ScriptResource.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/ScriptResource.cpp
index 330a1bf5779..b6e9189bc26 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ScriptResource.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ScriptResource.cpp
@@ -25,7 +25,7 @@
*/
#include "config.h"
-#include "core/fetch/ScriptResource.h"
+#include "core/loader/cache/ScriptResource.h"
#include "core/loader/TextResourceDecoder.h"
#include "core/platform/MIMETypeRegistry.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ScriptResource.h b/chromium/third_party/WebKit/Source/core/loader/cache/ScriptResource.h
index 441a3b06099..02d90ca986b 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ScriptResource.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ScriptResource.h
@@ -26,7 +26,7 @@
#ifndef ScriptResource_h
#define ScriptResource_h
-#include "core/fetch/Resource.h"
+#include "core/loader/cache/Resource.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ShaderResource.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/ShaderResource.cpp
index bacaef99c9a..ec60ae11bef 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ShaderResource.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ShaderResource.cpp
@@ -28,7 +28,7 @@
*/
#include "config.h"
-#include "core/fetch/ShaderResource.h"
+#include "core/loader/cache/ShaderResource.h"
#include "core/loader/TextResourceDecoder.h"
#include "core/platform/SharedBuffer.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ShaderResource.h b/chromium/third_party/WebKit/Source/core/loader/cache/ShaderResource.h
index 94856638aa8..f7d2ffe7fbb 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ShaderResource.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/ShaderResource.h
@@ -30,7 +30,7 @@
#ifndef ShaderResource_h
#define ShaderResource_h
-#include "core/fetch/Resource.h"
+#include "core/loader/cache/Resource.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/StyleSheetResourceClient.h b/chromium/third_party/WebKit/Source/core/loader/cache/StyleSheetResourceClient.h
index 6c12bf39a0c..02dc5bcabc6 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/StyleSheetResourceClient.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/StyleSheetResourceClient.h
@@ -26,7 +26,7 @@
#ifndef StyleSheetResourceClient_h
#define StyleSheetResourceClient_h
-#include "core/fetch/ResourceClient.h"
+#include "core/loader/cache/ResourceClient.h"
#include "weborigin/KURL.h"
#include "wtf/Forward.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/TextTrackResource.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/TextTrackResource.cpp
index 5093d7e26d3..cf5e4a13f07 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/TextTrackResource.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/TextTrackResource.cpp
@@ -25,10 +25,10 @@
#include "config.h"
-#include "core/fetch/TextTrackResource.h"
+#include "core/loader/cache/TextTrackResource.h"
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourceClientWalker.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourceClientWalker.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/TextTrackResource.h b/chromium/third_party/WebKit/Source/core/loader/cache/TextTrackResource.h
index 3599f0bfa4d..c3c0eba0955 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/TextTrackResource.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/TextTrackResource.h
@@ -26,7 +26,7 @@
#ifndef TextTrackResource_h
#define TextTrackResource_h
-#include "core/fetch/Resource.h"
+#include "core/loader/cache/Resource.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.cpp b/chromium/third_party/WebKit/Source/core/loader/cache/XSLStyleSheetResource.cpp
index 5787631d1cd..9d9a014b78e 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/XSLStyleSheetResource.cpp
@@ -25,11 +25,11 @@
*/
#include "config.h"
-#include "core/fetch/XSLStyleSheetResource.h"
+#include "core/loader/cache/XSLStyleSheetResource.h"
-#include "core/fetch/ResourceClientWalker.h"
-#include "core/fetch/StyleSheetResourceClient.h"
#include "core/loader/TextResourceDecoder.h"
+#include "core/loader/cache/ResourceClientWalker.h"
+#include "core/loader/cache/StyleSheetResourceClient.h"
#include "core/platform/SharedBuffer.h"
#include "wtf/Vector.h"
diff --git a/chromium/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.h b/chromium/third_party/WebKit/Source/core/loader/cache/XSLStyleSheetResource.h
index 52e6814f635..4cab515a463 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.h
+++ b/chromium/third_party/WebKit/Source/core/loader/cache/XSLStyleSheetResource.h
@@ -26,7 +26,7 @@
#ifndef XSLStyleSheetResource_h
#define XSLStyleSheetResource_h
-#include "core/fetch/Resource.h"
+#include "core/loader/cache/Resource.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/page/AutoscrollController.cpp b/chromium/third_party/WebKit/Source/core/page/AutoscrollController.cpp
index c7174c11bf0..71f922e4d16 100644
--- a/chromium/third_party/WebKit/Source/core/page/AutoscrollController.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/AutoscrollController.cpp
@@ -132,14 +132,11 @@ void AutoscrollController::updateAutoscrollRenderer()
void AutoscrollController::updateDragAndDrop(Node* dropTargetNode, const IntPoint& eventPosition, double eventTime)
{
- if (!dropTargetNode || !dropTargetNode->renderer()) {
+ if (!dropTargetNode) {
stopAutoscrollTimer();
return;
}
- if (m_autoscrollRenderer && m_autoscrollRenderer->frame() != dropTargetNode->renderer()->frame())
- return;
-
RenderBox* scrollable = RenderBox::findAutoscrollable(dropTargetNode->renderer());
if (!scrollable) {
stopAutoscrollTimer();
diff --git a/chromium/third_party/WebKit/Source/core/page/Chrome.cpp b/chromium/third_party/WebKit/Source/core/page/Chrome.cpp
index 8c37e2741a0..9fed91c3719 100644
--- a/chromium/third_party/WebKit/Source/core/page/Chrome.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/Chrome.cpp
@@ -159,8 +159,8 @@ bool Chrome::canRunModal() const
static bool canRunModalIfDuringPageDismissal(Page* page, ChromeClient::DialogType dialog, const String& message)
{
for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
- Document::PageDismissalType dismissal = frame->document()->pageDismissalEventBeingDispatched();
- if (dismissal != Document::NoDismissal)
+ FrameLoader::PageDismissalType dismissal = frame->loader()->pageDismissalEventBeingDispatched();
+ if (dismissal != FrameLoader::NoDismissal)
return page->chrome().client()->shouldRunModalDialogDuringPageDismissal(dialog, message, dismissal);
}
return true;
diff --git a/chromium/third_party/WebKit/Source/core/page/ChromeClient.h b/chromium/third_party/WebKit/Source/core/page/ChromeClient.h
index 9ae397b19e2..d97cbff82dd 100644
--- a/chromium/third_party/WebKit/Source/core/page/ChromeClient.h
+++ b/chromium/third_party/WebKit/Source/core/page/ChromeClient.h
@@ -255,7 +255,7 @@ public:
PromptDialog = 2,
HTMLDialog = 3
};
- virtual bool shouldRunModalDialogDuringPageDismissal(const DialogType&, const String& dialogMessage, Document::PageDismissalType) const { UNUSED_PARAM(dialogMessage); return true; }
+ virtual bool shouldRunModalDialogDuringPageDismissal(const DialogType&, const String& dialogMessage, FrameLoader::PageDismissalType) const { UNUSED_PARAM(dialogMessage); return true; }
virtual void numWheelEventHandlersChanged(unsigned) = 0;
diff --git a/chromium/third_party/WebKit/Source/core/page/ContextMenuClient.h b/chromium/third_party/WebKit/Source/core/page/ContextMenuClient.h
index 76a2ee46b01..964924ba5fd 100644
--- a/chromium/third_party/WebKit/Source/core/page/ContextMenuClient.h
+++ b/chromium/third_party/WebKit/Source/core/page/ContextMenuClient.h
@@ -34,7 +34,6 @@ class ContextMenuClient {
public:
virtual ~ContextMenuClient() { }
virtual void showContextMenu(const ContextMenu*) = 0;
- virtual void clearContextMenu() = 0;
};
}
diff --git a/chromium/third_party/WebKit/Source/core/page/ContextMenuController.cpp b/chromium/third_party/WebKit/Source/core/page/ContextMenuController.cpp
index 77797e389c8..c12a904cd04 100644
--- a/chromium/third_party/WebKit/Source/core/page/ContextMenuController.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/ContextMenuController.cpp
@@ -64,17 +64,6 @@ void ContextMenuController::clearContextMenu()
if (m_menuProvider)
m_menuProvider->contextMenuCleared();
m_menuProvider = 0;
- m_hitTestResult = HitTestResult();
- m_client->clearContextMenu();
-}
-
-void ContextMenuController::documentDetached(Document* document)
-{
- if (Node* innerNode = m_hitTestResult.innerNode()) {
- // Invalidate the context menu info if its target document is detached.
- if (innerNode->document() == document)
- clearContextMenu();
- }
}
void ContextMenuController::handleContextMenuEvent(Event* event)
diff --git a/chromium/third_party/WebKit/Source/core/page/ContextMenuController.h b/chromium/third_party/WebKit/Source/core/page/ContextMenuController.h
index e36bedbd666..a2b6ae6f6f6 100644
--- a/chromium/third_party/WebKit/Source/core/page/ContextMenuController.h
+++ b/chromium/third_party/WebKit/Source/core/page/ContextMenuController.h
@@ -38,7 +38,6 @@ namespace WebCore {
class ContextMenuClient;
class ContextMenuItem;
class ContextMenuProvider;
- class Document;
class Event;
class Page;
@@ -52,8 +51,6 @@ namespace WebCore {
ContextMenu* contextMenu() const { return m_contextMenu.get(); }
void clearContextMenu();
- void documentDetached(Document*);
-
void handleContextMenuEvent(Event*);
void showContextMenu(Event*, PassRefPtr<ContextMenuProvider>);
diff --git a/chromium/third_party/WebKit/Source/core/page/DOMWindow.cpp b/chromium/third_party/WebKit/Source/core/page/DOMWindow.cpp
index 6d15a99982a..aac917c7d46 100644
--- a/chromium/third_party/WebKit/Source/core/page/DOMWindow.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/DOMWindow.cpp
@@ -70,7 +70,6 @@
#include "core/page/Console.h"
#include "core/page/CreateWindow.h"
#include "core/page/DOMPoint.h"
-#include "core/page/DOMWindowLifecycleNotifier.h"
#include "core/page/EventHandler.h"
#include "core/page/Frame.h"
#include "core/page/FrameTree.h"
@@ -639,20 +638,14 @@ Storage* DOMWindow::sessionStorage(ExceptionState& es) const
if (!document)
return 0;
- String accessDeniedMessage = "Access to 'sessionStorage' is denied for this document.";
if (!document->securityOrigin()->canAccessLocalStorage()) {
- if (document->isSandboxed(SandboxOrigin))
- es.throwDOMException(SecurityError, accessDeniedMessage + " The document is sandboxed and lacks the \"allow-same-origin\" flag.");
- else if (document->url().protocolIs("data"))
- es.throwDOMException(SecurityError, accessDeniedMessage + " Storage is disabled inside 'data:' URLs.");
- else
- es.throwDOMException(SecurityError, accessDeniedMessage);
+ es.throwDOMException(SecurityError);
return 0;
}
if (m_sessionStorage) {
if (!m_sessionStorage->area()->canAccessStorage(m_frame)) {
- es.throwDOMException(SecurityError, accessDeniedMessage);
+ es.throwDOMException(SecurityError);
return 0;
}
return m_sessionStorage.get();
@@ -664,7 +657,7 @@ Storage* DOMWindow::sessionStorage(ExceptionState& es) const
OwnPtr<StorageArea> storageArea = page->sessionStorage()->storageArea(document->securityOrigin());
if (!storageArea->canAccessStorage(m_frame)) {
- es.throwDOMException(SecurityError, accessDeniedMessage);
+ es.throwDOMException(SecurityError);
return 0;
}
@@ -681,20 +674,14 @@ Storage* DOMWindow::localStorage(ExceptionState& es) const
if (!document)
return 0;
- String accessDeniedMessage = "Access to 'localStorage' is denied for this document.";
if (!document->securityOrigin()->canAccessLocalStorage()) {
- if (document->isSandboxed(SandboxOrigin))
- es.throwDOMException(SecurityError, accessDeniedMessage + " The document is sandboxed and lacks the \"allow-same-origin\" flag.");
- else if (document->url().protocolIs("data"))
- es.throwDOMException(SecurityError, accessDeniedMessage + " Storage is disabled inside 'data:' URLs.");
- else
- es.throwDOMException(SecurityError, accessDeniedMessage);
+ es.throwDOMException(SecurityError);
return 0;
}
if (m_localStorage) {
if (!m_localStorage->area()->canAccessStorage(m_frame)) {
- es.throwDOMException(SecurityError, accessDeniedMessage);
+ es.throwDOMException(SecurityError);
return 0;
}
return m_localStorage.get();
@@ -709,7 +696,7 @@ Storage* DOMWindow::localStorage(ExceptionState& es) const
OwnPtr<StorageArea> storageArea = StorageNamespace::localStorageArea(document->securityOrigin());
if (!storageArea->canAccessStorage(m_frame)) {
- es.throwDOMException(SecurityError, accessDeniedMessage);
+ es.throwDOMException(SecurityError);
return 0;
}
@@ -736,7 +723,7 @@ void DOMWindow::postMessage(PassRefPtr<SerializedScriptValue> message, const Mes
// It doesn't make sense target a postMessage at a unique origin
// because there's no way to represent a unique origin in a string.
if (target->isUnique()) {
- es.throwDOMException(SyntaxError, "Invalid target origin '" + targetOrigin + "' in a call to 'postMessage'.");
+ es.throwDOMException(SyntaxError);
return;
}
}
@@ -1254,7 +1241,11 @@ double DOMWindow::devicePixelRatio() const
if (!m_frame)
return 0.0;
- return m_frame->devicePixelRatio();
+ Page* page = m_frame->page();
+ if (!page)
+ return 0.0;
+
+ return page->deviceScaleFactor();
}
void DOMWindow::scrollBy(int x, int y) const
@@ -1513,7 +1504,8 @@ void DOMWindow::removeAllEventListeners()
{
EventTarget::removeAllEventListeners();
- lifecycleNotifier()->notifyRemoveAllEventListeners();
+ if (DeviceMotionController* controller = DeviceMotionController::from(document()))
+ controller->stopUpdating();
if (DeviceOrientationController* controller = DeviceOrientationController::from(page()))
controller->removeAllDeviceEventListeners(this);
if (Document* document = this->document())
@@ -1738,15 +1730,5 @@ DOMWindow* DOMWindow::anonymousIndexedGetter(uint32_t index)
return 0;
}
-DOMWindowLifecycleNotifier* DOMWindow::lifecycleNotifier()
-{
- return static_cast<DOMWindowLifecycleNotifier*>(LifecycleContext::lifecycleNotifier());
-}
-
-PassOwnPtr<LifecycleNotifier> DOMWindow::createLifecycleNotifier()
-{
- return DOMWindowLifecycleNotifier::create(this);
-}
-
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/page/DOMWindow.h b/chromium/third_party/WebKit/Source/core/page/DOMWindow.h
index 8a1df0ed226..ae98cf0a1fb 100644
--- a/chromium/third_party/WebKit/Source/core/page/DOMWindow.h
+++ b/chromium/third_party/WebKit/Source/core/page/DOMWindow.h
@@ -30,7 +30,6 @@
#include "bindings/v8/ScriptWrappable.h"
#include "core/dom/EventTarget.h"
#include "core/page/FrameDestructionObserver.h"
-#include "core/platform/LifecycleContext.h"
#include "core/platform/Supplementable.h"
#include "wtf/Forward.h"
@@ -48,7 +47,6 @@ namespace WebCore {
class Database;
class DatabaseCallback;
class Document;
- class DOMWindowLifecycleNotifier;
class Element;
class EventListener;
class ExceptionState;
@@ -81,7 +79,7 @@ namespace WebCore {
enum SetLocationLocking { LockHistoryBasedOnGestureState, LockHistoryAndBackForwardList };
- class DOMWindow : public RefCounted<DOMWindow>, public ScriptWrappable, public EventTarget, public FrameDestructionObserver, public Supplementable<DOMWindow>, public LifecycleContext {
+ class DOMWindow : public RefCounted<DOMWindow>, public ScriptWrappable, public EventTarget, public FrameDestructionObserver, public Supplementable<DOMWindow> {
public:
static PassRefPtr<DOMWindow> create(Frame* frame) { return adoptRef(new DOMWindow(frame)); }
virtual ~DOMWindow();
@@ -374,16 +372,11 @@ namespace WebCore {
bool isInsecureScriptAccess(DOMWindow* activeWindow, const String& urlString);
- protected:
- DOMWindowLifecycleNotifier* lifecycleNotifier();
-
private:
explicit DOMWindow(Frame*);
Page* page();
- virtual PassOwnPtr<LifecycleNotifier> createLifecycleNotifier() OVERRIDE;
-
virtual void frameDestroyed() OVERRIDE;
virtual void willDetachPage() OVERRIDE;
diff --git a/chromium/third_party/WebKit/Source/core/page/DOMWindowBase64.cpp b/chromium/third_party/WebKit/Source/core/page/DOMWindowBase64.cpp
index 6411d142135..78c0ea1a51a 100644
--- a/chromium/third_party/WebKit/Source/core/page/DOMWindowBase64.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/DOMWindowBase64.cpp
@@ -65,7 +65,7 @@ String atob(void*, const String& encodedString, ExceptionState& es)
}
Vector<char> out;
- if (!base64Decode(encodedString, out, Base64FailOnInvalidCharacterOrExcessPadding)) {
+ if (!base64Decode(encodedString, out, Base64FailOnInvalidCharacter, Base64StrictPaddingValidation)) {
es.throwDOMException(InvalidCharacterError, "'atob' failed: The string to be decoded is not correctly encoded.");
return String();
}
diff --git a/chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleNotifier.cpp b/chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleNotifier.cpp
deleted file mode 100644
index 782198aa503..00000000000
--- a/chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleNotifier.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include "config.h"
-#include "core/page/DOMWindowLifecycleNotifier.h"
-
-namespace WebCore {
-
-DOMWindowLifecycleNotifier::DOMWindowLifecycleNotifier(LifecycleContext* context)
- : LifecycleNotifier(context)
-{
-}
-
-void DOMWindowLifecycleNotifier::addObserver(LifecycleObserver* observer, LifecycleObserver::Type type)
-{
- if (type == LifecycleObserver::DOMWindowLifecycleObserverType) {
- RELEASE_ASSERT(m_iterating != IteratingOverDOMWindowObservers);
- m_windowObservers.add(static_cast<DOMWindowLifecycleObserver*>(observer));
- }
-
- LifecycleNotifier::addObserver(observer, type);
-}
-
-void DOMWindowLifecycleNotifier::removeObserver(LifecycleObserver* observer, LifecycleObserver::Type type)
-{
- if (type == LifecycleObserver::DOMWindowLifecycleObserverType) {
- RELEASE_ASSERT(m_iterating != IteratingOverDOMWindowObservers);
- m_windowObservers.remove(static_cast<DOMWindowLifecycleObserver*>(observer));
- }
-
- LifecycleNotifier::removeObserver(observer, type);
-}
-
-} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleNotifier.h b/chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleNotifier.h
deleted file mode 100644
index 49e1aa04036..00000000000
--- a/chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleNotifier.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef DOMWindowLifecycleNotifier_h
-#define DOMWindowLifecycleNotifier_h
-
-#include "core/page/DOMWindowLifecycleObserver.h"
-#include "core/platform/LifecycleNotifier.h"
-#include "wtf/PassOwnPtr.h"
-#include "wtf/TemporaryChange.h"
-
-namespace WebCore {
-
-class DOMWindow;
-
-class DOMWindowLifecycleNotifier : public LifecycleNotifier {
-public:
- static PassOwnPtr<DOMWindowLifecycleNotifier> create(LifecycleContext*);
-
- void notifyRemoveAllEventListeners();
-
- virtual void addObserver(LifecycleObserver*, LifecycleObserver::Type) OVERRIDE;
- virtual void removeObserver(LifecycleObserver*, LifecycleObserver::Type) OVERRIDE;
-
-private:
- explicit DOMWindowLifecycleNotifier(LifecycleContext*);
-
- typedef HashSet<DOMWindowLifecycleObserver*> DOMWindowObserverSet;
- DOMWindowObserverSet m_windowObservers;
-};
-
-inline PassOwnPtr<DOMWindowLifecycleNotifier> DOMWindowLifecycleNotifier::create(LifecycleContext* context)
-{
- return adoptPtr(new DOMWindowLifecycleNotifier(context));
-}
-
-inline void DOMWindowLifecycleNotifier::notifyRemoveAllEventListeners()
-{
- TemporaryChange<IterationType> scope(this->m_iterating, IteratingOverDOMWindowObservers);
- for (DOMWindowObserverSet::iterator it = m_windowObservers.begin(); it != m_windowObservers.end(); ++it)
- (*it)->removeAllEventListeners();
-}
-
-} // namespace WebCore
-
-#endif // DOMWindowLifecycleNotifier_h
diff --git a/chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleObserver.cpp b/chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleObserver.cpp
deleted file mode 100644
index bd939d2dcc9..00000000000
--- a/chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleObserver.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include "config.h"
-#include "core/page/DOMWindowLifecycleObserver.h"
-
-#include "core/page/DOMWindow.h"
-
-namespace WebCore {
-
-DOMWindowLifecycleObserver::DOMWindowLifecycleObserver(DOMWindow* window)
- : LifecycleObserver(window, DOMWindowLifecycleObserverType)
-{
-}
-
-DOMWindowLifecycleObserver::~DOMWindowLifecycleObserver()
-{
- observeContext(0, DOMWindowLifecycleObserverType);
-}
-
-DOMWindow* DOMWindowLifecycleObserver::window() const
-{
- return static_cast<DOMWindow*>(lifecycleContext());
-}
-
-} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleObserver.h b/chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleObserver.h
deleted file mode 100644
index 79aa15369d0..00000000000
--- a/chromium/third_party/WebKit/Source/core/page/DOMWindowLifecycleObserver.h
+++ /dev/null
@@ -1,48 +0,0 @@
-
-/*
- * Copyright (C) 2013 Google Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef DOMWindowLifecycleObserver_h
-#define DOMWindowLifecycleObserver_h
-
-#include "core/platform/LifecycleObserver.h"
-
-namespace WebCore {
-
-class DOMWindow;
-
-class DOMWindowLifecycleObserver : public LifecycleObserver {
-public:
- explicit DOMWindowLifecycleObserver(DOMWindow*);
- virtual ~DOMWindowLifecycleObserver();
-
- DOMWindow* window() const;
-
- virtual void removeAllEventListeners() { }
-};
-
-} // namespace WebCore
-
-#endif // DOMWindowLifecycleObserver_h
diff --git a/chromium/third_party/WebKit/Source/core/page/DragController.cpp b/chromium/third_party/WebKit/Source/core/page/DragController.cpp
index b2c61293e7d..bf38105b806 100644
--- a/chromium/third_party/WebKit/Source/core/page/DragController.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/DragController.cpp
@@ -44,14 +44,14 @@
#include "core/editing/ReplaceSelectionCommand.h"
#include "core/editing/htmlediting.h"
#include "core/editing/markup.h"
-#include "core/fetch/ImageResource.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/html/HTMLAnchorElement.h"
#include "core/html/HTMLFormElement.h"
#include "core/html/HTMLInputElement.h"
#include "core/html/HTMLPlugInElement.h"
#include "core/loader/FrameLoadRequest.h"
#include "core/loader/FrameLoader.h"
+#include "core/loader/cache/ImageResource.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/DragActions.h"
#include "core/page/DragClient.h"
#include "core/page/DragSession.h"
diff --git a/chromium/third_party/WebKit/Source/core/page/EventHandler.cpp b/chromium/third_party/WebKit/Source/core/page/EventHandler.cpp
index 6adea5a3b6a..8ab18afae21 100644
--- a/chromium/third_party/WebKit/Source/core/page/EventHandler.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/EventHandler.cpp
@@ -50,12 +50,12 @@
#include "core/editing/FrameSelection.h"
#include "core/editing/TextIterator.h"
#include "core/editing/htmlediting.h"
-#include "core/fetch/ImageResource.h"
#include "core/history/BackForwardController.h"
#include "core/html/HTMLFrameElementBase.h"
#include "core/html/HTMLFrameSetElement.h"
#include "core/html/HTMLInputElement.h"
#include "core/loader/FrameLoader.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/Chrome.h"
#include "core/page/DragController.h"
#include "core/page/DragState.h"
diff --git a/chromium/third_party/WebKit/Source/core/page/Frame.cpp b/chromium/third_party/WebKit/Source/core/page/Frame.cpp
index adbe6d3cb02..a3e42b6f9d5 100644
--- a/chromium/third_party/WebKit/Source/core/page/Frame.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/Frame.cpp
@@ -39,10 +39,10 @@
#include "core/editing/InputMethodController.h"
#include "core/editing/htmlediting.h"
#include "core/editing/markup.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/html/HTMLFrameElementBase.h"
#include "core/loader/FrameLoader.h"
#include "core/loader/FrameLoaderClient.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/Chrome.h"
#include "core/page/ChromeClient.h"
#include "core/page/DOMWindow.h"
@@ -709,15 +709,4 @@ PassOwnPtr<DragImage> Frame::dragImageForSelection()
return DragImage::create(image.get());
}
-double Frame::devicePixelRatio() const
-{
- if (!m_page)
- return 0;
-
- double ratio = m_page->deviceScaleFactor();
- if (RuntimeEnabledFeatures::devicePixelRatioIncludesZoomEnabled())
- ratio *= pageZoomFactor();
- return ratio;
-}
-
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/page/Frame.h b/chromium/third_party/WebKit/Source/core/page/Frame.h
index 3590900ccc9..47fdc5a1275 100644
--- a/chromium/third_party/WebKit/Source/core/page/Frame.h
+++ b/chromium/third_party/WebKit/Source/core/page/Frame.h
@@ -135,7 +135,6 @@ namespace WebCore {
void setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor);
void deviceOrPageScaleFactorChanged();
- double devicePixelRatio() const;
#if ENABLE(ORIENTATION_EVENTS)
// Orientation is the interface orientation in degrees. Some examples are:
diff --git a/chromium/third_party/WebKit/Source/core/page/FrameView.cpp b/chromium/third_party/WebKit/Source/core/page/FrameView.cpp
index 8f0cb6b8f1c..72c0b0293a3 100644
--- a/chromium/third_party/WebKit/Source/core/page/FrameView.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/FrameView.cpp
@@ -36,7 +36,6 @@
#include "core/dom/DocumentMarkerController.h"
#include "core/dom/OverflowEvent.h"
#include "core/editing/FrameSelection.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/html/HTMLFrameElement.h"
#include "core/html/HTMLHtmlElement.h"
#include "core/html/HTMLPlugInImageElement.h"
@@ -44,6 +43,7 @@
#include "core/loader/FrameLoader.h"
#include "core/loader/FrameLoaderClient.h"
#include "core/loader/TextResourceDecoder.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/Chrome.h"
#include "core/page/ChromeClient.h"
#include "core/page/EventHandler.h"
diff --git a/chromium/third_party/WebKit/Source/core/page/ImageBitmap.cpp b/chromium/third_party/WebKit/Source/core/page/ImageBitmap.cpp
index 006594a9c0d..a4301c031e9 100644
--- a/chromium/third_party/WebKit/Source/core/page/ImageBitmap.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/ImageBitmap.cpp
@@ -124,17 +124,6 @@ ImageBitmap::ImageBitmap(ImageBitmap* bitmap, const IntRect& cropRect)
ScriptWrappable::init(this);
}
-ImageBitmap::ImageBitmap(Image* image, const IntRect& cropRect)
- : m_cropRect(cropRect)
- , m_imageElement(0)
-{
- IntRect srcRect = intersection(cropRect, IntRect(IntPoint(), image->size()));
- m_bitmap = cropImage(image, cropRect);
- m_bitmapRect = IntRect(IntPoint(max(0, -cropRect.x()), max(0, -cropRect.y())), srcRect.size());
-
- ScriptWrappable::init(this);
-}
-
ImageBitmap::~ImageBitmap()
{
if (m_imageElement)
@@ -144,37 +133,36 @@ ImageBitmap::~ImageBitmap()
PassRefPtr<ImageBitmap> ImageBitmap::create(HTMLImageElement* image, const IntRect& cropRect)
{
IntRect normalizedCropRect = normalizeRect(cropRect);
- return adoptRef(new ImageBitmap(image, normalizedCropRect));
+ RefPtr<ImageBitmap> imageBitmap(adoptRef(new ImageBitmap(image, normalizedCropRect)));
+ return imageBitmap.release();
}
PassRefPtr<ImageBitmap> ImageBitmap::create(HTMLVideoElement* video, const IntRect& cropRect)
{
IntRect normalizedCropRect = normalizeRect(cropRect);
- return adoptRef(new ImageBitmap(video, normalizedCropRect));
+ RefPtr<ImageBitmap> imageBitmap(adoptRef(new ImageBitmap(video, normalizedCropRect)));
+ return imageBitmap.release();
}
PassRefPtr<ImageBitmap> ImageBitmap::create(HTMLCanvasElement* canvas, const IntRect& cropRect)
{
IntRect normalizedCropRect = normalizeRect(cropRect);
- return adoptRef(new ImageBitmap(canvas, normalizedCropRect));
+ RefPtr<ImageBitmap> imageBitmap(adoptRef(new ImageBitmap(canvas, normalizedCropRect)));
+ return imageBitmap.release();
}
PassRefPtr<ImageBitmap> ImageBitmap::create(ImageData* data, const IntRect& cropRect)
{
IntRect normalizedCropRect = normalizeRect(cropRect);
- return adoptRef(new ImageBitmap(data, normalizedCropRect));
+ RefPtr<ImageBitmap> imageBitmap(adoptRef(new ImageBitmap(data, normalizedCropRect)));
+ return imageBitmap.release();
}
PassRefPtr<ImageBitmap> ImageBitmap::create(ImageBitmap* bitmap, const IntRect& cropRect)
{
IntRect normalizedCropRect = normalizeRect(cropRect);
- return adoptRef(new ImageBitmap(bitmap, normalizedCropRect));
-}
-
-PassRefPtr<ImageBitmap> ImageBitmap::create(Image* image, const IntRect& cropRect)
-{
- IntRect normalizedCropRect = normalizeRect(cropRect);
- return adoptRef(new ImageBitmap(image, normalizedCropRect));
+ RefPtr<ImageBitmap> imageBitmap(adoptRef(new ImageBitmap(bitmap, normalizedCropRect)));
+ return imageBitmap.release();
}
void ImageBitmap::notifyImageSourceChanged()
diff --git a/chromium/third_party/WebKit/Source/core/page/ImageBitmap.h b/chromium/third_party/WebKit/Source/core/page/ImageBitmap.h
index 2182f166d15..9ad5e765a37 100644
--- a/chromium/third_party/WebKit/Source/core/page/ImageBitmap.h
+++ b/chromium/third_party/WebKit/Source/core/page/ImageBitmap.h
@@ -27,7 +27,6 @@ public:
static PassRefPtr<ImageBitmap> create(HTMLCanvasElement*, const IntRect&);
static PassRefPtr<ImageBitmap> create(ImageData*, const IntRect&);
static PassRefPtr<ImageBitmap> create(ImageBitmap*, const IntRect&);
- static PassRefPtr<ImageBitmap> create(Image*, const IntRect&);
PassRefPtr<Image> bitmapImage() const;
PassRefPtr<HTMLImageElement> imageElement() const { return m_imageElement; }
@@ -47,7 +46,6 @@ private:
ImageBitmap(HTMLCanvasElement*, const IntRect&);
ImageBitmap(ImageData*, const IntRect&);
ImageBitmap(ImageBitmap*, const IntRect&);
- ImageBitmap(Image*, const IntRect&);
// ImageLoaderClient
virtual void notifyImageSourceChanged();
diff --git a/chromium/third_party/WebKit/Source/core/page/ImageBitmapFactories.cpp b/chromium/third_party/WebKit/Source/core/page/ImageBitmapFactories.cpp
new file mode 100644
index 00000000000..a68e94e4eae
--- /dev/null
+++ b/chromium/third_party/WebKit/Source/core/page/ImageBitmapFactories.cpp
@@ -0,0 +1,223 @@
+/*
+ * Copyright (c) 2013, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "core/page/ImageBitmapFactories.h"
+
+#include "RuntimeEnabledFeatures.h"
+#include "V8ImageBitmap.h"
+#include "bindings/v8/ExceptionState.h"
+#include "core/dom/ExceptionCode.h"
+#include "core/html/HTMLCanvasElement.h"
+#include "core/html/HTMLImageElement.h"
+#include "core/html/HTMLVideoElement.h"
+#include "core/html/ImageData.h"
+#include "core/html/canvas/CanvasRenderingContext2D.h"
+#include "core/page/DOMWindow.h"
+#include "core/page/ImageBitmap.h"
+
+namespace WebCore {
+
+namespace ImageBitmapFactories {
+
+static LayoutSize sizeFor(HTMLImageElement* image)
+{
+ if (ImageResource* cachedImage = image->cachedImage())
+ return cachedImage->imageSizeForRenderer(image->renderer(), 1.0f); // FIXME: Not sure about this.
+ return IntSize();
+}
+
+static IntSize sizeFor(HTMLVideoElement* video)
+{
+ if (MediaPlayer* player = video->player())
+ return player->naturalSize();
+ return IntSize();
+}
+
+static ScriptObject resolveImageBitmap(PassRefPtr<ImageBitmap> imageBitmap)
+{
+ // Promises must be enabled.
+ ASSERT(RuntimeEnabledFeatures::promiseEnabled());
+
+ RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create();
+ resolver->fulfill(imageBitmap);
+ return resolver->promise();
+}
+
+ScriptObject createImageBitmap(EventTarget* eventTarget, HTMLImageElement* image, ExceptionState& es)
+{
+ LayoutSize s = sizeFor(image);
+ return createImageBitmap(eventTarget, image, 0, 0, s.width(), s.height(), es);
+}
+
+ScriptObject createImageBitmap(EventTarget* eventTarget, HTMLImageElement* image, int sx, int sy, int sw, int sh, ExceptionState& es)
+{
+ if (!image) {
+ es.throwTypeError();
+ return ScriptObject();
+ }
+ if (!image->cachedImage()) {
+ es.throwDOMException(InvalidStateError);
+ return ScriptObject();
+ }
+ if (image->cachedImage()->image()->isSVGImage()) {
+ es.throwDOMException(InvalidStateError);
+ return ScriptObject();
+ }
+ if (!sw || !sh) {
+ es.throwDOMException(IndexSizeError);
+ return ScriptObject();
+ }
+ if (!image->cachedImage()->image()->hasSingleSecurityOrigin()) {
+ es.throwDOMException(SecurityError);
+ return ScriptObject();
+ }
+ if (!image->cachedImage()->passesAccessControlCheck(eventTarget->toDOMWindow()->document()->securityOrigin())
+ && eventTarget->toDOMWindow()->document()->securityOrigin()->taintsCanvas(image->src())) {
+ es.throwDOMException(SecurityError);
+ return ScriptObject();
+ }
+ // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
+ return resolveImageBitmap(ImageBitmap::create(image, IntRect(sx, sy, sw, sh)));
+}
+
+ScriptObject createImageBitmap(EventTarget* eventTarget, HTMLVideoElement* video, ExceptionState& es)
+{
+ IntSize s = sizeFor(video);
+ return createImageBitmap(eventTarget, video, 0, 0, s.width(), s.height(), es);
+}
+
+ScriptObject createImageBitmap(EventTarget* eventTarget, HTMLVideoElement* video, int sx, int sy, int sw, int sh, ExceptionState& es)
+{
+ if (!video) {
+ es.throwTypeError();
+ return ScriptObject();
+ }
+ if (!video->player()) {
+ es.throwDOMException(InvalidStateError);
+ return ScriptObject();
+ }
+ if (video->networkState() == HTMLMediaElement::NETWORK_EMPTY) {
+ es.throwDOMException(InvalidStateError);
+ return ScriptObject();
+ }
+ if (video->player()->readyState() <= MediaPlayer::HaveMetadata) {
+ es.throwDOMException(InvalidStateError);
+ return ScriptObject();
+ }
+ if (!sw || !sh) {
+ es.throwDOMException(IndexSizeError);
+ return ScriptObject();
+ }
+ if (!video->hasSingleSecurityOrigin()) {
+ es.throwDOMException(SecurityError);
+ return ScriptObject();
+ }
+ if (!video->player()->didPassCORSAccessCheck() && eventTarget->toDOMWindow()->document()->securityOrigin()->taintsCanvas(video->currentSrc())) {
+ es.throwDOMException(SecurityError);
+ return ScriptObject();
+ }
+ // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
+ return resolveImageBitmap(ImageBitmap::create(video, IntRect(sx, sy, sw, sh)));
+}
+
+ScriptObject createImageBitmap(EventTarget* eventTarget, CanvasRenderingContext2D* context, ExceptionState& es)
+{
+ return createImageBitmap(eventTarget, context->canvas(), es);
+}
+
+ScriptObject createImageBitmap(EventTarget* eventTarget, CanvasRenderingContext2D* context, int sx, int sy, int sw, int sh, ExceptionState& es)
+{
+ return createImageBitmap(eventTarget, context->canvas(), sx, sy, sw, sh, es);
+}
+
+ScriptObject createImageBitmap(EventTarget* eventTarget, HTMLCanvasElement* canvas, ExceptionState& es)
+{
+ return createImageBitmap(eventTarget, canvas, 0, 0, canvas->width(), canvas->height(), es);
+}
+
+ScriptObject createImageBitmap(EventTarget* eventTarget, HTMLCanvasElement* canvas, int sx, int sy, int sw, int sh, ExceptionState& es)
+{
+ if (!canvas) {
+ es.throwTypeError();
+ return ScriptObject();
+ }
+ if (!canvas->originClean()) {
+ es.throwDOMException(InvalidStateError);
+ return ScriptObject();
+ }
+ if (!sw || !sh) {
+ es.throwDOMException(IndexSizeError);
+ return ScriptObject();
+ }
+ // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
+ return resolveImageBitmap(ImageBitmap::create(canvas, IntRect(sx, sy, sw, sh)));
+}
+
+ScriptObject createImageBitmap(EventTarget* eventTarget, ImageData* data, ExceptionState& es)
+{
+ return createImageBitmap(eventTarget, data, 0, 0, data->width(), data->height(), es);
+}
+
+ScriptObject createImageBitmap(EventTarget* eventTarget, ImageData* data, int sx, int sy, int sw, int sh, ExceptionState& es)
+{
+ if (!data) {
+ es.throwTypeError();
+ return ScriptObject();
+ }
+ if (!sw || !sh) {
+ es.throwDOMException(IndexSizeError);
+ return ScriptObject();
+ }
+ // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
+ return resolveImageBitmap(ImageBitmap::create(data, IntRect(sx, sy, sw, sh)));
+}
+
+ScriptObject createImageBitmap(EventTarget* eventTarget, ImageBitmap* bitmap, ExceptionState& es)
+{
+ return createImageBitmap(eventTarget, bitmap, 0, 0, bitmap->width(), bitmap->height(), es);
+}
+
+ScriptObject createImageBitmap(EventTarget* eventTarget, ImageBitmap* bitmap, int sx, int sy, int sw, int sh, ExceptionState& es)
+{
+ if (!bitmap) {
+ es.throwTypeError();
+ return ScriptObject();
+ }
+ if (!sw || !sh) {
+ es.throwDOMException(IndexSizeError);
+ return ScriptObject();
+ }
+ // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
+ return resolveImageBitmap(ImageBitmap::create(bitmap, IntRect(sx, sy, sw, sh)));
+}
+
+} // namespace ImageBitmapFactories
+} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/page/ImageBitmapFactories.h b/chromium/third_party/WebKit/Source/core/page/ImageBitmapFactories.h
new file mode 100644
index 00000000000..05feca4ffc1
--- /dev/null
+++ b/chromium/third_party/WebKit/Source/core/page/ImageBitmapFactories.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2013, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ImageBitmapFactories_h
+#define ImageBitmapFactories_h
+
+#include "bindings/v8/ScriptPromiseResolver.h"
+
+namespace WebCore {
+
+class CanvasRenderingContext2D;
+class EventTarget;
+class ExceptionState;
+class HTMLCanvasElement;
+class HTMLImageElement;
+class HTMLVideoElement;
+class ImageBitmap;
+class ImageData;
+
+namespace ImageBitmapFactories {
+
+ScriptObject createImageBitmap(EventTarget*, HTMLImageElement*, ExceptionState&);
+ScriptObject createImageBitmap(EventTarget*, HTMLImageElement*, int sx, int sy, int sw, int sh, ExceptionState&);
+ScriptObject createImageBitmap(EventTarget*, HTMLVideoElement*, ExceptionState&);
+ScriptObject createImageBitmap(EventTarget*, HTMLVideoElement*, int sx, int sy, int sw, int sh, ExceptionState&);
+ScriptObject createImageBitmap(EventTarget*, CanvasRenderingContext2D*, ExceptionState&);
+ScriptObject createImageBitmap(EventTarget*, CanvasRenderingContext2D*, int sx, int sy, int sw, int sh, ExceptionState&);
+ScriptObject createImageBitmap(EventTarget*, HTMLCanvasElement*, ExceptionState&);
+ScriptObject createImageBitmap(EventTarget*, HTMLCanvasElement*, int sx, int sy, int sw, int sh, ExceptionState&);
+ScriptObject createImageBitmap(EventTarget*, ImageData*, ExceptionState&);
+ScriptObject createImageBitmap(EventTarget*, ImageData*, int sx, int sy, int sw, int sh, ExceptionState&);
+ScriptObject createImageBitmap(EventTarget*, ImageBitmap*, ExceptionState&);
+ScriptObject createImageBitmap(EventTarget*, ImageBitmap*, int sx, int sy, int sw, int sh, ExceptionState&);
+
+} // namesapce ImageBitmapFactories
+} // namespace WebCore
+
+#endif // ImageBitmapFactories_h
diff --git a/chromium/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapFactories.idl b/chromium/third_party/WebKit/Source/core/page/ImageBitmapFactories.idl
index d704ba00764..65c0dc6c549 100644
--- a/chromium/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapFactories.idl
+++ b/chromium/third_party/WebKit/Source/core/page/ImageBitmapFactories.idl
@@ -41,8 +41,6 @@
[RaisesException] any createImageBitmap(CanvasRenderingContext2D context, long sx, long sy, long sw, long sh);
[RaisesException] any createImageBitmap(HTMLCanvasElement canvas);
[RaisesException] any createImageBitmap(HTMLCanvasElement canvas, long sx, long sy, long sw, long sh);
- [RaisesException] any createImageBitmap(Blob blob);
- [RaisesException] any createImageBitmap(Blob blob, long sx, long sy, long sw, long sh);
[RaisesException] any createImageBitmap(ImageData data);
[RaisesException] any createImageBitmap(ImageData data, long sx, long sy, long sw, long sh);
[RaisesException] any createImageBitmap(ImageBitmap bitmap);
diff --git a/chromium/third_party/WebKit/Source/core/page/ImageBitmapTest.cpp b/chromium/third_party/WebKit/Source/core/page/ImageBitmapTest.cpp
index ab7c68ba7b4..91b363bd623 100644
--- a/chromium/third_party/WebKit/Source/core/page/ImageBitmapTest.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/ImageBitmapTest.cpp
@@ -32,8 +32,8 @@
#include "core/page/ImageBitmap.h"
#include "core/dom/Document.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLImageElement.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/platform/graphics/BitmapImage.h"
#include "core/platform/graphics/skia/NativeImageSkia.h"
diff --git a/chromium/third_party/WebKit/Source/core/page/Page.cpp b/chromium/third_party/WebKit/Source/core/page/Page.cpp
index 999dd82da33..06315554fb2 100644
--- a/chromium/third_party/WebKit/Source/core/page/Page.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/Page.cpp
@@ -47,7 +47,6 @@
#include "core/page/PageLifecycleNotifier.h"
#include "core/page/PointerLockController.h"
#include "core/page/Settings.h"
-#include "core/page/ValidationMessageClient.h"
#include "core/page/scrolling/ScrollingCoordinator.h"
#include "core/platform/network/NetworkStateNotifier.h"
#include "core/plugins/PluginData.h"
@@ -157,6 +156,8 @@ Page::~Page()
if (m_scrollingCoordinator)
m_scrollingCoordinator->pageDestroyed();
+ backForward()->close();
+
#ifndef NDEBUG
pageCounter.decrement();
#endif
@@ -261,14 +262,6 @@ void Page::setMainFrame(PassRefPtr<Frame> mainFrame)
m_mainFrame = mainFrame;
}
-void Page::documentDetached(Document* document)
-{
- m_pointerLockController->documentDetached(document);
- m_contextMenuController->documentDetached(document);
- if (m_validationMessageClient)
- m_validationMessageClient->documentDetached(*document);
-}
-
bool Page::openedByDOM() const
{
return m_openedByDOM;
diff --git a/chromium/third_party/WebKit/Source/core/page/Page.h b/chromium/third_party/WebKit/Source/core/page/Page.h
index 10a9a69d09a..2b85d1b4875 100644
--- a/chromium/third_party/WebKit/Source/core/page/Page.h
+++ b/chromium/third_party/WebKit/Source/core/page/Page.h
@@ -118,8 +118,6 @@ public:
void setMainFrame(PassRefPtr<Frame>);
Frame* mainFrame() const { return m_mainFrame.get(); }
- void documentDetached(Document*);
-
bool openedByDOM() const;
void setOpenedByDOM();
@@ -145,9 +143,9 @@ public:
DragCaretController& dragCaretController() const { return *m_dragCaretController; }
DragController& dragController() const { return *m_dragController; }
FocusController& focusController() const { return *m_focusController; }
- ContextMenuController& contextMenuController() const { return *m_contextMenuController; }
+ ContextMenuController* contextMenuController() const { return m_contextMenuController.get(); }
InspectorController* inspectorController() const { return m_inspectorController.get(); }
- PointerLockController& pointerLockController() const { return *m_pointerLockController; }
+ PointerLockController* pointerLockController() const { return m_pointerLockController.get(); }
ValidationMessageClient* validationMessageClient() const { return m_validationMessageClient; }
void setValidationMessageClient(ValidationMessageClient* client) { m_validationMessageClient = client; }
@@ -268,9 +266,9 @@ private:
const OwnPtr<DragCaretController> m_dragCaretController;
const OwnPtr<DragController> m_dragController;
OwnPtr<FocusController> m_focusController;
- const OwnPtr<ContextMenuController> m_contextMenuController;
+ OwnPtr<ContextMenuController> m_contextMenuController;
OwnPtr<InspectorController> m_inspectorController;
- const OwnPtr<PointerLockController> m_pointerLockController;
+ OwnPtr<PointerLockController> m_pointerLockController;
RefPtr<ScrollingCoordinator> m_scrollingCoordinator;
OwnPtr<Settings> m_settings;
diff --git a/chromium/third_party/WebKit/Source/core/page/PageSerializer.cpp b/chromium/third_party/WebKit/Source/core/page/PageSerializer.cpp
index 730f5fd7d41..16ed1028411 100644
--- a/chromium/third_party/WebKit/Source/core/page/PageSerializer.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/PageSerializer.cpp
@@ -42,13 +42,13 @@
#include "core/dom/Element.h"
#include "core/dom/Text.h"
#include "core/editing/MarkupAccumulator.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLFrameOwnerElement.h"
#include "core/html/HTMLImageElement.h"
#include "core/html/HTMLInputElement.h"
#include "core/html/HTMLLinkElement.h"
#include "core/html/HTMLStyleElement.h"
#include "core/html/parser/HTMLMetaCharsetParser.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/Frame.h"
#include "core/page/Page.h"
#include "core/platform/SerializedResource.h"
diff --git a/chromium/third_party/WebKit/Source/core/page/RuntimeEnabledFeatures.in b/chromium/third_party/WebKit/Source/core/page/RuntimeEnabledFeatures.in
index 7890c03ab19..85faaec6975 100644
--- a/chromium/third_party/WebKit/Source/core/page/RuntimeEnabledFeatures.in
+++ b/chromium/third_party/WebKit/Source/core/page/RuntimeEnabledFeatures.in
@@ -19,7 +19,6 @@ AnimatedWebP status=experimental
ApplicationCache status=stable
AuthorShadowDOMForAnyElement
Crypto status=test
-CSSAnimationUnprefixed status=experimental
CSSCompositing status=experimental
CSSExclusions status=experimental
CSSGridLayout status=experimental
@@ -33,7 +32,6 @@ Database status=stable
DataListElement status=stable
DeviceMotion status=test
DeviceOrientation status=stable
-DevicePixelRatioIncludesZoom status=experimental
DialogElement status=experimental
DirectoryUpload status=stable
EncodingAPI status=experimental
diff --git a/chromium/third_party/WebKit/Source/core/page/Settings.cpp b/chromium/third_party/WebKit/Source/core/page/Settings.cpp
index 52ce9537243..68a69d3e566 100644
--- a/chromium/third_party/WebKit/Source/core/page/Settings.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/Settings.cpp
@@ -28,8 +28,8 @@
#include <limits>
#include "core/dom/Document.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/inspector/InspectorInstrumentation.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/Chrome.h"
#include "core/page/Frame.h"
#include "core/page/FrameTree.h"
diff --git a/chromium/third_party/WebKit/Source/core/page/UseCounter.cpp b/chromium/third_party/WebKit/Source/core/page/UseCounter.cpp
index 2050d35e832..7737be9df79 100644
--- a/chromium/third_party/WebKit/Source/core/page/UseCounter.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/UseCounter.cpp
@@ -469,7 +469,9 @@ int UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(int id)
case CSSPropertyMinZoom: return 407;
case CSSPropertyOrientation: return 408;
case CSSPropertyUserZoom: return 409;
- // CSSPropertyWebkitDashboardRegion was 410.
+#if defined(ENABLE_DASHBOARD_SUPPORT) && ENABLE_DASHBOARD_SUPPORT
+ case CSSPropertyWebkitDashboardRegion: return 410;
+#endif
// CSSPropertyWebkitOverflowScrolling was 411.
case CSSPropertyWebkitAppRegion: return 412;
case CSSPropertyWebkitFilter: return 413;
@@ -483,15 +485,6 @@ int UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(int id)
case CSSPropertyTouchAction: return 421;
case CSSPropertyGridArea: return 422;
case CSSPropertyGridTemplate: return 423;
- case CSSPropertyAnimation: return 424;
- case CSSPropertyAnimationDelay: return 425;
- case CSSPropertyAnimationDirection: return 426;
- case CSSPropertyAnimationDuration: return 427;
- case CSSPropertyAnimationFillMode: return 428;
- case CSSPropertyAnimationIterationCount: return 429;
- case CSSPropertyAnimationName: return 430;
- case CSSPropertyAnimationPlayState: return 431;
- case CSSPropertyAnimationTimingFunction: return 432;
// Add new features above this line (don't change the assigned numbers of the existing
// items) and update maximumCSSSampleId() with the new maximum value.
@@ -506,7 +499,7 @@ int UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(int id)
return 0;
}
-static int maximumCSSSampleId() { return 432; }
+static int maximumCSSSampleId() { return 423; }
UseCounter::UseCounter()
{
diff --git a/chromium/third_party/WebKit/Source/core/page/UseCounter.h b/chromium/third_party/WebKit/Source/core/page/UseCounter.h
index 6045a6fbf13..fdfd8304bba 100644
--- a/chromium/third_party/WebKit/Source/core/page/UseCounter.h
+++ b/chromium/third_party/WebKit/Source/core/page/UseCounter.h
@@ -163,24 +163,6 @@ public:
PrefixedShadowRootConstructor,
ConsoleMarkTimeline,
CSSPseudoElementUserAgentCustomPseudo,
- DocumentTypeEntities, // Removed from DOM4.
- DocumentTypeInternalSubset, // Removed from DOM4.
- DocumentTypeNotations, // Removed from DOM4.
- ElementGetAttributeNode, // Removed from DOM4.
- ElementSetAttributeNode, // Removed from DOM4.
- ElementRemoveAttributeNode, // Removed from DOM4.
- ElementGetAttributeNodeNS, // Removed from DOM4.
- DocumentCreateAttribute, // Removed from DOM4.
- DocumentCreateAttributeNS, // Removed from DOM4.
- DocumentCreateCDATASection, // Removed from DOM4.
- DocumentInputEncoding, // Removed from DOM4.
- DocumentXMLEncoding, // Removed from DOM4.
- DocumentXMLStandalone, // Removed from DOM4.
- DocumentXMLVersion, // Removed from DOM4.
- NodeIsSameNode, // Removed from DOM4.
- NodeIsSupported, // Removed from DOM4.
- NodeNamespaceURI, // Removed from DOM4.
- NodePrefix, // Removed from DOM4.
// Add new features immediately above this line. Don't change assigned
// numbers of each items, and don't reuse unused slots.
NumberOfFeatures, // This enum value must be last.
diff --git a/chromium/third_party/WebKit/Source/core/page/animation/CSSPropertyAnimation.cpp b/chromium/third_party/WebKit/Source/core/page/animation/CSSPropertyAnimation.cpp
index a0f8894e81e..5bf3bb667b5 100644
--- a/chromium/third_party/WebKit/Source/core/page/animation/CSSPropertyAnimation.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/animation/CSSPropertyAnimation.cpp
@@ -36,7 +36,7 @@
#include "core/css/CSSCrossfadeValue.h"
#include "core/css/CSSImageValue.h"
#include "core/css/CSSPrimitiveValue.h"
-#include "core/fetch/ImageResource.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/animation/AnimationBase.h"
#include "core/platform/FloatConversion.h"
#include "core/rendering/ClipPathOperation.h"
diff --git a/chromium/third_party/WebKit/Source/core/page/animation/KeyframeAnimation.cpp b/chromium/third_party/WebKit/Source/core/page/animation/KeyframeAnimation.cpp
index ec8ea2e938a..d298f152a8f 100644
--- a/chromium/third_party/WebKit/Source/core/page/animation/KeyframeAnimation.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/animation/KeyframeAnimation.cpp
@@ -108,7 +108,7 @@ void KeyframeAnimation::fetchIntervalEndpointsForProperty(CSSPropertyID property
// Find keyframe that is closest to elapsed time.
while (distance > 1) {
currentIndex = (lastIndex + firstIndex) >> 1;
- double key = m_keyframes[currentIndex].key();
+ float key = m_keyframes[currentIndex].key();
distance = lastIndex - currentIndex;
if (key < fractionalTime) {
diff --git a/chromium/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp b/chromium/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp
index d56ef60ceb1..30975d125cc 100644
--- a/chromium/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp
+++ b/chromium/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp
@@ -366,6 +366,11 @@ void ScrollingCoordinator::setTouchEventTargetRects(const LayerHitTestRects& lay
LayerHitTestRects compositorRects;
convertLayerRectsToEnclosingCompositedLayer(layerRects, compositorRects);
+ // Inform any observers (i.e. for testing) of these new rects.
+ HashSet<TouchEventTargetRectsObserver*>::iterator stop = m_touchEventTargetRectsObservers.end();
+ for (HashSet<TouchEventTargetRectsObserver*>::iterator it = m_touchEventTargetRectsObservers.begin(); it != stop; ++it)
+ (*it)->touchEventTargetRectsChanged(compositorRects);
+
// Note that ideally we'd clear the touch event handler region on all layers first,
// in case there are others that no longer have any handlers. But it's unlikely to
// matter much in practice (just makes us more conservative).
@@ -493,6 +498,16 @@ Region ScrollingCoordinator::computeShouldHandleScrollGestureOnMainThreadRegion(
return shouldHandleScrollGestureOnMainThreadRegion;
}
+void ScrollingCoordinator::addTouchEventTargetRectsObserver(TouchEventTargetRectsObserver* observer)
+{
+ m_touchEventTargetRectsObservers.add(observer);
+}
+
+void ScrollingCoordinator::removeTouchEventTargetRectsObserver(TouchEventTargetRectsObserver* observer)
+{
+ m_touchEventTargetRectsObservers.remove(observer);
+}
+
static void accumulateDocumentTouchEventTargetRects(LayerHitTestRects& rects, const Document* document)
{
ASSERT(document);
diff --git a/chromium/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.h b/chromium/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.h
index f5764548e7b..acb13c67a58 100644
--- a/chromium/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.h
+++ b/chromium/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.h
@@ -102,6 +102,14 @@ public:
String mainThreadScrollingReasonsAsText() const;
Region computeShouldHandleScrollGestureOnMainThreadRegion(const Frame*, const IntPoint& frameLocation) const;
+ class TouchEventTargetRectsObserver {
+ public:
+ virtual void touchEventTargetRectsChanged(const LayerHitTestRects&) = 0;
+ };
+
+ void addTouchEventTargetRectsObserver(TouchEventTargetRectsObserver*);
+ void removeTouchEventTargetRectsObserver(TouchEventTargetRectsObserver*);
+
protected:
explicit ScrollingCoordinator(Page*);
@@ -139,6 +147,8 @@ private:
typedef HashMap<ScrollableArea*, OwnPtr<WebKit::WebScrollbarLayer> > ScrollbarMap;
ScrollbarMap m_horizontalScrollbars;
ScrollbarMap m_verticalScrollbars;
+
+ HashSet<TouchEventTargetRectsObserver*> m_touchEventTargetRectsObservers;
};
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/platform/AsyncFileSystem.h b/chromium/third_party/WebKit/Source/core/platform/AsyncFileSystem.h
index d260af8b65d..2a408f80a15 100644
--- a/chromium/third_party/WebKit/Source/core/platform/AsyncFileSystem.h
+++ b/chromium/third_party/WebKit/Source/core/platform/AsyncFileSystem.h
@@ -54,7 +54,7 @@ public:
// Subclass must implement this if it supports synchronous operations.
// This should return false if there are no pending operations.
- virtual bool waitForOperationToComplete() { return true; }
+ virtual bool waitForOperationToComplete() { return false; }
// Creates and returns a new platform-specific AsyncFileSystem instance if the platform has its own implementation.
static PassOwnPtr<AsyncFileSystem> create();
diff --git a/chromium/third_party/WebKit/Source/core/platform/DEPS b/chromium/third_party/WebKit/Source/core/platform/DEPS
index cfd697d11ac..f1e4fe8f090 100644
--- a/chromium/third_party/WebKit/Source/core/platform/DEPS
+++ b/chromium/third_party/WebKit/Source/core/platform/DEPS
@@ -17,7 +17,7 @@ include_rules = [
"!core/fileapi",
"!core/html",
"!core/inspector",
- "!core/fetch",
+ "!core/loader/cache",
"!core/page",
"!core/plugins",
"!core/rendering",
diff --git a/chromium/third_party/WebKit/Source/core/platform/LifecycleNotifier.h b/chromium/third_party/WebKit/Source/core/platform/LifecycleNotifier.h
index cc12be21144..fd4835383eb 100644
--- a/chromium/third_party/WebKit/Source/core/platform/LifecycleNotifier.h
+++ b/chromium/third_party/WebKit/Source/core/platform/LifecycleNotifier.h
@@ -55,8 +55,7 @@ protected:
IteratingOverActiveDOMObjects,
IteratingOverContextObservers,
IteratingOverDocumentObservers,
- IteratingOverPageObservers,
- IteratingOverDOMWindowObservers
+ IteratingOverPageObservers
};
IterationType m_iterating;
diff --git a/chromium/third_party/WebKit/Source/core/platform/LifecycleObserver.h b/chromium/third_party/WebKit/Source/core/platform/LifecycleObserver.h
index 3e2d0a47cab..5e3ca2ccc25 100644
--- a/chromium/third_party/WebKit/Source/core/platform/LifecycleObserver.h
+++ b/chromium/third_party/WebKit/Source/core/platform/LifecycleObserver.h
@@ -37,8 +37,7 @@ public:
ActiveDOMObjectType,
DocumentLifecycleObserverType,
GenericType,
- PageLifecycleObserverType,
- DOMWindowLifecycleObserverType
+ PageLifecycleObserverType
};
explicit LifecycleObserver(LifecycleContext*, Type = GenericType);
diff --git a/chromium/third_party/WebKit/Source/core/platform/animation/CSSAnimationData.h b/chromium/third_party/WebKit/Source/core/platform/animation/CSSAnimationData.h
index a8ab4598cbf..f8c441cd5a4 100644
--- a/chromium/third_party/WebKit/Source/core/platform/animation/CSSAnimationData.h
+++ b/chromium/third_party/WebKit/Source/core/platform/animation/CSSAnimationData.h
@@ -148,7 +148,7 @@ public:
private:
CSSAnimationData();
- explicit CSSAnimationData(const CSSAnimationData&);
+ CSSAnimationData(const CSSAnimationData& o);
AtomicString m_name;
CSSPropertyID m_property;
diff --git a/chromium/third_party/WebKit/Source/core/platform/animation/CSSAnimationDataList.h b/chromium/third_party/WebKit/Source/core/platform/animation/CSSAnimationDataList.h
index 48d855674f0..bd7d942ae82 100644
--- a/chromium/third_party/WebKit/Source/core/platform/animation/CSSAnimationDataList.h
+++ b/chromium/third_party/WebKit/Source/core/platform/animation/CSSAnimationDataList.h
@@ -35,7 +35,7 @@ class CSSAnimationDataList {
WTF_MAKE_FAST_ALLOCATED;
public:
CSSAnimationDataList() { }
- explicit CSSAnimationDataList(const CSSAnimationDataList&);
+ CSSAnimationDataList(const CSSAnimationDataList&);
void fillUnsetProperties();
bool operator==(const CSSAnimationDataList& o) const;
diff --git a/chromium/third_party/WebKit/Source/core/platform/chromium/ChromiumDataObject.cpp b/chromium/third_party/WebKit/Source/core/platform/chromium/ChromiumDataObject.cpp
index a9a536dfcfa..2c7fa1601a4 100644
--- a/chromium/third_party/WebKit/Source/core/platform/chromium/ChromiumDataObject.cpp
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ChromiumDataObject.cpp
@@ -90,24 +90,18 @@ void ChromiumDataObject::clearAll()
m_itemList.clear();
}
-PassRefPtr<ChromiumDataObjectItem> ChromiumDataObject::add(const String& data, const String& type, ExceptionState& es)
+void ChromiumDataObject::add(const String& data, const String& type, ExceptionState& es)
{
- RefPtr<ChromiumDataObjectItem> item = ChromiumDataObjectItem::createFromString(type, data);
- if (!internalAddStringItem(item)) {
+ if (!internalAddStringItem(ChromiumDataObjectItem::createFromString(type, data)))
es.throwDOMException(NotSupportedError);
- return 0;
- }
- return item;
}
-PassRefPtr<ChromiumDataObjectItem> ChromiumDataObject::add(PassRefPtr<File> file, ScriptExecutionContext* context)
+void ChromiumDataObject::add(PassRefPtr<File> file, ScriptExecutionContext* context)
{
if (!file)
- return 0;
+ return;
- RefPtr<ChromiumDataObjectItem> item = ChromiumDataObjectItem::createFromFile(file);
- m_itemList.append(item);
- return item;
+ m_itemList.append(ChromiumDataObjectItem::createFromFile(file));
}
void ChromiumDataObject::clearData(const String& type)
diff --git a/chromium/third_party/WebKit/Source/core/platform/chromium/ChromiumDataObject.h b/chromium/third_party/WebKit/Source/core/platform/chromium/ChromiumDataObject.h
index dfb9a75d207..04063170119 100644
--- a/chromium/third_party/WebKit/Source/core/platform/chromium/ChromiumDataObject.h
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ChromiumDataObject.h
@@ -62,8 +62,8 @@ public:
// FIXME: Implement V8DataTransferItemList::indexedPropertyDeleter to get this called.
void deleteItem(unsigned long index);
void clearAll();
- PassRefPtr<ChromiumDataObjectItem> add(const String& data, const String& type, ExceptionState&);
- PassRefPtr<ChromiumDataObjectItem> add(PassRefPtr<File>, ScriptExecutionContext*);
+ void add(const String& data, const String& type, ExceptionState&);
+ void add(PassRefPtr<File>, ScriptExecutionContext*);
// WebCore helpers.
void clearData(const String& type);
diff --git a/chromium/third_party/WebKit/Source/core/platform/chromium/ClipboardChromium.cpp b/chromium/third_party/WebKit/Source/core/platform/chromium/ClipboardChromium.cpp
index 48b258c7a0d..50e69e505e9 100644
--- a/chromium/third_party/WebKit/Source/core/platform/chromium/ClipboardChromium.cpp
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ClipboardChromium.cpp
@@ -35,9 +35,9 @@
#include "core/dom/ExceptionCode.h"
#include "core/dom/StringCallback.h"
#include "core/editing/markup.h"
-#include "core/fetch/ImageResource.h"
#include "core/fileapi/File.h"
#include "core/fileapi/FileList.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/Frame.h"
#include "core/platform/DragData.h"
#include "core/platform/MIMETypeRegistry.h"
@@ -64,8 +64,8 @@ public:
virtual PassRefPtr<DataTransferItem> item(unsigned long index) OVERRIDE;
virtual void deleteItem(unsigned long index, ExceptionState&) OVERRIDE;
virtual void clear() OVERRIDE;
- virtual PassRefPtr<DataTransferItem> add(const String& data, const String& type, ExceptionState&) OVERRIDE;
- virtual PassRefPtr<DataTransferItem> add(PassRefPtr<File>) OVERRIDE;
+ virtual void add(const String& data, const String& type, ExceptionState&) OVERRIDE;
+ virtual void add(PassRefPtr<File>) OVERRIDE;
private:
DataTransferItemListPolicyWrapper(PassRefPtr<ClipboardChromium>, PassRefPtr<ChromiumDataObject>);
@@ -119,24 +119,18 @@ void DataTransferItemListPolicyWrapper::clear()
m_dataObject->clearAll();
}
-PassRefPtr<DataTransferItem> DataTransferItemListPolicyWrapper::add(const String& data, const String& type, ExceptionState& es)
+void DataTransferItemListPolicyWrapper::add(const String& data, const String& type, ExceptionState& es)
{
if (!m_clipboard->canWriteData())
- return 0;
- RefPtr<ChromiumDataObjectItem> item = m_dataObject->add(data, type, es);
- if (!item)
- return 0;
- return DataTransferItemPolicyWrapper::create(m_clipboard, item);
+ return;
+ m_dataObject->add(data, type, es);
}
-PassRefPtr<DataTransferItem> DataTransferItemListPolicyWrapper::add(PassRefPtr<File> file)
+void DataTransferItemListPolicyWrapper::add(PassRefPtr<File> file)
{
if (!m_clipboard->canWriteData())
- return 0;
- RefPtr<ChromiumDataObjectItem> item = m_dataObject->add(file, m_clipboard->frame()->document()->scriptExecutionContext());
- if (!item)
- return 0;
- return DataTransferItemPolicyWrapper::create(m_clipboard, item);
+ return;
+ m_dataObject->add(file, m_clipboard->frame()->document()->scriptExecutionContext());
}
DataTransferItemListPolicyWrapper::DataTransferItemListPolicyWrapper(
diff --git a/chromium/third_party/WebKit/Source/core/platform/chromium/ClipboardChromium.h b/chromium/third_party/WebKit/Source/core/platform/chromium/ClipboardChromium.h
index 4cc14168802..980a22dea67 100644
--- a/chromium/third_party/WebKit/Source/core/platform/chromium/ClipboardChromium.h
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ClipboardChromium.h
@@ -32,7 +32,7 @@
#include "core/dom/Clipboard.h"
#include "core/dom/DataTransferItem.h"
-#include "core/fetch/ImageResourceClient.h"
+#include "core/loader/cache/ImageResourceClient.h"
#include "core/platform/chromium/ChromiumDataObject.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/platform/chromium/PasteboardChromium.cpp b/chromium/third_party/WebKit/Source/core/platform/chromium/PasteboardChromium.cpp
index 61c2dc9608a..d06f207a9ef 100644
--- a/chromium/third_party/WebKit/Source/core/platform/chromium/PasteboardChromium.cpp
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/PasteboardChromium.cpp
@@ -39,8 +39,8 @@
#include "core/dom/Element.h"
#include "core/dom/Range.h"
#include "core/editing/markup.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/parser/HTMLParserIdioms.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/Frame.h"
#include "core/platform/chromium/ClipboardChromium.h"
#include "core/platform/chromium/ClipboardUtilitiesChromium.h"
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeNonMacCommon.cpp b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromium.cpp
index 72208ba0493..d44a778a65d 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeNonMacCommon.cpp
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromium.cpp
@@ -25,7 +25,7 @@
*/
#include "config.h"
-#include "core/platform/ScrollbarThemeNonMacCommon.h"
+#include "core/platform/chromium/ScrollbarThemeChromium.h"
#include "core/platform/PlatformMouseEvent.h"
#include "core/platform/ScrollableArea.h"
@@ -33,16 +33,21 @@
#include "core/platform/ScrollbarTheme.h"
#include "core/platform/graphics/GraphicsContextStateSaver.h"
+// -----------------------------------------------------------------------------
+// This file contains scrollbar theme code that is cross platform. Additional
+// members of ScrollbarThemeChromium can be found in the platform specific files
+// -----------------------------------------------------------------------------
+
namespace WebCore {
-bool ScrollbarThemeNonMacCommon::hasThumb(ScrollbarThemeClient* scrollbar)
+bool ScrollbarThemeChromium::hasThumb(ScrollbarThemeClient* scrollbar)
{
// This method is just called as a paint-time optimization to see if
- // painting the thumb can be skipped. We don't have to be exact here.
+ // painting the thumb can be skipped. We don't have to be exact here.
return thumbLength(scrollbar) > 0;
}
-IntRect ScrollbarThemeNonMacCommon::backButtonRect(ScrollbarThemeClient* scrollbar, ScrollbarPart part, bool)
+IntRect ScrollbarThemeChromium::backButtonRect(ScrollbarThemeClient* scrollbar, ScrollbarPart part, bool)
{
// Windows and Linux just have single arrows.
if (part == BackButtonEndPart)
@@ -52,7 +57,7 @@ IntRect ScrollbarThemeNonMacCommon::backButtonRect(ScrollbarThemeClient* scrollb
return IntRect(scrollbar->x(), scrollbar->y(), size.width(), size.height());
}
-IntRect ScrollbarThemeNonMacCommon::forwardButtonRect(ScrollbarThemeClient* scrollbar, ScrollbarPart part, bool)
+IntRect ScrollbarThemeChromium::forwardButtonRect(ScrollbarThemeClient* scrollbar, ScrollbarPart part, bool)
{
// Windows and Linux just have single arrows.
if (part == ForwardButtonStartPart)
@@ -70,7 +75,7 @@ IntRect ScrollbarThemeNonMacCommon::forwardButtonRect(ScrollbarThemeClient* scro
return IntRect(x, y, size.width(), size.height());
}
-IntRect ScrollbarThemeNonMacCommon::trackRect(ScrollbarThemeClient* scrollbar, bool)
+IntRect ScrollbarThemeChromium::trackRect(ScrollbarThemeClient* scrollbar, bool)
{
IntSize bs = buttonSize(scrollbar);
int thickness = scrollbarThickness(scrollbar->controlSize());
@@ -86,20 +91,20 @@ IntRect ScrollbarThemeNonMacCommon::trackRect(ScrollbarThemeClient* scrollbar, b
return IntRect(scrollbar->x(), scrollbar->y() + bs.height(), thickness, scrollbar->height() - 2 * bs.height());
}
-void ScrollbarThemeNonMacCommon::paintTrackBackground(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect)
+void ScrollbarThemeChromium::paintTrackBackground(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect)
{
- // Just assume a forward track part. We only paint the track as a single piece when there is no thumb.
+ // Just assume a forward track part. We only paint the track as a single piece when there is no thumb.
if (!hasThumb(scrollbar))
paintTrackPiece(context, scrollbar, rect, ForwardTrackPart);
}
-void ScrollbarThemeNonMacCommon::paintTickmarks(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect)
+void ScrollbarThemeChromium::paintTickmarks(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect)
{
if (scrollbar->orientation() != VerticalScrollbar)
return;
if (rect.height() <= 0 || rect.width() <= 0)
- return;
+ return; // nothing to draw on.
// Get the tickmarks for the frameview.
Vector<IntRect> tickmarks;
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeNonMacCommon.h b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromium.h
index 3fc76476037..9866a179693 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeNonMacCommon.h
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromium.h
@@ -28,8 +28,8 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef ScrollbarThemeNonMacCommon_h
-#define ScrollbarThemeNonMacCommon_h
+#ifndef ScrollbarThemeChromium_h
+#define ScrollbarThemeChromium_h
#include "core/platform/ScrollbarTheme.h"
@@ -37,7 +37,9 @@ namespace WebCore {
class PlatformMouseEvent;
-class ScrollbarThemeNonMacCommon : public ScrollbarTheme {
+// This class contains the scrollbar code which is shared between Chromium
+// Windows and Linux.
+class ScrollbarThemeChromium : public ScrollbarTheme {
protected:
virtual bool hasButtons(ScrollbarThemeClient*) OVERRIDE { return true; }
virtual bool hasThumb(ScrollbarThemeClient*) OVERRIDE;
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeAndroid.cpp b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumAndroid.cpp
index 8ab6b8ca5b6..ca8b507a417 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeAndroid.cpp
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumAndroid.cpp
@@ -24,15 +24,16 @@
*/
#include "config.h"
+
#include "core/platform/ScrollbarTheme.h"
-#include "core/platform/ScrollbarThemeOverlay.h"
+#include "core/platform/chromium/ScrollbarThemeChromiumOverlay.h"
namespace WebCore {
ScrollbarTheme* ScrollbarTheme::nativeTheme()
{
- DEFINE_STATIC_LOCAL(ScrollbarThemeOverlay, theme, ());
+ DEFINE_STATIC_LOCAL(ScrollbarThemeChromiumOverlay, theme, ());
return &theme;
}
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeAuraOrGtk.cpp b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumDefault.cpp
index e3753391115..721870a29c9 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeAuraOrGtk.cpp
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumDefault.cpp
@@ -29,38 +29,38 @@
*/
#include "config.h"
-#include "core/platform/ScrollbarThemeAuraOrGtk.h"
+#include "core/platform/chromium/ScrollbarThemeChromiumDefault.h"
#include "RuntimeEnabledFeatures.h"
#include "core/platform/PlatformMouseEvent.h"
#include "core/platform/Scrollbar.h"
-#include "core/platform/ScrollbarThemeOverlay.h"
+#include "core/platform/chromium/ScrollbarThemeChromiumOverlay.h"
#include "core/platform/graphics/GraphicsContext.h"
+#include "public/platform/default/WebThemeEngine.h"
#include "public/platform/Platform.h"
#include "public/platform/WebRect.h"
-#include "public/platform/default/WebThemeEngine.h"
namespace WebCore {
ScrollbarTheme* ScrollbarTheme::nativeTheme()
{
if (RuntimeEnabledFeatures::overlayScrollbarsEnabled()) {
- DEFINE_STATIC_LOCAL(ScrollbarThemeOverlay, theme, ());
+ DEFINE_STATIC_LOCAL(ScrollbarThemeChromiumOverlay, theme, ());
return &theme;
}
- DEFINE_STATIC_LOCAL(ScrollbarThemeAuraOrGtk, theme, ());
+ DEFINE_STATIC_LOCAL(ScrollbarThemeChromiumDefault, theme, ());
return &theme;
}
-int ScrollbarThemeAuraOrGtk::scrollbarThickness(ScrollbarControlSize controlSize)
+int ScrollbarThemeChromiumDefault::scrollbarThickness(ScrollbarControlSize controlSize)
{
// Horiz and Vert scrollbars are the same thickness.
IntSize scrollbarSize = WebKit::Platform::current()->themeEngine()->getSize(WebKit::WebThemeEngine::PartScrollbarVerticalTrack);
return scrollbarSize.width();
}
-void ScrollbarThemeAuraOrGtk::paintTrackPiece(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart partType)
+void ScrollbarThemeChromiumDefault::paintTrackPiece(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart partType)
{
WebKit::WebThemeEngine::State state = scrollbar->hoveredPart() == partType ? WebKit::WebThemeEngine::StateHover : WebKit::WebThemeEngine::StateNormal;
IntRect alignRect = trackRect(scrollbar, false);
@@ -73,7 +73,7 @@ void ScrollbarThemeAuraOrGtk::paintTrackPiece(GraphicsContext* gc, ScrollbarThem
WebKit::Platform::current()->themeEngine()->paint(canvas, scrollbar->orientation() == HorizontalScrollbar ? WebKit::WebThemeEngine::PartScrollbarHorizontalTrack : WebKit::WebThemeEngine::PartScrollbarVerticalTrack, state, WebKit::WebRect(rect), &extraParams);
}
-void ScrollbarThemeAuraOrGtk::paintButton(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart part)
+void ScrollbarThemeChromiumDefault::paintButton(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart part)
{
WebKit::WebThemeEngine::Part paintPart;
WebKit::WebThemeEngine::State state = WebKit::WebThemeEngine::StateNormal;
@@ -109,7 +109,7 @@ void ScrollbarThemeAuraOrGtk::paintButton(GraphicsContext* gc, ScrollbarThemeCli
WebKit::Platform::current()->themeEngine()->paint(canvas, paintPart, state, WebKit::WebRect(rect), 0);
}
-void ScrollbarThemeAuraOrGtk::paintThumb(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect)
+void ScrollbarThemeChromiumDefault::paintThumb(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect)
{
WebKit::WebThemeEngine::State state;
WebKit::WebCanvas* canvas = gc->canvas();
@@ -122,12 +122,12 @@ void ScrollbarThemeAuraOrGtk::paintThumb(GraphicsContext* gc, ScrollbarThemeClie
WebKit::Platform::current()->themeEngine()->paint(canvas, scrollbar->orientation() == HorizontalScrollbar ? WebKit::WebThemeEngine::PartScrollbarHorizontalThumb : WebKit::WebThemeEngine::PartScrollbarVerticalThumb, state, WebKit::WebRect(rect), 0);
}
-bool ScrollbarThemeAuraOrGtk::shouldCenterOnThumb(ScrollbarThemeClient*, const PlatformMouseEvent& evt)
+bool ScrollbarThemeChromiumDefault::shouldCenterOnThumb(ScrollbarThemeClient*, const PlatformMouseEvent& evt)
{
return (evt.shiftKey() && evt.button() == LeftButton) || (evt.button() == MiddleButton);
}
-IntSize ScrollbarThemeAuraOrGtk::buttonSize(ScrollbarThemeClient* scrollbar)
+IntSize ScrollbarThemeChromiumDefault::buttonSize(ScrollbarThemeClient* scrollbar)
{
if (scrollbar->orientation() == VerticalScrollbar) {
IntSize size = WebKit::Platform::current()->themeEngine()->getSize(WebKit::WebThemeEngine::PartScrollbarUpArrow);
@@ -139,7 +139,7 @@ IntSize ScrollbarThemeAuraOrGtk::buttonSize(ScrollbarThemeClient* scrollbar)
return IntSize(scrollbar->width() < 2 * size.width() ? scrollbar->width() / 2 : size.width(), size.height());
}
-int ScrollbarThemeAuraOrGtk::minimumThumbLength(ScrollbarThemeClient* scrollbar)
+int ScrollbarThemeChromiumDefault::minimumThumbLength(ScrollbarThemeClient* scrollbar)
{
if (scrollbar->orientation() == VerticalScrollbar) {
IntSize size = WebKit::Platform::current()->themeEngine()->getSize(WebKit::WebThemeEngine::PartScrollbarVerticalThumb);
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeAuraOrGtk.h b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumDefault.h
index ec37c2c1f78..133dab06edc 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeAuraOrGtk.h
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumDefault.h
@@ -28,14 +28,14 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef ScrollbarThemeAuraOrGtk_h
-#define ScrollbarThemeAuraOrGtk_h
+#ifndef ScrollbarThemeChromiumDefault_h
+#define ScrollbarThemeChromiumDefault_h
-#include "core/platform/ScrollbarThemeNonMacCommon.h"
+#include "core/platform/chromium/ScrollbarThemeChromium.h"
namespace WebCore {
-class ScrollbarThemeAuraOrGtk : public ScrollbarThemeNonMacCommon {
+class ScrollbarThemeChromiumDefault : public ScrollbarThemeChromium {
public:
virtual int scrollbarThickness(ScrollbarControlSize);
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeOverlay.cpp b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumOverlay.cpp
index 29b44ba4292..c10c89bbd55 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeOverlay.cpp
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumOverlay.cpp
@@ -24,7 +24,7 @@
*/
#include "config.h"
-#include "core/platform/ScrollbarThemeOverlay.h"
+#include "core/platform/chromium/ScrollbarThemeChromiumOverlay.h"
#include "core/platform/PlatformMouseEvent.h"
#include "core/platform/Scrollbar.h"
@@ -40,17 +40,17 @@ namespace WebCore {
static const int scrollbarWidth = 3;
static const int scrollbarMargin = 4;
-int ScrollbarThemeOverlay::scrollbarThickness(ScrollbarControlSize controlSize)
+int ScrollbarThemeChromiumOverlay::scrollbarThickness(ScrollbarControlSize controlSize)
{
return scrollbarWidth + scrollbarMargin;
}
-bool ScrollbarThemeOverlay::usesOverlayScrollbars() const
+bool ScrollbarThemeChromiumOverlay::usesOverlayScrollbars() const
{
return true;
}
-int ScrollbarThemeOverlay::thumbPosition(ScrollbarThemeClient* scrollbar)
+int ScrollbarThemeChromiumOverlay::thumbPosition(ScrollbarThemeClient* scrollbar)
{
if (!scrollbar->totalSize())
return 0;
@@ -60,7 +60,7 @@ int ScrollbarThemeOverlay::thumbPosition(ScrollbarThemeClient* scrollbar)
return round(proportion * trackLen);
}
-int ScrollbarThemeOverlay::thumbLength(ScrollbarThemeClient* scrollbar)
+int ScrollbarThemeChromiumOverlay::thumbLength(ScrollbarThemeClient* scrollbar)
{
int trackLen = trackLength(scrollbar);
@@ -73,22 +73,22 @@ int ScrollbarThemeOverlay::thumbLength(ScrollbarThemeClient* scrollbar)
return length;
}
-bool ScrollbarThemeOverlay::hasThumb(ScrollbarThemeClient* scrollbar)
+bool ScrollbarThemeChromiumOverlay::hasThumb(ScrollbarThemeClient* scrollbar)
{
return true;
}
-IntRect ScrollbarThemeOverlay::backButtonRect(ScrollbarThemeClient*, ScrollbarPart, bool)
+IntRect ScrollbarThemeChromiumOverlay::backButtonRect(ScrollbarThemeClient*, ScrollbarPart, bool)
{
return IntRect();
}
-IntRect ScrollbarThemeOverlay::forwardButtonRect(ScrollbarThemeClient*, ScrollbarPart, bool)
+IntRect ScrollbarThemeChromiumOverlay::forwardButtonRect(ScrollbarThemeClient*, ScrollbarPart, bool)
{
return IntRect();
}
-IntRect ScrollbarThemeOverlay::trackRect(ScrollbarThemeClient* scrollbar, bool)
+IntRect ScrollbarThemeChromiumOverlay::trackRect(ScrollbarThemeClient* scrollbar, bool)
{
IntRect rect = scrollbar->frameRect();
if (scrollbar->orientation() == HorizontalScrollbar)
@@ -98,7 +98,7 @@ IntRect ScrollbarThemeOverlay::trackRect(ScrollbarThemeClient* scrollbar, bool)
return rect;
}
-void ScrollbarThemeOverlay::paintThumb(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect)
+void ScrollbarThemeChromiumOverlay::paintThumb(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect)
{
IntRect thumbRect = rect;
if (scrollbar->orientation() == HorizontalScrollbar)
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeOverlay.h b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumOverlay.h
index 8a8595916d7..291ef8c9baa 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeOverlay.h
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumOverlay.h
@@ -23,8 +23,8 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef ScrollbarThemeOverlay_h
-#define ScrollbarThemeOverlay_h
+#ifndef ScrollbarThemeChromiumOverlay_h
+#define ScrollbarThemeChromiumOverlay_h
#include "core/platform/ScrollbarTheme.h"
@@ -32,7 +32,7 @@ namespace WebCore {
// This scrollbar theme is used to get overlay scrollbar for platforms other
// than Mac. Mac's overlay scrollbars are in ScrollbarThemeMac*.
-class ScrollbarThemeOverlay : public ScrollbarTheme {
+class ScrollbarThemeChromiumOverlay : public ScrollbarTheme {
public:
virtual int scrollbarThickness(ScrollbarControlSize) OVERRIDE;
virtual bool usesOverlayScrollbars() const OVERRIDE;
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeWin.cpp b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumWin.cpp
index d8f51e4e4c0..a41c6b1f524 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeWin.cpp
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumWin.cpp
@@ -25,7 +25,7 @@
*/
#include "config.h"
-#include "core/platform/ScrollbarThemeWin.h"
+#include "core/platform/chromium/ScrollbarThemeChromiumWin.h"
#include <windows.h>
#include <vsstyle.h>
@@ -38,27 +38,28 @@
#include "public/platform/Platform.h"
#include "public/platform/WebRect.h"
#include "public/platform/win/WebThemeEngine.h"
+
namespace WebCore {
ScrollbarTheme* ScrollbarTheme::nativeTheme()
{
- static ScrollbarThemeWin theme;
+ static ScrollbarThemeChromiumWin theme;
return &theme;
}
// The scrollbar size in DumpRenderTree on the Mac - so we can match their
-// layout results. Entries are for regular, small, and mini scrollbars.
+// layout results. Entries are for regular, small, and mini scrollbars.
// Metrics obtained using [NSScroller scrollerWidthForControlSize:]
static const int kMacScrollbarSize[3] = { 15, 11, 15 };
// Constants used to figure the drag rect outside which we should snap the
-// scrollbar thumb back to its origin. These calculations are based on
+// scrollbar thumb back to its origin. These calculations are based on
// observing the behavior of the MSVC8 main window scrollbar + some
// guessing/extrapolation.
static const int kOffEndMultiplier = 3;
static const int kOffSideMultiplier = 8;
-int ScrollbarThemeWin::scrollbarThickness(ScrollbarControlSize controlSize)
+int ScrollbarThemeChromiumWin::scrollbarThickness(ScrollbarControlSize controlSize)
{
static int thickness;
if (!thickness) {
@@ -69,12 +70,12 @@ int ScrollbarThemeWin::scrollbarThickness(ScrollbarControlSize controlSize)
return thickness;
}
-bool ScrollbarThemeWin::invalidateOnMouseEnterExit()
+bool ScrollbarThemeChromiumWin::invalidateOnMouseEnterExit()
{
return windowsVersion() >= WindowsVista;
}
-bool ScrollbarThemeWin::shouldSnapBackToDragOrigin(ScrollbarThemeClient* scrollbar, const PlatformMouseEvent& evt)
+bool ScrollbarThemeChromiumWin::shouldSnapBackToDragOrigin(ScrollbarThemeClient* scrollbar, const PlatformMouseEvent& evt)
{
// Find the rect within which we shouldn't snap, by expanding the track rect
// in both dimensions.
@@ -92,7 +93,7 @@ bool ScrollbarThemeWin::shouldSnapBackToDragOrigin(ScrollbarThemeClient* scrollb
return !rect.contains(mousePosition);
}
-void ScrollbarThemeWin::paintTrackPiece(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart partType)
+void ScrollbarThemeChromiumWin::paintTrackPiece(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart partType)
{
bool horz = scrollbar->orientation() == HorizontalScrollbar;
@@ -109,7 +110,7 @@ void ScrollbarThemeWin::paintTrackPiece(GraphicsContext* gc, ScrollbarThemeClien
WebKit::Platform::current()->themeEngine()->paintScrollbarTrack(canvas, partId, getThemeState(scrollbar, partType), getClassicThemeState(scrollbar, partType), WebKit::WebRect(rect), WebKit::WebRect(alignRect));
}
-void ScrollbarThemeWin::paintButton(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart part)
+void ScrollbarThemeChromiumWin::paintButton(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart part)
{
bool horz = scrollbar->orientation() == HorizontalScrollbar;
@@ -124,7 +125,7 @@ void ScrollbarThemeWin::paintButton(GraphicsContext* gc, ScrollbarThemeClient* s
WebKit::Platform::current()->themeEngine()->paintScrollbarArrow(canvas, getThemeArrowState(scrollbar, part), partId | getClassicThemeState(scrollbar, part), WebKit::WebRect(rect));
}
-void ScrollbarThemeWin::paintThumb(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect)
+void ScrollbarThemeChromiumWin::paintThumb(GraphicsContext* gc, ScrollbarThemeClient* scrollbar, const IntRect& rect)
{
bool horz = scrollbar->orientation() == HorizontalScrollbar;
@@ -136,10 +137,10 @@ void ScrollbarThemeWin::paintThumb(GraphicsContext* gc, ScrollbarThemeClient* sc
WebKit::Platform::current()->themeEngine()->paintScrollbarThumb(canvas, horz ? SBP_GRIPPERHORZ : SBP_GRIPPERVERT, getThemeState(scrollbar, ThumbPart), getClassicThemeState(scrollbar, ThumbPart), WebKit::WebRect(rect));
}
-int ScrollbarThemeWin::getThemeState(ScrollbarThemeClient* scrollbar, ScrollbarPart part) const
+int ScrollbarThemeChromiumWin::getThemeState(ScrollbarThemeClient* scrollbar, ScrollbarPart part) const
{
// When dragging the thumb, draw thumb pressed and other segments normal
- // regardless of where the cursor actually is. See also four places in
+ // regardless of where the cursor actually is. See also four places in
// getThemeArrowState().
if (scrollbar->pressedPart() == ThumbPart) {
if (part == ThumbPart)
@@ -155,7 +156,7 @@ int ScrollbarThemeWin::getThemeState(ScrollbarThemeClient* scrollbar, ScrollbarP
return (scrollbar->pressedPart() == part) ? SCRBS_PRESSED : SCRBS_NORMAL;
}
-int ScrollbarThemeWin::getThemeArrowState(ScrollbarThemeClient* scrollbar, ScrollbarPart part) const
+int ScrollbarThemeChromiumWin::getThemeArrowState(ScrollbarThemeClient* scrollbar, ScrollbarPart part) const
{
// We could take advantage of knowing the values in the state enum to write
// some simpler code, but treating the state enum as a black box seems
@@ -205,7 +206,7 @@ int ScrollbarThemeWin::getThemeArrowState(ScrollbarThemeClient* scrollbar, Scrol
return (scrollbar->pressedPart() == part) ? ABS_DOWNPRESSED : ABS_DOWNNORMAL;
}
-int ScrollbarThemeWin::getClassicThemeState(ScrollbarThemeClient* scrollbar, ScrollbarPart part) const
+int ScrollbarThemeChromiumWin::getClassicThemeState(ScrollbarThemeClient* scrollbar, ScrollbarPart part) const
{
// When dragging the thumb, draw the buttons normal even when hovered.
if (scrollbar->pressedPart() == ThumbPart)
@@ -219,24 +220,24 @@ int ScrollbarThemeWin::getClassicThemeState(ScrollbarThemeClient* scrollbar, Scr
return (scrollbar->pressedPart() == part) ? (DFCS_PUSHED | DFCS_FLAT) : 0;
}
-bool ScrollbarThemeWin::shouldCenterOnThumb(ScrollbarThemeClient*, const PlatformMouseEvent& evt)
+bool ScrollbarThemeChromiumWin::shouldCenterOnThumb(ScrollbarThemeClient*, const PlatformMouseEvent& evt)
{
return evt.shiftKey() && evt.button() == LeftButton;
}
-IntSize ScrollbarThemeWin::buttonSize(ScrollbarThemeClient* scrollbar)
+IntSize ScrollbarThemeChromiumWin::buttonSize(ScrollbarThemeClient* scrollbar)
{
// Our desired rect is essentially thickness by thickness.
// Our actual rect will shrink to half the available space when we have < 2
- // times thickness pixels left. This allows the scrollbar to scale down
+ // times thickness pixels left. This allows the scrollbar to scale down
// and function even at tiny sizes.
int thickness = scrollbarThickness(scrollbar->controlSize());
// In layout test mode, we force the button "girth" (i.e., the length of
// the button along the axis of the scrollbar) to be a fixed size.
- // FIXME: This is retarded! scrollbarThickness is already fixed in layout
+ // FIXME: This is retarded! scrollbarThickness is already fixed in layout
// test mode so that should be enough to result in repeatable results, but
// preserving this hack avoids having to rebaseline pixel tests.
const int kLayoutTestModeGirth = 17;
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeWin.h b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumWin.h
index 5b5ee6e444a..ba8deafefb7 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeWin.h
+++ b/chromium/third_party/WebKit/Source/core/platform/chromium/ScrollbarThemeChromiumWin.h
@@ -28,14 +28,14 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef ScrollbarThemeWin_h
-#define ScrollbarThemeWin_h
+#ifndef ScrollbarThemeChromiumWin_h
+#define ScrollbarThemeChromiumWin_h
-#include "core/platform/ScrollbarThemeNonMacCommon.h"
+#include "core/platform/chromium/ScrollbarThemeChromium.h"
namespace WebCore {
-class ScrollbarThemeWin : public ScrollbarThemeNonMacCommon {
+class ScrollbarThemeChromiumWin : public ScrollbarThemeChromium {
public:
virtual int scrollbarThickness(ScrollbarControlSize) OVERRIDE;
virtual bool invalidateOnMouseEnterExit() OVERRIDE;
diff --git a/chromium/third_party/WebKit/Source/core/platform/graphics/GraphicsLayer.h b/chromium/third_party/WebKit/Source/core/platform/graphics/GraphicsLayer.h
index d9b111b499d..e4bb57822ba 100644
--- a/chromium/third_party/WebKit/Source/core/platform/graphics/GraphicsLayer.h
+++ b/chromium/third_party/WebKit/Source/core/platform/graphics/GraphicsLayer.h
@@ -71,7 +71,7 @@ class TimingFunction;
class AnimationValue {
WTF_MAKE_FAST_ALLOCATED;
public:
- explicit AnimationValue(double keyTime, PassRefPtr<TimingFunction> timingFunction = 0)
+ explicit AnimationValue(float keyTime, PassRefPtr<TimingFunction> timingFunction = 0)
: m_keyTime(keyTime)
, m_timingFunction(timingFunction)
{
@@ -79,12 +79,12 @@ public:
virtual ~AnimationValue() { }
- double keyTime() const { return m_keyTime; }
+ float keyTime() const { return m_keyTime; }
const TimingFunction* timingFunction() const { return m_timingFunction.get(); }
virtual PassOwnPtr<AnimationValue> clone() const = 0;
private:
- double m_keyTime;
+ float m_keyTime;
RefPtr<TimingFunction> m_timingFunction;
};
@@ -92,7 +92,7 @@ private:
// FIXME: Should be moved to its own header file.
class FloatAnimationValue : public AnimationValue {
public:
- FloatAnimationValue(double keyTime, float value, PassRefPtr<TimingFunction> timingFunction = 0)
+ FloatAnimationValue(float keyTime, float value, PassRefPtr<TimingFunction> timingFunction = 0)
: AnimationValue(keyTime, timingFunction)
, m_value(value)
{
@@ -109,7 +109,7 @@ private:
// FIXME: Should be moved to its own header file.
class TransformAnimationValue : public AnimationValue {
public:
- explicit TransformAnimationValue(double keyTime, const TransformOperations* value = 0, PassRefPtr<TimingFunction> timingFunction = 0)
+ explicit TransformAnimationValue(float keyTime, const TransformOperations* value = 0, PassRefPtr<TimingFunction> timingFunction = 0)
: AnimationValue(keyTime, timingFunction)
{
if (value)
@@ -127,7 +127,7 @@ private:
// FIXME: Should be moved to its own header file.
class FilterAnimationValue : public AnimationValue {
public:
- explicit FilterAnimationValue(double keyTime, const FilterOperations* value = 0, PassRefPtr<TimingFunction> timingFunction = 0)
+ explicit FilterAnimationValue(float keyTime, const FilterOperations* value = 0, PassRefPtr<TimingFunction> timingFunction = 0)
: AnimationValue(keyTime, timingFunction)
{
if (value)
diff --git a/chromium/third_party/WebKit/Source/core/platform/graphics/filters/FilterOperation.h b/chromium/third_party/WebKit/Source/core/platform/graphics/filters/FilterOperation.h
index 4e4a31a49c5..3473418b1ac 100644
--- a/chromium/third_party/WebKit/Source/core/platform/graphics/filters/FilterOperation.h
+++ b/chromium/third_party/WebKit/Source/core/platform/graphics/filters/FilterOperation.h
@@ -26,7 +26,7 @@
#ifndef FilterOperation_h
#define FilterOperation_h
-#include "core/fetch/DocumentResourceReference.h"
+#include "core/loader/cache/DocumentResourceReference.h"
#include "core/platform/Length.h"
#include "core/platform/graphics/Color.h"
#include "core/platform/graphics/filters/Filter.h"
diff --git a/chromium/third_party/WebKit/Source/core/platform/graphics/transforms/TransformOperations.cpp b/chromium/third_party/WebKit/Source/core/platform/graphics/transforms/TransformOperations.cpp
index 3ca3d7f462f..bcca50201e8 100644
--- a/chromium/third_party/WebKit/Source/core/platform/graphics/transforms/TransformOperations.cpp
+++ b/chromium/third_party/WebKit/Source/core/platform/graphics/transforms/TransformOperations.cpp
@@ -108,12 +108,4 @@ TransformOperations TransformOperations::blend(const TransformOperations& from,
return blendByUsingMatrixInterpolation(from, progress);
}
-TransformOperations TransformOperations::add(const TransformOperations& addend) const
-{
- TransformOperations result;
- result.m_operations = operations();
- result.m_operations.append(addend.operations());
- return result;
-}
-
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/platform/graphics/transforms/TransformOperations.h b/chromium/third_party/WebKit/Source/core/platform/graphics/transforms/TransformOperations.h
index 2f650126189..f40f77f3ce1 100644
--- a/chromium/third_party/WebKit/Source/core/platform/graphics/transforms/TransformOperations.h
+++ b/chromium/third_party/WebKit/Source/core/platform/graphics/transforms/TransformOperations.h
@@ -75,7 +75,6 @@ public:
TransformOperations blendByMatchingOperations(const TransformOperations& from, const double& progress) const;
TransformOperations blendByUsingMatrixInterpolation(const TransformOperations& from, double progress) const;
TransformOperations blend(const TransformOperations& from, double progress) const;
- TransformOperations add(const TransformOperations& addend) const;
private:
Vector<RefPtr<TransformOperation> > m_operations;
diff --git a/chromium/third_party/WebKit/Source/core/platform/mac/ScrollAnimatorMac.mm b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollAnimatorMac.mm
index 9f4dda58b55..a92ab24b9cc 100644
--- a/chromium/third_party/WebKit/Source/core/platform/mac/ScrollAnimatorMac.mm
+++ b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollAnimatorMac.mm
@@ -32,12 +32,12 @@
#include "core/platform/ScrollView.h"
#include "core/platform/ScrollableArea.h"
#include "core/platform/ScrollbarTheme.h"
-#include "core/platform/ScrollbarThemeMacCommon.h"
-#include "core/platform/ScrollbarThemeMacOverlayAPI.h"
#include "core/platform/graphics/FloatPoint.h"
#include "core/platform/mac/BlockExceptions.h"
#include "core/platform/mac/EmptyProtocolDefinitions.h"
#include "core/platform/mac/NSScrollerImpDetails.h"
+#include "core/platform/mac/ScrollbarThemeMac.h"
+#include "core/platform/mac/ScrollbarThemeMacOverlayAPI.h"
#include "wtf/MainThread.h"
#include "wtf/PassOwnPtr.h"
#include "wtf/UnusedParam.h"
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacCommon.h b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMac.h
index 8a62dd909d2..fac25ecaaf6 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacCommon.h
+++ b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMac.h
@@ -23,8 +23,8 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef ScrollbarThemeMacCommon_h
-#define ScrollbarThemeMacCommon_h
+#ifndef ScrollbarThemeMac_h
+#define ScrollbarThemeMac_h
#include "core/platform/ScrollbarTheme.h"
@@ -63,4 +63,4 @@ protected:
}
-#endif // ScrollbarThemeMacCommon_h
+#endif
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacCommon.mm b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMac.mm
index 5577f9631bd..6b7975afda3 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacCommon.mm
+++ b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMac.mm
@@ -20,18 +20,16 @@
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
-#include "core/platform/ScrollbarThemeMacCommon.h"
+#include "core/platform/mac/ScrollbarThemeMac.h"
#include <Carbon/Carbon.h>
#include "core/page/FrameView.h"
#include "core/platform/PlatformMouseEvent.h"
#include "core/platform/ScrollView.h"
-#include "core/platform/ScrollbarThemeMacNonOverlayAPI.h"
-#include "core/platform/ScrollbarThemeMacOverlayAPI.h"
#include "core/platform/graphics/Gradient.h"
#include "core/platform/graphics/GraphicsContext.h"
#include "core/platform/graphics/GraphicsContextStateSaver.h"
@@ -41,6 +39,8 @@
#include "core/platform/mac/LocalCurrentGraphicsContext.h"
#include "core/platform/mac/NSScrollerImpDetails.h"
#include "core/platform/mac/ScrollAnimatorMac.h"
+#include "core/platform/mac/ScrollbarThemeMacNonOverlayAPI.h"
+#include "core/platform/mac/ScrollbarThemeMacOverlayAPI.h"
#include "public/platform/mac/WebThemeEngine.h"
#include "public/platform/Platform.h"
#include "public/platform/WebRect.h"
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacNonOverlayAPI.h b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMacNonOverlayAPI.h
index e51380059f4..28066053108 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacNonOverlayAPI.h
+++ b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMacNonOverlayAPI.h
@@ -31,7 +31,7 @@
#ifndef ScrollbarThemeMacNonOverlayAPI_h
#define ScrollbarThemeMacNonOverlayAPI_h
-#include "core/platform/ScrollbarThemeMacCommon.h"
+#include "core/platform/mac/ScrollbarThemeMac.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacNonOverlayAPI.mm b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMacNonOverlayAPI.mm
index dc8540053d9..62e2db5c1ef 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacNonOverlayAPI.mm
+++ b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMacNonOverlayAPI.mm
@@ -29,7 +29,7 @@
*/
#include "config.h"
-#include "core/platform/ScrollbarThemeMacNonOverlayAPI.h"
+#include "core/platform/mac/ScrollbarThemeMacNonOverlayAPI.h"
#include <Carbon/Carbon.h>
#include "core/platform/ScrollbarThemeClient.h"
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacOverlayAPI.h b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMacOverlayAPI.h
index b0c5aef9eb7..f1712a0d144 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacOverlayAPI.h
+++ b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMacOverlayAPI.h
@@ -31,7 +31,7 @@
#ifndef ScrollbarThemeMacOverlayAPI_h
#define ScrollbarThemeMacOverlayAPI_h
-#include "core/platform/ScrollbarThemeMacCommon.h"
+#include "core/platform/mac/ScrollbarThemeMac.h"
typedef id ScrollbarPainter;
diff --git a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacOverlayAPI.mm b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMacOverlayAPI.mm
index cac425ed928..a0ad14f2474 100644
--- a/chromium/third_party/WebKit/Source/core/platform/ScrollbarThemeMacOverlayAPI.mm
+++ b/chromium/third_party/WebKit/Source/core/platform/mac/ScrollbarThemeMacOverlayAPI.mm
@@ -29,7 +29,7 @@
*/
#include "config.h"
-#include "core/platform/ScrollbarThemeMacOverlayAPI.h"
+#include "core/platform/mac/ScrollbarThemeMacOverlayAPI.h"
#include "core/platform/graphics/GraphicsContext.h"
#include "core/platform/graphics/GraphicsContextStateSaver.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/FilterEffectRenderer.cpp b/chromium/third_party/WebKit/Source/core/rendering/FilterEffectRenderer.cpp
index f5787226fab..ea8f36eda58 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/FilterEffectRenderer.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/FilterEffectRenderer.cpp
@@ -29,8 +29,8 @@
#include "core/rendering/FilterEffectRenderer.h"
#include "core/dom/Document.h"
-#include "core/fetch/DocumentResource.h"
-#include "core/fetch/DocumentResourceReference.h"
+#include "core/loader/cache/DocumentResource.h"
+#include "core/loader/cache/DocumentResourceReference.h"
#include "core/page/Page.h"
#include "core/platform/FloatConversion.h"
#include "core/platform/graphics/ColorSpace.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/HitTestLocation.cpp b/chromium/third_party/WebKit/Source/core/rendering/HitTestLocation.cpp
index d09665d7fea..96c55aec951 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/HitTestLocation.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/HitTestLocation.cpp
@@ -27,7 +27,6 @@
#include "XLinkNames.h"
#include "core/dom/DocumentMarkerController.h"
#include "core/editing/FrameSelection.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLAnchorElement.h"
#include "core/html/HTMLImageElement.h"
#include "core/html/HTMLInputElement.h"
@@ -35,6 +34,7 @@
#include "core/html/HTMLPlugInImageElement.h"
#include "core/html/HTMLVideoElement.h"
#include "core/html/parser/HTMLParserIdioms.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/Frame.h"
#include "core/page/FrameTree.h"
#include "core/platform/Scrollbar.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/HitTestResult.cpp b/chromium/third_party/WebKit/Source/core/rendering/HitTestResult.cpp
index 58212803b40..393d2cb36dc 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/HitTestResult.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/HitTestResult.cpp
@@ -29,7 +29,6 @@
#include "core/dom/NodeRenderingTraversal.h"
#include "core/dom/shadow/ShadowRoot.h"
#include "core/editing/FrameSelection.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLAnchorElement.h"
#include "core/html/HTMLAreaElement.h"
#include "core/html/HTMLImageElement.h"
@@ -38,6 +37,7 @@
#include "core/html/HTMLTextAreaElement.h"
#include "core/html/HTMLVideoElement.h"
#include "core/html/parser/HTMLParserIdioms.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/Frame.h"
#include "core/page/FrameTree.h"
#include "core/platform/Scrollbar.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/PaintInfo.h b/chromium/third_party/WebKit/Source/core/rendering/PaintInfo.h
index 4e348f22380..5ff00c5db8e 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/PaintInfo.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/PaintInfo.h
@@ -61,7 +61,7 @@ struct PaintInfo {
, renderRegion(region)
, outlineObjects(newOutlineObjects)
, overlapTestRequests(overlapTestRequests)
- , m_paintContainer(newPaintContainer)
+ , paintContainer(newPaintContainer)
{
}
@@ -101,7 +101,6 @@ struct PaintInfo {
}
static IntRect infiniteRect() { return IntRect(LayoutRect::infiniteRect()); }
- const RenderLayerModelObject* paintContainer() const { return m_paintContainer; }
// FIXME: Introduce setters/getters at some point. Requires a lot of changes throughout rendering/.
GraphicsContext* context;
@@ -112,10 +111,7 @@ struct PaintInfo {
RenderRegion* renderRegion;
ListHashSet<RenderInline*>* outlineObjects; // used to list outlines that should be painted by a block with inline children
OverlapTestRequestMap* overlapTestRequests;
-
-private:
-
- const RenderLayerModelObject* m_paintContainer; // the layer object that originates the current painting
+ const RenderLayerModelObject* paintContainer; // the layer object that originates the current painting
};
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderBlock.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderBlock.cpp
index e94a24f4835..d40b5f2007f 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderBlock.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderBlock.cpp
@@ -224,20 +224,18 @@ static void removeBlockFromDescendantAndContainerMaps(RenderBlock* block, Tracke
RenderBlock::~RenderBlock()
{
+ if (m_floatingObjects)
+ deleteAllValues(m_floatingObjects->set());
+
if (hasColumns())
gColumnInfoMap->take(this);
+
if (gPercentHeightDescendantsMap)
removeBlockFromDescendantAndContainerMaps(this, gPercentHeightDescendantsMap, gPercentHeightContainerMap);
if (gPositionedDescendantsMap)
removeBlockFromDescendantAndContainerMaps(this, gPositionedDescendantsMap, gPositionedContainerMap);
}
-RenderBlock::FloatingObjects::~FloatingObjects()
-{
- // FIXME: m_set should use OwnPtr instead.
- deleteAllValues(m_set);
-}
-
RenderBlock* RenderBlock::createAnonymous(Document* document)
{
RenderBlock* renderer = new RenderBlock(0);
@@ -970,20 +968,17 @@ static void getInlineRun(RenderObject* start, RenderObject* boundary,
} while (!sawInline);
}
-void RenderBlock::FloatingObjects::clearLineBoxTreePointers()
-{
- // Clear references to originating lines, since the lines are being deleted
- FloatingObjectSetIterator end = m_set.end();
- for (FloatingObjectSetIterator it = m_set.begin(); it != end; ++it) {
- ASSERT(!((*it)->originatingLine()) || (*it)->originatingLine()->renderer() == m_renderer);
- (*it)->setOriginatingLine(0);
- }
-}
-
void RenderBlock::deleteLineBoxTree()
{
- if (containsFloats())
- m_floatingObjects->clearLineBoxTreePointers();
+ if (containsFloats()) {
+ // Clear references to originating lines, since the lines are being deleted
+ const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
+ FloatingObjectSetIterator end = floatingObjectSet.end();
+ for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
+ ASSERT(!((*it)->m_originatingLine) || (*it)->m_originatingLine->renderer() == this);
+ (*it)->m_originatingLine = 0;
+ }
+ }
m_lineBoxes.deleteLineBoxTree();
if (AXObjectCache* cache = document()->existingAXObjectCache())
@@ -1420,21 +1415,6 @@ void RenderBlock::layout()
invalidateBackgroundObscurationStatus();
}
-void RenderBlock::imageChanged(WrappedImagePtr image, const IntRect*)
-{
- RenderBox::imageChanged(image);
-
- if (!parent())
- return;
-
- ShapeValue* shapeValue = style()->shapeInside();
- if (shapeValue && shapeValue->image() && shapeValue->image()->data() == image) {
- ShapeInsideInfo* shapeInsideInfo = ensureShapeInsideInfo();
- shapeInsideInfo->dirtyShapeSize();
- markShapeInsideDescendantsForLayout();
- }
-}
-
void RenderBlock::updateShapeInsideInfoAfterStyleChange(const ShapeValue* shapeInside, const ShapeValue* oldShapeInside)
{
// FIXME: A future optimization would do a deep comparison for equality.
@@ -1803,7 +1783,7 @@ void RenderBlock::addOverflowFromFloats()
for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
FloatingObject* r = *it;
if (r->isDescendant())
- addOverflowFromChild(r->renderer(), IntSize(xPositionForFloatIncludingMargin(r), yPositionForFloatIncludingMargin(r)));
+ addOverflowFromChild(r->m_renderer, IntSize(xPositionForFloatIncludingMargin(r), yPositionForFloatIncludingMargin(r)));
}
}
@@ -2733,11 +2713,6 @@ bool RenderBlock::simplifiedLayout()
if (needsSimplifiedNormalFlowLayout())
simplifiedNormalFlowLayout();
- // Make sure a forced break is applied after the content if we are a flow thread in a simplified layout.
- // This ensures the size information is correctly computed for the last auto-height region receiving content.
- if (isRenderFlowThread())
- toRenderFlowThread(this)->applyBreakAfterContent(clientLogicalBottom());
-
// Lay out our positioned objects if our positioned child bit is set.
// Also, if an absolute position element inside a relative positioned container moves, and the absolute element has a fixed position
// child, neither the fixed element nor its container learn of the movement since posChildNeedsLayout() is only marked as far as the
@@ -2902,11 +2877,9 @@ void RenderBlock::repaintOverhangingFloats(bool paintAllDescendants)
// Only repaint the object if it is overhanging, is not in its own layer, and
// is our responsibility to paint (m_shouldPaint is set). When paintAllDescendants is true, the latter
// condition is replaced with being a descendant of us.
- if (r->logicalBottom(isHorizontalWritingMode()) > logicalHeight()
- && !r->renderer()->hasSelfPaintingLayer()
- && (r->shouldPaint() || (paintAllDescendants && r->renderer()->isDescendantOf(this)))) {
- r->renderer()->repaint();
- r->renderer()->repaintOverhangingFloats(false);
+ if (logicalBottomForFloat(r) > logicalHeight() && ((paintAllDescendants && r->m_renderer->isDescendantOf(this)) || r->shouldPaint()) && !r->m_renderer->hasSelfPaintingLayer()) {
+ r->m_renderer->repaint();
+ r->m_renderer->repaintOverhangingFloats(false);
}
}
}
@@ -3267,21 +3240,20 @@ void RenderBlock::paintFloats(PaintInfo& paintInfo, const LayoutPoint& paintOffs
for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
FloatingObject* r = *it;
// Only paint the object if our m_shouldPaint flag is set.
- if (r->shouldPaint() && !r->renderer()->hasSelfPaintingLayer()) {
+ if (r->shouldPaint() && !r->m_renderer->hasSelfPaintingLayer()) {
PaintInfo currentPaintInfo(paintInfo);
currentPaintInfo.phase = preservePhase ? paintInfo.phase : PaintPhaseBlockBackground;
- // FIXME: LayoutPoint version of xPositionForFloatIncludingMargin would make this much cleaner.
- LayoutPoint childPoint = flipFloatForWritingModeForChild(r, LayoutPoint(paintOffset.x() + xPositionForFloatIncludingMargin(r) - r->renderer()->x(), paintOffset.y() + yPositionForFloatIncludingMargin(r) - r->renderer()->y()));
- r->renderer()->paint(currentPaintInfo, childPoint);
+ LayoutPoint childPoint = flipFloatForWritingModeForChild(r, LayoutPoint(paintOffset.x() + xPositionForFloatIncludingMargin(r) - r->m_renderer->x(), paintOffset.y() + yPositionForFloatIncludingMargin(r) - r->m_renderer->y()));
+ r->m_renderer->paint(currentPaintInfo, childPoint);
if (!preservePhase) {
currentPaintInfo.phase = PaintPhaseChildBlockBackgrounds;
- r->renderer()->paint(currentPaintInfo, childPoint);
+ r->m_renderer->paint(currentPaintInfo, childPoint);
currentPaintInfo.phase = PaintPhaseFloat;
- r->renderer()->paint(currentPaintInfo, childPoint);
+ r->m_renderer->paint(currentPaintInfo, childPoint);
currentPaintInfo.phase = PaintPhaseForeground;
- r->renderer()->paint(currentPaintInfo, childPoint);
+ r->m_renderer->paint(currentPaintInfo, childPoint);
currentPaintInfo.phase = PaintPhaseOutline;
- r->renderer()->paint(currentPaintInfo, childPoint);
+ r->m_renderer->paint(currentPaintInfo, childPoint);
}
}
}
@@ -3495,7 +3467,7 @@ GapRects RenderBlock::selectionGaps(RenderBlock* rootBlock, const LayoutPoint& r
FloatingObject* r = *it;
LayoutRect floatBox(offsetFromRootBlock.width() + xPositionForFloatIncludingMargin(r),
offsetFromRootBlock.height() + yPositionForFloatIncludingMargin(r),
- r->renderer()->width(), r->renderer()->height());
+ r->m_renderer->width(), r->m_renderer->height());
rootBlock->flipForWritingMode(floatBox);
floatBox.move(rootBlockPhysicalPosition.x(), rootBlockPhysicalPosition.y());
paintInfo->context->clipOut(pixelSnappedIntRect(floatBox));
@@ -3934,14 +3906,14 @@ RenderBlock::FloatingObject* RenderBlock::insertFloatingObject(RenderBox* o)
o->computeAndSetBlockDirectionMargins(this);
}
- newObj->setLogicalWidth(logicalWidthForChild(o) + marginStartForChild(o) + marginEndForChild(o), isHorizontalWritingMode());
+ setLogicalWidthForFloat(newObj, logicalWidthForChild(o) + marginStartForChild(o) + marginEndForChild(o));
if (ShapeOutsideInfo* shapeOutside = o->shapeOutsideInfo())
shapeOutside->setShapeSize(logicalWidthForChild(o), logicalHeightForChild(o));
newObj->setShouldPaint(!o->hasSelfPaintingLayer()); // If a layer exists, the float will paint itself. Otherwise someone else will.
newObj->setIsDescendant(true);
- newObj->setRenderer(o);
+ newObj->m_renderer = o;
m_floatingObjects->add(newObj);
@@ -3956,8 +3928,8 @@ void RenderBlock::removeFloatingObject(RenderBox* o)
if (it != floatingObjectSet.end()) {
FloatingObject* r = *it;
if (childrenInline()) {
- LayoutUnit logicalTop = r->logicalTop(isHorizontalWritingMode());
- LayoutUnit logicalBottom = r->logicalBottom(isHorizontalWritingMode());
+ LayoutUnit logicalTop = logicalTopForFloat(r);
+ LayoutUnit logicalBottom = logicalBottomForFloat(r);
// Fix for https://bugs.webkit.org/show_bug.cgi?id=54995.
if (logicalBottom < 0 || logicalBottom < logicalTop || logicalTop == LayoutUnit::max())
@@ -3968,19 +3940,19 @@ void RenderBlock::removeFloatingObject(RenderBox* o)
// accomplished by pretending they have a height of 1.
logicalBottom = max(logicalBottom, logicalTop + 1);
}
- if (r->originatingLine()) {
+ if (r->m_originatingLine) {
if (!selfNeedsLayout()) {
- ASSERT(r->originatingLine()->renderer() == this);
- r->originatingLine()->markDirty();
+ ASSERT(r->m_originatingLine->renderer() == this);
+ r->m_originatingLine->markDirty();
}
#if !ASSERT_DISABLED
- r->setOriginatingLine(0);
+ r->m_originatingLine = 0;
#endif
}
markLinesDirtyInBlockRange(0, logicalBottom);
}
m_floatingObjects->remove(r);
- ASSERT(!r->originatingLine());
+ ASSERT(!r->m_originatingLine);
delete r;
}
}
@@ -3993,9 +3965,9 @@ void RenderBlock::removeFloatingObjectsBelow(FloatingObject* lastFloat, int logi
const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
FloatingObject* curr = floatingObjectSet.last();
- while (curr != lastFloat && (!curr->isPlaced() || curr->logicalTop(isHorizontalWritingMode()) >= logicalOffset)) {
+ while (curr != lastFloat && (!curr->isPlaced() || logicalTopForFloat(curr) >= logicalOffset)) {
m_floatingObjects->remove(curr);
- ASSERT(!curr->originatingLine());
+ ASSERT(!curr->m_originatingLine);
delete curr;
if (floatingObjectSet.isEmpty())
break;
@@ -4021,7 +3993,7 @@ LayoutPoint RenderBlock::computeLogicalLocationForFloat(const FloatingObject* fl
} else
logicalRightOffset = logicalRightOffsetForContent(logicalTopOffset);
- LayoutUnit floatLogicalWidth = min(floatingObject->logicalWidth(isHorizontalWritingMode()), logicalRightOffset - logicalLeftOffset); // The width we look for.
+ LayoutUnit floatLogicalWidth = min(logicalWidthForFloat(floatingObject), logicalRightOffset - logicalLeftOffset); // The width we look for.
LayoutUnit floatLogicalLeft;
@@ -4038,7 +4010,7 @@ LayoutPoint RenderBlock::computeLogicalLocationForFloat(const FloatingObject* fl
// Have to re-evaluate all of our offsets, since they may have changed.
logicalRightOffset = logicalRightOffsetForContent(logicalTopOffset); // Constant part of right offset.
logicalLeftOffset = logicalLeftOffsetForContent(logicalTopOffset); // Constant part of left offset.
- floatLogicalWidth = min(floatingObject->logicalWidth(isHorizontalWritingMode()), logicalRightOffset - logicalLeftOffset);
+ floatLogicalWidth = min(logicalWidthForFloat(floatingObject), logicalRightOffset - logicalLeftOffset);
}
}
floatLogicalLeft = max(logicalLeftOffset - borderAndPaddingLogicalLeft(), floatLogicalLeft);
@@ -4053,10 +4025,10 @@ LayoutPoint RenderBlock::computeLogicalLocationForFloat(const FloatingObject* fl
// Have to re-evaluate all of our offsets, since they may have changed.
logicalRightOffset = logicalRightOffsetForContent(logicalTopOffset); // Constant part of right offset.
logicalLeftOffset = logicalLeftOffsetForContent(logicalTopOffset); // Constant part of left offset.
- floatLogicalWidth = min(floatingObject->logicalWidth(isHorizontalWritingMode()), logicalRightOffset - logicalLeftOffset);
+ floatLogicalWidth = min(logicalWidthForFloat(floatingObject), logicalRightOffset - logicalLeftOffset);
}
}
- floatLogicalLeft -= floatingObject->logicalWidth(isHorizontalWritingMode()); // Use the original width of the float here, since the local variable
+ floatLogicalLeft -= logicalWidthForFloat(floatingObject); // Use the original width of the float here, since the local variable
// |floatLogicalWidth| was capped to the available line width.
// See fast/block/float/clamped-right-float.html.
}
@@ -4097,7 +4069,7 @@ bool RenderBlock::positionNewFloats()
// The float cannot start above the top position of the last positioned float.
if (lastPlacedFloatingObject)
- logicalTop = max(lastPlacedFloatingObject->logicalTop(isHorizontalWritingMode()), logicalTop);
+ logicalTop = max(logicalTopForFloat(lastPlacedFloatingObject), logicalTop);
FloatingObjectSetIterator end = floatingObjectSet.end();
// Now walk through the set of unpositioned floats and place them.
@@ -4120,7 +4092,7 @@ bool RenderBlock::positionNewFloats()
LayoutPoint floatLogicalLocation = computeLogicalLocationForFloat(floatingObject, logicalTop);
- floatingObject->setLogicalLeft(floatLogicalLocation.x(), isHorizontalWritingMode());
+ setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x());
setLogicalLeftForChild(childBox, floatLogicalLocation.x() + childLogicalLeftMargin);
setLogicalTopForChild(childBox, floatLogicalLocation.y() + marginBeforeForChild(childBox));
@@ -4147,10 +4119,10 @@ bool RenderBlock::positionNewFloats()
}
if (newLogicalTop != floatLogicalLocation.y()) {
- floatingObject->setPaginationStrut(newLogicalTop - floatLogicalLocation.y());
+ floatingObject->m_paginationStrut = newLogicalTop - floatLogicalLocation.y();
floatLogicalLocation = computeLogicalLocationForFloat(floatingObject, newLogicalTop);
- floatingObject->setLogicalLeft(floatLogicalLocation.x(), isHorizontalWritingMode());
+ setLogicalLeftForFloat(floatingObject, floatLogicalLocation.x());
setLogicalLeftForChild(childBox, floatLogicalLocation.x() + childLogicalLeftMargin);
setLogicalTopForChild(childBox, floatLogicalLocation.y() + marginBeforeForChild(childBox));
@@ -4161,9 +4133,9 @@ bool RenderBlock::positionNewFloats()
}
}
- floatingObject->setLogicalTop(floatLogicalLocation.y(), isHorizontalWritingMode());
+ setLogicalTopForFloat(floatingObject, floatLogicalLocation.y());
- floatingObject->setLogicalHeight(logicalHeightForChild(childBox) + marginBeforeForChild(childBox) + marginAfterForChild(childBox), isHorizontalWritingMode());
+ setLogicalHeightForFloat(floatingObject, logicalHeightForChild(childBox) + marginBeforeForChild(childBox) + marginAfterForChild(childBox));
m_floatingObjects->addPlacedObject(floatingObject);
@@ -4254,7 +4226,7 @@ void RenderBlock::clearPercentHeightDescendantsFrom(RenderBox* parent)
}
}
-inline static bool rangesIntersect(int floatTop, int floatBottom, int objectTop, int objectBottom)
+static bool rangesIntersect(int floatTop, int floatBottom, int objectTop, int objectBottom)
{
if (objectTop >= floatBottom || objectBottom < floatTop)
return false;
@@ -4275,48 +4247,41 @@ inline static bool rangesIntersect(int floatTop, int floatBottom, int objectTop,
}
template<>
-inline bool RenderBlock::ComputeFloatOffsetAdapter<RenderBlock::FloatingObject::FloatLeft>::updateOffsetIfNeeded(const FloatingObject* floatingObject)
+bool RenderBlock::FloatIntervalSearchAdapter<RenderBlock::FloatingObject::FloatLeft>::updateOffsetIfNeeded(const FloatingObject* floatingObject) const
{
- LayoutUnit logicalRight = floatingObject->logicalRight(m_renderer->isHorizontalWritingMode());
- if (logicalRight > m_offset) {
- m_offset = logicalRight;
+ if (m_renderer->logicalRightForFloat(floatingObject) > m_offset) {
+ m_offset = m_renderer->logicalRightForFloat(floatingObject);
return true;
}
return false;
}
template<>
-inline bool RenderBlock::ComputeFloatOffsetAdapter<RenderBlock::FloatingObject::FloatRight>::updateOffsetIfNeeded(const FloatingObject* floatingObject)
+bool RenderBlock::FloatIntervalSearchAdapter<RenderBlock::FloatingObject::FloatRight>::updateOffsetIfNeeded(const FloatingObject* floatingObject) const
{
- LayoutUnit logicalLeft = floatingObject->logicalLeft(m_renderer->isHorizontalWritingMode());
- if (logicalLeft < m_offset) {
- m_offset = logicalLeft;
+ if (m_renderer->logicalLeftForFloat(floatingObject) < m_offset) {
+ m_offset = m_renderer->logicalLeftForFloat(floatingObject);
return true;
}
return false;
}
template <RenderBlock::FloatingObject::Type FloatTypeValue>
-inline void RenderBlock::ComputeFloatOffsetAdapter<FloatTypeValue>::collectIfNeeded(const IntervalType& interval)
+inline void RenderBlock::FloatIntervalSearchAdapter<FloatTypeValue>::collectIfNeeded(const IntervalType& interval) const
{
const FloatingObject* floatingObject = interval.data();
- if (floatingObject->type() != FloatTypeValue || !rangesIntersect(interval.low(), interval.high(), m_lineTop, m_lineBottom))
+ if (floatingObject->type() != FloatTypeValue || !rangesIntersect(interval.low(), interval.high(), m_lowValue, m_highValue))
return;
- // Make sure the float hasn't changed since it was added to the placed floats tree.
+ // All the objects returned from the tree should be already placed.
ASSERT(floatingObject->isPlaced());
- ASSERT(interval.low() == floatingObject->pixelSnappedLogicalTop(m_renderer->isHorizontalWritingMode()));
- ASSERT(interval.high() == floatingObject->pixelSnappedLogicalBottom(m_renderer->isHorizontalWritingMode()));
+ ASSERT(rangesIntersect(m_renderer->pixelSnappedLogicalTopForFloat(floatingObject), m_renderer->pixelSnappedLogicalBottomForFloat(floatingObject), m_lowValue, m_highValue));
bool floatIsNewExtreme = updateOffsetIfNeeded(floatingObject);
- if (floatIsNewExtreme)
- m_outermostFloat = floatingObject;
-}
+ if (floatIsNewExtreme && m_heightRemaining)
+ *m_heightRemaining = m_renderer->logicalBottomForFloat(floatingObject) - m_lowValue;
-template <RenderBlock::FloatingObject::Type FloatTypeValue>
-LayoutUnit RenderBlock::ComputeFloatOffsetAdapter<FloatTypeValue>::getHeightRemaining() const
-{
- return m_outermostFloat ? m_outermostFloat->logicalBottom(m_renderer->isHorizontalWritingMode()) - m_lineTop : LayoutUnit(1);
+ m_last = floatingObject;
}
LayoutUnit RenderBlock::textIndentOffset() const
@@ -4353,16 +4318,16 @@ LayoutUnit RenderBlock::logicalLeftFloatOffsetForLine(LayoutUnit logicalTop, Lay
{
LayoutUnit left = fixedOffset;
if (m_floatingObjects && m_floatingObjects->hasLeftObjects()) {
- ComputeFloatOffsetAdapter<FloatingObject::FloatLeft> adapter(this, roundToInt(logicalTop), roundToInt(logicalTop + logicalHeight), left);
- m_floatingObjects->placedFloatsTree().allOverlapsWithAdapter(adapter);
-
if (heightRemaining)
- *heightRemaining = adapter.getHeightRemaining();
+ *heightRemaining = 1;
+
+ FloatIntervalSearchAdapter<FloatingObject::FloatLeft> adapter(this, roundToInt(logicalTop), roundToInt(logicalTop + logicalHeight), left, heightRemaining);
+ m_floatingObjects->placedFloatsTree().allOverlapsWithAdapter(adapter);
- const FloatingObject* outermostFloat = adapter.outermostFloat();
- if (offsetMode == ShapeOutsideFloatShapeOffset && outermostFloat) {
- if (ShapeOutsideInfo* shapeOutside = outermostFloat->renderer()->shapeOutsideInfo()) {
- shapeOutside->computeSegmentsForContainingBlockLine(logicalTop, outermostFloat->logicalTop(isHorizontalWritingMode()), logicalHeight);
+ const FloatingObject* lastFloat = adapter.lastFloat();
+ if (offsetMode == ShapeOutsideFloatShapeOffset && lastFloat) {
+ if (ShapeOutsideInfo* shapeOutside = lastFloat->renderer()->shapeOutsideInfo()) {
+ shapeOutside->computeSegmentsForContainingBlockLine(logicalTop, logicalTopForFloat(lastFloat), logicalHeight);
left += shapeOutside->rightSegmentMarginBoxDelta();
}
}
@@ -4413,17 +4378,17 @@ LayoutUnit RenderBlock::logicalRightFloatOffsetForLine(LayoutUnit logicalTop, La
{
LayoutUnit right = fixedOffset;
if (m_floatingObjects && m_floatingObjects->hasRightObjects()) {
+ if (heightRemaining)
+ *heightRemaining = 1;
+
LayoutUnit rightFloatOffset = fixedOffset;
- ComputeFloatOffsetAdapter<FloatingObject::FloatRight> adapter(this, roundToInt(logicalTop), roundToInt(logicalTop + logicalHeight), rightFloatOffset);
+ FloatIntervalSearchAdapter<FloatingObject::FloatRight> adapter(this, roundToInt(logicalTop), roundToInt(logicalTop + logicalHeight), rightFloatOffset, heightRemaining);
m_floatingObjects->placedFloatsTree().allOverlapsWithAdapter(adapter);
- if (heightRemaining)
- *heightRemaining = adapter.getHeightRemaining();
-
- const FloatingObject* outermostFloat = adapter.outermostFloat();
- if (offsetMode == ShapeOutsideFloatShapeOffset && outermostFloat) {
- if (ShapeOutsideInfo* shapeOutside = outermostFloat->renderer()->shapeOutsideInfo()) {
- shapeOutside->computeSegmentsForContainingBlockLine(logicalTop, outermostFloat->logicalTop(isHorizontalWritingMode()), logicalHeight);
+ const FloatingObject* lastFloat = adapter.lastFloat();
+ if (offsetMode == ShapeOutsideFloatShapeOffset && lastFloat) {
+ if (ShapeOutsideInfo* shapeOutside = lastFloat->renderer()->shapeOutsideInfo()) {
+ shapeOutside->computeSegmentsForContainingBlockLine(logicalTop, logicalTopForFloat(lastFloat), logicalHeight);
rightFloatOffset += shapeOutside->leftSegmentMarginBoxDelta();
}
}
@@ -4481,7 +4446,7 @@ LayoutUnit RenderBlock::nextFloatLogicalBottomBelow(LayoutUnit logicalHeight) co
FloatingObjectSetIterator end = floatingObjectSet.end();
for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
FloatingObject* r = *it;
- LayoutUnit floatBottom = r->logicalBottom(isHorizontalWritingMode());
+ LayoutUnit floatBottom = logicalBottomForFloat(r);
if (floatBottom > logicalHeight)
bottom = min(floatBottom, bottom);
}
@@ -4499,7 +4464,7 @@ LayoutUnit RenderBlock::lowestFloatLogicalBottom(FloatingObject::Type floatType)
for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
FloatingObject* r = *it;
if (r->isPlaced() && r->type() & floatType)
- lowestFloatBottom = max(lowestFloatBottom, r->logicalBottom(isHorizontalWritingMode()));
+ lowestFloatBottom = max(lowestFloatBottom, logicalBottomForFloat(r));
}
return lowestFloatBottom;
}
@@ -4534,7 +4499,7 @@ void RenderBlock::clearFloats()
for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
FloatingObject* floatingObject = *it;
if (!floatingObject->isDescendant())
- oldIntrudingFloatSet.add(floatingObject->renderer());
+ oldIntrudingFloatSet.add(floatingObject->m_renderer);
}
}
@@ -4558,7 +4523,7 @@ void RenderBlock::clearFloats()
FloatingObjectSetIterator end = floatingObjectSet.end();
for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
FloatingObject* f = *it;
- floatMap.add(f->renderer(), f);
+ floatMap.add(f->m_renderer, f);
}
} else {
deleteAllValues(floatingObjectSet);
@@ -4610,11 +4575,11 @@ void RenderBlock::clearFloats()
FloatingObjectSetIterator end = floatingObjectSet.end();
for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
FloatingObject* f = *it;
- FloatingObject* oldFloatingObject = floatMap.get(f->renderer());
- LayoutUnit logicalBottom = f->logicalBottom(isHorizontalWritingMode());
+ FloatingObject* oldFloatingObject = floatMap.get(f->m_renderer);
+ LayoutUnit logicalBottom = logicalBottomForFloat(f);
if (oldFloatingObject) {
- LayoutUnit oldLogicalBottom = oldFloatingObject->logicalBottom(isHorizontalWritingMode());
- if (f->logicalWidth(isHorizontalWritingMode()) != oldFloatingObject->logicalWidth(isHorizontalWritingMode()) || f->logicalLeft(isHorizontalWritingMode()) != oldFloatingObject->logicalLeft(isHorizontalWritingMode())) {
+ LayoutUnit oldLogicalBottom = logicalBottomForFloat(oldFloatingObject);
+ if (logicalWidthForFloat(f) != logicalWidthForFloat(oldFloatingObject) || logicalLeftForFloat(f) != logicalLeftForFloat(oldFloatingObject)) {
changeLogicalTop = 0;
changeLogicalBottom = max(changeLogicalBottom, max(logicalBottom, oldLogicalBottom));
} else {
@@ -4622,18 +4587,18 @@ void RenderBlock::clearFloats()
changeLogicalTop = min(changeLogicalTop, min(logicalBottom, oldLogicalBottom));
changeLogicalBottom = max(changeLogicalBottom, max(logicalBottom, oldLogicalBottom));
}
- LayoutUnit logicalTop = f->logicalTop(isHorizontalWritingMode());
- LayoutUnit oldLogicalTop = oldFloatingObject->logicalTop(isHorizontalWritingMode());
+ LayoutUnit logicalTop = logicalTopForFloat(f);
+ LayoutUnit oldLogicalTop = logicalTopForFloat(oldFloatingObject);
if (logicalTop != oldLogicalTop) {
changeLogicalTop = min(changeLogicalTop, min(logicalTop, oldLogicalTop));
changeLogicalBottom = max(changeLogicalBottom, max(logicalTop, oldLogicalTop));
}
}
- floatMap.remove(f->renderer());
- if (oldFloatingObject->originatingLine() && !selfNeedsLayout()) {
- ASSERT(oldFloatingObject->originatingLine()->renderer() == this);
- oldFloatingObject->originatingLine()->markDirty();
+ floatMap.remove(f->m_renderer);
+ if (oldFloatingObject->m_originatingLine && !selfNeedsLayout()) {
+ ASSERT(oldFloatingObject->m_originatingLine->renderer() == this);
+ oldFloatingObject->m_originatingLine->markDirty();
}
delete oldFloatingObject;
} else {
@@ -4648,7 +4613,7 @@ void RenderBlock::clearFloats()
FloatingObject* floatingObject = (*it).value;
if (!floatingObject->isDescendant()) {
changeLogicalTop = 0;
- changeLogicalBottom = max(changeLogicalBottom, floatingObject->logicalBottom(isHorizontalWritingMode()));
+ changeLogicalBottom = max(changeLogicalBottom, logicalBottomForFloat(floatingObject));
}
}
deleteAllValues(floatMap);
@@ -4663,7 +4628,7 @@ void RenderBlock::clearFloats()
const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
FloatingObjectSetIterator end = floatingObjectSet.end();
for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end && !oldIntrudingFloatSet.isEmpty(); ++it)
- oldIntrudingFloatSet.remove((*it)->renderer());
+ oldIntrudingFloatSet.remove((*it)->m_renderer);
if (!oldIntrudingFloatSet.isEmpty())
markAllDescendantsWithFloatsForLayout();
}
@@ -4685,22 +4650,22 @@ LayoutUnit RenderBlock::addOverhangingFloats(RenderBlock* child, bool makeChildP
FloatingObjectSetIterator childEnd = child->m_floatingObjects->set().end();
for (FloatingObjectSetIterator childIt = child->m_floatingObjects->set().begin(); childIt != childEnd; ++childIt) {
FloatingObject* r = *childIt;
- LayoutUnit logicalBottomForFloat = min(r->logicalBottom(isHorizontalWritingMode()), LayoutUnit::max() - childLogicalTop);
+ LayoutUnit logicalBottomForFloat = min(this->logicalBottomForFloat(r), LayoutUnit::max() - childLogicalTop);
LayoutUnit logicalBottom = childLogicalTop + logicalBottomForFloat;
lowestFloatLogicalBottom = max(lowestFloatLogicalBottom, logicalBottom);
if (logicalBottom > logicalHeight()) {
// If the object is not in the list, we add it now.
- if (!containsFloat(r->renderer())) {
+ if (!containsFloat(r->m_renderer)) {
LayoutSize offset = isHorizontalWritingMode() ? LayoutSize(-childLogicalLeft, -childLogicalTop) : LayoutSize(-childLogicalTop, -childLogicalLeft);
FloatingObject* floatingObj = new FloatingObject(r->type(), LayoutRect(r->frameRect().location() - offset, r->frameRect().size()));
- floatingObj->setRenderer(r->renderer());
+ floatingObj->m_renderer = r->m_renderer;
// The nearest enclosing layer always paints the float (so that zindex and stacking
// behaves properly). We always want to propagate the desire to paint the float as
// far out as we can, to the outermost block that overlaps the float, stopping only
// if we hit a self-painting layer boundary.
- if (r->renderer()->enclosingFloatPaintingLayer() == enclosingFloatPaintingLayer())
+ if (r->m_renderer->enclosingFloatPaintingLayer() == enclosingFloatPaintingLayer())
r->setShouldPaint(false);
else
floatingObj->setShouldPaint(false);
@@ -4713,8 +4678,8 @@ LayoutUnit RenderBlock::addOverhangingFloats(RenderBlock* child, bool makeChildP
m_floatingObjects->add(floatingObj);
}
} else {
- if (makeChildPaintOtherFloats && !r->shouldPaint() && !r->renderer()->hasSelfPaintingLayer()
- && r->renderer()->isDescendantOf(child) && r->renderer()->enclosingFloatPaintingLayer() == child->enclosingFloatPaintingLayer()) {
+ if (makeChildPaintOtherFloats && !r->shouldPaint() && !r->m_renderer->hasSelfPaintingLayer()
+ && r->m_renderer->isDescendantOf(child) && r->m_renderer->enclosingFloatPaintingLayer() == child->enclosingFloatPaintingLayer()) {
// The float is not overhanging from this block, so if it is a descendant of the child, the child should
// paint it (the other case is that it is intruding into the child), unless it has its own layer or enclosing
// layer.
@@ -4726,7 +4691,7 @@ LayoutUnit RenderBlock::addOverhangingFloats(RenderBlock* child, bool makeChildP
// Since the float doesn't overhang, it didn't get put into our list. We need to go ahead and add its overflow in to the
// child now.
if (r->isDescendant())
- child->addOverflowFromChild(r->renderer(), LayoutSize(xPositionForFloatIncludingMargin(r), yPositionForFloatIncludingMargin(r)));
+ child->addOverflowFromChild(r->m_renderer, LayoutSize(xPositionForFloatIncludingMargin(r), yPositionForFloatIncludingMargin(r)));
}
}
return lowestFloatLogicalBottom;
@@ -4742,7 +4707,7 @@ bool RenderBlock::hasOverhangingFloat(RenderBox* renderer)
if (it == floatingObjectSet.end())
return false;
- return (*it)->logicalBottom(isHorizontalWritingMode()) > logicalHeight();
+ return logicalBottomForFloat(*it) > logicalHeight();
}
void RenderBlock::addIntrudingFloats(RenderBlock* prev, LayoutUnit logicalLeftOffset, LayoutUnit logicalTopOffset)
@@ -4759,7 +4724,7 @@ void RenderBlock::addIntrudingFloats(RenderBlock* prev, LayoutUnit logicalLeftOf
FloatingObjectSetIterator prevEnd = prevSet.end();
for (FloatingObjectSetIterator prevIt = prevSet.begin(); prevIt != prevEnd; ++prevIt) {
FloatingObject* r = *prevIt;
- if (r->logicalBottom(isHorizontalWritingMode()) > logicalTopOffset) {
+ if (logicalBottomForFloat(r) > logicalTopOffset) {
if (!m_floatingObjects || !m_floatingObjects->set().contains(r)) {
LayoutSize offset = isHorizontalWritingMode() ? LayoutSize(logicalLeftOffset, logicalTopOffset) : LayoutSize(logicalTopOffset, logicalLeftOffset);
FloatingObject* floatingObj = new FloatingObject(r->type(), LayoutRect(r->frameRect().location() - offset, r->frameRect().size()));
@@ -4777,7 +4742,7 @@ void RenderBlock::addIntrudingFloats(RenderBlock* prev, LayoutUnit logicalLeftOf
}
floatingObj->setShouldPaint(false); // We are not in the direct inheritance chain for this float. We will never paint it.
- floatingObj->setRenderer(r->renderer());
+ floatingObj->m_renderer = r->m_renderer;
// We create the floating object list lazily.
if (!m_floatingObjects)
@@ -5031,11 +4996,11 @@ bool RenderBlock::hitTestFloats(const HitTestRequest& request, HitTestResult& re
for (FloatingObjectSetIterator it = floatingObjectSet.end(); it != begin;) {
--it;
FloatingObject* floatingObject = *it;
- if (floatingObject->shouldPaint() && !floatingObject->renderer()->hasSelfPaintingLayer()) {
- LayoutUnit xOffset = xPositionForFloatIncludingMargin(floatingObject) - floatingObject->renderer()->x();
- LayoutUnit yOffset = yPositionForFloatIncludingMargin(floatingObject) - floatingObject->renderer()->y();
+ if (floatingObject->shouldPaint() && !floatingObject->m_renderer->hasSelfPaintingLayer()) {
+ LayoutUnit xOffset = xPositionForFloatIncludingMargin(floatingObject) - floatingObject->m_renderer->x();
+ LayoutUnit yOffset = yPositionForFloatIncludingMargin(floatingObject) - floatingObject->m_renderer->y();
LayoutPoint childPoint = flipFloatForWritingModeForChild(floatingObject, adjustedLocation + LayoutSize(xOffset, yOffset));
- if (floatingObject->renderer()->hitTest(request, result, locationInContainer, childPoint)) {
+ if (floatingObject->m_renderer->hitTest(request, result, locationInContainer, childPoint)) {
updateHitTestResult(result, locationInContainer.point() - toLayoutSize(childPoint));
return true;
}
@@ -6926,8 +6891,8 @@ void RenderBlock::adjustForBorderFit(LayoutUnit x, LayoutUnit& left, LayoutUnit&
FloatingObject* r = *it;
// Only examine the object if our m_shouldPaint flag is set.
if (r->shouldPaint()) {
- LayoutUnit floatLeft = xPositionForFloatIncludingMargin(r) - r->renderer()->x();
- LayoutUnit floatRight = floatLeft + r->renderer()->width();
+ LayoutUnit floatLeft = xPositionForFloatIncludingMargin(r) - r->m_renderer->x();
+ LayoutUnit floatRight = floatLeft + r->m_renderer->width();
left = min(left, floatLeft);
right = max(right, floatRight);
}
@@ -7695,7 +7660,7 @@ LayoutUnit RenderBlock::offsetFromLogicalTopOfFirstPage() const
// FIXME: Sanity check that the renderer in the layout state is ours, since otherwise the computation will be off.
// Right now this assert gets hit inside computeLogicalHeight for percentage margins, since they're computed using
// widths which can vary in each region. Until we patch that, we can't have this assert.
- // ASSERT(layoutState->renderer() == this);
+ // ASSERT(layoutState->m_renderer == this);
LayoutSize offsetDelta = layoutState->m_layoutOffset - layoutState->m_pageOffset;
return isHorizontalWritingMode() ? offsetDelta.height() : offsetDelta.width();
@@ -7967,9 +7932,6 @@ void RenderBlock::createFloatingObjects()
inline void RenderBlock::FloatingObjects::clear()
{
- // FIXME: This should call deleteAllValues, except RenderBlock::clearFloats
- // like to play fast and loose with ownership of these pointers.
- // If we move to OwnPtr that will fix this ownership oddness.
m_set.clear();
m_placedFloatsTree.clear();
m_leftObjectsCount = 0;
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderBlock.h b/chromium/third_party/WebKit/Source/core/rendering/RenderBlock.h
index f124d9dac70..06300e892bb 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderBlock.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderBlock.h
@@ -455,7 +455,6 @@ public:
}
ShapeInsideInfo* layoutShapeInsideInfo() const;
bool allowsShapeInsideInfoSharing() const { return !isInline() && !isFloating(); }
- virtual void imageChanged(WrappedImagePtr, const IntRect* = 0) OVERRIDE;
protected:
virtual void willBeDestroyed();
@@ -655,7 +654,7 @@ private:
bool everHadLayout;
};
- class FloatingObject {
+ struct FloatingObject {
WTF_MAKE_NONCOPYABLE(FloatingObject); WTF_MAKE_FAST_ALLOCATED;
public:
// Note that Type uses bits so you can use FloatLeftRight as a mask to query for both left and right.
@@ -712,12 +711,12 @@ private:
bool isPlaced() const { return m_isPlaced; }
void setIsPlaced(bool placed = true) { m_isPlaced = placed; }
- LayoutUnit x() const { ASSERT(isPlaced()); return m_frameRect.x(); }
- LayoutUnit maxX() const { ASSERT(isPlaced()); return m_frameRect.maxX(); }
- LayoutUnit y() const { ASSERT(isPlaced()); return m_frameRect.y(); }
- LayoutUnit maxY() const { ASSERT(isPlaced()); return m_frameRect.maxY(); }
- LayoutUnit width() const { return m_frameRect.width(); }
- LayoutUnit height() const { return m_frameRect.height(); }
+ inline LayoutUnit x() const { ASSERT(isPlaced()); return m_frameRect.x(); }
+ inline LayoutUnit maxX() const { ASSERT(isPlaced()); return m_frameRect.maxX(); }
+ inline LayoutUnit y() const { ASSERT(isPlaced()); return m_frameRect.y(); }
+ inline LayoutUnit maxY() const { ASSERT(isPlaced()); return m_frameRect.maxY(); }
+ inline LayoutUnit width() const { return m_frameRect.width(); }
+ inline LayoutUnit height() const { return m_frameRect.height(); }
void setX(LayoutUnit x) { ASSERT(!isInPlacedTree()); m_frameRect.setX(x); }
void setY(LayoutUnit y) { ASSERT(!isInPlacedTree()); m_frameRect.setY(y); }
@@ -727,9 +726,6 @@ private:
const LayoutRect& frameRect() const { ASSERT(isPlaced()); return m_frameRect; }
void setFrameRect(const LayoutRect& frameRect) { ASSERT(!isInPlacedTree()); m_frameRect = frameRect; }
- int paginationStrut() const { return m_paginationStrut; }
- void setPaginationStrut(int strut) { m_paginationStrut = strut; }
-
#ifndef NDEBUG
bool isInPlacedTree() const { return m_isInPlacedTree; }
void setIsInPlacedTree(bool value) { m_isInPlacedTree = value; }
@@ -740,57 +736,12 @@ private:
bool isDescendant() const { return m_isDescendant; }
void setIsDescendant(bool isDescendant) { m_isDescendant = isDescendant; }
- // FIXME: Callers of these methods are dangerous and should be whitelisted explicitly or removed.
- void setRenderer(RenderBox* renderer) { m_renderer = renderer; }
- RootInlineBox* originatingLine() const { return m_originatingLine; }
- void setOriginatingLine(RootInlineBox* line) { m_originatingLine = line; }
-
- LayoutUnit logicalTop(bool isHorizontalWritingMode) const { return isHorizontalWritingMode ? y() : x(); }
- LayoutUnit logicalBottom(bool isHorizontalWritingMode) const { return isHorizontalWritingMode ? maxY() : maxX(); }
- LayoutUnit logicalLeft(bool isHorizontalWritingMode) const { return isHorizontalWritingMode ? x() : y(); }
- LayoutUnit logicalRight(bool isHorizontalWritingMode) const { return isHorizontalWritingMode ? maxX() : maxY(); }
- LayoutUnit logicalWidth(bool isHorizontalWritingMode) const { return isHorizontalWritingMode ? width() : height(); }
-
- int pixelSnappedLogicalTop(bool isHorizontalWritingMode) const { return isHorizontalWritingMode ? frameRect().pixelSnappedY() : frameRect().pixelSnappedX(); }
- int pixelSnappedLogicalBottom(bool isHorizontalWritingMode) const { return isHorizontalWritingMode ? frameRect().pixelSnappedMaxY() : frameRect().pixelSnappedMaxX(); }
- int pixelSnappedLogicalLeft(bool isHorizontalWritingMode) const { return isHorizontalWritingMode ? frameRect().pixelSnappedX() : frameRect().pixelSnappedY(); }
- int pixelSnappedLogicalRight(bool isHorizontalWritingMode) const { return isHorizontalWritingMode ? frameRect().pixelSnappedMaxX() : frameRect().pixelSnappedMaxY(); }
-
- void setLogicalTop(LayoutUnit logicalTop, bool isHorizontalWritingMode)
- {
- if (isHorizontalWritingMode)
- setY(logicalTop);
- else
- setX(logicalTop);
- }
- void setLogicalLeft(LayoutUnit logicalLeft, bool isHorizontalWritingMode)
- {
- if (isHorizontalWritingMode)
- setX(logicalLeft);
- else
- setY(logicalLeft);
- }
- void setLogicalHeight(LayoutUnit logicalHeight, bool isHorizontalWritingMode)
- {
- if (isHorizontalWritingMode)
- setHeight(logicalHeight);
- else
- setWidth(logicalHeight);
- }
- void setLogicalWidth(LayoutUnit logicalWidth, bool isHorizontalWritingMode)
- {
- if (isHorizontalWritingMode)
- setWidth(logicalWidth);
- else
- setHeight(logicalWidth);
- }
-
- private:
RenderBox* m_renderer;
RootInlineBox* m_originatingLine;
LayoutRect m_frameRect;
- int m_paginationStrut; // FIXME: Is this class size-sensitive? Does this need 32-bits?
+ int m_paginationStrut;
+ private:
unsigned m_type : 2; // Type (left or right aligned)
unsigned m_shouldPaint : 1;
unsigned m_isDescendant : 1;
@@ -802,6 +753,46 @@ private:
LayoutPoint flipFloatForWritingModeForChild(const FloatingObject*, const LayoutPoint&) const;
+ LayoutUnit logicalTopForFloat(const FloatingObject* child) const { return isHorizontalWritingMode() ? child->y() : child->x(); }
+ LayoutUnit logicalBottomForFloat(const FloatingObject* child) const { return isHorizontalWritingMode() ? child->maxY() : child->maxX(); }
+ LayoutUnit logicalLeftForFloat(const FloatingObject* child) const { return isHorizontalWritingMode() ? child->x() : child->y(); }
+ LayoutUnit logicalRightForFloat(const FloatingObject* child) const { return isHorizontalWritingMode() ? child->maxX() : child->maxY(); }
+ LayoutUnit logicalWidthForFloat(const FloatingObject* child) const { return isHorizontalWritingMode() ? child->width() : child->height(); }
+
+ int pixelSnappedLogicalTopForFloat(const FloatingObject* child) const { return isHorizontalWritingMode() ? child->frameRect().pixelSnappedY() : child->frameRect().pixelSnappedX(); }
+ int pixelSnappedLogicalBottomForFloat(const FloatingObject* child) const { return isHorizontalWritingMode() ? child->frameRect().pixelSnappedMaxY() : child->frameRect().pixelSnappedMaxX(); }
+ int pixelSnappedLogicalLeftForFloat(const FloatingObject* child) const { return isHorizontalWritingMode() ? child->frameRect().pixelSnappedX() : child->frameRect().pixelSnappedY(); }
+ int pixelSnappedLogicalRightForFloat(const FloatingObject* child) const { return isHorizontalWritingMode() ? child->frameRect().pixelSnappedMaxX() : child->frameRect().pixelSnappedMaxY(); }
+
+ void setLogicalTopForFloat(FloatingObject* child, LayoutUnit logicalTop)
+ {
+ if (isHorizontalWritingMode())
+ child->setY(logicalTop);
+ else
+ child->setX(logicalTop);
+ }
+ void setLogicalLeftForFloat(FloatingObject* child, LayoutUnit logicalLeft)
+ {
+ if (isHorizontalWritingMode())
+ child->setX(logicalLeft);
+ else
+ child->setY(logicalLeft);
+ }
+ void setLogicalHeightForFloat(FloatingObject* child, LayoutUnit logicalHeight)
+ {
+ if (isHorizontalWritingMode())
+ child->setHeight(logicalHeight);
+ else
+ child->setWidth(logicalHeight);
+ }
+ void setLogicalWidthForFloat(FloatingObject* child, LayoutUnit logicalWidth)
+ {
+ if (isHorizontalWritingMode())
+ child->setWidth(logicalWidth);
+ else
+ child->setHeight(logicalWidth);
+ }
+
LayoutUnit xPositionForFloatIncludingMargin(const FloatingObject* child) const
{
if (isHorizontalWritingMode())
@@ -1158,13 +1149,13 @@ public:
protected:
struct FloatingObjectHashFunctions {
- static unsigned hash(FloatingObject* key) { return DefaultHash<RenderBox*>::Hash::hash(key->renderer()); }
- static bool equal(FloatingObject* a, FloatingObject* b) { return a->renderer() == b->renderer(); }
+ static unsigned hash(FloatingObject* key) { return DefaultHash<RenderBox*>::Hash::hash(key->m_renderer); }
+ static bool equal(FloatingObject* a, FloatingObject* b) { return a->m_renderer == b->m_renderer; }
static const bool safeToCompareToEmptyOrDeleted = true;
};
struct FloatingObjectHashTranslator {
static unsigned hash(RenderBox* key) { return DefaultHash<RenderBox*>::Hash::hash(key); }
- static bool equal(FloatingObject* a, RenderBox* b) { return a->renderer() == b; }
+ static bool equal(FloatingObject* a, RenderBox* b) { return a->m_renderer == b; }
};
typedef ListHashSet<FloatingObject*, 4, FloatingObjectHashFunctions> FloatingObjectSet;
typedef FloatingObjectSet::const_iterator FloatingObjectSetIterator;
@@ -1173,39 +1164,46 @@ protected:
typedef PODFreeListArena<PODRedBlackTree<FloatingObjectInterval>::Node> IntervalArena;
template <FloatingObject::Type FloatTypeValue>
- class ComputeFloatOffsetAdapter {
+ class FloatIntervalSearchAdapter {
public:
typedef FloatingObjectInterval IntervalType;
- ComputeFloatOffsetAdapter(const RenderBlock* renderer, int lineTop, int lineBottom, LayoutUnit& offset)
+ FloatIntervalSearchAdapter(const RenderBlock* renderer, int lowValue, int highValue, LayoutUnit& offset, LayoutUnit* heightRemaining)
: m_renderer(renderer)
- , m_lineTop(lineTop)
- , m_lineBottom(lineBottom)
+ , m_lowValue(lowValue)
+ , m_highValue(highValue)
, m_offset(offset)
- , m_outermostFloat(0)
+ , m_heightRemaining(heightRemaining)
+ , m_last(0)
{
}
- inline int lowValue() const { return m_lineTop; }
- inline int highValue() const { return m_lineBottom; }
- void collectIfNeeded(const IntervalType&);
+ inline int lowValue() const { return m_lowValue; }
+ inline int highValue() const { return m_highValue; }
+ void collectIfNeeded(const IntervalType&) const;
// When computing the offset caused by the floats on a given line, if
// the outermost float on that line has a shape-outside, the inline
// content that butts up against that float must be positioned using
// the contours of the shape, not the margin box of the float.
- const FloatingObject* outermostFloat() const { return m_outermostFloat; }
-
- LayoutUnit getHeightRemaining() const;
+ // We save the last float encountered so that the offset can be
+ // computed correctly by the code using this adapter.
+ const FloatingObject* lastFloat() const { return m_last; }
private:
- bool updateOffsetIfNeeded(const FloatingObject*);
+ bool updateOffsetIfNeeded(const FloatingObject*) const;
const RenderBlock* m_renderer;
- int m_lineTop;
- int m_lineBottom;
+ int m_lowValue;
+ int m_highValue;
LayoutUnit& m_offset;
- const FloatingObject* m_outermostFloat;
+ LayoutUnit* m_heightRemaining;
+ // This member variable is mutable because the collectIfNeeded method
+ // is declared as const, even though it doesn't actually respect that
+ // contract. It modifies other member variables via loopholes in the
+ // const behavior. Instead of using loopholes, I decided it was better
+ // to make the fact that this is modified in a const method explicit.
+ mutable const FloatingObject* m_last;
};
void createFloatingObjects();
@@ -1215,8 +1213,6 @@ public:
class FloatingObjects {
WTF_MAKE_NONCOPYABLE(FloatingObjects); WTF_MAKE_FAST_ALLOCATED;
public:
- ~FloatingObjects();
-
void clear();
void add(FloatingObject*);
void remove(FloatingObject*);
@@ -1232,7 +1228,6 @@ public:
computePlacedFloatsTreeIfNeeded();
return m_placedFloatsTree;
}
- void clearLineBoxTreePointers();
private:
FloatingObjects(const RenderBlock*, bool horizontalWritingMode);
void computePlacedFloatsTree();
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderBlockLineLayout.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderBlockLineLayout.cpp
index cbe77432e6a..f16fcb63493 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderBlockLineLayout.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderBlockLineLayout.cpp
@@ -161,7 +161,7 @@ inline void LineWidth::updateAvailableWidth(LayoutUnit replacedHeight)
inline void LineWidth::shrinkAvailableWidthForNewFloatIfNeeded(RenderBlock::FloatingObject* newFloat)
{
LayoutUnit height = m_block->logicalHeight();
- if (height < newFloat->logicalTop(m_block->isHorizontalWritingMode()) || height >= newFloat->logicalBottom(m_block->isHorizontalWritingMode()))
+ if (height < m_block->logicalTopForFloat(newFloat) || height >= m_block->logicalBottomForFloat(newFloat))
return;
// When floats with shape outside are stacked, the floats are positioned based on the margin box of the float,
@@ -179,7 +179,7 @@ inline void LineWidth::shrinkAvailableWidthForNewFloatIfNeeded(RenderBlock::Floa
if (previousFloat != newFloat && previousFloat->type() == newFloat->type()) {
previousShapeOutsideInfo = previousFloat->renderer()->shapeOutsideInfo();
if (previousShapeOutsideInfo) {
- previousShapeOutsideInfo->computeSegmentsForContainingBlockLine(m_block->logicalHeight(), previousFloat->logicalTop(m_block->isHorizontalWritingMode()), logicalHeightForLine(m_block, m_isFirstLine));
+ previousShapeOutsideInfo->computeSegmentsForContainingBlockLine(m_block->logicalHeight(), m_block->logicalTopForFloat(previousFloat), logicalHeightForLine(m_block, m_isFirstLine));
}
break;
}
@@ -187,10 +187,10 @@ inline void LineWidth::shrinkAvailableWidthForNewFloatIfNeeded(RenderBlock::Floa
ShapeOutsideInfo* shapeOutsideInfo = newFloat->renderer()->shapeOutsideInfo();
if (shapeOutsideInfo)
- shapeOutsideInfo->computeSegmentsForContainingBlockLine(m_block->logicalHeight(), newFloat->logicalTop(m_block->isHorizontalWritingMode()), logicalHeightForLine(m_block, m_isFirstLine));
+ shapeOutsideInfo->computeSegmentsForContainingBlockLine(m_block->logicalHeight(), m_block->logicalTopForFloat(newFloat), logicalHeightForLine(m_block, m_isFirstLine));
if (newFloat->type() == RenderBlock::FloatingObject::FloatLeft) {
- float newLeft = newFloat->logicalRight(m_block->isHorizontalWritingMode());
+ float newLeft = m_block->logicalRightForFloat(newFloat);
if (previousShapeOutsideInfo)
newLeft -= previousShapeOutsideInfo->rightSegmentMarginBoxDelta();
if (shapeOutsideInfo)
@@ -200,7 +200,7 @@ inline void LineWidth::shrinkAvailableWidthForNewFloatIfNeeded(RenderBlock::Floa
newLeft += floorToInt(m_block->textIndentOffset());
m_left = max<float>(m_left, newLeft);
} else {
- float newRight = newFloat->logicalLeft(m_block->isHorizontalWritingMode());
+ float newRight = m_block->logicalLeftForFloat(newFloat);
if (previousShapeOutsideInfo)
newRight -= previousShapeOutsideInfo->leftSegmentMarginBoxDelta();
if (shapeOutsideInfo)
@@ -1226,8 +1226,8 @@ inline BidiRun* RenderBlock::handleTrailingSpaces(BidiRunList<BidiRun>& bidiRuns
void RenderBlock::appendFloatingObjectToLastLine(FloatingObject* floatingObject)
{
- ASSERT(!floatingObject->originatingLine());
- floatingObject->setOriginatingLine(lastRootBox());
+ ASSERT(!floatingObject->m_originatingLine);
+ floatingObject->m_originatingLine = lastRootBox();
lastRootBox()->appendFloat(floatingObject->renderer());
}
@@ -1881,7 +1881,7 @@ void RenderBlock::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, Inlin
for (; it != end; ++it) {
FloatingObject* f = *it;
appendFloatingObjectToLastLine(f);
- ASSERT(f->renderer() == layoutState.floats()[layoutState.floatIndex()].object);
+ ASSERT(f->m_renderer == layoutState.floats()[layoutState.floatIndex()].object);
// If a float's geometry has changed, give up on syncing with clean lines.
if (layoutState.floats()[layoutState.floatIndex()].rect != f->frameRect())
checkForEndLineMatch = false;
@@ -1975,8 +1975,8 @@ void RenderBlock::linkToEndLineIfNeeded(LineLayoutState& layoutState)
Vector<RenderBox*>::iterator end = cleanLineFloats->end();
for (Vector<RenderBox*>::iterator f = cleanLineFloats->begin(); f != end; ++f) {
FloatingObject* floatingObject = insertFloatingObject(*f);
- ASSERT(!floatingObject->originatingLine());
- floatingObject->setOriginatingLine(line);
+ ASSERT(!floatingObject->m_originatingLine);
+ floatingObject->m_originatingLine = line;
setLogicalHeight(logicalTopForChild(*f) - marginBeforeForChild(*f) + delta);
positionNewFloats();
}
@@ -2266,8 +2266,8 @@ RootInlineBox* RenderBlock::determineStartPosition(LineLayoutState& layoutState,
Vector<RenderBox*>::iterator end = cleanLineFloats->end();
for (Vector<RenderBox*>::iterator f = cleanLineFloats->begin(); f != end; ++f) {
FloatingObject* floatingObject = insertFloatingObject(*f);
- ASSERT(!floatingObject->originatingLine());
- floatingObject->setOriginatingLine(line);
+ ASSERT(!floatingObject->m_originatingLine);
+ floatingObject->m_originatingLine = line;
setLogicalHeight(logicalTopForChild(*f) - marginBeforeForChild(*f));
positionNewFloats();
ASSERT(layoutState.floats()[numCleanFloats].object == *f);
@@ -2374,7 +2374,7 @@ bool RenderBlock::checkPaginationAndFloatsAtEndLine(LineLayoutState& layoutState
FloatingObjectSetIterator end = floatingObjectSet.end();
for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
FloatingObject* f = *it;
- if (f->logicalBottom(isHorizontalWritingMode()) >= logicalTop && f->logicalBottom(isHorizontalWritingMode()) < logicalBottom)
+ if (logicalBottomForFloat(f) >= logicalTop && logicalBottomForFloat(f) < logicalBottom)
return false;
}
@@ -2832,7 +2832,7 @@ InlineIterator RenderBlock::LineBreaker::nextSegmentBreak(InlineBidiResolver& re
// If it does, position it now, otherwise, position
// it after moving to next line (in newLine() func)
// FIXME: Bug 110372: Properly position multiple stacked floats with non-rectangular shape outside.
- if (floatsFitOnLine && width.fitsOnLine(f->logicalWidth(m_block->isHorizontalWritingMode()))) {
+ if (floatsFitOnLine && width.fitsOnLine(m_block->logicalWidthForFloat(f))) {
m_block->positionNewFloatOnLine(f, lastFloatFromPreviousLine, lineInfo, width);
if (lBreak.m_obj == current.m_obj) {
ASSERT(!lBreak.m_pos);
@@ -3401,14 +3401,14 @@ bool RenderBlock::positionNewFloatOnLine(FloatingObject* newFloat, FloatingObjec
// We only connect floats to lines for pagination purposes if the floats occur at the start of
// the line and the previous line had a hard break (so this line is either the first in the block
// or follows a <br>).
- if (!newFloat->paginationStrut() || !lineInfo.previousLineBrokeCleanly() || !lineInfo.isEmpty())
+ if (!newFloat->m_paginationStrut || !lineInfo.previousLineBrokeCleanly() || !lineInfo.isEmpty())
return true;
const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
ASSERT(floatingObjectSet.last() == newFloat);
- LayoutUnit floatLogicalTop = newFloat->logicalTop(isHorizontalWritingMode());
- int paginationStrut = newFloat->paginationStrut();
+ LayoutUnit floatLogicalTop = logicalTopForFloat(newFloat);
+ int paginationStrut = newFloat->m_paginationStrut;
if (floatLogicalTop - paginationStrut != logicalHeight() + lineInfo.floatPaginationStrut())
return true;
@@ -3421,18 +3421,18 @@ bool RenderBlock::positionNewFloatOnLine(FloatingObject* newFloat, FloatingObjec
FloatingObject* f = *it;
if (f == lastFloatFromPreviousLine)
break;
- if (f->logicalTop(isHorizontalWritingMode()) == logicalHeight() + lineInfo.floatPaginationStrut()) {
- f->setPaginationStrut(paginationStrut + f->paginationStrut());
- RenderBox* o = f->renderer();
+ if (logicalTopForFloat(f) == logicalHeight() + lineInfo.floatPaginationStrut()) {
+ f->m_paginationStrut += paginationStrut;
+ RenderBox* o = f->m_renderer;
setLogicalTopForChild(o, logicalTopForChild(o) + marginBeforeForChild(o) + paginationStrut);
if (o->isRenderBlock())
toRenderBlock(o)->setChildNeedsLayout(MarkOnlyThis);
o->layoutIfNeeded();
// Save the old logical top before calling removePlacedObject which will set
// isPlaced to false. Otherwise it will trigger an assert in logicalTopForFloat.
- LayoutUnit oldLogicalTop = f->logicalTop(isHorizontalWritingMode());
+ LayoutUnit oldLogicalTop = logicalTopForFloat(f);
m_floatingObjects->removePlacedObject(f);
- f->setLogicalTop(oldLogicalTop + paginationStrut, isHorizontalWritingMode());
+ setLogicalTopForFloat(f, oldLogicalTop + paginationStrut);
m_floatingObjects->addPlacedObject(f);
}
}
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderBox.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderBox.cpp
index 73e76a60597..bb53fd51cde 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderBox.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderBox.cpp
@@ -808,8 +808,6 @@ IntSize RenderBox::calculateAutoscrollDirection(const IntPoint& windowPoint) con
IntSize offset;
IntPoint point = frameView->windowToContents(windowPoint);
IntRect box(absoluteBoundingBoxRect());
- if (isRenderView())
- box.moveBy(frameView->windowToContents(IntPoint()));
if (point.x() < box.x() + autoscrollBeltSize)
point.move(-autoscrollBeltSize, 0);
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderGrid.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderGrid.cpp
index 0a753c1dea0..9d0d58990de 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderGrid.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderGrid.cpp
@@ -595,9 +595,6 @@ void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDire
tracks.append(&track);
}
- if (tracks.isEmpty())
- return;
-
LayoutUnit additionalBreadthSpace = (this->*sizingFunction)(gridItem, direction, columnTracks);
for (size_t trackIndexForSpace = initialTrackIndex; trackIndexForSpace <= finalTrackIndex; ++trackIndexForSpace) {
GridTrack& track = (direction == ForColumns) ? columnTracks[trackIndexForSpace] : rowTracks[trackIndexForSpace];
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderImage.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderImage.cpp
index f9be3be4de0..ce48656440e 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderImage.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderImage.cpp
@@ -30,11 +30,11 @@
#include "HTMLNames.h"
#include "core/editing/FrameSelection.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLAreaElement.h"
#include "core/html/HTMLImageElement.h"
#include "core/html/HTMLInputElement.h"
#include "core/html/HTMLMapElement.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/Frame.h"
#include "core/page/Page.h"
#include "core/platform/graphics/Font.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderImageResource.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderImageResource.cpp
index 61301870230..4a38fdd251d 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderImageResource.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderImageResource.cpp
@@ -28,7 +28,7 @@
#include "config.h"
#include "core/rendering/RenderImageResource.h"
-#include "core/fetch/ImageResource.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/platform/graphics/Image.h"
#include "core/rendering/RenderObject.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderImageResource.h b/chromium/third_party/WebKit/Source/core/rendering/RenderImageResource.h
index 6cffb71841d..d222111e4d2 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderImageResource.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderImageResource.h
@@ -26,8 +26,8 @@
#ifndef RenderImageResource_h
#define RenderImageResource_h
-#include "core/fetch/ImageResource.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ImageResource.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/graphics/Image.h"
#include "core/platform/graphics/LayoutSize.h"
#include "core/rendering/style/StyleImage.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderImageResourceStyleImage.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderImageResourceStyleImage.cpp
index 9c3b03e8062..ec9023582a4 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderImageResourceStyleImage.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderImageResourceStyleImage.cpp
@@ -28,7 +28,7 @@
#include "config.h"
#include "core/rendering/RenderImageResourceStyleImage.h"
-#include "core/fetch/ImageResource.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/rendering/RenderObject.h"
#include "core/rendering/style/StyleFetchedImage.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderLayerBacking.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderLayerBacking.cpp
index 282e6e0568d..c8991f2d933 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderLayerBacking.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderLayerBacking.cpp
@@ -30,11 +30,11 @@
#include "CSSPropertyNames.h"
#include "HTMLNames.h"
#include "RuntimeEnabledFeatures.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/HTMLIFrameElement.h"
#include "core/html/HTMLMediaElement.h"
#include "core/html/canvas/CanvasRenderingContext.h"
#include "core/inspector/InspectorInstrumentation.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/Chrome.h"
#include "core/page/FrameView.h"
#include "core/page/Settings.h"
@@ -1708,7 +1708,7 @@ bool RenderLayerBacking::startAnimation(double timeOffset, const CSSAnimationDat
for (size_t i = 0; i < numKeyframes; ++i) {
const KeyframeValue& currentKeyframe = keyframes[i];
const RenderStyle* keyframeStyle = currentKeyframe.style();
- double key = currentKeyframe.key();
+ float key = currentKeyframe.key();
if (!keyframeStyle)
continue;
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderLayerFilterInfo.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderLayerFilterInfo.cpp
index 8a6b4e39b14..abad09d6e25 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderLayerFilterInfo.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderLayerFilterInfo.cpp
@@ -31,8 +31,8 @@
#include "core/rendering/RenderLayerFilterInfo.h"
-#include "core/fetch/DocumentResource.h"
-#include "core/fetch/DocumentResourceReference.h"
+#include "core/loader/cache/DocumentResource.h"
+#include "core/loader/cache/DocumentResourceReference.h"
#include "core/platform/graphics/filters/custom/CustomFilterOperation.h"
#include "core/platform/graphics/filters/custom/CustomFilterProgram.h"
#include "core/rendering/FilterEffectRenderer.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderLayerFilterInfo.h b/chromium/third_party/WebKit/Source/core/rendering/RenderLayerFilterInfo.h
index 4e44b3f2f7a..ad29a02d9e2 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderLayerFilterInfo.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderLayerFilterInfo.h
@@ -31,7 +31,7 @@
#define RenderLayerFilterInfo_h
#include "core/dom/Element.h"
-#include "core/fetch/DocumentResource.h"
+#include "core/loader/cache/DocumentResource.h"
#include "core/platform/graphics/LayoutRect.h"
#include "core/platform/graphics/filters/FilterOperation.h"
#include "core/platform/graphics/filters/custom/CustomFilterProgramClient.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderListMarker.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderListMarker.cpp
index c2dea3be02e..d63728e4514 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderListMarker.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderListMarker.cpp
@@ -26,7 +26,7 @@
#include "core/rendering/RenderListMarker.h"
#include "core/dom/Document.h"
-#include "core/fetch/ImageResource.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/platform/graphics/Font.h"
#include "core/platform/graphics/GraphicsContextStateSaver.h"
#include "core/rendering/RenderLayer.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderObject.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderObject.cpp
index 1e4bafeefd2..58bbf327ced 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderObject.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderObject.cpp
@@ -673,11 +673,10 @@ static inline bool objectIsRelayoutBoundary(const RenderObject* object)
return true;
}
-void RenderObject::markContainingBlocksForLayout(bool scheduleRelayout, RenderObject* newRoot, SubtreeLayoutScope* layouter)
+void RenderObject::markContainingBlocksForLayout(bool scheduleRelayout, RenderObject* newRoot)
{
ASSERT(!scheduleRelayout || !newRoot);
ASSERT(!isSetNeedsLayoutForbidden());
- ASSERT(!layouter || this != layouter->root());
RenderObject* object = container();
RenderObject* last = this;
@@ -723,12 +722,6 @@ void RenderObject::markContainingBlocksForLayout(bool scheduleRelayout, RenderOb
ASSERT(!object->isSetNeedsLayoutForbidden());
}
- if (layouter) {
- layouter->addRendererToLayout(object);
- if (object == layouter->root())
- return;
- }
-
if (object == newRoot)
return;
@@ -1128,7 +1121,7 @@ void RenderObject::drawLineForBoxSide(GraphicsContext* graphicsContext, int x1,
void RenderObject::paintFocusRing(PaintInfo& paintInfo, const LayoutPoint& paintOffset, RenderStyle* style)
{
Vector<IntRect> focusRingRects;
- addFocusRingRects(focusRingRects, paintOffset, paintInfo.paintContainer());
+ addFocusRingRects(focusRingRects, paintOffset, paintInfo.paintContainer);
if (style->outlineStyleIsAuto())
paintInfo.context->drawFocusRing(focusRingRects, style->outlineWidth(), style->outlineOffset(), resolveColor(style, CSSPropertyOutlineColor));
else
@@ -1871,8 +1864,6 @@ void RenderObject::setStyle(PassRefPtr<RenderStyle> style)
updateImage(oldStyle ? oldStyle->borderImage().image() : 0, m_style ? m_style->borderImage().image() : 0);
updateImage(oldStyle ? oldStyle->maskBoxImage().image() : 0, m_style ? m_style->maskBoxImage().image() : 0);
- updateShapeImage(oldStyle ? oldStyle->shapeInside() : 0, m_style ? m_style->shapeInside() : 0);
-
// We need to ensure that view->maximalOutlineSize() is valid for any repaints that happen
// during styleDidChange (it's used by clippedOverflowRectForRepaint()).
if (m_style->outlineWidth() > 0 && m_style->outlineSize() > maximalOutlineSize(PaintPhaseOutline))
@@ -2114,12 +2105,6 @@ void RenderObject::updateImage(StyleImage* oldImage, StyleImage* newImage)
}
}
-void RenderObject::updateShapeImage(const ShapeValue* oldShapeValue, const ShapeValue* newShapeValue)
-{
- if (oldShapeValue || newShapeValue)
- updateImage(oldShapeValue ? oldShapeValue->image() : 0, newShapeValue ? newShapeValue->image() : 0);
-}
-
LayoutRect RenderObject::viewRect() const
{
return view()->viewRect();
@@ -2671,14 +2656,6 @@ void RenderObject::destroyAndCleanupAnonymousWrappers()
// WARNING: |this| is deleted here.
}
-void RenderObject::removeShapeImageClient(ShapeValue* shapeValue)
-{
- if (!shapeValue)
- return;
- if (StyleImage* shapeImage = shapeValue->image())
- shapeImage->removeClient(this);
-}
-
void RenderObject::destroy()
{
willBeDestroyed();
@@ -2704,8 +2681,6 @@ void RenderObject::postDestroy()
if (StyleImage* maskBoxImage = m_style->maskBoxImage().image())
maskBoxImage->removeClient(this);
-
- removeShapeImageClient(m_style->shapeInside());
}
delete this;
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderObject.h b/chromium/third_party/WebKit/Source/core/rendering/RenderObject.h
index 451e9587e61..4d34112f885 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderObject.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderObject.h
@@ -29,14 +29,13 @@
#include "core/dom/DocumentStyleSheetCollection.h"
#include "core/dom/Element.h"
#include "core/dom/Position.h"
-#include "core/fetch/ImageResourceClient.h"
+#include "core/loader/cache/ImageResourceClient.h"
#include "core/platform/graphics/FloatQuad.h"
#include "core/platform/graphics/LayoutRect.h"
#include "core/platform/graphics/transforms/TransformationMatrix.h"
#include "core/rendering/PaintPhase.h"
#include "core/rendering/RenderObjectChildList.h"
#include "core/rendering/ScrollBehavior.h"
-#include "core/rendering/SubtreeLayoutScope.h"
#include "core/rendering/style/RenderStyle.h"
#include "core/rendering/style/StyleInheritedData.h"
#include "wtf/HashSet.h"
@@ -622,10 +621,10 @@ public:
Element* offsetParent() const;
- void markContainingBlocksForLayout(bool scheduleRelayout = true, RenderObject* newRoot = 0, SubtreeLayoutScope* = 0);
- void setNeedsLayout(MarkingBehavior = MarkContainingBlockChain, SubtreeLayoutScope* = 0);
+ void markContainingBlocksForLayout(bool scheduleRelayout = true, RenderObject* newRoot = 0);
+ void setNeedsLayout(MarkingBehavior = MarkContainingBlockChain);
void clearNeedsLayout();
- void setChildNeedsLayout(MarkingBehavior = MarkContainingBlockChain, SubtreeLayoutScope* = 0);
+ void setChildNeedsLayout(MarkingBehavior = MarkContainingBlockChain);
void setNeedsPositionedMovementLayout();
void setNeedsSimplifiedNormalFlowLayout();
void setPreferredLogicalWidthsDirty(bool, MarkingBehavior = MarkContainingBlockChain);
@@ -664,7 +663,6 @@ public:
void updateFillImages(const FillLayer*, const FillLayer*);
void updateImage(StyleImage*, StyleImage*);
- void updateShapeImage(const ShapeValue*, const ShapeValue*);
virtual void paint(PaintInfo&, const LayoutPoint&);
@@ -1072,8 +1070,6 @@ private:
return styleColor;
}
- void removeShapeImageClient(ShapeValue*);
-
#ifndef NDEBUG
void checkBlockPositionedObjectsNeedLayout();
#endif
@@ -1244,14 +1240,14 @@ inline bool RenderObject::isBeforeOrAfterContent() const
return isBeforeContent() || isAfterContent();
}
-inline void RenderObject::setNeedsLayout(MarkingBehavior markParents, SubtreeLayoutScope* layouter)
+inline void RenderObject::setNeedsLayout(MarkingBehavior markParents)
{
ASSERT(!isSetNeedsLayoutForbidden());
bool alreadyNeededLayout = m_bitfields.needsLayout();
m_bitfields.setNeedsLayout(true);
if (!alreadyNeededLayout) {
- if (markParents == MarkContainingBlockChain && (!layouter || layouter->root() != this))
- markContainingBlocksForLayout(true, 0, layouter);
+ if (markParents == MarkContainingBlockChain)
+ markContainingBlocksForLayout();
if (hasLayer())
setLayerNeedsFullRepaint();
}
@@ -1271,14 +1267,13 @@ inline void RenderObject::clearNeedsLayout()
#endif
}
-inline void RenderObject::setChildNeedsLayout(MarkingBehavior markParents, SubtreeLayoutScope* layouter)
+inline void RenderObject::setChildNeedsLayout(MarkingBehavior markParents)
{
ASSERT(!isSetNeedsLayoutForbidden());
bool alreadyNeededLayout = normalChildNeedsLayout();
setNormalChildNeedsLayout(true);
- // FIXME: Replace MarkOnlyThis with the SubtreeLayoutScope code path and remove the MarkingBehavior argument entirely.
- if (!alreadyNeededLayout && markParents == MarkContainingBlockChain && (!layouter || layouter->root() != this))
- markContainingBlocksForLayout(true, 0, layouter);
+ if (!alreadyNeededLayout && markParents == MarkContainingBlockChain)
+ markContainingBlocksForLayout();
}
inline void RenderObject::setNeedsPositionedMovementLayout()
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderSearchField.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderSearchField.cpp
index ab322b8902a..4e4244c7b7f 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderSearchField.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderSearchField.cpp
@@ -24,7 +24,6 @@
#include "config.h"
#include "core/rendering/RenderSearchField.h"
-#include "core/dom/shadow/ShadowRoot.h"
#include "core/html/HTMLInputElement.h"
#include "core/html/shadow/ShadowElementNames.h"
@@ -48,12 +47,12 @@ RenderSearchField::~RenderSearchField()
inline Element* RenderSearchField::searchDecorationElement() const
{
- return inputElement()->userAgentShadowRoot()->getElementById(ShadowElementNames::searchDecoration());
+ return inputElement()->uaShadowElementById(ShadowElementNames::searchDecoration());
}
inline Element* RenderSearchField::cancelButtonElement() const
{
- return inputElement()->userAgentShadowRoot()->getElementById(ShadowElementNames::clearButton());
+ return inputElement()->uaShadowElementById(ShadowElementNames::clearButton());
}
LayoutUnit RenderSearchField::computeControlLogicalHeight(LayoutUnit lineHeight, LayoutUnit nonContentHeight) const
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderTable.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderTable.cpp
index 7ea9fa2f72d..12ea553e69d 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderTable.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderTable.cpp
@@ -40,7 +40,6 @@
#include "core/rendering/RenderTableCol.h"
#include "core/rendering/RenderTableSection.h"
#include "core/rendering/RenderView.h"
-#include "core/rendering/SubtreeLayoutScope.h"
#include "core/rendering/style/CollapsedBorderValue.h"
#include "core/rendering/style/StyleInheritedData.h"
@@ -423,11 +422,9 @@ void RenderTable::layout()
LayoutUnit oldLogicalWidth = logicalWidth();
updateLogicalWidth();
- SubtreeLayoutScope layouter(this);
-
if (logicalWidth() != oldLogicalWidth) {
for (unsigned i = 0; i < m_captions.size(); i++)
- layouter.setNeedsLayout(m_captions[i]);
+ m_captions[i]->setNeedsLayout(MarkOnlyThis);
}
// FIXME: The optimisation below doesn't work since the internal table
// layout could have changed. we need to add a flag to the table
@@ -447,7 +444,7 @@ void RenderTable::layout()
if (child->isTableSection()) {
RenderTableSection* section = toRenderTableSection(child);
if (m_columnLogicalWidthChanged)
- layouter.setChildNeedsLayout(section);
+ section->setChildNeedsLayout(MarkOnlyThis);
section->layoutIfNeeded();
totalSectionLogicalHeight += section->calcRowLogicalHeight();
if (collapsing)
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderTableCell.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderTableCell.cpp
index 25ae144ebb6..b67203d5d16 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderTableCell.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderTableCell.cpp
@@ -34,7 +34,6 @@
#include "core/rendering/PaintInfo.h"
#include "core/rendering/RenderTableCol.h"
#include "core/rendering/RenderView.h"
-#include "core/rendering/SubtreeLayoutScope.h"
#include "core/rendering/style/CollapsedBorderValue.h"
using namespace std;
@@ -163,7 +162,7 @@ void RenderTableCell::computePreferredLogicalWidths()
}
}
-void RenderTableCell::computeIntrinsicPadding(int rowHeight, SubtreeLayoutScope& layouter)
+void RenderTableCell::computeIntrinsicPadding(int rowHeight)
{
int oldIntrinsicPaddingBefore = intrinsicPaddingBefore();
int oldIntrinsicPaddingAfter = intrinsicPaddingAfter();
@@ -201,19 +200,20 @@ void RenderTableCell::computeIntrinsicPadding(int rowHeight, SubtreeLayoutScope&
// FIXME: Changing an intrinsic padding shouldn't trigger a relayout as it only shifts the cell inside the row but
// doesn't change the logical height.
if (intrinsicPaddingBefore != oldIntrinsicPaddingBefore || intrinsicPaddingAfter != oldIntrinsicPaddingAfter)
- layouter.setNeedsLayout(this);
+ setNeedsLayout(MarkOnlyThis);
}
void RenderTableCell::updateLogicalWidth()
{
}
-void RenderTableCell::setCellLogicalWidth(int tableLayoutLogicalWidth, SubtreeLayoutScope& layouter)
+void RenderTableCell::setCellLogicalWidth(int tableLayoutLogicalWidth)
{
if (tableLayoutLogicalWidth == logicalWidth())
return;
- layouter.setNeedsLayout(this);
+ setNeedsLayout(MarkOnlyThis);
+ row()->setChildNeedsLayout(MarkOnlyThis);
if (!table()->selfNeedsLayout() && checkForRepaintDuringLayout())
repaint();
@@ -224,8 +224,6 @@ void RenderTableCell::setCellLogicalWidth(int tableLayoutLogicalWidth, SubtreeLa
void RenderTableCell::layout()
{
- ASSERT(needsLayout());
-
StackStats::LayoutCheckPoint layoutCheckPoint;
updateFirstLetter();
@@ -239,8 +237,7 @@ void RenderTableCell::layout()
if (isBaselineAligned() && section()->rowBaseline(rowIndex()) && cellBaselinePosition() > section()->rowBaseline(rowIndex())) {
int newIntrinsicPaddingBefore = max<LayoutUnit>(0, intrinsicPaddingBefore() - max<LayoutUnit>(0, cellBaselinePosition() - oldCellBaseline));
setIntrinsicPaddingBefore(newIntrinsicPaddingBefore);
- SubtreeLayoutScope layouter(this);
- layouter.setNeedsLayout(this);
+ setNeedsLayout(MarkOnlyThis);
layoutBlock(cellWidthChanged());
}
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderTableCell.h b/chromium/third_party/WebKit/Source/core/rendering/RenderTableCell.h
index 9a0da52dfc8..14dac6000f4 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderTableCell.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderTableCell.h
@@ -35,8 +35,6 @@ static const unsigned maxColumnIndex = 0x1FFFFFFE; // 536,870,910
enum IncludeBorderColorOrNot { DoNotIncludeBorderColor, IncludeBorderColor };
-class SubtreeLayoutScope;
-
class RenderTableCell FINAL : public RenderBlock {
public:
explicit RenderTableCell(Element*);
@@ -105,7 +103,7 @@ public:
}
- void setCellLogicalWidth(int constrainedLogicalWidth, SubtreeLayoutScope&);
+ void setCellLogicalWidth(int constrainedLogicalWidth);
virtual int borderLeft() const;
virtual int borderRight() const;
@@ -133,7 +131,7 @@ public:
return va == BASELINE || va == TEXT_BOTTOM || va == TEXT_TOP || va == SUPER || va == SUB || va == LENGTH;
}
- void computeIntrinsicPadding(int rowHeight, SubtreeLayoutScope&);
+ void computeIntrinsicPadding(int rowHeight);
void clearIntrinsicPadding() { setIntrinsicPadding(0, 0); }
int intrinsicPaddingBefore() const { return m_intrinsicPaddingBefore; }
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderTableCol.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderTableCol.cpp
index 4831a49e1d6..ce0dd03491f 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderTableCol.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderTableCol.cpp
@@ -28,6 +28,7 @@
#include "HTMLNames.h"
#include "core/html/HTMLTableColElement.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/rendering/RenderTable.h"
#include "core/rendering/RenderTableCell.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderTableRow.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderTableRow.cpp
index dc1d16c8f0b..3fae9224901 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderTableRow.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderTableRow.cpp
@@ -27,12 +27,11 @@
#include "HTMLNames.h"
#include "core/dom/Document.h"
-#include "core/fetch/ImageResource.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/rendering/HitTestResult.h"
#include "core/rendering/PaintInfo.h"
#include "core/rendering/RenderTableCell.h"
#include "core/rendering/RenderView.h"
-#include "core/rendering/SubtreeLayoutScope.h"
#include "core/rendering/style/StyleInheritedData.h"
namespace WebCore {
@@ -85,7 +84,7 @@ void RenderTableRow::styleDidChange(StyleDifference diff, const RenderStyle* old
for (RenderBox* childBox = firstChildBox(); childBox; childBox = childBox->nextSiblingBox()) {
if (!childBox->isTableCell())
continue;
- childBox->setChildNeedsLayout();
+ childBox->setChildNeedsLayout(MarkOnlyThis);
}
}
}
@@ -166,10 +165,9 @@ void RenderTableRow::layout()
for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
if (child->isTableCell()) {
- SubtreeLayoutScope layouter(child);
RenderTableCell* cell = toRenderTableCell(child);
if (!cell->needsLayout() && paginated && view()->layoutState()->pageLogicalHeight() && view()->layoutState()->pageLogicalOffset(cell, cell->logicalTop()) != cell->pageLogicalOffset())
- layouter.setChildNeedsLayout(cell);
+ cell->setChildNeedsLayout(MarkOnlyThis);
if (child->needsLayout()) {
cell->computeAndSetBlockDirectionMargins(table());
diff --git a/chromium/third_party/WebKit/Source/core/rendering/RenderTableSection.cpp b/chromium/third_party/WebKit/Source/core/rendering/RenderTableSection.cpp
index d55550b194e..80938ccfce4 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/RenderTableSection.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/RenderTableSection.cpp
@@ -35,7 +35,6 @@
#include "core/rendering/RenderTableCol.h"
#include "core/rendering/RenderTableRow.h"
#include "core/rendering/RenderView.h"
-#include "core/rendering/SubtreeLayoutScope.h"
#include "wtf/HashSet.h"
#include "wtf/Vector.h"
@@ -613,7 +612,6 @@ void RenderTableSection::layout()
const Vector<int>& columnPos = table()->columnPositions();
- SubtreeLayoutScope layouter(this);
for (unsigned r = 0; r < m_grid.size(); ++r) {
Row& row = m_grid[r].row;
unsigned cols = row.size();
@@ -633,7 +631,7 @@ void RenderTableSection::layout()
endCol++;
}
int tableLayoutLogicalWidth = columnPos[endCol] - columnPos[startColumn] - table()->hBorderSpacing();
- cell->setCellLogicalWidth(tableLayoutLogicalWidth, layouter);
+ cell->setCellLogicalWidth(tableLayoutLogicalWidth);
}
if (RenderTableRow* rowRenderer = m_grid[r].rowRenderer)
@@ -738,11 +736,6 @@ int RenderTableSection::distributeExtraLogicalHeightToRows(int extraLogicalHeigh
return extraLogicalHeight - remainingExtraLogicalHeight;
}
-static bool shouldFlexCellChild(RenderObject* cellDescendant)
-{
- return cellDescendant->isReplaced() || (cellDescendant->isBox() && toRenderBox(cellDescendant)->scrollsOverflow());
-}
-
void RenderTableSection::layoutRows()
{
#ifndef NDEBUG
@@ -802,24 +795,33 @@ void RenderTableSection::layoutRows()
bool flexAllChildren = cell->style()->logicalHeight().isFixed()
|| (!table()->style()->logicalHeight().isAuto() && rHeight != cell->logicalHeight());
- for (RenderObject* child = cell->firstChild(); child; child = child->nextSibling()) {
- if (!child->isText() && child->style()->logicalHeight().isPercent()
- && (flexAllChildren || shouldFlexCellChild(child))
- && (!child->isTable() || toRenderTable(child)->hasSections())) {
- cellChildrenFlex = true;
- break;
+ for (RenderObject* o = cell->firstChild(); o; o = o->nextSibling()) {
+ if (!o->isText() && o->style()->logicalHeight().isPercent() && (flexAllChildren || o->isReplaced() || (o->isBox() && toRenderBox(o)->scrollsOverflow()))) {
+ // Tables with no sections do not flex.
+ if (!o->isTable() || toRenderTable(o)->hasSections()) {
+ o->setNeedsLayout(MarkOnlyThis);
+ cellChildrenFlex = true;
+ }
}
}
- if (!cellChildrenFlex) {
- if (TrackedRendererListHashSet* percentHeightDescendants = cell->percentHeightDescendants()) {
- TrackedRendererListHashSet::iterator end = percentHeightDescendants->end();
- for (TrackedRendererListHashSet::iterator it = percentHeightDescendants->begin(); it != end; ++it) {
- if (flexAllChildren || shouldFlexCellChild(*it)) {
- cellChildrenFlex = true;
+ if (TrackedRendererListHashSet* percentHeightDescendants = cell->percentHeightDescendants()) {
+ TrackedRendererListHashSet::iterator end = percentHeightDescendants->end();
+ for (TrackedRendererListHashSet::iterator it = percentHeightDescendants->begin(); it != end; ++it) {
+ RenderBox* box = *it;
+ if (!box->isReplaced() && !box->scrollsOverflow() && !flexAllChildren)
+ continue;
+
+ while (box != cell) {
+ if (box->normalChildNeedsLayout())
+ break;
+ box->setChildNeedsLayout(MarkOnlyThis);
+ box = box->containingBlock();
+ ASSERT(box);
+ if (!box)
break;
- }
}
+ cellChildrenFlex = true;
}
}
@@ -838,15 +840,14 @@ void RenderTableSection::layoutRows()
}
}
- SubtreeLayoutScope layouter(cell);
- cell->computeIntrinsicPadding(rHeight, layouter);
+ cell->computeIntrinsicPadding(rHeight);
LayoutRect oldCellRect = cell->frameRect();
setLogicalPositionForCell(cell, c);
if (!cell->needsLayout() && view()->layoutState()->pageLogicalHeight() && view()->layoutState()->pageLogicalOffset(cell, cell->logicalTop()) != cell->pageLogicalOffset())
- layouter.setChildNeedsLayout(cell);
+ cell->setChildNeedsLayout(MarkOnlyThis);
cell->layoutIfNeeded();
diff --git a/chromium/third_party/WebKit/Source/core/rendering/SubtreeLayoutScope.cpp b/chromium/third_party/WebKit/Source/core/rendering/SubtreeLayoutScope.cpp
deleted file mode 100644
index c3bfefe745a..00000000000
--- a/chromium/third_party/WebKit/Source/core/rendering/SubtreeLayoutScope.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "core/rendering/SubtreeLayoutScope.h"
-
-#include "core/page/FrameView.h"
-#include "core/rendering/RenderObject.h"
-
-namespace WebCore {
-
-SubtreeLayoutScope::SubtreeLayoutScope(RenderObject* root)
- : m_root(root)
-{
- RELEASE_ASSERT(m_root->document()->view()->isInLayout());
-}
-
-SubtreeLayoutScope::~SubtreeLayoutScope()
-{
- RELEASE_ASSERT(!m_root->needsLayout());
-
-#ifndef NDEBUG
- for (HashSet<RenderObject*>::iterator it = m_renderersToLayout.begin(); it != m_renderersToLayout.end(); ++it) {
- RenderObject* renderer = *it;
- // FIXME: Thie patter is really common. Move it into an assertRendererLaidOut function.
- if (renderer->needsLayout())
- showRenderTree(renderer);
- ASSERT(!renderer->needsLayout());
- }
-#endif
-}
-
-void SubtreeLayoutScope::setNeedsLayout(RenderObject* descendant)
-{
- ASSERT(descendant->isDescendantOf(m_root));
- descendant->setNeedsLayout(MarkContainingBlockChain, this);
-}
-
-void SubtreeLayoutScope::setChildNeedsLayout(RenderObject* descendant)
-{
- ASSERT(descendant->isDescendantOf(m_root));
- descendant->setChildNeedsLayout(MarkContainingBlockChain, this);
-}
-
-void SubtreeLayoutScope::addRendererToLayout(RenderObject* renderer)
-{
-#ifndef NDEBUG
- m_renderersToLayout.add(renderer);
-#endif
-}
-
-}
diff --git a/chromium/third_party/WebKit/Source/core/rendering/SubtreeLayoutScope.h b/chromium/third_party/WebKit/Source/core/rendering/SubtreeLayoutScope.h
deleted file mode 100644
index 792fb7f6a1b..00000000000
--- a/chromium/third_party/WebKit/Source/core/rendering/SubtreeLayoutScope.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef SubtreeLayoutScope_h
-#define SubtreeLayoutScope_h
-
-#include "wtf/HashSet.h"
-
-// This is the way to mark a subtree as needing layout during layout,
-// e.g. for the purposes of doing a multipass layout.
-//
-// It should only be used during layout. Outside of layout, you should
-// just call renderer->setNeedsLayout() directly.
-//
-// It ensures that you don't accidentally mark part of the tree as
-// needing layout and not actually lay it out.
-
-// FIXME: Assert that this is only used during layout and that
-// MarkOnlyThis is never used outside of layout.
-
-namespace WebCore {
-
-class RenderObject;
-
-class SubtreeLayoutScope {
-public:
- SubtreeLayoutScope(RenderObject* root);
- ~SubtreeLayoutScope();
-
- void setNeedsLayout(RenderObject* descendant);
- void setChildNeedsLayout(RenderObject* descendant);
-
- RenderObject* root() { return m_root; }
- void addRendererToLayout(RenderObject* renderer);
-
-private:
- RenderObject* m_root;
-
-#ifndef NDEBUG
- HashSet<RenderObject*> m_renderersToLayout;
-#endif
-};
-
-}
-
-#endif
diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.cpp b/chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.cpp
deleted file mode 100644
index a57958071a0..00000000000
--- a/chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the following
- * disclaimer.
- * 2. Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "core/rendering/shapes/RasterShape.h"
-
-#include "core/rendering/shapes/ShapeInterval.h"
-#include "wtf/MathExtras.h"
-
-namespace WebCore {
-
-IntRect RasterShapeIntervals::bounds() const
-{
- if (!m_bounds)
- m_bounds = adoptPtr(new IntRect(m_region.bounds()));
- return *m_bounds;
-}
-
-void RasterShapeIntervals::addInterval(int y, int x1, int x2)
-{
- m_region.unite(Region(IntRect(x1, y, x2 - x1, 1)));
- m_bounds.clear();
-}
-
-static inline IntRect alignedRect(IntRect r, int y1, int y2)
-{
- return IntRect(r.x(), y1, r.width(), y2 - y1);
-}
-
-void RasterShapeIntervals::getIncludedIntervals(int y1, int y2, SegmentList& result) const
-{
- ASSERT(y2 >= y1);
-
- IntRect lineRect(bounds().x(), y1, bounds().width(), y2 - y1);
- Region lineRegion(lineRect);
- lineRegion.intersect(m_region);
- if (lineRegion.isEmpty())
- return;
-
- Vector<IntRect> lineRects = lineRegion.rects();
- ASSERT(lineRects.size() > 0);
-
- Region segmentsRegion(lineRect);
- Region intervalsRegion;
-
- // The loop below uses Regions to compute the intersection of the horizontal
- // shape intervals that fall within the line's box.
-
- int lineY = lineRects[0].y();
- for (unsigned i = 0; i < lineRects.size(); ++i) {
- if (lineRects[i].y() != lineY) {
- segmentsRegion.intersect(intervalsRegion);
- intervalsRegion = Region();
- }
- intervalsRegion.unite(Region(alignedRect(lineRects[i], y1, y2)));
- lineY = lineRects[i].y();
- }
- if (!intervalsRegion.isEmpty())
- segmentsRegion.intersect(intervalsRegion);
-
- Vector<IntRect> segmentRects = segmentsRegion.rects();
- for (unsigned i = 0; i < segmentRects.size(); ++i)
- result.append(LineSegment(segmentRects[i].x(), segmentRects[i].maxX()));
-}
-
-const RasterShapeIntervals& RasterShape::marginIntervals() const
-{
- ASSERT(shapeMargin() >= 0);
- if (!shapeMargin())
- return *m_intervals;
-
- // FIXME: add support for non-zero margin, see https://code.google.com/p/chromium/issues/detail?id=252737.
- return *m_intervals;
-}
-
-const RasterShapeIntervals& RasterShape::paddingIntervals() const
-{
- ASSERT(shapePadding() >= 0);
- if (!shapePadding())
- return *m_intervals;
-
- // FIXME: add support for non-zero padding, see https://code.google.com/p/chromium/issues/detail?id=252737.
- return *m_intervals;
-}
-
-void RasterShape::getExcludedIntervals(LayoutUnit, LayoutUnit, SegmentList&) const
-{
- // FIXME: this method is only a stub, see https://code.google.com/p/chromium/issues/detail?id=252737.
-}
-
-void RasterShape::getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList& result) const
-{
- const RasterShapeIntervals& intervals = paddingIntervals();
- if (intervals.isEmpty())
- return;
-
- float y1 = logicalTop;
- float y2 = logicalTop + logicalHeight;
-
- if (y1 < intervals.bounds().y() || y2 > intervals.bounds().maxY())
- return;
-
- intervals.getIncludedIntervals(y1, y2, result);
-}
-
-bool RasterShape::firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIntervalTop, const LayoutSize& minLogicalIntervalSize, LayoutUnit& result) const
-{
- float minIntervalTop = minLogicalIntervalTop;
- float minIntervalHeight = minLogicalIntervalSize.height();
- float minIntervalWidth = minLogicalIntervalSize.width();
-
- const RasterShapeIntervals& intervals = paddingIntervals();
- if (intervals.isEmpty() || minIntervalWidth > intervals.bounds().width())
- return false;
-
- float minY = std::max<float>(intervals.bounds().y(), minIntervalTop);
- float maxY = minY + minIntervalHeight;
-
- if (maxY > intervals.bounds().maxY())
- return false;
-
- // FIXME: complete this method, see https://code.google.com/p/chromium/issues/detail?id=252737.
-
- result = minY;
- return true;
-}
-
-} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.h b/chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.h
deleted file mode 100644
index 84bed9cf25d..00000000000
--- a/chromium/third_party/WebKit/Source/core/rendering/shapes/RasterShape.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the following
- * disclaimer.
- * 2. Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef RasterShape_h
-#define RasterShape_h
-
-#include "core/platform/graphics/FloatRect.h"
-#include "core/platform/graphics/Region.h"
-#include "core/rendering/shapes/Shape.h"
-#include "wtf/Assertions.h"
-#include "wtf/Vector.h"
-
-namespace WebCore {
-
-class RasterShapeIntervals {
-public:
- RasterShapeIntervals() { }
-
- IntRect bounds() const;
- bool isEmpty() const { return m_region.isEmpty(); }
- void addInterval(int y, int x1, int x2);
- void getIncludedIntervals(int y1, int y2, SegmentList&) const;
-
-private:
- Region m_region;
- mutable OwnPtr<IntRect> m_bounds; // Cached value of m_region.bounds().
-};
-
-class RasterShape : public Shape {
- WTF_MAKE_NONCOPYABLE(RasterShape);
-public:
- RasterShape(PassOwnPtr<RasterShapeIntervals> intervals)
- : Shape()
- , m_intervals(intervals)
- {
- }
-
- virtual LayoutRect shapeMarginLogicalBoundingBox() const OVERRIDE { return static_cast<LayoutRect>(marginIntervals().bounds()); }
- virtual LayoutRect shapePaddingLogicalBoundingBox() const OVERRIDE { return static_cast<LayoutRect>(paddingIntervals().bounds()); }
- virtual bool isEmpty() const OVERRIDE { return m_intervals->isEmpty(); }
- virtual void getExcludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList&) const OVERRIDE;
- virtual void getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList&) const OVERRIDE;
- virtual bool firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIntervalTop, const LayoutSize& minLogicalIntervalSize, LayoutUnit&) const OVERRIDE;
-
-private:
- const RasterShapeIntervals& marginIntervals() const;
- const RasterShapeIntervals& paddingIntervals() const;
-
- OwnPtr<RasterShapeIntervals> m_intervals;
-};
-
-} // namespace WebCore
-
-#endif // RasterShape_h
diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.cpp b/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.cpp
index b325c073aa5..60d003bad86 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.cpp
@@ -31,12 +31,9 @@
#include "core/rendering/shapes/Shape.h"
#include "core/css/LengthFunctions.h"
-#include "core/fetch/ImageResource.h"
#include "core/platform/graphics/FloatSize.h"
-#include "core/platform/graphics/ImageBuffer.h"
#include "core/platform/graphics/WindRule.h"
#include "core/rendering/shapes/PolygonShape.h"
-#include "core/rendering/shapes/RasterShape.h"
#include "core/rendering/shapes/RectangleShape.h"
#include "wtf/MathExtras.h"
#include "wtf/OwnPtr.h"
@@ -201,45 +198,4 @@ PassOwnPtr<Shape> Shape::createShape(const BasicShape* basicShape, const LayoutS
return shape.release();
}
-PassOwnPtr<Shape> Shape::createShape(const StyleImage* styleImage, float threshold, const LayoutSize&, WritingMode writingMode, Length margin, Length padding)
-{
- ASSERT(styleImage && styleImage->isImageResource() && styleImage->cachedImage() && styleImage->cachedImage()->image());
-
- OwnPtr<RasterShapeIntervals> intervals = adoptPtr(new RasterShapeIntervals());
-
- Image* image = styleImage->cachedImage()->image();
- const IntSize& imageSize = image->size();
- OwnPtr<ImageBuffer> imageBuffer = ImageBuffer::create(imageSize);
- if (imageBuffer) {
- GraphicsContext* graphicsContext = imageBuffer->context();
- graphicsContext->drawImage(image, IntPoint());
-
- RefPtr<Uint8ClampedArray> pixelArray = imageBuffer->getUnmultipliedImageData(IntRect(IntPoint(), imageSize));
- unsigned pixelArrayLength = pixelArray->length();
- unsigned pixelArrayOffset = 3; // Each pixel is four bytes: RGBA.
- uint8_t alphaPixelThreshold = threshold * 255;
-
- ASSERT(static_cast<unsigned>(imageSize.width() * imageSize.height() * 4) == pixelArrayLength);
-
- for (int y = 0; y < imageSize.height(); ++y) {
- int startX = -1;
- for (int x = 0; x < imageSize.width() && pixelArrayOffset < pixelArrayLength; ++x, pixelArrayOffset += 4) {
- uint8_t alpha = pixelArray->item(pixelArrayOffset);
- if ((startX == -1) && alpha > alphaPixelThreshold) {
- startX = x;
- } else if (startX != -1 && (alpha <= alphaPixelThreshold || x == imageSize.width() - 1)) {
- intervals->addInterval(y, startX, x);
- startX = -1;
- }
- }
- }
- }
-
- OwnPtr<RasterShape> rasterShape = adoptPtr(new RasterShape(intervals.release()));
- rasterShape->m_writingMode = writingMode;
- rasterShape->m_margin = floatValueForLength(margin, 0);
- rasterShape->m_padding = floatValueForLength(padding, 0);
- return rasterShape.release();
-}
-
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.h b/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.h
index b1ea954b3fd..6e257c96e54 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/shapes/Shape.h
@@ -33,7 +33,6 @@
#include "core/platform/graphics/LayoutRect.h"
#include "core/platform/text/WritingMode.h"
#include "core/rendering/style/BasicShapes.h"
-#include "core/rendering/style/StyleImage.h"
#include "wtf/PassOwnPtr.h"
#include "wtf/Vector.h"
@@ -61,7 +60,6 @@ typedef Vector<LineSegment> SegmentList;
class Shape {
public:
static PassOwnPtr<Shape> createShape(const BasicShape*, const LayoutSize& logicalBoxSize, WritingMode, Length margin, Length padding);
- static PassOwnPtr<Shape> createShape(const StyleImage*, float threshold, const LayoutSize& logicalBoxSize, WritingMode, Length margin, Length padding);
virtual ~Shape() { }
diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInfo.cpp b/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInfo.cpp
index 54f97abf40f..78341a38445 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInfo.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInfo.cpp
@@ -41,26 +41,12 @@ const Shape* ShapeInfo<RenderType, shapeGetter, intervalGetter>::computedShape()
if (Shape* shape = m_shape.get())
return shape;
- const LayoutSize logicalBoxSize(m_shapeLogicalWidth, m_shapeLogicalHeight);
- WritingMode writingMode = m_renderer->style()->writingMode();
- Length margin = m_renderer->style()->shapeMargin();
- Length padding = m_renderer->style()->shapePadding();
- const ShapeValue* shapeValue = (m_renderer->style()->*shapeGetter)();
- ASSERT(shapeValue);
+ ShapeValue* shapeValue = (m_renderer->style()->*shapeGetter)();
+ BasicShape* shape = (shapeValue && shapeValue->type() == ShapeValue::Shape) ? shapeValue->shape() : 0;
- switch (shapeValue->type()) {
- case ShapeValue::Shape:
- ASSERT(shapeValue->shape());
- m_shape = Shape::createShape(shapeValue->shape(), logicalBoxSize, writingMode, margin, padding);
- break;
- case ShapeValue::Image:
- ASSERT(shapeValue->image());
- m_shape = Shape::createShape(shapeValue->image(), 0, logicalBoxSize, writingMode, margin, padding);
- break;
- default:
- ASSERT_NOT_REACHED();
- }
+ ASSERT(shape);
+ m_shape = Shape::createShape(shape, LayoutSize(m_shapeLogicalWidth, m_shapeLogicalHeight), m_renderer->style()->writingMode(), m_renderer->style()->shapeMargin(), m_renderer->style()->shapePadding());
ASSERT(m_shape);
return m_shape.get();
}
diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInsideInfo.cpp b/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInsideInfo.cpp
index 8c63f6c4d74..01dff4951f8 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInsideInfo.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeInsideInfo.cpp
@@ -44,19 +44,11 @@ LineSegmentRange::LineSegmentRange(const InlineIterator& start, const InlineIter
bool ShapeInsideInfo::isEnabledFor(const RenderBlock* renderer)
{
ShapeValue* shapeValue = renderer->style()->resolvedShapeInside();
- if (!shapeValue)
+ if (!shapeValue || shapeValue->type() != ShapeValue::Shape)
return false;
- switch (shapeValue->type()) {
- case ShapeValue::Shape:
- return shapeValue->shape() && shapeValue->shape()->type() != BasicShape::BasicShapeInsetRectangleType;
- case ShapeValue::Image:
- return shapeValue->isImageValid();
- case ShapeValue::Outside:
- return false;
- }
-
- return false;
+ BasicShape* shape = shapeValue->shape();
+ return shape && shape->type() != BasicShape::BasicShapeInsetRectangleType;
}
bool ShapeInsideInfo::adjustLogicalLineTop(float minSegmentWidth)
diff --git a/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeOutsideInfo.cpp b/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeOutsideInfo.cpp
index ed58e303568..76f52ddc461 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeOutsideInfo.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/shapes/ShapeOutsideInfo.cpp
@@ -35,20 +35,8 @@
namespace WebCore {
bool ShapeOutsideInfo::isEnabledFor(const RenderBox* box)
{
- ShapeValue* shapeValue = box->style()->shapeOutside();
- if (!box->isFloatingWithShapeOutside() || !shapeValue)
- return false;
-
- switch (shapeValue->type()) {
- case ShapeValue::Shape:
- return shapeValue->shape();
- case ShapeValue::Image:
- return false;
- case ShapeValue::Outside:
- return false;
- }
-
- return false;
+ ShapeValue* value = box->style()->shapeOutside();
+ return box->isFloatingWithShapeOutside() && value->type() == ShapeValue::Shape && value->shape();
}
bool ShapeOutsideInfo::computeSegmentsForContainingBlockLine(LayoutUnit lineTop, LayoutUnit floatTop, LayoutUnit lineHeight)
diff --git a/chromium/third_party/WebKit/Source/core/rendering/style/KeyframeList.cpp b/chromium/third_party/WebKit/Source/core/rendering/style/KeyframeList.cpp
index 093d796b6e7..9d20a1c666a 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/style/KeyframeList.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/style/KeyframeList.cpp
@@ -36,7 +36,7 @@ void KeyframeValue::addProperties(const StylePropertySet* propertySet)
CSSPropertyID property = propertySet->propertyAt(i).id();
// Timing-function within keyframes is special, because it is not animated; it just
// describes the timing function between this keyframe and the next.
- if (property != CSSPropertyWebkitAnimationTimingFunction && property != CSSPropertyAnimationTimingFunction)
+ if (property != CSSPropertyWebkitAnimationTimingFunction)
addProperty(property);
}
}
diff --git a/chromium/third_party/WebKit/Source/core/rendering/style/KeyframeList.h b/chromium/third_party/WebKit/Source/core/rendering/style/KeyframeList.h
index 4d5e207317b..5a5cf92ec04 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/style/KeyframeList.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/style/KeyframeList.h
@@ -40,7 +40,7 @@ class StylePropertySet;
class KeyframeValue {
public:
- KeyframeValue(double key, PassRefPtr<RenderStyle> style)
+ KeyframeValue(float key, PassRefPtr<RenderStyle> style)
: m_key(key)
, m_style(style)
{
@@ -51,14 +51,14 @@ public:
bool containsProperty(CSSPropertyID prop) const { return m_properties.contains(prop); }
const HashSet<CSSPropertyID>& properties() const { return m_properties; }
- double key() const { return m_key; }
- void setKey(double key) { m_key = key; }
+ float key() const { return m_key; }
+ void setKey(float key) { m_key = key; }
const RenderStyle* style() const { return m_style.get(); }
void setStyle(PassRefPtr<RenderStyle> style) { m_style = style; }
private:
- double m_key;
+ float m_key;
HashSet<CSSPropertyID> m_properties; // The properties specified in this keyframe.
RefPtr<RenderStyle> m_style;
};
diff --git a/chromium/third_party/WebKit/Source/core/rendering/style/SVGRenderStyle.cpp b/chromium/third_party/WebKit/Source/core/rendering/style/SVGRenderStyle.cpp
index bc5c3399257..4ec55815a8f 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/style/SVGRenderStyle.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/style/SVGRenderStyle.cpp
@@ -169,10 +169,7 @@ StyleDifference SVGRenderStyle::diff(const SVGRenderStyle* other) const
|| stroke->paintUri != other->stroke->paintUri
|| stroke->miterLimit != other->stroke->miterLimit
|| stroke->dashArray != other->stroke->dashArray
- || stroke->dashOffset != other->stroke->dashOffset
- || stroke->visitedLinkPaintColor != other->stroke->visitedLinkPaintColor
- || stroke->visitedLinkPaintUri != other->stroke->visitedLinkPaintUri
- || stroke->visitedLinkPaintType != other->stroke->visitedLinkPaintType)
+ || stroke->dashOffset != other->stroke->dashOffset)
return StyleDifferenceLayout;
// Only the stroke-opacity case remains, where we only need a repaint.
diff --git a/chromium/third_party/WebKit/Source/core/rendering/style/ShapeValue.h b/chromium/third_party/WebKit/Source/core/rendering/style/ShapeValue.h
index bb71dab440a..b72d2518665 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/style/ShapeValue.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/style/ShapeValue.h
@@ -30,7 +30,6 @@
#ifndef ShapeValue_h
#define ShapeValue_h
-#include "core/fetch/ImageResource.h"
#include "core/rendering/style/BasicShapes.h"
#include "core/rendering/style/StyleImage.h"
#include "wtf/PassRefPtr.h"
@@ -63,12 +62,9 @@ public:
ShapeValueType type() const { return m_type; }
BasicShape* shape() const { return m_shape.get(); }
-
StyleImage* image() const { return m_image.get(); }
- bool isImageValid() const { return image() && image()->cachedImage() && image()->cachedImage()->hasImage(); }
void setImage(PassRefPtr<StyleImage> image)
{
- ASSERT(type() == Image);
if (m_image != image)
m_image = image;
}
diff --git a/chromium/third_party/WebKit/Source/core/rendering/style/StyleCustomFilterProgram.h b/chromium/third_party/WebKit/Source/core/rendering/style/StyleCustomFilterProgram.h
index 18be011b566..167821769ac 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/style/StyleCustomFilterProgram.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/style/StyleCustomFilterProgram.h
@@ -30,9 +30,9 @@
#ifndef StyleCustomFilterProgram_h
#define StyleCustomFilterProgram_h
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourcePtr.h"
-#include "core/fetch/ShaderResource.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
+#include "core/loader/cache/ShaderResource.h"
#include "core/platform/graphics/filters/custom/CustomFilterProgram.h"
#include "core/rendering/style/StyleShader.h"
#include "weborigin/KURL.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImage.cpp b/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImage.cpp
index 31dc65a0452..e09447510e2 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImage.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImage.cpp
@@ -24,7 +24,7 @@
#include "config.h"
#include "core/rendering/style/StyleFetchedImage.h"
-#include "core/fetch/ImageResource.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/rendering/RenderObject.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImage.h b/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImage.h
index 9ea82f51778..b9effd9c2cd 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImage.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImage.h
@@ -24,8 +24,8 @@
#ifndef StyleFetchedImage_h
#define StyleFetchedImage_h
-#include "core/fetch/ImageResourceClient.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ImageResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/rendering/style/StyleImage.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImageSet.cpp b/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImageSet.cpp
index 04a8d9d5961..b9e9d52c190 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImageSet.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImageSet.cpp
@@ -27,7 +27,7 @@
#include "core/rendering/style/StyleFetchedImageSet.h"
#include "core/css/CSSImageSetValue.h"
-#include "core/fetch/ImageResource.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/rendering/RenderObject.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImageSet.h b/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImageSet.h
index 178ec3c87b0..3e431e23388 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImageSet.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedImageSet.h
@@ -26,8 +26,8 @@
#ifndef StyleFetchedImageSet_h
#define StyleFetchedImageSet_h
-#include "core/fetch/ImageResourceClient.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ImageResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/graphics/LayoutSize.h"
#include "core/rendering/style/StyleImage.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedShader.cpp b/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedShader.cpp
index 13a8b98c36a..2b6c6c24e4e 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedShader.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedShader.cpp
@@ -32,7 +32,7 @@
#include "core/rendering/style/StyleFetchedShader.h"
#include "core/css/CSSPrimitiveValue.h"
-#include "core/fetch/ShaderResource.h"
+#include "core/loader/cache/ShaderResource.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedShader.h b/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedShader.h
index 104a90cc871..88e54112d14 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedShader.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/style/StyleFetchedShader.h
@@ -30,7 +30,7 @@
#ifndef StyleFetchedShader_h
#define StyleFetchedShader_h
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/rendering/style/StyleShader.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/rendering/svg/ReferenceFilterBuilder.cpp b/chromium/third_party/WebKit/Source/core/rendering/svg/ReferenceFilterBuilder.cpp
index b2a9feb84f3..ab598e38444 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/svg/ReferenceFilterBuilder.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/svg/ReferenceFilterBuilder.cpp
@@ -33,8 +33,8 @@
#include "core/css/CSSPrimitiveValue.h"
#include "core/css/CSSPrimitiveValueMappings.h"
#include "core/dom/Element.h"
-#include "core/fetch/DocumentResource.h"
-#include "core/fetch/DocumentResourceReference.h"
+#include "core/loader/cache/DocumentResource.h"
+#include "core/loader/cache/DocumentResourceReference.h"
#include "core/platform/graphics/filters/FilterEffect.h"
#include "core/platform/graphics/filters/SourceAlpha.h"
#include "core/rendering/svg/RenderSVGResourceFilter.h"
diff --git a/chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGResourceClipper.cpp b/chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGResourceClipper.cpp
index 9da09f9d9f0..92a96dd3949 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGResourceClipper.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGResourceClipper.cpp
@@ -127,7 +127,7 @@ bool RenderSVGResourceClipper::pathOnlyClipping(GraphicsContext* context, const
}
}
// Only one visible shape/path was found. Directly continue clipping and transform the content to userspace if necessary.
- if (toSVGClipPathElement(node())->clipPathUnitsCurrentValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
+ if (static_cast<SVGClipPathElement*>(node())->clipPathUnitsCurrentValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
AffineTransform transform;
transform.translate(objectBoundingBox.x(), objectBoundingBox.y());
transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.height());
@@ -152,7 +152,7 @@ bool RenderSVGResourceClipper::applyClippingToContext(RenderObject* object, cons
m_clipper.set(object, new ClipperData);
bool shouldCreateClipData = false;
- AffineTransform animatedLocalTransform = toSVGClipPathElement(node())->animatedLocalTransform();
+ AffineTransform animatedLocalTransform = static_cast<SVGClipPathElement*>(node())->animatedLocalTransform();
ClipperData* clipperData = m_clipper.get(object);
if (!clipperData->clipMaskImage) {
if (pathOnlyClipping(context, animatedLocalTransform, objectBoundingBox))
@@ -208,7 +208,8 @@ bool RenderSVGResourceClipper::drawContentIntoMaskImage(ClipperData* clipperData
ASSERT(maskContext);
AffineTransform maskContentTransformation;
- if (toSVGClipPathElement(node())->clipPathUnitsCurrentValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
+ SVGClipPathElement* clipPath = static_cast<SVGClipPathElement*>(node());
+ if (clipPath->clipPathUnitsCurrentValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
maskContentTransformation.translate(objectBoundingBox.x(), objectBoundingBox.y());
maskContentTransformation.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.height());
maskContext->concatCTM(maskContentTransformation);
@@ -276,7 +277,7 @@ void RenderSVGResourceClipper::calculateClipContentRepaintRect()
continue;
m_clipBoundaries.unite(renderer->localToParentTransform().mapRect(renderer->repaintRectInLocalCoordinates()));
}
- m_clipBoundaries = toSVGClipPathElement(node())->animatedLocalTransform().mapRect(m_clipBoundaries);
+ m_clipBoundaries = static_cast<SVGClipPathElement*>(node())->animatedLocalTransform().mapRect(m_clipBoundaries);
}
bool RenderSVGResourceClipper::hitTestClipContent(const FloatRect& objectBoundingBox, const FloatPoint& nodeAtPoint)
@@ -285,7 +286,7 @@ bool RenderSVGResourceClipper::hitTestClipContent(const FloatRect& objectBoundin
if (!SVGRenderSupport::pointInClippingArea(this, point))
return false;
- SVGClipPathElement* clipPathElement = toSVGClipPathElement(node());
+ SVGClipPathElement* clipPathElement = static_cast<SVGClipPathElement*>(node());
if (clipPathElement->clipPathUnitsCurrentValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
AffineTransform transform;
transform.translate(objectBoundingBox.x(), objectBoundingBox.y());
@@ -319,7 +320,7 @@ FloatRect RenderSVGResourceClipper::resourceBoundingBox(RenderObject* object)
if (m_clipBoundaries.isEmpty())
calculateClipContentRepaintRect();
- if (toSVGClipPathElement(node())->clipPathUnitsCurrentValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
+ if (static_cast<SVGClipPathElement*>(node())->clipPathUnitsCurrentValue() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
FloatRect objectBoundingBox = object->objectBoundingBox();
AffineTransform transform;
transform.translate(objectBoundingBox.x(), objectBoundingBox.y());
diff --git a/chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGResourceClipper.h b/chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGResourceClipper.h
index 69ee9865220..32e4971c9fe 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGResourceClipper.h
+++ b/chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGResourceClipper.h
@@ -52,7 +52,7 @@ public:
bool hitTestClipContent(const FloatRect&, const FloatPoint&);
- SVGUnitTypes::SVGUnitType clipPathUnits() const { return toSVGClipPathElement(node())->clipPathUnitsCurrentValue(); }
+ SVGUnitTypes::SVGUnitType clipPathUnits() const { return static_cast<SVGClipPathElement*>(node())->clipPathUnitsCurrentValue(); }
static RenderSVGResourceType s_resourceType;
private:
diff --git a/chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGTextPath.cpp b/chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGTextPath.cpp
index f2068b80ac5..a1fbae363e6 100644
--- a/chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGTextPath.cpp
+++ b/chromium/third_party/WebKit/Source/core/rendering/svg/RenderSVGTextPath.cpp
@@ -35,7 +35,7 @@ RenderSVGTextPath::RenderSVGTextPath(Element* element)
Path RenderSVGTextPath::layoutPath() const
{
- SVGTextPathElement* textPathElement = toSVGTextPathElement(node());
+ SVGTextPathElement* textPathElement = static_cast<SVGTextPathElement*>(node());
Element* targetElement = SVGURIReference::targetElementFromIRIString(textPathElement->hrefCurrentValue(), textPathElement->document());
if (!targetElement || !targetElement->hasTagName(SVGNames::pathTag))
return Path();
@@ -56,17 +56,17 @@ Path RenderSVGTextPath::layoutPath() const
float RenderSVGTextPath::startOffset() const
{
- return toSVGTextPathElement(node())->startOffsetCurrentValue().valueAsPercentage();
+ return static_cast<SVGTextPathElement*>(node())->startOffsetCurrentValue().valueAsPercentage();
}
bool RenderSVGTextPath::exactAlignment() const
{
- return toSVGTextPathElement(node())->spacingCurrentValue() == SVGTextPathSpacingExact;
+ return static_cast<SVGTextPathElement*>(node())->spacingCurrentValue() == SVGTextPathSpacingExact;
}
bool RenderSVGTextPath::stretchMethod() const
{
- return toSVGTextPathElement(node())->methodCurrentValue() == SVGTextPathMethodStretch;
+ return static_cast<SVGTextPathElement*>(node())->methodCurrentValue() == SVGTextPathMethodStretch;
}
}
diff --git a/chromium/third_party/WebKit/Source/core/scripts/templates/StylePropertyShorthand.h.tmpl b/chromium/third_party/WebKit/Source/core/scripts/templates/StylePropertyShorthand.h.tmpl
index 5ef9febce37..2bf03820d62 100644
--- a/chromium/third_party/WebKit/Source/core/scripts/templates/StylePropertyShorthand.h.tmpl
+++ b/chromium/third_party/WebKit/Source/core/scripts/templates/StylePropertyShorthand.h.tmpl
@@ -70,9 +70,8 @@ private:
{%- set camel_case_name = property.camel_case_name %}
const StylePropertyShorthand& {{ camel_case_name }}Shorthand();
{%- endfor %}
-
-// Returns an empty list if the property is not a shorthand, otherwise the list of longhands for parsing.
-const StylePropertyShorthand& parsingShorthandForProperty(CSSPropertyID);
+const StylePropertyShorthand& borderShorthandForParsing();
+const StylePropertyShorthand& webkitAnimationShorthandForParsing();
// Returns an empty list if the property is not a shorthand.
const StylePropertyShorthand& shorthandForProperty(CSSPropertyID);
diff --git a/chromium/third_party/WebKit/Source/core/storage/Storage.cpp b/chromium/third_party/WebKit/Source/core/storage/Storage.cpp
index c46e9bbdc81..bbeb0a3617b 100644
--- a/chromium/third_party/WebKit/Source/core/storage/Storage.cpp
+++ b/chromium/third_party/WebKit/Source/core/storage/Storage.cpp
@@ -28,8 +28,8 @@
#include "bindings/v8/ExceptionState.h"
#include "wtf/PassOwnPtr.h"
-#include "wtf/PassRefPtr.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/text/WTFString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/storage/Storage.h b/chromium/third_party/WebKit/Source/core/storage/Storage.h
index 825dad39357..4ffefd57ebf 100644
--- a/chromium/third_party/WebKit/Source/core/storage/Storage.h
+++ b/chromium/third_party/WebKit/Source/core/storage/Storage.h
@@ -29,9 +29,9 @@
#include "bindings/v8/ScriptWrappable.h"
#include "core/page/DOMWindowProperty.h"
#include "core/storage/StorageArea.h"
-#include "wtf/Forward.h"
-#include "wtf/RefCounted.h"
-#include "wtf/RefPtr.h"
+#include <wtf/Forward.h>
+#include <wtf/RefCounted.h>
+#include <wtf/RefPtr.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/storage/StorageArea.h b/chromium/third_party/WebKit/Source/core/storage/StorageArea.h
index 00114d5146a..00533e505a0 100644
--- a/chromium/third_party/WebKit/Source/core/storage/StorageArea.h
+++ b/chromium/third_party/WebKit/Source/core/storage/StorageArea.h
@@ -26,8 +26,8 @@
#ifndef StorageArea_h
#define StorageArea_h
-#include "wtf/Forward.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/Forward.h>
+#include <wtf/text/WTFString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/storage/StorageEvent.h b/chromium/third_party/WebKit/Source/core/storage/StorageEvent.h
index a4e8ffc9a3e..c59471e3d24 100644
--- a/chromium/third_party/WebKit/Source/core/storage/StorageEvent.h
+++ b/chromium/third_party/WebKit/Source/core/storage/StorageEvent.h
@@ -27,7 +27,7 @@
#define StorageEvent_h
#include "core/dom/Event.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/text/WTFString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGAnimationElement.h b/chromium/third_party/WebKit/Source/core/svg/SVGAnimationElement.h
index a2d9ac4cd82..9108719e484 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGAnimationElement.h
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGAnimationElement.h
@@ -237,9 +237,6 @@ private:
AttributeType m_attributeType;
Vector<String> m_values;
- // FIXME: We should probably use doubles for this, but there's no point
- // making such a change unless all SVG logic for sampling animations is
- // changed to use doubles.
Vector<float> m_keyTimes;
Vector<float> m_keyPoints;
Vector<UnitBezier> m_keySplines;
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGClipPathElement.h b/chromium/third_party/WebKit/Source/core/svg/SVGClipPathElement.h
index 5667aa7dd16..c5bbb882a8c 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGClipPathElement.h
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGClipPathElement.h
@@ -21,7 +21,6 @@
#ifndef SVGClipPathElement_h
#define SVGClipPathElement_h
-#include "SVGNames.h"
#include "core/svg/SVGAnimatedBoolean.h"
#include "core/svg/SVGAnimatedEnumeration.h"
#include "core/svg/SVGExternalResourcesRequired.h"
@@ -56,12 +55,6 @@ private:
END_DECLARE_ANIMATED_PROPERTIES
};
-inline SVGClipPathElement* toSVGClipPathElement(Node* node)
-{
- ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::clipPathTag));
- return static_cast<SVGClipPathElement*>(node);
-}
-
}
#endif
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp b/chromium/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp
index cbf76e8f14f..b67789cbb11 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp
@@ -26,9 +26,9 @@
#include "SVGNames.h"
#include "XLinkNames.h"
#include "core/dom/Document.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ImageResource.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ImageResource.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/platform/graphics/Image.h"
#include "core/rendering/svg/RenderSVGResource.h"
#include "core/svg/SVGElementInstance.h"
@@ -193,8 +193,7 @@ void SVGFEImageElement::notifyFinished(Resource*)
if (!parent->hasTagName(SVGNames::filterTag) || !parent->renderer())
return;
- if (RenderObject* renderer = this->renderer())
- RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer);
+ RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer());
}
PassRefPtr<FilterEffect> SVGFEImageElement::build(SVGFilterBuilder*, Filter* filter)
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGFEImageElement.h b/chromium/third_party/WebKit/Source/core/svg/SVGFEImageElement.h
index 799a8ffb119..64f326ddfef 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGFEImageElement.h
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGFEImageElement.h
@@ -21,8 +21,8 @@
#ifndef SVGFEImageElement_h
#define SVGFEImageElement_h
-#include "core/fetch/ImageResource.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ImageResource.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/graphics/ImageBuffer.h"
#include "core/svg/SVGAnimatedBoolean.h"
#include "core/svg/SVGAnimatedPreserveAspectRatio.h"
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGFontFaceUriElement.cpp b/chromium/third_party/WebKit/Source/core/svg/SVGFontFaceUriElement.cpp
index d040e432273..569ca30ca0b 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGFontFaceUriElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGFontFaceUriElement.cpp
@@ -27,9 +27,9 @@
#include "XLinkNames.h"
#include "core/css/CSSFontFaceSrcValue.h"
#include "core/dom/Document.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/FontResource.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/FontResource.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/svg/SVGFontFaceElement.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGFontFaceUriElement.h b/chromium/third_party/WebKit/Source/core/svg/SVGFontFaceUriElement.h
index 6101a5c412b..99d10462a30 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGFontFaceUriElement.h
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGFontFaceUriElement.h
@@ -21,8 +21,8 @@
#define SVGFontFaceUriElement_h
#if ENABLE(SVG_FONTS)
-#include "core/fetch/FontResource.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/FontResource.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/svg/SVGElement.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGImageLoader.cpp b/chromium/third_party/WebKit/Source/core/svg/SVGImageLoader.cpp
index 85c0fbbd74d..75dd0d4e21c 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGImageLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGImageLoader.cpp
@@ -24,8 +24,8 @@
#include "core/dom/Event.h"
#include "core/dom/EventNames.h"
-#include "core/fetch/ImageResource.h"
#include "core/html/parser/HTMLParserIdioms.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/svg/SVGImageElement.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp b/chromium/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp
index d10c7525957..d6958837e17 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp
@@ -718,7 +718,7 @@ void SVGSVGElement::setupInitialView(const String& fragmentIdentifier, Element*
if (SVGViewElement* viewElement = anchorNode->hasTagName(SVGNames::viewTag) ? static_cast<SVGViewElement*>(anchorNode) : 0) {
SVGElement* element = SVGLocatable::nearestViewportElement(viewElement);
if (element->hasTagName(SVGNames::svgTag)) {
- SVGSVGElement* svg = toSVGSVGElement(element);
+ SVGSVGElement* svg = static_cast<SVGSVGElement*>(element);
svg->inheritViewAttributes(viewElement);
if (RenderObject* renderer = svg->renderer())
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGTextContentElement.cpp b/chromium/third_party/WebKit/Source/core/svg/SVGTextContentElement.cpp
index 48c806af588..532b74b7f23 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGTextContentElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGTextContentElement.cpp
@@ -123,9 +123,6 @@ float SVGTextContentElement::getSubStringLength(unsigned charnum, unsigned nchar
return 0.0f;
}
- if (nchars > numberOfChars - charnum)
- nchars = numberOfChars - charnum;
-
return SVGTextQuery(renderer()).subStringLength(charnum, nchars);
}
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGTextContentElement.idl b/chromium/third_party/WebKit/Source/core/svg/SVGTextContentElement.idl
index f4ce37dc97d..4d693752940 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGTextContentElement.idl
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGTextContentElement.idl
@@ -34,13 +34,15 @@ interface SVGTextContentElement : SVGGraphicsElement {
long getNumberOfChars();
float getComputedTextLength();
- [RaisesException] float getSubStringLength(unsigned long offset, unsigned long length);
- [RaisesException] SVGPoint getStartPositionOfChar(unsigned long offset);
- [RaisesException] SVGPoint getEndPositionOfChar(unsigned long offset);
- [RaisesException] SVGRect getExtentOfChar(unsigned long offset);
- [RaisesException] float getRotationOfChar(unsigned long offset);
- long getCharNumAtPosition(SVGPoint point);
- [RaisesException] void selectSubString(unsigned long offset, unsigned long length);
+ [RaisesException] float getSubStringLength([Default=Undefined,IsIndex] optional unsigned long offset,
+ [Default=Undefined,IsIndex] optional unsigned long length);
+ [RaisesException] SVGPoint getStartPositionOfChar([Default=Undefined,IsIndex] optional unsigned long offset);
+ [RaisesException] SVGPoint getEndPositionOfChar([Default=Undefined,IsIndex] optional unsigned long offset);
+ [RaisesException] SVGRect getExtentOfChar([Default=Undefined,IsIndex] optional unsigned long offset);
+ [RaisesException] float getRotationOfChar([Default=Undefined,IsIndex] optional unsigned long offset);
+ long getCharNumAtPosition([Default=Undefined] optional SVGPoint point);
+ [RaisesException] void selectSubString([Default=Undefined,IsIndex] optional unsigned long offset,
+ [Default=Undefined,IsIndex] optional unsigned long length);
};
// FIXME: SVGTextContentElement is not supposed to implement SVGExternalResourcesRequired.
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGTextPathElement.h b/chromium/third_party/WebKit/Source/core/svg/SVGTextPathElement.h
index 0ad3f96f238..ab6bcb9881b 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGTextPathElement.h
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGTextPathElement.h
@@ -20,8 +20,8 @@
#ifndef SVGTextPathElement_h
#define SVGTextPathElement_h
-#include "SVGNames.h"
#include "core/svg/SVGTextContentElement.h"
+
#include "core/svg/SVGURIReference.h"
namespace WebCore {
@@ -140,12 +140,6 @@ private:
END_DECLARE_ANIMATED_PROPERTIES
};
-inline SVGTextPathElement* toSVGTextPathElement(Node* node)
-{
- ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::textPathTag));
- return static_cast<SVGTextPathElement*>(node);
-}
-
} // namespace WebCore
#endif
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGUseElement.cpp b/chromium/third_party/WebKit/Source/core/svg/SVGUseElement.cpp
index 9589a9f2b8f..9ea02500f09 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGUseElement.cpp
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGUseElement.cpp
@@ -34,9 +34,9 @@
#include "core/dom/NodeTraversal.h"
#include "core/dom/shadow/ElementShadow.h"
#include "core/dom/shadow/ShadowRoot.h"
-#include "core/fetch/DocumentResource.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/DocumentResource.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/rendering/svg/RenderSVGResource.h"
#include "core/rendering/svg/RenderSVGTransformableContainer.h"
#include "core/svg/SVGElementInstance.h"
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGUseElement.h b/chromium/third_party/WebKit/Source/core/svg/SVGUseElement.h
index 3216a518244..1540588715b 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGUseElement.h
+++ b/chromium/third_party/WebKit/Source/core/svg/SVGUseElement.h
@@ -22,7 +22,7 @@
#define SVGUseElement_h
#include "SVGNames.h"
-#include "core/fetch/DocumentResource.h"
+#include "core/loader/cache/DocumentResource.h"
#include "core/svg/SVGAnimatedBoolean.h"
#include "core/svg/SVGAnimatedLength.h"
#include "core/svg/SVGExternalResourcesRequired.h"
diff --git a/chromium/third_party/WebKit/Source/core/svg/graphics/SVGImageCache.cpp b/chromium/third_party/WebKit/Source/core/svg/graphics/SVGImageCache.cpp
index 81153b3739e..6b5e5a2f3ed 100644
--- a/chromium/third_party/WebKit/Source/core/svg/graphics/SVGImageCache.cpp
+++ b/chromium/third_party/WebKit/Source/core/svg/graphics/SVGImageCache.cpp
@@ -21,7 +21,7 @@
#include "config.h"
#include "core/svg/graphics/SVGImageCache.h"
-#include "core/fetch/ImageResource.h"
+#include "core/loader/cache/ImageResource.h"
#include "core/page/FrameView.h"
#include "core/page/Page.h"
#include "core/platform/graphics/GraphicsContext.h"
diff --git a/chromium/third_party/WebKit/Source/core/testing/InspectorFrontendClientLocal.cpp b/chromium/third_party/WebKit/Source/core/testing/InspectorFrontendClientLocal.cpp
index cec7a00ebe1..a68a070d155 100644
--- a/chromium/third_party/WebKit/Source/core/testing/InspectorFrontendClientLocal.cpp
+++ b/chromium/third_party/WebKit/Source/core/testing/InspectorFrontendClientLocal.cpp
@@ -39,8 +39,8 @@
#include "core/platform/Timer.h"
#include "public/platform/Platform.h"
#include "public/platform/WebThread.h"
-#include "wtf/Deque.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/Deque.h>
+#include <wtf/text/WTFString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/testing/InspectorFrontendClientLocal.h b/chromium/third_party/WebKit/Source/core/testing/InspectorFrontendClientLocal.h
index e92f6f58e76..ef35ebab8dc 100644
--- a/chromium/third_party/WebKit/Source/core/testing/InspectorFrontendClientLocal.h
+++ b/chromium/third_party/WebKit/Source/core/testing/InspectorFrontendClientLocal.h
@@ -32,9 +32,9 @@
#define InspectorFrontendClientLocal_h
#include "core/inspector/InspectorFrontendClient.h"
-#include "wtf/Forward.h"
-#include "wtf/Noncopyable.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/Forward.h>
+#include <wtf/Noncopyable.h>
+#include <wtf/text/WTFString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/testing/Internals.cpp b/chromium/third_party/WebKit/Source/core/testing/Internals.cpp
index 63285fab580..dba52a6173c 100644
--- a/chromium/third_party/WebKit/Source/core/testing/Internals.cpp
+++ b/chromium/third_party/WebKit/Source/core/testing/Internals.cpp
@@ -41,7 +41,6 @@
#include "bindings/v8/ExceptionState.h"
#include "bindings/v8/SerializedScriptValue.h"
#include "bindings/v8/V8ThrowException.h"
-#include "core/animation/DocumentTimeline.h"
#include "core/css/StyleSheetContents.h"
#include "core/css/resolver/StyleResolver.h"
#include "core/css/resolver/ViewportStyleResolver.h"
@@ -68,8 +67,6 @@
#include "core/editing/Editor.h"
#include "core/editing/SpellChecker.h"
#include "core/editing/TextIterator.h"
-#include "core/fetch/MemoryCache.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/history/BackForwardController.h"
#include "core/history/HistoryItem.h"
#include "core/html/FormController.h"
@@ -87,6 +84,8 @@
#include "core/inspector/InspectorOverlay.h"
#include "core/inspector/InstrumentingAgents.h"
#include "core/loader/FrameLoader.h"
+#include "core/loader/cache/MemoryCache.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/Chrome.h"
#include "core/page/ChromeClient.h"
#include "core/page/DOMPoint.h"
@@ -110,9 +109,7 @@
#include "core/platform/graphics/filters/FilterOperations.h"
#include "core/platform/graphics/gpu/SharedGraphicsContext3D.h"
#include "core/platform/mock/PlatformSpeechSynthesizerMock.h"
-#include "core/rendering/RenderLayer.h"
#include "core/rendering/RenderLayerBacking.h"
-#include "core/rendering/RenderLayerCompositor.h"
#include "core/rendering/RenderMenuList.h"
#include "core/rendering/RenderObject.h"
#include "core/rendering/RenderTreeAsText.h"
@@ -121,7 +118,6 @@
#include "core/workers/WorkerThread.h"
#include "modules/speech/DOMWindowSpeechSynthesis.h"
#include "modules/speech/SpeechSynthesis.h"
-#include "public/platform/WebLayer.h"
#include "weborigin/SchemeRegistry.h"
#include "wtf/dtoa.h"
#include "wtf/text/StringBuffer.h"
@@ -186,6 +182,9 @@ PassRefPtr<Internals> Internals::create(Document* document)
Internals::~Internals()
{
+ if (m_scrollingCoordinator) {
+ m_scrollingCoordinator->removeTouchEventTargetRectsObserver(this);
+ }
}
void Internals::resetToConsistentState(Page* page)
@@ -211,7 +210,11 @@ Internals::Internals(Document* document)
: ContextLifecycleObserver(document)
, m_runtimeFlags(InternalRuntimeFlags::create())
, m_scrollingCoordinator(document->page()->scrollingCoordinator())
+ , m_touchEventTargetRectUpdateCount(0)
{
+ if (m_scrollingCoordinator) {
+ m_scrollingCoordinator->addTouchEventTargetRectsObserver(this);
+ }
}
Document* Internals::contextDocument() const
@@ -411,10 +414,10 @@ unsigned short Internals::compareTreeScopePosition(const Node* node1, const Node
unsigned Internals::numberOfActiveAnimations() const
{
Frame* contextFrame = frame();
- if (RuntimeEnabledFeatures::webAnimationsCSSEnabled())
- return frame()->document()->timeline()->numberOfActiveAnimationsForTesting();
- if (AnimationController* controller = contextFrame->animation())
- return controller->numberOfActiveAnimations(contextFrame->document());
+ if (!RuntimeEnabledFeatures::webAnimationsCSSEnabled()) {
+ if (AnimationController* controller = contextFrame->animation())
+ return controller->numberOfActiveAnimations(contextFrame->document());
+ }
return 0;
}
@@ -457,9 +460,7 @@ void Internals::pauseAnimations(double pauseTime, ExceptionState& es)
return;
}
- if (RuntimeEnabledFeatures::webAnimationsCSSEnabled())
- frame()->document()->timeline()->pauseAnimationsForTesting(pauseTime);
- else
+ if (!RuntimeEnabledFeatures::webAnimationsCSSEnabled())
frame()->animation()->pauseAnimationsForTesting(pauseTime);
}
@@ -1293,126 +1294,48 @@ unsigned Internals::touchEventHandlerCount(Document* document, ExceptionState& e
return count;
}
-static RenderLayer* findRenderLayerForGraphicsLayer(RenderLayer* searchRoot, GraphicsLayer* graphicsLayer, String* layerType)
+LayerRectList* Internals::touchEventTargetLayerRects(Document* document, ExceptionState& es)
{
- if (searchRoot->backing() && graphicsLayer == searchRoot->backing()->graphicsLayer())
- return searchRoot;
-
- if (graphicsLayer == searchRoot->layerForScrolling()) {
- *layerType = "scrolling";
- return searchRoot;
- }
-
- if (graphicsLayer == searchRoot->layerForHorizontalScrollbar()) {
- *layerType = "horizontalScrollbar";
- return searchRoot;
- }
-
- if (graphicsLayer == searchRoot->layerForVerticalScrollbar()) {
- *layerType = "verticalScrollbar";
- return searchRoot;
- }
-
- if (graphicsLayer == searchRoot->layerForScrollCorner()) {
- *layerType = "scrollCorner";
- return searchRoot;
- }
-
- for (RenderLayer* child = searchRoot->firstChild(); child; child = child->nextSibling()) {
- RenderLayer* foundLayer = findRenderLayerForGraphicsLayer(child, graphicsLayer, layerType);
- if (foundLayer)
- return foundLayer;
- }
-
- return 0;
-}
-
-// Given a vector of rects, merge those that are adjacent, leaving empty rects
-// in the place of no longer used slots. This is intended to simplify the list
-// of rects returned by an SkRegion (which have been split apart for sorting
-// purposes). No attempt is made to do this efficiently (eg. by relying on the
-// sort criteria of SkRegion).
-static void mergeRects(WebKit::WebVector<WebKit::WebRect>& rects)
-{
- for (size_t i = 0; i < rects.size(); ++i) {
- if (rects[i].isEmpty())
- continue;
- bool updated;
- do {
- updated = false;
- for (size_t j = i+1; j < rects.size(); ++j) {
- if (rects[j].isEmpty())
- continue;
- // Try to merge rects[j] into rects[i] along the 4 possible edges.
- if (rects[i].y == rects[j].y && rects[i].height == rects[j].height) {
- if (rects[i].x + rects[i].width == rects[j].x) {
- rects[i].width += rects[j].width;
- rects[j] = WebKit::WebRect();
- updated = true;
- } else if (rects[i].x == rects[j].x + rects[j].width) {
- rects[i].x = rects[j].x;
- rects[i].width += rects[j].width;
- rects[j] = WebKit::WebRect();
- updated = true;
- }
- } else if (rects[i].x == rects[j].x && rects[i].width == rects[j].width) {
- if (rects[i].y + rects[i].height == rects[j].y) {
- rects[i].height += rects[j].height;
- rects[j] = WebKit::WebRect();
- updated = true;
- } else if (rects[i].y == rects[j].y + rects[j].height) {
- rects[i].y = rects[j].y;
- rects[i].height += rects[j].height;
- rects[j] = WebKit::WebRect();
- updated = true;
- }
- }
- }
- } while (updated);
- }
-}
-
-static void accumulateLayerRectList(RenderLayerCompositor* compositor, GraphicsLayer* graphicsLayer, LayerRectList* rects)
-{
- WebKit::WebVector<WebKit::WebRect> layerRects = graphicsLayer->platformLayer()->touchEventHandlerRegion();
- if (!layerRects.isEmpty()) {
- mergeRects(layerRects);
- String layerType;
- RenderLayer* renderLayer = findRenderLayerForGraphicsLayer(compositor->rootRenderLayer(), graphicsLayer, &layerType);
- Node* node = renderLayer ? renderLayer->renderer()->node() : 0;
- for (size_t i = 0; i < layerRects.size(); ++i) {
- if (!layerRects[i].isEmpty())
- rects->append(node, layerType, ClientRect::create(layerRects[i]));
- }
+ if (!document || !document->view() || !document->page() || document != contextDocument()) {
+ es.throwDOMException(InvalidAccessError);
+ return 0;
}
- size_t numChildren = graphicsLayer->children().size();
- for (size_t i = 0; i < numChildren; ++i)
- accumulateLayerRectList(compositor, graphicsLayer->children()[i], rects);
+ // Do any pending layouts (which may call touchEventTargetRectsChange) to ensure this
+ // really takes any previous changes into account.
+ document->updateLayout();
+ return m_currentTouchEventRects.get();
}
-PassRefPtr<LayerRectList> Internals::touchEventTargetLayerRects(Document* document, ExceptionState& es)
+unsigned Internals::touchEventTargetLayerRectsUpdateCount(Document* document, ExceptionState& es)
{
if (!document || !document->view() || !document->page() || document != contextDocument()) {
es.throwDOMException(InvalidAccessError);
return 0;
}
- // Do any pending layouts (which may call touchEventTargetRectsChange) to ensure this
- // really takes any previous changes into account.
+ // Do any pending layouts to ensure this really takes any previous changes into account.
document->updateLayout();
- if (RenderView* view = document->renderView()) {
- if (RenderLayerCompositor* compositor = view->compositor()) {
- if (GraphicsLayer* rootLayer = compositor->rootGraphicsLayer()) {
- RefPtr<LayerRectList> rects = LayerRectList::create();
- accumulateLayerRectList(compositor, rootLayer, rects.get());
- return rects;
- }
+ return m_touchEventTargetRectUpdateCount;
+}
+
+void Internals::touchEventTargetRectsChanged(const LayerHitTestRects& rects)
+{
+ // When profiling content_shell, it can be handy to exclude this time (since it's only
+ // present for testing / debugging).
+ TRACE_EVENT0("input", "Internals::touchEventTargetRectsChanged");
+
+ m_touchEventTargetRectUpdateCount++;
+
+ // Since it's not safe to hang onto the pointers in a LayerHitTestRects, we immediately
+ // copy into a LayerRectList.
+ m_currentTouchEventRects = LayerRectList::create();
+ for (LayerHitTestRects::const_iterator iter = rects.begin(); iter != rects.end(); ++iter) {
+ for (size_t i = 0; i < iter->value.size(); ++i) {
+ m_currentTouchEventRects->append(iter->key->renderer()->node(), ClientRect::create(enclosingIntRect(iter->value[i])));
}
}
-
- return 0;
}
PassRefPtr<NodeList> Internals::nodesFromRect(Document* document, int centerX, int centerY, unsigned topPadding, unsigned rightPadding,
diff --git a/chromium/third_party/WebKit/Source/core/testing/Internals.h b/chromium/third_party/WebKit/Source/core/testing/Internals.h
index bbba5ffdde4..bde21e22f4e 100644
--- a/chromium/third_party/WebKit/Source/core/testing/Internals.h
+++ b/chromium/third_party/WebKit/Source/core/testing/Internals.h
@@ -33,10 +33,10 @@
#include "core/dom/ContextLifecycleObserver.h"
#include "core/dom/NodeList.h"
#include "core/page/scrolling/ScrollingCoordinator.h"
-#include "wtf/ArrayBuffer.h"
-#include "wtf/PassRefPtr.h"
-#include "wtf/RefCounted.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/ArrayBuffer.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
+#include <wtf/text/WTFString.h>
namespace WebCore {
@@ -67,7 +67,8 @@ class ShadowRoot;
class TypeConversions;
class Internals : public RefCounted<Internals>
- , public ContextLifecycleObserver {
+ , public ContextLifecycleObserver
+ , public ScrollingCoordinator::TouchEventTargetRectsObserver {
public:
static PassRefPtr<Internals> create(Document*);
virtual ~Internals();
@@ -181,7 +182,9 @@ public:
unsigned wheelEventHandlerCount(Document*, ExceptionState&);
unsigned touchEventHandlerCount(Document*, ExceptionState&);
- PassRefPtr<LayerRectList> touchEventTargetLayerRects(Document*, ExceptionState&);
+ LayerRectList* touchEventTargetLayerRects(Document*, ExceptionState&);
+ unsigned touchEventTargetLayerRectsUpdateCount(Document*, ExceptionState&);
+ virtual void touchEventTargetRectsChanged(const LayerHitTestRects&);
// This is used to test rect based hit testing like what's done on touch screens.
PassRefPtr<NodeList> nodesFromRect(Document*, int x, int y, unsigned topPadding, unsigned rightPadding,
@@ -304,6 +307,8 @@ private:
OwnPtr<InspectorFrontendChannelDummy> m_frontendChannel;
RefPtr<InternalRuntimeFlags> m_runtimeFlags;
RefPtr<ScrollingCoordinator> m_scrollingCoordinator;
+ int m_touchEventTargetRectUpdateCount;
+ RefPtr<LayerRectList> m_currentTouchEventRects;
RefPtr<InternalProfilers> m_profilers;
};
diff --git a/chromium/third_party/WebKit/Source/core/testing/Internals.idl b/chromium/third_party/WebKit/Source/core/testing/Internals.idl
index 65a304e81be..d521c04ebe5 100644
--- a/chromium/third_party/WebKit/Source/core/testing/Internals.idl
+++ b/chromium/third_party/WebKit/Source/core/testing/Internals.idl
@@ -142,7 +142,7 @@
[RaisesException] unsigned long wheelEventHandlerCount(Document document);
[RaisesException] unsigned long touchEventHandlerCount(Document document);
[RaisesException] LayerRectList touchEventTargetLayerRects(Document document);
-
+ [RaisesException] unsigned long touchEventTargetLayerRectsUpdateCount(Document document);
[RaisesException] NodeList nodesFromRect(Document document, long x, long y,
unsigned long topPadding, unsigned long rightPadding, unsigned long bottomPadding, unsigned long leftPadding,
diff --git a/chromium/third_party/WebKit/Source/core/testing/LayerRect.h b/chromium/third_party/WebKit/Source/core/testing/LayerRect.h
index 4827feee4f2..f945681417f 100644
--- a/chromium/third_party/WebKit/Source/core/testing/LayerRect.h
+++ b/chromium/third_party/WebKit/Source/core/testing/LayerRect.h
@@ -36,7 +36,6 @@
#include "wtf/PassRefPtr.h"
#include "wtf/RefCounted.h"
#include "wtf/RefPtr.h"
-#include "wtf/text/WTFString.h"
namespace WebCore {
@@ -44,25 +43,22 @@ class Node;
class LayerRect : public RefCounted<LayerRect> {
public:
- static PassRefPtr<LayerRect> create(PassRefPtr<Node> node, const String& layerType, PassRefPtr<ClientRect> rect)
+ static PassRefPtr<LayerRect> create(PassRefPtr<Node> node, PassRefPtr<ClientRect> rect)
{
- return adoptRef(new LayerRect(node, layerType, rect));
+ return adoptRef(new LayerRect(node, rect));
}
Node* layerRootNode() const { return m_layerRootNode.get(); }
- String layerType() const { return m_layerType; }
ClientRect* layerRelativeRect() const { return m_rect.get(); }
private:
- LayerRect(PassRefPtr<Node> node, const String& layerName, PassRefPtr<ClientRect> rect)
+ LayerRect(PassRefPtr<Node> node, PassRefPtr<ClientRect> rect)
: m_layerRootNode(node)
- , m_layerType(layerName)
, m_rect(rect)
{
}
RefPtr<Node> m_layerRootNode;
- String m_layerType;
RefPtr<ClientRect> m_rect;
};
diff --git a/chromium/third_party/WebKit/Source/core/testing/LayerRect.idl b/chromium/third_party/WebKit/Source/core/testing/LayerRect.idl
index 8a4d8e17f18..50994ab58e9 100644
--- a/chromium/third_party/WebKit/Source/core/testing/LayerRect.idl
+++ b/chromium/third_party/WebKit/Source/core/testing/LayerRect.idl
@@ -31,6 +31,5 @@
[
] interface LayerRect {
readonly attribute Node layerRootNode;
- readonly attribute DOMString layerType;
readonly attribute ClientRect layerRelativeRect;
};
diff --git a/chromium/third_party/WebKit/Source/core/testing/LayerRectList.cpp b/chromium/third_party/WebKit/Source/core/testing/LayerRectList.cpp
index 4e8b9911983..578b407a6f4 100644
--- a/chromium/third_party/WebKit/Source/core/testing/LayerRectList.cpp
+++ b/chromium/third_party/WebKit/Source/core/testing/LayerRectList.cpp
@@ -58,9 +58,9 @@ LayerRect* LayerRectList::item(unsigned index)
return m_list[index].get();
}
-void LayerRectList::append(PassRefPtr<Node> layerRootNode, const String& layerType, PassRefPtr<ClientRect> layerRelativeRect)
+void LayerRectList::append(PassRefPtr<Node> layerRootNode, PassRefPtr<ClientRect> layerRelativeRect)
{
- m_list.append(LayerRect::create(layerRootNode, layerType, layerRelativeRect));
+ m_list.append(LayerRect::create(layerRootNode, layerRelativeRect));
}
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/core/testing/LayerRectList.h b/chromium/third_party/WebKit/Source/core/testing/LayerRectList.h
index ec1582b8b99..d46d1dc78b8 100644
--- a/chromium/third_party/WebKit/Source/core/testing/LayerRectList.h
+++ b/chromium/third_party/WebKit/Source/core/testing/LayerRectList.h
@@ -35,7 +35,6 @@
#include "wtf/PassRefPtr.h"
#include "wtf/RefCounted.h"
#include "wtf/Vector.h"
-#include "wtf/text/WTFString.h"
namespace WebCore {
@@ -51,7 +50,7 @@ public:
unsigned length() const;
LayerRect* item(unsigned index);
- void append(PassRefPtr<Node> layerRootNode, const String& layerName, PassRefPtr<ClientRect> layerRelativeRect);
+ void append(PassRefPtr<Node> layerRootNode, PassRefPtr<ClientRect> layerRelativeRect);
private:
LayerRectList();
diff --git a/chromium/third_party/WebKit/Source/core/testing/MallocStatistics.h b/chromium/third_party/WebKit/Source/core/testing/MallocStatistics.h
index bc4da8562ca..3f07bbd9f71 100644
--- a/chromium/third_party/WebKit/Source/core/testing/MallocStatistics.h
+++ b/chromium/third_party/WebKit/Source/core/testing/MallocStatistics.h
@@ -26,9 +26,9 @@
#ifndef MallocStatistics_h
#define MallocStatistics_h
-#include "wtf/FastMalloc.h"
-#include "wtf/PassRefPtr.h"
-#include "wtf/RefCounted.h"
+#include <wtf/FastMalloc.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/testing/MockPagePopupDriver.h b/chromium/third_party/WebKit/Source/core/testing/MockPagePopupDriver.h
index e1f90aa54d0..154815be362 100644
--- a/chromium/third_party/WebKit/Source/core/testing/MockPagePopupDriver.h
+++ b/chromium/third_party/WebKit/Source/core/testing/MockPagePopupDriver.h
@@ -28,7 +28,7 @@
#include "core/page/PagePopupClient.h"
#include "core/page/PagePopupDriver.h"
-#include "wtf/RefPtr.h"
+#include <wtf/RefPtr.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/testing/TypeConversions.h b/chromium/third_party/WebKit/Source/core/testing/TypeConversions.h
index 10f675f42f4..b8cde7bf27a 100644
--- a/chromium/third_party/WebKit/Source/core/testing/TypeConversions.h
+++ b/chromium/third_party/WebKit/Source/core/testing/TypeConversions.h
@@ -26,9 +26,9 @@
#ifndef TypeConversions_h
#define TypeConversions_h
-#include "wtf/FastMalloc.h"
-#include "wtf/PassRefPtr.h"
-#include "wtf/RefCounted.h"
+#include <wtf/FastMalloc.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/AbstractWorker.cpp b/chromium/third_party/WebKit/Source/core/workers/AbstractWorker.cpp
index 24e9bb88a92..e4b9c7f177f 100644
--- a/chromium/third_party/WebKit/Source/core/workers/AbstractWorker.cpp
+++ b/chromium/third_party/WebKit/Source/core/workers/AbstractWorker.cpp
@@ -57,24 +57,24 @@ void AbstractWorker::contextDestroyed()
KURL AbstractWorker::resolveURL(const String& url, ExceptionState& es)
{
if (url.isEmpty()) {
- es.throwDOMException(SyntaxError, "Failed to create a worker: an empty URL was provided.");
+ es.throwDOMException(SyntaxError);
return KURL();
}
// FIXME: This should use the dynamic global scope (bug #27887)
KURL scriptURL = scriptExecutionContext()->completeURL(url);
if (!scriptURL.isValid()) {
- es.throwDOMException(SyntaxError, "Failed to create a worker: '" + url + "' is not a valid URL.");
+ es.throwDOMException(SyntaxError);
return KURL();
}
if (!scriptExecutionContext()->securityOrigin()->canRequest(scriptURL)) {
- es.throwDOMException(SecurityError, "Failed to create a worker: script with origin '" + SecurityOrigin::create(scriptURL)->toString() + "' cannot be accessed from origin '" + scriptExecutionContext()->securityOrigin()->toString() + "'.");
+ es.throwDOMException(SecurityError);
return KURL();
}
if (scriptExecutionContext()->contentSecurityPolicy() && !scriptExecutionContext()->contentSecurityPolicy()->allowScriptFromSource(scriptURL)) {
- es.throwDOMException(SecurityError, "Failed to create a worker: access to the script at '" + url + "' is denied by the document's Content Security Policy.");
+ es.throwDOMException(SecurityError);
return KURL();
}
diff --git a/chromium/third_party/WebKit/Source/core/workers/AbstractWorker.h b/chromium/third_party/WebKit/Source/core/workers/AbstractWorker.h
index de94684d9bd..5805534924f 100644
--- a/chromium/third_party/WebKit/Source/core/workers/AbstractWorker.h
+++ b/chromium/third_party/WebKit/Source/core/workers/AbstractWorker.h
@@ -36,10 +36,10 @@
#include "core/dom/EventListener.h"
#include "core/dom/EventNames.h"
#include "core/dom/EventTarget.h"
-#include "wtf/PassRefPtr.h"
-#include "wtf/RefCounted.h"
-#include "wtf/RefPtr.h"
-#include "wtf/text/AtomicStringHash.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
+#include <wtf/RefPtr.h>
+#include <wtf/text/AtomicStringHash.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/DefaultSharedWorkerRepository.h b/chromium/third_party/WebKit/Source/core/workers/DefaultSharedWorkerRepository.h
index 6cf1ee1b450..1237988ab14 100644
--- a/chromium/third_party/WebKit/Source/core/workers/DefaultSharedWorkerRepository.h
+++ b/chromium/third_party/WebKit/Source/core/workers/DefaultSharedWorkerRepository.h
@@ -32,14 +32,14 @@
#define DefaultSharedWorkerRepository_h
#include "core/page/ContentSecurityPolicy.h"
-#include "wtf/Forward.h"
-#include "wtf/HashMap.h"
-#include "wtf/Noncopyable.h"
-#include "wtf/PassOwnPtr.h"
-#include "wtf/PassRefPtr.h"
-#include "wtf/RefPtr.h"
-#include "wtf/Threading.h"
-#include "wtf/text/StringHash.h"
+#include <wtf/Forward.h>
+#include <wtf/HashMap.h>
+#include <wtf/Noncopyable.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+#include <wtf/text/StringHash.h>
+#include <wtf/Threading.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/SharedWorker.cpp b/chromium/third_party/WebKit/Source/core/workers/SharedWorker.cpp
index 6ccf3e4fd91..55019ec7dc5 100644
--- a/chromium/third_party/WebKit/Source/core/workers/SharedWorker.cpp
+++ b/chromium/third_party/WebKit/Source/core/workers/SharedWorker.cpp
@@ -65,18 +65,18 @@ PassRefPtr<SharedWorker> SharedWorker::create(ScriptExecutionContext* context, c
worker->suspendIfNeeded();
+ KURL scriptURL = worker->resolveURL(url, es);
+ if (scriptURL.isEmpty())
+ return 0;
+
// We don't currently support nested workers, so workers can only be created from documents.
ASSERT_WITH_SECURITY_IMPLICATION(context->isDocument());
Document* document = toDocument(context);
if (!document->securityOrigin()->canAccessSharedWorkers()) {
- es.throwDOMException(SecurityError, "Failed to create 'SharedWorker': access to shared workers is denied to origin '" + document->securityOrigin()->toString() + "'.");
+ es.throwDOMException(SecurityError);
return 0;
}
- KURL scriptURL = worker->resolveURL(url, es);
- if (scriptURL.isEmpty())
- return 0;
-
SharedWorkerRepository::connect(worker.get(), remotePort.release(), scriptURL, name, es);
return worker.release();
diff --git a/chromium/third_party/WebKit/Source/core/workers/SharedWorkerRepository.h b/chromium/third_party/WebKit/Source/core/workers/SharedWorkerRepository.h
index 26d15cbf068..6a3927af560 100644
--- a/chromium/third_party/WebKit/Source/core/workers/SharedWorkerRepository.h
+++ b/chromium/third_party/WebKit/Source/core/workers/SharedWorkerRepository.h
@@ -31,9 +31,9 @@
#ifndef SharedWorkerRepository_h
#define SharedWorkerRepository_h
-#include "wtf/Forward.h"
-#include "wtf/PassOwnPtr.h"
-#include "wtf/PassRefPtr.h"
+#include <wtf/Forward.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/Worker.cpp b/chromium/third_party/WebKit/Source/core/workers/Worker.cpp
index 52d852393ae..c94d08c4e70 100644
--- a/chromium/third_party/WebKit/Source/core/workers/Worker.cpp
+++ b/chromium/third_party/WebKit/Source/core/workers/Worker.cpp
@@ -33,9 +33,9 @@
#include "core/dom/EventListener.h"
#include "core/dom/EventNames.h"
#include "core/dom/MessageEvent.h"
-#include "core/fetch/ResourceFetcher.h"
#include "core/inspector/InspectorInstrumentation.h"
#include "core/loader/FrameLoader.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/DOMWindow.h"
#include "core/page/Frame.h"
#include "core/page/UseCounter.h"
diff --git a/chromium/third_party/WebKit/Source/core/workers/Worker.h b/chromium/third_party/WebKit/Source/core/workers/Worker.h
index 023578a9f21..3f0eb1a166c 100644
--- a/chromium/third_party/WebKit/Source/core/workers/Worker.h
+++ b/chromium/third_party/WebKit/Source/core/workers/Worker.h
@@ -34,10 +34,10 @@
#include "core/dom/MessagePort.h"
#include "core/workers/AbstractWorker.h"
#include "core/workers/WorkerScriptLoaderClient.h"
-#include "wtf/Forward.h"
-#include "wtf/PassRefPtr.h"
-#include "wtf/RefPtr.h"
-#include "wtf/text/AtomicStringHash.h"
+#include <wtf/Forward.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+#include <wtf/text/AtomicStringHash.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/WorkerEventQueue.h b/chromium/third_party/WebKit/Source/core/workers/WorkerEventQueue.h
index fda0b93eed9..5eb85673b5a 100644
--- a/chromium/third_party/WebKit/Source/core/workers/WorkerEventQueue.h
+++ b/chromium/third_party/WebKit/Source/core/workers/WorkerEventQueue.h
@@ -28,10 +28,10 @@
#define WorkerEventQueue_h
#include "core/dom/EventQueue.h"
-#include "wtf/HashMap.h"
-#include "wtf/HashSet.h"
-#include "wtf/PassOwnPtr.h"
-#include "wtf/RefCounted.h"
+#include <wtf/HashMap.h>
+#include <wtf/HashSet.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/RefCounted.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp b/chromium/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
index 374aa7e4726..f80e1ffce1f 100644
--- a/chromium/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
+++ b/chromium/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
@@ -194,7 +194,7 @@ void WorkerGlobalScope::importScripts(const Vector<String>& urls, ExceptionState
for (Vector<String>::const_iterator it = urls.begin(); it != urlsEnd; ++it) {
const KURL& url = scriptExecutionContext()->completeURL(*it);
if (!url.isValid()) {
- es.throwDOMException(SyntaxError, "Failed to execute 'importScripts': the URL '" + *it + "' is invalid.");
+ es.throwDOMException(SyntaxError);
return;
}
completedURLs.append(url);
@@ -208,7 +208,7 @@ void WorkerGlobalScope::importScripts(const Vector<String>& urls, ExceptionState
// If the fetching attempt failed, throw a NetworkError exception and abort all these steps.
if (scriptLoader->failed()) {
- es.throwDOMException(NetworkError, "Failed to execute 'importScripts': the script at '" + it->elidedString() + "' failed to load.");
+ es.throwDOMException(NetworkError);
return;
}
diff --git a/chromium/third_party/WebKit/Source/core/workers/WorkerGlobalScope.idl b/chromium/third_party/WebKit/Source/core/workers/WorkerGlobalScope.idl
index f7a445e3fd7..87c3594f8f7 100644
--- a/chromium/third_party/WebKit/Source/core/workers/WorkerGlobalScope.idl
+++ b/chromium/third_party/WebKit/Source/core/workers/WorkerGlobalScope.idl
@@ -37,7 +37,7 @@
attribute EventHandler onerror;
// WorkerUtils
- [RaisesException] void importScripts(DOMString... urls);
+ [Custom] void importScripts(/*[Variadic] in DOMString urls */);
[Replaceable] readonly attribute WorkerNavigator navigator;
// Additional constructors
diff --git a/chromium/third_party/WebKit/Source/core/workers/WorkerLoaderProxy.h b/chromium/third_party/WebKit/Source/core/workers/WorkerLoaderProxy.h
index f3eed8dc807..3342d900d77 100644
--- a/chromium/third_party/WebKit/Source/core/workers/WorkerLoaderProxy.h
+++ b/chromium/third_party/WebKit/Source/core/workers/WorkerLoaderProxy.h
@@ -32,8 +32,8 @@
#define WorkerLoaderProxy_h
#include "core/dom/ScriptExecutionContext.h"
-#include "wtf/Forward.h"
-#include "wtf/PassOwnPtr.h"
+#include <wtf/Forward.h>
+#include <wtf/PassOwnPtr.h>
namespace WebKit {
class WebWorkerBase;
diff --git a/chromium/third_party/WebKit/Source/core/workers/WorkerLocation.cpp b/chromium/third_party/WebKit/Source/core/workers/WorkerLocation.cpp
index c93e8d1be15..87b509067c6 100644
--- a/chromium/third_party/WebKit/Source/core/workers/WorkerLocation.cpp
+++ b/chromium/third_party/WebKit/Source/core/workers/WorkerLocation.cpp
@@ -25,9 +25,10 @@
*/
#include "config.h"
+
#include "core/workers/WorkerLocation.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/text/WTFString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.cpp b/chromium/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.cpp
index 9794ea62322..eb15b16300e 100644
--- a/chromium/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.cpp
+++ b/chromium/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.cpp
@@ -49,7 +49,7 @@
#include "core/workers/Worker.h"
#include "core/workers/WorkerClients.h"
#include "core/workers/WorkerThreadStartupData.h"
-#include "wtf/MainThread.h"
+#include <wtf/MainThread.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.h b/chromium/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.h
index 26566bfb2b5..9b2113bd4ae 100644
--- a/chromium/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.h
+++ b/chromium/third_party/WebKit/Source/core/workers/WorkerMessagingProxy.h
@@ -31,12 +31,12 @@
#include "core/workers/WorkerGlobalScopeProxy.h"
#include "core/workers/WorkerLoaderProxy.h"
#include "core/workers/WorkerObjectProxy.h"
-#include "wtf/Forward.h"
-#include "wtf/Noncopyable.h"
-#include "wtf/PassOwnPtr.h"
-#include "wtf/PassRefPtr.h"
-#include "wtf/RefPtr.h"
-#include "wtf/Vector.h"
+#include <wtf/Forward.h>
+#include <wtf/Noncopyable.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+#include <wtf/Vector.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/WorkerObjectProxy.h b/chromium/third_party/WebKit/Source/core/workers/WorkerObjectProxy.h
index d0061f752ac..d4da8699306 100644
--- a/chromium/third_party/WebKit/Source/core/workers/WorkerObjectProxy.h
+++ b/chromium/third_party/WebKit/Source/core/workers/WorkerObjectProxy.h
@@ -33,7 +33,7 @@
#include "core/dom/MessagePort.h"
#include "core/workers/WorkerReportingProxy.h"
-#include "wtf/PassOwnPtr.h"
+#include <wtf/PassOwnPtr.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/WorkerReportingProxy.h b/chromium/third_party/WebKit/Source/core/workers/WorkerReportingProxy.h
index daa8f500b45..a42df140dd0 100644
--- a/chromium/third_party/WebKit/Source/core/workers/WorkerReportingProxy.h
+++ b/chromium/third_party/WebKit/Source/core/workers/WorkerReportingProxy.h
@@ -32,7 +32,7 @@
#define WorkerReportingProxy_h
#include "core/page/ConsoleTypes.h"
-#include "wtf/Forward.h"
+#include <wtf/Forward.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/WorkerRunLoop.cpp b/chromium/third_party/WebKit/Source/core/workers/WorkerRunLoop.cpp
index e2d2a040f1b..a0744ccebbf 100644
--- a/chromium/third_party/WebKit/Source/core/workers/WorkerRunLoop.cpp
+++ b/chromium/third_party/WebKit/Source/core/workers/WorkerRunLoop.cpp
@@ -37,7 +37,7 @@
#include "core/platform/ThreadTimers.h"
#include "core/workers/WorkerGlobalScope.h"
#include "core/workers/WorkerThread.h"
-#include "wtf/CurrentTime.h"
+#include <wtf/CurrentTime.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/WorkerRunLoop.h b/chromium/third_party/WebKit/Source/core/workers/WorkerRunLoop.h
index 8ee3e8eadf4..28a7bc5bf82 100644
--- a/chromium/third_party/WebKit/Source/core/workers/WorkerRunLoop.h
+++ b/chromium/third_party/WebKit/Source/core/workers/WorkerRunLoop.h
@@ -32,9 +32,9 @@
#define WorkerRunLoop_h
#include "core/dom/ScriptExecutionContext.h"
-#include "wtf/MessageQueue.h"
-#include "wtf/OwnPtr.h"
-#include "wtf/PassOwnPtr.h"
+#include <wtf/MessageQueue.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp b/chromium/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp
index 7f6290e683a..9c10f8b70bd 100644
--- a/chromium/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/workers/WorkerScriptLoader.cpp
@@ -26,6 +26,7 @@
*/
#include "config.h"
+
#include "core/workers/WorkerScriptLoader.h"
#include "core/dom/ScriptExecutionContext.h"
@@ -35,9 +36,9 @@
#include "core/workers/WorkerGlobalScope.h"
#include "core/workers/WorkerScriptLoaderClient.h"
-#include "wtf/OwnPtr.h"
-#include "wtf/RefPtr.h"
-#include "wtf/UnusedParam.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/RefPtr.h>
+#include <wtf/UnusedParam.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/DOMParser.cpp b/chromium/third_party/WebKit/Source/core/xml/DOMParser.cpp
index b923b46ec23..561b34d57a9 100644
--- a/chromium/third_party/WebKit/Source/core/xml/DOMParser.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/DOMParser.cpp
@@ -21,7 +21,7 @@
#include "core/dom/DOMImplementation.h"
#include "core/dom/Document.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/text/WTFString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/NativeXPathNSResolver.cpp b/chromium/third_party/WebKit/Source/core/xml/NativeXPathNSResolver.cpp
index 8ae8c04db12..e398afd373b 100644
--- a/chromium/third_party/WebKit/Source/core/xml/NativeXPathNSResolver.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/NativeXPathNSResolver.cpp
@@ -28,7 +28,7 @@
#include "XMLNames.h"
#include "core/dom/Node.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/text/WTFString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/NativeXPathNSResolver.h b/chromium/third_party/WebKit/Source/core/xml/NativeXPathNSResolver.h
index 17a1238ba10..00e04fd839b 100644
--- a/chromium/third_party/WebKit/Source/core/xml/NativeXPathNSResolver.h
+++ b/chromium/third_party/WebKit/Source/core/xml/NativeXPathNSResolver.h
@@ -27,7 +27,7 @@
#define NativeXPathNSResolver_h
#include "core/xml/XPathNSResolver.h"
-#include "wtf/RefPtr.h"
+#include <wtf/RefPtr.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XMLErrors.cpp b/chromium/third_party/WebKit/Source/core/xml/XMLErrors.cpp
index acef59f78ef..2c1bd853564 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XMLErrors.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XMLErrors.cpp
@@ -34,7 +34,7 @@
#include "core/dom/Document.h"
#include "core/dom/Element.h"
#include "core/dom/Text.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/text/WTFString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XMLErrors.h b/chromium/third_party/WebKit/Source/core/xml/XMLErrors.h
index 7adfd1e3a7f..d45a25903c5 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XMLErrors.h
+++ b/chromium/third_party/WebKit/Source/core/xml/XMLErrors.h
@@ -29,8 +29,8 @@
#ifndef XMLErrors_h
#define XMLErrors_h
-#include "wtf/text/StringBuilder.h"
-#include "wtf/text/TextPosition.h"
+#include <wtf/text/StringBuilder.h>
+#include <wtf/text/TextPosition.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XMLHttpRequest.cpp b/chromium/third_party/WebKit/Source/core/xml/XMLHttpRequest.cpp
index 9dc97ee7509..e65a4a720fd 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XMLHttpRequest.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XMLHttpRequest.cpp
@@ -260,10 +260,12 @@ Document* XMLHttpRequest::responseXML(ExceptionState& es)
return m_responseDocument.get();
}
-Blob* XMLHttpRequest::responseBlob()
+Blob* XMLHttpRequest::responseBlob(ExceptionState& es)
{
- ASSERT(m_responseTypeCode == ResponseTypeBlob);
-
+ if (m_responseTypeCode != ResponseTypeBlob) {
+ es.throwDOMException(InvalidStateError);
+ return 0;
+ }
// We always return null before DONE.
if (m_error || m_state != DONE)
return 0;
@@ -293,9 +295,12 @@ Blob* XMLHttpRequest::responseBlob()
return m_responseBlob.get();
}
-ArrayBuffer* XMLHttpRequest::responseArrayBuffer()
+ArrayBuffer* XMLHttpRequest::responseArrayBuffer(ExceptionState& es)
{
- ASSERT(m_responseTypeCode == ResponseTypeArrayBuffer);
+ if (m_responseTypeCode != ResponseTypeArrayBuffer) {
+ es.throwDOMException(InvalidStateError);
+ return 0;
+ }
if (m_error || m_state != DONE)
return 0;
diff --git a/chromium/third_party/WebKit/Source/core/xml/XMLHttpRequest.h b/chromium/third_party/WebKit/Source/core/xml/XMLHttpRequest.h
index a4316f1cdbe..fde3a84be50 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XMLHttpRequest.h
+++ b/chromium/third_party/WebKit/Source/core/xml/XMLHttpRequest.h
@@ -108,7 +108,7 @@ public:
String getResponseHeader(const AtomicString& name, ExceptionState&) const;
ScriptString responseText(ExceptionState&);
Document* responseXML(ExceptionState&);
- Blob* responseBlob();
+ Blob* responseBlob(ExceptionState&);
unsigned long timeout() const { return m_timeoutMilliseconds; }
void setTimeout(unsigned long timeout, ExceptionState&);
@@ -124,7 +124,7 @@ public:
ResponseTypeCode responseTypeCode() const { return m_responseTypeCode; }
// response attribute has custom getter.
- ArrayBuffer* responseArrayBuffer();
+ ArrayBuffer* responseArrayBuffer(ExceptionState&);
void setLastSendLineNumber(unsigned lineNumber) { m_lastSendLineNumber = lineNumber; }
void setLastSendURL(const String& url) { m_lastSendURL = url; }
diff --git a/chromium/third_party/WebKit/Source/core/xml/XMLHttpRequestUpload.cpp b/chromium/third_party/WebKit/Source/core/xml/XMLHttpRequestUpload.cpp
index 8803da05361..770e4954c7c 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XMLHttpRequestUpload.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XMLHttpRequestUpload.cpp
@@ -30,8 +30,8 @@
#include "core/dom/EventNames.h"
#include "core/xml/XMLHttpRequest.h"
#include "core/xml/XMLHttpRequestProgressEvent.h"
-#include "wtf/Assertions.h"
-#include "wtf/text/AtomicString.h"
+#include <wtf/Assertions.h>
+#include <wtf/text/AtomicString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XMLSerializer.cpp b/chromium/third_party/WebKit/Source/core/xml/XMLSerializer.cpp
index 3b056364981..ad32db4ad5a 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XMLSerializer.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XMLSerializer.cpp
@@ -24,7 +24,7 @@
#include "core/dom/Document.h"
#include "core/dom/ExceptionCode.h"
#include "core/editing/markup.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/text/WTFString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XPathExpression.cpp b/chromium/third_party/WebKit/Source/core/xml/XPathExpression.cpp
index 0850a92a65d..0e587e3cc25 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XPathExpression.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XPathExpression.cpp
@@ -34,7 +34,7 @@
#include "core/xml/XPathParser.h"
#include "core/xml/XPathResult.h"
#include "core/xml/XPathUtil.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/text/WTFString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XPathExpressionNode.cpp b/chromium/third_party/WebKit/Source/core/xml/XPathExpressionNode.cpp
index 524a48d65d4..a534976e36f 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XPathExpressionNode.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XPathExpressionNode.cpp
@@ -28,7 +28,7 @@
#include "core/xml/XPathExpressionNode.h"
#include "core/dom/Node.h"
-#include "wtf/StdLibExtras.h"
+#include <wtf/StdLibExtras.h>
namespace WebCore {
namespace XPath {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XPathExpressionNode.h b/chromium/third_party/WebKit/Source/core/xml/XPathExpressionNode.h
index 7101a562edf..64a930d2737 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XPathExpressionNode.h
+++ b/chromium/third_party/WebKit/Source/core/xml/XPathExpressionNode.h
@@ -29,9 +29,9 @@
#include "core/dom/Node.h"
#include "core/xml/XPathValue.h"
-#include "wtf/HashMap.h"
-#include "wtf/Vector.h"
-#include "wtf/text/StringHash.h"
+#include <wtf/HashMap.h>
+#include <wtf/text/StringHash.h>
+#include <wtf/Vector.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XPathFunctions.cpp b/chromium/third_party/WebKit/Source/core/xml/XPathFunctions.cpp
index 0af3a8bbfb3..0e9f977361d 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XPathFunctions.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XPathFunctions.cpp
@@ -34,8 +34,8 @@
#include "core/dom/TreeScope.h"
#include "core/xml/XPathUtil.h"
#include "core/xml/XPathValue.h"
-#include "wtf/MathExtras.h"
-#include "wtf/text/StringBuilder.h"
+#include <wtf/MathExtras.h>
+#include <wtf/text/StringBuilder.h>
namespace WebCore {
namespace XPath {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XPathGrammar.y b/chromium/third_party/WebKit/Source/core/xml/XPathGrammar.y
index a4f5b692cff..e2a8c23390d 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XPathGrammar.y
+++ b/chromium/third_party/WebKit/Source/core/xml/XPathGrammar.y
@@ -36,7 +36,7 @@
#include "core/xml/XPathPredicate.h"
#include "core/xml/XPathStep.h"
#include "core/xml/XPathVariableReference.h"
-#include "wtf/FastMalloc.h"
+#include <wtf/FastMalloc.h>
#define YYMALLOC fastMalloc
#define YYFREE fastFree
diff --git a/chromium/third_party/WebKit/Source/core/xml/XPathNodeSet.h b/chromium/third_party/WebKit/Source/core/xml/XPathNodeSet.h
index c90e395ded4..488fe8797b6 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XPathNodeSet.h
+++ b/chromium/third_party/WebKit/Source/core/xml/XPathNodeSet.h
@@ -26,8 +26,8 @@
#ifndef XPathNodeSet_h
#define XPathNodeSet_h
-#include "wtf/Forward.h"
-#include "wtf/Vector.h"
+#include <wtf/Forward.h>
+#include <wtf/Vector.h>
#include "core/dom/Node.h"
diff --git a/chromium/third_party/WebKit/Source/core/xml/XPathParser.cpp b/chromium/third_party/WebKit/Source/core/xml/XPathParser.cpp
index 3fe9b350ccf..4f2c8b26e2d 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XPathParser.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XPathParser.cpp
@@ -34,8 +34,8 @@
#include "core/xml/XPathNSResolver.h"
#include "core/xml/XPathPath.h"
#include "core/xml/XPathStep.h"
-#include "wtf/StdLibExtras.h"
-#include "wtf/text/StringHash.h"
+#include <wtf/StdLibExtras.h>
+#include <wtf/text/StringHash.h>
using namespace WebCore;
using namespace WTF;
diff --git a/chromium/third_party/WebKit/Source/core/xml/XPathPredicate.cpp b/chromium/third_party/WebKit/Source/core/xml/XPathPredicate.cpp
index 963e115a626..3a77f7d0a6c 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XPathPredicate.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XPathPredicate.cpp
@@ -32,7 +32,7 @@
#include "core/xml/XPathFunctions.h"
#include "core/xml/XPathUtil.h"
#include "core/xml/XPathValue.h"
-#include "wtf/MathExtras.h"
+#include <wtf/MathExtras.h>
namespace WebCore {
namespace XPath {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XPathUtil.cpp b/chromium/third_party/WebKit/Source/core/xml/XPathUtil.cpp
index 5967efa025d..9ee19c8bf91 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XPathUtil.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XPathUtil.cpp
@@ -29,7 +29,7 @@
#include "core/dom/ContainerNode.h"
#include "core/dom/NodeTraversal.h"
-#include "wtf/text/StringBuilder.h"
+#include <wtf/text/StringBuilder.h>
namespace WebCore {
namespace XPath {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XPathUtil.h b/chromium/third_party/WebKit/Source/core/xml/XPathUtil.h
index 9db3314ec9d..62b65994e3c 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XPathUtil.h
+++ b/chromium/third_party/WebKit/Source/core/xml/XPathUtil.h
@@ -27,8 +27,8 @@
#ifndef XPathUtil_h
#define XPathUtil_h
-#include "wtf/Forward.h"
-#include "wtf/Vector.h"
+#include <wtf/Forward.h>
+#include <wtf/Vector.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XPathValue.cpp b/chromium/third_party/WebKit/Source/core/xml/XPathValue.cpp
index 301356cd6ea..2bd56c0d86b 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XPathValue.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XPathValue.cpp
@@ -30,8 +30,8 @@
#include <limits>
#include "core/xml/XPathExpressionNode.h"
#include "core/xml/XPathUtil.h"
-#include "wtf/MathExtras.h"
-#include "wtf/StdLibExtras.h"
+#include <wtf/MathExtras.h>
+#include <wtf/StdLibExtras.h>
using std::numeric_limits;
diff --git a/chromium/third_party/WebKit/Source/core/xml/XPathValue.h b/chromium/third_party/WebKit/Source/core/xml/XPathValue.h
index c21a8dc2b4f..a693e7187f8 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XPathValue.h
+++ b/chromium/third_party/WebKit/Source/core/xml/XPathValue.h
@@ -28,7 +28,7 @@
#define XPathValue_h
#include "core/xml/XPathNodeSet.h"
-#include "wtf/text/WTFString.h"
+#include <wtf/text/WTFString.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XSLImportRule.cpp b/chromium/third_party/WebKit/Source/core/xml/XSLImportRule.cpp
index b6917afa228..242303c2172 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XSLImportRule.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XSLImportRule.cpp
@@ -24,9 +24,9 @@
#include "FetchInitiatorTypeNames.h"
#include "core/dom/Document.h"
-#include "core/fetch/FetchRequest.h"
-#include "core/fetch/ResourceFetcher.h"
-#include "core/fetch/XSLStyleSheetResource.h"
+#include "core/loader/cache/FetchRequest.h"
+#include "core/loader/cache/ResourceFetcher.h"
+#include "core/loader/cache/XSLStyleSheetResource.h"
#include "core/xml/XSLStyleSheet.h"
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XSLImportRule.h b/chromium/third_party/WebKit/Source/core/xml/XSLImportRule.h
index e78fc08585a..63355d1182c 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XSLImportRule.h
+++ b/chromium/third_party/WebKit/Source/core/xml/XSLImportRule.h
@@ -23,10 +23,10 @@
#ifndef XSLImportRule_h
#define XSLImportRule_h
-#include "core/fetch/ResourcePtr.h"
-#include "core/fetch/StyleSheetResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
+#include "core/loader/cache/StyleSheetResourceClient.h"
#include "core/xml/XSLStyleSheet.h"
-#include "wtf/PassOwnPtr.h"
+#include <wtf/PassOwnPtr.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XSLStyleSheet.h b/chromium/third_party/WebKit/Source/core/xml/XSLStyleSheet.h
index 3ca331a7beb..f7b47c53b63 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XSLStyleSheet.h
+++ b/chromium/third_party/WebKit/Source/core/xml/XSLStyleSheet.h
@@ -27,7 +27,7 @@
#include <libxslt/transform.h>
#include "core/css/StyleSheet.h"
#include "core/dom/ProcessingInstruction.h"
-#include "wtf/PassRefPtr.h"
+#include <wtf/PassRefPtr.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XSLTProcessor.cpp b/chromium/third_party/WebKit/Source/core/xml/XSLTProcessor.cpp
index d1807cd1cfb..043fd8de7e6 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XSLTProcessor.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XSLTProcessor.cpp
@@ -21,6 +21,7 @@
*/
#include "config.h"
+
#include "core/xml/XSLTProcessor.h"
#include "core/dom/DOMImplementation.h"
@@ -32,8 +33,9 @@
#include "core/page/Frame.h"
#include "core/page/FrameView.h"
#include "weborigin/SecurityOrigin.h"
-#include "wtf/Assertions.h"
-#include "wtf/Vector.h"
+
+#include <wtf/Assertions.h>
+#include <wtf/Vector.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XSLTProcessorLibxslt.cpp b/chromium/third_party/WebKit/Source/core/xml/XSLTProcessorLibxslt.cpp
index b9e111b2465..6e3866cd2fc 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XSLTProcessorLibxslt.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XSLTProcessorLibxslt.cpp
@@ -21,12 +21,22 @@
*/
#include "config.h"
+
#include "core/xml/XSLTProcessor.h"
+#include <libxslt/imports.h>
+#include <libxslt/security.h>
+#include <libxslt/variables.h>
+#include <libxslt/xsltutils.h>
+#include <wtf/Assertions.h>
+#include <wtf/text/CString.h>
+#include <wtf/text/StringBuffer.h>
+#include <wtf/unicode/UTF8.h>
+#include <wtf/Vector.h>
#include "core/dom/Document.h"
#include "core/dom/TransformSource.h"
#include "core/editing/markup.h"
-#include "core/fetch/ResourceFetcher.h"
+#include "core/loader/cache/ResourceFetcher.h"
#include "core/page/Frame.h"
#include "core/page/Page.h"
#include "core/page/PageConsole.h"
@@ -38,15 +48,6 @@
#include "core/xml/XSLTUnicodeSort.h"
#include "core/xml/parser/XMLDocumentParser.h"
#include "weborigin/SecurityOrigin.h"
-#include "wtf/Assertions.h"
-#include "wtf/Vector.h"
-#include "wtf/text/CString.h"
-#include "wtf/text/StringBuffer.h"
-#include "wtf/unicode/UTF8.h"
-#include <libxslt/imports.h>
-#include <libxslt/security.h>
-#include <libxslt/variables.h>
-#include <libxslt/xsltutils.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/XSLTUnicodeSort.cpp b/chromium/third_party/WebKit/Source/core/xml/XSLTUnicodeSort.cpp
index 83342cb6900..316b5c4817e 100644
--- a/chromium/third_party/WebKit/Source/core/xml/XSLTUnicodeSort.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/XSLTUnicodeSort.cpp
@@ -29,10 +29,10 @@
#include "config.h"
#include "core/xml/XSLTUnicodeSort.h"
-#include "wtf/text/WTFString.h"
-#include "wtf/unicode/Collator.h"
#include <libxslt/templates.h>
#include <libxslt/xsltutils.h>
+#include <wtf/text/WTFString.h>
+#include <wtf/unicode/Collator.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp b/chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp
index 7f2b90f381d..197868f423f 100644
--- a/chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp
+++ b/chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp
@@ -26,6 +26,15 @@
#include "config.h"
#include "core/xml/parser/XMLDocumentParser.h"
+#include <libxml/parser.h>
+#include <libxml/parserInternals.h>
+#include <libxslt/xslt.h>
+#include <wtf/StringExtras.h>
+#include <wtf/text/CString.h>
+#include <wtf/Threading.h>
+#include <wtf/unicode/UTF8.h>
+#include <wtf/UnusedParam.h>
+#include <wtf/Vector.h>
#include "HTMLNames.h"
#include "XMLNSNames.h"
#include "bindings/v8/ExceptionState.h"
@@ -40,14 +49,14 @@
#include "core/dom/ProcessingInstruction.h"
#include "core/dom/ScriptLoader.h"
#include "core/dom/TransformSource.h"
-#include "core/fetch/ResourceFetcher.h"
-#include "core/fetch/ScriptResource.h"
#include "core/html/HTMLHtmlElement.h"
#include "core/html/HTMLTemplateElement.h"
#include "core/html/parser/HTMLEntityParser.h"
#include "core/loader/FrameLoader.h"
#include "core/loader/ImageLoader.h"
#include "core/loader/TextResourceDecoder.h"
+#include "core/loader/cache/ResourceFetcher.h"
+#include "core/loader/cache/ScriptResource.h"
#include "core/page/Frame.h"
#include "core/page/UseCounter.h"
#include "core/platform/network/ResourceError.h"
@@ -58,16 +67,7 @@
#include "core/xml/parser/XMLDocumentParserScope.h"
#include "core/xml/parser/XMLParserInput.h"
#include "weborigin/SecurityOrigin.h"
-#include "wtf/StringExtras.h"
#include "wtf/TemporaryChange.h"
-#include "wtf/Threading.h"
-#include "wtf/UnusedParam.h"
-#include "wtf/Vector.h"
-#include "wtf/text/CString.h"
-#include "wtf/unicode/UTF8.h"
-#include <libxml/parser.h>
-#include <libxml/parserInternals.h>
-#include <libxslt/xslt.h>
using namespace std;
diff --git a/chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h b/chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h
index 64b1898eedc..72334821501 100644
--- a/chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h
+++ b/chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h
@@ -27,15 +27,15 @@
#include "core/dom/ParserContentPolicy.h"
#include "core/dom/ScriptableDocumentParser.h"
-#include "core/fetch/ResourceClient.h"
-#include "core/fetch/ResourcePtr.h"
+#include "core/loader/cache/ResourceClient.h"
+#include "core/loader/cache/ResourcePtr.h"
#include "core/platform/text/SegmentedString.h"
#include "core/xml/XMLErrors.h"
-#include "wtf/HashMap.h"
-#include "wtf/OwnPtr.h"
-#include "wtf/text/CString.h"
-#include "wtf/text/StringHash.h"
#include <libxml/tree.h>
+#include <wtf/HashMap.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/text/CString.h>
+#include <wtf/text/StringHash.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParserScope.h b/chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParserScope.h
index 613d165cb27..510c5838a2c 100644
--- a/chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParserScope.h
+++ b/chromium/third_party/WebKit/Source/core/xml/parser/XMLDocumentParserScope.h
@@ -26,7 +26,8 @@
#ifndef XMLDocumentParserScope_h
#define XMLDocumentParserScope_h
-#include "wtf/Noncopyable.h"
+#include <wtf/Noncopyable.h>
+
#include <libxml/xmlerror.h>
namespace WebCore {
diff --git a/chromium/third_party/WebKit/Source/devtools/devtools.gyp b/chromium/third_party/WebKit/Source/devtools/devtools.gyp
index b458f6e9b58..1eb4103cfc1 100644
--- a/chromium/third_party/WebKit/Source/devtools/devtools.gyp
+++ b/chromium/third_party/WebKit/Source/devtools/devtools.gyp
@@ -105,7 +105,6 @@
'front_end/JavaScriptFormatter.js',
'front_end/jsdifflib.js',
'front_end/KeyboardShortcut.js',
- 'front_end/LayersPanelDescriptor.js',
'front_end/Linkifier.js',
'front_end/LiveEditSupport.js',
'front_end/NativeBreakpointsSidebarPane.js',
@@ -232,7 +231,6 @@
'front_end/textPrompt.css',
'front_end/timelinePanel.css',
'front_end/canvasProfiler.css',
- 'front_end/layersPanel.css',
],
'devtools_elements_js_files': [
'front_end/CSSNamedFlowCollectionsView.js',
@@ -352,7 +350,6 @@
'<@(devtools_timeline_js_files)',
'<@(devtools_profiles_js_files)',
'<@(devtools_audits_js_files)',
- '<@(devtools_layers_js_files)',
'<@(devtools_codemirror_js_files)',
],
'devtools_uglifyjs_files': [
@@ -460,14 +457,6 @@
'front_end/Images/trackHoriz.png',
'front_end/Images/trackVert.png',
],
-
- 'devtools_layers_js_files': [
- 'front_end/LayersPanel.js',
- 'front_end/LayerTreeModel.js',
- 'front_end/LayerTree.js',
- 'front_end/Layers3DView.js',
- ],
-
'devtools_extension_api_files': [
'front_end/ExtensionAPI.js',
'front_end/DevToolsExtensionAPI.js'
@@ -492,7 +481,6 @@
'concatenated_devtools_profiles_js',
'concatenated_devtools_audits_js',
'concatenated_devtools_codemirror_js',
- 'concatenated_devtools_layers_js',
'concatenated_heap_snapshot_worker_js',
'concatenated_script_formatter_worker_js',
'concatenated_devtools_css'],
@@ -578,7 +566,6 @@
'concatenated_devtools_profiles_js',
'concatenated_devtools_audits_js',
'concatenated_devtools_codemirror_js',
- 'concatenated_devtools_layers_js',
'concatenated_heap_snapshot_worker_js',
'concatenated_script_formatter_worker_js',
'concatenated_devtools_css'],
@@ -595,7 +582,6 @@
'<(PRODUCT_DIR)/resources/inspector/TimelinePanel.js',
'<(PRODUCT_DIR)/resources/inspector/ProfilesPanel.js',
'<(PRODUCT_DIR)/resources/inspector/AuditsPanel.js',
- '<(PRODUCT_DIR)/resources/inspector/LayersPanel.js',
'<(PRODUCT_DIR)/resources/inspector/CodeMirrorTextEditor.js',
'<(PRODUCT_DIR)/resources/inspector/HeapSnapshotWorker.js',
'<(PRODUCT_DIR)/resources/inspector/ScriptFormatterWorker.js',
@@ -871,22 +857,6 @@
}],
},
{
- 'target_name': 'concatenated_devtools_layers_js',
- 'type': 'none',
- 'actions': [{
- 'action_name': 'concatenate_devtools_layers_js',
- 'script_name': 'scripts/inline_js_imports.py',
- 'input_file': 'front_end/LayersPanel.js',
- 'inputs': [
- '<@(_script_name)',
- '<@(devtools_layers_js_files)',
- ],
- 'search_path': 'front_end',
- 'outputs': ['<(PRODUCT_DIR)/resources/inspector/LayersPanel.js'],
- 'action': ['python', '<@(_script_name)', '<@(_input_file)', '<@(_search_path)', '<@(_outputs)'],
- }],
- },
- {
'target_name': 'concatenated_devtools_css',
'type': 'none',
'dependencies': [
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/AuditLauncherView.js b/chromium/third_party/WebKit/Source/devtools/front_end/AuditLauncherView.js
index 3ff4e4e9930..b5f777e5295 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/AuditLauncherView.js
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/AuditLauncherView.js
@@ -141,7 +141,7 @@ WebInspector.AuditLauncherView.prototype = {
if (this._auditRunning === auditRunning)
return;
this._auditRunning = auditRunning;
- this._launchButton.textContent = this._auditRunning ? WebInspector.UIString("Stop") : WebInspector.UIString("Run");
+ this._updateButton();
this._toggleUIComponents(this._auditRunning);
if (this._auditRunning)
this._startAudit();
@@ -208,6 +208,17 @@ WebInspector.AuditLauncherView.prototype = {
_categoryClicked: function()
{
this._selectedCategoriesUpdated(true);
+ this._selectAllCheckboxElement.checked = this._checkedCategoriesCount === this._sortedCategories.length;
+ },
+
+ _updateCheckedCategoriesCount: function()
+ {
+ this._checkedCategoriesCount = 0;
+ var checkboxes = this._categoriesElement.getElementsByTagName("input");
+ for (var i = 0; i < checkboxes.length; ++i) {
+ if (checkboxes[i].checked)
+ this._checkedCategoriesCount += 1;
+ }
},
/**
@@ -252,6 +263,7 @@ WebInspector.AuditLauncherView.prototype = {
this._contentElement.appendChild(categoryElement);
this._categoriesElement = this._contentElement.createChild("fieldset", "audit-categories-container");
+ this._checkedCategoriesCount = 0;
this._contentElement.createChild("div", "flexible-space");
@@ -289,14 +301,7 @@ WebInspector.AuditLauncherView.prototype = {
*/
_selectedCategoriesUpdated: function(userGesture)
{
- var checkedCategoriesCount = 0;
- var checkboxes = this._categoriesElement.getElementsByTagName("input");
- for (var i = 0; i < checkboxes.length; ++i) {
- if (checkboxes[i].checked)
- ++checkedCategoriesCount;
- }
- this._launchButton.disabled = checkedCategoriesCount === 0;
- this._selectAllCheckboxElement.checked = checkedCategoriesCount === this._sortedCategories.length;
+ this._updateCheckedCategoriesCount();
// Save present categories only upon user gesture to clean up junk from past versions and removed extensions.
// Do not remove old categories if not handling a user gesture, as there's chance categories will be added
@@ -307,6 +312,13 @@ WebInspector.AuditLauncherView.prototype = {
selectedCategories[childNodes[i].__displayName] = childNodes[i].firstChild.checked;
selectedCategories[WebInspector.AuditLauncherView.AllCategoriesKey] = this._selectAllCheckboxElement.checked;
this._selectedCategoriesSetting.set(selectedCategories);
+ this._updateButton();
+ },
+
+ _updateButton: function()
+ {
+ this._launchButton.textContent = this._auditRunning ? WebInspector.UIString("Stop") : WebInspector.UIString("Run");
+ this._launchButton.disabled = !this._checkedCategoriesCount;
},
__proto__: WebInspector.View.prototype
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/CPUProfileView.js b/chromium/third_party/WebKit/Source/devtools/front_end/CPUProfileView.js
index 3a3153bf75a..ff9a152531c 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/CPUProfileView.js
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/CPUProfileView.js
@@ -143,6 +143,9 @@ WebInspector.CPUProfileView.prototype = {
this._calculateTimes(profile);
+ if (profile.idleTime)
+ this._injectIdleTimeNode(profile);
+
this._assignParentsInProfile();
if (this.samples)
this._buildIdToNodeMap();
@@ -628,6 +631,39 @@ WebInspector.CPUProfileView.prototype = {
}
},
+ /**
+ * @param {ProfilerAgent.CPUProfile} profile
+ */
+ _injectIdleTimeNode: function(profile)
+ {
+ var idleTime = profile.idleTime;
+ var nodes = profile.head.children;
+
+ var programNode = {selfTime: 0};
+ for (var i = nodes.length - 1; i >= 0; --i) {
+ if (nodes[i].functionName === "(program)") {
+ programNode = nodes[i];
+ break;
+ }
+ }
+ var programTime = programNode.selfTime;
+ if (idleTime > programTime)
+ idleTime = programTime;
+ programTime = programTime - idleTime;
+ programNode.selfTime = programTime;
+ programNode.totalTime = programTime;
+ var idleNode = {
+ functionName: "(idle)",
+ url: null,
+ lineNumber: 0,
+ totalTime: idleTime,
+ selfTime: idleTime,
+ callUID: 0,
+ children: []
+ };
+ nodes.push(idleNode);
+ },
+
__proto__: WebInspector.View.prototype
}
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/CanvasProfileView.js b/chromium/third_party/WebKit/Source/devtools/front_end/CanvasProfileView.js
index 76094be452a..02e7b4d01a6 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/CanvasProfileView.js
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/CanvasProfileView.js
@@ -484,13 +484,12 @@ WebInspector.CanvasProfileView.prototype = {
{
var element = parentElement.createChild("span", "canvas-call-argument");
element._argumentIndex = -1;
- var description = callArgument.enumName || callArgument.description;
if (callArgument.type === "string") {
const maxStringLength = 150;
element.createTextChild("\"");
- element.createChild("span", "canvas-formatted-string").textContent = description.trimMiddle(maxStringLength);
+ element.createChild("span", "canvas-formatted-string").textContent = callArgument.description.trimMiddle(maxStringLength);
element.createTextChild("\"");
- element._suppressPopover = (description.length <= maxStringLength && !/[\r\n]/.test(description));
+ element._suppressPopover = (callArgument.description.length <= maxStringLength && !/[\r\n]/.test(callArgument.description));
} else {
var type = callArgument.subtype || callArgument.type;
if (type) {
@@ -502,11 +501,11 @@ WebInspector.CanvasProfileView.prototype = {
element._suppressPopover = true;
break;
case "number":
- element._suppressPopover = !isNaN(description);
+ element._suppressPopover = !isNaN(callArgument.description);
break;
}
}
- element.textContent = description;
+ element.textContent = callArgument.description;
}
if (callArgument.resourceId) {
element.addStyleClass("canvas-formatted-resource");
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/CodeMirrorTextEditor.js b/chromium/third_party/WebKit/Source/devtools/front_end/CodeMirrorTextEditor.js
index 029f07fe4a4..fa7c6d4323f 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/CodeMirrorTextEditor.js
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/CodeMirrorTextEditor.js
@@ -856,10 +856,6 @@ WebInspector.CodeMirrorTextEditor.prototype = {
{
},
- /**
- * @param {number} width
- * @param {number} height
- */
_updatePaddingBottom: function(width, height)
{
var scrollInfo = this._codeMirror.getScrollInfo();
@@ -877,12 +873,9 @@ WebInspector.CodeMirrorTextEditor.prototype = {
_resizeEditor: function()
{
- var parentElement = this.element.parentElement;
- if (!parentElement || !this.isShowing())
- return;
var scrollInfo = this._codeMirror.getScrollInfo();
- var width = parentElement.offsetWidth;
- var height = parentElement.offsetHeight;
+ var width = this.element.parentElement.offsetWidth;
+ var height = this.element.parentElement.offsetHeight;
this._codeMirror.setSize(width, height);
this._updatePaddingBottom(width, height);
this._codeMirror.scrollTo(scrollInfo.left, scrollInfo.top);
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/DebuggerModel.js b/chromium/third_party/WebKit/Source/devtools/front_end/DebuggerModel.js
index da464fbe3c0..cffad006043 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/DebuggerModel.js
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/DebuggerModel.js
@@ -167,24 +167,6 @@ WebInspector.DebuggerModel.prototype = {
/**
* @param {WebInspector.DebuggerModel.Location} rawLocation
- */
- stepIntoSelection: function(rawLocation)
- {
- /**
- * @param {WebInspector.DebuggerModel.Location} requestedLocation
- * @param {?string} error
- */
- function callback(requestedLocation, error)
- {
- if (error)
- return;
- this._pendingStepIntoLocation = requestedLocation;
- };
- DebuggerAgent.continueToLocation(rawLocation, true, callback.bind(this, rawLocation));
- },
-
- /**
- * @param {WebInspector.DebuggerModel.Location} rawLocation
* @param {string} condition
* @param {function(?DebuggerAgent.BreakpointId, Array.<WebInspector.DebuggerModel.Location>):void=} callback
*/
@@ -383,19 +365,6 @@ WebInspector.DebuggerModel.prototype = {
*/
_pausedScript: function(callFrames, reason, auxData, breakpointIds)
{
- if (this._pendingStepIntoLocation) {
- var requestedLocation = this._pendingStepIntoLocation;
- delete this._pendingStepIntoLocation;
-
- if (callFrames.length > 0) {
- var topLocation = callFrames[0].location;
- if (topLocation.lineNumber == requestedLocation.lineNumber && topLocation.columnNumber == requestedLocation.columnNumber && topLocation.scriptId == requestedLocation.scriptId) {
- DebuggerAgent.stepInto();
- return;
- }
- }
- }
-
this._setDebuggerPausedDetails(new WebInspector.DebuggerPausedDetails(this, callFrames, reason, auxData, breakpointIds));
},
@@ -505,11 +474,7 @@ WebInspector.DebuggerModel.prototype = {
function updateExecutionLine(uiLocation)
{
- var data = {
- uiLocation: uiLocation,
- callFrame: callFrame
- };
- this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.ExecutionLineChanged, data);
+ this.dispatchEventToListeners(WebInspector.DebuggerModel.Events.ExecutionLineChanged, uiLocation);
}
this._executionLineLiveLocation = callFrame.script.createLiveLocation(callFrame.location, updateExecutionLine.bind(this));
},
@@ -849,29 +814,6 @@ WebInspector.DebuggerModel.CallFrame.prototype = {
},
/**
- * @param {function(Array.<DebuggerAgent.Location>)} callback
- */
- getStepIntoLocations: function(callback)
- {
- if (this._stepInLocations) {
- callback(this._stepInLocations.slice(0));
- return;
- }
- /**
- * @param {?string} error
- * @param {Array.<DebuggerAgent.Location>=} stepInPositions
- */
- function getStepInPositionsCallback(error, stepInPositions) {
- if (error) {
- return;
- }
- this._stepInLocations = stepInPositions;
- callback(this._stepInLocations.slice(0));
- }
- DebuggerAgent.getStepInPositions(this.id, getStepInPositionsCallback.bind(this));
- },
-
- /**
* @param {function(WebInspector.UILocation):(boolean|undefined)} updateDelegate
*/
createLiveLocation: function(updateDelegate)
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/JavaScriptSourceFrame.js b/chromium/third_party/WebKit/Source/devtools/front_end/JavaScriptSourceFrame.js
index c35d6706a8d..e245d9e2683 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/JavaScriptSourceFrame.js
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/JavaScriptSourceFrame.js
@@ -51,10 +51,6 @@ WebInspector.JavaScriptSourceFrame = function(scriptsPanel, uiSourceCode)
this.textEditor.addEventListener(WebInspector.TextEditor.Events.GutterClick, this._handleGutterClick.bind(this), this);
- this.textEditor.element.addEventListener("mousedown", this._onMouseDownAndClick.bind(this, true), true);
- this.textEditor.element.addEventListener("click", this._onMouseDownAndClick.bind(this, false), true);
-
-
this._breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.BreakpointAdded, this._breakpointAdded, this);
this._breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.BreakpointRemoved, this._breakpointRemoved, this);
@@ -364,12 +360,6 @@ WebInspector.JavaScriptSourceFrame.prototype = {
if (this._popoverHelper.isPopoverVisible()) {
this._popoverHelper.hidePopover();
event.consume();
- return;
- }
- if (this._stepIntoMarkup && WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event)) {
- this._stepIntoMarkup.moveSelectionTo(-1);
- event.consume();
- return;
}
}
},
@@ -426,44 +416,23 @@ WebInspector.JavaScriptSourceFrame.prototype = {
/**
* @param {number} lineNumber
- * @param {WebInspector.DebuggerModel.CallFrame} callFrame
*/
- setExecutionLine: function(lineNumber, callFrame)
+ setExecutionLine: function(lineNumber)
{
this._executionLineNumber = lineNumber;
- this._executionCallFrame = callFrame;
if (this.loaded) {
this.textEditor.setExecutionLine(lineNumber);
this.revealLine(this._executionLineNumber);
if (this.canEditSource())
this.setSelection(WebInspector.TextRange.createFromLocation(lineNumber, 0));
-
- /**
- * @param {Array.<DebuggerAgent.Location>} locations
- */
- function locationsCallback(locations)
- {
- if (this._executionCallFrame !== callFrame || this._stepIntoMarkup)
- return;
- this._stepIntoMarkup = WebInspector.JavaScriptSourceFrame.StepIntoMarkup.create(this, locations);
- if (this._stepIntoMarkup)
- this._stepIntoMarkup.show();
- }
- callFrame.getStepIntoLocations(locationsCallback.bind(this));
}
},
clearExecutionLine: function()
{
- if (this._stepIntoMarkup) {
- this._stepIntoMarkup.dispose();
- delete this._stepIntoMarkup;
- }
-
if (this.loaded && typeof this._executionLineNumber === "number")
this.textEditor.clearExecutionLine();
delete this._executionLineNumber;
- delete this._executionCallFrame;
},
_lineNumberAfterEditing: function(lineNumber, oldRange, newRange)
@@ -487,24 +456,6 @@ WebInspector.JavaScriptSourceFrame.prototype = {
return newLineNumber;
},
- _onMouseDownAndClick: function(isMouseDown, event)
- {
- var markup = this._stepIntoMarkup;
- if (!markup)
- return;
- var index = markup.findItemByCoordinates(event.x, event.y);
- if (typeof index === "undefined")
- return;
-
- if (isMouseDown) {
- // Do not let text editor to spoil 'click' event that is coming for us.
- event.consume();
- } else {
- var rawLocation = markup.getRawPosition(index);
- this._scriptsPanel.doStepIntoSelection(rawLocation);
- }
- },
-
/**
* @return {boolean}
*/
@@ -592,7 +543,7 @@ WebInspector.JavaScriptSourceFrame.prototype = {
onTextEditorContentLoaded: function()
{
if (typeof this._executionLineNumber === "number")
- this.setExecutionLine(this._executionLineNumber, this._executionCallFrame);
+ this.setExecutionLine(this._executionLineNumber);
var breakpointLocations = this._breakpointManager.breakpointLocationsForUISourceCode(this._uiSourceCode);
for (var i = 0; i < breakpointLocations.length; ++i)
@@ -680,14 +631,6 @@ WebInspector.JavaScriptSourceFrame.prototype = {
WebInspector.debuggerModel.continueToLocation(rawLocation);
},
- /**
- * @return {WebInspector.JavaScriptSourceFrame.StepIntoMarkup|undefined}
- */
- stepIntoMarkup: function()
- {
- return this._stepIntoMarkup;
- },
-
dispose: function()
{
this._breakpointManager.removeEventListener(WebInspector.BreakpointManager.Events.BreakpointAdded, this._breakpointAdded, this);
@@ -703,178 +646,3 @@ WebInspector.JavaScriptSourceFrame.prototype = {
__proto__: WebInspector.UISourceCodeFrame.prototype
}
-
-/**
- * @constructor
- * @param {Array.<DebuggerAgent.Location>} rawPositions
- * @param {Array.<WebInspector.TextRange>} editorRanges
- * @param {number} firstToExecute
- * @param {WebInspector.JavaScriptSourceFrame} sourceFrame
- */
-WebInspector.JavaScriptSourceFrame.StepIntoMarkup = function(rawPositions, editorRanges, firstToExecute, sourceFrame)
-{
- this._positions = rawPositions;
- this._editorRanges = editorRanges;
- this._highlightDescriptors = new Array(rawPositions.length);
- this._firstToExecute = firstToExecute;
- this._currentSelection = firstToExecute;
- this._sourceFrame = sourceFrame;
-};
-
-WebInspector.JavaScriptSourceFrame.StepIntoMarkup.prototype = {
- show: function()
- {
- for (var i = 0; i < this._positions.length; ++i)
- this._highlightItem(i, i == this._currentSelection);
- },
-
- /**
- * @param {boolean} backward
- */
- iterateSelection: function(backward)
- {
- var nextSelection = backward ? this._currentSelection - 1 : this._currentSelection + 1;
- this.moveSelectionTo(nextSelection);
- },
-
- selectFirstToExecute: function()
- {
- this.moveSelectionTo(this._firstToExecute);
- },
-
- /**
- * @param {number} nextSelection
- */
- moveSelectionTo: function(nextSelection)
- {
- var modulo = this._positions.length + 1;
- nextSelection = (nextSelection + modulo) % modulo;
- this._hideItemHighlight(this._currentSelection);
- this._hideItemHighlight(nextSelection);
- this._highlightItem(this._currentSelection, false);
- this._highlightItem(nextSelection, true);
- this._currentSelection = nextSelection;
- },
-
- /**
- * @param {number} position
- * @param {boolean} selected
- */
- _highlightItem: function(position, selected)
- {
- if (position === this._positions.length)
- return;
- var styleName = selected ? "source-frame-stepin-mark-highlighted" : "source-frame-stepin-mark";
- var textEditor = this._sourceFrame.textEditor;
- var highlightDescriptor = textEditor.highlightRange(this._editorRanges[position], styleName);
- this._highlightDescriptors[position] = highlightDescriptor;
- },
-
- /**
- * @param {number} position
- */
- _hideItemHighlight: function(position)
- {
- if (position === this._positions.length)
- return;
- var highlightDescriptor = this._highlightDescriptors[position];
- console.assert(highlightDescriptor);
- var textEditor = this._sourceFrame.textEditor;
- textEditor.removeHighlight(highlightDescriptor);
- this._highlightDescriptors[position] = undefined;
- },
-
- dispose: function()
- {
- for (var i = 0; i < this._positions.length; ++i)
- this._hideItemHighlight(i);
- },
-
- /**
- * @param {number} x
- * @param {number} y
- * @return {number|undefined}
- */
- findItemByCoordinates: function(x, y)
- {
- var textPosition = this._sourceFrame.textEditor.coordinatesToCursorPosition(x, y);
- if (!textPosition)
- return;
-
- var ranges = this._editorRanges;
-
- for (var i = 0; i < ranges.length; ++i) {
- var nextRange = ranges[i];
- if (nextRange.startLine == textPosition.startLine && nextRange.startColumn <= textPosition.startColumn && nextRange.endColumn >= textPosition.startColumn)
- return i;
- }
- },
-
- /**
- * @return {number|undefined}
- */
- getSelectedItemIndex: function()
- {
- if (this._currentSelection === this._positions.length)
- return undefined;
- return this._currentSelection;
- },
-
- /**
- * @return {WebInspector.DebuggerModel.Location}
- */
- getRawPosition: function(position)
- {
- return /** @type {WebInspector.DebuggerModel.Location} */ (this._positions[position]);
- }
-
-};
-
-/**
- * @param {WebInspector.JavaScriptSourceFrame} sourceFrame
- * @param {Array.<DebuggerAgent.Location>} stepIntoRawLocations
- * @return {?WebInspector.JavaScriptSourceFrame.StepIntoMarkup}
- */
-WebInspector.JavaScriptSourceFrame.StepIntoMarkup.create = function(sourceFrame, stepIntoRawLocations)
-{
- if (!stepIntoRawLocations.length)
- return null;
-
- var firstToExecute = stepIntoRawLocations[0];
- stepIntoRawLocations.sort(WebInspector.JavaScriptSourceFrame.StepIntoMarkup._Comparator);
- var firstToExecuteIndex = stepIntoRawLocations.indexOf(firstToExecute);
-
- var textEditor = sourceFrame.textEditor;
- var uiRanges = [];
- for (var i = 0; i < stepIntoRawLocations.length; ++i) {
- var uiLocation = WebInspector.debuggerModel.rawLocationToUILocation(/** @type {WebInspector.DebuggerModel.Location} */ (stepIntoRawLocations[i]));
-
- var token = textEditor.tokenAtTextPosition(uiLocation.lineNumber, uiLocation.columnNumber);
- var startColumn;
- var endColumn;
- if (token) {
- startColumn = token.startColumn;
- endColumn = token.endColumn;
- } else {
- startColumn = uiLocation.columnNumber;
- endColumn = uiLocation.columnNumber;
- }
- var range = new WebInspector.TextRange(uiLocation.lineNumber, startColumn, uiLocation.lineNumber, endColumn);
- uiRanges.push(range);
- }
-
- return new WebInspector.JavaScriptSourceFrame.StepIntoMarkup(stepIntoRawLocations, uiRanges, firstToExecuteIndex, sourceFrame);
-};
-
-/**
- * @param {DebuggerAgent.Location} locationA
- * @param {DebuggerAgent.Location} locationB
- * @return {number}
- */
-WebInspector.JavaScriptSourceFrame.StepIntoMarkup._Comparator = function(locationA, locationB)
-{
- if (locationA.lineNumber === locationB.lineNumber)
- return locationA.columnNumber - locationB.columnNumber;
- else
- return locationA.lineNumber - locationB.lineNumber;
-};
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/KeyboardShortcut.js b/chromium/third_party/WebKit/Source/devtools/front_end/KeyboardShortcut.js
index 793c9bd56f3..b3f6f8fb110 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/KeyboardShortcut.js
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/KeyboardShortcut.js
@@ -94,11 +94,6 @@ WebInspector.KeyboardShortcut.Keys = {
H: { code: 72, name: "H" },
Ctrl: { code: 17, name: "Ctrl" },
Meta: { code: 91, name: "Meta" },
- get CtrlOrMeta()
- {
- // "default" command/ctrl key for platform, Command on Mac, Ctrl on other platforms
- return WebInspector.isMac() ? this.Meta : this.Ctrl;
- },
};
/**
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/LayerTree.js b/chromium/third_party/WebKit/Source/devtools/front_end/LayerTree.js
deleted file mode 100644
index a525e6d5b99..00000000000
--- a/chromium/third_party/WebKit/Source/devtools/front_end/LayerTree.js
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @constructor
- * @param {WebInspector.LayerTreeModel} model
- * @param {TreeOutline} treeOutline
- */
-WebInspector.LayerTree = function(model, treeOutline)
-{
- this._model = model;
- this._treeOutline = treeOutline;
- this._model.addEventListener(WebInspector.LayerTreeModel.Events.LayerTreeChanged, this._update.bind(this));
- this._needsUpdate = true;
-}
-
-WebInspector.LayerTree.prototype = {
- /**
- * @param {boolean} visible
- */
- setVisible: function(visible)
- {
- if (this._isVisible === visible)
- return;
- this._isVisible = visible;
- if (visible && this._needsUpdate)
- this._update();
- },
-
- _update: function()
- {
- if (!this._isVisible) {
- this._needsUpdate = true;
- return;
- }
- this._needsUpdate = false;
-
- var seenLayers = {};
-
- /**
- * @param {WebInspector.Layer} layer
- */
- function updateLayer(layer)
- {
- var id = layer.id();
- if (seenLayers[id])
- console.assert(false, "Duplicate layer id: " + id);
- seenLayers[id] = true;
- var node = this._treeOutline.getCachedTreeElement(layer);
- var parent = layer.parent() ? this._treeOutline.getCachedTreeElement(layer.parent()) : this._treeOutline;
- if (!parent)
- console.assert(false, "Parent is not in the tree");
- if (!node) {
- node = new WebInspector.LayerTreeElement(layer);
- parent.appendChild(node);
- } else {
- var oldParentId = node.parent.representedObject && node.parent.representedObject.id();
- if (oldParentId !== layer.parentId()) {
- (node.parent || this._treeOutline).removeChild(node);
- parent.appendChild(node);
- }
- node._update();
- }
- }
- this._model.forEachLayer(updateLayer.bind(this));
- // Cleanup layers that don't exist anymore from tree
- for (var i = 0; i < this._treeOutline.children.length; ++i) {
- for (var node = this._treeOutline.children[i]; node;) {
- if (seenLayers[node.representedObject.id()]) {
- node = node.traverseNextTreeElement(false);
- } else {
- var nextNode = node.nextSibling || node.parent;
- node.parent.removeChild(node);
- node = nextNode;
- }
- }
- }
- }
- }
-
-/**
- * @constructor
- * @param {WebInspector.Layer} layer
- * @extends {TreeElement}
- */
-WebInspector.LayerTreeElement = function(layer)
-{
- TreeElement.call(this, "#" + layer.id(), layer);
-}
-
-WebInspector.LayerTreeElement.prototype = {
- onattach: function()
- {
- var selection = document.createElement("div");
- selection.className = "selection";
- this.listItemElement.insertBefore(selection, this.listItemElement.firstChild);
- },
-
- _update: function()
- {
- },
-
- __proto__: TreeElement.prototype
-}
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/LayerTreeModel.js b/chromium/third_party/WebKit/Source/devtools/front_end/LayerTreeModel.js
deleted file mode 100644
index e4922bb1369..00000000000
--- a/chromium/third_party/WebKit/Source/devtools/front_end/LayerTreeModel.js
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @constructor
- * @extends {WebInspector.Object}
- */
-WebInspector.LayerTreeModel = function()
-{
- this._layersById = {};
- InspectorBackend.registerLayerTreeDispatcher(new WebInspector.LayerTreeDispatcher(this));
- LayerTreeAgent.enable();
-}
-
-WebInspector.LayerTreeModel.Events = {
- LayerTreeChanged: "LayerTreeChanged"
-}
-
-WebInspector.LayerTreeModel.prototype = {
- dispose: function()
- {
- LayerTreeAgent.disable();
- },
-
- /**
- * @return {WebInspector.Layer}
- */
- root: function()
- {
- return this._root;
- },
-
- /**
- * @param {function(WebInspector.Layer)} callback
- * @param {WebInspector.Layer=} root
- * @return {boolean}
- */
- forEachLayer: function(callback, root)
- {
- if (!root) {
- root = this.root();
- if (!root)
- return false;
- }
- return callback(root) || root.children().some(this.forEachLayer.bind(this, callback));
- },
-
- /**
- * @param {function()=} callback
- */
- requestLayers: function(callback)
- {
- if (!callback)
- callback = function() {}
- if (typeof this._root !== "undefined") {
- callback();
- return;
- }
- if (this._pendingRequestLayersCallbacks) {
- this._pendingRequestLayersCallbacks.push(callback);
- return;
- }
- this._pendingRequestLayersCallbacks = [];
- this._pendingRequestLayersCallbacks.push(callback);
- function onGetLayers(error, layers)
- {
- this._root = null;
- if (error) {
- console.error("LayerTreeAgent.getLayers(): " + error);
- return;
- }
- this._repopulate(layers);
- for (var i = 0; i < this._pendingRequestLayersCallbacks.length; ++i)
- this._pendingRequestLayersCallbacks[i]();
- delete this._pendingRequestLayersCallbacks;
- }
- function onDocumentAvailable()
- {
- LayerTreeAgent.getLayers(undefined, onGetLayers.bind(this))
- }
- WebInspector.domAgent.requestDocument(onDocumentAvailable.bind(this));
- },
-
- /**
- * @param {string} id
- * @return {WebInspector.Layer?}
- */
- layerById: function(id)
- {
- return this._layersById[id];
- },
-
- /**
- * @param{Array.<LayerTreeAgent.Layer>} payload
- */
- _repopulate: function(payload)
- {
- var oldLayersById = this._layersById;
- this._layersById = {};
- for (var i = 0; i < payload.length; ++i) {
- var layer = oldLayersById[payload[i].layerId];
- if (layer)
- layer._reset(payload[i]);
- else
- layer = new WebInspector.Layer(payload[i]);
- this._layersById[layer.id()] = layer;
- var parentId = layer.parentId();
- if (parentId)
- this._layersById[parentId].addChild(layer);
- else {
- if (this._root)
- console.assert(false, "Multiple root layers");
- this._root = layer;
- }
- }
- this.dispatchEventToListeners(WebInspector.LayerTreeModel.Events.LayerTreeChanged);
- },
-
- _layerTreeChanged: function()
- {
- delete this._root;
- this.requestLayers();
- },
-
- __proto__: WebInspector.Object.prototype
-}
-
-/**
- * @constructor
- * @param {LayerTreeAgent.Layer} layerPayload
- */
-WebInspector.Layer = function(layerPayload)
-{
- this._reset(layerPayload);
-}
-
-WebInspector.Layer.prototype = {
- /**
- * @return {string?}
- */
- id: function()
- {
- return this._layerPayload.layerId;
- },
-
- /**
- * @return {string?}
- */
- parentId: function()
- {
- return this._layerPayload.parentLayerId;
- },
-
- /**
- * @return {WebInspector.Layer}
- */
- parent: function()
- {
- return this._parent;
- },
-
- isRoot: function()
- {
- return !!this.parentId();
- },
-
- children: function()
- {
- return this._children;
- },
-
- /**
- * @param {WebInspector.Layer} child
- */
- addChild: function(child)
- {
- if (child._parent)
- console.assert(false, "Child already has a parent");
- this._children.push(child);
- child._parent = this;
- },
-
- nodeIdForSelfOrAncestor: function()
- {
- for (var layer = this; layer; layer = layer._parent) {
- var nodeId = layer._layerPayload["nodeId"];
- if (nodeId)
- return nodeId;
- }
- return null;
- },
-
- /**
- * @return {number}
- */
- offsetX: function()
- {
- return this._layerPayload.offsetX;
- },
-
- /**
- * @return {number}
- */
- offsetY: function()
- {
- return this._layerPayload.offsetY;
- },
-
- /**
- * @return {number}
- */
- width: function()
- {
- return this._layerPayload.width;
- },
-
- /**
- * @return {number}
- */
- height: function()
- {
- return this._layerPayload.height;
- },
-
- /**
- * @param {LayerTreeAgent.Layer} layerPayload
- */
- _reset: function(layerPayload)
- {
- this._children = [];
- this._parent = null;
- this._layerPayload = layerPayload;
- }
-}
-
-/**
- * @constructor
- * @implements {LayerTreeAgent.Dispatcher}
- * @param {WebInspector.LayerTreeModel} layerTreeModel
- */
-WebInspector.LayerTreeDispatcher = function(layerTreeModel)
-{
- this._layerTreeModel = layerTreeModel;
-}
-
-WebInspector.LayerTreeDispatcher.prototype = {
- layerTreeDidChange: function()
- {
- this._layerTreeModel._layerTreeChanged();
- }
-}
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/Layers3DView.js b/chromium/third_party/WebKit/Source/devtools/front_end/Layers3DView.js
deleted file mode 100644
index a2af860254b..00000000000
--- a/chromium/third_party/WebKit/Source/devtools/front_end/Layers3DView.js
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @constructor
- * @extends {WebInspector.View}
- * @param {WebInspector.LayerTreeModel} model
- */
-WebInspector.Layers3DView = function(model)
-{
- WebInspector.View.call(this);
- this.element.classList.add("fill");
- this.element.classList.add("layers-3d-view");
- this._model = model;
- this._model.addEventListener(WebInspector.LayerTreeModel.Events.LayerTreeChanged, this._update, this);
- this._rotatingContainerElement = this.element.createChild("div", "fill rotating-container");
- this.element.addEventListener("mousemove", this._onMouseMove.bind(this), false);
- this.element.addEventListener("mousedown", this._onMouseDown.bind(this), false);
- this._elementsByLayerId = {};
- this._rotateX = 0;
- this._rotateY = 0;
-}
-
-WebInspector.Layers3DView.prototype = {
- onResize: function()
- {
- this._scale();
- },
-
- wasShown: function()
- {
- if (this._needsUpdate)
- this._update();
- },
-
- _scale: function()
- {
- const padding = 40;
- var scale = 1;
- var root = this._model.root();
- if (!root)
- return;
- var scaleX = this.element.clientWidth / (root.width() + 2 * padding);
- var scaleY = this.element.clientHeight / (root.height() + 2 * padding);
- scale = Math.min(scaleX, scaleY);
- var element = this._elementForLayer(root);
- element.style.webkitTransform = "scale(" + scale + "," + scale +")";
- element.style.webkitTransformOrigin = padding + "px " + padding + "px";
- },
-
- _update: function()
- {
- if (!this.isShowing()) {
- this._needsUpdate = true;
- return;
- }
- function updateLayer(layer)
- {
- var element = this._elementForLayer(layer);
- this._updateLayerElement(element);
- for (var childElement = element.firstElementChild; childElement;) {
- var nextElement = childElement.nextSibling;
- if (childElement.__layer && !this._model.layerById(childElement.__layer.id()))
- childElement.remove();
- childElement = nextElement;
- }
- }
- this._model.forEachLayer(updateLayer.bind(this));
- this._needsUpdate = false;
- this._scale();
- },
-
- /**
- * @param {WebInspector.Layer} layer
- * @return {Element}
- */
- _elementForLayer: function(layer)
- {
- var element = this._elementsByLayerId[layer.id()];
- if (element)
- return element;
- element = document.createElement("div");
- element.className = "layer-container";
- element.__layer = layer;
- ["fill back-wall", "side-wall top", "side-wall right", "side-wall bottom", "side-wall left"].forEach(element.createChild.bind(element, "div"));
- this._elementsByLayerId[layer.id()] = element;
- return element;
- },
-
- /**
- * @param {Element} element
- */
- _updateLayerElement: function(element)
- {
- var layer = element.__layer;
- var style = element.style;
- var parentElement = layer.parent() ? this._elementForLayer(layer.parent()) : this._rotatingContainerElement;
- element.__depth = (parentElement.__depth || 0) + 1;
- style.backgroundColor = this._colorForLayer(layer, element.__depth);
- style.left = layer.offsetX() + "px";
- style.top = layer.offsetY() + "px";
- style.width = layer.width() + "px";
- style.height = layer.height() + "px";
- if (parentElement !== element.parentElement)
- parentElement.appendChild(element);
- },
-
- /**
- * @param {WebInspector.Layer} layer
- * @param {number} depth
- * @return {string}
- */
- _colorForLayer: function(layer, depth)
- {
- const base = 144;
- var component = base + 20 * ((depth - 1) % 5);
- return "rgb(" + component + "," + component + "," + component + ")";
- },
-
- /**
- * @param {Event} event
- */
- _onMouseDown: function(event)
- {
- if (event.which !== 1)
- return;
- this._originX = event.clientX;
- this._originY = event.clientY;
- this._oldRotateX = this._rotateX;
- this._oldRotateY = this._rotateY;
- },
-
- /**
- * @param {Event} event
- */
- _onMouseMove: function(event)
- {
- if (event.which !== 1)
- return;
- this._rotateX = this._oldRotateX + (this._originY - event.clientY) / 2;
- this._rotateY = this._oldRotateY - (this._originX - event.clientX) / 4;
- this._rotatingContainerElement.style.webkitTransform = "rotateX(" + this._rotateX + "deg) rotateY(" + this._rotateY + "deg)";
- },
-
- __proto__: WebInspector.View.prototype
-}
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/LayersPanel.js b/chromium/third_party/WebKit/Source/devtools/front_end/LayersPanel.js
deleted file mode 100644
index 9b1c5a54f6a..00000000000
--- a/chromium/third_party/WebKit/Source/devtools/front_end/LayersPanel.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-importScript("LayerTreeModel.js");
-importScript("LayerTree.js");
-importScript("Layers3DView.js");
-
-/**
- * @constructor
- * @extends {WebInspector.Panel}
- */
-WebInspector.LayersPanel = function()
-{
- WebInspector.Panel.call(this, "layers");
- this.registerRequiredCSS("layersPanel.css");
-
- const initialLayerTreeSidebarWidth = 225;
- const minimumMainWidthPercent = 0.5;
- this.createSidebarViewWithTree();
- this.sidebarElement.addStyleClass("outline-disclosure");
- this.sidebarTreeElement.removeStyleClass("sidebar-tree");
- this._model = new WebInspector.LayerTreeModel();
- this._layerTree = new WebInspector.LayerTree(this._model, this.sidebarTree);
- this._layerDetailsSplitView = new WebInspector.SplitView(false, "layerDetailsSplitView");
- this._layerDetailsSplitView.show(this.splitView.mainElement);
- this._layers3DView = new WebInspector.Layers3DView(this._model);
- this._layers3DView.show(this._layerDetailsSplitView.mainElement);
- this._model.requestLayers();
-}
-
-WebInspector.LayersPanel.prototype = {
- wasShown: function()
- {
- WebInspector.Panel.prototype.wasShown.call(this);
- this._layerTree.setVisible(true);
- this.sidebarTreeElement.focus();
- },
-
- willHide: function()
- {
- this._layerTree.setVisible(false);
- WebInspector.Panel.prototype.willHide.call(this);
- },
-
- __proto__: WebInspector.Panel.prototype
-}
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/LayersPanelDescriptor.js b/chromium/third_party/WebKit/Source/devtools/front_end/LayersPanelDescriptor.js
deleted file mode 100644
index 95ad832993c..00000000000
--- a/chromium/third_party/WebKit/Source/devtools/front_end/LayersPanelDescriptor.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.
- * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @constructor
- * @extends {WebInspector.PanelDescriptor}
- */
-WebInspector.LayersPanelDescriptor = function()
-{
- WebInspector.PanelDescriptor.call(this, "layers", WebInspector.UIString("Layers"), "LayersPanel", "LayersPanel.js");
-}
-
-WebInspector.LayersPanelDescriptor.prototype = {
- __proto__: WebInspector.PanelDescriptor.prototype
-}
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/OverridesView.js b/chromium/third_party/WebKit/Source/devtools/front_end/OverridesView.js
index 9d34d9c934a..efd64e456fa 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/OverridesView.js
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/OverridesView.js
@@ -49,16 +49,37 @@ WebInspector.OverridesView = function()
var topContainer = wrapper.createChild("div", "settings-tab help-content");
var enableOptionsContainer = topContainer.createChild("div", "help-block");
- var enableOnStartupField = this._createCheckboxSetting(WebInspector.UIString("Enable on DevTools startup"), WebInspector.settings.enableOverridesOnStartup);
- enableOnStartupField.id = "enable-devtools-on-startup";
- this._enableOnStartupField = enableOnStartupField;
- var enableLabel = this._createNonPersistedCheckbox(WebInspector.UIString("Enable"), this._setOverridesActive.bind(this));
+ /**
+ * @param {boolean} enabled
+ */
+ function enableClicked(enabled)
+ {
+ WebInspector.overridesSupport.setOverridesActive(enabled);
+ this._mainContainer.disabled = !enabled;
+ }
+ var boundEnableClicked = enableClicked.bind(this);
+ var enableLabel = this._createNonPersistedCheckbox(WebInspector.UIString("Enable"), boundEnableClicked);
var enableCheckbox = enableLabel.getElementsByTagName("input")[0];
enableCheckbox.checked = WebInspector.settings.enableOverridesOnStartup.get();
enableOptionsContainer.appendChild(enableLabel);
- enableOptionsContainer.appendChild(enableOnStartupField);
+ var enableOnStartupPara = this._createCheckboxSetting(WebInspector.UIString("Enable on DevTools startup"), WebInspector.settings.enableOverridesOnStartup);
+ enableOnStartupPara.id = "enable-devtools-on-startup";
+ enableOptionsContainer.appendChild(enableOnStartupPara);
+
+ /**
+ * @param {WebInspector.Event} event
+ */
+ function enableOnStartupClicked(event)
+ {
+ var enableOnStartup = /** @type {boolean} */ (event.data);
+ if (enableOnStartup) {
+ enableCheckbox.checked = true;
+ boundEnableClicked(true);
+ }
+ }
+ WebInspector.settings.enableOverridesOnStartup.addChangeListener(enableOnStartupClicked, this);
- var mainContainer = topContainer.createChild("fieldset", "help-container");
+ var mainContainer = topContainer.createChild("div", "help-container");
this._mainContainer = mainContainer;
function appendBlock(contentElements)
@@ -75,7 +96,7 @@ WebInspector.OverridesView = function()
appendBlock([this._createDeviceOrientationOverrideControl()]);
appendBlock([this._createCheckboxSetting(WebInspector.UIString("Emulate touch events"), WebInspector.settings.emulateTouchEvents)]);
appendBlock([this._createMediaEmulationElement()]);
- this._setOverridesActive(enableCheckbox.checked);
+ boundEnableClicked(enableCheckbox.checked);
this._statusElement = document.createElement("span");
this._statusElement.textContent = WebInspector.UIString("Overrides");
@@ -91,16 +112,6 @@ WebInspector.OverridesView.showInDrawer = function()
WebInspector.OverridesView.prototype = {
/**
- * @param {boolean} active
- */
- _setOverridesActive: function(active)
- {
- WebInspector.overridesSupport.setOverridesActive(active);
- this._mainContainer.disabled = !active;
- this._enableOnStartupField.disabled = !active;
- },
-
- /**
* @param {string} name
* @param {!WebInspector.Setting} setting
* @param {function(boolean)=} callback
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/ScriptsPanel.js b/chromium/third_party/WebKit/Source/devtools/front_end/ScriptsPanel.js
index e2e3f0dfa51..ead3c9255b5 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/ScriptsPanel.js
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/ScriptsPanel.js
@@ -173,9 +173,6 @@ WebInspector.ScriptsPanel = function(workspaceForTest)
WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);
WebInspector.advancedSearchController.registerSearchScope(new WebInspector.ScriptsSearchScope(this._workspace));
-
- this._boundOnKeyUp = this._onKeyUp.bind(this);
- this._boundOnKeyDown = this._onKeyDown.bind(this);
}
WebInspector.ScriptsPanel.prototype = {
@@ -206,16 +203,10 @@ WebInspector.ScriptsPanel.prototype = {
{
WebInspector.Panel.prototype.wasShown.call(this);
this._navigatorController.wasShown();
-
- this.element.addEventListener("keydown", this._boundOnKeyDown, false);
- this.element.addEventListener("keyup", this._boundOnKeyUp, false);
},
willHide: function()
{
- this.element.removeEventListener("keydown", this._boundOnKeyDown, false);
- this.element.removeEventListener("keyup", this._boundOnKeyUp, false);
-
WebInspector.Panel.prototype.willHide.call(this);
WebInspector.closeViewInDrawer();
},
@@ -521,14 +512,13 @@ WebInspector.ScriptsPanel.prototype = {
_executionLineChanged: function(event)
{
- var uiLocation = event.data.uiLocation;
- var callFrame = event.data.callFrame;
+ var uiLocation = event.data;
this._clearCurrentExecutionLine();
if (!uiLocation)
return;
var sourceFrame = this._getOrCreateSourceFrame(uiLocation.uiSourceCode);
- sourceFrame.setExecutionLine(uiLocation.lineNumber, callFrame);
+ sourceFrame.setExecutionLine(uiLocation.lineNumber);
this._executionSourceFrame = sourceFrame;
},
@@ -744,34 +734,6 @@ WebInspector.ScriptsPanel.prototype = {
* @param {Event=} event
* @return {boolean}
*/
- _stepIntoSelectionClicked: function(event)
- {
- if (!this._paused)
- return true;
-
- if (this._executionSourceFrame) {
- var stepIntoMarkup = this._executionSourceFrame.stepIntoMarkup();
- if (stepIntoMarkup)
- stepIntoMarkup.iterateSelection(event.shiftKey);
- }
- return true;
- },
-
- doStepIntoSelection: function(rawLocation)
- {
- if (!this._paused)
- return;
-
- this._paused = false;
- this._stepping = true;
- this._clearInterface();
- WebInspector.debuggerModel.stepIntoSelection(rawLocation);
- },
-
- /**
- * @param {Event=} event
- * @return {boolean}
- */
_stepOutClicked: function(event)
{
if (!this._paused)
@@ -839,9 +801,6 @@ WebInspector.ScriptsPanel.prototype = {
this._stepIntoButton = this._createButtonAndRegisterShortcuts("scripts-step-into", title, handler, WebInspector.ScriptsPanelDescriptor.ShortcutKeys.StepInto);
debugToolbar.appendChild(this._stepIntoButton.element);
- // Step into selection (keyboard shortcut only).
- this.registerShortcuts(WebInspector.ScriptsPanelDescriptor.ShortcutKeys.StepIntoSelection, this._stepIntoSelectionClicked.bind(this))
-
// Step out.
title = WebInspector.UIString("Step out of current function (%s).");
handler = this._stepOutClicked.bind(this);
@@ -994,35 +953,6 @@ WebInspector.ScriptsPanel.prototype = {
view.replaceAllWith(query, text);
},
- _onKeyDown: function(event)
- {
- if (event.keyCode !== WebInspector.KeyboardShortcut.Keys.CtrlOrMeta.code)
- return;
- if (!this._paused || !this._executionSourceFrame)
- return;
- var stepIntoMarkup = this._executionSourceFrame.stepIntoMarkup();
- if (stepIntoMarkup)
- stepIntoMarkup.moveSelectionTo(-1);
- },
-
- _onKeyUp: function(event)
- {
- if (event.keyCode !== WebInspector.KeyboardShortcut.Keys.CtrlOrMeta.code)
- return;
- if (!this._paused || !this._executionSourceFrame)
- return;
- var stepIntoMarkup = this._executionSourceFrame.stepIntoMarkup();
- if (!stepIntoMarkup)
- return;
- var currentPosition = stepIntoMarkup.getSelectedItemIndex();
- if (typeof currentPosition === "undefined") {
- stepIntoMarkup.selectFirstToExecute();
- } else {
- var rawLocation = stepIntoMarkup.getRawPosition(currentPosition);
- this.doStepIntoSelection(rawLocation);
- }
- },
-
_toggleFormatSource: function()
{
this._toggleFormatSourceButton.toggled = !this._toggleFormatSourceButton.toggled;
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/ScriptsPanelDescriptor.js b/chromium/third_party/WebKit/Source/devtools/front_end/ScriptsPanelDescriptor.js
index 4fbb07ef237..68f29c38218 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/ScriptsPanelDescriptor.js
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/ScriptsPanelDescriptor.js
@@ -62,7 +62,6 @@ WebInspector.ScriptsPanelDescriptor.prototype = {
section.addAlternateKeys(WebInspector.ScriptsPanelDescriptor.ShortcutKeys.PauseContinue, WebInspector.UIString("Pause/Continue"));
section.addAlternateKeys(WebInspector.ScriptsPanelDescriptor.ShortcutKeys.StepOver, WebInspector.UIString("Step over"));
section.addAlternateKeys(WebInspector.ScriptsPanelDescriptor.ShortcutKeys.StepInto, WebInspector.UIString("Step into"));
- section.addAlternateKeys(WebInspector.ScriptsPanelDescriptor.ShortcutKeys.StepIntoSelection, WebInspector.UIString("Step into selection"));
section.addAlternateKeys(WebInspector.ScriptsPanelDescriptor.ShortcutKeys.StepOut, WebInspector.UIString("Step out"));
var nextAndPrevFrameKeys = WebInspector.ScriptsPanelDescriptor.ShortcutKeys.NextCallFrame.concat(WebInspector.ScriptsPanelDescriptor.ShortcutKeys.PrevCallFrame);
@@ -96,11 +95,6 @@ WebInspector.ScriptsPanelDescriptor.ShortcutKeys = {
WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Semicolon, WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)
],
- StepIntoSelection: [
- WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F11, WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta),
- WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F11, WebInspector.KeyboardShortcut.Modifiers.Shift | WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)
- ],
-
StepOut: [
WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F11, WebInspector.KeyboardShortcut.Modifiers.Shift),
WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Semicolon, WebInspector.KeyboardShortcut.Modifiers.Shift | WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/Settings.js b/chromium/third_party/WebKit/Source/devtools/front_end/Settings.js
index 8162d32a64e..9e07dbf738d 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/Settings.js
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/Settings.js
@@ -261,7 +261,6 @@ WebInspector.ExperimentsSettings = function()
this.frameworksDebuggingSupport = this._createExperiment("frameworksDebuggingSupport", "Enable frameworks debugging support");
this.refreshFileSystemsOnFocus = this._createExperiment("refreshFileSystemsOnFocus", "Refresh file system folders on window focus");
this.scrollBeyondEndOfFile = this._createExperiment("scrollBeyondEndOfFile", "Support scrolling beyond end of file");
- this.layersPanel = this._createExperiment("layersPanel", "Show Layers panel");
this._cleanUpSetting();
}
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/helpScreen.css b/chromium/third_party/WebKit/Source/devtools/front_end/helpScreen.css
index 57589149e81..ed1bb8354ed 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/helpScreen.css
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/helpScreen.css
@@ -98,7 +98,7 @@ body.platform-mac .help-window-main .help-window-title {
-webkit-column-width: 470px;
}
-body.platform-mac .settings-tab .help-container {
+body.platform-mac .settings-tab.help-container {
-webkit-column-width: 430px;
}
@@ -189,36 +189,31 @@ body.platform-mac .help-key {
margin: 0 0.5em;
}
-.settings-tab fieldset {
- margin: 0;
- padding: 0;
- border: none;
-}
-
-.help-block > fieldset {
+.help-content > fieldset {
margin: 3px 0;
}
-.help-block fieldset {
+.help-content fieldset {
+ border: none;
margin-left: 7px;
padding: 0 initial;
}
-#general-tab-content .help-block fieldset legend {
+#general-tab-content .help-content fieldset legend {
font-size: 14px;
}
-body.platform-mac .settings-tab.help-block fieldset {
+body.platform-mac .settings-tab.help-content fieldset {
margin-left: 10px;
}
-.help-block fieldset p,
-.help-block fieldset fieldset {
+.help-content fieldset p,
+.help-content fieldset fieldset {
border-left: 1px solid rgb(128,128,128);
padding-left: 30px;
}
-.help-block fieldset label {
+.help-content fieldset label {
padding-right: 4px;
}
@@ -431,12 +426,12 @@ body.platform-mac .help-content input[type=radio] {
}
.settings-tab p,
-.settings-tab .help-block fieldset {
+.settings-tab fieldset {
margin: 12px 0;
}
-.settings-tab .help-block fieldset p,
-.settings-tab .help-block fieldset fieldset {
+.settings-tab fieldset p,
+.settings-tab fieldset fieldset {
border-left: none transparent;
}
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/inspector.css b/chromium/third_party/WebKit/Source/devtools/front_end/inspector.css
index 98484be958d..49a89fdf7f7 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/inspector.css
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/inspector.css
@@ -2429,16 +2429,6 @@ body.inactive li.selected .bubble.search-matches {
background-color: rgb(255, 255, 194);
}
-.source-frame-stepin-mark {
- text-decoration: underline;
- background-color: #bfccfe;
-}
-
-.source-frame-stepin-mark-highlighted {
- text-decoration: underline;
- background-color: #698cfe;
-}
-
.workers-list {
list-style: none;
margin: 0;
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/inspector.html b/chromium/third_party/WebKit/Source/devtools/front_end/inspector.html
index 2dc75042625..aafcd28e7f4 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/inspector.html
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/inspector.html
@@ -185,7 +185,6 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<script type="text/javascript" src="ProfilesPanelDescriptor.js"></script>
<script type="text/javascript" src="ScriptsPanelDescriptor.js"></script>
<script type="text/javascript" src="TimelinePanelDescriptor.js"></script>
- <script type="text/javascript" src="LayersPanelDescriptor.js"></script>
<script type="text/javascript" src="DockController.js"></script>
<script type="text/javascript" src="TracingAgent.js"></script>
<script type="text/javascript" src="DevToolsExtensionAPI.js"></script>
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/inspector.js b/chromium/third_party/WebKit/Source/devtools/front_end/inspector.js
index 5eaee481dd7..25bfe2a5aca 100644
--- a/chromium/third_party/WebKit/Source/devtools/front_end/inspector.js
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/inspector.js
@@ -46,10 +46,6 @@ var WebInspector = {
var audits = new WebInspector.PanelDescriptor("audits", WebInspector.UIString("Audits"), "AuditsPanel", "AuditsPanel.js");
var console = new WebInspector.PanelDescriptor("console", WebInspector.UIString("Console"), "ConsolePanel");
var allDescriptors = [elements, resources, network, scripts, timeline, profiles, audits, console];
- if (WebInspector.experimentsSettings.layersPanel.isEnabled()) {
- var layers = new WebInspector.LayersPanelDescriptor();
- allDescriptors.push(layers);
- }
var allProfilers = [profiles];
if (WebInspector.experimentsSettings.customizableToolbar.isEnabled()) {
allProfilers = [];
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/layersPanel.css b/chromium/third_party/WebKit/Source/devtools/front_end/layersPanel.css
deleted file mode 100644
index 3763b73962a..00000000000
--- a/chromium/third_party/WebKit/Source/devtools/front_end/layersPanel.css
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-.layers.panel .outline-disclosure {
- z-index: 10;
-}
-
-div.outline-disclosure > ol {
- margin-left: -12px;
-}
-
-.layers.panel .outline-disclosure ol.children {
- padding-left: 12px;
-}
-
-.layers-3d-view {
- overflow: hidden;
-}
-
-.layers-3d-view .rotating-container {
- -webkit-transform-style: preserve-3d;
-}
-
-.layers-3d-view .layer-container {
- position: absolute;
- opacity: 0.8;
- border: 1px solid rgba(40, 40, 40, 0.8);
- -webkit-transform: translateZ(20px);
- -webkit-transform-style: preserve-3d;
-}
-
-.layer-container .side-wall {
- position: absolute;
- background-color: inherit;
- top: 0px;
- right: 0px;
- bottom: 0px;
- left: 0px;
- height: 4px;
- width: 4px;
- -webkit-transform-origin: 0 0;
- border: solid black 1px;
-}
-
-.layer-container .back-wall {
- -webkit-transform: translateZ(-4px);
- background-color: inherit;
-}
-
-.layer-container .side-wall.top {
- width: auto;
- bottom: auto;
- -webkit-transform: rotateX(-90deg);
-}
-
-.layer-container .side-wall.bottom {
- width: auto;
- top: auto;
- -webkit-transform: translateY(4px) rotateX(-90deg);
-}
-
-.layer-container .side-wall.left {
- height: auto;
- right: auto;
- -webkit-transform: rotateY(90deg);
-}
-
-.layer-container .side-wall.right {
- height: auto;
- left: auto;
- -webkit-transform: translateX(4px) rotateY(90deg);
-}
diff --git a/chromium/third_party/WebKit/Source/devtools/protocol.json b/chromium/third_party/WebKit/Source/devtools/protocol.json
index 5cb1ddff5b8..6e56eceb79e 100644
--- a/chromium/third_party/WebKit/Source/devtools/protocol.json
+++ b/chromium/third_party/WebKit/Source/devtools/protocol.json
@@ -3216,6 +3216,7 @@
"description": "Profile.",
"properties": [
{ "name": "head", "$ref": "CPUProfileNode" },
+ { "name": "idleTime", "type": "number", "description": "Idle time in seconds." },
{ "name": "startTime", "type": "number", "description": "Profiling start time in seconds." },
{ "name": "endTime", "type": "number", "description": "Profiling end time in seconds." },
{ "name": "samples", "optional": true, "type": "array", "items": { "type": "integer" }, "description": "Ids of samples top nodes." }
@@ -3497,10 +3498,8 @@
"description": "Resource state descriptor.",
"properties": [
{ "name": "name", "type": "string", "description": "State name." },
- { "name": "enumValueForName", "type": "string", "optional": true, "description": "String representation of the enum value, if <code>name</code> stands for an enum." },
{ "name": "value", "$ref": "CallArgument", "optional": true, "description": "The value associated with the particular state." },
- { "name": "values", "type": "array", "items": { "$ref": "ResourceStateDescriptor" }, "optional": true, "description": "Array of values associated with the particular state. Either <code>value</code> or <code>values</code> will be specified." },
- { "name": "isArray", "type": "boolean", "optional": true, "description": "True iff the given <code>values</code> items stand for an array rather than a list of grouped states." }
+ { "name": "values", "type": "array", "items": { "$ref": "ResourceStateDescriptor" }, "optional": true, "description": "Array of values associated with the particular state. Either <code>value</code> or <code>values</code> will be specified." }
]
},
{
@@ -3519,11 +3518,9 @@
"type": "object",
"properties": [
{ "name": "description", "type": "string", "description": "String representation of the object." },
- { "name": "enumName", "type": "string", "optional": true, "description": "Enum name, if any, that stands for the value (for example, a WebGL enum name)." },
{ "name": "resourceId", "$ref": "ResourceId", "optional": true, "description": "Resource identifier. Specified for <code>Resource</code> objects only." },
{ "name": "type", "type": "string", "optional": true, "enum": ["object", "function", "undefined", "string", "number", "boolean"], "description": "Object type. Specified for non <code>Resource</code> objects only." },
- { "name": "subtype", "type": "string", "optional": true, "enum": ["array", "null", "node", "regexp", "date"], "description": "Object subtype hint. Specified for <code>object</code> type values only." },
- { "name": "remoteObject", "$ref": "Runtime.RemoteObject", "optional": true, "description": "The <code>RemoteObject</code>, if requested." }
+ { "name": "subtype", "type": "string", "optional": true, "enum": ["array", "null", "node", "regexp", "date"], "description": "Object subtype hint. Specified for <code>object</code> type values only." }
]
},
{
diff --git a/chromium/third_party/WebKit/Source/devtools/scripts/compile_frontend.py b/chromium/third_party/WebKit/Source/devtools/scripts/compile_frontend.py
index 3df42dd6680..01eeb46b746 100755
--- a/chromium/third_party/WebKit/Source/devtools/scripts/compile_frontend.py
+++ b/chromium/third_party/WebKit/Source/devtools/scripts/compile_frontend.py
@@ -312,16 +312,6 @@ modules = [
]
},
{
- "name": "layers",
- "dependencies": ["components"],
- "sources": [
- "LayerTreeModel.js",
- "LayersPanel.js",
- "LayerTree.js",
- "Layers3DView.js",
- ]
- },
- {
"name": "extensions",
"dependencies": ["components"],
"sources": [
diff --git a/chromium/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.cpp b/chromium/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.cpp
index 1d43fa4c34e..4e28bf2f254 100644
--- a/chromium/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.cpp
+++ b/chromium/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.cpp
@@ -35,8 +35,7 @@
namespace WebCore {
DeviceMotionController::DeviceMotionController(Document* document)
- : DOMWindowLifecycleObserver(document->domWindow())
- , DeviceSensorEventController(document)
+ : DeviceSensorEventController(document)
{
}
@@ -91,9 +90,4 @@ bool DeviceMotionController::isNullEvent(Event* event)
return !motionEvent->deviceMotionData()->canProvideEventData();
}
-void DeviceMotionController::removeAllEventListeners()
-{
- stopUpdating();
-}
-
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.h b/chromium/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.h
index 207bd52ba31..4bc4d5227c3 100644
--- a/chromium/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.h
+++ b/chromium/third_party/WebKit/Source/modules/device_orientation/DeviceMotionController.h
@@ -28,7 +28,6 @@
#define DeviceMotionController_h
#include "core/dom/Event.h"
-#include "core/page/DOMWindowLifecycleObserver.h"
#include "core/platform/Supplementable.h"
#include "modules/device_orientation/DeviceSensorEventController.h"
@@ -36,7 +35,7 @@ namespace WebCore {
class DeviceMotionData;
-class DeviceMotionController : public DeviceSensorEventController, public Supplement<ScriptExecutionContext>, public DOMWindowLifecycleObserver {
+class DeviceMotionController : public DeviceSensorEventController, public Supplement<ScriptExecutionContext> {
public:
virtual ~DeviceMotionController();
@@ -46,9 +45,6 @@ public:
void didChangeDeviceMotion(DeviceMotionData*);
- // Inherited from DOMWindowLifecycleObserver
- virtual void removeAllEventListeners() OVERRIDE;
-
private:
explicit DeviceMotionController(Document*);
virtual void registerWithDispatcher() OVERRIDE;
diff --git a/chromium/third_party/WebKit/Source/modules/encoding/OWNERS b/chromium/third_party/WebKit/Source/modules/encoding/OWNERS
deleted file mode 100644
index 6540c735acc..00000000000
--- a/chromium/third_party/WebKit/Source/modules/encoding/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-jsbell@chromium.org
-kbr@chromium.org
diff --git a/chromium/third_party/WebKit/Source/modules/filesystem/DOMFileSystemSync.cpp b/chromium/third_party/WebKit/Source/modules/filesystem/DOMFileSystemSync.cpp
index 0d4b6f60bfc..861a081be0f 100644
--- a/chromium/third_party/WebKit/Source/modules/filesystem/DOMFileSystemSync.cpp
+++ b/chromium/third_party/WebKit/Source/modules/filesystem/DOMFileSystemSync.cpp
@@ -135,12 +135,6 @@ public:
m_result->m_file = File::createForFileSystemFile(m_url, metadata).get();
}
}
-
- virtual bool shouldBlockUntilCompletion() const OVERRIDE
- {
- return true;
- }
-
private:
CreateFileHelper(PassRefPtr<CreateFileResult> result, const String& name, const KURL& url, FileSystemType type)
: m_result(result)
diff --git a/chromium/third_party/WebKit/Source/modules/filesystem/DirectoryReaderSync.cpp b/chromium/third_party/WebKit/Source/modules/filesystem/DirectoryReaderSync.cpp
index d44420449c0..3532c200b28 100644
--- a/chromium/third_party/WebKit/Source/modules/filesystem/DirectoryReaderSync.cpp
+++ b/chromium/third_party/WebKit/Source/modules/filesystem/DirectoryReaderSync.cpp
@@ -53,7 +53,7 @@ EntrySyncVector DirectoryReaderSync::readEntries(ExceptionState& es)
return EntrySyncVector();
EntriesSyncCallbackHelper helper(m_fileSystem->asyncFileSystem());
- if (!m_fileSystem->readDirectory(this, m_fullPath, helper.successCallback(), helper.errorCallback(), DOMFileSystemBase::Synchronous)) {
+ if (!m_fileSystem->readDirectory(this, m_fullPath, helper.successCallback(), helper.errorCallback())) {
es.throwDOMException(InvalidModificationError);
setHasMoreEntries(false);
return EntrySyncVector();
diff --git a/chromium/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapFactories.cpp b/chromium/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapFactories.cpp
deleted file mode 100644
index 6900a147f48..00000000000
--- a/chromium/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapFactories.cpp
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * Copyright (c) 2013, Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "modules/imagebitmap/ImageBitmapFactories.h"
-
-#include "RuntimeEnabledFeatures.h"
-#include "V8ImageBitmap.h"
-#include "bindings/v8/ExceptionState.h"
-#include "bindings/v8/ScriptScope.h"
-#include "bindings/v8/ScriptState.h"
-#include "core/html/HTMLCanvasElement.h"
-#include "core/html/HTMLImageElement.h"
-#include "core/html/HTMLVideoElement.h"
-#include "core/html/ImageData.h"
-#include "core/html/canvas/CanvasRenderingContext2D.h"
-#include "core/page/DOMWindow.h"
-#include "core/page/ImageBitmap.h"
-#include "core/platform/SharedBuffer.h"
-#include "core/platform/graphics/BitmapImage.h"
-#include "core/platform/graphics/ImageSource.h"
-#include "core/platform/graphics/skia/NativeImageSkia.h"
-
-namespace WebCore {
-
-static LayoutSize sizeFor(HTMLImageElement* image)
-{
- if (ImageResource* cachedImage = image->cachedImage())
- return cachedImage->imageSizeForRenderer(image->renderer(), 1.0f); // FIXME: Not sure about this.
- return IntSize();
-}
-
-static IntSize sizeFor(HTMLVideoElement* video)
-{
- if (MediaPlayer* player = video->player())
- return player->naturalSize();
- return IntSize();
-}
-
-static ScriptObject fulfillImageBitmap(ScriptExecutionContext* context, PassRefPtr<ImageBitmap> imageBitmap)
-{
- // Promises must be enabled.
- ASSERT(RuntimeEnabledFeatures::promiseEnabled());
- RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(context);
- resolver->fulfill(imageBitmap);
- return resolver->promise();
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, HTMLImageElement* image, ExceptionState& es)
-{
- LayoutSize s = sizeFor(image);
- return createImageBitmap(eventTarget, image, 0, 0, s.width(), s.height(), es);
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, HTMLImageElement* image, int sx, int sy, int sw, int sh, ExceptionState& es)
-{
- if (!image) {
- es.throwTypeError();
- return ScriptObject();
- }
- if (!image->cachedImage()) {
- es.throwDOMException(InvalidStateError);
- return ScriptObject();
- }
- if (image->cachedImage()->image()->isSVGImage()) {
- es.throwDOMException(InvalidStateError);
- return ScriptObject();
- }
- if (!sw || !sh) {
- es.throwDOMException(IndexSizeError);
- return ScriptObject();
- }
- if (!image->cachedImage()->image()->hasSingleSecurityOrigin()) {
- es.throwDOMException(SecurityError);
- return ScriptObject();
- }
- if (!image->cachedImage()->passesAccessControlCheck(eventTarget->toDOMWindow()->document()->securityOrigin())
- && eventTarget->toDOMWindow()->document()->securityOrigin()->taintsCanvas(image->src())) {
- es.throwDOMException(SecurityError);
- return ScriptObject();
- }
- // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
- return fulfillImageBitmap(eventTarget->scriptExecutionContext(), ImageBitmap::create(image, IntRect(sx, sy, sw, sh)));
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, HTMLVideoElement* video, ExceptionState& es)
-{
- IntSize s = sizeFor(video);
- return createImageBitmap(eventTarget, video, 0, 0, s.width(), s.height(), es);
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, HTMLVideoElement* video, int sx, int sy, int sw, int sh, ExceptionState& es)
-{
- if (!video) {
- es.throwTypeError();
- return ScriptObject();
- }
- if (!video->player()) {
- es.throwDOMException(InvalidStateError);
- return ScriptObject();
- }
- if (video->networkState() == HTMLMediaElement::NETWORK_EMPTY) {
- es.throwDOMException(InvalidStateError);
- return ScriptObject();
- }
- if (video->player()->readyState() <= MediaPlayer::HaveMetadata) {
- es.throwDOMException(InvalidStateError);
- return ScriptObject();
- }
- if (!sw || !sh) {
- es.throwDOMException(IndexSizeError);
- return ScriptObject();
- }
- if (!video->hasSingleSecurityOrigin()) {
- es.throwDOMException(SecurityError);
- return ScriptObject();
- }
- if (!video->player()->didPassCORSAccessCheck() && eventTarget->toDOMWindow()->document()->securityOrigin()->taintsCanvas(video->currentSrc())) {
- es.throwDOMException(SecurityError);
- return ScriptObject();
- }
- // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
- return fulfillImageBitmap(eventTarget->scriptExecutionContext(), ImageBitmap::create(video, IntRect(sx, sy, sw, sh)));
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, CanvasRenderingContext2D* context, ExceptionState& es)
-{
- return createImageBitmap(eventTarget, context->canvas(), es);
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, CanvasRenderingContext2D* context, int sx, int sy, int sw, int sh, ExceptionState& es)
-{
- return createImageBitmap(eventTarget, context->canvas(), sx, sy, sw, sh, es);
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, HTMLCanvasElement* canvas, ExceptionState& es)
-{
- return createImageBitmap(eventTarget, canvas, 0, 0, canvas->width(), canvas->height(), es);
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, HTMLCanvasElement* canvas, int sx, int sy, int sw, int sh, ExceptionState& es)
-{
- if (!canvas) {
- es.throwTypeError();
- return ScriptObject();
- }
- if (!canvas->originClean()) {
- es.throwDOMException(InvalidStateError);
- return ScriptObject();
- }
- if (!sw || !sh) {
- es.throwDOMException(IndexSizeError);
- return ScriptObject();
- }
- // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
- return fulfillImageBitmap(eventTarget->scriptExecutionContext(), ImageBitmap::create(canvas, IntRect(sx, sy, sw, sh)));
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, Blob* blob, ExceptionState& es)
-{
- // Promises must be enabled.
- ASSERT(RuntimeEnabledFeatures::promiseEnabled());
-
- if (!blob) {
- es.throwDOMException(TypeError);
- return ScriptObject();
- }
- RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(eventTarget->scriptExecutionContext());
- RefPtr<ImageBitmapLoader> loader = ImageBitmapFactories::ImageBitmapLoader::create(from(eventTarget->toDOMWindow()), resolver, IntRect());
- from(eventTarget->toDOMWindow())->addLoader(loader);
- loader->loadBlobAsync(eventTarget->scriptExecutionContext(), blob);
- return resolver->promise();
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, Blob* blob, int sx, int sy, int sw, int sh, ExceptionState& es)
-{
- // Promises must be enabled.
- ASSERT(RuntimeEnabledFeatures::promiseEnabled());
-
- if (!blob) {
- es.throwDOMException(TypeError);
- return ScriptObject();
- }
- if (!sw || !sh) {
- es.throwDOMException(IndexSizeError);
- return ScriptObject();
- }
- RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(eventTarget->scriptExecutionContext());
- RefPtr<ImageBitmapLoader> loader = ImageBitmapFactories::ImageBitmapLoader::create(from(eventTarget->toDOMWindow()), resolver, IntRect(sx, sy, sw, sh));
- from(eventTarget->toDOMWindow())->addLoader(loader);
- loader->loadBlobAsync(eventTarget->scriptExecutionContext(), blob);
- return resolver->promise();
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, ImageData* data, ExceptionState& es)
-{
- return createImageBitmap(eventTarget, data, 0, 0, data->width(), data->height(), es);
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, ImageData* data, int sx, int sy, int sw, int sh, ExceptionState& es)
-{
- if (!data) {
- es.throwTypeError();
- return ScriptObject();
- }
- if (!sw || !sh) {
- es.throwDOMException(IndexSizeError);
- return ScriptObject();
- }
- // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
- return fulfillImageBitmap(eventTarget->scriptExecutionContext(), ImageBitmap::create(data, IntRect(sx, sy, sw, sh)));
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, ImageBitmap* bitmap, ExceptionState& es)
-{
- return createImageBitmap(eventTarget, bitmap, 0, 0, bitmap->width(), bitmap->height(), es);
-}
-
-ScriptObject ImageBitmapFactories::createImageBitmap(EventTarget* eventTarget, ImageBitmap* bitmap, int sx, int sy, int sw, int sh, ExceptionState& es)
-{
- if (!bitmap) {
- es.throwTypeError();
- return ScriptObject();
- }
- if (!sw || !sh) {
- es.throwDOMException(IndexSizeError);
- return ScriptObject();
- }
- // FIXME: make ImageBitmap creation asynchronous crbug.com/258082
- return fulfillImageBitmap(eventTarget->scriptExecutionContext(), ImageBitmap::create(bitmap, IntRect(sx, sy, sw, sh)));
-}
-
-const char* ImageBitmapFactories::supplementName()
-{
- return "ImageBitmapFactories";
-}
-
-ImageBitmapFactories* ImageBitmapFactories::from(DOMWindow* window)
-{
- ImageBitmapFactories* supplement = static_cast<ImageBitmapFactories*>(Supplement<DOMWindow>::from(window, supplementName()));
- if (!supplement) {
- supplement = new ImageBitmapFactories();
- provideTo(window, supplementName(), adoptPtr(supplement));
- }
- return supplement;
-}
-
-void ImageBitmapFactories::addLoader(PassRefPtr<ImageBitmapLoader> loader)
-{
- m_pendingLoaders.add(loader);
-}
-
-void ImageBitmapFactories::didFinishLoading(ImageBitmapLoader* loader)
-{
- ASSERT(m_pendingLoaders.contains(loader));
- m_pendingLoaders.remove(loader);
-}
-
-ImageBitmapFactories::ImageBitmapLoader::ImageBitmapLoader(ImageBitmapFactories* factory, PassRefPtr<ScriptPromiseResolver> resolver, const IntRect& cropRect)
- : m_loader(FileReaderLoader::ReadAsArrayBuffer, this)
- , m_scriptState(ScriptState::current())
- , m_factory(factory)
- , m_resolver(resolver)
- , m_cropRect(cropRect)
-{
-}
-
-void ImageBitmapFactories::ImageBitmapLoader::loadBlobAsync(ScriptExecutionContext* context, Blob* blob)
-{
- m_loader.start(context, *blob);
-}
-
-void ImageBitmapFactories::ImageBitmapLoader::rejectPromise()
-{
- ScriptScope scope(m_scriptState);
- m_resolver->reject(ScriptValue::createNull());
- m_factory->didFinishLoading(this);
-}
-
-void ImageBitmapFactories::ImageBitmapLoader::didFinishLoading()
-{
- if (!m_loader.arrayBufferResult()) {
- rejectPromise();
- return;
- }
- RefPtr<SharedBuffer> sharedBuffer = SharedBuffer::create((char*)m_loader.arrayBufferResult()->data(), m_loader.arrayBufferResult()->byteLength());
-
- OwnPtr<ImageSource> source = adoptPtr(new ImageSource());
- source->setData(sharedBuffer.get(), true);
- RefPtr<NativeImageSkia> imageSkia = source->createFrameAtIndex(0);
- if (!imageSkia) {
- rejectPromise();
- return;
- }
-
- RefPtr<Image> image = BitmapImage::create(imageSkia);
- if (!image->width() || !image->height()) {
- rejectPromise();
- return;
- }
- if (!m_cropRect.width() && !m_cropRect.height()) {
- // No cropping variant was called.
- m_cropRect = IntRect(IntPoint(), image->size());
- }
-
- RefPtr<ImageBitmap> imageBitmap = ImageBitmap::create(image.get(), m_cropRect);
- ScriptScope scope(m_scriptState);
- m_resolver->fulfill(imageBitmap.release());
- m_factory->didFinishLoading(this);
-}
-
-void ImageBitmapFactories::ImageBitmapLoader::didFail(FileError::ErrorCode)
-{
- rejectPromise();
-}
-
-} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapFactories.h b/chromium/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapFactories.h
deleted file mode 100644
index b8a7472f5e6..00000000000
--- a/chromium/third_party/WebKit/Source/modules/imagebitmap/ImageBitmapFactories.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2013, Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef ImageBitmapFactories_h
-#define ImageBitmapFactories_h
-
-#include "bindings/v8/ScriptPromiseResolver.h"
-#include "bindings/v8/ScriptState.h"
-#include "core/fileapi/FileReaderLoader.h"
-#include "core/fileapi/FileReaderLoaderClient.h"
-#include "core/platform/Supplementable.h"
-#include "core/platform/graphics/IntRect.h"
-#include "wtf/Forward.h"
-#include "wtf/HashSet.h"
-
-namespace WebCore {
-
-class Blob;
-class CanvasRenderingContext2D;
-class EventTarget;
-class ExceptionState;
-class HTMLCanvasElement;
-class HTMLImageElement;
-class HTMLVideoElement;
-class ImageBitmap;
-class ImageData;
-class ScriptExecutionContext;
-
-class ImageBitmapFactories : public Supplement<DOMWindow> {
-
-class ImageBitmapLoader;
-
-public:
- static ScriptObject createImageBitmap(EventTarget*, HTMLImageElement*, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, HTMLImageElement*, int sx, int sy, int sw, int sh, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, HTMLVideoElement*, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, HTMLVideoElement*, int sx, int sy, int sw, int sh, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, CanvasRenderingContext2D*, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, CanvasRenderingContext2D*, int sx, int sy, int sw, int sh, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, HTMLCanvasElement*, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, HTMLCanvasElement*, int sx, int sy, int sw, int sh, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, Blob*, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, Blob*, int sx, int sy, int sw, int sh, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, ImageData*, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, ImageData*, int sx, int sy, int sw, int sh, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, ImageBitmap*, ExceptionState&);
- static ScriptObject createImageBitmap(EventTarget*, ImageBitmap*, int sx, int sy, int sw, int sh, ExceptionState&);
-
- void addLoader(PassRefPtr<ImageBitmapLoader>);
- void didFinishLoading(ImageBitmapLoader*);
-
- virtual ~ImageBitmapFactories() { }
- static ImageBitmapFactories* from(DOMWindow*);
-
-private:
- class ImageBitmapLoader : public RefCounted<ImageBitmapLoader>, public FileReaderLoaderClient {
- public:
- static PassRefPtr<ImageBitmapLoader> create(ImageBitmapFactories* factory, PassRefPtr<ScriptPromiseResolver> resolver, const IntRect& cropRect)
- {
- return adoptRef(new ImageBitmapLoader(factory, resolver, cropRect));
- }
-
- void loadBlobAsync(ScriptExecutionContext*, Blob*);
-
- ~ImageBitmapLoader() { }
-
- private:
- ImageBitmapLoader(ImageBitmapFactories*, PassRefPtr<ScriptPromiseResolver>, const IntRect&);
-
- void rejectPromise();
-
- // FileReaderLoaderClient
- virtual void didStartLoading() OVERRIDE { }
- virtual void didReceiveData() OVERRIDE { }
- virtual void didFinishLoading() OVERRIDE;
- virtual void didFail(FileError::ErrorCode) OVERRIDE;
-
- ScriptState* m_scriptState;
- FileReaderLoader m_loader;
- ImageBitmapFactories* m_factory;
- RefPtr<ScriptPromiseResolver> m_resolver;
- IntRect m_cropRect;
- };
-
- static const char* supplementName();
-
- HashSet<RefPtr<ImageBitmapLoader> > m_pendingLoaders;
-};
-
-} // namespace WebCore
-
-#endif // ImageBitmapFactories_h
diff --git a/chromium/third_party/WebKit/Source/modules/imagebitmap/OWNERS b/chromium/third_party/WebKit/Source/modules/imagebitmap/OWNERS
deleted file mode 100644
index 9c1707ac0fd..00000000000
--- a/chromium/third_party/WebKit/Source/modules/imagebitmap/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-arbesfeld@chromium.org
-junov@chromium.org \ No newline at end of file
diff --git a/chromium/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp b/chromium/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp
index 180905749f8..9f99d943409 100644
--- a/chromium/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp
+++ b/chromium/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp
@@ -100,7 +100,7 @@ PassRefPtr<RTCConfiguration> RTCPeerConnection::parseConfiguration(const Diction
return 0;
}
KURL url(KURL(), urlString);
- if (!url.isValid() || !(url.protocolIs("turn") || url.protocolIs("turns") || url.protocolIs("stun"))) {
+ if (!url.isValid() || !(url.protocolIs("turn") || url.protocolIs("stun"))) {
es.throwDOMException(TypeMismatchError);
return 0;
}
diff --git a/chromium/third_party/WebKit/Source/modules/modules.gypi b/chromium/third_party/WebKit/Source/modules/modules.gypi
index 872b0df2b09..ba24a2ed92a 100644
--- a/chromium/third_party/WebKit/Source/modules/modules.gypi
+++ b/chromium/third_party/WebKit/Source/modules/modules.gypi
@@ -50,7 +50,6 @@
'geolocation/Geolocation.idl',
'geolocation/Geoposition.idl',
'geolocation/PositionError.idl',
- 'imagebitmap/ImageBitmapFactories.idl',
'indexeddb/IDBAny.idl',
'indexeddb/IDBCursor.idl',
'indexeddb/IDBCursorWithValue.idl',
@@ -346,8 +345,6 @@
'geolocation/GeolocationController.cpp',
'geolocation/NavigatorGeolocation.cpp',
'geolocation/NavigatorGeolocation.h',
- 'imagebitmap/ImageBitmapFactories.cpp',
- 'imagebitmap/ImageBitmapFactories.h',
'indexeddb/DOMWindowIndexedDatabase.cpp',
'indexeddb/DOMWindowIndexedDatabase.h',
'indexeddb/IDBAny.cpp',
diff --git a/chromium/third_party/WebKit/Source/modules/navigatorcontentutils/NavigatorContentUtils.cpp b/chromium/third_party/WebKit/Source/modules/navigatorcontentutils/NavigatorContentUtils.cpp
index df33faf653a..865e0f26b8f 100644
--- a/chromium/third_party/WebKit/Source/modules/navigatorcontentutils/NavigatorContentUtils.cpp
+++ b/chromium/third_party/WebKit/Source/modules/navigatorcontentutils/NavigatorContentUtils.cpp
@@ -62,7 +62,7 @@ static void initProtocolHandlerWhitelist()
"tel",
"urn",
"webcal",
- "wtai",
+ "webtai",
"xmpp",
};
for (size_t i = 0; i < WTF_ARRAY_LENGTH(protocols); ++i)
@@ -106,8 +106,7 @@ static bool isProtocolWhitelisted(const String& scheme)
static bool verifyProtocolHandlerScheme(const String& scheme, ExceptionState& es)
{
if (scheme.startsWith("web+")) {
- // The specification requires that the length of scheme is at least five characteres (including 'web+' prefix).
- if (scheme.length() >= 5 && isValidProtocol(scheme))
+ if (isValidProtocol(scheme))
return true;
es.throwDOMException(SecurityError);
return false;
diff --git a/chromium/third_party/WebKit/Source/web/AssociatedURLLoader.cpp b/chromium/third_party/WebKit/Source/web/AssociatedURLLoader.cpp
index 98f9cae4fe2..ccf03cb1737 100644
--- a/chromium/third_party/WebKit/Source/web/AssociatedURLLoader.cpp
+++ b/chromium/third_party/WebKit/Source/web/AssociatedURLLoader.cpp
@@ -37,6 +37,7 @@
#include "core/loader/CrossOriginAccessControl.h"
#include "core/loader/DocumentThreadableLoader.h"
#include "core/loader/DocumentThreadableLoaderClient.h"
+#include "core/loader/ResourceLoader.h"
#include "core/platform/Timer.h"
#include "core/platform/chromium/support/WrappedResourceRequest.h"
#include "core/platform/chromium/support/WrappedResourceResponse.h"
diff --git a/chromium/third_party/WebKit/Source/web/AsyncFileSystemChromium.cpp b/chromium/third_party/WebKit/Source/web/AsyncFileSystemChromium.cpp
index 66b37edee11..32d2e4fa808 100644
--- a/chromium/third_party/WebKit/Source/web/AsyncFileSystemChromium.cpp
+++ b/chromium/third_party/WebKit/Source/web/AsyncFileSystemChromium.cpp
@@ -50,7 +50,9 @@ PassOwnPtr<AsyncFileSystem> AsyncFileSystem::create()
}
AsyncFileSystemChromium::AsyncFileSystemChromium()
+ : m_webFileSystem(WebKit::Platform::current()->fileSystem())
{
+ ASSERT(m_webFileSystem);
}
AsyncFileSystemChromium::~AsyncFileSystemChromium()
@@ -59,52 +61,52 @@ AsyncFileSystemChromium::~AsyncFileSystemChromium()
void AsyncFileSystemChromium::move(const KURL& sourcePath, const KURL& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
{
- webFileSystem()->move(sourcePath, destinationPath, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+ m_webFileSystem->move(sourcePath, destinationPath, new WebKit::WebFileSystemCallbacksImpl(callbacks));
}
void AsyncFileSystemChromium::copy(const KURL& sourcePath, const KURL& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
{
- webFileSystem()->copy(sourcePath, destinationPath, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+ m_webFileSystem->copy(sourcePath, destinationPath, new WebKit::WebFileSystemCallbacksImpl(callbacks));
}
void AsyncFileSystemChromium::remove(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
{
- webFileSystem()->remove(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+ m_webFileSystem->remove(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
}
void AsyncFileSystemChromium::removeRecursively(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
{
- webFileSystem()->removeRecursively(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+ m_webFileSystem->removeRecursively(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
}
void AsyncFileSystemChromium::readMetadata(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
{
- webFileSystem()->readMetadata(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+ m_webFileSystem->readMetadata(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
}
void AsyncFileSystemChromium::createFile(const KURL& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
{
- webFileSystem()->createFile(path, exclusive, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+ m_webFileSystem->createFile(path, exclusive, new WebKit::WebFileSystemCallbacksImpl(callbacks));
}
void AsyncFileSystemChromium::createDirectory(const KURL& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
{
- webFileSystem()->createDirectory(path, exclusive, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+ m_webFileSystem->createDirectory(path, exclusive, new WebKit::WebFileSystemCallbacksImpl(callbacks));
}
void AsyncFileSystemChromium::fileExists(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
{
- webFileSystem()->fileExists(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+ m_webFileSystem->fileExists(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
}
void AsyncFileSystemChromium::directoryExists(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
{
- webFileSystem()->directoryExists(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+ m_webFileSystem->directoryExists(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
}
void AsyncFileSystemChromium::readDirectory(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
{
- webFileSystem()->readDirectory(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+ m_webFileSystem->readDirectory(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
}
void AsyncFileSystemChromium::createWriter(AsyncFileWriterClient* client, const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
@@ -112,17 +114,12 @@ void AsyncFileSystemChromium::createWriter(AsyncFileWriterClient* client, const
OwnPtr<AsyncFileWriterChromium> asyncFileWriter = AsyncFileWriterChromium::create(client);
WebKit::WebFileWriterClient* writerClient = asyncFileWriter.get();
- webFileSystem()->createFileWriter(path, writerClient, new WebKit::WebFileSystemCallbacksImpl(callbacks, asyncFileWriter.release()));
+ m_webFileSystem->createFileWriter(path, writerClient, new WebKit::WebFileSystemCallbacksImpl(callbacks, asyncFileWriter.release()));
}
void AsyncFileSystemChromium::createSnapshotFileAndReadMetadata(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
{
- webFileSystem()->createSnapshotFileAndReadMetadata(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
-}
-
-WebKit::WebFileSystem* AsyncFileSystemChromium::webFileSystem()
-{
- return WebKit::Platform::current()->fileSystem();
+ m_webFileSystem->createSnapshotFileAndReadMetadata(path, new WebKit::WebFileSystemCallbacksImpl(callbacks));
}
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/web/AsyncFileSystemChromium.h b/chromium/third_party/WebKit/Source/web/AsyncFileSystemChromium.h
index 1eaa9c2d89e..66496f50f70 100644
--- a/chromium/third_party/WebKit/Source/web/AsyncFileSystemChromium.h
+++ b/chromium/third_party/WebKit/Source/web/AsyncFileSystemChromium.h
@@ -64,9 +64,10 @@ public:
virtual void createWriter(AsyncFileWriterClient*, const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks>);
virtual void createSnapshotFileAndReadMetadata(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks>);
-private:
+protected:
AsyncFileSystemChromium();
- WebKit::WebFileSystem* webFileSystem();
+
+ WebKit::WebFileSystem* m_webFileSystem;
};
} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/web/BackForwardClientImpl.cpp b/chromium/third_party/WebKit/Source/web/BackForwardClientImpl.cpp
index 6e2c17f4bca..1cbbdb177e5 100644
--- a/chromium/third_party/WebKit/Source/web/BackForwardClientImpl.cpp
+++ b/chromium/third_party/WebKit/Source/web/BackForwardClientImpl.cpp
@@ -33,11 +33,15 @@
#include "WebViewClient.h"
#include "WebViewImpl.h"
+#include "core/history/HistoryItem.h"
+#include "wtf/text/StringConcatenate.h"
using namespace WebCore;
namespace WebKit {
+const char backForwardNavigationScheme[] = "chrome-back-forward";
+
BackForwardClientImpl::BackForwardClientImpl(WebViewImpl* webView)
: m_webView(webView)
{
@@ -47,11 +51,49 @@ BackForwardClientImpl::~BackForwardClientImpl()
{
}
-void BackForwardClientImpl::didAddItem()
+void BackForwardClientImpl::addItem(PassRefPtr<HistoryItem> item)
{
+ m_currentItem = item;
+
// If WebCore adds a new HistoryItem, it means this is a new navigation (ie,
// not a reload or back/forward).
m_webView->observeNewNavigation();
+
+ if (m_webView->client())
+ m_webView->client()->didAddHistoryItem();
+}
+
+void BackForwardClientImpl::goToItem(HistoryItem* item)
+{
+ m_currentItem = item;
+
+ if (m_pendingHistoryItem == item)
+ m_pendingHistoryItem = 0;
+}
+
+HistoryItem* BackForwardClientImpl::itemAtIndex(int index)
+{
+ if (!m_webView->client())
+ return 0;
+
+ if (!index)
+ return m_currentItem.get();
+
+ if (index > forwardListCount() || -index > backListCount())
+ return 0;
+
+ // Since we don't keep the entire back/forward list, we have no way to
+ // properly implement this method. We return a dummy entry instead that we
+ // intercept in our FrameLoaderClient implementation in case WebCore asks
+ // to navigate to this HistoryItem.
+
+ // FIXME: We should change WebCore to handle history.{back,forward,go}
+ // differently. It should perhaps just ask the FrameLoaderClient to
+ // perform those navigations.
+
+ String urlString = String(backForwardNavigationScheme) + "://go/" + String::number(index);
+ m_pendingHistoryItem = HistoryItem::create(urlString);
+ return m_pendingHistoryItem.get();
}
int BackForwardClientImpl::backListCount()
@@ -70,4 +112,15 @@ int BackForwardClientImpl::forwardListCount()
return m_webView->client()->historyForwardListCount();
}
+bool BackForwardClientImpl::isActive()
+{
+ return m_webView->client();
+}
+
+void BackForwardClientImpl::close()
+{
+ m_currentItem = 0;
+ m_pendingHistoryItem = 0;
+}
+
} // namespace WebKit
diff --git a/chromium/third_party/WebKit/Source/web/BackForwardClientImpl.h b/chromium/third_party/WebKit/Source/web/BackForwardClientImpl.h
index 6550a4075ef..c76680948f3 100644
--- a/chromium/third_party/WebKit/Source/web/BackForwardClientImpl.h
+++ b/chromium/third_party/WebKit/Source/web/BackForwardClientImpl.h
@@ -37,6 +37,8 @@
namespace WebKit {
class WebViewImpl;
+extern const char backForwardNavigationScheme[];
+
class BackForwardClientImpl : public WebCore::BackForwardClient {
public:
explicit BackForwardClientImpl(WebViewImpl*);
@@ -44,11 +46,21 @@ public:
private:
// WebCore::BackForwardList methods:
- virtual void didAddItem();
+ virtual void addItem(PassRefPtr<WebCore::HistoryItem>);
+ virtual void goToItem(WebCore::HistoryItem*);
+ virtual WebCore::HistoryItem* itemAtIndex(int index);
virtual int backListCount();
virtual int forwardListCount();
+ virtual bool isActive();
+ virtual void close();
WebViewImpl* m_webView;
+
+ RefPtr<WebCore::HistoryItem> m_currentItem;
+
+ // The last history item that was accessed via itemAtIndex(). We keep track
+ // of this until goToItem() is called, so we can track the navigation.
+ RefPtr<WebCore::HistoryItem> m_pendingHistoryItem;
};
} // namespace WebKit
diff --git a/chromium/third_party/WebKit/Source/web/ChromeClientImpl.cpp b/chromium/third_party/WebKit/Source/web/ChromeClientImpl.cpp
index a567df5fb45..bea7012f64d 100644
--- a/chromium/third_party/WebKit/Source/web/ChromeClientImpl.cpp
+++ b/chromium/third_party/WebKit/Source/web/ChromeClientImpl.cpp
@@ -921,7 +921,7 @@ void ChromeClientImpl::openPasswordGenerator(HTMLInputElement* input)
m_webView->passwordGeneratorClient()->openPasswordGenerator(webInput);
}
-bool ChromeClientImpl::shouldRunModalDialogDuringPageDismissal(const DialogType& dialogType, const String& dialogMessage, Document::PageDismissalType dismissalType) const
+bool ChromeClientImpl::shouldRunModalDialogDuringPageDismissal(const DialogType& dialogType, const String& dialogMessage, FrameLoader::PageDismissalType dismissalType) const
{
const char* kDialogs[] = {"alert", "confirm", "prompt", "showModalDialog"};
int dialog = static_cast<int>(dialogType);
diff --git a/chromium/third_party/WebKit/Source/web/ChromeClientImpl.h b/chromium/third_party/WebKit/Source/web/ChromeClientImpl.h
index 639e9d9550b..71c4ace37ea 100644
--- a/chromium/third_party/WebKit/Source/web/ChromeClientImpl.h
+++ b/chromium/third_party/WebKit/Source/web/ChromeClientImpl.h
@@ -175,7 +175,7 @@ public:
virtual bool isPasswordGenerationEnabled() const OVERRIDE;
virtual void openPasswordGenerator(WebCore::HTMLInputElement*) OVERRIDE;
- virtual bool shouldRunModalDialogDuringPageDismissal(const DialogType&, const String& dialogMessage, WebCore::Document::PageDismissalType) const;
+ virtual bool shouldRunModalDialogDuringPageDismissal(const DialogType&, const String& dialogMessage, WebCore::FrameLoader::PageDismissalType) const;
virtual bool shouldRubberBandInDirection(WebCore::ScrollDirection) const;
virtual void numWheelEventHandlersChanged(unsigned);
diff --git a/chromium/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp b/chromium/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp
index c8f36925cf7..a44c87d653e 100644
--- a/chromium/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp
+++ b/chromium/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp
@@ -122,7 +122,7 @@ static String selectMisspelledWord(Frame* selectedFrame)
// Selection is empty, so change the selection to the word under the cursor.
HitTestResult hitTestResult = selectedFrame->eventHandler()->
- hitTestResultAtPoint(selectedFrame->page()->contextMenuController().hitTestResult().pointInInnerNodeFrame());
+ hitTestResultAtPoint(selectedFrame->page()->contextMenuController()->hitTestResult().pointInInnerNodeFrame());
Node* innerNode = hitTestResult.innerNode();
VisiblePosition pos(innerNode->renderer()->positionForPoint(
hitTestResult.localPoint()));
@@ -184,7 +184,7 @@ void ContextMenuClientImpl::showContextMenu(const WebCore::ContextMenu* defaultM
if (!m_webView->contextMenuAllowed())
return;
- HitTestResult r = m_webView->page()->contextMenuController().hitTestResult();
+ HitTestResult r = m_webView->page()->contextMenuController()->hitTestResult();
Frame* selectedFrame = r.innerNodeFrame();
WebContextMenuData data;
@@ -368,12 +368,6 @@ void ContextMenuClientImpl::showContextMenu(const WebCore::ContextMenu* defaultM
m_webView->client()->showContextMenu(selected_web_frame, data);
}
-void ContextMenuClientImpl::clearContextMenu()
-{
- if (m_webView->client())
- m_webView->client()->clearContextMenu();
-}
-
static void populateSubMenuItems(const Vector<ContextMenuItem>& inputMenu, WebVector<WebMenuItemInfo>& subMenuItems)
{
Vector<WebMenuItemInfo> subItems;
diff --git a/chromium/third_party/WebKit/Source/web/ContextMenuClientImpl.h b/chromium/third_party/WebKit/Source/web/ContextMenuClientImpl.h
index 5b0875c064a..b44c79add7f 100644
--- a/chromium/third_party/WebKit/Source/web/ContextMenuClientImpl.h
+++ b/chromium/third_party/WebKit/Source/web/ContextMenuClientImpl.h
@@ -43,7 +43,6 @@ public:
ContextMenuClientImpl(WebViewImpl* webView) : m_webView(webView) {}
virtual ~ContextMenuClientImpl() {}
virtual void showContextMenu(const WebCore::ContextMenu*);
- virtual void clearContextMenu();
private:
void populateCustomMenuItems(const WebCore::ContextMenu*, WebContextMenuData*);
WebViewImpl* m_webView;
diff --git a/chromium/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp b/chromium/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp
index 640bfb2563c..7a5f0c8ad5a 100644
--- a/chromium/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp
+++ b/chromium/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp
@@ -44,6 +44,7 @@
#include "core/loader/FrameLoadRequest.h"
#include "core/loader/FrameLoader.h"
#include "core/loader/ProgressTracker.h"
+#include "core/loader/ResourceLoader.h"
#include "core/page/Chrome.h"
#include "core/page/EventHandler.h"
#include "core/page/FrameView.h"
@@ -523,11 +524,36 @@ void FrameLoaderClientImpl::loadURLExternally(const ResourceRequest& request, Na
}
}
-void FrameLoaderClientImpl::navigateBackForward(int offset) const
+bool FrameLoaderClientImpl::shouldGoToHistoryItem(HistoryItem* item) const
{
+ const KURL& url = item->url();
+ if (!url.protocolIs(backForwardNavigationScheme))
+ return true;
+
+ // Else, we'll punt this history navigation to the embedder. It is
+ // necessary that we intercept this here, well before the FrameLoader
+ // has made any state changes for this history traversal.
+
+ bool ok;
+ int offset = url.lastPathComponent().toIntStrict(&ok);
+ if (!ok) {
+ ASSERT_NOT_REACHED();
+ return false;
+ }
+
WebViewImpl* webview = m_webFrame->viewImpl();
if (webview->client())
webview->client()->navigateBackForwardSoon(offset);
+
+ return false;
+}
+
+bool FrameLoaderClientImpl::shouldStopLoadingForHistoryItem(HistoryItem* targetItem) const
+{
+ // Don't stop loading for pseudo-back-forward URLs, since they will get
+ // translated and then pass through again.
+ const KURL& url = targetItem->url();
+ return !url.protocolIs(backForwardNavigationScheme);
}
void FrameLoaderClientImpl::didAccessInitialDocument()
diff --git a/chromium/third_party/WebKit/Source/web/FrameLoaderClientImpl.h b/chromium/third_party/WebKit/Source/web/FrameLoaderClientImpl.h
index 103567a883c..468c4dc2dfb 100644
--- a/chromium/third_party/WebKit/Source/web/FrameLoaderClientImpl.h
+++ b/chromium/third_party/WebKit/Source/web/FrameLoaderClientImpl.h
@@ -100,7 +100,8 @@ public:
virtual void postProgressEstimateChangedNotification();
virtual void postProgressFinishedNotification();
virtual void loadURLExternally(const WebCore::ResourceRequest&, WebCore::NavigationPolicy, const String& suggestedName = String());
- virtual void navigateBackForward(int offset) const;
+ virtual bool shouldGoToHistoryItem(WebCore::HistoryItem*) const;
+ virtual bool shouldStopLoadingForHistoryItem(WebCore::HistoryItem*) const;
virtual void didAccessInitialDocument();
virtual void didDisownOpener();
virtual void didDisplayInsecureContent();
diff --git a/chromium/third_party/WebKit/Source/web/PageOverlay.cpp b/chromium/third_party/WebKit/Source/web/PageOverlay.cpp
index 9166835f2ca..c0e7911c527 100644
--- a/chromium/third_party/WebKit/Source/web/PageOverlay.cpp
+++ b/chromium/third_party/WebKit/Source/web/PageOverlay.cpp
@@ -110,15 +110,6 @@ void PageOverlay::update()
m_layer = GraphicsLayer::create(m_viewImpl->graphicsLayerFactory(), m_layerClient.get());
m_layer->setName("WebViewImpl page overlay content");
m_layer->setDrawsContent(true);
-
- // Compositor hit-testing does not know how to deal with layers that may be
- // transparent to events (see http://crbug.com/269598). So require
- // scrolling and touches on this layer to go to the main thread.
- WebLayer* platformLayer = m_layer->platformLayer();
- platformLayer->setShouldScrollOnMainThread(true);
- WebVector<WebRect> webRects(static_cast<size_t>(1));
- webRects[0] = WebRect(0, 0, INT_MAX, INT_MAX);
- platformLayer->setTouchEventHandlerRegion(webRects);
}
FloatSize size(m_viewImpl->size());
@@ -131,6 +122,9 @@ void PageOverlay::update()
m_viewImpl->setOverlayLayer(m_layer.get());
m_layer->setNeedsDisplay();
+
+ WebLayer* platformLayer = m_layer->platformLayer();
+ platformLayer->setShouldScrollOnMainThread(true);
}
void PageOverlay::paintWebFrame(GraphicsContext& gc)
diff --git a/chromium/third_party/WebKit/Source/web/WebCache.cpp b/chromium/third_party/WebKit/Source/web/WebCache.cpp
index c68013d8f7e..8ae3cd6062d 100644
--- a/chromium/third_party/WebKit/Source/web/WebCache.cpp
+++ b/chromium/third_party/WebKit/Source/web/WebCache.cpp
@@ -31,7 +31,7 @@
#include "config.h"
#include "WebCache.h"
-#include "core/fetch/MemoryCache.h"
+#include "core/loader/cache/MemoryCache.h"
using WebCore::MemoryCache;
diff --git a/chromium/third_party/WebKit/Source/web/WebCachedURLRequest.cpp b/chromium/third_party/WebKit/Source/web/WebCachedURLRequest.cpp
index a1d9eecf30e..4f5d16d0642 100644
--- a/chromium/third_party/WebKit/Source/web/WebCachedURLRequest.cpp
+++ b/chromium/third_party/WebKit/Source/web/WebCachedURLRequest.cpp
@@ -31,7 +31,7 @@
#include "config.h"
#include "WebCachedURLRequest.h"
-#include "core/fetch/FetchRequest.h"
+#include "core/loader/cache/FetchRequest.h"
#include "core/platform/chromium/support/WrappedResourceRequest.h"
#include "public/platform/WebURLRequest.h"
diff --git a/chromium/third_party/WebKit/Source/web/WebDataSourceImpl.cpp b/chromium/third_party/WebKit/Source/web/WebDataSourceImpl.cpp
index 0ed7727edb9..fe987cdadf4 100644
--- a/chromium/third_party/WebKit/Source/web/WebDataSourceImpl.cpp
+++ b/chromium/third_party/WebKit/Source/web/WebDataSourceImpl.cpp
@@ -32,7 +32,6 @@
#include "WebDataSourceImpl.h"
#include "ApplicationCacheHostInternal.h"
-#include "core/dom/Document.h"
#include "core/loader/FrameLoader.h"
#include "public/platform/WebURL.h"
#include "public/platform/WebURLError.h"
@@ -98,14 +97,12 @@ bool WebDataSourceImpl::replacesCurrentHistoryItem() const
WebString WebDataSourceImpl::pageTitle() const
{
- ASSERT(frame()->loader()->documentLoader() == this);
- return frame()->document()->title();
+ return title().string();
}
WebTextDirection WebDataSourceImpl::pageTitleDirection() const
{
- ASSERT(frame()->loader()->documentLoader() == this);
- return frame()->document()->titleWithDirection().direction() == LTR ? WebTextDirectionLeftToRight : WebTextDirectionRightToLeft;
+ return title().direction() == LTR ? WebTextDirectionLeftToRight : WebTextDirectionRightToLeft;
}
WebNavigationType WebDataSourceImpl::navigationType() const
diff --git a/chromium/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp b/chromium/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
index 3ea57461e1f..0f533fbad5e 100644
--- a/chromium/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
+++ b/chromium/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
@@ -46,9 +46,9 @@
#include "bindings/v8/V8Binding.h"
#include "bindings/v8/V8Utilities.h"
#include "core/dom/ExceptionCode.h"
-#include "core/fetch/MemoryCache.h"
#include "core/inspector/InjectedScriptHost.h"
#include "core/inspector/InspectorController.h"
+#include "core/loader/cache/MemoryCache.h"
#include "core/page/Frame.h"
#include "core/page/FrameView.h"
#include "core/page/Page.h"
@@ -464,18 +464,10 @@ void WebDevToolsAgentImpl::webViewResized(const WebSize& size)
bool WebDevToolsAgentImpl::handleInputEvent(WebCore::Page* page, const WebInputEvent& inputEvent)
{
- if (!m_attached)
- return false;
-
InspectorController* ic = inspectorController();
if (!ic)
return false;
- if (WebInputEvent::isGestureEventType(inputEvent.type) && inputEvent.type == WebInputEvent::GestureTap) {
- // Only let GestureTab in (we only need it and we know PlatformGestureEventBuilder supports it).
- PlatformGestureEvent gestureEvent = PlatformGestureEventBuilder(page->mainFrame()->view(), *static_cast<const WebGestureEvent*>(&inputEvent));
- return ic->handleGestureEvent(page->mainFrame(), gestureEvent);
- }
if (WebInputEvent::isMouseEventType(inputEvent.type) && inputEvent.type != WebInputEvent::MouseEnter) {
// PlatformMouseEventBuilder does not work with MouseEnter type, so we filter it out manually.
PlatformMouseEvent mouseEvent = PlatformMouseEventBuilder(page->mainFrame()->view(), *static_cast<const WebMouseEvent*>(&inputEvent));
diff --git a/chromium/third_party/WebKit/Source/web/WebFileSystemCallbacksImpl.cpp b/chromium/third_party/WebKit/Source/web/WebFileSystemCallbacksImpl.cpp
index a882f926a9a..b993b344337 100644
--- a/chromium/third_party/WebKit/Source/web/WebFileSystemCallbacksImpl.cpp
+++ b/chromium/third_party/WebKit/Source/web/WebFileSystemCallbacksImpl.cpp
@@ -32,6 +32,8 @@
#include "AsyncFileSystemChromium.h"
#include "AsyncFileWriterChromium.h"
+#include "WorkerAsyncFileSystemChromium.h"
+#include "core/dom/ScriptExecutionContext.h"
#include "core/platform/AsyncFileSystemCallbacks.h"
#include "core/platform/FileMetadata.h"
#include "public/platform/WebFileInfo.h"
@@ -45,14 +47,17 @@ using namespace WebCore;
namespace WebKit {
-WebFileSystemCallbacksImpl::WebFileSystemCallbacksImpl(PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+WebFileSystemCallbacksImpl::WebFileSystemCallbacksImpl(PassOwnPtr<AsyncFileSystemCallbacks> callbacks, ScriptExecutionContext* context, FileSystemSynchronousType synchronousType)
: m_callbacks(callbacks)
+ , m_context(context)
+ , m_synchronousType(synchronousType)
{
ASSERT(m_callbacks);
}
WebFileSystemCallbacksImpl::WebFileSystemCallbacksImpl(PassOwnPtr<AsyncFileSystemCallbacks> callbacks, PassOwnPtr<AsyncFileWriterChromium> writer)
: m_callbacks(callbacks)
+ , m_context(0)
, m_writer(writer)
{
ASSERT(m_callbacks);
@@ -112,6 +117,11 @@ void WebFileSystemCallbacksImpl::didOpenFileSystem(const WebString& name, const
{
// This object is intended to delete itself on exit.
OwnPtr<WebFileSystemCallbacksImpl> callbacks = adoptPtr(this);
+
+ if (m_context && m_context->isWorkerGlobalScope()) {
+ m_callbacks->didOpenFileSystem(name, rootURL, WorkerAsyncFileSystemChromium::create(m_context, m_synchronousType));
+ return;
+ }
m_callbacks->didOpenFileSystem(name, rootURL, AsyncFileSystemChromium::create());
}
diff --git a/chromium/third_party/WebKit/Source/web/WebFileSystemCallbacksImpl.h b/chromium/third_party/WebKit/Source/web/WebFileSystemCallbacksImpl.h
index 1522f94af85..06d1f8c137e 100644
--- a/chromium/third_party/WebKit/Source/web/WebFileSystemCallbacksImpl.h
+++ b/chromium/third_party/WebKit/Source/web/WebFileSystemCallbacksImpl.h
@@ -42,6 +42,7 @@ namespace WebCore {
class AsyncFileSystemCallbacks;
class AsyncFileWriterChromium;
class BlobDataHandle;
+class ScriptExecutionContext;
}
namespace WebKit {
@@ -53,7 +54,7 @@ class WebURL;
class WebFileSystemCallbacksImpl : public WebFileSystemCallbacks {
public:
- WebFileSystemCallbacksImpl(PassOwnPtr<WebCore::AsyncFileSystemCallbacks>);
+ WebFileSystemCallbacksImpl(PassOwnPtr<WebCore::AsyncFileSystemCallbacks>, WebCore::ScriptExecutionContext* = 0, WebCore::FileSystemSynchronousType = WebCore::AsynchronousFileSystem);
WebFileSystemCallbacksImpl(PassOwnPtr<WebCore::AsyncFileSystemCallbacks>, PassOwnPtr<WebCore::AsyncFileWriterChromium>);
virtual ~WebFileSystemCallbacksImpl();
@@ -74,6 +75,10 @@ public:
private:
OwnPtr<WebCore::AsyncFileSystemCallbacks> m_callbacks;
+ // Used for worker's openFileSystem callbacks.
+ WebCore::ScriptExecutionContext* m_context;
+ WebCore::FileSystemSynchronousType m_synchronousType;
+
// Used for createFileWriter callbacks.
OwnPtr<WebCore::AsyncFileWriterChromium> m_writer;
};
diff --git a/chromium/third_party/WebKit/Source/web/WebFrameImpl.cpp b/chromium/third_party/WebKit/Source/web/WebFrameImpl.cpp
index baf06cd1d7a..8526f56e4fe 100644
--- a/chromium/third_party/WebKit/Source/web/WebFrameImpl.cpp
+++ b/chromium/third_party/WebKit/Source/web/WebFrameImpl.cpp
@@ -984,7 +984,7 @@ void WebFrameImpl::stopLoading()
// FIXME: Figure out what we should really do here. It seems like a bug
// that FrameLoader::stopLoading doesn't call stopAllLoaders.
frame()->loader()->stopAllLoaders();
- frame()->loader()->stopLoading();
+ frame()->loader()->stopLoading(UnloadEventPolicyNone);
}
WebDataSource* WebFrameImpl::provisionalDataSource() const
@@ -1368,11 +1368,6 @@ void WebFrameImpl::moveCaretSelection(const WebPoint& point)
frame()->selection()->moveTo(position, UserTriggered);
}
-void WebFrameImpl::setCaretVisible(bool visible)
-{
- frame()->selection()->setCaretVisible(visible);
-}
-
VisiblePosition WebFrameImpl::visiblePositionForWindowPoint(const WebPoint& point)
{
FloatPoint unscaledPoint(point);
diff --git a/chromium/third_party/WebKit/Source/web/WebFrameImpl.h b/chromium/third_party/WebKit/Source/web/WebFrameImpl.h
index b6e0b419399..d67fc22e083 100644
--- a/chromium/third_party/WebKit/Source/web/WebFrameImpl.h
+++ b/chromium/third_party/WebKit/Source/web/WebFrameImpl.h
@@ -188,7 +188,6 @@ public:
virtual void moveCaretSelectionTowardsWindowPoint(const WebPoint&);
virtual void moveRangeSelection(const WebPoint& base, const WebPoint& extent);
virtual void moveCaretSelection(const WebPoint&);
- virtual void setCaretVisible(bool);
virtual int printBegin(const WebPrintParams&,
const WebNode& constrainToNode,
bool* useBrowserOverlays);
diff --git a/chromium/third_party/WebKit/Source/web/WebHelperPluginImpl.cpp b/chromium/third_party/WebKit/Source/web/WebHelperPluginImpl.cpp
index 570d4b31050..028f5220005 100644
--- a/chromium/third_party/WebKit/Source/web/WebHelperPluginImpl.cpp
+++ b/chromium/third_party/WebKit/Source/web/WebHelperPluginImpl.cpp
@@ -131,7 +131,7 @@ void WebHelperPluginImpl::closeHelperPlugin()
if (m_page) {
m_page->clearPageGroup();
m_page->mainFrame()->loader()->stopAllLoaders();
- m_page->mainFrame()->loader()->stopLoading();
+ m_page->mainFrame()->loader()->stopLoading(UnloadEventPolicyNone);
}
// We must destroy the page now in case the host page is being destroyed, in
diff --git a/chromium/third_party/WebKit/Source/web/WebPagePopupImpl.cpp b/chromium/third_party/WebKit/Source/web/WebPagePopupImpl.cpp
index c52a116d0b8..b1968204c5b 100644
--- a/chromium/third_party/WebKit/Source/web/WebPagePopupImpl.cpp
+++ b/chromium/third_party/WebKit/Source/web/WebPagePopupImpl.cpp
@@ -320,7 +320,7 @@ void WebPagePopupImpl::closePopup()
if (m_page) {
m_page->clearPageGroup();
m_page->mainFrame()->loader()->stopAllLoaders();
- m_page->mainFrame()->loader()->stopLoading();
+ m_page->mainFrame()->loader()->stopLoading(UnloadEventPolicyNone);
DOMWindowPagePopup::uninstall(m_page->mainFrame()->domWindow());
}
m_closing = true;
diff --git a/chromium/third_party/WebKit/Source/web/WebViewImpl.cpp b/chromium/third_party/WebKit/Source/web/WebViewImpl.cpp
index 2c8e3da8b0b..6674e5e321f 100644
--- a/chromium/third_party/WebKit/Source/web/WebViewImpl.cpp
+++ b/chromium/third_party/WebKit/Source/web/WebViewImpl.cpp
@@ -567,7 +567,7 @@ void WebViewImpl::mouseContextMenu(const WebMouseEvent& event)
if (!mainFrameImpl() || !mainFrameImpl()->frameView())
return;
- m_page->contextMenuController().clearContextMenu();
+ m_page->contextMenuController()->clearContextMenu();
PlatformMouseEventBuilder pme(mainFrameImpl()->frameView(), event);
@@ -760,7 +760,7 @@ bool WebViewImpl::handleGestureEvent(const WebGestureEvent& event)
break;
m_client->cancelScheduledContentIntents();
- m_page->contextMenuController().clearContextMenu();
+ m_page->contextMenuController()->clearContextMenu();
m_contextMenuAllowed = true;
eventSwallowed = mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent);
m_contextMenuAllowed = false;
@@ -1356,7 +1356,7 @@ bool WebViewImpl::sendContextMenuEvent(const WebKeyboardEvent& event)
// detect if we create a new menu for this event, since we won't create
// a new menu if the DOM swallows the event and the defaultEventHandler does
// not run.
- page()->contextMenuController().clearContextMenu();
+ page()->contextMenuController()->clearContextMenu();
m_contextMenuAllowed = true;
Frame* focusedFrame = page()->focusController().focusedOrMainFrame();
@@ -2462,19 +2462,19 @@ void WebViewImpl::willCloseLayerTreeView()
void WebViewImpl::didAcquirePointerLock()
{
if (page())
- page()->pointerLockController().didAcquirePointerLock();
+ page()->pointerLockController()->didAcquirePointerLock();
}
void WebViewImpl::didNotAcquirePointerLock()
{
if (page())
- page()->pointerLockController().didNotAcquirePointerLock();
+ page()->pointerLockController()->didNotAcquirePointerLock();
}
void WebViewImpl::didLosePointerLock()
{
if (page())
- page()->pointerLockController().didLosePointerLock();
+ page()->pointerLockController()->didLosePointerLock();
}
void WebViewImpl::didChangeWindowResizerRect()
@@ -3453,13 +3453,13 @@ void WebViewImpl::performCustomContextMenuAction(unsigned action)
{
if (!m_page)
return;
- ContextMenu* menu = m_page->contextMenuController().contextMenu();
+ ContextMenu* menu = m_page->contextMenuController()->contextMenu();
if (!menu)
return;
const ContextMenuItem* item = menu->itemWithAction(static_cast<ContextMenuAction>(ContextMenuItemBaseCustomTag + action));
if (item)
- m_page->contextMenuController().contextMenuItemSelected(item);
- m_page->contextMenuController().clearContextMenu();
+ m_page->contextMenuController()->contextMenuItemSelected(item);
+ m_page->contextMenuController()->clearContextMenu();
}
void WebViewImpl::showContextMenu()
@@ -3467,7 +3467,7 @@ void WebViewImpl::showContextMenu()
if (!page())
return;
- page()->contextMenuController().clearContextMenu();
+ page()->contextMenuController()->clearContextMenu();
m_contextMenuAllowed = true;
if (Frame* focusedFrame = page()->focusController().focusedOrMainFrame())
focusedFrame->eventHandler()->sendContextMenuEventForKey();
@@ -4071,7 +4071,7 @@ void WebViewImpl::pointerLockMouseEvent(const WebInputEvent& event)
const WebMouseEvent& mouseEvent = static_cast<const WebMouseEvent&>(event);
if (page())
- page()->pointerLockController().dispatchLockedMouseEvent(
+ page()->pointerLockController()->dispatchLockedMouseEvent(
PlatformMouseEventBuilder(mainFrameImpl()->frameView(), mouseEvent),
eventType);
}
diff --git a/chromium/third_party/WebKit/Source/web/WorkerAsyncFileSystemChromium.cpp b/chromium/third_party/WebKit/Source/web/WorkerAsyncFileSystemChromium.cpp
new file mode 100644
index 00000000000..5da01d30c42
--- /dev/null
+++ b/chromium/third_party/WebKit/Source/web/WorkerAsyncFileSystemChromium.cpp
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WorkerAsyncFileSystemChromium.h"
+
+#include "WebFileSystemCallbacksImpl.h"
+#include "WebFileWriter.h"
+#include "WorkerAsyncFileWriterChromium.h"
+#include "WorkerFileSystemCallbacksBridge.h"
+#include "bindings/v8/WorkerScriptController.h"
+#include "core/fileapi/BlobURL.h"
+#include "core/platform/AsyncFileSystemCallbacks.h"
+#include "core/platform/FileMetadata.h"
+#include "core/platform/FileSystem.h"
+#include "core/platform/NotImplemented.h"
+#include "core/workers/WorkerGlobalScope.h"
+#include "core/workers/WorkerThread.h"
+#include "public/platform/WebFileSystem.h"
+#include "wtf/text/CString.h"
+
+using namespace WebKit;
+
+namespace WebCore {
+
+static const char fileSystemOperationsMode[] = "fileSystemOperationsMode";
+
+WorkerAsyncFileSystemChromium::WorkerAsyncFileSystemChromium(ScriptExecutionContext* context, FileSystemSynchronousType synchronousType)
+ : m_scriptExecutionContext(context)
+ , m_workerGlobalScope(toWorkerGlobalScope(context))
+ , m_synchronousType(synchronousType)
+{
+ ASSERT(m_scriptExecutionContext->isWorkerGlobalScope());
+
+ m_workerLoaderProxy = &m_workerGlobalScope->thread()->workerLoaderProxy();
+}
+
+WorkerAsyncFileSystemChromium::~WorkerAsyncFileSystemChromium()
+{
+}
+
+bool WorkerAsyncFileSystemChromium::waitForOperationToComplete()
+{
+ if (!m_bridgeForCurrentOperation)
+ return false;
+
+ RefPtr<WorkerFileSystemCallbacksBridge> bridge = m_bridgeForCurrentOperation.release();
+ if (m_workerGlobalScope->thread()->runLoop().runInMode(m_workerGlobalScope, m_modeForCurrentOperation) == MessageQueueTerminated) {
+ bridge->stop();
+ return false;
+ }
+ return true;
+}
+
+void WorkerAsyncFileSystemChromium::move(const KURL& sourcePath, const KURL& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postMoveToMainThread(m_webFileSystem, sourcePath, destinationPath, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::copy(const KURL& sourcePath, const KURL& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postCopyToMainThread(m_webFileSystem, sourcePath, destinationPath, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::remove(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postRemoveToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::removeRecursively(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postRemoveRecursivelyToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::readMetadata(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postReadMetadataToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::createFile(const KURL& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postCreateFileToMainThread(m_webFileSystem, path, exclusive, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::createDirectory(const KURL& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postCreateDirectoryToMainThread(m_webFileSystem, path, exclusive, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::fileExists(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postFileExistsToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::directoryExists(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postDirectoryExistsToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::readDirectory(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postReadDirectoryToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+class WorkerFileWriterHelperCallbacks : public AsyncFileSystemCallbacks {
+public:
+ static PassOwnPtr<WorkerFileWriterHelperCallbacks> create(AsyncFileWriterClient* client, const WebURL& path, WebKit::WebFileSystem* webFileSystem, PassOwnPtr<WebCore::AsyncFileSystemCallbacks> callbacks, WorkerGlobalScope* workerGlobalScope)
+ {
+ return adoptPtr(new WorkerFileWriterHelperCallbacks(client, path, webFileSystem, callbacks, workerGlobalScope));
+ }
+
+ virtual void didReadMetadata(const FileMetadata& metadata)
+ {
+ ASSERT(m_callbacks);
+ if (metadata.type != FileMetadata::TypeFile || metadata.length < 0)
+ m_callbacks->didFail(WebKit::WebFileErrorInvalidState);
+ else {
+ OwnPtr<WorkerAsyncFileWriterChromium> asyncFileWriterChromium = WorkerAsyncFileWriterChromium::create(m_webFileSystem, m_path, m_workerGlobalScope, m_client, WorkerAsyncFileWriterChromium::Asynchronous);
+ m_callbacks->didCreateFileWriter(asyncFileWriterChromium.release(), metadata.length);
+ }
+ }
+
+ virtual void didFail(int code)
+ {
+ ASSERT(m_callbacks);
+ m_callbacks->didFail(code);
+ }
+
+private:
+ WorkerFileWriterHelperCallbacks(AsyncFileWriterClient* client, const WebURL& path, WebKit::WebFileSystem* webFileSystem, PassOwnPtr<WebCore::AsyncFileSystemCallbacks> callbacks, WorkerGlobalScope* workerGlobalScope)
+ : m_client(client)
+ , m_path(path)
+ , m_webFileSystem(webFileSystem)
+ , m_callbacks(callbacks)
+ , m_workerGlobalScope(workerGlobalScope)
+ {
+ }
+
+ AsyncFileWriterClient* m_client;
+ WebURL m_path;
+ WebKit::WebFileSystem* m_webFileSystem;
+ OwnPtr<WebCore::AsyncFileSystemCallbacks> m_callbacks;
+ WorkerGlobalScope* m_workerGlobalScope;
+};
+
+void WorkerAsyncFileSystemChromium::createWriter(AsyncFileWriterClient* client, const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(WorkerFileWriterHelperCallbacks::create(client, path, m_webFileSystem, callbacks, m_workerGlobalScope))->postReadMetadataToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+void WorkerAsyncFileSystemChromium::createSnapshotFileAndReadMetadata(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ createWorkerFileSystemCallbacksBridge(callbacks)->postCreateSnapshotFileToMainThread(m_webFileSystem, path, m_modeForCurrentOperation);
+}
+
+PassRefPtr<WorkerFileSystemCallbacksBridge> WorkerAsyncFileSystemChromium::createWorkerFileSystemCallbacksBridge(PassOwnPtr<AsyncFileSystemCallbacks> callbacks)
+{
+ ASSERT_UNUSED(m_synchronousType, m_synchronousType == AsynchronousFileSystem || !m_bridgeForCurrentOperation);
+
+ m_modeForCurrentOperation = fileSystemOperationsMode;
+ m_modeForCurrentOperation.append(String::number(m_workerGlobalScope->thread()->runLoop().createUniqueId()));
+
+ m_bridgeForCurrentOperation = WorkerFileSystemCallbacksBridge::create(m_workerLoaderProxy, m_scriptExecutionContext, new WebKit::WebFileSystemCallbacksImpl(callbacks));
+ return m_bridgeForCurrentOperation;
+}
+
+} // namespace WebCore
diff --git a/chromium/third_party/WebKit/Source/web/WorkerAsyncFileSystemChromium.h b/chromium/third_party/WebKit/Source/web/WorkerAsyncFileSystemChromium.h
new file mode 100644
index 00000000000..b6675555fb4
--- /dev/null
+++ b/chromium/third_party/WebKit/Source/web/WorkerAsyncFileSystemChromium.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WorkerAsyncFileSystemChromium_h
+#define WorkerAsyncFileSystemChromium_h
+
+#include "AsyncFileSystemChromium.h"
+#include "modules/filesystem/FileSystemType.h"
+#include "wtf/PassOwnPtr.h"
+#include "wtf/RefPtr.h"
+
+namespace WebKit {
+class WebFileSystem;
+class WebURL;
+class WorkerFileSystemCallbacksBridge;
+}
+
+namespace WebCore {
+
+class AsyncFileSystemCallbacks;
+class ScriptExecutionContext;
+class WorkerGlobalScope;
+class WorkerLoaderProxy;
+
+class WorkerAsyncFileSystemChromium : public AsyncFileSystemChromium {
+public:
+ static PassOwnPtr<AsyncFileSystem> create(ScriptExecutionContext* context, FileSystemSynchronousType synchronousType)
+ {
+ return adoptPtr(new WorkerAsyncFileSystemChromium(context, synchronousType));
+ }
+
+ virtual ~WorkerAsyncFileSystemChromium();
+
+ // Runs one pending operation (to wait for completion in the sync-mode).
+ virtual bool waitForOperationToComplete();
+
+ virtual void move(const KURL& sourcePath, const KURL& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void copy(const KURL& sourcePath, const KURL& destinationPath, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void remove(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void removeRecursively(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void readMetadata(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void createFile(const KURL& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void createDirectory(const KURL& path, bool exclusive, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void fileExists(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void directoryExists(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void readDirectory(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void createWriter(AsyncFileWriterClient*, const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+ virtual void createSnapshotFileAndReadMetadata(const KURL& path, PassOwnPtr<AsyncFileSystemCallbacks>);
+
+private:
+ WorkerAsyncFileSystemChromium(ScriptExecutionContext*, FileSystemSynchronousType);
+
+ PassRefPtr<WebKit::WorkerFileSystemCallbacksBridge> createWorkerFileSystemCallbacksBridge(PassOwnPtr<AsyncFileSystemCallbacks>);
+
+ ScriptExecutionContext* m_scriptExecutionContext;
+ WorkerLoaderProxy* m_workerLoaderProxy;
+ WorkerGlobalScope* m_workerGlobalScope;
+ RefPtr<WebKit::WorkerFileSystemCallbacksBridge> m_bridgeForCurrentOperation;
+ String m_modeForCurrentOperation;
+ FileSystemSynchronousType m_synchronousType;
+};
+
+} // namespace WebCore
+
+#endif // WorkerAsyncFileSystemChromium_h
diff --git a/chromium/third_party/WebKit/Source/web/WorkerAsyncFileWriterChromium.cpp b/chromium/third_party/WebKit/Source/web/WorkerAsyncFileWriterChromium.cpp
new file mode 100644
index 00000000000..5e675532300
--- /dev/null
+++ b/chromium/third_party/WebKit/Source/web/WorkerAsyncFileWriterChromium.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WorkerAsyncFileWriterChromium.h"
+
+#include "WebFileWriter.h"
+#include "WebWorkerBase.h"
+#include "WorkerFileWriterCallbacksBridge.h"
+#include "core/dom/ScriptExecutionContext.h"
+#include "core/fileapi/Blob.h"
+#include "core/platform/AsyncFileSystem.h"
+#include "core/workers/WorkerGlobalScope.h"
+#include "core/workers/WorkerLoaderProxy.h"
+#include "core/workers/WorkerThread.h"
+#include "public/platform/WebFileSystem.h"
+#include "public/platform/WebURL.h"
+#include "wtf/Assertions.h"
+
+using namespace WebKit;
+
+namespace WebCore {
+
+WorkerAsyncFileWriterChromium::WorkerAsyncFileWriterChromium(WebFileSystem* webFileSystem, const WebURL& path, WorkerGlobalScope* workerGlobalScope, AsyncFileWriterClient* client, WriterType type)
+{
+ ASSERT(type == Asynchronous); // Synchronous is not implemented yet.
+
+ WorkerLoaderProxy* proxy = &workerGlobalScope->thread()->workerLoaderProxy();
+ m_bridge = WorkerFileWriterCallbacksBridge::create(path, proxy, workerGlobalScope, client);
+}
+
+WorkerAsyncFileWriterChromium::~WorkerAsyncFileWriterChromium()
+{
+ m_bridge->postShutdownToMainThread(m_bridge);
+}
+
+bool WorkerAsyncFileWriterChromium::waitForOperationToComplete()
+{
+ return m_bridge->waitForOperationToComplete();
+}
+
+void WorkerAsyncFileWriterChromium::write(long long position, Blob* data)
+{
+ m_bridge->postWriteToMainThread(position, data->url());
+}
+
+void WorkerAsyncFileWriterChromium::truncate(long long length)
+{
+ m_bridge->postTruncateToMainThread(length);
+}
+
+void WorkerAsyncFileWriterChromium::abort()
+{
+ m_bridge->postAbortToMainThread();
+}
+
+}
diff --git a/chromium/third_party/WebKit/Source/core/animation/AnimatableTransform.h b/chromium/third_party/WebKit/Source/web/WorkerAsyncFileWriterChromium.h
index a0e71dfb61f..96ebd354a65 100644
--- a/chromium/third_party/WebKit/Source/core/animation/AnimatableTransform.h
+++ b/chromium/third_party/WebKit/Source/web/WorkerAsyncFileWriterChromium.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
+ * Copyright (C) 2010 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -28,43 +28,57 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef AnimatableTransform_h
-#define AnimatableTransform_h
+#ifndef WorkerAsyncFileWriterChromium_h
+#define WorkerAsyncFileWriterChromium_h
-#include "core/animation/AnimatableValue.h"
-#include "core/platform/graphics/transforms/TransformOperations.h"
+#include "modules/filesystem/AsyncFileWriter.h"
+#include "wtf/PassOwnPtr.h"
+
+namespace WebKit {
+ class WebFileSystem;
+ class WebFileWriter;
+ class WebURL;
+ class WorkerFileWriterCallbacksBridge;
+}
+
+namespace WTF {
+ class String;
+}
+using WTF::String;
namespace WebCore {
-class AnimatableTransform : public AnimatableValue {
+class AsyncFileSystem;
+class AsyncFileWriterClient;
+class Blob;
+class WorkerGlobalScope;
+
+class WorkerAsyncFileWriterChromium : public AsyncFileWriter {
public:
- virtual ~AnimatableTransform() { }
- static PassRefPtr<AnimatableTransform> create(const TransformOperations&);
- const TransformOperations& transformOperations() const
+ enum WriterType {
+ Asynchronous,
+ Synchronous,
+ };
+
+ static PassOwnPtr<WorkerAsyncFileWriterChromium> create(WebKit::WebFileSystem* webFileSystem, const WebKit::WebURL& path, WorkerGlobalScope* workerGlobalScope, AsyncFileWriterClient* client, WriterType type)
{
- return m_transform;
+ return adoptPtr(new WorkerAsyncFileWriterChromium(webFileSystem, path, workerGlobalScope, client, type));
}
+ ~WorkerAsyncFileWriterChromium();
-protected:
- virtual PassRefPtr<AnimatableValue> interpolateTo(const AnimatableValue*, double fraction) const OVERRIDE;
- virtual PassRefPtr<AnimatableValue> addWith(const AnimatableValue*) const OVERRIDE;
+ bool waitForOperationToComplete();
-private:
- explicit AnimatableTransform(const TransformOperations& transform)
- : AnimatableValue(TypeTransform)
- , m_transform(transform)
- {
- }
- const TransformOperations m_transform;
-};
+ // FileWriter
+ virtual void write(long long position, Blob* data);
+ virtual void truncate(long long length);
+ virtual void abort();
-inline const AnimatableTransform* toAnimatableTransform(const AnimatableValue* value)
-{
- ASSERT_WITH_SECURITY_IMPLICATION(value && value->isTransform());
- return static_cast<const AnimatableTransform*>(value);
-}
+private:
-} // namespace WebCore
+ WorkerAsyncFileWriterChromium(WebKit::WebFileSystem*, const WebKit::WebURL& path, WorkerGlobalScope*, AsyncFileWriterClient*, WriterType);
+ RefPtr<WebKit::WorkerFileWriterCallbacksBridge> m_bridge;
+};
-#endif // AnimatableTransform_h
+} // namespace
+#endif // AsyncFileWriterChromium_h
diff --git a/chromium/third_party/WebKit/Source/web/WorkerFileSystemClient.cpp b/chromium/third_party/WebKit/Source/web/WorkerFileSystemClient.cpp
index 4daa833e9cb..3e3e065f613 100644
--- a/chromium/third_party/WebKit/Source/web/WorkerFileSystemClient.cpp
+++ b/chromium/third_party/WebKit/Source/web/WorkerFileSystemClient.cpp
@@ -119,7 +119,7 @@ void WorkerFileSystemClient::openFileSystem(ScriptExecutionContext* context, Web
String mode = "openFileSystemMode";
mode.append(String::number(runLoop.createUniqueId()));
- RefPtr<WorkerFileSystemCallbacksBridge> bridge = WorkerFileSystemCallbacksBridge::create(workerLoaderProxy, workerGlobalScope, new WebFileSystemCallbacksImpl(callbacks));
+ RefPtr<WorkerFileSystemCallbacksBridge> bridge = WorkerFileSystemCallbacksBridge::create(workerLoaderProxy, workerGlobalScope, new WebFileSystemCallbacksImpl(callbacks, context, synchronousType));
bridge->postOpenFileSystemToMainThread(webWorker->commonClient(), static_cast<WebFileSystemType>(type), size, openMode == CreateFileSystemIfNotPresent, mode);
if (synchronousType == SynchronousFileSystem) {
diff --git a/chromium/third_party/WebKit/Source/web/WorkerFileWriterCallbacksBridge.cpp b/chromium/third_party/WebKit/Source/web/WorkerFileWriterCallbacksBridge.cpp
new file mode 100644
index 00000000000..96aaa33446a
--- /dev/null
+++ b/chromium/third_party/WebKit/Source/web/WorkerFileWriterCallbacksBridge.cpp
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WorkerFileWriterCallbacksBridge.h"
+
+#include "WebFileWriter.h"
+#include "WebWorkerBase.h"
+#include "core/dom/CrossThreadTask.h"
+#include "core/workers/WorkerGlobalScope.h"
+#include "core/workers/WorkerLoaderProxy.h"
+#include "core/workers/WorkerThread.h"
+#include "modules/filesystem/AsyncFileWriterClient.h"
+#include "public/platform/Platform.h"
+#include "public/platform/WebCString.h"
+#include "public/platform/WebFileSystem.h"
+#include "wtf/MainThread.h"
+#include "wtf/Threading.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WorkerFileWriterCallbacksBridge::notifyStop()
+{
+ ASSERT(m_workerGlobalScope->isContextThread());
+ m_clientOnWorkerThread = 0;
+ {
+ MutexLocker locker(m_loaderProxyMutex);
+ m_proxy = 0;
+ }
+}
+
+void WorkerFileWriterCallbacksBridge::postWriteToMainThread(long long position, const KURL& data)
+{
+ ASSERT(!m_operationInProgress);
+ m_operationInProgress = true;
+ dispatchTaskToMainThread(createCallbackTask(&writeOnMainThread,
+ this, position, data));
+}
+
+void WorkerFileWriterCallbacksBridge::postTruncateToMainThread(long long length)
+{
+ ASSERT(!m_operationInProgress);
+ m_operationInProgress = true;
+ dispatchTaskToMainThread(createCallbackTask(&truncateOnMainThread,
+ this, length));
+}
+
+void WorkerFileWriterCallbacksBridge::postAbortToMainThread()
+{
+ ASSERT(m_operationInProgress);
+ dispatchTaskToMainThread(createCallbackTask(&abortOnMainThread, this));
+}
+
+void WorkerFileWriterCallbacksBridge::postShutdownToMainThread(PassRefPtr<WorkerFileWriterCallbacksBridge> bridge)
+{
+ ASSERT(m_workerGlobalScope->isContextThread());
+ m_clientOnWorkerThread = 0;
+ stopObserving();
+ dispatchTaskToMainThread(createCallbackTask(&shutdownOnMainThread, bridge));
+}
+
+void WorkerFileWriterCallbacksBridge::writeOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long position, const KURL& data)
+{
+ bridge->m_writer->write(position, WebURL(data));
+}
+
+void WorkerFileWriterCallbacksBridge::truncateOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length)
+{
+ bridge->m_writer->truncate(length);
+}
+
+void WorkerFileWriterCallbacksBridge::abortOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge)
+{
+ bridge->m_writer->cancel();
+}
+
+void WorkerFileWriterCallbacksBridge::initOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, const KURL& path)
+{
+ ASSERT(!bridge->m_writer);
+ bridge->m_writer = adoptPtr(WebKit::Platform::current()->fileSystem()->createFileWriter(path, bridge.get()));
+}
+
+void WorkerFileWriterCallbacksBridge::shutdownOnMainThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge)
+{
+ bridge->m_writerDeleted = true;
+ bridge->m_writer.clear();
+}
+
+void WorkerFileWriterCallbacksBridge::didWrite(long long bytes, bool complete)
+{
+ dispatchTaskToWorkerThread(createCallbackTask(&didWriteOnWorkerThread, this, bytes, complete));
+}
+
+void WorkerFileWriterCallbacksBridge::didFail(WebFileError error)
+{
+ dispatchTaskToWorkerThread(createCallbackTask(&didFailOnWorkerThread, this, error));
+}
+
+void WorkerFileWriterCallbacksBridge::didTruncate()
+{
+ dispatchTaskToWorkerThread(createCallbackTask(&didTruncateOnWorkerThread, this));
+}
+
+static const char fileWriterOperationsMode[] = "fileWriterOperationsMode";
+
+WorkerFileWriterCallbacksBridge::WorkerFileWriterCallbacksBridge(const KURL& path, WorkerLoaderProxy* proxy, ScriptExecutionContext* scriptExecutionContext, AsyncFileWriterClient* client)
+ : WorkerGlobalScope::Observer(toWorkerGlobalScope(scriptExecutionContext))
+ , m_proxy(proxy)
+ , m_workerGlobalScope(scriptExecutionContext)
+ , m_clientOnWorkerThread(client)
+ , m_writerDeleted(false)
+ , m_operationInProgress(false)
+{
+ ASSERT(m_workerGlobalScope->isContextThread());
+ m_mode = fileWriterOperationsMode;
+ m_mode.append(String::number(toWorkerGlobalScope(scriptExecutionContext)->thread()->runLoop().createUniqueId()));
+ postInitToMainThread(path);
+}
+
+void WorkerFileWriterCallbacksBridge::postInitToMainThread(const KURL& path)
+{
+ dispatchTaskToMainThread(
+ createCallbackTask(&initOnMainThread, this, path));
+}
+
+WorkerFileWriterCallbacksBridge::~WorkerFileWriterCallbacksBridge()
+{
+ ASSERT(!m_clientOnWorkerThread);
+ ASSERT(!m_writer);
+}
+
+// We know m_clientOnWorkerThread is still valid because it is only cleared on the context thread, and because we check in runTaskOnWorkerThread before calling any of these methods.
+void WorkerFileWriterCallbacksBridge::didWriteOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length, bool complete)
+{
+ ASSERT(bridge->m_workerGlobalScope->isContextThread());
+ ASSERT(bridge->m_operationInProgress);
+ if (complete)
+ bridge->m_operationInProgress = false;
+ bridge->m_clientOnWorkerThread->didWrite(length, complete);
+}
+
+void WorkerFileWriterCallbacksBridge::didFailOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, WebFileError error)
+{
+ ASSERT(bridge->m_workerGlobalScope->isContextThread());
+ ASSERT(bridge->m_operationInProgress);
+ bridge->m_operationInProgress = false;
+ bridge->m_clientOnWorkerThread->didFail(static_cast<FileError::ErrorCode>(error));
+}
+
+void WorkerFileWriterCallbacksBridge::didTruncateOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge)
+{
+ ASSERT(bridge->m_workerGlobalScope->isContextThread());
+ ASSERT(bridge->m_operationInProgress);
+ bridge->m_operationInProgress = false;
+ bridge->m_clientOnWorkerThread->didTruncate();
+}
+
+void WorkerFileWriterCallbacksBridge::runTaskOnMainThread(ScriptExecutionContext* scriptExecutionContext, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, PassOwnPtr<ScriptExecutionContext::Task> taskToRun)
+{
+ ASSERT(isMainThread());
+ if (!bridge->m_writerDeleted)
+ taskToRun->performTask(scriptExecutionContext);
+}
+
+void WorkerFileWriterCallbacksBridge::runTaskOnWorkerThread(ScriptExecutionContext* scriptExecutionContext, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, PassOwnPtr<ScriptExecutionContext::Task> taskToRun)
+{
+ ASSERT(bridge->m_workerGlobalScope->isContextThread());
+ if (bridge->m_clientOnWorkerThread)
+ taskToRun->performTask(scriptExecutionContext);
+}
+
+void WorkerFileWriterCallbacksBridge::dispatchTaskToMainThread(PassOwnPtr<ScriptExecutionContext::Task> task)
+{
+ ASSERT(m_workerGlobalScope->isContextThread());
+ WebWorkerBase::dispatchTaskToMainThread(
+ createCallbackTask(&runTaskOnMainThread, this, task));
+}
+
+void WorkerFileWriterCallbacksBridge::dispatchTaskToWorkerThread(PassOwnPtr<ScriptExecutionContext::Task> task)
+{
+ ASSERT(isMainThread());
+
+ MutexLocker locker(m_loaderProxyMutex);
+ if (m_proxy)
+ m_proxy->postTaskForModeToWorkerGlobalScope(
+ createCallbackTask(&runTaskOnWorkerThread, this, task), m_mode);
+}
+
+bool WorkerFileWriterCallbacksBridge::waitForOperationToComplete()
+{
+ while (m_operationInProgress) {
+ WorkerGlobalScope* context = toWorkerGlobalScope(m_workerGlobalScope);
+ if (context->thread()->runLoop().runInMode(context, m_mode) == MessageQueueTerminated)
+ return false;
+ }
+ return true;
+}
+
+} // namespace WebKit
diff --git a/chromium/third_party/WebKit/Source/web/WorkerFileWriterCallbacksBridge.h b/chromium/third_party/WebKit/Source/web/WorkerFileWriterCallbacksBridge.h
new file mode 100644
index 00000000000..526c47150fd
--- /dev/null
+++ b/chromium/third_party/WebKit/Source/web/WorkerFileWriterCallbacksBridge.h
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WorkerFileWriterCallbacksBridge_h
+#define WorkerFileWriterCallbacksBridge_h
+
+#include "WebFileWriterClient.h"
+#include "core/workers/WorkerGlobalScope.h"
+#include "public/platform/WebFileError.h"
+#include "wtf/PassOwnPtr.h"
+#include "wtf/PassRefPtr.h"
+#include "wtf/ThreadSafeRefCounted.h"
+
+namespace WebCore {
+ class AsyncFileWriterClient;
+ class KURL;
+ class WorkerLoaderProxy;
+}
+
+namespace WTF {
+ class String;
+}
+using WTF::String;
+
+namespace WebKit {
+
+class WebFileSystem;
+class WebFileWriter;
+class WebFileWriterClient;
+class WebURL;
+class WebWorkerBase;
+
+// This class is used as a mechanism to bridge calls between threads.
+// Calls to a WebFileWriter must happen on the main thread, but they come from
+// the context thread. The responses through the WebFileWriterClient interface
+// start on the main thread, but must be sent via the worker context thread.
+//
+// A typical flow for write would look like this:
+// Bridge::postWriteToMainThread() on WorkerThread
+// --> Bridge::writeOnMainThread() is called on MainThread
+// --> WebFileWriter::write()
+// This makes an IPC; the actual operation is down in the browser.
+// --> Bridge::didWrite is called on MainThread
+// --> Bridge::didWriteOnWorkerThread is called on WorkerThread
+// This calls the original client (m_clientOnWorkerThread).
+//
+// The bridge object is refcounted, so that it doesn't get deleted while there
+// are cross-thread calls in flight. Each CrossThreadTask carries a reference
+// to the bridge, which guarantees that the bridge will still be valid when the
+// task is executed. In order to shut down the bridge, the WebFileWriterClient
+// should call postShutdownToMainThread before dropping its reference to the
+// bridge. This ensures that the WebFileWriter will be cleared on the main
+// thread and that no further calls to the WebFileWriterClient will be made.
+class WorkerFileWriterCallbacksBridge : public ThreadSafeRefCounted<WorkerFileWriterCallbacksBridge>, public WebCore::WorkerGlobalScope::Observer, public WebFileWriterClient {
+public:
+ ~WorkerFileWriterCallbacksBridge();
+
+ // WorkerGlobalScope::Observer method.
+ virtual void notifyStop();
+
+ static PassRefPtr<WorkerFileWriterCallbacksBridge> create(const WebCore::KURL& path, WebCore::WorkerLoaderProxy* proxy, WebCore::ScriptExecutionContext* workerGlobalScope, WebCore::AsyncFileWriterClient* client)
+ {
+ return adoptRef(new WorkerFileWriterCallbacksBridge(path, proxy, workerGlobalScope, client));
+ }
+
+ // Methods that create an instance and post an initial request task to the main thread. They must be called on the worker thread.
+ void postWriteToMainThread(long long position, const WebCore::KURL& data);
+ void postTruncateToMainThread(long long length);
+ void postAbortToMainThread();
+
+ // The owning WorkerAsyncFileWriterChromium should call this method before dropping its last reference to the bridge, on the context thread.
+ // The actual deletion of the WorkerFileWriterCallbacksBridge may happen on either the main or context thread, depending on where the last reference goes away; that's safe as long as this is called first.
+ void postShutdownToMainThread(PassRefPtr<WorkerFileWriterCallbacksBridge>);
+
+ // Callback methods that are called on the main thread.
+ // These are the implementation of WebKit::WebFileWriterClient.
+ void didWrite(long long bytes, bool complete);
+ void didFail(WebFileError);
+ void didTruncate();
+
+ // Call this on the context thread to wait for the current operation to complete.
+ bool waitForOperationToComplete();
+
+private:
+ WorkerFileWriterCallbacksBridge(const WebCore::KURL& path, WebCore::WorkerLoaderProxy*, WebCore::ScriptExecutionContext*, WebCore::AsyncFileWriterClient*);
+
+ void postInitToMainThread(const WebCore::KURL& path);
+
+ // Methods that are to be called on the main thread.
+ static void writeOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, long long position, const WebCore::KURL& data);
+ static void truncateOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, long long length);
+ static void abortOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>);
+ static void initOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, const WebCore::KURL& path);
+ static void shutdownOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>);
+
+ // Methods that dispatch to AsyncFileWriterClient on the worker threads.
+ static void didWriteOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, long long length, bool complete);
+ static void didFailOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, WebFileError);
+ static void didTruncateOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>);
+
+ // Called on the main thread to run the supplied task.
+ static void runTaskOnMainThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
+ // Called on the worker thread to run the supplied task.
+ static void runTaskOnWorkerThread(WebCore::ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge>, PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
+
+ // Called on the worker thread to dispatch to the main thread.
+ void dispatchTaskToMainThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
+ // Called on the main thread to dispatch to the worker thread.
+ void dispatchTaskToWorkerThread(PassOwnPtr<WebCore::ScriptExecutionContext::Task>);
+
+ // Used from the main thread to post tasks to the context thread.
+ WebCore::WorkerLoaderProxy* m_proxy;
+
+ // Mutex for proxy.
+ Mutex m_loaderProxyMutex;
+
+ // Used on the context thread, only to check that we're running on the context thread.
+ WebCore::ScriptExecutionContext* m_workerGlobalScope;
+
+ // Created and destroyed from the main thread.
+ OwnPtr<WebKit::WebFileWriter> m_writer;
+
+ // Used on the context thread to call back into the client.
+ WebCore::AsyncFileWriterClient* m_clientOnWorkerThread;
+
+ // Used to indicate that shutdown has started on the main thread, and hence the writer has been deleted.
+ bool m_writerDeleted;
+
+ // Used by waitForOperationToComplete.
+ bool m_operationInProgress;
+
+ // Used by postTaskForModeToWorkerGlobalScope and runInMode.
+ String m_mode;
+};
+
+} // namespace WebCore
+
+#endif // WorkerFileWriterCallbacksBridge_h
diff --git a/chromium/third_party/WebKit/Source/web/web.gypi b/chromium/third_party/WebKit/Source/web/web.gypi
index 05b6fafd052..a010db63007 100644
--- a/chromium/third_party/WebKit/Source/web/web.gypi
+++ b/chromium/third_party/WebKit/Source/web/web.gypi
@@ -267,10 +267,16 @@
'WebWorkerRunLoop.cpp',
'WorkerAllowMainThreadBridgeBase.cpp',
'WorkerAllowMainThreadBridgeBase.h',
+ 'WorkerAsyncFileSystemChromium.cpp',
+ 'WorkerAsyncFileSystemChromium.h',
+ 'WorkerAsyncFileWriterChromium.cpp',
+ 'WorkerAsyncFileWriterChromium.h',
'WorkerFileSystemCallbacksBridge.cpp',
'WorkerFileSystemCallbacksBridge.h',
'WorkerFileSystemClient.cpp',
'WorkerFileSystemClient.h',
+ 'WorkerFileWriterCallbacksBridge.cpp',
+ 'WorkerFileWriterCallbacksBridge.h',
'android/WebInputEventFactory.cpp',
'default/WebRenderTheme.cpp',
'gtk/WebInputEventFactory.cpp',
diff --git a/chromium/third_party/WebKit/Source/wtf/Assertions.cpp b/chromium/third_party/WebKit/Source/wtf/Assertions.cpp
index f7884df4012..acf6be01a63 100644
--- a/chromium/third_party/WebKit/Source/wtf/Assertions.cpp
+++ b/chromium/third_party/WebKit/Source/wtf/Assertions.cpp
@@ -60,7 +60,6 @@
#if OS(WINDOWS)
#include <windows.h>
-#define HAVE_ISDEBUGGERPRESENT 1
#endif
#if (OS(DARWIN) || (OS(LINUX) && !defined(__UCLIBC__))) && !OS(ANDROID)
diff --git a/chromium/third_party/WebKit/Source/wtf/Platform.h b/chromium/third_party/WebKit/Source/wtf/Platform.h
index 4d7c4e75186..3d90b0eddbe 100644
--- a/chromium/third_party/WebKit/Source/wtf/Platform.h
+++ b/chromium/third_party/WebKit/Source/wtf/Platform.h
@@ -162,6 +162,7 @@
#endif /* OS(DARWIN) */
#if OS(WINDOWS)
+#define HAVE_ISDEBUGGERPRESENT 1
#define HAVE_VIRTUALALLOC 1
#endif
diff --git a/chromium/third_party/WebKit/Source/wtf/text/Base64.cpp b/chromium/third_party/WebKit/Source/wtf/text/Base64.cpp
index 876e22565bf..9a31527a225 100644
--- a/chromium/third_party/WebKit/Source/wtf/text/Base64.cpp
+++ b/chromium/third_party/WebKit/Source/wtf/text/Base64.cpp
@@ -128,7 +128,7 @@ void base64Encode(const char* data, unsigned len, Vector<char>& out, Base64Encod
}
}
-bool base64Decode(const Vector<char>& in, Vector<char>& out, Base64DecodePolicy policy)
+bool base64Decode(const Vector<char>& in, Vector<char>& out, Base64InvalidCharactersPolicy charactersPolicy, Base64PaddingValidationPolicy paddingPolicy)
{
out.clear();
@@ -136,40 +136,48 @@ bool base64Decode(const Vector<char>& in, Vector<char>& out, Base64DecodePolicy
if (in.size() > UINT_MAX)
return false;
- return base64Decode(in.data(), in.size(), out, policy);
+ return base64Decode(in.data(), in.size(), out, charactersPolicy, paddingPolicy);
}
template<typename T>
-static inline bool base64DecodeInternal(const T* data, unsigned length, Vector<char>& out, Base64DecodePolicy policy)
+static inline bool base64DecodeInternal(const T* data, unsigned length, Vector<char>& out, Base64InvalidCharactersPolicy charactersPolicy, Base64PaddingValidationPolicy paddingPolicy)
{
out.clear();
if (!length)
return true;
+ unsigned dataLength = length;
+ if (paddingPolicy == Base64StrictPaddingValidation) {
+ if (!(dataLength % 4)) {
+ // There may be 2 = padding max.
+ while (data[dataLength - 1] == '=' && dataLength >= (length - 2))
+ --dataLength;
+ }
+ if (dataLength % 4 == 1)
+ return false;
+ }
+
out.grow(length);
- unsigned equalsSignCount = 0;
+ bool sawEqualsSign = false;
unsigned outLength = 0;
for (unsigned idx = 0; idx < length; ++idx) {
unsigned ch = data[idx];
if (ch == '=') {
- ++equalsSignCount;
- // There should be no padding if length is a multiple of 4, and there
- // should never be more than 2 padding characters.
- if (policy == Base64FailOnInvalidCharacterOrExcessPadding && (length % 4 || equalsSignCount > 2))
+ sawEqualsSign = true;
+ if (paddingPolicy == Base64StrictPaddingValidation && idx < dataLength)
return false;
} else if (('0' <= ch && ch <= '9') || ('A' <= ch && ch <= 'Z') || ('a' <= ch && ch <= 'z') || ch == '+' || ch == '/') {
- if (equalsSignCount)
+ if (sawEqualsSign)
return false;
out[outLength] = base64DecMap[ch];
++outLength;
- } else if (policy == Base64FailOnInvalidCharacterOrExcessPadding || policy == Base64FailOnInvalidCharacter || (policy == Base64IgnoreWhitespace && !isSpaceOrNewline(ch))) {
+ } else if (charactersPolicy == Base64FailOnInvalidCharacter || (charactersPolicy == Base64IgnoreWhitespace && !isSpaceOrNewline(ch)))
return false;
- }
}
if (!outLength)
- return !equalsSignCount;
+ return !sawEqualsSign;
// Valid data is (n * 4 + [0,2,3]) characters long.
if ((outLength % 4) == 1)
@@ -204,18 +212,18 @@ static inline bool base64DecodeInternal(const T* data, unsigned length, Vector<c
return true;
}
-bool base64Decode(const char* data, unsigned length, Vector<char>& out, Base64DecodePolicy policy)
+bool base64Decode(const char* data, unsigned length, Vector<char>& out, Base64InvalidCharactersPolicy charactersPolicy, Base64PaddingValidationPolicy paddingPolicy)
{
- return base64DecodeInternal<LChar>(reinterpret_cast<const LChar*>(data), length, out, policy);
+ return base64DecodeInternal<LChar>(reinterpret_cast<const LChar*>(data), length, out, charactersPolicy, paddingPolicy);
}
-bool base64Decode(const String& in, Vector<char>& out, Base64DecodePolicy policy)
+bool base64Decode(const String& in, Vector<char>& out, Base64InvalidCharactersPolicy charactersPolicy, Base64PaddingValidationPolicy paddingPolicy)
{
if (in.isEmpty())
- return base64DecodeInternal<LChar>(0, 0, out, policy);
+ return base64DecodeInternal<LChar>(0, 0, out, charactersPolicy, paddingPolicy);
if (in.is8Bit())
- return base64DecodeInternal<LChar>(in.characters8(), in.length(), out, policy);
- return base64DecodeInternal<UChar>(in.characters16(), in.length(), out, policy);
+ return base64DecodeInternal<LChar>(in.characters8(), in.length(), out, charactersPolicy, paddingPolicy);
+ return base64DecodeInternal<UChar>(in.characters16(), in.length(), out, charactersPolicy, paddingPolicy);
}
} // namespace WTF
diff --git a/chromium/third_party/WebKit/Source/wtf/text/Base64.h b/chromium/third_party/WebKit/Source/wtf/text/Base64.h
index 4ebebc82dcb..7ccd8d1c7c8 100644
--- a/chromium/third_party/WebKit/Source/wtf/text/Base64.h
+++ b/chromium/third_party/WebKit/Source/wtf/text/Base64.h
@@ -39,13 +39,17 @@ enum Base64EncodePolicy {
Base64InsertLFs
};
-enum Base64DecodePolicy {
- Base64FailOnInvalidCharacterOrExcessPadding,
+enum Base64InvalidCharactersPolicy {
Base64FailOnInvalidCharacter,
Base64IgnoreWhitespace,
Base64IgnoreInvalidCharacters
};
+enum Base64PaddingValidationPolicy {
+ Base64NoPaddingValidation,
+ Base64StrictPaddingValidation
+};
+
WTF_EXPORT void base64Encode(const char*, unsigned, Vector<char>&, Base64EncodePolicy = Base64DoNotInsertLFs);
WTF_EXPORT void base64Encode(const Vector<char>&, Vector<char>&, Base64EncodePolicy = Base64DoNotInsertLFs);
WTF_EXPORT void base64Encode(const CString&, Vector<char>&, Base64EncodePolicy = Base64DoNotInsertLFs);
@@ -53,9 +57,9 @@ WTF_EXPORT String base64Encode(const char*, unsigned, Base64EncodePolicy = Base6
WTF_EXPORT String base64Encode(const Vector<char>&, Base64EncodePolicy = Base64DoNotInsertLFs);
WTF_EXPORT String base64Encode(const CString&, Base64EncodePolicy = Base64DoNotInsertLFs);
-WTF_EXPORT bool base64Decode(const String&, Vector<char>&, Base64DecodePolicy = Base64FailOnInvalidCharacter);
-WTF_EXPORT bool base64Decode(const Vector<char>&, Vector<char>&, Base64DecodePolicy = Base64FailOnInvalidCharacter);
-WTF_EXPORT bool base64Decode(const char*, unsigned, Vector<char>&, Base64DecodePolicy = Base64FailOnInvalidCharacter);
+WTF_EXPORT bool base64Decode(const String&, Vector<char>&, Base64InvalidCharactersPolicy = Base64FailOnInvalidCharacter, Base64PaddingValidationPolicy = Base64NoPaddingValidation);
+WTF_EXPORT bool base64Decode(const Vector<char>&, Vector<char>&, Base64InvalidCharactersPolicy = Base64FailOnInvalidCharacter, Base64PaddingValidationPolicy = Base64NoPaddingValidation);
+WTF_EXPORT bool base64Decode(const char*, unsigned, Vector<char>&, Base64InvalidCharactersPolicy = Base64FailOnInvalidCharacter, Base64PaddingValidationPolicy = Base64NoPaddingValidation);
inline void base64Encode(const Vector<char>& in, Vector<char>& out, Base64EncodePolicy policy)
{
@@ -82,11 +86,13 @@ inline String base64Encode(const CString& in, Base64EncodePolicy policy)
using WTF::Base64EncodePolicy;
using WTF::Base64DoNotInsertLFs;
using WTF::Base64InsertLFs;
-using WTF::Base64DecodePolicy;
-using WTF::Base64FailOnInvalidCharacterOrExcessPadding;
+using WTF::Base64InvalidCharactersPolicy;
using WTF::Base64FailOnInvalidCharacter;
using WTF::Base64IgnoreWhitespace;
using WTF::Base64IgnoreInvalidCharacters;
+using WTF::Base64PaddingValidationPolicy;
+using WTF::Base64NoPaddingValidation;
+using WTF::Base64StrictPaddingValidation;
using WTF::base64Encode;
using WTF::base64Decode;
diff --git a/chromium/third_party/WebKit/Tools/RebaselineLogServer/app.yaml b/chromium/third_party/WebKit/Tools/RebaselineLogServer/app.yaml
deleted file mode 100644
index 86ab13d7d2e..00000000000
--- a/chromium/third_party/WebKit/Tools/RebaselineLogServer/app.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-application: blinkrebaseline
-version: 1
-runtime: python27
-api_version: 1
-threadsafe: true
-
-handlers:
-- url: /.*
- script: main.app
diff --git a/chromium/third_party/WebKit/Tools/RebaselineLogServer/logs.html b/chromium/third_party/WebKit/Tools/RebaselineLogServer/logs.html
deleted file mode 100644
index 8f2498d62c5..00000000000
--- a/chromium/third_party/WebKit/Tools/RebaselineLogServer/logs.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html>
-<title>Rebaseline-o-matic logs</title>
-<style>
-h1 {
- font-size: 1em;
- margin: 0;
- padding: 4px;
- background-color: lightgray;
-}
-pre {
- margin: 0;
- padding: 4px;
-}
-.container {
- border: 1px dashed;
- margin-bottom: 8px;
-}
-</style>
-
-{% for log in logs %}
-<div class="container">
- <h1>
- <script>
- // This date format needs to match the format string used in loghandler.py.
- lastDateBeforeQueryParameter = '{{ log.date|date:"Y-m-d\TH:i:s" }}Z';
- document.write(new Date('{{ log.date|date:"c" }}').toLocaleString())
- </script>
- </h1>
- <pre>{% if log.is_no_needs_rebaseline %}No NeedsRebaseline entries in TestExpectations.{% else %}{{ log.content }}{% endif %}</pre>
-</div>
-{% endfor %}
-
-{% if not logs %}
-No more logs.
-{% endif %}
-
-<script>
- var urlBase = location.toString().replace(/\?.*/, '');
- [3, 10, 100].forEach(function(numLogs) {
- var url = urlBase + "?{{ before_param }}=" + lastDateBeforeQueryParameter + "&{{ num_logs_param }}=" + numLogs;
- document.write('<a href="' + url + '">previous ' + numLogs + '</a> ');
- })
-</script>
diff --git a/chromium/third_party/WebKit/Tools/RebaselineLogServer/main.py b/chromium/third_party/WebKit/Tools/RebaselineLogServer/main.py
deleted file mode 100644
index 9211df34f97..00000000000
--- a/chromium/third_party/WebKit/Tools/RebaselineLogServer/main.py
+++ /dev/null
@@ -1,143 +0,0 @@
-# Copyright (C) 2013 Google Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-import datetime
-import logging
-import webapp2
-
-from google.appengine.ext import ndb
-from google.appengine.ext.webapp import template
-
-# A simple log server for rebaseline-o-matic.
-#
-# Accepts updates to the same log entry and shows a simple status page.
-# Has a special state for the case where there are no NeedsRebaseline
-# lines in TestExpectations to avoid cluttering the log with useless
-# entries every 30 seconds.
-#
-# Other than that, new updatelog calls append to the most recent log
-# entry until they have the newentry parameter, in which case, it
-# starts a new log entry.
-
-LOG_PARAM = "log"
-NEW_ENTRY_PARAM = "newentry"
-NO_NEEDS_REBASELINE_PARAM = "noneedsrebaseline"
-NUM_LOGS_PARAM = "numlogs"
-BEFORE_PARAM = "before"
-
-
-class LogEntry(ndb.Model):
- content = ndb.TextProperty()
- date = ndb.DateTimeProperty(auto_now_add=True)
- is_no_needs_rebaseline = ndb.BooleanProperty()
-
-
-def logs_query():
- return LogEntry.query().order(-LogEntry.date)
-
-
-class UpdateLog(webapp2.RequestHandler):
- def post(self):
- new_log_data = self.request.POST.get(LOG_PARAM)
- # This entry is set to on whenever a new auto-rebaseline run is going to
- # start logging entries. If this is not on, then the log will get appended
- # to the most recent log entry.
- new_entry = self.request.POST.get(NEW_ENTRY_PARAM) == "on"
- # The case of no NeedsRebaseline lines in TestExpectations is special-cased
- # to always overwrite the previous noneedsrebaseline entry in the log to
- # avoid cluttering the log with useless empty posts. It just updates the
- # date of the entry so that users can see that rebaseline-o-matic is still
- # running.
- no_needs_rebaseline = self.request.POST.get(NO_NEEDS_REBASELINE_PARAM) == "on"
-
- out = "Wrote new log entry."
- if not new_entry or no_needs_rebaseline:
- log_entries = logs_query().fetch(1)
- if log_entries:
- log_entry = log_entries[0]
- log_entry.date = datetime.datetime.now()
- if no_needs_rebaseline:
- # Don't write out a new log entry for repeated no_needs_rebaseline cases.
- # The repeated entries just add noise to the logs.
- if log_entry.is_no_needs_rebaseline:
- out = "Overwrote existing no needs rebaseline log."
- else:
- out = "Wrote new no needs rebaseline log."
- new_entry = True
- new_log_data = ""
- elif log_entry.is_no_needs_rebaseline:
- out = "Previous entry was a no need rebaseline log. Writing a new log."
- new_entry = True
- else:
- out = "Added to existing log entry."
- log_entry.content = log_entry.content + "\n" + new_log_data
-
- if new_entry or not log_entries:
- log_entry = LogEntry(content=new_log_data, is_no_needs_rebaseline=no_needs_rebaseline)
-
- log_entry.put()
- self.response.out.write(out)
-
-
-class UploadForm(webapp2.RequestHandler):
- def get(self):
- self.response.out.write(template.render("uploadform.html", {
- "update_log_url": "/updatelog",
- "set_no_needs_rebaseline_url": "/noneedsrebaselines",
- "log_param": LOG_PARAM,
- "new_entry_param": NEW_ENTRY_PARAM,
- "no_needs_rebaseline_param": NO_NEEDS_REBASELINE_PARAM,
- }))
-
-
-class ShowLatest(webapp2.RequestHandler):
- def get(self):
- query = logs_query()
-
- before = self.request.get(BEFORE_PARAM)
- if before:
- date = datetime.datetime.strptime(before, "%Y-%m-%dT%H:%M:%SZ")
- query = query.filter(LogEntry.date < date)
-
- num_logs = self.request.get(NUM_LOGS_PARAM)
- logs = query.fetch(int(num_logs) if num_logs else 3)
-
- self.response.out.write(template.render("logs.html", {
- "logs": logs,
- "num_logs_param": NUM_LOGS_PARAM,
- "before_param": BEFORE_PARAM,
- }))
-
-
-routes = [
- ('/uploadform', UploadForm),
- ('/updatelog', UpdateLog),
- ('/', ShowLatest),
-]
-
-app = webapp2.WSGIApplication(routes, debug=True)
diff --git a/chromium/third_party/WebKit/Tools/RebaselineLogServer/main_unittest.py b/chromium/third_party/WebKit/Tools/RebaselineLogServer/main_unittest.py
deleted file mode 100644
index d3d6e30902a..00000000000
--- a/chromium/third_party/WebKit/Tools/RebaselineLogServer/main_unittest.py
+++ /dev/null
@@ -1,122 +0,0 @@
-# Copyright (C) 2013 Google Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# Usage: PYTHON_PATH=/path/to/appengine_sdk python loghandler_unittest.py.
-
-import dev_appserver
-dev_appserver.fix_sys_path()
-
-import unittest
-import webapp2
-
-from google.appengine.ext import testbed
-
-import main
-
-
-class TestHandlers(unittest.TestCase):
- def setUp(self):
- self.testbed = testbed.Testbed()
- self.testbed.activate()
- self.testbed.init_datastore_v3_stub()
- self.testbed.init_memcache_stub()
-
- def test_update_log(self):
- request = webapp2.Request.blank('/updatelog')
- request.method = 'POST'
- request.POST[main.LOG_PARAM] = 'data to log'
- request.POST[main.NEW_ENTRY_PARAM] = 'on'
- request.POST[main.NO_NEEDS_REBASELINE_PARAM] = 'off'
-
- response = request.get_response(main.app)
- self.assertEqual(response.status_int, 200)
- self.assertEqual(response.body, 'Wrote new log entry.')
-
- response = request.get_response(main.app)
- self.assertEqual(response.status_int, 200)
- self.assertEqual(response.body, 'Wrote new log entry.')
-
- request = webapp2.Request.blank('/updatelog')
- request.method = 'POST'
- request.POST[main.LOG_PARAM] = 'data to log'
- request.POST[main.NEW_ENTRY_PARAM] = 'off'
- request.POST[main.NO_NEEDS_REBASELINE_PARAM] = 'off'
-
- response = request.get_response(main.app)
- self.assertEqual(response.status_int, 200)
- self.assertEqual(response.body, 'Added to existing log entry.')
-
- request = webapp2.Request.blank('/updatelog')
- request.method = 'POST'
- request.POST[main.LOG_PARAM] = 'data to log'
- request.POST[main.NEW_ENTRY_PARAM] = 'off'
- request.POST[main.NO_NEEDS_REBASELINE_PARAM] = 'on'
-
- response = request.get_response(main.app)
- self.assertEqual(response.status_int, 200)
- self.assertEqual(response.body, 'Wrote new no needs rebaseline log.')
-
- response = request.get_response(main.app)
- self.assertEqual(response.status_int, 200)
- self.assertEqual(response.body, 'Overwrote existing no needs rebaseline log.')
-
- request = webapp2.Request.blank('/updatelog')
- request.method = 'POST'
- request.POST[main.LOG_PARAM] = 'data to log'
- request.POST[main.NEW_ENTRY_PARAM] = 'off'
- request.POST[main.NO_NEEDS_REBASELINE_PARAM] = 'off'
-
- response = request.get_response(main.app)
- self.assertEqual(response.status_int, 200)
- self.assertEqual(response.body, 'Previous entry was a no need rebaseline log. Writing a new log.')
-
- def test_update_log_first_entry_without_new_entry_param(self):
- request = webapp2.Request.blank('/updatelog')
- request.method = 'POST'
- request.POST[main.LOG_PARAM] = 'data to log'
- request.POST[main.NEW_ENTRY_PARAM] = 'off'
- request.POST[main.NO_NEEDS_REBASELINE_PARAM] = 'off'
-
- response = request.get_response(main.app)
- self.assertEqual(response.status_int, 200)
- self.assertEqual(response.body, 'Wrote new log entry.')
-
- def test_update_log_first_entry_no_needs_rebaseline_param(self):
- request = webapp2.Request.blank('/updatelog')
- request.method = 'POST'
- request.POST[main.LOG_PARAM] = 'data to log'
- request.POST[main.NEW_ENTRY_PARAM] = 'off'
- request.POST[main.NO_NEEDS_REBASELINE_PARAM] = 'on'
-
- response = request.get_response(main.app)
- self.assertEqual(response.status_int, 200)
- self.assertEqual(response.body, 'Wrote new log entry.')
-
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/chromium/third_party/WebKit/Tools/RebaselineLogServer/uploadform.html b/chromium/third_party/WebKit/Tools/RebaselineLogServer/uploadform.html
deleted file mode 100644
index cbc71e5102e..00000000000
--- a/chromium/third_party/WebKit/Tools/RebaselineLogServer/uploadform.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<title>Update rebaseline logs</title>
-<style>
-html, body {
- height: 100%;
-}
-body, form {
- display: flex;
- flex-direction: column;
-}
-form, textarea {
- flex: 1;
-}
-</style>
-
-<h1>Update logs</h1>
-<p>This page is for manually testing the log server.</p>
-<form accept="text/html" action="{{ update_log_url }}" enctype="multipart/form-data" method="post">
- <div>
- <label><input name="{{ new_entry_param }}" type="checkbox">Start a new log entry</label>
- <label><input name="{{ no_needs_rebaseline_param }}" type="checkbox">No tests need rebaseline</label>
- <input class=button type="submit" value="Upload">
- </div>
- <textarea name="{{ log_param }}" placeholder="Some logging data..."/></textarea>
-</form>
diff --git a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/common/net/layouttestresults.py b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/common/net/layouttestresults.py
index 2597e0a1401..b3c4367c0b5 100644
--- a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/common/net/layouttestresults.py
+++ b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/common/net/layouttestresults.py
@@ -103,9 +103,6 @@ class LayoutTestResults(object):
def run_was_interrupted(self):
return self._results["interrupted"]
- def builder_name(self):
- return self._results["builder_name"]
-
def blink_revision(self):
return int(self._results["blink_revision"])
diff --git a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/builders.py b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/builders.py
index 99564c6054f..91c7c7a0c8a 100644
--- a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/builders.py
+++ b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/builders.py
@@ -41,7 +41,8 @@ from webkitpy.common.memoized import memoized
_exact_matches = {
"WebKit XP": {"port_name": "win-xp"},
"WebKit Win7": {"port_name": "win-win7"},
- "WebKit Win7 (dbg)": {"port_name": "win-win7"},
+ "WebKit Win7 (dbg)(1)": {"port_name": "win-win7"},
+ "WebKit Win7 (dbg)(2)": {"port_name": "win-win7"},
"WebKit Linux": {"port_name": "linux-x86_64"},
"WebKit Linux 32": {"port_name": "linux-x86"},
"WebKit Linux (dbg)": {"port_name": "linux-x86_64"},
diff --git a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
index 087ba5ec543..0d8578a36aa 100644
--- a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
+++ b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/run_webkit_tests.py
@@ -236,6 +236,11 @@ def parse_args(args):
dest="retry_failures",
help="Don't re-try any tests that produce unexpected results."),
+ # FIXME: Remove this after we remove the flag from the v8 bot.
+ optparse.make_option("--retry-crashes", action="store_true",
+ default=False,
+ help="ignored (we now always retry crashes when we retry failures)."),
+
optparse.make_option("--max-locked-shards", type="int", default=0,
help="Set the maximum number of locked shards"),
optparse.make_option("--additional-env-var", type="string", action="append", default=[],
diff --git a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checker.py b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checker.py
index ee084544f74..c6357da4b7b 100644
--- a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checker.py
+++ b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checker.py
@@ -38,6 +38,7 @@ import sys
from checkers.common import categories as CommonCategories
from checkers.common import CarriageReturnChecker
from checkers.cpp import CppChecker
+from checkers.cmake import CMakeChecker
from checkers.jsonchecker import JSONChecker
from checkers.png import PNGChecker
from checkers.python import PythonChecker
@@ -126,7 +127,113 @@ _PATH_RULES_SPECIFIER = [
# discipline as WebCore.
([# There is no clean way to avoid "yy_*" names used by flex.
- "Source/core/css/CSSParser-in.cpp"],
+ "Source/WebCore/css/CSSParser.cpp",
+ # Qt code uses '_' in some places (such as private slots
+ # and on test xxx_data methos on tests)
+ "Source/JavaScriptCore/qt/",
+ "Source/WebKit/qt/tests/",
+ "Source/WebKit/qt/declarative/",
+ "Source/WebKit/qt/examples/"],
+ ["-readability/naming"]),
+
+ ([# The Qt APIs use Qt declaration style, it puts the * to
+ # the variable name, not to the class.
+ "Source/WebKit/qt/Api/",
+ "Source/WebKit/qt/WidgetApi/"],
+ ["-readability/naming",
+ "-whitespace/declaration"]),
+
+ ([# Qt's MiniBrowser has no config.h
+ "Tools/MiniBrowser/qt",
+ "Tools/MiniBrowser/qt/raw"],
+ ["-build/include"]),
+
+ ([# The Qt APIs use Qt/QML naming style, which includes
+ # naming parameters in h files.
+ "Source/WebKit2/UIProcess/API/qt"],
+ ["-readability/parameter_name"]),
+
+ ([# The GTK+ port uses the autotoolsconfig.h header in some C sources
+ # to serve the same purpose of config.h.
+ "Tools/GtkLauncher/main.c"],
+ ["-build/include_order"]),
+
+ ([# The GTK+ APIs use GTK+ naming style, which includes
+ # lower-cased, underscore-separated values, whitespace before
+ # parens for function calls, and always having variable names.
+ # Also, GTK+ allows the use of NULL.
+ "Source/WebCore/bindings/scripts/test/GObject",
+ "Source/WebKit/gtk/webkit/",
+ "Tools/DumpRenderTree/gtk/"],
+ ["-readability/naming",
+ "-readability/parameter_name",
+ "-readability/null",
+ "-readability/enum_casing",
+ "-whitespace/parens"]),
+
+ ([# The GTK+ API use upper case, underscore separated, words in
+ # certain types of enums (e.g. signals, properties).
+ "Source/WebKit2/UIProcess/API/gtk",
+ "Source/WebKit2/WebProcess/InjectedBundle/API/gtk"],
+ ["-readability/enum_casing"]),
+
+ ([# Header files in ForwardingHeaders have no header guards or
+ # exceptional header guards (e.g., WebCore_FWD_Debugger_h).
+ "/ForwardingHeaders/"],
+ ["-build/header_guard"]),
+ ([# assembler has lots of opcodes that use underscores, so
+ # we don't check for underscores in that directory.
+ "Source/JavaScriptCore/assembler/",
+ "Source/JavaScriptCore/jit/JIT"],
+ ["-readability/naming/underscores"]),
+ ([# JITStubs has an usual syntax which causes false alarms for a few checks.
+ "JavaScriptCore/jit/JITStubs.cpp"],
+ ["-readability/parameter_name",
+ "-whitespace/parens"]),
+
+ ([# The EFL APIs use EFL naming style, which includes
+ # both lower-cased and camel-cased, underscore-sparated
+ # values.
+ "Source/WebKit/efl/ewk/",
+ "Source/WebKit2/UIProcess/API/efl/"],
+ ["-readability/naming",
+ "-readability/parameter_name"]),
+ ([# EWebLauncher and MiniBrowser are EFL simple application.
+ # They need to use efl coding style and they don't have config.h.
+ "Tools/EWebLauncher/",
+ "Tools/MiniBrowser/efl/"],
+ ["-readability/naming",
+ "-readability/parameter_name",
+ "-whitespace/declaration",
+ "-build/include_order"]),
+
+ # WebKit2 rules:
+ # WebKit2 and certain directories have idiosyncracies.
+ ([# NPAPI has function names with underscores.
+ "Source/WebKit2/WebProcess/Plugins/Netscape"],
+ ["-readability/naming"]),
+ ([# The WebKit2 C API has names with underscores and whitespace-aligned
+ # struct members. Also, we allow unnecessary parameter names in
+ # WebKit2 APIs because we're matching CF's header style.
+ # Additionally, we use word which starts with non-capital letter 'k'
+ # for types of enums.
+ "Source/WebKit2/UIProcess/API/C/",
+ "Source/WebKit2/Shared/API/c/",
+ "Source/WebKit2/WebProcess/InjectedBundle/API/c/"],
+ ["-readability/enum_casing",
+ "-readability/naming",
+ "-readability/parameter_name",
+ "-whitespace/declaration"]),
+ ([# These files define GObjects, which implies some definitions of
+ # variables and functions containing underscores.
+ "Source/WebCore/platform/graphics/clutter/GraphicsLayerActor.cpp",
+ "Source/WebCore/platform/graphics/clutter/GraphicsLayerActor.h",
+ "Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer1.cpp",
+ "Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp",
+ "Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp",
+ "Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp",
+ "Source/WebCore/platform/network/soup/ProxyResolverSoup.cpp",
+ "Source/WebCore/platform/network/soup/ProxyResolverSoup.h"],
["-readability/naming"]),
# For third-party Python code, keep only the following checks--
@@ -141,6 +248,22 @@ _PATH_RULES_SPECIFIER = [
"+pep8/W291", # Trailing white space
"+whitespace/carriage_return"]),
+ ([# glu's libtess is third-party code, and doesn't follow WebKit style.
+ "Source/ThirdParty/glu"],
+ ["-readability",
+ "-whitespace",
+ "-build/header_guard",
+ "-build/include_order"]),
+
+ ([# There is no way to avoid the symbols __jit_debug_register_code
+ # and __jit_debug_descriptor when integrating with gdb.
+ "Source/JavaScriptCore/jit/GDBInterface.cpp"],
+ ["-readability/naming"]),
+
+ ([# On some systems the trailing CR is causing parser failure.
+ "Source/JavaScriptCore/parser/Keywords.table"],
+ ["+whitespace/carriage_return"]),
+
([# Jinja templates: files have .cpp or .h extensions, but contain
# template code, which can't be handled, so disable tests.
"Source/bindings/templates",
@@ -160,9 +283,12 @@ _JSON_FILE_EXTENSION = 'json'
_PYTHON_FILE_EXTENSION = 'py'
_TEXT_FILE_EXTENSIONS = [
+ 'ac',
'cc',
'cgi',
'css',
+ 'exp',
+ 'flex',
'gyp',
'gypi',
'html',
@@ -173,9 +299,13 @@ _TEXT_FILE_EXTENSIONS = [
'php',
'pl',
'pm',
+ 'pri',
+ 'pro',
'rb',
'sh',
+ 'table',
'txt',
+ 'wm',
'xhtml',
'y',
]
@@ -189,6 +319,8 @@ _XML_FILE_EXTENSIONS = [
_PNG_FILE_EXTENSION = 'png'
+_CMAKE_FILE_EXTENSION = 'cmake'
+
# Files to skip that are less obvious.
#
# Some files should be skipped when checking style. For example,
@@ -383,6 +515,7 @@ class FileType:
# WATCHLIST = 7
XML = 8
XCODEPROJ = 9
+ CMAKE = 10
class CheckerDispatcher(object):
@@ -453,6 +586,8 @@ class CheckerDispatcher(object):
return FileType.XCODEPROJ
elif file_extension == _PNG_FILE_EXTENSION:
return FileType.PNG
+ elif ((file_extension == _CMAKE_FILE_EXTENSION) or os.path.basename(file_path) == 'CMakeLists.txt'):
+ return FileType.CMAKE
elif ((not file_extension and os.path.join("Tools", "Scripts") in file_path) or
file_extension in _TEXT_FILE_EXTENSIONS or os.path.basename(file_path) == 'TestExpectations'):
return FileType.TEXT
@@ -478,6 +613,8 @@ class CheckerDispatcher(object):
checker = XcodeProjectFileChecker(file_path, handle_style_error)
elif file_type == FileType.PNG:
checker = PNGChecker(file_path, handle_style_error)
+ elif file_type == FileType.CMAKE:
+ checker = CMakeChecker(file_path, handle_style_error)
elif file_type == FileType.TEXT:
basename = os.path.basename(file_path)
if basename == 'TestExpectations':
diff --git a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checker_unittest.py b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checker_unittest.py
index 1c588732051..c19367fc2b9 100644
--- a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checker_unittest.py
+++ b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checker_unittest.py
@@ -213,7 +213,43 @@ class GlobalVariablesTest(unittest.TestCase):
"build/include")
assertCheck("random_path.cpp",
"readability/naming")
- assertNoCheck("Source/core/css/CSSParser-in.cpp",
+ assertNoCheck("Source/WebKit/gtk/webkit/webkit.h",
+ "readability/naming")
+ assertNoCheck("Tools/DumpRenderTree/gtk/DumpRenderTree.cpp",
+ "readability/null")
+ assertNoCheck("Source/WebKit/efl/ewk/ewk_view.h",
+ "readability/naming")
+ assertNoCheck("Source/WebCore/css/CSSParser.cpp",
+ "readability/naming")
+
+ # Test if Qt exceptions are indeed working
+ assertCheck("Source/WebKit/qt/WidgetApi/qwebpage.cpp",
+ "readability/braces")
+ assertCheck("Source/WebKit/qt/tests/qwebelement/tst_qwebelement.cpp",
+ "readability/braces")
+ assertCheck("Source/WebKit/qt/declarative/platformplugin/WebPlugin.cpp",
+ "readability/braces")
+ assertCheck("Source/WebKit/qt/examples/platformplugin/WebPlugin.cpp",
+ "readability/braces")
+ assertNoCheck("Source/WebKit/qt/WidgetApi/qwebpage.cpp",
+ "readability/naming")
+ assertNoCheck("Source/WebKit/qt/tests/qwebelement/tst_qwebelement.cpp",
+ "readability/naming")
+ assertNoCheck("Source/WebKit/qt/declarative/platformplugin/WebPlugin.cpp",
+ "readability/naming")
+ assertNoCheck("Source/WebKit/qt/examples/platformplugin/WebPlugin.cpp",
+ "readability/naming")
+
+ assertNoCheck("Tools/MiniBrowser/qt/UrlLoader.cpp",
+ "build/include")
+
+ assertNoCheck("Source/WebKit2/UIProcess/API/qt",
+ "readability/parameter_name")
+
+ assertNoCheck("Source/WebCore/ForwardingHeaders/debugger/Debugger.h",
+ "build/header_guard")
+
+ assertNoCheck("Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp",
"readability/naming")
# Third-party Python code: webkitpy/thirdparty
@@ -224,6 +260,13 @@ class GlobalVariablesTest(unittest.TestCase):
assertCheck(path, "pep8/W291")
assertCheck(path, "whitespace/carriage_return")
+ # Test if the exception for GDBInterface.cpp is in place.
+ assertNoCheck("Source/JavaScriptCore/jit/GDBInterface.cpp",
+ "readability/naming")
+
+ # Javascript keywords.
+ assertCheck("Source/JavaScriptCore/parser/Keywords.table", "whitespace/carriage_return")
+
def test_max_reports_per_category(self):
"""Check that _MAX_REPORTS_PER_CATEGORY is valid."""
all_categories = self._all_categories()
@@ -456,9 +499,12 @@ class CheckerDispatcherDispatchTest(unittest.TestCase):
def test_text_paths(self):
"""Test paths that should be checked as text."""
paths = [
+ "foo.ac",
"foo.cc",
"foo.cgi",
"foo.css",
+ "foo.exp",
+ "foo.flex",
"foo.gyp",
"foo.gypi",
"foo.html",
@@ -469,9 +515,12 @@ class CheckerDispatcherDispatchTest(unittest.TestCase):
"foo.php",
"foo.pl",
"foo.pm",
+ "foo.pri",
+ "foo.pro",
"foo.rb",
"foo.sh",
"foo.txt",
+ "foo.wm",
"foo.xhtml",
"foo.y",
os.path.join("Source", "WebCore", "inspector", "front-end", "inspector.js"),
diff --git a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cmake.py b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cmake.py
new file mode 100644
index 00000000000..06b8929fab6
--- /dev/null
+++ b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cmake.py
@@ -0,0 +1,150 @@
+# Copyright (C) 2012 Intel Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+"""Supports checking WebKit style in cmake files.(.cmake, CMakeLists.txt)"""
+
+import re
+
+from common import TabChecker
+
+
+class CMakeChecker(object):
+
+ """Processes CMake lines for checking style."""
+
+ # NO_SPACE_CMDS list are based on commands section of CMake document.
+ # Now it is generated from
+ # http://www.cmake.org/cmake/help/v2.8.10/cmake.html#section_Commands.
+ # Some commands are from default CMake modules such as pkg_check_modules.
+ # Please keep list in alphabet order.
+ #
+ # For commands in this list, spaces should not be added it and its
+ # parentheses. For eg, message("testing"), not message ("testing")
+ #
+ # The conditional commands like if, else, endif, foreach, endforeach,
+ # while, endwhile and break are listed in ONE_SPACE_CMDS
+ NO_SPACE_CMDS = [
+ 'add_custom_command', 'add_custom_target', 'add_definitions',
+ 'add_dependencies', 'add_executable', 'add_library',
+ 'add_subdirectory', 'add_test', 'aux_source_directory',
+ 'build_command',
+ 'cmake_minimum_required', 'cmake_policy', 'configure_file',
+ 'create_test_sourcelist',
+ 'define_property',
+ 'enable_language', 'enable_testing', 'endfunction', 'endmacro',
+ 'execute_process', 'export',
+ 'file', 'find_file', 'find_library', 'find_package', 'find_path',
+ 'find_program', 'fltk_wrap_ui', 'function',
+ 'get_cmake_property', 'get_directory_property',
+ 'get_filename_component', 'get_property', 'get_source_file_property',
+ 'get_target_property', 'get_test_property',
+ 'include', 'include_directories', 'include_external_msproject',
+ 'include_regular_expression', 'install',
+ 'link_directories', 'list', 'load_cache', 'load_command',
+ 'macro', 'mark_as_advanced', 'math', 'message',
+ 'option',
+ #From FindPkgConfig.cmake
+ 'pkg_check_modules',
+ 'project',
+ 'qt_wrap_cpp', 'qt_wrap_ui',
+ 'remove_definitions', 'return',
+ 'separate_arguments', 'set', 'set_directory_properties', 'set_property',
+ 'set_source_files_properties', 'set_target_properties',
+ 'set_tests_properties', 'site_name', 'source_group', 'string',
+ 'target_link_libraries', 'try_compile', 'try_run',
+ 'unset',
+ 'variable_watch',
+ ]
+
+ # CMake conditional commands, require one space between command and
+ # its parentheses, such as "if (", "foreach (", etc.
+ ONE_SPACE_CMDS = [
+ 'if', 'else', 'elseif', 'endif',
+ 'foreach', 'endforeach',
+ 'while', 'endwhile',
+ 'break',
+ ]
+
+ def __init__(self, file_path, handle_style_error):
+ self._handle_style_error = handle_style_error
+ self._tab_checker = TabChecker(file_path, handle_style_error)
+
+ def check(self, lines):
+ self._tab_checker.check(lines)
+ self._num_lines = len(lines)
+ for l in xrange(self._num_lines):
+ self._process_line(l + 1, lines[l])
+
+ def _process_line(self, line_number, line_content):
+ if re.match('(^|\ +)#', line_content):
+ # ignore comment line
+ return
+ l = line_content.expandtabs(4)
+ # check command like message( "testing")
+ if re.search('\(\ +', l):
+ self._handle_style_error(line_number, 'whitespace/parentheses', 5,
+ 'No space after "("')
+ # check command like message("testing" )
+ if re.search('\ +\)', l) and not re.search('^\ +\)$', l):
+ self._handle_style_error(line_number, 'whitespace/parentheses', 5,
+ 'No space before ")"')
+ self._check_trailing_whitespace(line_number, l)
+ self._check_no_space_cmds(line_number, l)
+ self._check_one_space_cmds(line_number, l)
+ self._check_indent(line_number, line_content)
+
+ def _check_trailing_whitespace(self, line_number, line_content):
+ line_content = line_content.rstrip('\n') # chr(10), newline
+ line_content = line_content.rstrip('\r') # chr(13), carriage return
+ line_content = line_content.rstrip('\x0c') # chr(12), form feed, ^L
+ stripped = line_content.rstrip()
+ if line_content != stripped:
+ self._handle_style_error(line_number, 'whitespace/trailing', 5,
+ 'No trailing spaces')
+
+ def _check_no_space_cmds(self, line_number, line_content):
+ # check command like "SET (" or "Set("
+ for t in self.NO_SPACE_CMDS:
+ self._check_non_lowercase_cmd(line_number, line_content, t)
+ if re.search('(^|\ +)' + t.lower() + '\ +\(', line_content):
+ msg = 'No space between command "' + t.lower() + '" and its parentheses, should be "' + t + '("'
+ self._handle_style_error(line_number, 'whitespace/parentheses', 5, msg)
+
+ def _check_one_space_cmds(self, line_number, line_content):
+ # check command like "IF (" or "if(" or "if (" or "If ()"
+ for t in self.ONE_SPACE_CMDS:
+ self._check_non_lowercase_cmd(line_number, line_content, t)
+ if re.search('(^|\ +)' + t.lower() + '(\(|\ \ +\()', line_content):
+ msg = 'One space between command "' + t.lower() + '" and its parentheses, should be "' + t + ' ("'
+ self._handle_style_error(line_number, 'whitespace/parentheses', 5, msg)
+
+ def _check_non_lowercase_cmd(self, line_number, line_content, cmd):
+ if re.search('(^|\ +)' + cmd + '\ *\(', line_content, flags=re.IGNORECASE) and \
+ (not re.search('(^|\ +)' + cmd.lower() + '\ *\(', line_content)):
+ msg = 'Use lowercase command "' + cmd.lower() + '"'
+ self._handle_style_error(line_number, 'command/lowercase', 5, msg)
+
+ def _check_indent(self, line_number, line_content):
+ #TODO (halton): add indent checking
+ pass
diff --git a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cmake_unittest.py b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cmake_unittest.py
new file mode 100644
index 00000000000..eefc8f7f19f
--- /dev/null
+++ b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/cmake_unittest.py
@@ -0,0 +1,90 @@
+# Copyright (C) 2012 Intel Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for cmake.py."""
+
+import webkitpy.thirdparty.unittest2 as unittest
+
+from cmake import CMakeChecker
+
+
+class CMakeCheckerTest(unittest.TestCase):
+
+ """Tests CMakeChecker class."""
+
+ def test_init(self):
+ """Test __init__() method."""
+ def _mock_handle_style_error(self):
+ pass
+
+ checker = CMakeChecker("foo.cmake", _mock_handle_style_error)
+ self.assertEqual(checker._handle_style_error, _mock_handle_style_error)
+
+ def test_check(self):
+ """Test check() method."""
+ errors = []
+
+ def _mock_handle_style_error(line_number, category, confidence,
+ message):
+ error = (line_number, category, confidence, message)
+ errors.append(error)
+
+ checker = CMakeChecker("foo.cmake", _mock_handle_style_error)
+
+ lines = [
+ '# This file is sample input for cmake_unittest.py and includes below problems:\n',
+ 'IF ()',
+ '\tmessage("Error line with Tab")\n',
+ ' message("Error line with endding spaces") \n',
+ ' message( "Error line with space after (")\n',
+ ' message("Error line with space before (" )\n',
+ ' MESSAGE("Error line with upper case non-condtional command")\n',
+ ' MESSage("Error line with upper case non-condtional command")\n',
+ ' message("correct message line")\n',
+ 'ENDif ()\n',
+ '\n',
+ 'if()\n',
+ 'endif ()\n',
+ '\n',
+ 'macro ()\n',
+ 'ENDMacro()\n',
+ '\n',
+ 'function ()\n',
+ 'endfunction()\n',
+ ]
+ checker.check(lines)
+
+ self.maxDiff = None
+ self.assertEqual(errors, [
+ (3, 'whitespace/tab', 5, 'Line contains tab character.'),
+ (2, 'command/lowercase', 5, 'Use lowercase command "if"'),
+ (4, 'whitespace/trailing', 5, 'No trailing spaces'),
+ (5, 'whitespace/parentheses', 5, 'No space after "("'),
+ (6, 'whitespace/parentheses', 5, 'No space before ")"'),
+ (7, 'command/lowercase', 5, 'Use lowercase command "message"'),
+ (8, 'command/lowercase', 5, 'Use lowercase command "message"'),
+ (10, 'command/lowercase', 5, 'Use lowercase command "endif"'),
+ (12, 'whitespace/parentheses', 5, 'One space between command "if" and its parentheses, should be "if ("'),
+ (15, 'whitespace/parentheses', 5, 'No space between command "macro" and its parentheses, should be "macro("'),
+ (16, 'command/lowercase', 5, 'Use lowercase command "endmacro"'),
+ (18, 'whitespace/parentheses', 5, 'No space between command "function" and its parentheses, should be "function("'),
+ ])
diff --git a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
index ec55decae82..214395fdd17 100644
--- a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
+++ b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
@@ -32,8 +32,6 @@ import optparse
import re
import sys
import time
-import traceback
-import urllib
import urllib2
from webkitpy.common.checkout.baselineoptimizer import BaselineOptimizer
@@ -568,74 +566,18 @@ class AutoRebaseline(AbstractParallelRebaselineCommand):
self.no_optimize_option,
# FIXME: Remove this option.
self.results_directory_option,
- optparse.make_option("--log-server", help="Server to send logs to.")
])
- def _log_to_server(self, log_server, query):
- if not log_server:
- return
- urllib2.urlopen("http://" + log_server + "/updatelog", data=urllib.urlencode(query))
-
- # Logs when there are no NeedsRebaseline lines in TestExpectations.
- # These entries overwrite the existing log entry if the existing
- # entry is also a noneedsrebaseline entry. This is special cased
- # so that the log doesn't get bloated with entries like this
- # when there are no tests that needs rebaselining.
- def _log_no_needs_rebaseline_lines(self, log_server):
- self._log_to_server(log_server, {
- "noneedsrebaseline": "on",
- })
-
- # Uploaded log entries append to the existing entry unless the
- # newentry flag is set. In that case it starts a new entry to
- # start appending to. So, we need to call this on any fresh run
- # that is going to end up logging stuff (i.e. any run that isn't
- # a noneedsrebaseline run).
- def _start_new_log_entry(self, log_server):
- self._log_to_server(log_server, {
- "log": "",
- "newentry": "on",
- })
-
- def _configure_logging(self, log_server):
- if not log_server:
- return
-
- def _log_alias(query):
- self._log_to_server(log_server, query)
-
- class LogHandler(logging.Handler):
- def __init__(self):
- logging.Handler.__init__(self)
- self._records = []
-
- # Since this does not have the newentry flag, it will append
- # to the most recent log entry (i.e. the one created by
- # _start_new_log_entry.
- def emit(self, record):
- _log_alias({
- "log": record.getMessage(),
- })
-
- handler = LogHandler()
- _log.setLevel(logging.DEBUG)
- handler.setLevel(logging.DEBUG)
- _log.addHandler(handler)
-
- def bot_revision_data(self, log_server):
+ def latest_revision_processed_on_all_bots(self):
revisions = []
for result in self.builder_data().values():
if result.run_was_interrupted():
- self._start_new_log_entry(log_server)
- _log.error("Can't rebaseline because the latest run on %s exited early." % result.builder_name())
- return []
- revisions.append({
- "builder": result.builder_name(),
- "revision": result.blink_revision(),
- })
- return revisions
-
- def tests_to_rebaseline(self, tool, min_revision, print_revisions, log_server):
+ _log.error("Can't rebaseline. The latest run on %s did not complete." % builder_name)
+ return 0
+ revisions.append(result.blink_revision())
+ return int(min(revisions))
+
+ def tests_to_rebaseline(self, tool, min_revision, print_revisions):
port = tool.port_factory.get()
expectations_file_path = port.path_to_generic_test_expectations_file()
@@ -643,16 +585,10 @@ class AutoRebaseline(AbstractParallelRebaselineCommand):
revision = None
author = None
bugs = set()
- has_any_needs_rebaseline_lines = False
for line in tool.scm().blame(expectations_file_path).split("\n"):
if "NeedsRebaseline" not in line:
continue
-
- if not has_any_needs_rebaseline_lines:
- self._start_new_log_entry(log_server)
- has_any_needs_rebaseline_lines = True
-
parsed_line = re.match("^(\S*)[^(]*\((\S*).*?([^ ]*)\ \[[^[]*$", line)
commit_hash = parsed_line.group(1)
@@ -679,7 +615,7 @@ class AutoRebaseline(AbstractParallelRebaselineCommand):
_log.info("Too many tests to rebaseline in one patch. Doing the first %d." % self.MAX_LINES_TO_REBASELINE)
break
- return tests, revision, author, bugs, has_any_needs_rebaseline_lines
+ return tests, revision, author, bugs
def link_to_patch(self, revision):
return "http://src.chromium.org/viewvc/blink?view=revision&revision=" + str(revision)
@@ -727,9 +663,9 @@ class AutoRebaseline(AbstractParallelRebaselineCommand):
def tree_status(self):
blink_tree_status_url = "http://blink-status.appspot.com/status"
status = urllib2.urlopen(blink_tree_status_url).read().lower()
- if status.find('closed') != -1 or status == "0":
+ if status.find('closed') != -1 or status == 0:
return 'closed'
- elif status.find('open') != -1 or status == "1":
+ elif status.find('open') != -1 or status == 1:
return 'open'
return 'unknown'
@@ -742,36 +678,25 @@ class AutoRebaseline(AbstractParallelRebaselineCommand):
_log.error("Cannot proceed with working directory changes. Clean working directory first.")
return
- self._configure_logging(options.log_server)
-
- revision_data = self.bot_revision_data(options.log_server)
- if not revision_data:
- return
-
- min_revision = int(min([item["revision"] for item in revision_data]))
- tests, revision, author, bugs, has_any_needs_rebaseline_lines = self.tests_to_rebaseline(tool, min_revision, print_revisions=options.verbose, log_server=options.log_server)
-
- if not has_any_needs_rebaseline_lines:
- self._log_no_needs_rebaseline_lines(options.log_server)
+ min_revision = self.latest_revision_processed_on_all_bots()
+ if not min_revision:
return
if options.verbose:
- _log.info("Min revision across all bots is %s." % min_revision)
- for item in revision_data:
- _log.info("%s: r%s" % (item["builder"], item["revision"]))
+ _log.info("Bot min revision is %s." % min_revision)
+
+ tests, revision, author, bugs = self.tests_to_rebaseline(tool, min_revision, print_revisions=options.verbose)
+ test_prefix_list, lines_to_remove = self.get_test_prefix_list(tests)
if not tests:
_log.debug('No tests to rebaseline.')
return
+ _log.info('Rebaselining %s for r%s by %s.' % (list(tests), revision, author))
if self.tree_status() == 'closed':
_log.info('Cannot proceed. Tree is closed.')
return
- _log.info('Rebaselining %s for r%s by %s.' % (list(tests), revision, author))
-
- test_prefix_list, lines_to_remove = self.get_test_prefix_list(tests)
-
try:
old_branch_name = tool.scm().current_branch()
tool.scm().delete_branch(self.AUTO_REBASELINE_BRANCH_NAME)
@@ -787,8 +712,6 @@ class AutoRebaseline(AbstractParallelRebaselineCommand):
tool.scm().commit_locally_with_message(self.commit_message(author, revision, bugs))
- # FIXME: Log the upload, pull and dcommit stdout/stderr to the log-server.
-
# FIXME: It would be nice if we could dcommit the patch without uploading, but still
# go through all the precommit hooks. For rebaselines with lots of files, uploading
# takes a long time and sometimes fails, but we don't want to commit if, e.g. the
@@ -815,14 +738,10 @@ class RebaselineOMatic(AbstractDeclarativeCommand):
def execute(self, options, args, tool):
while True:
- try:
- tool.executive.run_command(['git', 'pull'])
- rebaseline_command = [tool.filesystem.join(tool.scm().checkout_root, 'Tools', 'Scripts', 'webkit-patch'), 'auto-rebaseline', '--log-server', 'blinkrebaseline.appspot.com']
- if options.verbose:
- rebaseline_command.append('--verbose')
- # Use call instead of run_command so that stdout doesn't get swallowed.
- tool.executive.call(rebaseline_command)
- except:
- traceback.print_exc(file=sys.stderr)
-
+ tool.executive.run_command(['git', 'pull'])
+ rebaseline_command = [tool.filesystem.join(tool.scm().checkout_root, 'Tools', 'Scripts', 'webkit-patch'), 'auto-rebaseline']
+ if options.verbose:
+ rebaseline_command.append('--verbose')
+ # Use call instead of run_command so that stdout doesn't get swallowed.
+ tool.executive.call(rebaseline_command)
time.sleep(self.SLEEP_TIME_IN_SECONDS)
diff --git a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py
index 6e981182780..9602cf0bee9 100644
--- a/chromium/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py
+++ b/chromium/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline_unittest.py
@@ -591,8 +591,7 @@ class TestAutoRebaseline(_BaseTestCase):
def setUp(self):
super(TestAutoRebaseline, self).setUp()
- self.command.latest_revision_processed_on_all_bots = lambda log_server: 9000
- self.command.bot_revision_data = lambda log_server: [{"builder": "Mock builder", "revision": "9000"}]
+ self.command.latest_revision_processed_on_all_bots = lambda: 9000
def test_tests_to_rebaseline(self):
def blame(path):
@@ -608,12 +607,11 @@ class TestAutoRebaseline(_BaseTestCase):
self.tool.scm().blame = blame
min_revision = 9000
- self.assertEqual(self.command.tests_to_rebaseline(self.tool, min_revision, print_revisions=False, log_server=None), (
+ self.assertEqual(self.command.tests_to_rebaseline(self.tool, min_revision, print_revisions=False), (
set(['path/to/rebaseline-without-bug-number.html', 'path/to/rebaseline-with-modifiers.html', 'path/to/rebaseline-without-modifiers.html']),
5678,
'foobarbaz1@chromium.org',
- set(['24182', '234']),
- True))
+ set(['24182', '234'])))
def test_tests_to_rebaseline_over_limit(self):
def blame(path):
@@ -628,12 +626,11 @@ class TestAutoRebaseline(_BaseTestCase):
expected_list_of_tests.append("path/to/rebaseline-%s.html" % i)
min_revision = 9000
- self.assertEqual(self.command.tests_to_rebaseline(self.tool, min_revision, print_revisions=False, log_server=None), (
+ self.assertEqual(self.command.tests_to_rebaseline(self.tool, min_revision, print_revisions=False), (
set(expected_list_of_tests),
5678,
'foobarbaz1@chromium.org',
- set(['24182']),
- True))
+ set(['24182'])))
def test_commit_message(self):
author = "foo@chromium.org"
@@ -664,7 +661,7 @@ TBR=foo@chromium.org
"""
self.tool.scm().blame = blame
- self.command.execute(MockOptions(optimize=True, verbose=False, move_overwritten_baselines=False, results_directory=False, log_server=None), [], self.tool)
+ self.command.execute(MockOptions(optimize=True, verbose=False, move_overwritten_baselines=False, results_directory=False), [], self.tool)
self.assertEqual(self.tool.executive.calls, [])
def test_execute(self):
@@ -741,13 +738,13 @@ crbug.com/24182 path/to/locally-changed-lined.html [ NeedsRebaseline ]
}
self.command.tree_status = lambda: 'closed'
- self.command.execute(MockOptions(optimize=True, verbose=False, move_overwritten_baselines=False, results_directory=False, log_server=None), [], self.tool)
+ self.command.execute(MockOptions(optimize=True, verbose=False, move_overwritten_baselines=False, results_directory=False), [], self.tool)
self.assertEqual(self.tool.executive.calls, [])
self.command.tree_status = lambda: 'open'
self.tool.executive.calls = []
- self.command.execute(MockOptions(optimize=True, verbose=False, move_overwritten_baselines=False, results_directory=False, log_server=None), [], self.tool)
+ self.command.execute(MockOptions(optimize=True, verbose=False, move_overwritten_baselines=False, results_directory=False), [], self.tool)
self.assertEqual(self.tool.executive.calls, [
[
['echo', 'copy-existing-baselines-internal', '--suffixes', 'txt,png', '--builder', 'MOCK Leopard', '--test', 'fast/dom/prototype-chocolate.html'],
@@ -829,7 +826,7 @@ Bug(foo) fast/dom/prototype-taco.html [ NeedsRebaseline ]
}
self.command.tree_status = lambda: 'open'
- self.command.execute(MockOptions(optimize=True, verbose=False, move_overwritten_baselines=False, results_directory=False, log_server=None), [], self.tool)
+ self.command.execute(MockOptions(optimize=True, verbose=False, move_overwritten_baselines=False, results_directory=False), [], self.tool)
self.assertEqual(self.tool.executive.calls, [
[
['echo', 'copy-existing-baselines-internal', '--suffixes', 'txt', '--builder', 'MOCK Leopard', '--test', 'fast/dom/prototype-taco.html'],
diff --git a/chromium/third_party/WebKit/WATCHLISTS b/chromium/third_party/WebKit/WATCHLISTS
index fc38a1e8cce..393c9556e9b 100644
--- a/chromium/third_party/WebKit/WATCHLISTS
+++ b/chromium/third_party/WebKit/WATCHLISTS
@@ -178,8 +178,7 @@
'rjwright@chromium.org',
'shans@chromium.org',
'steveblock@chromium.org',
- 'timloh@chromium.org',
- 'dino@apple.com'],
+ 'timloh@chromium.org'],
'devtools': [ 'pfeldman+blink@chromium.org',
'aandrey+blink@chromium.org',
'alph+blink@chromium.org',
diff --git a/chromium/third_party/WebKit/public/platform/WebCompositorSupport.h b/chromium/third_party/WebKit/public/platform/WebCompositorSupport.h
index 32a9e73f532..5f7d9b8d8fd 100644
--- a/chromium/third_party/WebKit/public/platform/WebCompositorSupport.h
+++ b/chromium/third_party/WebKit/public/platform/WebCompositorSupport.h
@@ -43,7 +43,6 @@ class WebFilterOperations;
class WebFloatAnimationCurve;
class WebGraphicsContext3D;
class WebImageLayer;
-class WebNinePatchLayer;
class WebLayer;
class WebScrollbar;
class WebScrollbarLayer;
@@ -71,8 +70,6 @@ public:
virtual WebImageLayer* createImageLayer() { return 0; }
- virtual WebNinePatchLayer* createNinePatchLayer() { return 0; }
-
virtual WebSolidColorLayer* createSolidColorLayer() { return 0; }
virtual WebScrollbarLayer* createScrollbarLayer(WebScrollbar*, WebScrollbarThemePainter, WebScrollbarThemeGeometry*) { return 0; }
diff --git a/chromium/third_party/WebKit/public/platform/WebFileSystem.h b/chromium/third_party/WebKit/public/platform/WebFileSystem.h
index 8dbea8c9e39..969359124c1 100644
--- a/chromium/third_party/WebKit/public/platform/WebFileSystem.h
+++ b/chromium/third_party/WebKit/public/platform/WebFileSystem.h
@@ -37,9 +37,6 @@
namespace WebKit {
-// FIXME: Delete this flag after we complete switching to the new code.
-#define USE_THREADLOCAL_WEBFILESYSTEM
-
// FIXME: Move these classes into platform.
class WebFileSystemCallbacks;
class WebFileWriter;
diff --git a/chromium/third_party/WebKit/public/platform/WebNinePatchLayer.h b/chromium/third_party/WebKit/public/platform/WebNinePatchLayer.h
deleted file mode 100644
index 1279db743cc..00000000000
--- a/chromium/third_party/WebKit/public/platform/WebNinePatchLayer.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef WebNinePatchLayer_h
-#define WebNinePatchLayer_h
-
-#include "WebCommon.h"
-#include "WebLayer.h"
-#include "WebRect.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-
-namespace WebKit {
-
-class WebNinePatchLayer {
-public:
- virtual ~WebNinePatchLayer() { }
-
- virtual WebLayer* layer() = 0;
- virtual void setBitmap(SkBitmap, const WebRect& aperture) = 0;
-};
-
-} // namespace WebKit
-
-#endif // WebNinePatchLayer_h
diff --git a/chromium/third_party/WebKit/public/web/WebFrame.h b/chromium/third_party/WebKit/public/web/WebFrame.h
index 211def68aed..68b7440a22d 100644
--- a/chromium/third_party/WebKit/public/web/WebFrame.h
+++ b/chromium/third_party/WebKit/public/web/WebFrame.h
@@ -456,8 +456,6 @@ public:
virtual void moveRangeSelection(const WebPoint& base, const WebPoint& extent) = 0;
virtual void moveCaretSelection(const WebPoint&) = 0;
- virtual void setCaretVisible(bool) = 0;
-
// Printing ------------------------------------------------------------
// Reformats the WebFrame for printing. WebPrintParams specifies the printable
diff --git a/chromium/third_party/WebKit/public/web/WebViewClient.h b/chromium/third_party/WebKit/public/web/WebViewClient.h
index 5014e3405c9..3aeab92416a 100644
--- a/chromium/third_party/WebKit/public/web/WebViewClient.h
+++ b/chromium/third_party/WebKit/public/web/WebViewClient.h
@@ -259,10 +259,6 @@ public:
// the given frame. Additional context data is supplied.
virtual void showContextMenu(WebFrame*, const WebContextMenuData&) { }
- // Called when the data attached to the currently displayed context menu is
- // invalidated. The context menu may be closed if possible.
- virtual void clearContextMenu() { }
-
// Called when a drag-n-drop operation should begin.
virtual void startDragging(WebFrame*, const WebDragData&, WebDragOperationsMask, const WebImage&, const WebPoint& dragImageOffset) { }
@@ -305,6 +301,9 @@ public:
virtual int historyBackListCount() { return 0; }
virtual int historyForwardListCount() { return 0; }
+ // Called to notify the embedder when a new history item is added.
+ virtual void didAddHistoryItem() { }
+
// Accessibility -------------------------------------------------------
diff --git a/chromium/third_party/angle_dx11/src/libEGL/libEGL.rc b/chromium/third_party/angle_dx11/src/libEGL/libEGL.rc
index 5d1f32f1c94..e2c472f3bb3 100644
--- a/chromium/third_party/angle_dx11/src/libEGL/libEGL.rc
+++ b/chromium/third_party/angle_dx11/src/libEGL/libEGL.rc
@@ -1,102 +1,102 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include <windows.h>
-#include "../common/version.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "#include ""afxres.h""\r\n"
- "#include ""../common/version.h""\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION MAJOR_VERSION,MINOR_VERSION,BUILD_VERSION,BUILD_REVISION
- PRODUCTVERSION MAJOR_VERSION,MINOR_VERSION,BUILD_VERSION,BUILD_REVISION
- FILEFLAGSMASK 0x17L
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x2L
- FILESUBTYPE 0x0L
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "040904b0"
- BEGIN
- VALUE "FileDescription", "ANGLE libEGL Dynamic Link Library"
- VALUE "FileVersion", VERSION_STRING
- VALUE "InternalName", "libEGL"
- VALUE "LegalCopyright", "Copyright (C) 2011 Google Inc."
- VALUE "OriginalFilename", "libEGL.dll"
- VALUE "PrivateBuild", VERSION_STRING
- VALUE "ProductName", "ANGLE libEGL Dynamic Link Library"
- VALUE "ProductVersion", VERSION_STRING
- END
- END
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 0x409, 1200
- END
-END
-
-#endif // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+#include "../common/version.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "#include ""../common/version.h""\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION MAJOR_VERSION,MINOR_VERSION,BUILD_VERSION,BUILD_REVISION
+ PRODUCTVERSION MAJOR_VERSION,MINOR_VERSION,BUILD_VERSION,BUILD_REVISION
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "FileDescription", "ANGLE libEGL Dynamic Link Library"
+ VALUE "FileVersion", VERSION_STRING
+ VALUE "InternalName", "libEGL"
+ VALUE "LegalCopyright", "Copyright (C) 2011 Google Inc."
+ VALUE "OriginalFilename", "libEGL.dll"
+ VALUE "PrivateBuild", VERSION_STRING
+ VALUE "ProductName", "ANGLE libEGL Dynamic Link Library"
+ VALUE "ProductVersion", VERSION_STRING
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
diff --git a/chromium/third_party/angle_dx11/src/libGLESv2/libGLESv2.rc b/chromium/third_party/angle_dx11/src/libGLESv2/libGLESv2.rc
index 0ad21e440e7..f1b01b9b795 100644
--- a/chromium/third_party/angle_dx11/src/libGLESv2/libGLESv2.rc
+++ b/chromium/third_party/angle_dx11/src/libGLESv2/libGLESv2.rc
@@ -1,102 +1,102 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include <windows.h>
-#include "../common/version.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "#include ""afxres.h""\r\n"
- "#include ""../common/version.h""\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION MAJOR_VERSION,MINOR_VERSION,BUILD_VERSION,BUILD_REVISION
- PRODUCTVERSION MAJOR_VERSION,MINOR_VERSION,BUILD_VERSION,BUILD_REVISION
- FILEFLAGSMASK 0x17L
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x2L
- FILESUBTYPE 0x0L
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "040904b0"
- BEGIN
- VALUE "FileDescription", "ANGLE libGLESv2 Dynamic Link Library"
- VALUE "FileVersion", VERSION_STRING
- VALUE "InternalName", "libGLESv2"
- VALUE "LegalCopyright", "Copyright (C) 2011 Google Inc."
- VALUE "OriginalFilename", "libGLESv2.dll"
- VALUE "PrivateBuild", VERSION_STRING
- VALUE "ProductName", "ANGLE libGLESv2 Dynamic Link Library"
- VALUE "ProductVersion", VERSION_STRING
- END
- END
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 0x409, 1200
- END
-END
-
-#endif // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+#include "../common/version.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "#include ""../common/version.h""\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION MAJOR_VERSION,MINOR_VERSION,BUILD_VERSION,BUILD_REVISION
+ PRODUCTVERSION MAJOR_VERSION,MINOR_VERSION,BUILD_VERSION,BUILD_REVISION
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "FileDescription", "ANGLE libGLESv2 Dynamic Link Library"
+ VALUE "FileVersion", VERSION_STRING
+ VALUE "InternalName", "libGLESv2"
+ VALUE "LegalCopyright", "Copyright (C) 2011 Google Inc."
+ VALUE "OriginalFilename", "libGLESv2.dll"
+ VALUE "PrivateBuild", VERSION_STRING
+ VALUE "ProductName", "ANGLE libGLESv2 Dynamic Link Library"
+ VALUE "ProductVersion", VERSION_STRING
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
diff --git a/chromium/third_party/cacheinvalidation/cacheinvalidation.gyp b/chromium/third_party/cacheinvalidation/cacheinvalidation.gyp
index bd8586fb3cb..8566506a96c 100644
--- a/chromium/third_party/cacheinvalidation/cacheinvalidation.gyp
+++ b/chromium/third_party/cacheinvalidation/cacheinvalidation.gyp
@@ -89,7 +89,6 @@
'src/google/cacheinvalidation/impl/recurring-task.h',
'src/google/cacheinvalidation/impl/registration-manager.cc',
'src/google/cacheinvalidation/impl/registration-manager.h',
- 'src/google/cacheinvalidation/impl/repeated-field-namespace-fix.h',
'src/google/cacheinvalidation/impl/run-state.h',
'src/google/cacheinvalidation/impl/safe-storage.cc',
'src/google/cacheinvalidation/impl/safe-storage.h',
diff --git a/chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/build_constants.h b/chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/build_constants.h
index f2adec1cf45..f4c44c69d3b 100644
--- a/chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/build_constants.h
+++ b/chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/build_constants.h
@@ -17,6 +17,6 @@
#ifndef INVALIDATION_BUILD_CONSTANTS_H_
#define INVALIDATION_BUILD_CONSTANTS_H_
namespace invalidation {
-const int BUILD_DATESTAMP = 20130807;
+const int BUILD_DATESTAMP = 20130604;
} // namespace invalidation
#endif // INVALIDATION_BUILD_CONSTANTS_H_
diff --git a/chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/client-protocol-namespace-fix.h b/chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/client-protocol-namespace-fix.h
index 9366a392313..b8a714f5ccf 100644
--- a/chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/client-protocol-namespace-fix.h
+++ b/chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/client-protocol-namespace-fix.h
@@ -20,10 +20,12 @@
#include "google/cacheinvalidation/client.pb.h"
#include "google/cacheinvalidation/client_protocol.pb.h"
#include "google/cacheinvalidation/types.pb.h"
-#include "google/cacheinvalidation/impl/repeated-field-namespace-fix.h"
namespace invalidation {
+using ::google::protobuf::RepeatedField;
+using ::google::protobuf::RepeatedPtrField;
+
// Client
using ::ipc::invalidation::PersistentStateBlob;
using ::ipc::invalidation::PersistentTiclState;
diff --git a/chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/repeated-field-namespace-fix.h b/chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/repeated-field-namespace-fix.h
deleted file mode 100644
index 94ba25ad5d5..00000000000
--- a/chromium/third_party/cacheinvalidation/src/google/cacheinvalidation/impl/repeated-field-namespace-fix.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2013 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//
-// Brings RepeatedField classes into invalidation namespace.
-
-#ifndef GOOGLE_CACHEINVALIDATION_IMPL_REPEATED_FIELD_NAMESPACE_FIX_H_
-#define GOOGLE_CACHEINVALIDATION_IMPL_REPEATED_FIELD_NAMESPACE_FIX_H_
-
-#include "google/protobuf/repeated_field.h"
-
-namespace invalidation {
-
-using ::google::protobuf::RepeatedField;
-using ::google::protobuf::RepeatedPtrField;
-
-} // namespace invalidation
-
-#endif // GOOGLE_CACHEINVALIDATION_IMPL_REPEATED_FIELD_NAMESPACE_FIX_H_
diff --git a/chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/common/BuildConstants.java b/chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/common/BuildConstants.java
index 8e65cf3942c..c206a510471 100644
--- a/chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/common/BuildConstants.java
+++ b/chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/common/BuildConstants.java
@@ -33,5 +33,5 @@ package com.google.ipc.invalidation.common;
/** Build constant definitions. */
class BuildConstants {
- static final int BUILD_DATESTAMP = 20130807;
+ static final int BUILD_DATESTAMP = 20130604;
}
diff --git a/chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/InvalidationClientTestHelper.java b/chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/InvalidationClientTestHelper.java
new file mode 100644
index 00000000000..c8b4c114014
--- /dev/null
+++ b/chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/external/client/InvalidationClientTestHelper.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.ipc.invalidation.external.client;
+
+import com.google.ipc.invalidation.ticl.InvalidationClientCore;
+import com.google.ipc.invalidation.ticl.InvalidationClientImpl;
+import com.google.protos.ipc.invalidation.ClientProtocol.ClientConfigP;
+
+import java.util.Random;
+
+/**
+ * Helper utility functions for testing with the invalidation client.
+ *
+ *
+ */
+public class InvalidationClientTestHelper {
+
+ /**
+ * Constructs an invalidation client library instance with parameters set for unit tests.
+ *
+ * @param clientType client type code as assigned by the notification system's backend
+ * @param clientName id/name of the client in the application's own naming scheme
+ * @param applicationName name of the application using the library (for debugging/monitoring)
+ * @param listener callback object for invalidation events
+ */
+ public static InvalidationClient createForTest(SystemResources resources,
+ int clientType, byte[] clientName, String applicationName, InvalidationListener listener) {
+ ClientConfigP config = InvalidationClientCore.createConfigForTest().build();
+ Random random = new Random(resources.getInternalScheduler().getCurrentTimeMs());
+ return new InvalidationClientImpl(resources, random, clientType, clientName, config,
+ applicationName, listener);
+ }
+}
diff --git a/chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/AndroidTiclManifest.java b/chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/AndroidTiclManifest.java
index acea0e87dfe..09d69ca5ae9 100644
--- a/chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/AndroidTiclManifest.java
+++ b/chromium/third_party/cacheinvalidation/src/java/com/google/ipc/invalidation/ticl/android2/AndroidTiclManifest.java
@@ -33,107 +33,67 @@ import java.util.Map;
*
*/
public class AndroidTiclManifest {
+ /**
+ * Name of the {@code <application>} metadata element whose value gives the Java class that
+ * implements the application {@code InvalidationListener}. Must be set if
+ * {@link #LISTENER_SERVICE_NAME_KEY} is not set.
+ */
+ private static final String LISTENER_NAME_KEY = "ipc.invalidation.ticl.listener_class";
+
+ /**
+ * Name of the {@code <application>} metadata element whose value gives the Java class that
+ * implements the Ticl service. Should only be set in tests.
+ */
+ private static final String TICL_SERVICE_NAME_KEY = "ipc.invalidation.ticl.service_class";
/**
- * Cache of {@link ApplicationMetadata} to avoid repeatedly scanning manifest. The key is the
- * package name for the context.
+ * Name of the {@code <application>} metadata element whose value gives the Java class that
+ * implements the application's invalidation listener intent service.
*/
- private static final Map<String, ApplicationMetadata> applicationMetadataCache =
- new HashMap<String, ApplicationMetadata>();
+ private static final String LISTENER_SERVICE_NAME_KEY =
+ "ipc.invalidation.ticl.listener_service_class";
+
+ /** Default values returned if not overriden by the manifest file. */
+ private static final Map<String, String> DEFAULTS = new HashMap<String, String>();
+ static {
+ DEFAULTS.put(TICL_SERVICE_NAME_KEY,
+ "com.google.ipc.invalidation.ticl.android2.TiclService");
+ DEFAULTS.put(LISTENER_NAME_KEY, "");
+ DEFAULTS.put(LISTENER_SERVICE_NAME_KEY,
+ "com.google.ipc.invalidation.ticl.android2.AndroidInvalidationListenerStub");
+ }
- /** Application metadata from the Android manifest. */
- private final ApplicationMetadata metadata;
+ private final Context context;
public AndroidTiclManifest(Context context) {
- metadata = createApplicationMetadata(Preconditions.checkNotNull(context));
+ this.context = Preconditions.checkNotNull(context);
}
/** Returns the name of the class implementing the Ticl service. */
public String getTiclServiceClass() {
- return metadata.ticlServiceClass;
+ return Preconditions.checkNotNull(readApplicationMetadata(TICL_SERVICE_NAME_KEY));
}
/** Returns the name of the class on which listener events will be invoked. */
String getListenerClass() {
- return metadata.listenerClass;
+ return Preconditions.checkNotNull(readApplicationMetadata(LISTENER_NAME_KEY));
}
/** Returns the name of the class implementing the invalidation listener intent service. */
public String getListenerServiceClass() {
- return metadata.listenerServiceClass;
+ return Preconditions.checkNotNull(readApplicationMetadata(LISTENER_SERVICE_NAME_KEY));
}
/**
- * If it has not already been cached for the given {@code context}, creates and caches application
- * metadata from the manifest.
+ * Returns the metadata-provided value for {@code key} in {@code AndroidManifest.xml} if one
+ * exists, or the value from {@link #DEFAULTS} if one does not.
*/
- private static ApplicationMetadata createApplicationMetadata(Context context) {
- synchronized (applicationMetadataCache) {
- String packageName = context.getPackageName();
- ApplicationMetadata metadata = applicationMetadataCache.get(packageName);
- if (metadata == null) {
- metadata = new ApplicationMetadata(context);
- applicationMetadataCache.put(packageName, metadata);
- }
- return metadata;
- }
- }
-
- /** Application metadata for a specific context. */
- private static final class ApplicationMetadata {
- /**
- * Name of the {@code <application>} metadata element whose value gives the Java class that
- * implements the application {@code InvalidationListener}. Must be set if
- * {@link #LISTENER_SERVICE_NAME_KEY} is not set.
- */
- private static final String LISTENER_NAME_KEY = "ipc.invalidation.ticl.listener_class";
-
- /**
- * Name of the {@code <application>} metadata element whose value gives the Java class that
- * implements the Ticl service. Should only be set in tests.
- */
- private static final String TICL_SERVICE_NAME_KEY = "ipc.invalidation.ticl.service_class";
-
- /**
- * Name of the {@code <application>} metadata element whose value gives the Java class that
- * implements the application's invalidation listener intent service.
- */
- private static final String LISTENER_SERVICE_NAME_KEY =
- "ipc.invalidation.ticl.listener_service_class";
-
- /** Default values returned if not overriden by the manifest file. */
- private static final Map<String, String> DEFAULTS = new HashMap<String, String>();
- static {
- DEFAULTS.put(TICL_SERVICE_NAME_KEY,
- "com.google.ipc.invalidation.ticl.android2.TiclService");
- DEFAULTS.put(LISTENER_NAME_KEY, "");
- DEFAULTS.put(LISTENER_SERVICE_NAME_KEY,
- "com.google.ipc.invalidation.ticl.android2.AndroidInvalidationListenerStub");
- }
-
- private final String ticlServiceClass;
- private final String listenerClass;
- private final String listenerServiceClass;
-
- ApplicationMetadata(Context context) {
- ApplicationInfo appInfo;
- try {
- // Read metadata from manifest.xml
- appInfo = context.getPackageManager()
- .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
- } catch (NameNotFoundException exception) {
- throw new RuntimeException("Cannot read own application info", exception);
- }
- ticlServiceClass = readApplicationMetadata(appInfo, TICL_SERVICE_NAME_KEY);
- listenerClass = readApplicationMetadata(appInfo, LISTENER_NAME_KEY);
- listenerServiceClass = readApplicationMetadata(appInfo, LISTENER_SERVICE_NAME_KEY);
- }
-
- /**
- * Returns the metadata-provided value for {@code key} in {@code appInfo} if one
- * exists, or the value from {@link #DEFAULTS} if one does not.
- */
- private static String readApplicationMetadata(ApplicationInfo appInfo, String key) {
+ private String readApplicationMetadata(String key) {
+ ApplicationInfo appInfo;
+ try {
+ // Read the manifest-provided value.
+ appInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(),
+ PackageManager.GET_META_DATA);
String value = null;
if (appInfo.metaData != null) {
value = appInfo.metaData.getString(key);
@@ -141,6 +101,8 @@ public class AndroidTiclManifest {
// Return the manifest value if present or the default value if not.
return (value != null) ?
value : Preconditions.checkNotNull(DEFAULTS.get(key), "No default value for %s", key);
+ } catch (NameNotFoundException exception) {
+ throw new RuntimeException("Cannot read own application info", exception);
}
}
}
diff --git a/chromium/third_party/cros_system_api/dbus/service_constants.h b/chromium/third_party/cros_system_api/dbus/service_constants.h
index dca711c4cb5..562262665e9 100644
--- a/chromium/third_party/cros_system_api/dbus/service_constants.h
+++ b/chromium/third_party/cros_system_api/dbus/service_constants.h
@@ -94,8 +94,6 @@ const char kCryptohomeAsyncTpmAttestationCreateEnrollRequest[] =
const char kCryptohomeAsyncTpmAttestationEnroll[] = "AsyncTpmAttestationEnroll";
const char kCryptohomeAsyncTpmAttestationCreateCertRequest[] =
"AsyncTpmAttestationCreateCertRequest";
-const char kCryptohomeAsyncTpmAttestationCreateCertRequestByProfile[] =
- "AsyncTpmAttestationCreateCertRequestByProfile";
const char kCryptohomeAsyncTpmAttestationFinishCertRequest[] =
"AsyncTpmAttestationFinishCertRequest";
const char kCryptohomeTpmAttestationDoesKeyExist[] =
@@ -1234,7 +1232,9 @@ const char kUpdateEngineServiceName[] = "org.chromium.UpdateEngine";
// Methods.
const char kAttemptUpdate[] = "AttemptUpdate";
const char kGetStatus[] = "GetStatus";
+const char kGetTrack[] = "GetTrack";
const char kRebootIfNeeded[] = "RebootIfNeeded";
+const char kSetTrack[] = "SetTrack";
const char kSetChannel[] = "SetChannel";
const char kGetChannel[] = "GetChannel";
diff --git a/chromium/third_party/cros_system_api/system_api.gyp b/chromium/third_party/cros_system_api/system_api.gyp
index c74c42d65e0..f4cc3523dbd 100644
--- a/chromium/third_party/cros_system_api/system_api.gyp
+++ b/chromium/third_party/cros_system_api/system_api.gyp
@@ -2,10 +2,10 @@
'targets': [
{
'target_name': 'system_api-protos',
- 'type': 'static_library',
+ 'type': 'none',
'variables': {
'proto_in_dir': 'dbus',
- 'proto_out_dir': 'include/system_api/proto_bindings',
+ 'proto_out_dir': 'include/chromeos/dbus',
},
'cflags': [
'-fvisibility=hidden',
@@ -13,16 +13,16 @@
'sources': [
'<(proto_in_dir)/mtp_storage_info.proto',
'<(proto_in_dir)/mtp_file_entry.proto',
- '<(proto_in_dir)/field_trial_list.proto',
+ '<(proto_in_dir)/video_activity_update.proto',
],
'includes': ['../common-mk/protoc.gypi'],
},
{
'target_name': 'system_api-power_manager-protos',
- 'type': 'static_library',
+ 'type': 'none',
'variables': {
'proto_in_dir': 'dbus/power_manager',
- 'proto_out_dir': 'include/power_manager/proto_bindings',
+ 'proto_out_dir': 'include/chromeos/dbus/power_manager',
},
'cflags': [
'-fvisibility=hidden',
@@ -30,7 +30,6 @@
'sources': [
'<(proto_in_dir)/suspend.proto',
'<(proto_in_dir)/input_event.proto',
- '<(proto_in_dir)/peripheral_battery_status.proto',
'<(proto_in_dir)/policy.proto',
'<(proto_in_dir)/power_supply_properties.proto',
],
diff --git a/chromium/third_party/flot/LICENSE.txt b/chromium/third_party/flot/LICENSE.txt
index 67f46256079..07d5b2094d1 100644
--- a/chromium/third_party/flot/LICENSE.txt
+++ b/chromium/third_party/flot/LICENSE.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2007-2013 IOLA and Ole Laursen
+Copyright (c) 2007-2009 IOLA and Ole Laursen
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
diff --git a/chromium/third_party/flot/README.chromium b/chromium/third_party/flot/README.chromium
index ff39b4b076a..acee5bcf46d 100644
--- a/chromium/third_party/flot/README.chromium
+++ b/chromium/third_party/flot/README.chromium
@@ -1,9 +1,9 @@
Name: Flot Javascript/JQuery library for creating graphs
Short Name: Flot
URL: code.google.com/p/flot and http://drupal.org/project/flot
-Version: 0.8.1
+Version: 0.7
License: MIT
License File: LICENSE.txt
Security Critical: yes
-Description: Flot is used in the webui for performance monitor and the visualizer for Deep Memory Profiler to draw charts of performance metrics.
+Description: Flot is used in the webui for performance monitor to draw charts of performance metrics.
Local Modifications: none
diff --git a/chromium/third_party/flot/excanvas.min.js b/chromium/third_party/flot/excanvas.min.js
deleted file mode 100644
index fcf876c749e..00000000000
--- a/chromium/third_party/flot/excanvas.min.js
+++ /dev/null
@@ -1 +0,0 @@
-if(!document.createElement("canvas").getContext){(function(){var ab=Math;var n=ab.round;var l=ab.sin;var A=ab.cos;var H=ab.abs;var N=ab.sqrt;var d=10;var f=d/2;var z=+navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];function y(){return this.context_||(this.context_=new D(this))}var t=Array.prototype.slice;function g(j,m,p){var i=t.call(arguments,2);return function(){return j.apply(m,i.concat(t.call(arguments)))}}function af(i){return String(i).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function Y(m,j,i){if(!m.namespaces[j]){m.namespaces.add(j,i,"#default#VML")}}function R(j){Y(j,"g_vml_","urn:schemas-microsoft-com:vml");Y(j,"g_o_","urn:schemas-microsoft-com:office:office");if(!j.styleSheets.ex_canvas_){var i=j.createStyleSheet();i.owningElement.id="ex_canvas_";i.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}R(document);var e={init:function(i){var j=i||document;j.createElement("canvas");j.attachEvent("onreadystatechange",g(this.init_,this,j))},init_:function(p){var m=p.getElementsByTagName("canvas");for(var j=0;j<m.length;j++){this.initElement(m[j])}},initElement:function(j){if(!j.getContext){j.getContext=y;R(j.ownerDocument);j.innerHTML="";j.attachEvent("onpropertychange",x);j.attachEvent("onresize",W);var i=j.attributes;if(i.width&&i.width.specified){j.style.width=i.width.nodeValue+"px"}else{j.width=j.clientWidth}if(i.height&&i.height.specified){j.style.height=i.height.nodeValue+"px"}else{j.height=j.clientHeight}}return j}};function x(j){var i=j.srcElement;switch(j.propertyName){case"width":i.getContext().clearRect();i.style.width=i.attributes.width.nodeValue+"px";i.firstChild.style.width=i.clientWidth+"px";break;case"height":i.getContext().clearRect();i.style.height=i.attributes.height.nodeValue+"px";i.firstChild.style.height=i.clientHeight+"px";break}}function W(j){var i=j.srcElement;if(i.firstChild){i.firstChild.style.width=i.clientWidth+"px";i.firstChild.style.height=i.clientHeight+"px"}}e.init();var k=[];for(var ae=0;ae<16;ae++){for(var ad=0;ad<16;ad++){k[ae*16+ad]=ae.toString(16)+ad.toString(16)}}function B(){return[[1,0,0],[0,1,0],[0,0,1]]}function J(p,m){var j=B();for(var i=0;i<3;i++){for(var ah=0;ah<3;ah++){var Z=0;for(var ag=0;ag<3;ag++){Z+=p[i][ag]*m[ag][ah]}j[i][ah]=Z}}return j}function v(j,i){i.fillStyle=j.fillStyle;i.lineCap=j.lineCap;i.lineJoin=j.lineJoin;i.lineWidth=j.lineWidth;i.miterLimit=j.miterLimit;i.shadowBlur=j.shadowBlur;i.shadowColor=j.shadowColor;i.shadowOffsetX=j.shadowOffsetX;i.shadowOffsetY=j.shadowOffsetY;i.strokeStyle=j.strokeStyle;i.globalAlpha=j.globalAlpha;i.font=j.font;i.textAlign=j.textAlign;i.textBaseline=j.textBaseline;i.arcScaleX_=j.arcScaleX_;i.arcScaleY_=j.arcScaleY_;i.lineScale_=j.lineScale_}var b={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function M(j){var p=j.indexOf("(",3);var i=j.indexOf(")",p+1);var m=j.substring(p+1,i).split(",");if(m.length!=4||j.charAt(3)!="a"){m[3]=1}return m}function c(i){return parseFloat(i)/100}function r(j,m,i){return Math.min(i,Math.max(m,j))}function I(ag){var i,ai,aj,ah,ak,Z;ah=parseFloat(ag[0])/360%360;if(ah<0){ah++}ak=r(c(ag[1]),0,1);Z=r(c(ag[2]),0,1);if(ak==0){i=ai=aj=Z}else{var j=Z<0.5?Z*(1+ak):Z+ak-Z*ak;var m=2*Z-j;i=a(m,j,ah+1/3);ai=a(m,j,ah);aj=a(m,j,ah-1/3)}return"#"+k[Math.floor(i*255)]+k[Math.floor(ai*255)]+k[Math.floor(aj*255)]}function a(j,i,m){if(m<0){m++}if(m>1){m--}if(6*m<1){return j+(i-j)*6*m}else{if(2*m<1){return i}else{if(3*m<2){return j+(i-j)*(2/3-m)*6}else{return j}}}}var C={};function F(j){if(j in C){return C[j]}var ag,Z=1;j=String(j);if(j.charAt(0)=="#"){ag=j}else{if(/^rgb/.test(j)){var p=M(j);var ag="#",ah;for(var m=0;m<3;m++){if(p[m].indexOf("%")!=-1){ah=Math.floor(c(p[m])*255)}else{ah=+p[m]}ag+=k[r(ah,0,255)]}Z=+p[3]}else{if(/^hsl/.test(j)){var p=M(j);ag=I(p);Z=p[3]}else{ag=b[j]||j}}}return C[j]={color:ag,alpha:Z}}var o={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var L={};function E(i){if(L[i]){return L[i]}var p=document.createElement("div");var m=p.style;try{m.font=i}catch(j){}return L[i]={style:m.fontStyle||o.style,variant:m.fontVariant||o.variant,weight:m.fontWeight||o.weight,size:m.fontSize||o.size,family:m.fontFamily||o.family}}function u(m,j){var i={};for(var ah in m){i[ah]=m[ah]}var ag=parseFloat(j.currentStyle.fontSize),Z=parseFloat(m.size);if(typeof m.size=="number"){i.size=m.size}else{if(m.size.indexOf("px")!=-1){i.size=Z}else{if(m.size.indexOf("em")!=-1){i.size=ag*Z}else{if(m.size.indexOf("%")!=-1){i.size=(ag/100)*Z}else{if(m.size.indexOf("pt")!=-1){i.size=Z/0.75}else{i.size=ag}}}}}i.size*=0.981;return i}function ac(i){return i.style+" "+i.variant+" "+i.weight+" "+i.size+"px "+i.family}var s={butt:"flat",round:"round"};function S(i){return s[i]||"square"}function D(i){this.m_=B();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=d*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var m="width:"+i.clientWidth+"px;height:"+i.clientHeight+"px;overflow:hidden;position:absolute";var j=i.ownerDocument.createElement("div");j.style.cssText=m;i.appendChild(j);var p=j.cloneNode(false);p.style.backgroundColor="red";p.style.filter="alpha(opacity=0)";i.appendChild(p);this.element_=j;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var q=D.prototype;q.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};q.beginPath=function(){this.currentPath_=[]};q.moveTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"moveTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.lineTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"lineTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.bezierCurveTo=function(m,j,ak,aj,ai,ag){var i=V(this,ai,ag);var ah=V(this,m,j);var Z=V(this,ak,aj);K(this,ah,Z,i)};function K(i,Z,m,j){i.currentPath_.push({type:"bezierCurveTo",cp1x:Z.x,cp1y:Z.y,cp2x:m.x,cp2y:m.y,x:j.x,y:j.y});i.currentX_=j.x;i.currentY_=j.y}q.quadraticCurveTo=function(ai,m,j,i){var ah=V(this,ai,m);var ag=V(this,j,i);var aj={x:this.currentX_+2/3*(ah.x-this.currentX_),y:this.currentY_+2/3*(ah.y-this.currentY_)};var Z={x:aj.x+(ag.x-this.currentX_)/3,y:aj.y+(ag.y-this.currentY_)/3};K(this,aj,Z,ag)};q.arc=function(al,aj,ak,ag,j,m){ak*=d;var ap=m?"at":"wa";var am=al+A(ag)*ak-f;var ao=aj+l(ag)*ak-f;var i=al+A(j)*ak-f;var an=aj+l(j)*ak-f;if(am==i&&!m){am+=0.125}var Z=V(this,al,aj);var ai=V(this,am,ao);var ah=V(this,i,an);this.currentPath_.push({type:ap,x:Z.x,y:Z.y,radius:ak,xStart:ai.x,yStart:ai.y,xEnd:ah.x,yEnd:ah.y})};q.rect=function(m,j,i,p){this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath()};q.strokeRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.stroke();this.currentPath_=Z};q.fillRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.fill();this.currentPath_=Z};q.createLinearGradient=function(j,p,i,m){var Z=new U("gradient");Z.x0_=j;Z.y0_=p;Z.x1_=i;Z.y1_=m;return Z};q.createRadialGradient=function(p,ag,m,j,Z,i){var ah=new U("gradientradial");ah.x0_=p;ah.y0_=ag;ah.r0_=m;ah.x1_=j;ah.y1_=Z;ah.r1_=i;return ah};q.drawImage=function(aq,m){var aj,ah,al,ay,ao,am,at,aA;var ak=aq.runtimeStyle.width;var ap=aq.runtimeStyle.height;aq.runtimeStyle.width="auto";aq.runtimeStyle.height="auto";var ai=aq.width;var aw=aq.height;aq.runtimeStyle.width=ak;aq.runtimeStyle.height=ap;if(arguments.length==3){aj=arguments[1];ah=arguments[2];ao=am=0;at=al=ai;aA=ay=aw}else{if(arguments.length==5){aj=arguments[1];ah=arguments[2];al=arguments[3];ay=arguments[4];ao=am=0;at=ai;aA=aw}else{if(arguments.length==9){ao=arguments[1];am=arguments[2];at=arguments[3];aA=arguments[4];aj=arguments[5];ah=arguments[6];al=arguments[7];ay=arguments[8]}else{throw Error("Invalid number of arguments")}}}var az=V(this,aj,ah);var p=at/2;var j=aA/2;var ax=[];var i=10;var ag=10;ax.push(" <g_vml_:group",' coordsize="',d*i,",",d*ag,'"',' coordorigin="0,0"',' style="width:',i,"px;height:",ag,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var Z=[];Z.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",n(az.x/d),",","Dy=",n(az.y/d),"");var av=az;var au=V(this,aj+al,ah);var ar=V(this,aj,ah+ay);var an=V(this,aj+al,ah+ay);av.x=ab.max(av.x,au.x,ar.x,an.x);av.y=ab.max(av.y,au.y,ar.y,an.y);ax.push("padding:0 ",n(av.x/d),"px ",n(av.y/d),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",Z.join(""),", sizingmethod='clip');")}else{ax.push("top:",n(az.y/d),"px;left:",n(az.x/d),"px;")}ax.push(' ">','<g_vml_:image src="',aq.src,'"',' style="width:',d*al,"px;"," height:",d*ay,'px"',' cropleft="',ao/ai,'"',' croptop="',am/aw,'"',' cropright="',(ai-ao-at)/ai,'"',' cropbottom="',(aw-am-aA)/aw,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",ax.join(""))};q.stroke=function(ao){var Z=10;var ap=10;var ag=5000;var ai={x:null,y:null};var an={x:null,y:null};for(var aj=0;aj<this.currentPath_.length;aj+=ag){var am=[];var ah=false;am.push("<g_vml_:shape",' filled="',!!ao,'"',' style="position:absolute;width:',Z,"px;height:",ap,'px;"',' coordorigin="0,0"',' coordsize="',d*Z,",",d*ap,'"',' stroked="',!ao,'"',' path="');var aq=false;for(var ak=aj;ak<Math.min(aj+ag,this.currentPath_.length);ak++){if(ak%ag==0&&ak>0){am.push(" m ",n(this.currentPath_[ak-1].x),",",n(this.currentPath_[ak-1].y))}var m=this.currentPath_[ak];var al;switch(m.type){case"moveTo":al=m;am.push(" m ",n(m.x),",",n(m.y));break;case"lineTo":am.push(" l ",n(m.x),",",n(m.y));break;case"close":am.push(" x ");m=null;break;case"bezierCurveTo":am.push(" c ",n(m.cp1x),",",n(m.cp1y),",",n(m.cp2x),",",n(m.cp2y),",",n(m.x),",",n(m.y));break;case"at":case"wa":am.push(" ",m.type," ",n(m.x-this.arcScaleX_*m.radius),",",n(m.y-this.arcScaleY_*m.radius)," ",n(m.x+this.arcScaleX_*m.radius),",",n(m.y+this.arcScaleY_*m.radius)," ",n(m.xStart),",",n(m.yStart)," ",n(m.xEnd),",",n(m.yEnd));break}if(m){if(ai.x==null||m.x<ai.x){ai.x=m.x}if(an.x==null||m.x>an.x){an.x=m.x}if(ai.y==null||m.y<ai.y){ai.y=m.y}if(an.y==null||m.y>an.y){an.y=m.y}}}am.push(' ">');if(!ao){w(this,am)}else{G(this,am,ai,an)}am.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",am.join(""))}};function w(m,ag){var j=F(m.strokeStyle);var p=j.color;var Z=j.alpha*m.globalAlpha;var i=m.lineScale_*m.lineWidth;if(i<1){Z*=i}ag.push("<g_vml_:stroke",' opacity="',Z,'"',' joinstyle="',m.lineJoin,'"',' miterlimit="',m.miterLimit,'"',' endcap="',S(m.lineCap),'"',' weight="',i,'px"',' color="',p,'" />')}function G(aq,ai,aK,ar){var aj=aq.fillStyle;var aB=aq.arcScaleX_;var aA=aq.arcScaleY_;var j=ar.x-aK.x;var p=ar.y-aK.y;if(aj instanceof U){var an=0;var aF={x:0,y:0};var ax=0;var am=1;if(aj.type_=="gradient"){var al=aj.x0_/aB;var m=aj.y0_/aA;var ak=aj.x1_/aB;var aM=aj.y1_/aA;var aJ=V(aq,al,m);var aI=V(aq,ak,aM);var ag=aI.x-aJ.x;var Z=aI.y-aJ.y;an=Math.atan2(ag,Z)*180/Math.PI;if(an<0){an+=360}if(an<0.000001){an=0}}else{var aJ=V(aq,aj.x0_,aj.y0_);aF={x:(aJ.x-aK.x)/j,y:(aJ.y-aK.y)/p};j/=aB*d;p/=aA*d;var aD=ab.max(j,p);ax=2*aj.r0_/aD;am=2*aj.r1_/aD-ax}var av=aj.colors_;av.sort(function(aN,i){return aN.offset-i.offset});var ap=av.length;var au=av[0].color;var at=av[ap-1].color;var az=av[0].alpha*aq.globalAlpha;var ay=av[ap-1].alpha*aq.globalAlpha;var aE=[];for(var aH=0;aH<ap;aH++){var ao=av[aH];aE.push(ao.offset*am+ax+" "+ao.color)}ai.push('<g_vml_:fill type="',aj.type_,'"',' method="none" focus="100%"',' color="',au,'"',' color2="',at,'"',' colors="',aE.join(","),'"',' opacity="',ay,'"',' g_o_:opacity2="',az,'"',' angle="',an,'"',' focusposition="',aF.x,",",aF.y,'" />')}else{if(aj instanceof T){if(j&&p){var ah=-aK.x;var aC=-aK.y;ai.push("<g_vml_:fill",' position="',ah/j*aB*aB,",",aC/p*aA*aA,'"',' type="tile"',' src="',aj.src_,'" />')}}else{var aL=F(aq.fillStyle);var aw=aL.color;var aG=aL.alpha*aq.globalAlpha;ai.push('<g_vml_:fill color="',aw,'" opacity="',aG,'" />')}}}q.fill=function(){this.stroke(true)};q.closePath=function(){this.currentPath_.push({type:"close"})};function V(j,Z,p){var i=j.m_;return{x:d*(Z*i[0][0]+p*i[1][0]+i[2][0])-f,y:d*(Z*i[0][1]+p*i[1][1]+i[2][1])-f}}q.save=function(){var i={};v(this,i);this.aStack_.push(i);this.mStack_.push(this.m_);this.m_=J(B(),this.m_)};q.restore=function(){if(this.aStack_.length){v(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function h(i){return isFinite(i[0][0])&&isFinite(i[0][1])&&isFinite(i[1][0])&&isFinite(i[1][1])&&isFinite(i[2][0])&&isFinite(i[2][1])}function aa(j,i,p){if(!h(i)){return}j.m_=i;if(p){var Z=i[0][0]*i[1][1]-i[0][1]*i[1][0];j.lineScale_=N(H(Z))}}q.translate=function(m,j){var i=[[1,0,0],[0,1,0],[m,j,1]];aa(this,J(i,this.m_),false)};q.rotate=function(j){var p=A(j);var m=l(j);var i=[[p,m,0],[-m,p,0],[0,0,1]];aa(this,J(i,this.m_),false)};q.scale=function(m,j){this.arcScaleX_*=m;this.arcScaleY_*=j;var i=[[m,0,0],[0,j,0],[0,0,1]];aa(this,J(i,this.m_),true)};q.transform=function(Z,p,ah,ag,j,i){var m=[[Z,p,0],[ah,ag,0],[j,i,1]];aa(this,J(m,this.m_),true)};q.setTransform=function(ag,Z,ai,ah,p,j){var i=[[ag,Z,0],[ai,ah,0],[p,j,1]];aa(this,i,true)};q.drawText_=function(am,ak,aj,ap,ai){var ao=this.m_,at=1000,j=0,ar=at,ah={x:0,y:0},ag=[];var i=u(E(this.font),this.element_);var p=ac(i);var au=this.element_.currentStyle;var Z=this.textAlign.toLowerCase();switch(Z){case"left":case"center":case"right":break;case"end":Z=au.direction=="ltr"?"right":"left";break;case"start":Z=au.direction=="rtl"?"right":"left";break;default:Z="left"}switch(this.textBaseline){case"hanging":case"top":ah.y=i.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":ah.y=-i.size/2.25;break}switch(Z){case"right":j=at;ar=0.05;break;case"center":j=ar=at/2;break}var aq=V(this,ak+ah.x,aj+ah.y);ag.push('<g_vml_:line from="',-j,' 0" to="',ar,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!ai,'" stroked="',!!ai,'" style="position:absolute;width:1px;height:1px;">');if(ai){w(this,ag)}else{G(this,ag,{x:-j,y:0},{x:ar,y:i.size})}var an=ao[0][0].toFixed(3)+","+ao[1][0].toFixed(3)+","+ao[0][1].toFixed(3)+","+ao[1][1].toFixed(3)+",0,0";var al=n(aq.x/d)+","+n(aq.y/d);ag.push('<g_vml_:skew on="t" matrix="',an,'" ',' offset="',al,'" origin="',j,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',af(am),'" style="v-text-align:',Z,";font:",af(p),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",ag.join(""))};q.fillText=function(m,i,p,j){this.drawText_(m,i,p,j,false)};q.strokeText=function(m,i,p,j){this.drawText_(m,i,p,j,true)};q.measureText=function(m){if(!this.textMeasureEl_){var i='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",i);this.textMeasureEl_=this.element_.lastChild}var j=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(j.createTextNode(m));return{width:this.textMeasureEl_.offsetWidth}};q.clip=function(){};q.arcTo=function(){};q.createPattern=function(j,i){return new T(j,i)};function U(i){this.type_=i;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}U.prototype.addColorStop=function(j,i){i=F(i);this.colors_.push({offset:j,color:i.color,alpha:i.alpha})};function T(j,i){Q(j);switch(i){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=i;break;default:O("SYNTAX_ERR")}this.src_=j.src;this.width_=j.width;this.height_=j.height}function O(i){throw new P(i)}function Q(i){if(!i||i.nodeType!=1||i.tagName!="IMG"){O("TYPE_MISMATCH_ERR")}if(i.readyState!="complete"){O("INVALID_STATE_ERR")}}function P(i){this.code=this[i];this.message=i+": DOM Exception "+this.code}var X=P.prototype=new Error;X.INDEX_SIZE_ERR=1;X.DOMSTRING_SIZE_ERR=2;X.HIERARCHY_REQUEST_ERR=3;X.WRONG_DOCUMENT_ERR=4;X.INVALID_CHARACTER_ERR=5;X.NO_DATA_ALLOWED_ERR=6;X.NO_MODIFICATION_ALLOWED_ERR=7;X.NOT_FOUND_ERR=8;X.NOT_SUPPORTED_ERR=9;X.INUSE_ATTRIBUTE_ERR=10;X.INVALID_STATE_ERR=11;X.SYNTAX_ERR=12;X.INVALID_MODIFICATION_ERR=13;X.NAMESPACE_ERR=14;X.INVALID_ACCESS_ERR=15;X.VALIDATION_ERR=16;X.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=e;CanvasRenderingContext2D=D;CanvasGradient=U;CanvasPattern=T;DOMException=P})()}; \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.colorhelpers.min.js b/chromium/third_party/flot/jquery.colorhelpers.min.js
index 844cef6708c..7f44c57b560 100644
--- a/chromium/third_party/flot/jquery.colorhelpers.min.js
+++ b/chromium/third_party/flot/jquery.colorhelpers.min.js
@@ -1,21 +1 @@
-/* Plugin for jQuery for working with colors.
- *
- * Version 1.1.
- *
- * Inspiration from jQuery color animation plugin by John Resig.
- *
- * Released under the MIT license by Ole Laursen, October 2009.
- *
- * Examples:
- *
- * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
- * var c = $.color.extract($("#mydiv"), 'background-color');
- * console.log(c.r, c.g, c.b, c.a);
- * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
- *
- * Note that .scale() and .add() return the same modified object
- * instead of making a new one.
- *
- * V. 1.1: Fix error handling so e.g. parsing an empty string does
- * produce a color rather than just crashing.
- */(function(e){e.color={},e.color.make=function(t,n,r,i){var s={};return s.r=t||0,s.g=n||0,s.b=r||0,s.a=i!=null?i:1,s.add=function(e,t){for(var n=0;n<e.length;++n)s[e.charAt(n)]+=t;return s.normalize()},s.scale=function(e,t){for(var n=0;n<e.length;++n)s[e.charAt(n)]*=t;return s.normalize()},s.toString=function(){return s.a>=1?"rgb("+[s.r,s.g,s.b].join(",")+")":"rgba("+[s.r,s.g,s.b,s.a].join(",")+")"},s.normalize=function(){function e(e,t,n){return t<e?e:t>n?n:t}return s.r=e(0,parseInt(s.r),255),s.g=e(0,parseInt(s.g),255),s.b=e(0,parseInt(s.b),255),s.a=e(0,s.a,1),s},s.clone=function(){return e.color.make(s.r,s.b,s.g,s.a)},s.normalize()},e.color.extract=function(t,n){var r;do{r=t.css(n).toLowerCase();if(r!=""&&r!="transparent")break;t=t.parent()}while(!e.nodeName(t.get(0),"body"));return r=="rgba(0, 0, 0, 0)"&&(r="transparent"),e.color.parse(r)},e.color.parse=function(n){var r,i=e.color.make;if(r=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10));if(r=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10),parseFloat(r[4]));if(r=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55);if(r=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55,parseFloat(r[4]));if(r=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(n))return i(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16));if(r=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(n))return i(parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16));var s=e.trim(n).toLowerCase();return s=="transparent"?i(255,255,255,0):(r=t[s]||[0,0,0],i(r[0],r[1],r[2]))};var t={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); \ No newline at end of file
+(function(b){b.color={};b.color.make=function(f,e,c,d){var h={};h.r=f||0;h.g=e||0;h.b=c||0;h.a=d!=null?d:1;h.add=function(k,j){for(var g=0;g<k.length;++g){h[k.charAt(g)]+=j}return h.normalize()};h.scale=function(k,j){for(var g=0;g<k.length;++g){h[k.charAt(g)]*=j}return h.normalize()};h.toString=function(){if(h.a>=1){return"rgb("+[h.r,h.g,h.b].join(",")+")"}else{return"rgba("+[h.r,h.g,h.b,h.a].join(",")+")"}};h.normalize=function(){function g(j,k,i){return k<j?j:(k>i?i:k)}h.r=g(0,parseInt(h.r),255);h.g=g(0,parseInt(h.g),255);h.b=g(0,parseInt(h.b),255);h.a=g(0,h.a,1);return h};h.clone=function(){return b.color.make(h.r,h.b,h.g,h.a)};return h.normalize()};b.color.extract=function(e,d){var f;do{f=e.css(d).toLowerCase();if(f!=""&&f!="transparent"){break}e=e.parent()}while(!b.nodeName(e.get(0),"body"));if(f=="rgba(0, 0, 0, 0)"){f="transparent"}return b.color.parse(f)};b.color.parse=function(f){var e,c=b.color.make;if(e=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(f)){return c(parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3],10))}if(e=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(f)){return c(parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3],10),parseFloat(e[4]))}if(e=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(f)){return c(parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55)}if(e=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(f)){return c(parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55,parseFloat(e[4]))}if(e=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(f)){return c(parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16))}if(e=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(f)){return c(parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16))}var d=b.trim(f).toLowerCase();if(d=="transparent"){return c(255,255,255,0)}else{e=a[d]||[0,0,0];return c(e[0],e[1],e[2])}};var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.canvas.min.js b/chromium/third_party/flot/jquery.flot.canvas.min.js
deleted file mode 100644
index ac70b537a6c..00000000000
--- a/chromium/third_party/flot/jquery.flot.canvas.min.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Flot plugin for drawing all elements of a plot on the canvas.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-Flot normally produces certain elements, like axis labels and the legend, using
-HTML elements. This permits greater interactivity and customization, and often
-looks better, due to cross-browser canvas text inconsistencies and limitations.
-
-It can also be desirable to render the plot entirely in canvas, particularly
-if the goal is to save it as an image, or if Flot is being used in a context
-where the HTML DOM does not exist, as is the case within Node.js. This plugin
-switches out Flot's standard drawing operations for canvas-only replacements.
-
-Currently the plugin supports only axis labels, but it will eventually allow
-every element of the plot to be rendered directly to canvas.
-
-The plugin supports these options:
-
-{
- canvas: boolean
-}
-
-The "canvas" option controls whether full canvas drawing is enabled, making it
-possible to toggle on and off. This is useful when a plot uses HTML text in the
-browser, but needs to redraw with canvas text when exporting as an image.
-
-*/(function(e){function o(t,o){var u=o.Canvas;n==null&&(r=u.prototype.getTextInfo,i=u.prototype.addText,n=u.prototype.render),u.prototype.render=function(){if(!t.getOptions().canvas)return n.call(this);var e=this.context,r=this._textCache;e.save(),e.textBaseline="middle";for(var i in r)if(s.call(r,i)){var o=r[i];for(var u in o)if(s.call(o,u)){var a=o[u],f=!0;for(var l in a)if(s.call(a,l)){var c=a[l],h=c.positions,p=c.lines;f&&(e.fillStyle=c.font.color,e.font=c.font.definition,f=!1);for(var d=0,v;v=h[d];d++)if(v.active)for(var m=0,g;g=v.lines[m];m++)e.fillText(p[m].text,g[0],g[1]);else h.splice(d--,1);h.length==0&&delete a[l]}}}e.restore()},u.prototype.getTextInfo=function(n,i,s,o,u){if(!t.getOptions().canvas)return r.call(this,n,i,s,o,u);var a,f,l,c;i=""+i,typeof s=="object"?a=s.style+" "+s.variant+" "+s.weight+" "+s.size+"px "+s.family:a=s,f=this._textCache[n],f==null&&(f=this._textCache[n]={}),l=f[a],l==null&&(l=f[a]={}),c=l[i];if(c==null){var h=this.context;if(typeof s!="object"){var p=e("<div>&nbsp;</div>").css("position","absolute").addClass(typeof s=="string"?s:null).appendTo(this.getTextLayer(n));s={lineHeight:p.height(),style:p.css("font-style"),variant:p.css("font-variant"),weight:p.css("font-weight"),family:p.css("font-family"),color:p.css("color")},s.size=p.css("line-height",1).height(),p.remove()}a=s.style+" "+s.variant+" "+s.weight+" "+s.size+"px "+s.family,c=l[i]={width:0,height:0,positions:[],lines:[],font:{definition:a,color:s.color}},h.save(),h.font=a;var d=(i+"").replace(/<br ?\/?>|\r\n|\r/g,"\n").split("\n");for(var v=0;v<d.length;++v){var m=d[v],g=h.measureText(m);c.width=Math.max(g.width,c.width),c.height+=s.lineHeight,c.lines.push({text:m,width:g.width,height:s.lineHeight})}h.restore()}return c},u.prototype.addText=function(e,n,r,s,o,u,a,f,l){if(!t.getOptions().canvas)return i.call(this,e,n,r,s,o,u,a,f,l);var c=this.getTextInfo(e,s,o,u,a),h=c.positions,p=c.lines;r+=c.height/p.length/2,l=="middle"?r=Math.round(r-c.height/2):l=="bottom"?r=Math.round(r-c.height):r=Math.round(r),!(window.opera&&window.opera.version().split(".")[0]<12)||(r-=2);for(var d=0,v;v=h[d];d++)if(v.x==n&&v.y==r){v.active=!0;return}v={active:!0,lines:[],x:n,y:r},h.push(v);for(var d=0,m;m=p[d];d++)f=="center"?v.lines.push([Math.round(n-m.width/2),r]):f=="right"?v.lines.push([Math.round(n-m.width),r]):v.lines.push([Math.round(n),r]),r+=m.height}}var t={canvas:!0},n,r,i,s=Object.prototype.hasOwnProperty;e.plot.plugins.push({init:o,options:t,name:"canvas",version:"1.0"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.categories.min.js b/chromium/third_party/flot/jquery.flot.categories.min.js
deleted file mode 100644
index ca86594fe34..00000000000
--- a/chromium/third_party/flot/jquery.flot.categories.min.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Flot plugin for plotting textual data or categories.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-Consider a dataset like [["February", 34], ["March", 20], ...]. This plugin
-allows you to plot such a dataset directly.
-
-To enable it, you must specify mode: "categories" on the axis with the textual
-labels, e.g.
-
- $.plot("#placeholder", data, { xaxis: { mode: "categories" } });
-
-By default, the labels are ordered as they are met in the data series. If you
-need a different ordering, you can specify "categories" on the axis options
-and list the categories there:
-
- xaxis: {
- mode: "categories",
- categories: ["February", "March", "April"]
- }
-
-If you need to customize the distances between the categories, you can specify
-"categories" as an object mapping labels to values
-
- xaxis: {
- mode: "categories",
- categories: { "February": 1, "March": 3, "April": 4 }
- }
-
-If you don't specify all categories, the remaining categories will be numbered
-from the max value plus 1 (with a spacing of 1 between each).
-
-Internally, the plugin works by transforming the input data through an auto-
-generated mapping where the first category becomes 0, the second 1, etc.
-Hence, a point like ["February", 34] becomes [0, 34] internally in Flot (this
-is visible in hover and click events that return numbers rather than the
-category labels). The plugin also overrides the tick generator to spit out the
-categories as ticks instead of the values.
-
-If you need to map a value back to its label, the mapping is always accessible
-as "categories" on the axis object, e.g. plot.getAxes().xaxis.categories.
-
-*/(function(e){function n(e,t,n,r){var i=t.xaxis.options.mode=="categories",s=t.yaxis.options.mode=="categories";if(!i&&!s)return;var o=r.format;if(!o){var u=t;o=[],o.push({x:!0,number:!0,required:!0}),o.push({y:!0,number:!0,required:!0});if(u.bars.show||u.lines.show&&u.lines.fill){var a=!!(u.bars.show&&u.bars.zero||u.lines.show&&u.lines.zero);o.push({y:!0,number:!0,required:!1,defaultValue:0,autoscale:a}),u.bars.horizontal&&(delete o[o.length-1].y,o[o.length-1].x=!0)}r.format=o}for(var f=0;f<o.length;++f)o[f].x&&i&&(o[f].number=!1),o[f].y&&s&&(o[f].number=!1)}function r(e){var t=-1;for(var n in e)e[n]>t&&(t=e[n]);return t+1}function i(e){var t=[];for(var n in e.categories){var r=e.categories[n];r>=e.min&&r<=e.max&&t.push([r,n])}return t.sort(function(e,t){return e[0]-t[0]}),t}function s(t,n,r){if(t[n].options.mode!="categories")return;if(!t[n].categories){var s={},u=t[n].options.categories||{};if(e.isArray(u))for(var a=0;a<u.length;++a)s[u[a]]=a;else for(var f in u)s[f]=u[f];t[n].categories=s}t[n].options.ticks||(t[n].options.ticks=i),o(r,n,t[n].categories)}function o(e,t,n){var i=e.points,s=e.pointsize,o=e.format,u=t.charAt(0),a=r(n);for(var f=0;f<i.length;f+=s){if(i[f]==null)continue;for(var l=0;l<s;++l){var c=i[f+l];if(c==null||!o[l][u])continue;c in n||(n[c]=a,++a),i[f+l]=n[c]}}}function u(e,t,n){s(t,"xaxis",n),s(t,"yaxis",n)}function a(e){e.hooks.processRawData.push(n),e.hooks.processDatapoints.push(u)}var t={xaxis:{categories:null},yaxis:{categories:null}};e.plot.plugins.push({init:a,options:t,name:"categories",version:"1.0"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.crosshair.min.js b/chromium/third_party/flot/jquery.flot.crosshair.min.js
index 65bb9904734..ccaf240366a 100644
--- a/chromium/third_party/flot/jquery.flot.crosshair.min.js
+++ b/chromium/third_party/flot/jquery.flot.crosshair.min.js
@@ -1,59 +1 @@
-/* Flot plugin for showing crosshairs when the mouse hovers over the plot.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The plugin supports these options:
-
- crosshair: {
- mode: null or "x" or "y" or "xy"
- color: color
- lineWidth: number
- }
-
-Set the mode to one of "x", "y" or "xy". The "x" mode enables a vertical
-crosshair that lets you trace the values on the x axis, "y" enables a
-horizontal crosshair and "xy" enables them both. "color" is the color of the
-crosshair (default is "rgba(170, 0, 0, 0.80)"), "lineWidth" is the width of
-the drawn lines (default is 1).
-
-The plugin also adds four public methods:
-
- - setCrosshair( pos )
-
- Set the position of the crosshair. Note that this is cleared if the user
- moves the mouse. "pos" is in coordinates of the plot and should be on the
- form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple
- axes), which is coincidentally the same format as what you get from a
- "plothover" event. If "pos" is null, the crosshair is cleared.
-
- - clearCrosshair()
-
- Clear the crosshair.
-
- - lockCrosshair(pos)
-
- Cause the crosshair to lock to the current location, no longer updating if
- the user moves the mouse. Optionally supply a position (passed on to
- setCrosshair()) to move it to.
-
- Example usage:
-
- var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } };
- $("#graph").bind( "plothover", function ( evt, position, item ) {
- if ( item ) {
- // Lock the crosshair to the data point being hovered
- myFlot.lockCrosshair({
- x: item.datapoint[ 0 ],
- y: item.datapoint[ 1 ]
- });
- } else {
- // Return normal crosshair operation
- myFlot.unlockCrosshair();
- }
- });
-
- - unlockCrosshair()
-
- Free the crosshair to move again after locking it.
-*/(function(e){function n(e){function n(n){if(t.locked)return;t.x!=-1&&(t.x=-1,e.triggerRedrawOverlay())}function r(n){if(t.locked)return;if(e.getSelection&&e.getSelection()){t.x=-1;return}var r=e.offset();t.x=Math.max(0,Math.min(n.pageX-r.left,e.width())),t.y=Math.max(0,Math.min(n.pageY-r.top,e.height())),e.triggerRedrawOverlay()}var t={x:-1,y:-1,locked:!1};e.setCrosshair=function(r){if(!r)t.x=-1;else{var i=e.p2c(r);t.x=Math.max(0,Math.min(i.left,e.width())),t.y=Math.max(0,Math.min(i.top,e.height()))}e.triggerRedrawOverlay()},e.clearCrosshair=e.setCrosshair,e.lockCrosshair=function(r){r&&e.setCrosshair(r),t.locked=!0},e.unlockCrosshair=function(){t.locked=!1},e.hooks.bindEvents.push(function(e,t){if(!e.getOptions().crosshair.mode)return;t.mouseout(n),t.mousemove(r)}),e.hooks.drawOverlay.push(function(e,n){var r=e.getOptions().crosshair;if(!r.mode)return;var i=e.getPlotOffset();n.save(),n.translate(i.left,i.top);if(t.x!=-1){var s=e.getOptions().crosshair.lineWidth%2===0?0:.5;n.strokeStyle=r.color,n.lineWidth=r.lineWidth,n.lineJoin="round",n.beginPath();if(r.mode.indexOf("x")!=-1){var o=Math.round(t.x)+s;n.moveTo(o,0),n.lineTo(o,e.height())}if(r.mode.indexOf("y")!=-1){var u=Math.round(t.y)+s;n.moveTo(0,u),n.lineTo(e.width(),u)}n.stroke()}n.restore()}),e.hooks.shutdown.push(function(e,t){t.unbind("mouseout",n),t.unbind("mousemove",r)})}var t={crosshair:{mode:null,color:"rgba(170, 0, 0, 0.80)",lineWidth:1}};e.plot.plugins.push({init:n,options:t,name:"crosshair",version:"1.0"})})(jQuery); \ No newline at end of file
+(function(b){var a={crosshair:{mode:null,color:"rgba(170, 0, 0, 0.80)",lineWidth:1}};function c(h){var j={x:-1,y:-1,locked:false};h.setCrosshair=function e(l){if(!l){j.x=-1}else{var k=h.p2c(l);j.x=Math.max(0,Math.min(k.left,h.width()));j.y=Math.max(0,Math.min(k.top,h.height()))}h.triggerRedrawOverlay()};h.clearCrosshair=h.setCrosshair;h.lockCrosshair=function f(k){if(k){h.setCrosshair(k)}j.locked=true};h.unlockCrosshair=function g(){j.locked=false};function d(k){if(j.locked){return}if(j.x!=-1){j.x=-1;h.triggerRedrawOverlay()}}function i(k){if(j.locked){return}if(h.getSelection&&h.getSelection()){j.x=-1;return}var l=h.offset();j.x=Math.max(0,Math.min(k.pageX-l.left,h.width()));j.y=Math.max(0,Math.min(k.pageY-l.top,h.height()));h.triggerRedrawOverlay()}h.hooks.bindEvents.push(function(l,k){if(!l.getOptions().crosshair.mode){return}k.mouseout(d);k.mousemove(i)});h.hooks.drawOverlay.push(function(m,k){var n=m.getOptions().crosshair;if(!n.mode){return}var l=m.getPlotOffset();k.save();k.translate(l.left,l.top);if(j.x!=-1){k.strokeStyle=n.color;k.lineWidth=n.lineWidth;k.lineJoin="round";k.beginPath();if(n.mode.indexOf("x")!=-1){k.moveTo(j.x,0);k.lineTo(j.x,m.height())}if(n.mode.indexOf("y")!=-1){k.moveTo(0,j.y);k.lineTo(m.width(),j.y)}k.stroke()}k.restore()});h.hooks.shutdown.push(function(l,k){k.unbind("mouseout",d);k.unbind("mousemove",i)})}b.plot.plugins.push({init:c,options:a,name:"crosshair",version:"1.0"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.errorbars.min.js b/chromium/third_party/flot/jquery.flot.errorbars.min.js
deleted file mode 100644
index 72d7e3dc7b2..00000000000
--- a/chromium/third_party/flot/jquery.flot.errorbars.min.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Flot plugin for plotting error bars.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-Error bars are used to show standard deviation and other statistical
-properties in a plot.
-
-* Created by Rui Pereira - rui (dot) pereira (at) gmail (dot) com
-
-This plugin allows you to plot error-bars over points. Set "errorbars" inside
-the points series to the axis name over which there will be error values in
-your data array (*even* if you do not intend to plot them later, by setting
-"show: null" on xerr/yerr).
-
-The plugin supports these options:
-
- series: {
- points: {
- errorbars: "x" or "y" or "xy",
- xerr: {
- show: null/false or true,
- asymmetric: null/false or true,
- upperCap: null or "-" or function,
- lowerCap: null or "-" or function,
- color: null or color,
- radius: null or number
- },
- yerr: { same options as xerr }
- }
- }
-
-Each data point array is expected to be of the type:
-
- "x" [ x, y, xerr ]
- "y" [ x, y, yerr ]
- "xy" [ x, y, xerr, yerr ]
-
-Where xerr becomes xerr_lower,xerr_upper for the asymmetric error case, and
-equivalently for yerr. Eg., a datapoint for the "xy" case with symmetric
-error-bars on X and asymmetric on Y would be:
-
- [ x, y, xerr, yerr_lower, yerr_upper ]
-
-By default no end caps are drawn. Setting upperCap and/or lowerCap to "-" will
-draw a small cap perpendicular to the error bar. They can also be set to a
-user-defined drawing function, with (ctx, x, y, radius) as parameters, as eg.
-
- function drawSemiCircle( ctx, x, y, radius ) {
- ctx.beginPath();
- ctx.arc( x, y, radius, 0, Math.PI, false );
- ctx.moveTo( x - radius, y );
- ctx.lineTo( x + radius, y );
- ctx.stroke();
- }
-
-Color and radius both default to the same ones of the points series if not
-set. The independent radius parameter on xerr/yerr is useful for the case when
-we may want to add error-bars to a line, without showing the interconnecting
-points (with radius: 0), and still showing end caps on the error-bars.
-shadowSize and lineWidth are derived as well from the points series.
-
-*/(function(e){function n(e,t,n,r){if(!t.points.errorbars)return;var i=[{x:!0,number:!0,required:!0},{y:!0,number:!0,required:!0}],s=t.points.errorbars;if(s=="x"||s=="xy")t.points.xerr.asymmetric?(i.push({x:!0,number:!0,required:!0}),i.push({x:!0,number:!0,required:!0})):i.push({x:!0,number:!0,required:!0});if(s=="y"||s=="xy")t.points.yerr.asymmetric?(i.push({y:!0,number:!0,required:!0}),i.push({y:!0,number:!0,required:!0})):i.push({y:!0,number:!0,required:!0});r.format=i}function r(e,t){var n=e.datapoints.points,r=null,i=null,s=null,o=null,u=e.points.xerr,a=e.points.yerr,f=e.points.errorbars;f=="x"||f=="xy"?u.asymmetric?(r=n[t+2],i=n[t+3],f=="xy"&&(a.asymmetric?(s=n[t+4],o=n[t+5]):s=n[t+4])):(r=n[t+2],f=="xy"&&(a.asymmetric?(s=n[t+3],o=n[t+4]):s=n[t+3])):f=="y"&&(a.asymmetric?(s=n[t+2],o=n[t+3]):s=n[t+2]),i==null&&(i=r),o==null&&(o=s);var l=[r,i,s,o];return u.show||(l[0]=null,l[1]=null),a.show||(l[2]=null,l[3]=null),l}function i(e,t,n){var i=n.datapoints.points,o=n.datapoints.pointsize,u=[n.xaxis,n.yaxis],a=n.points.radius,f=[n.points.xerr,n.points.yerr],l=!1;if(u[0].p2c(u[0].max)<u[0].p2c(u[0].min)){l=!0;var c=f[0].lowerCap;f[0].lowerCap=f[0].upperCap,f[0].upperCap=c}var h=!1;if(u[1].p2c(u[1].min)<u[1].p2c(u[1].max)){h=!0;var c=f[1].lowerCap;f[1].lowerCap=f[1].upperCap,f[1].upperCap=c}for(var p=0;p<n.datapoints.points.length;p+=o){var d=r(n,p);for(var v=0;v<f.length;v++){var m=[u[v].min,u[v].max];if(d[v*f.length]){var g=i[p],y=i[p+1],b=[g,y][v]+d[v*f.length+1],w=[g,y][v]-d[v*f.length];if(f[v].err=="x")if(y>u[1].max||y<u[1].min||b<u[0].min||w>u[0].max)continue;if(f[v].err=="y")if(g>u[0].max||g<u[0].min||b<u[1].min||w>u[1].max)continue;var E=!0,S=!0;b>m[1]&&(E=!1,b=m[1]),w<m[0]&&(S=!1,w=m[0]);if(f[v].err=="x"&&l||f[v].err=="y"&&h){var c=w;w=b,b=c,c=S,S=E,E=c,c=m[0],m[0]=m[1],m[1]=c}g=u[0].p2c(g),y=u[1].p2c(y),b=u[v].p2c(b),w=u[v].p2c(w),m[0]=u[v].p2c(m[0]),m[1]=u[v].p2c(m[1]);var x=f[v].lineWidth?f[v].lineWidth:n.points.lineWidth,T=n.points.shadowSize!=null?n.points.shadowSize:n.shadowSize;if(x>0&&T>0){var N=T/2;t.lineWidth=N,t.strokeStyle="rgba(0,0,0,0.1)",s(t,f[v],g,y,b,w,E,S,a,N+N/2,m),t.strokeStyle="rgba(0,0,0,0.2)",s(t,f[v],g,y,b,w,E,S,a,N/2,m)}t.strokeStyle=f[v].color?f[v].color:n.color,t.lineWidth=x,s(t,f[v],g,y,b,w,E,S,a,0,m)}}}}function s(t,n,r,i,s,u,a,f,l,c,h){i+=c,s+=c,u+=c,n.err=="x"?(s>r+l?o(t,[[s,i],[Math.max(r+l,h[0]),i]]):a=!1,u<r-l?o(t,[[Math.min(r-l,h[1]),i],[u,i]]):f=!1):(s<i-l?o(t,[[r,s],[r,Math.min(i-l,h[0])]]):a=!1,u>i+l?o(t,[[r,Math.max(i+l,h[1])],[r,u]]):f=!1),l=n.radius!=null?n.radius:l,a&&(n.upperCap=="-"?n.err=="x"?o(t,[[s,i-l],[s,i+l]]):o(t,[[r-l,s],[r+l,s]]):e.isFunction(n.upperCap)&&(n.err=="x"?n.upperCap(t,s,i,l):n.upperCap(t,r,s,l))),f&&(n.lowerCap=="-"?n.err=="x"?o(t,[[u,i-l],[u,i+l]]):o(t,[[r-l,u],[r+l,u]]):e.isFunction(n.lowerCap)&&(n.err=="x"?n.lowerCap(t,u,i,l):n.lowerCap(t,r,u,l)))}function o(e,t){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(var n=1;n<t.length;n++)e.lineTo(t[n][0],t[n][1]);e.stroke()}function u(t,n){var r=t.getPlotOffset();n.save(),n.translate(r.left,r.top),e.each(t.getData(),function(e,r){r.points.errorbars&&(r.points.xerr.show||r.points.yerr.show)&&i(t,n,r)}),n.restore()}function a(e){e.hooks.processRawData.push(n),e.hooks.draw.push(u)}var t={series:{points:{errorbars:null,xerr:{err:"x",show:null,asymmetric:null,upperCap:null,lowerCap:null,color:null,radius:null},yerr:{err:"y",show:null,asymmetric:null,upperCap:null,lowerCap:null,color:null,radius:null}}}};e.plot.plugins.push({init:a,options:t,name:"errorbars",version:"1.0"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.fillbetween.min.js b/chromium/third_party/flot/jquery.flot.fillbetween.min.js
index e94efb7e740..47f3dfb6de0 100644
--- a/chromium/third_party/flot/jquery.flot.fillbetween.min.js
+++ b/chromium/third_party/flot/jquery.flot.fillbetween.min.js
@@ -1,30 +1 @@
-/* Flot plugin for computing bottoms for filled line and bar charts.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The case: you've got two series that you want to fill the area between. In Flot
-terms, you need to use one as the fill bottom of the other. You can specify the
-bottom of each data point as the third coordinate manually, or you can use this
-plugin to compute it for you.
-
-In order to name the other series, you need to give it an id, like this:
-
- var dataset = [
- { data: [ ... ], id: "foo" } , // use default bottom
- { data: [ ... ], fillBetween: "foo" }, // use first dataset as bottom
- ];
-
- $.plot($("#placeholder"), dataset, { lines: { show: true, fill: true }});
-
-As a convenience, if the id given is a number that doesn't appear as an id in
-the series, it is interpreted as the index in the array instead (so fillBetween:
-0 can also mean the first series).
-
-Internally, the plugin modifies the datapoints in each series. For line series,
-extra data points might be inserted through interpolation. Note that at points
-where the bottom line is not defined (due to a null point or start/end of line),
-the current line will show a gap too. The algorithm comes from the
-jquery.flot.stack.js plugin, possibly some code could be shared.
-
-*/(function(e){function n(e){function t(e,t){var n;for(n=0;n<t.length;++n)if(t[n].id===e.fillBetween)return t[n];return typeof e.fillBetween=="number"?e.fillBetween<0||e.fillBetween>=t.length?null:t[e.fillBetween]:null}function n(e,n,r){if(n.fillBetween==null)return;var i=t(n,e.getData());if(!i)return;var s=r.pointsize,o=r.points,u=i.datapoints.pointsize,a=i.datapoints.points,f=[],l,c,h,p,d,v,m=n.lines.show,g=s>2&&r.format[2].y,y=m&&n.lines.steps,b=!0,w=0,E=0,S,x;for(;;){if(w>=o.length)break;S=f.length;if(o[w]==null){for(x=0;x<s;++x)f.push(o[w+x]);w+=s}else if(E>=a.length){if(!m)for(x=0;x<s;++x)f.push(o[w+x]);w+=s}else if(a[E]==null){for(x=0;x<s;++x)f.push(null);b=!0,E+=u}else{l=o[w],c=o[w+1],p=a[E],d=a[E+1],v=0;if(l===p){for(x=0;x<s;++x)f.push(o[w+x]);v=d,w+=s,E+=u}else if(l>p){if(m&&w>0&&o[w-s]!=null){h=c+(o[w-s+1]-c)*(p-l)/(o[w-s]-l),f.push(p),f.push(h);for(x=2;x<s;++x)f.push(o[w+x]);v=d}E+=u}else{if(b&&m){w+=s;continue}for(x=0;x<s;++x)f.push(o[w+x]);m&&E>0&&a[E-u]!=null&&(v=d+(a[E-u+1]-d)*(l-p)/(a[E-u]-p)),w+=s}b=!1,S!==f.length&&g&&(f[S+2]=v)}if(y&&S!==f.length&&S>0&&f[S]!==null&&f[S]!==f[S-s]&&f[S+1]!==f[S-s+1]){for(x=0;x<s;++x)f[S+s+x]=f[S+x];f[S+1]=f[S-s+1]}}r.points=f}e.hooks.processDatapoints.push(n)}var t={series:{fillBetween:null}};e.plot.plugins.push({init:n,options:t,name:"fillbetween",version:"1.0"})})(jQuery); \ No newline at end of file
+(function(b){var a={series:{fillBetween:null}};function c(f){function d(j,h){var g;for(g=0;g<h.length;++g){if(h[g].id==j.fillBetween){return h[g]}}if(typeof j.fillBetween=="number"){g=j.fillBetween;if(g<0||g>=h.length){return null}return h[g]}return null}function e(B,u,g){if(u.fillBetween==null){return}var p=d(u,B.getData());if(!p){return}var y=g.pointsize,E=g.points,h=p.datapoints.pointsize,x=p.datapoints.points,r=[],w,v,k,G,F,q,t=u.lines.show,o=y>2&&g.format[2].y,n=t&&u.lines.steps,D=true,C=0,A=0,z;while(true){if(C>=E.length){break}z=r.length;if(E[C]==null){for(m=0;m<y;++m){r.push(E[C+m])}C+=y}else{if(A>=x.length){if(!t){for(m=0;m<y;++m){r.push(E[C+m])}}C+=y}else{if(x[A]==null){for(m=0;m<y;++m){r.push(null)}D=true;A+=h}else{w=E[C];v=E[C+1];G=x[A];F=x[A+1];q=0;if(w==G){for(m=0;m<y;++m){r.push(E[C+m])}q=F;C+=y;A+=h}else{if(w>G){if(t&&C>0&&E[C-y]!=null){k=v+(E[C-y+1]-v)*(G-w)/(E[C-y]-w);r.push(G);r.push(k);for(m=2;m<y;++m){r.push(E[C+m])}q=F}A+=h}else{if(D&&t){C+=y;continue}for(m=0;m<y;++m){r.push(E[C+m])}if(t&&A>0&&x[A-h]!=null){q=F+(x[A-h+1]-F)*(w-G)/(x[A-h]-G)}C+=y}}D=false;if(z!=r.length&&o){r[z+2]=q}}}}if(n&&z!=r.length&&z>0&&r[z]!=null&&r[z]!=r[z-y]&&r[z+1]!=r[z-y+1]){for(m=0;m<y;++m){r[z+y+m]=r[z+m]}r[z+1]=r[z-y+1]}}g.points=r}f.hooks.processDatapoints.push(e)}b.plot.plugins.push({init:c,options:a,name:"fillbetween",version:"1.0"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.image.min.js b/chromium/third_party/flot/jquery.flot.image.min.js
index b128d30336d..9480c1e7a31 100644
--- a/chromium/third_party/flot/jquery.flot.image.min.js
+++ b/chromium/third_party/flot/jquery.flot.image.min.js
@@ -1,53 +1 @@
-/* Flot plugin for plotting images.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The data syntax is [ [ image, x1, y1, x2, y2 ], ... ] where (x1, y1) and
-(x2, y2) are where you intend the two opposite corners of the image to end up
-in the plot. Image must be a fully loaded Javascript image (you can make one
-with new Image()). If the image is not complete, it's skipped when plotting.
-
-There are two helpers included for retrieving images. The easiest work the way
-that you put in URLs instead of images in the data, like this:
-
- [ "myimage.png", 0, 0, 10, 10 ]
-
-Then call $.plot.image.loadData( data, options, callback ) where data and
-options are the same as you pass in to $.plot. This loads the images, replaces
-the URLs in the data with the corresponding images and calls "callback" when
-all images are loaded (or failed loading). In the callback, you can then call
-$.plot with the data set. See the included example.
-
-A more low-level helper, $.plot.image.load(urls, callback) is also included.
-Given a list of URLs, it calls callback with an object mapping from URL to
-Image object when all images are loaded or have failed loading.
-
-The plugin supports these options:
-
- series: {
- images: {
- show: boolean
- anchor: "corner" or "center"
- alpha: [ 0, 1 ]
- }
- }
-
-They can be specified for a specific series:
-
- $.plot( $("#placeholder"), [{
- data: [ ... ],
- images: { ... }
- ])
-
-Note that because the data format is different from usual data points, you
-can't use images with anything else in a specific data series.
-
-Setting "anchor" to "center" causes the pixels in the image to be anchored at
-the corner pixel centers inside of at the pixel corners, effectively letting
-half a pixel stick out to each side in the plot.
-
-A possible future direction could be support for tiling for large images (like
-Google Maps).
-
-*/(function(e){function n(e,t,n){var r=e.getPlotOffset();if(!n.images||!n.images.show)return;var i=n.datapoints.points,s=n.datapoints.pointsize;for(var o=0;o<i.length;o+=s){var u=i[o],a=i[o+1],f=i[o+2],l=i[o+3],c=i[o+4],h=n.xaxis,p=n.yaxis,d;if(!u||u.width<=0||u.height<=0)continue;a>l&&(d=l,l=a,a=d),f>c&&(d=c,c=f,f=d),n.images.anchor=="center"&&(d=.5*(l-a)/(u.width-1),a-=d,l+=d,d=.5*(c-f)/(u.height-1),f-=d,c+=d);if(a==l||f==c||a>=h.max||l<=h.min||f>=p.max||c<=p.min)continue;var v=0,m=0,g=u.width,y=u.height;a<h.min&&(v+=(g-v)*(h.min-a)/(l-a),a=h.min),l>h.max&&(g+=(g-v)*(h.max-l)/(l-a),l=h.max),f<p.min&&(y+=(m-y)*(p.min-f)/(c-f),f=p.min),c>p.max&&(m+=(m-y)*(p.max-c)/(c-f),c=p.max),a=h.p2c(a),l=h.p2c(l),f=p.p2c(f),c=p.p2c(c),a>l&&(d=l,l=a,a=d),f>c&&(d=c,c=f,f=d),d=t.globalAlpha,t.globalAlpha*=n.images.alpha,t.drawImage(u,v,m,g-v,y-m,a+r.left,f+r.top,l-a,c-f),t.globalAlpha=d}}function r(e,t,n,r){if(!t.images.show)return;r.format=[{required:!0},{x:!0,number:!0,required:!0},{y:!0,number:!0,required:!0},{x:!0,number:!0,required:!0},{y:!0,number:!0,required:!0}]}function i(e){e.hooks.processRawData.push(r),e.hooks.drawSeries.push(n)}var t={series:{images:{show:!1,alpha:1,anchor:"corner"}}};e.plot.image={},e.plot.image.loadDataImages=function(t,n,r){var i=[],s=[],o=n.series.images.show;e.each(t,function(t,n){if(!o&&!n.images.show)return;n.data&&(n=n.data),e.each(n,function(e,t){typeof t[0]=="string"&&(i.push(t[0]),s.push(t))})}),e.plot.image.load(i,function(t){e.each(s,function(e,n){var r=n[0];t[r]&&(n[0]=t[r])}),r()})},e.plot.image.load=function(t,n){var r=t.length,i={};r==0&&n({}),e.each(t,function(t,s){var o=function(){--r,i[s]=this,r==0&&n(i)};e("<img />").load(o).error(o).attr("src",s)})},e.plot.plugins.push({init:i,options:t,name:"image",version:"1.1"})})(jQuery); \ No newline at end of file
+(function(c){var a={series:{images:{show:false,alpha:1,anchor:"corner"}}};c.plot.image={};c.plot.image.loadDataImages=function(g,f,k){var j=[],h=[];var i=f.series.images.show;c.each(g,function(l,m){if(!(i||m.images.show)){return}if(m.data){m=m.data}c.each(m,function(n,o){if(typeof o[0]=="string"){j.push(o[0]);h.push(o)}})});c.plot.image.load(j,function(l){c.each(h,function(n,o){var m=o[0];if(l[m]){o[0]=l[m]}});k()})};c.plot.image.load=function(h,i){var g=h.length,f={};if(g==0){i({})}c.each(h,function(k,j){var l=function(){--g;f[j]=this;if(g==0){i(f)}};c("<img />").load(l).error(l).attr("src",j)})};function d(q,o,l){var m=q.getPlotOffset();if(!l.images||!l.images.show){return}var r=l.datapoints.points,n=l.datapoints.pointsize;for(var t=0;t<r.length;t+=n){var y=r[t],w=r[t+1],g=r[t+2],v=r[t+3],f=r[t+4],h=l.xaxis,u=l.yaxis,x;if(!y||y.width<=0||y.height<=0){continue}if(w>v){x=v;v=w;w=x}if(g>f){x=f;f=g;g=x}if(l.images.anchor=="center"){x=0.5*(v-w)/(y.width-1);w-=x;v+=x;x=0.5*(f-g)/(y.height-1);g-=x;f+=x}if(w==v||g==f||w>=h.max||v<=h.min||g>=u.max||f<=u.min){continue}var k=0,s=0,j=y.width,p=y.height;if(w<h.min){k+=(j-k)*(h.min-w)/(v-w);w=h.min}if(v>h.max){j+=(j-k)*(h.max-v)/(v-w);v=h.max}if(g<u.min){p+=(s-p)*(u.min-g)/(f-g);g=u.min}if(f>u.max){s+=(s-p)*(u.max-f)/(f-g);f=u.max}w=h.p2c(w);v=h.p2c(v);g=u.p2c(g);f=u.p2c(f);if(w>v){x=v;v=w;w=x}if(g>f){x=f;f=g;g=x}x=o.globalAlpha;o.globalAlpha*=l.images.alpha;o.drawImage(y,k,s,j-k,p-s,w+m.left,g+m.top,v-w,f-g);o.globalAlpha=x}}function b(i,f,g,h){if(!f.images.show){return}h.format=[{required:true},{x:true,number:true,required:true},{y:true,number:true,required:true},{x:true,number:true,required:true},{y:true,number:true,required:true}]}function e(f){f.hooks.processRawData.push(b);f.hooks.drawSeries.push(d)}c.plot.plugins.push({init:e,options:a,name:"image",version:"1.1"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.min.js b/chromium/third_party/flot/jquery.flot.min.js
index 3706512c482..4467fc5d8cd 100644
--- a/chromium/third_party/flot/jquery.flot.min.js
+++ b/chromium/third_party/flot/jquery.flot.min.js
@@ -1,29 +1,6 @@
-/* Javascript plotting library for jQuery, version 0.8.1.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-*/// first an inline dependency, jquery.colorhelpers.js, we inline it here
-// for convenience
-/* Plugin for jQuery for working with colors.
+/* Javascript plotting library for jQuery, v. 0.7.
*
- * Version 1.1.
+ * Released under the MIT license by IOLA, December 2007.
*
- * Inspiration from jQuery color animation plugin by John Resig.
- *
- * Released under the MIT license by Ole Laursen, October 2009.
- *
- * Examples:
- *
- * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
- * var c = $.color.extract($("#mydiv"), 'background-color');
- * console.log(c.r, c.g, c.b, c.a);
- * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
- *
- * Note that .scale() and .add() return the same modified object
- * instead of making a new one.
- *
- * V. 1.1: Fix error handling so e.g. parsing an empty string does
- * produce a color rather than just crashing.
- */(function(e){e.color={},e.color.make=function(t,n,r,i){var s={};return s.r=t||0,s.g=n||0,s.b=r||0,s.a=i!=null?i:1,s.add=function(e,t){for(var n=0;n<e.length;++n)s[e.charAt(n)]+=t;return s.normalize()},s.scale=function(e,t){for(var n=0;n<e.length;++n)s[e.charAt(n)]*=t;return s.normalize()},s.toString=function(){return s.a>=1?"rgb("+[s.r,s.g,s.b].join(",")+")":"rgba("+[s.r,s.g,s.b,s.a].join(",")+")"},s.normalize=function(){function e(e,t,n){return t<e?e:t>n?n:t}return s.r=e(0,parseInt(s.r),255),s.g=e(0,parseInt(s.g),255),s.b=e(0,parseInt(s.b),255),s.a=e(0,s.a,1),s},s.clone=function(){return e.color.make(s.r,s.b,s.g,s.a)},s.normalize()},e.color.extract=function(t,n){var r;do{r=t.css(n).toLowerCase();if(r!=""&&r!="transparent")break;t=t.parent()}while(!e.nodeName(t.get(0),"body"));return r=="rgba(0, 0, 0, 0)"&&(r="transparent"),e.color.parse(r)},e.color.parse=function(n){var r,i=e.color.make;if(r=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10));if(r=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10),parseFloat(r[4]));if(r=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55);if(r=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55,parseFloat(r[4]));if(r=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(n))return i(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16));if(r=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(n))return i(parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16));var s=e.trim(n).toLowerCase();return s=="transparent"?i(255,255,255,0):(r=t[s]||[0,0,0],i(r[0],r[1],r[2]))};var t={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery),function(e){function n(t,n){var r=n.children("."+t)[0];if(r==null){r=document.createElement("canvas"),r.className=t,e(r).css({direction:"ltr",position:"absolute",left:0,top:0}).appendTo(n);if(!r.getContext){if(!window.G_vmlCanvasManager)throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");r=window.G_vmlCanvasManager.initElement(r)}}this.element=r;var i=this.context=r.getContext("2d"),s=window.devicePixelRatio||1,o=i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1;this.pixelRatio=s/o,this.resize(n.width(),n.height()),this.textContainer=null,this.text={},this._textCache={}}function r(t,r,s,o){function E(e,t){t=[w].concat(t);for(var n=0;n<e.length;++n)e[n].apply(this,t)}function S(){var t={Canvas:n};for(var r=0;r<o.length;++r){var i=o[r];i.init(w,t),i.options&&e.extend(!0,a,i.options)}}function x(n){e.extend(!0,a,n),n&&n.colors&&(a.colors=n.colors),a.xaxis.color==null&&(a.xaxis.color=e.color.parse(a.grid.color).scale("a",.22).toString()),a.yaxis.color==null&&(a.yaxis.color=e.color.parse(a.grid.color).scale("a",.22).toString()),a.xaxis.tickColor==null&&(a.xaxis.tickColor=a.grid.tickColor||a.xaxis.color),a.yaxis.tickColor==null&&(a.yaxis.tickColor=a.grid.tickColor||a.yaxis.color),a.grid.borderColor==null&&(a.grid.borderColor=a.grid.color),a.grid.tickColor==null&&(a.grid.tickColor=e.color.parse(a.grid.color).scale("a",.22).toString());var r,i,s,o={style:t.css("font-style"),size:Math.round(.8*(+t.css("font-size").replace("px","")||13)),variant:t.css("font-variant"),weight:t.css("font-weight"),family:t.css("font-family")};o.lineHeight=o.size*1.15,s=a.xaxes.length||1;for(r=0;r<s;++r)i=a.xaxes[r],i&&!i.tickColor&&(i.tickColor=i.color),i=e.extend(!0,{},a.xaxis,i),a.xaxes[r]=i,i.font&&(i.font=e.extend({},o,i.font),i.font.color||(i.font.color=i.color));s=a.yaxes.length||1;for(r=0;r<s;++r)i=a.yaxes[r],i&&!i.tickColor&&(i.tickColor=i.color),i=e.extend(!0,{},a.yaxis,i),a.yaxes[r]=i,i.font&&(i.font=e.extend({},o,i.font),i.font.color||(i.font.color=i.color));a.xaxis.noTicks&&a.xaxis.ticks==null&&(a.xaxis.ticks=a.xaxis.noTicks),a.yaxis.noTicks&&a.yaxis.ticks==null&&(a.yaxis.ticks=a.yaxis.noTicks),a.x2axis&&(a.xaxes[1]=e.extend(!0,{},a.xaxis,a.x2axis),a.xaxes[1].position="top"),a.y2axis&&(a.yaxes[1]=e.extend(!0,{},a.yaxis,a.y2axis),a.yaxes[1].position="right"),a.grid.coloredAreas&&(a.grid.markings=a.grid.coloredAreas),a.grid.coloredAreasColor&&(a.grid.markingsColor=a.grid.coloredAreasColor),a.lines&&e.extend(!0,a.series.lines,a.lines),a.points&&e.extend(!0,a.series.points,a.points),a.bars&&e.extend(!0,a.series.bars,a.bars),a.shadowSize!=null&&(a.series.shadowSize=a.shadowSize),a.highlightColor!=null&&(a.series.highlightColor=a.highlightColor);for(r=0;r<a.xaxes.length;++r)O(d,r+1).options=a.xaxes[r];for(r=0;r<a.yaxes.length;++r)O(v,r+1).options=a.yaxes[r];for(var u in b)a.hooks[u]&&a.hooks[u].length&&(b[u]=b[u].concat(a.hooks[u]));E(b.processOptions,[a])}function T(e){u=N(e),M(),_()}function N(t){var n=[];for(var r=0;r<t.length;++r){var i=e.extend(!0,{},a.series);t[r].data!=null?(i.data=t[r].data,delete t[r].data,e.extend(!0,i,t[r]),t[r].data=i.data):i.data=t[r],n.push(i)}return n}function C(e,t){var n=e[t+"axis"];return typeof n=="object"&&(n=n.n),typeof n!="number"&&(n=1),n}function k(){return e.grep(d.concat(v),function(e){return e})}function L(e){var t={},n,r;for(n=0;n<d.length;++n)r=d[n],r&&r.used&&(t["x"+r.n]=r.c2p(e.left));for(n=0;n<v.length;++n)r=v[n],r&&r.used&&(t["y"+r.n]=r.c2p(e.top));return t.x1!==undefined&&(t.x=t.x1),t.y1!==undefined&&(t.y=t.y1),t}function A(e){var t={},n,r,i;for(n=0;n<d.length;++n){r=d[n];if(r&&r.used){i="x"+r.n,e[i]==null&&r.n==1&&(i="x");if(e[i]!=null){t.left=r.p2c(e[i]);break}}}for(n=0;n<v.length;++n){r=v[n];if(r&&r.used){i="y"+r.n,e[i]==null&&r.n==1&&(i="y");if(e[i]!=null){t.top=r.p2c(e[i]);break}}}return t}function O(t,n){return t[n-1]||(t[n-1]={n:n,direction:t==d?"x":"y",options:e.extend(!0,{},t==d?a.xaxis:a.yaxis)}),t[n-1]}function M(){var t=u.length,n=-1,r;for(r=0;r<u.length;++r){var i=u[r].color;i!=null&&(t--,typeof i=="number"&&i>n&&(n=i))}t<=n&&(t=n+1);var s,o=[],f=a.colors,l=f.length,c=0;for(r=0;r<t;r++)s=e.color.parse(f[r%l]||"#666"),r%l==0&&r&&(c>=0?c<.5?c=-c-.2:c=0:c=-c),o[r]=s.scale("rgb",1+c);var h=0,p;for(r=0;r<u.length;++r){p=u[r],p.color==null?(p.color=o[h].toString(),++h):typeof p.color=="number"&&(p.color=o[p.color].toString());if(p.lines.show==null){var m,g=!0;for(m in p)if(p[m]&&p[m].show){g=!1;break}g&&(p.lines.show=!0)}p.lines.zero==null&&(p.lines.zero=!!p.lines.fill),p.xaxis=O(d,C(p,"x")),p.yaxis=O(v,C(p,"y"))}}function _(){function x(e,t,n){t<e.datamin&&t!=-r&&(e.datamin=t),n>e.datamax&&n!=r&&(e.datamax=n)}var t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,r=Number.MAX_VALUE,i,s,o,a,f,l,c,h,p,d,v,m,g,y,w,S;e.each(k(),function(e,r){r.datamin=t,r.datamax=n,r.used=!1});for(i=0;i<u.length;++i)l=u[i],l.datapoints={points:[]},E(b.processRawData,[l,l.data,l.datapoints]);for(i=0;i<u.length;++i){l=u[i],w=l.data,S=l.datapoints.format;if(!S){S=[],S.push({x:!0,number:!0,required:!0}),S.push({y:!0,number:!0,required:!0});if(l.bars.show||l.lines.show&&l.lines.fill){var T=!!(l.bars.show&&l.bars.zero||l.lines.show&&l.lines.zero);S.push({y:!0,number:!0,required:!1,defaultValue:0,autoscale:T}),l.bars.horizontal&&(delete S[S.length-1].y,S[S.length-1].x=!0)}l.datapoints.format=S}if(l.datapoints.pointsize!=null)continue;l.datapoints.pointsize=S.length,h=l.datapoints.pointsize,c=l.datapoints.points;var N=l.lines.show&&l.lines.steps;l.xaxis.used=l.yaxis.used=!0;for(s=o=0;s<w.length;++s,o+=h){y=w[s];var C=y==null;if(!C)for(a=0;a<h;++a)m=y[a],g=S[a],g&&(g.number&&m!=null&&(m=+m,isNaN(m)?m=null:m==Infinity?m=r:m==-Infinity&&(m=-r)),m==null&&(g.required&&(C=!0),g.defaultValue!=null&&(m=g.defaultValue))),c[o+a]=m;if(C)for(a=0;a<h;++a)m=c[o+a],m!=null&&(g=S[a],g.autoscale&&(g.x&&x(l.xaxis,m,m),g.y&&x(l.yaxis,m,m))),c[o+a]=null;else if(N&&o>0&&c[o-h]!=null&&c[o-h]!=c[o]&&c[o-h+1]!=c[o+1]){for(a=0;a<h;++a)c[o+h+a]=c[o+a];c[o+1]=c[o-h+1],o+=h}}}for(i=0;i<u.length;++i)l=u[i],E(b.processDatapoints,[l,l.datapoints]);for(i=0;i<u.length;++i){l=u[i],c=l.datapoints.points,h=l.datapoints.pointsize,S=l.datapoints.format;var L=t,A=t,O=n,M=n;for(s=0;s<c.length;s+=h){if(c[s]==null)continue;for(a=0;a<h;++a){m=c[s+a],g=S[a];if(!g||g.autoscale===!1||m==r||m==-r)continue;g.x&&(m<L&&(L=m),m>O&&(O=m)),g.y&&(m<A&&(A=m),m>M&&(M=m))}}if(l.bars.show){var _;switch(l.bars.align){case"left":_=0;break;case"right":_=-l.bars.barWidth;break;case"center":_=-l.bars.barWidth/2;break;default:throw new Error("Invalid bar alignment: "+l.bars.align)}l.bars.horizontal?(A+=_,M+=_+l.bars.barWidth):(L+=_,O+=_+l.bars.barWidth)}x(l.xaxis,L,O),x(l.yaxis,A,M)}e.each(k(),function(e,r){r.datamin==t&&(r.datamin=null),r.datamax==n&&(r.datamax=null)})}function D(){t.css("padding",0).children(":not(.flot-base,.flot-overlay)").remove(),t.css("position")=="static"&&t.css("position","relative"),f=new n("flot-base",t),l=new n("flot-overlay",t),h=f.context,p=l.context,c=e(l.element).unbind();var r=t.data("plot");r&&(r.shutdown(),l.clear()),t.data("plot",w)}function P(){a.grid.hoverable&&(c.mousemove(at),c.bind("mouseleave",ft)),a.grid.clickable&&c.click(lt),E(b.bindEvents,[c])}function H(){ot&&clearTimeout(ot),c.unbind("mousemove",at),c.unbind("mouseleave",ft),c.unbind("click",lt),E(b.shutdown,[c])}function B(e){function t(e){return e}var n,r,i=e.options.transform||t,s=e.options.inverseTransform;e.direction=="x"?(n=e.scale=g/Math.abs(i(e.max)-i(e.min)),r=Math.min(i(e.max),i(e.min))):(n=e.scale=y/Math.abs(i(e.max)-i(e.min)),n=-n,r=Math.max(i(e.max),i(e.min))),i==t?e.p2c=function(e){return(e-r)*n}:e.p2c=function(e){return(i(e)-r)*n},s?e.c2p=function(e){return s(r+e/n)}:e.c2p=function(e){return r+e/n}}function j(e){var t=e.options,n=e.ticks||[],r=t.labelWidth||0,i=t.labelHeight||0,s=r||e.direction=="x"?Math.floor(f.width/(n.length||1)):null;legacyStyles=e.direction+"Axis "+e.direction+e.n+"Axis",layer="flot-"+e.direction+"-axis flot-"+e.direction+e.n+"-axis "+legacyStyles,font=t.font||"flot-tick-label tickLabel";for(var o=0;o<n.length;++o){var u=n[o];if(!u.label)continue;var a=f.getTextInfo(layer,u.label,font,null,s);r=Math.max(r,a.width),i=Math.max(i,a.height)}e.labelWidth=t.labelWidth||r,e.labelHeight=t.labelHeight||i}function F(t){var n=t.labelWidth,r=t.labelHeight,i=t.options.position,s=t.options.tickLength,o=a.grid.axisMargin,u=a.grid.labelMargin,l=t.direction=="x"?d:v,c,h,p=e.grep(l,function(e){return e&&e.options.position==i&&e.reserveSpace});e.inArray(t,p)==p.length-1&&(o=0);if(s==null){var g=e.grep(l,function(e){return e&&e.reserveSpace});h=e.inArray(t,g)==0,h?s="full":s=5}isNaN(+s)||(u+=+s),t.direction=="x"?(r+=u,i=="bottom"?(m.bottom+=r+o,t.box={top:f.height-m.bottom,height:r}):(t.box={top:m.top+o,height:r},m.top+=r+o)):(n+=u,i=="left"?(t.box={left:m.left+o,width:n},m.left+=n+o):(m.right+=n+o,t.box={left:f.width-m.right,width:n})),t.position=i,t.tickLength=s,t.box.padding=u,t.innermost=h}function I(e){e.direction=="x"?(e.box.left=m.left-e.labelWidth/2,e.box.width=f.width-m.left-m.right+e.labelWidth):(e.box.top=m.top-e.labelHeight/2,e.box.height=f.height-m.bottom-m.top+e.labelHeight)}function q(){var t=a.grid.minBorderMargin,n={x:0,y:0},r,i;if(t==null){t=0;for(r=0;r<u.length;++r)t=Math.max(t,2*(u[r].points.radius+u[r].points.lineWidth/2))}n.x=n.y=Math.ceil(t),e.each(k(),function(e,t){var r=t.direction;t.reserveSpace&&(n[r]=Math.ceil(Math.max(n[r],(r=="x"?t.labelWidth:t.labelHeight)/2)))}),m.left=Math.max(n.x,m.left),m.right=Math.max(n.x,m.right),m.top=Math.max(n.y,m.top),m.bottom=Math.max(n.y,m.bottom)}function R(){var t,n=k(),r=a.grid.show;for(var i in m){var s=a.grid.margin||0;m[i]=typeof s=="number"?s:s[i]||0}E(b.processOffset,[m]);for(var i in m)typeof a.grid.borderWidth=="object"?m[i]+=r?a.grid.borderWidth[i]:0:m[i]+=r?a.grid.borderWidth:0;e.each(n,function(e,t){t.show=t.options.show,t.show==null&&(t.show=t.used),t.reserveSpace=t.show||t.options.reserveSpace,U(t)});if(r){var o=e.grep(n,function(e){return e.reserveSpace});e.each(o,function(e,t){z(t),W(t),X(t,t.ticks),j(t)});for(t=o.length-1;t>=0;--t)F(o[t]);q(),e.each(o,function(e,t){I(t)})}g=f.width-m.left-m.right,y=f.height-m.bottom-m.top,e.each(n,function(e,t){B(t)}),r&&G(),it()}function U(e){var t=e.options,n=+(t.min!=null?t.min:e.datamin),r=+(t.max!=null?t.max:e.datamax),i=r-n;if(i==0){var s=r==0?1:.01;t.min==null&&(n-=s);if(t.max==null||t.min!=null)r+=s}else{var o=t.autoscaleMargin;o!=null&&(t.min==null&&(n-=i*o,n<0&&e.datamin!=null&&e.datamin>=0&&(n=0)),t.max==null&&(r+=i*o,r>0&&e.datamax!=null&&e.datamax<=0&&(r=0)))}e.min=n,e.max=r}function z(t){var n=t.options,r;typeof n.ticks=="number"&&n.ticks>0?r=n.ticks:r=.3*Math.sqrt(t.direction=="x"?f.width:f.height);var s=(t.max-t.min)/r,o=-Math.floor(Math.log(s)/Math.LN10),u=n.tickDecimals;u!=null&&o>u&&(o=u);var a=Math.pow(10,-o),l=s/a,c;l<1.5?c=1:l<3?(c=2,l>2.25&&(u==null||o+1<=u)&&(c=2.5,++o)):l<7.5?c=5:c=10,c*=a,n.minTickSize!=null&&c<n.minTickSize&&(c=n.minTickSize),t.delta=s,t.tickDecimals=Math.max(0,u!=null?u:o),t.tickSize=n.tickSize||c;if(n.mode=="time"&&!t.tickGenerator)throw new Error("Time mode requires the flot.time plugin.");t.tickGenerator||(t.tickGenerator=function(e){var t=[],n=i(e.min,e.tickSize),r=0,s=Number.NaN,o;do o=s,s=n+r*e.tickSize,t.push(s),++r;while(s<e.max&&s!=o);return t},t.tickFormatter=function(e,t){var n=t.tickDecimals?Math.pow(10,t.tickDecimals):1,r=""+Math.round(e*n)/n;if(t.tickDecimals!=null){var i=r.indexOf("."),s=i==-1?0:r.length-i-1;if(s<t.tickDecimals)return(s?r:r+".")+(""+n).substr(1,t.tickDecimals-s)}return r}),e.isFunction(n.tickFormatter)&&(t.tickFormatter=function(e,t){return""+n.tickFormatter(e,t)});if(n.alignTicksWithAxis!=null){var h=(t.direction=="x"?d:v)[n.alignTicksWithAxis-1];if(h&&h.used&&h!=t){var p=t.tickGenerator(t);p.length>0&&(n.min==null&&(t.min=Math.min(t.min,p[0])),n.max==null&&p.length>1&&(t.max=Math.max(t.max,p[p.length-1]))),t.tickGenerator=function(e){var t=[],n,r;for(r=0;r<h.ticks.length;++r)n=(h.ticks[r].v-h.min)/(h.max-h.min),n=e.min+n*(e.max-e.min),t.push(n);return t};if(!t.mode&&n.tickDecimals==null){var m=Math.max(0,-Math.floor(Math.log(t.delta)/Math.LN10)+1),g=t.tickGenerator(t);g.length>1&&/\..*0$/.test((g[1]-g[0]).toFixed(m))||(t.tickDecimals=m)}}}}function W(t){var n=t.options.ticks,r=[];n==null||typeof n=="number"&&n>0?r=t.tickGenerator(t):n&&(e.isFunction(n)?r=n(t):r=n);var i,s;t.ticks=[];for(i=0;i<r.length;++i){var o=null,u=r[i];typeof u=="object"?(s=+u[0],u.length>1&&(o=u[1])):s=+u,o==null&&(o=t.tickFormatter(s,t)),isNaN(s)||t.ticks.push({v:s,label:o})}}function X(e,t){e.options.autoscaleMargin&&t.length>0&&(e.options.min==null&&(e.min=Math.min(e.min,t[0].v)),e.options.max==null&&t.length>1&&(e.max=Math.max(e.max,t[t.length-1].v)))}function V(){f.clear(),E(b.drawBackground,[h]);var e=a.grid;e.show&&e.backgroundColor&&K(),e.show&&!e.aboveData&&Q();for(var t=0;t<u.length;++t)E(b.drawSeries,[h,u[t]]),Y(u[t]);E(b.draw,[h]),e.show&&e.aboveData&&Q(),f.render(),ht()}function J(e,t){var n,r,i,s,o=k();for(var u=0;u<o.length;++u){n=o[u];if(n.direction==t){s=t+n.n+"axis",!e[s]&&n.n==1&&(s=t+"axis");if(e[s]){r=e[s].from,i=e[s].to;break}}}e[s]||(n=t=="x"?d[0]:v[0],r=e[t+"1"],i=e[t+"2"]);if(r!=null&&i!=null&&r>i){var a=r;r=i,i=a}return{from:r,to:i,axis:n}}function K(){h.save(),h.translate(m.left,m.top),h.fillStyle=bt(a.grid.backgroundColor,y,0,"rgba(255, 255, 255, 0)"),h.fillRect(0,0,g,y),h.restore()}function Q(){var t,n,r,i;h.save(),h.translate(m.left,m.top);var s=a.grid.markings;if(s){e.isFunction(s)&&(n=w.getAxes(),n.xmin=n.xaxis.min,n.xmax=n.xaxis.max,n.ymin=n.yaxis.min,n.ymax=n.yaxis.max,s=s(n));for(t=0;t<s.length;++t){var o=s[t],u=J(o,"x"),f=J(o,"y");u.from==null&&(u.from=u.axis.min),u.to==null&&(u.to=u.axis.max),f.from==null&&(f.from=f.axis.min),f.to==null&&(f.to=f.axis.max);if(u.to<u.axis.min||u.from>u.axis.max||f.to<f.axis.min||f.from>f.axis.max)continue;u.from=Math.max(u.from,u.axis.min),u.to=Math.min(u.to,u.axis.max),f.from=Math.max(f.from,f.axis.min),f.to=Math.min(f.to,f.axis.max);if(u.from==u.to&&f.from==f.to)continue;u.from=u.axis.p2c(u.from),u.to=u.axis.p2c(u.to),f.from=f.axis.p2c(f.from),f.to=f.axis.p2c(f.to),u.from==u.to||f.from==f.to?(h.beginPath(),h.strokeStyle=o.color||a.grid.markingsColor,h.lineWidth=o.lineWidth||a.grid.markingsLineWidth,h.moveTo(u.from,f.from),h.lineTo(u.to,f.to),h.stroke()):(h.fillStyle=o.color||a.grid.markingsColor,h.fillRect(u.from,f.to,u.to-u.from,f.from-f.to))}}n=k(),r=a.grid.borderWidth;for(var l=0;l<n.length;++l){var c=n[l],p=c.box,d=c.tickLength,v,b,E,S;if(!c.show||c.ticks.length==0)continue;h.lineWidth=1,c.direction=="x"?(v=0,d=="full"?b=c.position=="top"?0:y:b=p.top-m.top+(c.position=="top"?p.height:0)):(b=0,d=="full"?v=c.position=="left"?0:g:v=p.left-m.left+(c.position=="left"?p.width:0)),c.innermost||(h.strokeStyle=c.options.color,h.beginPath(),E=S=0,c.direction=="x"?E=g+1:S=y+1,h.lineWidth==1&&(c.direction=="x"?b=Math.floor(b)+.5:v=Math.floor(v)+.5),h.moveTo(v,b),h.lineTo(v+E,b+S),h.stroke()),h.strokeStyle=c.options.tickColor,h.beginPath();for(t=0;t<c.ticks.length;++t){var x=c.ticks[t].v;E=S=0;if(isNaN(x)||x<c.min||x>c.max||d=="full"&&(typeof r=="object"&&r[c.position]>0||r>0)&&(x==c.min||x==c.max))continue;c.direction=="x"?(v=c.p2c(x),S=d=="full"?-y:d,c.position=="top"&&(S=-S)):(b=c.p2c(x),E=d=="full"?-g:d,c.position=="left"&&(E=-E)),h.lineWidth==1&&(c.direction=="x"?v=Math.floor(v)+.5:b=Math.floor(b)+.5),h.moveTo(v,b),h.lineTo(v+E,b+S)}h.stroke()}r&&(i=a.grid.borderColor,typeof r=="object"||typeof i=="object"?(typeof r!="object"&&(r={top:r,right:r,bottom:r,left:r}),typeof i!="object"&&(i={top:i,right:i,bottom:i,left:i}),r.top>0&&(h.strokeStyle=i.top,h.lineWidth=r.top,h.beginPath(),h.moveTo(0-r.left,0-r.top/2),h.lineTo(g,0-r.top/2),h.stroke()),r.right>0&&(h.strokeStyle=i.right,h.lineWidth=r.right,h.beginPath(),h.moveTo(g+r.right/2,0-r.top),h.lineTo(g+r.right/2,y),h.stroke()),r.bottom>0&&(h.strokeStyle=i.bottom,h.lineWidth=r.bottom,h.beginPath(),h.moveTo(g+r.right,y+r.bottom/2),h.lineTo(0,y+r.bottom/2),h.stroke()),r.left>0&&(h.strokeStyle=i.left,h.lineWidth=r.left,h.beginPath(),h.moveTo(0-r.left/2,y+r.bottom),h.lineTo(0-r.left/2,0),h.stroke())):(h.lineWidth=r,h.strokeStyle=a.grid.borderColor,h.strokeRect(-r/2,-r/2,g+r,y+r))),h.restore()}function G(){e.each(k(),function(e,t){if(!t.show||t.ticks.length==0)return;var n=t.box,r=t.direction+"Axis "+t.direction+t.n+"Axis",i="flot-"+t.direction+"-axis flot-"+t.direction+t.n+"-axis "+r,s=t.options.font||"flot-tick-label tickLabel",o,u,a,l,c;f.removeText(i);for(var h=0;h<t.ticks.length;++h){o=t.ticks[h];if(!o.label||o.v<t.min||o.v>t.max)continue;t.direction=="x"?(l="center",u=m.left+t.p2c(o.v),t.position=="bottom"?a=n.top+n.padding:(a=n.top+n.height-n.padding,c="bottom")):(c="middle",a=m.top+t.p2c(o.v),t.position=="left"?(u=n.left+n.width-n.padding,l="right"):u=n.left+n.padding),f.addText(i,u,a,o.label,s,null,null,l,c)}})}function Y(e){e.lines.show&&Z(e),e.bars.show&&nt(e),e.points.show&&et(e)}function Z(e){function t(e,t,n,r,i){var s=e.points,o=e.pointsize,u=null,a=null;h.beginPath();for(var f=o;f<s.length;f+=o){var l=s[f-o],c=s[f-o+1],p=s[f],d=s[f+1];if(l==null||p==null)continue;if(c<=d&&c<i.min){if(d<i.min)continue;l=(i.min-c)/(d-c)*(p-l)+l,c=i.min}else if(d<=c&&d<i.min){if(c<i.min)continue;p=(i.min-c)/(d-c)*(p-l)+l,d=i.min}if(c>=d&&c>i.max){if(d>i.max)continue;l=(i.max-c)/(d-c)*(p-l)+l,c=i.max}else if(d>=c&&d>i.max){if(c>i.max)continue;p=(i.max-c)/(d-c)*(p-l)+l,d=i.max}if(l<=p&&l<r.min){if(p<r.min)continue;c=(r.min-l)/(p-l)*(d-c)+c,l=r.min}else if(p<=l&&p<r.min){if(l<r.min)continue;d=(r.min-l)/(p-l)*(d-c)+c,p=r.min}if(l>=p&&l>r.max){if(p>r.max)continue;c=(r.max-l)/(p-l)*(d-c)+c,l=r.max}else if(p>=l&&p>r.max){if(l>r.max)continue;d=(r.max-l)/(p-l)*(d-c)+c,p=r.max}(l!=u||c!=a)&&h.moveTo(r.p2c(l)+t,i.p2c(c)+n),u=p,a=d,h.lineTo(r.p2c(p)+t,i.p2c(d)+n)}h.stroke()}function n(e,t,n){var r=e.points,i=e.pointsize,s=Math.min(Math.max(0,n.min),n.max),o=0,u,a=!1,f=1,l=0,c=0;for(;;){if(i>0&&o>r.length+i)break;o+=i;var p=r[o-i],d=r[o-i+f],v=r[o],m=r[o+f];if(a){if(i>0&&p!=null&&v==null){c=o,i=-i,f=2;continue}if(i<0&&o==l+i){h.fill(),a=!1,i=-i,f=1,o=l=c+i;continue}}if(p==null||v==null)continue;if(p<=v&&p<t.min){if(v<t.min)continue;d=(t.min-p)/(v-p)*(m-d)+d,p=t.min}else if(v<=p&&v<t.min){if(p<t.min)continue;m=(t.min-p)/(v-p)*(m-d)+d,v=t.min}if(p>=v&&p>t.max){if(v>t.max)continue;d=(t.max-p)/(v-p)*(m-d)+d,p=t.max}else if(v>=p&&v>t.max){if(p>t.max)continue;m=(t.max-p)/(v-p)*(m-d)+d,v=t.max}a||(h.beginPath(),h.moveTo(t.p2c(p),n.p2c(s)),a=!0);if(d>=n.max&&m>=n.max){h.lineTo(t.p2c(p),n.p2c(n.max)),h.lineTo(t.p2c(v),n.p2c(n.max));continue}if(d<=n.min&&m<=n.min){h.lineTo(t.p2c(p),n.p2c(n.min)),h.lineTo(t.p2c(v),n.p2c(n.min));continue}var g=p,y=v;d<=m&&d<n.min&&m>=n.min?(p=(n.min-d)/(m-d)*(v-p)+p,d=n.min):m<=d&&m<n.min&&d>=n.min&&(v=(n.min-d)/(m-d)*(v-p)+p,m=n.min),d>=m&&d>n.max&&m<=n.max?(p=(n.max-d)/(m-d)*(v-p)+p,d=n.max):m>=d&&m>n.max&&d<=n.max&&(v=(n.max-d)/(m-d)*(v-p)+p,m=n.max),p!=g&&h.lineTo(t.p2c(g),n.p2c(d)),h.lineTo(t.p2c(p),n.p2c(d)),h.lineTo(t.p2c(v),n.p2c(m)),v!=y&&(h.lineTo(t.p2c(v),n.p2c(m)),h.lineTo(t.p2c(y),n.p2c(m)))}}h.save(),h.translate(m.left,m.top),h.lineJoin="round";var r=e.lines.lineWidth,i=e.shadowSize;if(r>0&&i>0){h.lineWidth=i,h.strokeStyle="rgba(0,0,0,0.1)";var s=Math.PI/18;t(e.datapoints,Math.sin(s)*(r/2+i/2),Math.cos(s)*(r/2+i/2),e.xaxis,e.yaxis),h.lineWidth=i/2,t(e.datapoints,Math.sin(s)*(r/2+i/4),Math.cos(s)*(r/2+i/4),e.xaxis,e.yaxis)}h.lineWidth=r,h.strokeStyle=e.color;var o=rt(e.lines,e.color,0,y);o&&(h.fillStyle=o,n(e.datapoints,e.xaxis,e.yaxis)),r>0&&t(e.datapoints,0,0,e.xaxis,e.yaxis),h.restore()}function et(e){function t(e,t,n,r,i,s,o,u){var a=e.points,f=e.pointsize;for(var l=0;l<a.length;l+=f){var c=a[l],p=a[l+1];if(c==null||c<s.min||c>s.max||p<o.min||p>o.max)continue;h.beginPath(),c=s.p2c(c),p=o.p2c(p)+r,u=="circle"?h.arc(c,p,t,0,i?Math.PI:Math.PI*2,!1):u(h,c,p,t,i),h.closePath(),n&&(h.fillStyle=n,h.fill()),h.stroke()}}h.save(),h.translate(m.left,m.top);var n=e.points.lineWidth,r=e.shadowSize,i=e.points.radius,s=e.points.symbol;n==0&&(n=1e-4);if(n>0&&r>0){var o=r/2;h.lineWidth=o,h.strokeStyle="rgba(0,0,0,0.1)",t(e.datapoints,i,null,o+o/2,!0,e.xaxis,e.yaxis,s),h.strokeStyle="rgba(0,0,0,0.2)",t(e.datapoints,i,null,o/2,!0,e.xaxis,e.yaxis,s)}h.lineWidth=n,h.strokeStyle=e.color,t(e.datapoints,i,rt(e.points,e.color),0,!1,e.xaxis,e.yaxis,s),h.restore()}function tt(e,t,n,r,i,s,o,u,a,f,l,c){var h,p,d,v,m,g,y,b,w;l?(b=g=y=!0,m=!1,h=n,p=e,v=t+r,d=t+i,p<h&&(w=p,p=h,h=w,m=!0,g=!1)):(m=g=y=!0,b=!1,h=e+r,p=e+i,d=n,v=t,v<d&&(w=v,v=d,d=w,b=!0,y=!1));if(p<u.min||h>u.max||v<a.min||d>a.max)return;h<u.min&&(h=u.min,m=!1),p>u.max&&(p=u.max,g=!1),d<a.min&&(d=a.min,b=!1),v>a.max&&(v=a.max,y=!1),h=u.p2c(h),d=a.p2c(d),p=u.p2c(p),v=a.p2c(v),o&&(f.beginPath(),f.moveTo(h,d),f.lineTo(h,v),f.lineTo(p,v),f.lineTo(p,d),f.fillStyle=o(d,v),f.fill()),c>0&&(m||g||y||b)&&(f.beginPath(),f.moveTo(h,d+s),m?f.lineTo(h,v+s):f.moveTo(h,v+s),y?f.lineTo(p,v+s):f.moveTo(p,v+s),g?f.lineTo(p,d+s):f.moveTo(p,d+s),b?f.lineTo(h,d+s):f.moveTo(h,d+s),f.stroke())}function nt(e){function t(t,n,r,i,s,o,u){var a=t.points,f=t.pointsize;for(var l=0;l<a.length;l+=f){if(a[l]==null)continue;tt(a[l],a[l+1],a[l+2],n,r,i,s,o,u,h,e.bars.horizontal,e.bars.lineWidth)}}h.save(),h.translate(m.left,m.top),h.lineWidth=e.bars.lineWidth,h.strokeStyle=e.color;var n;switch(e.bars.align){case"left":n=0;break;case"right":n=-e.bars.barWidth;break;case"center":n=-e.bars.barWidth/2;break;default:throw new Error("Invalid bar alignment: "+e.bars.align)}var r=e.bars.fill?function(t,n){return rt(e.bars,e.color,t,n)}:null;t(e.datapoints,n,n+e.bars.barWidth,0,r,e.xaxis,e.yaxis),h.restore()}function rt(t,n,r,i){var s=t.fill;if(!s)return null;if(t.fillColor)return bt(t.fillColor,r,i,n);var o=e.color.parse(n);return o.a=typeof s=="number"?s:.4,o.normalize(),o.toString()}function it(){t.find(".legend").remove();if(!a.legend.show)return;var n=[],r=[],i=!1,s=a.legend.labelFormatter,o,f;for(var l=0;l<u.length;++l)o=u[l],o.label&&(f=s?s(o.label,o):o.label,f&&r.push({label:f,color:o.color}));if(a.legend.sorted)if(e.isFunction(a.legend.sorted))r.sort(a.legend.sorted);else if(a.legend.sorted=="reverse")r.reverse();else{var c=a.legend.sorted!="descending";r.sort(function(e,t){return e.label==t.label?0:e.label<t.label!=c?1:-1})}for(var l=0;l<r.length;++l){var h=r[l];l%a.legend.noColumns==0&&(i&&n.push("</tr>"),n.push("<tr>"),i=!0),n.push('<td class="legendColorBox"><div style="border:1px solid '+a.legend.labelBoxBorderColor+';padding:1px"><div style="width:4px;height:0;border:5px solid '+h.color+';overflow:hidden"></div></div></td>'+'<td class="legendLabel">'+h.label+"</td>")}i&&n.push("</tr>");if(n.length==0)return;var p='<table style="font-size:smaller;color:'+a.grid.color+'">'+n.join("")+"</table>";if(a.legend.container!=null)e(a.legend.container).html(p);else{var d="",v=a.legend.position,g=a.legend.margin;g[0]==null&&(g=[g,g]),v.charAt(0)=="n"?d+="top:"+(g[1]+m.top)+"px;":v.charAt(0)=="s"&&(d+="bottom:"+(g[1]+m.bottom)+"px;"),v.charAt(1)=="e"?d+="right:"+(g[0]+m.right)+"px;":v.charAt(1)=="w"&&(d+="left:"+(g[0]+m.left)+"px;");var y=e('<div class="legend">'+p.replace('style="','style="position:absolute;'+d+";")+"</div>").appendTo(t);if(a.legend.backgroundOpacity!=0){var b=a.legend.backgroundColor;b==null&&(b=a.grid.backgroundColor,b&&typeof b=="string"?b=e.color.parse(b):b=e.color.extract(y,"background-color"),b.a=1,b=b.toString());var w=y.children();e('<div style="position:absolute;width:'+w.width()+"px;height:"+w.height()+"px;"+d+"background-color:"+b+';"> </div>').prependTo(y).css("opacity",a.legend.backgroundOpacity)}}}function ut(e,t,n){var r=a.grid.mouseActiveRadius,i=r*r+1,s=null,o=!1,f,l,c;for(f=u.length-1;f>=0;--f){if(!n(u[f]))continue;var h=u[f],p=h.xaxis,d=h.yaxis,v=h.datapoints.points,m=p.c2p(e),g=d.c2p(t),y=r/p.scale,b=r/d.scale;c=h.datapoints.pointsize,p.options.inverseTransform&&(y=Number.MAX_VALUE),d.options.inverseTransform&&(b=Number.MAX_VALUE);if(h.lines.show||h.points.show)for(l=0;l<v.length;l+=c){var w=v[l],E=v[l+1];if(w==null)continue;if(w-m>y||w-m<-y||E-g>b||E-g<-b)continue;var S=Math.abs(p.p2c(w)-e),x=Math.abs(d.p2c(E)-t),T=S*S+x*x;T<i&&(i=T,s=[f,l/c])}if(h.bars.show&&!s){var N=h.bars.align=="left"?0:-h.bars.barWidth/2,C=N+h.bars.barWidth;for(l=0;l<v.length;l+=c){var w=v[l],E=v[l+1],k=v[l+2];if(w==null)continue;if(u[f].bars.horizontal?m<=Math.max(k,w)&&m>=Math.min(k,w)&&g>=E+N&&g<=E+C:m>=w+N&&m<=w+C&&g>=Math.min(k,E)&&g<=Math.max(k,E))s=[f,l/c]}}}return s?(f=s[0],l=s[1],c=u[f].datapoints.pointsize,{datapoint:u[f].datapoints.points.slice(l*c,(l+1)*c),dataIndex:l,series:u[f],seriesIndex:f}):null}function at(e){a.grid.hoverable&&ct("plothover",e,function(e){return e["hoverable"]!=0})}function ft(e){a.grid.hoverable&&ct("plothover",e,function(e){return!1})}function lt(e){ct("plotclick",e,function(e){return e["clickable"]!=0})}function ct(e,n,r){var i=c.offset(),s=n.pageX-i.left-m.left,o=n.pageY-i.top-m.top,u=L({left:s,top:o});u.pageX=n.pageX,u.pageY=n.pageY;var f=ut(s,o,r);f&&(f.pageX=parseInt(f.series.xaxis.p2c(f.datapoint[0])+i.left+m.left,10),f.pageY=parseInt(f.series.yaxis.p2c(f.datapoint[1])+i.top+m.top,10));if(a.grid.autoHighlight){for(var l=0;l<st.length;++l){var h=st[l];h.auto==e&&(!f||h.series!=f.series||h.point[0]!=f.datapoint[0]||h.point[1]!=f.datapoint[1])&&vt(h.series,h.point)}f&&dt(f.series,f.datapoint,e)}t.trigger(e,[u,f])}function ht(){var e=a.interaction.redrawOverlayInterval;if(e==-1){pt();return}ot||(ot=setTimeout(pt,e))}function pt(){ot=null,p.save(),l.clear(),p.translate(m.left,m.top);var e,t;for(e=0;e<st.length;++e)t=st[e],t.series.bars.show?yt(t.series,t.point):gt(t.series,t.point);p.restore(),E(b.drawOverlay,[p])}function dt(e,t,n){typeof e=="number"&&(e=u[e]);if(typeof t=="number"){var r=e.datapoints.pointsize;t=e.datapoints.points.slice(r*t,r*(t+1))}var i=mt(e,t);i==-1?(st.push({series:e,point:t,auto:n}),ht()):n||(st[i].auto=!1)}function vt(e,t){if(e==null&&t==null){st=[],ht();return}typeof e=="number"&&(e=u[e]);if(typeof t=="number"){var n=e.datapoints.pointsize;t=e.datapoints.points.slice(n*t,n*(t+1))}var r=mt(e,t);r!=-1&&(st.splice(r,1),ht())}function mt(e,t){for(var n=0;n<st.length;++n){var r=st[n];if(r.series==e&&r.point[0]==t[0]&&r.point[1]==t[1])return n}return-1}function gt(t,n){var r=n[0],i=n[1],s=t.xaxis,o=t.yaxis,u=typeof t.highlightColor=="string"?t.highlightColor:e.color.parse(t.color).scale("a",.5).toString();if(r<s.min||r>s.max||i<o.min||i>o.max)return;var a=t.points.radius+t.points.lineWidth/2;p.lineWidth=a,p.strokeStyle=u;var f=1.5*a;r=s.p2c(r),i=o.p2c(i),p.beginPath(),t.points.symbol=="circle"?p.arc(r,i,f,0,2*Math.PI,!1):t.points.symbol(p,r,i,f,!1),p.closePath(),p.stroke()}function yt(t,n){var r=typeof t.highlightColor=="string"?t.highlightColor:e.color.parse(t.color).scale("a",.5).toString(),i=r,s=t.bars.align=="left"?0:-t.bars.barWidth/2;p.lineWidth=t.bars.lineWidth,p.strokeStyle=r,tt(n[0],n[1],n[2]||0,s,s+t.bars.barWidth,0,function(){return i},t.xaxis,t.yaxis,p,t.bars.horizontal,t.bars.lineWidth)}function bt(t,n,r,i){if(typeof t=="string")return t;var s=h.createLinearGradient(0,r,0,n);for(var o=0,u=t.colors.length;o<u;++o){var a=t.colors[o];if(typeof a!="string"){var f=e.color.parse(i);a.brightness!=null&&(f=f.scale("rgb",a.brightness)),a.opacity!=null&&(f.a*=a.opacity),a=f.toString()}s.addColorStop(o/(u-1),a)}return s}var u=[],a={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:!0,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:.85,sorted:null},xaxis:{show:null,position:"bottom",mode:null,font:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null},yaxis:{autoscaleMargin:.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:!1,radius:3,lineWidth:2,fill:!0,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:!1,fillColor:null,steps:!1},bars:{show:!1,lineWidth:2,barWidth:1,fill:!0,fillColor:null,align:"left",horizontal:!1,zero:!0},shadowSize:3,highlightColor:null},grid:{show:!0,aboveData:!1,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,margin:0,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:!1,hoverable:!1,autoHighlight:!0,mouseActiveRadius:10},interaction:{redrawOverlayInterval:1e3/60},hooks:{}},f=null,l=null,c=null,h=null,p=null,d=[],v=[],m={left:0,right:0,top:0,bottom
-:0},g=0,y=0,b={processOptions:[],processRawData:[],processDatapoints:[],processOffset:[],drawBackground:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},w=this;w.setData=T,w.setupGrid=R,w.draw=V,w.getPlaceholder=function(){return t},w.getCanvas=function(){return f.element},w.getPlotOffset=function(){return m},w.width=function(){return g},w.height=function(){return y},w.offset=function(){var e=c.offset();return e.left+=m.left,e.top+=m.top,e},w.getData=function(){return u},w.getAxes=function(){var t={},n;return e.each(d.concat(v),function(e,n){n&&(t[n.direction+(n.n!=1?n.n:"")+"axis"]=n)}),t},w.getXAxes=function(){return d},w.getYAxes=function(){return v},w.c2p=L,w.p2c=A,w.getOptions=function(){return a},w.highlight=dt,w.unhighlight=vt,w.triggerRedrawOverlay=ht,w.pointOffset=function(e){return{left:parseInt(d[C(e,"x")-1].p2c(+e.x)+m.left,10),top:parseInt(v[C(e,"y")-1].p2c(+e.y)+m.top,10)}},w.shutdown=H,w.resize=function(){var e=t.width(),n=t.height();f.resize(e,n),l.resize(e,n)},w.hooks=b,S(w),x(s),D(),T(r),R(),V(),P();var st=[],ot=null}function i(e,t){return t*Math.floor(e/t)}var t=Object.prototype.hasOwnProperty;n.prototype.resize=function(e,t){if(e<=0||t<=0)throw new Error("Invalid dimensions for plot, width = "+e+", height = "+t);var n=this.element,r=this.context,i=this.pixelRatio;this.width!=e&&(n.width=e*i,n.style.width=e+"px",this.width=e),this.height!=t&&(n.height=t*i,n.style.height=t+"px",this.height=t),r.restore(),r.save(),r.scale(i,i)},n.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)},n.prototype.render=function(){var e=this._textCache;for(var n in e)if(t.call(e,n)){var r=this.getTextLayer(n),i=e[n];r.hide();for(var s in i)if(t.call(i,s)){var o=i[s];for(var u in o)if(t.call(o,u)){var a=o[u].positions;for(var f=0,l;l=a[f];f++)l.active?l.rendered||(r.append(l.element),l.rendered=!0):(a.splice(f--,1),l.rendered&&l.element.detach());a.length==0&&delete o[u]}}r.show()}},n.prototype.getTextLayer=function(t){var n=this.text[t];return n==null&&(this.textContainer==null&&(this.textContainer=e("<div class='flot-text'></div>").css({position:"absolute",top:0,left:0,bottom:0,right:0,"font-size":"smaller",color:"#545454"}).insertAfter(this.element)),n=this.text[t]=e("<div></div>").addClass(t).css({position:"absolute",top:0,left:0,bottom:0,right:0}).appendTo(this.textContainer)),n},n.prototype.getTextInfo=function(t,n,r,i,s){var o,u,a,f;n=""+n,typeof r=="object"?o=r.style+" "+r.variant+" "+r.weight+" "+r.size+"px/"+r.lineHeight+"px "+r.family:o=r,u=this._textCache[t],u==null&&(u=this._textCache[t]={}),a=u[o],a==null&&(a=u[o]={}),f=a[n];if(f==null){var l=e("<div></div>").html(n).css({position:"absolute","max-width":s,top:-9999}).appendTo(this.getTextLayer(t));typeof r=="object"?l.css({font:o,color:r.color}):typeof r=="string"&&l.addClass(r),f=a[n]={width:l.outerWidth(!0),height:l.outerHeight(!0),element:l,positions:[]},l.detach()}return f},n.prototype.addText=function(e,t,n,r,i,s,o,u,a){var f=this.getTextInfo(e,r,i,s,o),l=f.positions;u=="center"?t-=f.width/2:u=="right"&&(t-=f.width),a=="middle"?n-=f.height/2:a=="bottom"&&(n-=f.height);for(var c=0,h;h=l[c];c++)if(h.x==t&&h.y==n){h.active=!0;return}h={active:!0,rendered:!1,element:l.length?f.element.clone():f.element,x:t,y:n},l.push(h),h.element.css({top:Math.round(n),left:Math.round(t),"text-align":u})},n.prototype.removeText=function(e,n,r,i,s,o){if(i==null){var u=this._textCache[e];if(u!=null)for(var a in u)if(t.call(u,a)){var f=u[a];for(var l in f)if(t.call(f,l)){var c=f[l].positions;for(var h=0,p;p=c[h];h++)p.active=!1}}}else{var c=this.getTextInfo(e,i,s,o).positions;for(var h=0,p;p=c[h];h++)p.x==n&&p.y==r&&(p.active=!1)}},e.plot=function(t,n,i){var s=new r(e(t),n,i,e.plot.plugins);return s},e.plot.version="0.8.1",e.plot.plugins=[],e.fn.plot=function(t,n){return this.each(function(){e.plot(this,t,n)})}}(jQuery); \ No newline at end of file
+ */
+(function(b){b.color={};b.color.make=function(d,e,g,f){var c={};c.r=d||0;c.g=e||0;c.b=g||0;c.a=f!=null?f:1;c.add=function(h,j){for(var k=0;k<h.length;++k){c[h.charAt(k)]+=j}return c.normalize()};c.scale=function(h,j){for(var k=0;k<h.length;++k){c[h.charAt(k)]*=j}return c.normalize()};c.toString=function(){if(c.a>=1){return"rgb("+[c.r,c.g,c.b].join(",")+")"}else{return"rgba("+[c.r,c.g,c.b,c.a].join(",")+")"}};c.normalize=function(){function h(k,j,l){return j<k?k:(j>l?l:j)}c.r=h(0,parseInt(c.r),255);c.g=h(0,parseInt(c.g),255);c.b=h(0,parseInt(c.b),255);c.a=h(0,c.a,1);return c};c.clone=function(){return b.color.make(c.r,c.b,c.g,c.a)};return c.normalize()};b.color.extract=function(d,e){var c;do{c=d.css(e).toLowerCase();if(c!=""&&c!="transparent"){break}d=d.parent()}while(!b.nodeName(d.get(0),"body"));if(c=="rgba(0, 0, 0, 0)"){c="transparent"}return b.color.parse(c)};b.color.parse=function(c){var d,f=b.color.make;if(d=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10))}if(d=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10),parseFloat(d[4]))}if(d=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55)}if(d=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55,parseFloat(d[4]))}if(d=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c)){return f(parseInt(d[1],16),parseInt(d[2],16),parseInt(d[3],16))}if(d=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c)){return f(parseInt(d[1]+d[1],16),parseInt(d[2]+d[2],16),parseInt(d[3]+d[3],16))}var e=b.trim(c).toLowerCase();if(e=="transparent"){return f(255,255,255,0)}else{d=a[e]||[0,0,0];return f(d[0],d[1],d[2])}};var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);(function(c){function b(av,ai,J,af){var Q=[],O={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{show:null,position:"bottom",mode:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},az=null,ad=null,y=null,H=null,A=null,p=[],aw=[],q={left:0,right:0,top:0,bottom:0},G=0,I=0,h=0,w=0,ak={processOptions:[],processRawData:[],processDatapoints:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},aq=this;aq.setData=aj;aq.setupGrid=t;aq.draw=W;aq.getPlaceholder=function(){return av};aq.getCanvas=function(){return az};aq.getPlotOffset=function(){return q};aq.width=function(){return h};aq.height=function(){return w};aq.offset=function(){var aB=y.offset();aB.left+=q.left;aB.top+=q.top;return aB};aq.getData=function(){return Q};aq.getAxes=function(){var aC={},aB;c.each(p.concat(aw),function(aD,aE){if(aE){aC[aE.direction+(aE.n!=1?aE.n:"")+"axis"]=aE}});return aC};aq.getXAxes=function(){return p};aq.getYAxes=function(){return aw};aq.c2p=C;aq.p2c=ar;aq.getOptions=function(){return O};aq.highlight=x;aq.unhighlight=T;aq.triggerRedrawOverlay=f;aq.pointOffset=function(aB){return{left:parseInt(p[aA(aB,"x")-1].p2c(+aB.x)+q.left),top:parseInt(aw[aA(aB,"y")-1].p2c(+aB.y)+q.top)}};aq.shutdown=ag;aq.resize=function(){B();g(az);g(ad)};aq.hooks=ak;F(aq);Z(J);X();aj(ai);t();W();ah();function an(aD,aB){aB=[aq].concat(aB);for(var aC=0;aC<aD.length;++aC){aD[aC].apply(this,aB)}}function F(){for(var aB=0;aB<af.length;++aB){var aC=af[aB];aC.init(aq);if(aC.options){c.extend(true,O,aC.options)}}}function Z(aC){var aB;c.extend(true,O,aC);if(O.xaxis.color==null){O.xaxis.color=O.grid.color}if(O.yaxis.color==null){O.yaxis.color=O.grid.color}if(O.xaxis.tickColor==null){O.xaxis.tickColor=O.grid.tickColor}if(O.yaxis.tickColor==null){O.yaxis.tickColor=O.grid.tickColor}if(O.grid.borderColor==null){O.grid.borderColor=O.grid.color}if(O.grid.tickColor==null){O.grid.tickColor=c.color.parse(O.grid.color).scale("a",0.22).toString()}for(aB=0;aB<Math.max(1,O.xaxes.length);++aB){O.xaxes[aB]=c.extend(true,{},O.xaxis,O.xaxes[aB])}for(aB=0;aB<Math.max(1,O.yaxes.length);++aB){O.yaxes[aB]=c.extend(true,{},O.yaxis,O.yaxes[aB])}if(O.xaxis.noTicks&&O.xaxis.ticks==null){O.xaxis.ticks=O.xaxis.noTicks}if(O.yaxis.noTicks&&O.yaxis.ticks==null){O.yaxis.ticks=O.yaxis.noTicks}if(O.x2axis){O.xaxes[1]=c.extend(true,{},O.xaxis,O.x2axis);O.xaxes[1].position="top"}if(O.y2axis){O.yaxes[1]=c.extend(true,{},O.yaxis,O.y2axis);O.yaxes[1].position="right"}if(O.grid.coloredAreas){O.grid.markings=O.grid.coloredAreas}if(O.grid.coloredAreasColor){O.grid.markingsColor=O.grid.coloredAreasColor}if(O.lines){c.extend(true,O.series.lines,O.lines)}if(O.points){c.extend(true,O.series.points,O.points)}if(O.bars){c.extend(true,O.series.bars,O.bars)}if(O.shadowSize!=null){O.series.shadowSize=O.shadowSize}for(aB=0;aB<O.xaxes.length;++aB){V(p,aB+1).options=O.xaxes[aB]}for(aB=0;aB<O.yaxes.length;++aB){V(aw,aB+1).options=O.yaxes[aB]}for(var aD in ak){if(O.hooks[aD]&&O.hooks[aD].length){ak[aD]=ak[aD].concat(O.hooks[aD])}}an(ak.processOptions,[O])}function aj(aB){Q=Y(aB);ax();z()}function Y(aE){var aC=[];for(var aB=0;aB<aE.length;++aB){var aD=c.extend(true,{},O.series);if(aE[aB].data!=null){aD.data=aE[aB].data;delete aE[aB].data;c.extend(true,aD,aE[aB]);aE[aB].data=aD.data}else{aD.data=aE[aB]}aC.push(aD)}return aC}function aA(aC,aD){var aB=aC[aD+"axis"];if(typeof aB=="object"){aB=aB.n}if(typeof aB!="number"){aB=1}return aB}function m(){return c.grep(p.concat(aw),function(aB){return aB})}function C(aE){var aC={},aB,aD;for(aB=0;aB<p.length;++aB){aD=p[aB];if(aD&&aD.used){aC["x"+aD.n]=aD.c2p(aE.left)}}for(aB=0;aB<aw.length;++aB){aD=aw[aB];if(aD&&aD.used){aC["y"+aD.n]=aD.c2p(aE.top)}}if(aC.x1!==undefined){aC.x=aC.x1}if(aC.y1!==undefined){aC.y=aC.y1}return aC}function ar(aF){var aD={},aC,aE,aB;for(aC=0;aC<p.length;++aC){aE=p[aC];if(aE&&aE.used){aB="x"+aE.n;if(aF[aB]==null&&aE.n==1){aB="x"}if(aF[aB]!=null){aD.left=aE.p2c(aF[aB]);break}}}for(aC=0;aC<aw.length;++aC){aE=aw[aC];if(aE&&aE.used){aB="y"+aE.n;if(aF[aB]==null&&aE.n==1){aB="y"}if(aF[aB]!=null){aD.top=aE.p2c(aF[aB]);break}}}return aD}function V(aC,aB){if(!aC[aB-1]){aC[aB-1]={n:aB,direction:aC==p?"x":"y",options:c.extend(true,{},aC==p?O.xaxis:O.yaxis)}}return aC[aB-1]}function ax(){var aG;var aM=Q.length,aB=[],aE=[];for(aG=0;aG<Q.length;++aG){var aJ=Q[aG].color;if(aJ!=null){--aM;if(typeof aJ=="number"){aE.push(aJ)}else{aB.push(c.color.parse(Q[aG].color))}}}for(aG=0;aG<aE.length;++aG){aM=Math.max(aM,aE[aG]+1)}var aC=[],aF=0;aG=0;while(aC.length<aM){var aI;if(O.colors.length==aG){aI=c.color.make(100,100,100)}else{aI=c.color.parse(O.colors[aG])}var aD=aF%2==1?-1:1;aI.scale("rgb",1+aD*Math.ceil(aF/2)*0.2);aC.push(aI);++aG;if(aG>=O.colors.length){aG=0;++aF}}var aH=0,aN;for(aG=0;aG<Q.length;++aG){aN=Q[aG];if(aN.color==null){aN.color=aC[aH].toString();++aH}else{if(typeof aN.color=="number"){aN.color=aC[aN.color].toString()}}if(aN.lines.show==null){var aL,aK=true;for(aL in aN){if(aN[aL]&&aN[aL].show){aK=false;break}}if(aK){aN.lines.show=true}}aN.xaxis=V(p,aA(aN,"x"));aN.yaxis=V(aw,aA(aN,"y"))}}function z(){var aO=Number.POSITIVE_INFINITY,aI=Number.NEGATIVE_INFINITY,aB=Number.MAX_VALUE,aU,aS,aR,aN,aD,aJ,aT,aP,aH,aG,aC,a0,aX,aL;function aF(a3,a2,a1){if(a2<a3.datamin&&a2!=-aB){a3.datamin=a2}if(a1>a3.datamax&&a1!=aB){a3.datamax=a1}}c.each(m(),function(a1,a2){a2.datamin=aO;a2.datamax=aI;a2.used=false});for(aU=0;aU<Q.length;++aU){aJ=Q[aU];aJ.datapoints={points:[]};an(ak.processRawData,[aJ,aJ.data,aJ.datapoints])}for(aU=0;aU<Q.length;++aU){aJ=Q[aU];var aZ=aJ.data,aW=aJ.datapoints.format;if(!aW){aW=[];aW.push({x:true,number:true,required:true});aW.push({y:true,number:true,required:true});if(aJ.bars.show||(aJ.lines.show&&aJ.lines.fill)){aW.push({y:true,number:true,required:false,defaultValue:0});if(aJ.bars.horizontal){delete aW[aW.length-1].y;aW[aW.length-1].x=true}}aJ.datapoints.format=aW}if(aJ.datapoints.pointsize!=null){continue}aJ.datapoints.pointsize=aW.length;aP=aJ.datapoints.pointsize;aT=aJ.datapoints.points;insertSteps=aJ.lines.show&&aJ.lines.steps;aJ.xaxis.used=aJ.yaxis.used=true;for(aS=aR=0;aS<aZ.length;++aS,aR+=aP){aL=aZ[aS];var aE=aL==null;if(!aE){for(aN=0;aN<aP;++aN){a0=aL[aN];aX=aW[aN];if(aX){if(aX.number&&a0!=null){a0=+a0;if(isNaN(a0)){a0=null}else{if(a0==Infinity){a0=aB}else{if(a0==-Infinity){a0=-aB}}}}if(a0==null){if(aX.required){aE=true}if(aX.defaultValue!=null){a0=aX.defaultValue}}}aT[aR+aN]=a0}}if(aE){for(aN=0;aN<aP;++aN){a0=aT[aR+aN];if(a0!=null){aX=aW[aN];if(aX.x){aF(aJ.xaxis,a0,a0)}if(aX.y){aF(aJ.yaxis,a0,a0)}}aT[aR+aN]=null}}else{if(insertSteps&&aR>0&&aT[aR-aP]!=null&&aT[aR-aP]!=aT[aR]&&aT[aR-aP+1]!=aT[aR+1]){for(aN=0;aN<aP;++aN){aT[aR+aP+aN]=aT[aR+aN]}aT[aR+1]=aT[aR-aP+1];aR+=aP}}}}for(aU=0;aU<Q.length;++aU){aJ=Q[aU];an(ak.processDatapoints,[aJ,aJ.datapoints])}for(aU=0;aU<Q.length;++aU){aJ=Q[aU];aT=aJ.datapoints.points,aP=aJ.datapoints.pointsize;var aK=aO,aQ=aO,aM=aI,aV=aI;for(aS=0;aS<aT.length;aS+=aP){if(aT[aS]==null){continue}for(aN=0;aN<aP;++aN){a0=aT[aS+aN];aX=aW[aN];if(!aX||a0==aB||a0==-aB){continue}if(aX.x){if(a0<aK){aK=a0}if(a0>aM){aM=a0}}if(aX.y){if(a0<aQ){aQ=a0}if(a0>aV){aV=a0}}}}if(aJ.bars.show){var aY=aJ.bars.align=="left"?0:-aJ.bars.barWidth/2;if(aJ.bars.horizontal){aQ+=aY;aV+=aY+aJ.bars.barWidth}else{aK+=aY;aM+=aY+aJ.bars.barWidth}}aF(aJ.xaxis,aK,aM);aF(aJ.yaxis,aQ,aV)}c.each(m(),function(a1,a2){if(a2.datamin==aO){a2.datamin=null}if(a2.datamax==aI){a2.datamax=null}})}function j(aB,aC){var aD=document.createElement("canvas");aD.className=aC;aD.width=G;aD.height=I;if(!aB){c(aD).css({position:"absolute",left:0,top:0})}c(aD).appendTo(av);if(!aD.getContext){aD=window.G_vmlCanvasManager.initElement(aD)}aD.getContext("2d").save();return aD}function B(){G=av.width();I=av.height();if(G<=0||I<=0){throw"Invalid dimensions for plot, width = "+G+", height = "+I}}function g(aC){if(aC.width!=G){aC.width=G}if(aC.height!=I){aC.height=I}var aB=aC.getContext("2d");aB.restore();aB.save()}function X(){var aC,aB=av.children("canvas.base"),aD=av.children("canvas.overlay");if(aB.length==0||aD==0){av.html("");av.css({padding:0});if(av.css("position")=="static"){av.css("position","relative")}B();az=j(true,"base");ad=j(false,"overlay");aC=false}else{az=aB.get(0);ad=aD.get(0);aC=true}H=az.getContext("2d");A=ad.getContext("2d");y=c([ad,az]);if(aC){av.data("plot").shutdown();aq.resize();A.clearRect(0,0,G,I);y.unbind();av.children().not([az,ad]).remove()}av.data("plot",aq)}function ah(){if(O.grid.hoverable){y.mousemove(aa);y.mouseleave(l)}if(O.grid.clickable){y.click(R)}an(ak.bindEvents,[y])}function ag(){if(M){clearTimeout(M)}y.unbind("mousemove",aa);y.unbind("mouseleave",l);y.unbind("click",R);an(ak.shutdown,[y])}function r(aG){function aC(aH){return aH}var aF,aB,aD=aG.options.transform||aC,aE=aG.options.inverseTransform;if(aG.direction=="x"){aF=aG.scale=h/Math.abs(aD(aG.max)-aD(aG.min));aB=Math.min(aD(aG.max),aD(aG.min))}else{aF=aG.scale=w/Math.abs(aD(aG.max)-aD(aG.min));aF=-aF;aB=Math.max(aD(aG.max),aD(aG.min))}if(aD==aC){aG.p2c=function(aH){return(aH-aB)*aF}}else{aG.p2c=function(aH){return(aD(aH)-aB)*aF}}if(!aE){aG.c2p=function(aH){return aB+aH/aF}}else{aG.c2p=function(aH){return aE(aB+aH/aF)}}}function L(aD){var aB=aD.options,aF,aJ=aD.ticks||[],aI=[],aE,aK=aB.labelWidth,aG=aB.labelHeight,aC;function aH(aM,aL){return c('<div style="position:absolute;top:-10000px;'+aL+'font-size:smaller"><div class="'+aD.direction+"Axis "+aD.direction+aD.n+'Axis">'+aM.join("")+"</div></div>").appendTo(av)}if(aD.direction=="x"){if(aK==null){aK=Math.floor(G/(aJ.length>0?aJ.length:1))}if(aG==null){aI=[];for(aF=0;aF<aJ.length;++aF){aE=aJ[aF].label;if(aE){aI.push('<div class="tickLabel" style="float:left;width:'+aK+'px">'+aE+"</div>")}}if(aI.length>0){aI.push('<div style="clear:left"></div>');aC=aH(aI,"width:10000px;");aG=aC.height();aC.remove()}}}else{if(aK==null||aG==null){for(aF=0;aF<aJ.length;++aF){aE=aJ[aF].label;if(aE){aI.push('<div class="tickLabel">'+aE+"</div>")}}if(aI.length>0){aC=aH(aI,"");if(aK==null){aK=aC.children().width()}if(aG==null){aG=aC.find("div.tickLabel").height()}aC.remove()}}}if(aK==null){aK=0}if(aG==null){aG=0}aD.labelWidth=aK;aD.labelHeight=aG}function au(aD){var aC=aD.labelWidth,aL=aD.labelHeight,aH=aD.options.position,aF=aD.options.tickLength,aG=O.grid.axisMargin,aJ=O.grid.labelMargin,aK=aD.direction=="x"?p:aw,aE;var aB=c.grep(aK,function(aN){return aN&&aN.options.position==aH&&aN.reserveSpace});if(c.inArray(aD,aB)==aB.length-1){aG=0}if(aF==null){aF="full"}var aI=c.grep(aK,function(aN){return aN&&aN.reserveSpace});var aM=c.inArray(aD,aI)==0;if(!aM&&aF=="full"){aF=5}if(!isNaN(+aF)){aJ+=+aF}if(aD.direction=="x"){aL+=aJ;if(aH=="bottom"){q.bottom+=aL+aG;aD.box={top:I-q.bottom,height:aL}}else{aD.box={top:q.top+aG,height:aL};q.top+=aL+aG}}else{aC+=aJ;if(aH=="left"){aD.box={left:q.left+aG,width:aC};q.left+=aC+aG}else{q.right+=aC+aG;aD.box={left:G-q.right,width:aC}}}aD.position=aH;aD.tickLength=aF;aD.box.padding=aJ;aD.innermost=aM}function U(aB){if(aB.direction=="x"){aB.box.left=q.left;aB.box.width=h}else{aB.box.top=q.top;aB.box.height=w}}function t(){var aC,aE=m();c.each(aE,function(aF,aG){aG.show=aG.options.show;if(aG.show==null){aG.show=aG.used}aG.reserveSpace=aG.show||aG.options.reserveSpace;n(aG)});allocatedAxes=c.grep(aE,function(aF){return aF.reserveSpace});q.left=q.right=q.top=q.bottom=0;if(O.grid.show){c.each(allocatedAxes,function(aF,aG){S(aG);P(aG);ap(aG,aG.ticks);L(aG)});for(aC=allocatedAxes.length-1;aC>=0;--aC){au(allocatedAxes[aC])}var aD=O.grid.minBorderMargin;if(aD==null){aD=0;for(aC=0;aC<Q.length;++aC){aD=Math.max(aD,Q[aC].points.radius+Q[aC].points.lineWidth/2)}}for(var aB in q){q[aB]+=O.grid.borderWidth;q[aB]=Math.max(aD,q[aB])}}h=G-q.left-q.right;w=I-q.bottom-q.top;c.each(aE,function(aF,aG){r(aG)});if(O.grid.show){c.each(allocatedAxes,function(aF,aG){U(aG)});k()}o()}function n(aE){var aF=aE.options,aD=+(aF.min!=null?aF.min:aE.datamin),aB=+(aF.max!=null?aF.max:aE.datamax),aH=aB-aD;if(aH==0){var aC=aB==0?1:0.01;if(aF.min==null){aD-=aC}if(aF.max==null||aF.min!=null){aB+=aC}}else{var aG=aF.autoscaleMargin;if(aG!=null){if(aF.min==null){aD-=aH*aG;if(aD<0&&aE.datamin!=null&&aE.datamin>=0){aD=0}}if(aF.max==null){aB+=aH*aG;if(aB>0&&aE.datamax!=null&&aE.datamax<=0){aB=0}}}}aE.min=aD;aE.max=aB}function S(aG){var aM=aG.options;var aH;if(typeof aM.ticks=="number"&&aM.ticks>0){aH=aM.ticks}else{aH=0.3*Math.sqrt(aG.direction=="x"?G:I)}var aT=(aG.max-aG.min)/aH,aO,aB,aN,aR,aS,aQ,aI;if(aM.mode=="time"){var aJ={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var aK=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var aC=0;if(aM.minTickSize!=null){if(typeof aM.tickSize=="number"){aC=aM.tickSize}else{aC=aM.minTickSize[0]*aJ[aM.minTickSize[1]]}}for(var aS=0;aS<aK.length-1;++aS){if(aT<(aK[aS][0]*aJ[aK[aS][1]]+aK[aS+1][0]*aJ[aK[aS+1][1]])/2&&aK[aS][0]*aJ[aK[aS][1]]>=aC){break}}aO=aK[aS][0];aN=aK[aS][1];if(aN=="year"){aQ=Math.pow(10,Math.floor(Math.log(aT/aJ.year)/Math.LN10));aI=(aT/aJ.year)/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ}aG.tickSize=aM.tickSize||[aO,aN];aB=function(aX){var a2=[],a0=aX.tickSize[0],a3=aX.tickSize[1],a1=new Date(aX.min);var aW=a0*aJ[a3];if(a3=="second"){a1.setUTCSeconds(a(a1.getUTCSeconds(),a0))}if(a3=="minute"){a1.setUTCMinutes(a(a1.getUTCMinutes(),a0))}if(a3=="hour"){a1.setUTCHours(a(a1.getUTCHours(),a0))}if(a3=="month"){a1.setUTCMonth(a(a1.getUTCMonth(),a0))}if(a3=="year"){a1.setUTCFullYear(a(a1.getUTCFullYear(),a0))}a1.setUTCMilliseconds(0);if(aW>=aJ.minute){a1.setUTCSeconds(0)}if(aW>=aJ.hour){a1.setUTCMinutes(0)}if(aW>=aJ.day){a1.setUTCHours(0)}if(aW>=aJ.day*4){a1.setUTCDate(1)}if(aW>=aJ.year){a1.setUTCMonth(0)}var a5=0,a4=Number.NaN,aY;do{aY=a4;a4=a1.getTime();a2.push(a4);if(a3=="month"){if(a0<1){a1.setUTCDate(1);var aV=a1.getTime();a1.setUTCMonth(a1.getUTCMonth()+1);var aZ=a1.getTime();a1.setTime(a4+a5*aJ.hour+(aZ-aV)*a0);a5=a1.getUTCHours();a1.setUTCHours(0)}else{a1.setUTCMonth(a1.getUTCMonth()+a0)}}else{if(a3=="year"){a1.setUTCFullYear(a1.getUTCFullYear()+a0)}else{a1.setTime(a4+aW)}}}while(a4<aX.max&&a4!=aY);return a2};aR=function(aV,aY){var a0=new Date(aV);if(aM.timeformat!=null){return c.plot.formatDate(a0,aM.timeformat,aM.monthNames)}var aW=aY.tickSize[0]*aJ[aY.tickSize[1]];var aX=aY.max-aY.min;var aZ=(aM.twelveHourClock)?" %p":"";if(aW<aJ.minute){fmt="%h:%M:%S"+aZ}else{if(aW<aJ.day){if(aX<2*aJ.day){fmt="%h:%M"+aZ}else{fmt="%b %d %h:%M"+aZ}}else{if(aW<aJ.month){fmt="%b %d"}else{if(aW<aJ.year){if(aX<aJ.year){fmt="%b"}else{fmt="%b %y"}}else{fmt="%y"}}}}return c.plot.formatDate(a0,fmt,aM.monthNames)}}else{var aU=aM.tickDecimals;var aP=-Math.floor(Math.log(aT)/Math.LN10);if(aU!=null&&aP>aU){aP=aU}aQ=Math.pow(10,-aP);aI=aT/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2;if(aI>2.25&&(aU==null||aP+1<=aU)){aO=2.5;++aP}}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ;if(aM.minTickSize!=null&&aO<aM.minTickSize){aO=aM.minTickSize}aG.tickDecimals=Math.max(0,aU!=null?aU:aP);aG.tickSize=aM.tickSize||aO;aB=function(aX){var aZ=[];var a0=a(aX.min,aX.tickSize),aW=0,aV=Number.NaN,aY;do{aY=aV;aV=a0+aW*aX.tickSize;aZ.push(aV);++aW}while(aV<aX.max&&aV!=aY);return aZ};aR=function(aV,aW){return aV.toFixed(aW.tickDecimals)}}if(aM.alignTicksWithAxis!=null){var aF=(aG.direction=="x"?p:aw)[aM.alignTicksWithAxis-1];if(aF&&aF.used&&aF!=aG){var aL=aB(aG);if(aL.length>0){if(aM.min==null){aG.min=Math.min(aG.min,aL[0])}if(aM.max==null&&aL.length>1){aG.max=Math.max(aG.max,aL[aL.length-1])}}aB=function(aX){var aY=[],aV,aW;for(aW=0;aW<aF.ticks.length;++aW){aV=(aF.ticks[aW].v-aF.min)/(aF.max-aF.min);aV=aX.min+aV*(aX.max-aX.min);aY.push(aV)}return aY};if(aG.mode!="time"&&aM.tickDecimals==null){var aE=Math.max(0,-Math.floor(Math.log(aT)/Math.LN10)+1),aD=aB(aG);if(!(aD.length>1&&/\..*0$/.test((aD[1]-aD[0]).toFixed(aE)))){aG.tickDecimals=aE}}}}aG.tickGenerator=aB;if(c.isFunction(aM.tickFormatter)){aG.tickFormatter=function(aV,aW){return""+aM.tickFormatter(aV,aW)}}else{aG.tickFormatter=aR}}function P(aF){var aH=aF.options.ticks,aG=[];if(aH==null||(typeof aH=="number"&&aH>0)){aG=aF.tickGenerator(aF)}else{if(aH){if(c.isFunction(aH)){aG=aH({min:aF.min,max:aF.max})}else{aG=aH}}}var aE,aB;aF.ticks=[];for(aE=0;aE<aG.length;++aE){var aC=null;var aD=aG[aE];if(typeof aD=="object"){aB=+aD[0];if(aD.length>1){aC=aD[1]}}else{aB=+aD}if(aC==null){aC=aF.tickFormatter(aB,aF)}if(!isNaN(aB)){aF.ticks.push({v:aB,label:aC})}}}function ap(aB,aC){if(aB.options.autoscaleMargin&&aC.length>0){if(aB.options.min==null){aB.min=Math.min(aB.min,aC[0].v)}if(aB.options.max==null&&aC.length>1){aB.max=Math.max(aB.max,aC[aC.length-1].v)}}}function W(){H.clearRect(0,0,G,I);var aC=O.grid;if(aC.show&&aC.backgroundColor){N()}if(aC.show&&!aC.aboveData){ac()}for(var aB=0;aB<Q.length;++aB){an(ak.drawSeries,[H,Q[aB]]);d(Q[aB])}an(ak.draw,[H]);if(aC.show&&aC.aboveData){ac()}}function D(aB,aI){var aE,aH,aG,aD,aF=m();for(i=0;i<aF.length;++i){aE=aF[i];if(aE.direction==aI){aD=aI+aE.n+"axis";if(!aB[aD]&&aE.n==1){aD=aI+"axis"}if(aB[aD]){aH=aB[aD].from;aG=aB[aD].to;break}}}if(!aB[aD]){aE=aI=="x"?p[0]:aw[0];aH=aB[aI+"1"];aG=aB[aI+"2"]}if(aH!=null&&aG!=null&&aH>aG){var aC=aH;aH=aG;aG=aC}return{from:aH,to:aG,axis:aE}}function N(){H.save();H.translate(q.left,q.top);H.fillStyle=am(O.grid.backgroundColor,w,0,"rgba(255, 255, 255, 0)");H.fillRect(0,0,h,w);H.restore()}function ac(){var aF;H.save();H.translate(q.left,q.top);var aH=O.grid.markings;if(aH){if(c.isFunction(aH)){var aK=aq.getAxes();aK.xmin=aK.xaxis.min;aK.xmax=aK.xaxis.max;aK.ymin=aK.yaxis.min;aK.ymax=aK.yaxis.max;aH=aH(aK)}for(aF=0;aF<aH.length;++aF){var aD=aH[aF],aC=D(aD,"x"),aI=D(aD,"y");if(aC.from==null){aC.from=aC.axis.min}if(aC.to==null){aC.to=aC.axis.max}if(aI.from==null){aI.from=aI.axis.min}if(aI.to==null){aI.to=aI.axis.max}if(aC.to<aC.axis.min||aC.from>aC.axis.max||aI.to<aI.axis.min||aI.from>aI.axis.max){continue}aC.from=Math.max(aC.from,aC.axis.min);aC.to=Math.min(aC.to,aC.axis.max);aI.from=Math.max(aI.from,aI.axis.min);aI.to=Math.min(aI.to,aI.axis.max);if(aC.from==aC.to&&aI.from==aI.to){continue}aC.from=aC.axis.p2c(aC.from);aC.to=aC.axis.p2c(aC.to);aI.from=aI.axis.p2c(aI.from);aI.to=aI.axis.p2c(aI.to);if(aC.from==aC.to||aI.from==aI.to){H.beginPath();H.strokeStyle=aD.color||O.grid.markingsColor;H.lineWidth=aD.lineWidth||O.grid.markingsLineWidth;H.moveTo(aC.from,aI.from);H.lineTo(aC.to,aI.to);H.stroke()}else{H.fillStyle=aD.color||O.grid.markingsColor;H.fillRect(aC.from,aI.to,aC.to-aC.from,aI.from-aI.to)}}}var aK=m(),aM=O.grid.borderWidth;for(var aE=0;aE<aK.length;++aE){var aB=aK[aE],aG=aB.box,aQ=aB.tickLength,aN,aL,aP,aJ;if(!aB.show||aB.ticks.length==0){continue}H.strokeStyle=aB.options.tickColor||c.color.parse(aB.options.color).scale("a",0.22).toString();H.lineWidth=1;if(aB.direction=="x"){aN=0;if(aQ=="full"){aL=(aB.position=="top"?0:w)}else{aL=aG.top-q.top+(aB.position=="top"?aG.height:0)}}else{aL=0;if(aQ=="full"){aN=(aB.position=="left"?0:h)}else{aN=aG.left-q.left+(aB.position=="left"?aG.width:0)}}if(!aB.innermost){H.beginPath();aP=aJ=0;if(aB.direction=="x"){aP=h}else{aJ=w}if(H.lineWidth==1){aN=Math.floor(aN)+0.5;aL=Math.floor(aL)+0.5}H.moveTo(aN,aL);H.lineTo(aN+aP,aL+aJ);H.stroke()}H.beginPath();for(aF=0;aF<aB.ticks.length;++aF){var aO=aB.ticks[aF].v;aP=aJ=0;if(aO<aB.min||aO>aB.max||(aQ=="full"&&aM>0&&(aO==aB.min||aO==aB.max))){continue}if(aB.direction=="x"){aN=aB.p2c(aO);aJ=aQ=="full"?-w:aQ;if(aB.position=="top"){aJ=-aJ}}else{aL=aB.p2c(aO);aP=aQ=="full"?-h:aQ;if(aB.position=="left"){aP=-aP}}if(H.lineWidth==1){if(aB.direction=="x"){aN=Math.floor(aN)+0.5}else{aL=Math.floor(aL)+0.5}}H.moveTo(aN,aL);H.lineTo(aN+aP,aL+aJ)}H.stroke()}if(aM){H.lineWidth=aM;H.strokeStyle=O.grid.borderColor;H.strokeRect(-aM/2,-aM/2,h+aM,w+aM)}H.restore()}function k(){av.find(".tickLabels").remove();var aG=['<div class="tickLabels" style="font-size:smaller">'];var aJ=m();for(var aD=0;aD<aJ.length;++aD){var aC=aJ[aD],aF=aC.box;if(!aC.show){continue}aG.push('<div class="'+aC.direction+"Axis "+aC.direction+aC.n+'Axis" style="color:'+aC.options.color+'">');for(var aE=0;aE<aC.ticks.length;++aE){var aH=aC.ticks[aE];if(!aH.label||aH.v<aC.min||aH.v>aC.max){continue}var aK={},aI;if(aC.direction=="x"){aI="center";aK.left=Math.round(q.left+aC.p2c(aH.v)-aC.labelWidth/2);if(aC.position=="bottom"){aK.top=aF.top+aF.padding}else{aK.bottom=I-(aF.top+aF.height-aF.padding)}}else{aK.top=Math.round(q.top+aC.p2c(aH.v)-aC.labelHeight/2);if(aC.position=="left"){aK.right=G-(aF.left+aF.width-aF.padding);aI="right"}else{aK.left=aF.left+aF.padding;aI="left"}}aK.width=aC.labelWidth;var aB=["position:absolute","text-align:"+aI];for(var aL in aK){aB.push(aL+":"+aK[aL]+"px")}aG.push('<div class="tickLabel" style="'+aB.join(";")+'">'+aH.label+"</div>")}aG.push("</div>")}aG.push("</div>");av.append(aG.join(""))}function d(aB){if(aB.lines.show){at(aB)}if(aB.bars.show){e(aB)}if(aB.points.show){ao(aB)}}function at(aE){function aD(aP,aQ,aI,aU,aT){var aV=aP.points,aJ=aP.pointsize,aN=null,aM=null;H.beginPath();for(var aO=aJ;aO<aV.length;aO+=aJ){var aL=aV[aO-aJ],aS=aV[aO-aJ+1],aK=aV[aO],aR=aV[aO+1];if(aL==null||aK==null){continue}if(aS<=aR&&aS<aT.min){if(aR<aT.min){continue}aL=(aT.min-aS)/(aR-aS)*(aK-aL)+aL;aS=aT.min}else{if(aR<=aS&&aR<aT.min){if(aS<aT.min){continue}aK=(aT.min-aS)/(aR-aS)*(aK-aL)+aL;aR=aT.min}}if(aS>=aR&&aS>aT.max){if(aR>aT.max){continue}aL=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aS=aT.max}else{if(aR>=aS&&aR>aT.max){if(aS>aT.max){continue}aK=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aR=aT.max}}if(aL<=aK&&aL<aU.min){if(aK<aU.min){continue}aS=(aU.min-aL)/(aK-aL)*(aR-aS)+aS;aL=aU.min}else{if(aK<=aL&&aK<aU.min){if(aL<aU.min){continue}aR=(aU.min-aL)/(aK-aL)*(aR-aS)+aS;aK=aU.min}}if(aL>=aK&&aL>aU.max){if(aK>aU.max){continue}aS=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aL=aU.max}else{if(aK>=aL&&aK>aU.max){if(aL>aU.max){continue}aR=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aK=aU.max}}if(aL!=aN||aS!=aM){H.moveTo(aU.p2c(aL)+aQ,aT.p2c(aS)+aI)}aN=aK;aM=aR;H.lineTo(aU.p2c(aK)+aQ,aT.p2c(aR)+aI)}H.stroke()}function aF(aI,aQ,aP){var aW=aI.points,aV=aI.pointsize,aN=Math.min(Math.max(0,aP.min),aP.max),aX=0,aU,aT=false,aM=1,aL=0,aR=0;while(true){if(aV>0&&aX>aW.length+aV){break}aX+=aV;var aZ=aW[aX-aV],aK=aW[aX-aV+aM],aY=aW[aX],aJ=aW[aX+aM];if(aT){if(aV>0&&aZ!=null&&aY==null){aR=aX;aV=-aV;aM=2;continue}if(aV<0&&aX==aL+aV){H.fill();aT=false;aV=-aV;aM=1;aX=aL=aR+aV;continue}}if(aZ==null||aY==null){continue}if(aZ<=aY&&aZ<aQ.min){if(aY<aQ.min){continue}aK=(aQ.min-aZ)/(aY-aZ)*(aJ-aK)+aK;aZ=aQ.min}else{if(aY<=aZ&&aY<aQ.min){if(aZ<aQ.min){continue}aJ=(aQ.min-aZ)/(aY-aZ)*(aJ-aK)+aK;aY=aQ.min}}if(aZ>=aY&&aZ>aQ.max){if(aY>aQ.max){continue}aK=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aZ=aQ.max}else{if(aY>=aZ&&aY>aQ.max){if(aZ>aQ.max){continue}aJ=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aY=aQ.max}}if(!aT){H.beginPath();H.moveTo(aQ.p2c(aZ),aP.p2c(aN));aT=true}if(aK>=aP.max&&aJ>=aP.max){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.max));H.lineTo(aQ.p2c(aY),aP.p2c(aP.max));continue}else{if(aK<=aP.min&&aJ<=aP.min){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.min));H.lineTo(aQ.p2c(aY),aP.p2c(aP.min));continue}}var aO=aZ,aS=aY;if(aK<=aJ&&aK<aP.min&&aJ>=aP.min){aZ=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.min}else{if(aJ<=aK&&aJ<aP.min&&aK>=aP.min){aY=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.min}}if(aK>=aJ&&aK>aP.max&&aJ<=aP.max){aZ=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.max}else{if(aJ>=aK&&aJ>aP.max&&aK<=aP.max){aY=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.max}}if(aZ!=aO){H.lineTo(aQ.p2c(aO),aP.p2c(aK))}H.lineTo(aQ.p2c(aZ),aP.p2c(aK));H.lineTo(aQ.p2c(aY),aP.p2c(aJ));if(aY!=aS){H.lineTo(aQ.p2c(aY),aP.p2c(aJ));H.lineTo(aQ.p2c(aS),aP.p2c(aJ))}}}H.save();H.translate(q.left,q.top);H.lineJoin="round";var aG=aE.lines.lineWidth,aB=aE.shadowSize;if(aG>0&&aB>0){H.lineWidth=aB;H.strokeStyle="rgba(0,0,0,0.1)";var aH=Math.PI/18;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/2),Math.cos(aH)*(aG/2+aB/2),aE.xaxis,aE.yaxis);H.lineWidth=aB/2;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/4),Math.cos(aH)*(aG/2+aB/4),aE.xaxis,aE.yaxis)}H.lineWidth=aG;H.strokeStyle=aE.color;var aC=ae(aE.lines,aE.color,0,w);if(aC){H.fillStyle=aC;aF(aE.datapoints,aE.xaxis,aE.yaxis)}if(aG>0){aD(aE.datapoints,0,0,aE.xaxis,aE.yaxis)}H.restore()}function ao(aE){function aH(aN,aM,aU,aK,aS,aT,aQ,aJ){var aR=aN.points,aI=aN.pointsize;for(var aL=0;aL<aR.length;aL+=aI){var aP=aR[aL],aO=aR[aL+1];if(aP==null||aP<aT.min||aP>aT.max||aO<aQ.min||aO>aQ.max){continue}H.beginPath();aP=aT.p2c(aP);aO=aQ.p2c(aO)+aK;if(aJ=="circle"){H.arc(aP,aO,aM,0,aS?Math.PI:Math.PI*2,false)}else{aJ(H,aP,aO,aM,aS)}H.closePath();if(aU){H.fillStyle=aU;H.fill()}H.stroke()}}H.save();H.translate(q.left,q.top);var aG=aE.points.lineWidth,aC=aE.shadowSize,aB=aE.points.radius,aF=aE.points.symbol;if(aG>0&&aC>0){var aD=aC/2;H.lineWidth=aD;H.strokeStyle="rgba(0,0,0,0.1)";aH(aE.datapoints,aB,null,aD+aD/2,true,aE.xaxis,aE.yaxis,aF);H.strokeStyle="rgba(0,0,0,0.2)";aH(aE.datapoints,aB,null,aD/2,true,aE.xaxis,aE.yaxis,aF)}H.lineWidth=aG;H.strokeStyle=aE.color;aH(aE.datapoints,aB,ae(aE.points,aE.color),0,false,aE.xaxis,aE.yaxis,aF);H.restore()}function E(aN,aM,aV,aI,aQ,aF,aD,aL,aK,aU,aR,aC){var aE,aT,aJ,aP,aG,aB,aO,aH,aS;if(aR){aH=aB=aO=true;aG=false;aE=aV;aT=aN;aP=aM+aI;aJ=aM+aQ;if(aT<aE){aS=aT;aT=aE;aE=aS;aG=true;aB=false}}else{aG=aB=aO=true;aH=false;aE=aN+aI;aT=aN+aQ;aJ=aV;aP=aM;if(aP<aJ){aS=aP;aP=aJ;aJ=aS;aH=true;aO=false}}if(aT<aL.min||aE>aL.max||aP<aK.min||aJ>aK.max){return}if(aE<aL.min){aE=aL.min;aG=false}if(aT>aL.max){aT=aL.max;aB=false}if(aJ<aK.min){aJ=aK.min;aH=false}if(aP>aK.max){aP=aK.max;aO=false}aE=aL.p2c(aE);aJ=aK.p2c(aJ);aT=aL.p2c(aT);aP=aK.p2c(aP);if(aD){aU.beginPath();aU.moveTo(aE,aJ);aU.lineTo(aE,aP);aU.lineTo(aT,aP);aU.lineTo(aT,aJ);aU.fillStyle=aD(aJ,aP);aU.fill()}if(aC>0&&(aG||aB||aO||aH)){aU.beginPath();aU.moveTo(aE,aJ+aF);if(aG){aU.lineTo(aE,aP+aF)}else{aU.moveTo(aE,aP+aF)}if(aO){aU.lineTo(aT,aP+aF)}else{aU.moveTo(aT,aP+aF)}if(aB){aU.lineTo(aT,aJ+aF)}else{aU.moveTo(aT,aJ+aF)}if(aH){aU.lineTo(aE,aJ+aF)}else{aU.moveTo(aE,aJ+aF)}aU.stroke()}}function e(aD){function aC(aJ,aI,aL,aG,aK,aN,aM){var aO=aJ.points,aF=aJ.pointsize;for(var aH=0;aH<aO.length;aH+=aF){if(aO[aH]==null){continue}E(aO[aH],aO[aH+1],aO[aH+2],aI,aL,aG,aK,aN,aM,H,aD.bars.horizontal,aD.bars.lineWidth)}}H.save();H.translate(q.left,q.top);H.lineWidth=aD.bars.lineWidth;H.strokeStyle=aD.color;var aB=aD.bars.align=="left"?0:-aD.bars.barWidth/2;var aE=aD.bars.fill?function(aF,aG){return ae(aD.bars,aD.color,aF,aG)}:null;aC(aD.datapoints,aB,aB+aD.bars.barWidth,0,aE,aD.xaxis,aD.yaxis);H.restore()}function ae(aD,aB,aC,aF){var aE=aD.fill;if(!aE){return null}if(aD.fillColor){return am(aD.fillColor,aC,aF,aB)}var aG=c.color.parse(aB);aG.a=typeof aE=="number"?aE:0.4;aG.normalize();return aG.toString()}function o(){av.find(".legend").remove();if(!O.legend.show){return}var aH=[],aF=false,aN=O.legend.labelFormatter,aM,aJ;for(var aE=0;aE<Q.length;++aE){aM=Q[aE];aJ=aM.label;if(!aJ){continue}if(aE%O.legend.noColumns==0){if(aF){aH.push("</tr>")}aH.push("<tr>");aF=true}if(aN){aJ=aN(aJ,aM)}aH.push('<td class="legendColorBox"><div style="border:1px solid '+O.legend.labelBoxBorderColor+';padding:1px"><div style="width:4px;height:0;border:5px solid '+aM.color+';overflow:hidden"></div></div></td><td class="legendLabel">'+aJ+"</td>")}if(aF){aH.push("</tr>")}if(aH.length==0){return}var aL='<table style="font-size:smaller;color:'+O.grid.color+'">'+aH.join("")+"</table>";if(O.legend.container!=null){c(O.legend.container).html(aL)}else{var aI="",aC=O.legend.position,aD=O.legend.margin;if(aD[0]==null){aD=[aD,aD]}if(aC.charAt(0)=="n"){aI+="top:"+(aD[1]+q.top)+"px;"}else{if(aC.charAt(0)=="s"){aI+="bottom:"+(aD[1]+q.bottom)+"px;"}}if(aC.charAt(1)=="e"){aI+="right:"+(aD[0]+q.right)+"px;"}else{if(aC.charAt(1)=="w"){aI+="left:"+(aD[0]+q.left)+"px;"}}var aK=c('<div class="legend">'+aL.replace('style="','style="position:absolute;'+aI+";")+"</div>").appendTo(av);if(O.legend.backgroundOpacity!=0){var aG=O.legend.backgroundColor;if(aG==null){aG=O.grid.backgroundColor;if(aG&&typeof aG=="string"){aG=c.color.parse(aG)}else{aG=c.color.extract(aK,"background-color")}aG.a=1;aG=aG.toString()}var aB=aK.children();c('<div style="position:absolute;width:'+aB.width()+"px;height:"+aB.height()+"px;"+aI+"background-color:"+aG+';"> </div>').prependTo(aK).css("opacity",O.legend.backgroundOpacity)}}}var ab=[],M=null;function K(aI,aG,aD){var aO=O.grid.mouseActiveRadius,a0=aO*aO+1,aY=null,aR=false,aW,aU;for(aW=Q.length-1;aW>=0;--aW){if(!aD(Q[aW])){continue}var aP=Q[aW],aH=aP.xaxis,aF=aP.yaxis,aV=aP.datapoints.points,aT=aP.datapoints.pointsize,aQ=aH.c2p(aI),aN=aF.c2p(aG),aC=aO/aH.scale,aB=aO/aF.scale;if(aH.options.inverseTransform){aC=Number.MAX_VALUE}if(aF.options.inverseTransform){aB=Number.MAX_VALUE}if(aP.lines.show||aP.points.show){for(aU=0;aU<aV.length;aU+=aT){var aK=aV[aU],aJ=aV[aU+1];if(aK==null){continue}if(aK-aQ>aC||aK-aQ<-aC||aJ-aN>aB||aJ-aN<-aB){continue}var aM=Math.abs(aH.p2c(aK)-aI),aL=Math.abs(aF.p2c(aJ)-aG),aS=aM*aM+aL*aL;if(aS<a0){a0=aS;aY=[aW,aU/aT]}}}if(aP.bars.show&&!aY){var aE=aP.bars.align=="left"?0:-aP.bars.barWidth/2,aX=aE+aP.bars.barWidth;for(aU=0;aU<aV.length;aU+=aT){var aK=aV[aU],aJ=aV[aU+1],aZ=aV[aU+2];if(aK==null){continue}if(Q[aW].bars.horizontal?(aQ<=Math.max(aZ,aK)&&aQ>=Math.min(aZ,aK)&&aN>=aJ+aE&&aN<=aJ+aX):(aQ>=aK+aE&&aQ<=aK+aX&&aN>=Math.min(aZ,aJ)&&aN<=Math.max(aZ,aJ))){aY=[aW,aU/aT]}}}}if(aY){aW=aY[0];aU=aY[1];aT=Q[aW].datapoints.pointsize;return{datapoint:Q[aW].datapoints.points.slice(aU*aT,(aU+1)*aT),dataIndex:aU,series:Q[aW],seriesIndex:aW}}return null}function aa(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return aC.hoverable!=false})}}function l(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return false})}}function R(aB){u("plotclick",aB,function(aC){return aC.clickable!=false})}function u(aC,aB,aD){var aE=y.offset(),aH=aB.pageX-aE.left-q.left,aF=aB.pageY-aE.top-q.top,aJ=C({left:aH,top:aF});aJ.pageX=aB.pageX;aJ.pageY=aB.pageY;var aK=K(aH,aF,aD);if(aK){aK.pageX=parseInt(aK.series.xaxis.p2c(aK.datapoint[0])+aE.left+q.left);aK.pageY=parseInt(aK.series.yaxis.p2c(aK.datapoint[1])+aE.top+q.top)}if(O.grid.autoHighlight){for(var aG=0;aG<ab.length;++aG){var aI=ab[aG];if(aI.auto==aC&&!(aK&&aI.series==aK.series&&aI.point[0]==aK.datapoint[0]&&aI.point[1]==aK.datapoint[1])){T(aI.series,aI.point)}}if(aK){x(aK.series,aK.datapoint,aC)}}av.trigger(aC,[aJ,aK])}function f(){if(!M){M=setTimeout(s,30)}}function s(){M=null;A.save();A.clearRect(0,0,G,I);A.translate(q.left,q.top);var aC,aB;for(aC=0;aC<ab.length;++aC){aB=ab[aC];if(aB.series.bars.show){v(aB.series,aB.point)}else{ay(aB.series,aB.point)}}A.restore();an(ak.drawOverlay,[A])}function x(aD,aB,aF){if(typeof aD=="number"){aD=Q[aD]}if(typeof aB=="number"){var aE=aD.datapoints.pointsize;aB=aD.datapoints.points.slice(aE*aB,aE*(aB+1))}var aC=al(aD,aB);if(aC==-1){ab.push({series:aD,point:aB,auto:aF});f()}else{if(!aF){ab[aC].auto=false}}}function T(aD,aB){if(aD==null&&aB==null){ab=[];f()}if(typeof aD=="number"){aD=Q[aD]}if(typeof aB=="number"){aB=aD.data[aB]}var aC=al(aD,aB);if(aC!=-1){ab.splice(aC,1);f()}}function al(aD,aE){for(var aB=0;aB<ab.length;++aB){var aC=ab[aB];if(aC.series==aD&&aC.point[0]==aE[0]&&aC.point[1]==aE[1]){return aB}}return -1}function ay(aE,aD){var aC=aD[0],aI=aD[1],aH=aE.xaxis,aG=aE.yaxis;if(aC<aH.min||aC>aH.max||aI<aG.min||aI>aG.max){return}var aF=aE.points.radius+aE.points.lineWidth/2;A.lineWidth=aF;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aB=1.5*aF,aC=aH.p2c(aC),aI=aG.p2c(aI);A.beginPath();if(aE.points.symbol=="circle"){A.arc(aC,aI,aB,0,2*Math.PI,false)}else{aE.points.symbol(A,aC,aI,aB,false)}A.closePath();A.stroke()}function v(aE,aB){A.lineWidth=aE.bars.lineWidth;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aD=c.color.parse(aE.color).scale("a",0.5).toString();var aC=aE.bars.align=="left"?0:-aE.bars.barWidth/2;E(aB[0],aB[1],aB[2]||0,aC,aC+aE.bars.barWidth,0,function(){return aD},aE.xaxis,aE.yaxis,A,aE.bars.horizontal,aE.bars.lineWidth)}function am(aJ,aB,aH,aC){if(typeof aJ=="string"){return aJ}else{var aI=H.createLinearGradient(0,aH,0,aB);for(var aE=0,aD=aJ.colors.length;aE<aD;++aE){var aF=aJ.colors[aE];if(typeof aF!="string"){var aG=c.color.parse(aC);if(aF.brightness!=null){aG=aG.scale("rgb",aF.brightness)}if(aF.opacity!=null){aG.a*=aF.opacity}aF=aG.toString()}aI.addColorStop(aE/(aD-1),aF)}return aI}}}c.plot=function(g,e,d){var f=new b(c(g),e,d,c.plot.plugins);return f};c.plot.version="0.7";c.plot.plugins=[];c.plot.formatDate=function(l,f,h){var o=function(d){d=""+d;return d.length==1?"0"+d:d};var e=[];var p=false,j=false;var n=l.getUTCHours();var k=n<12;if(h==null){h=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}if(f.search(/%p|%P/)!=-1){if(n>12){n=n-12}else{if(n==0){n=12}}}for(var g=0;g<f.length;++g){var m=f.charAt(g);if(p){switch(m){case"h":m=""+n;break;case"H":m=o(n);break;case"M":m=o(l.getUTCMinutes());break;case"S":m=o(l.getUTCSeconds());break;case"d":m=""+l.getUTCDate();break;case"m":m=""+(l.getUTCMonth()+1);break;case"y":m=""+l.getUTCFullYear();break;case"b":m=""+h[l.getUTCMonth()];break;case"p":m=(k)?("am"):("pm");break;case"P":m=(k)?("AM"):("PM");break;case"0":m="";j=true;break}if(m&&j){m=o(m);j=false}e.push(m);if(!j){p=false}}else{if(m=="%"){p=true}else{e.push(m)}}}return e.join("")};function a(e,d){return d*Math.floor(e/d)}})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.navigate.min.js b/chromium/third_party/flot/jquery.flot.navigate.min.js
index 0420f160fc8..ecf63c93ba5 100644
--- a/chromium/third_party/flot/jquery.flot.navigate.min.js
+++ b/chromium/third_party/flot/jquery.flot.navigate.min.js
@@ -1,86 +1 @@
-/* Flot plugin for adding the ability to pan and zoom the plot.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The default behaviour is double click and scrollwheel up/down to zoom in, drag
-to pan. The plugin defines plot.zoom({ center }), plot.zoomOut() and
-plot.pan( offset ) so you easily can add custom controls. It also fires
-"plotpan" and "plotzoom" events, useful for synchronizing plots.
-
-The plugin supports these options:
-
- zoom: {
- interactive: false
- trigger: "dblclick" // or "click" for single click
- amount: 1.5 // 2 = 200% (zoom in), 0.5 = 50% (zoom out)
- }
-
- pan: {
- interactive: false
- cursor: "move" // CSS mouse cursor value used when dragging, e.g. "pointer"
- frameRate: 20
- }
-
- xaxis, yaxis, x2axis, y2axis: {
- zoomRange: null // or [ number, number ] (min range, max range) or false
- panRange: null // or [ number, number ] (min, max) or false
- }
-
-"interactive" enables the built-in drag/click behaviour. If you enable
-interactive for pan, then you'll have a basic plot that supports moving
-around; the same for zoom.
-
-"amount" specifies the default amount to zoom in (so 1.5 = 150%) relative to
-the current viewport.
-
-"cursor" is a standard CSS mouse cursor string used for visual feedback to the
-user when dragging.
-
-"frameRate" specifies the maximum number of times per second the plot will
-update itself while the user is panning around on it (set to null to disable
-intermediate pans, the plot will then not update until the mouse button is
-released).
-
-"zoomRange" is the interval in which zooming can happen, e.g. with zoomRange:
-[1, 100] the zoom will never scale the axis so that the difference between min
-and max is smaller than 1 or larger than 100. You can set either end to null
-to ignore, e.g. [1, null]. If you set zoomRange to false, zooming on that axis
-will be disabled.
-
-"panRange" confines the panning to stay within a range, e.g. with panRange:
-[-10, 20] panning stops at -10 in one end and at 20 in the other. Either can
-be null, e.g. [-10, null]. If you set panRange to false, panning on that axis
-will be disabled.
-
-Example API usage:
-
- plot = $.plot(...);
-
- // zoom default amount in on the pixel ( 10, 20 )
- plot.zoom({ center: { left: 10, top: 20 } });
-
- // zoom out again
- plot.zoomOut({ center: { left: 10, top: 20 } });
-
- // zoom 200% in on the pixel (10, 20)
- plot.zoom({ amount: 2, center: { left: 10, top: 20 } });
-
- // pan 100 pixels to the left and 20 down
- plot.pan({ left: -100, top: 20 })
-
-Here, "center" specifies where the center of the zooming should happen. Note
-that this is defined in pixel space, not the space of the data points (you can
-use the p2c helpers on the axes in Flot to help you convert between these).
-
-"amount" is the amount to zoom the viewport relative to the current range, so
-1 is 100% (i.e. no change), 1.5 is 150% (zoom in), 0.7 is 70% (zoom out). You
-can set the default in the options.
-
-*/// First two dependencies, jquery.event.drag.js and
-// jquery.mousewheel.js, we put them inline here to save people the
-// effort of downloading them.
-/*
-jquery.event.drag.js ~ v1.5 ~ Copyright (c) 2008, Three Dub Media (http://threedubmedia.com)
-Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-LICENSE.txt
-*/(function(e){function t(i){var l,h=this,p=i.data||{};if(p.elem)h=i.dragTarget=p.elem,i.dragProxy=a.proxy||h,i.cursorOffsetX=p.pageX-p.left,i.cursorOffsetY=p.pageY-p.top,i.offsetX=i.pageX-i.cursorOffsetX,i.offsetY=i.pageY-i.cursorOffsetY;else if(a.dragging||p.which>0&&i.which!=p.which||e(i.target).is(p.not))return;switch(i.type){case"mousedown":return e.extend(p,e(h).offset(),{elem:h,target:i.target,pageX:i.pageX,pageY:i.pageY}),o.add(document,"mousemove mouseup",t,p),s(h,!1),a.dragging=null,!1;case!a.dragging&&"mousemove":if(r(i.pageX-p.pageX)+r(i.pageY-p.pageY)<p.distance)break;i.target=p.target,l=n(i,"dragstart",h),l!==!1&&(a.dragging=h,a.proxy=i.dragProxy=e(l||h)[0]);case"mousemove":if(a.dragging){if(l=n(i,"drag",h),u.drop&&(u.drop.allowed=l!==!1,u.drop.handler(i)),l!==!1)break;i.type="mouseup"};case"mouseup":o.remove(document,"mousemove mouseup",t),a.dragging&&(u.drop&&u.drop.handler(i),n(i,"dragend",h)),s(h,!0),a.dragging=a.proxy=p.elem=!1}return!0}function n(t,n,r){t.type=n;var i=e.event.dispatch.call(r,t);return i===!1?!1:i||t.result}function r(e){return Math.pow(e,2)}function i(){return a.dragging===!1}function s(e,t){e&&(e.unselectable=t?"off":"on",e.onselectstart=function(){return t},e.style&&(e.style.MozUserSelect=t?"":"none"))}e.fn.drag=function(e,t,n){return t&&this.bind("dragstart",e),n&&this.bind("dragend",n),e?this.bind("drag",t?t:e):this.trigger("drag")};var o=e.event,u=o.special,a=u.drag={not:":input",distance:0,which:1,dragging:!1,setup:function(n){n=e.extend({distance:a.distance,which:a.which,not:a.not},n||{}),n.distance=r(n.distance),o.add(this,"mousedown",t,n),this.attachEvent&&this.attachEvent("ondragstart",i)},teardown:function(){o.remove(this,"mousedown",t),this===a.dragging&&(a.dragging=a.proxy=!1),s(this,!0),this.detachEvent&&this.detachEvent("ondragstart",i)}};u.dragstart=u.dragend={setup:function(){},teardown:function(){}}})(jQuery),function(e){function t(t){var n=t||window.event,r=[].slice.call(arguments,1),i=0,s=0,o=0,t=e.event.fix(n);return t.type="mousewheel",n.wheelDelta&&(i=n.wheelDelta/120),n.detail&&(i=-n.detail/3),o=i,void 0!==n.axis&&n.axis===n.HORIZONTAL_AXIS&&(o=0,s=-1*i),void 0!==n.wheelDeltaY&&(o=n.wheelDeltaY/120),void 0!==n.wheelDeltaX&&(s=-1*n.wheelDeltaX/120),r.unshift(t,i,s,o),(e.event.dispatch||e.event.handle).apply(this,r)}var n=["DOMMouseScroll","mousewheel"];if(e.event.fixHooks)for(var r=n.length;r;)e.event.fixHooks[n[--r]]=e.event.mouseHooks;e.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var e=n.length;e;)this.addEventListener(n[--e],t,!1);else this.onmousewheel=t},teardown:function(){if(this.removeEventListener)for(var e=n.length;e;)this.removeEventListener(n[--e],t,!1);else this.onmousewheel=null}},e.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e)}})}(jQuery),function(e){function n(t){function n(e,n){var r=t.offset();r.left=e.pageX-r.left,r.top=e.pageY-r.top,n?t.zoomOut({center:r}):t.zoom({center:r})}function r(e,t){return e.preventDefault(),n(e,t<0),!1}function a(e){if(e.which!=1)return!1;var n=t.getPlaceholder().css("cursor");n&&(i=n),t.getPlaceholder().css("cursor",t.getOptions().pan.cursor),s=e.pageX,o=e.pageY}function f(e){var n=t.getOptions().pan.frameRate;if(u||!n)return;u=setTimeout(function(){t.pan({left:s-e.pageX,top:o-e.pageY}),s=e.pageX,o=e.pageY,u=null},1/n*1e3)}function l(e){u&&(clearTimeout(u),u=null),t.getPlaceholder().css("cursor",i),t.pan({left:s-e.pageX,top:o-e.pageY})}function c(e,t){var i=e.getOptions();i.zoom.interactive&&(t[i.zoom.trigger](n),t.mousewheel(r)),i.pan.interactive&&(t.bind("dragstart",{distance:10},a),t.bind("drag",f),t.bind("dragend",l))}function h(e,t){t.unbind(e.getOptions().zoom.trigger,n),t.unbind("mousewheel",r),t.unbind("dragstart",a),t.unbind("drag",f),t.unbind("dragend",l),u&&clearTimeout(u)}var i="default",s=0,o=0,u=null;t.zoomOut=function(e){e||(e={}),e.amount||(e.amount=t.getOptions().zoom.amount),e.amount=1/e.amount,t.zoom(e)},t.zoom=function(n){n||(n={});var r=n.center,i=n.amount||t.getOptions().zoom.amount,s=t.width(),o=t.height();r||(r={left:s/2,top:o/2});var u=r.left/s,a=r.top/o,f={x:{min:r.left-u*s/i,max:r.left+(1-u)*s/i},y:{min:r.top-a*o/i,max:r.top+(1-a)*o/i}};e.each(t.getAxes(),function(e,t){var n=t.options,r=f[t.direction].min,i=f[t.direction].max,s=n.zoomRange,o=n.panRange;if(s===!1)return;r=t.c2p(r),i=t.c2p(i);if(r>i){var u=r;r=i,i=u}o&&(o[0]!=null&&r<o[0]&&(r=o[0]),o[1]!=null&&i>o[1]&&(i=o[1]));var a=i-r;if(s&&(s[0]!=null&&a<s[0]||s[1]!=null&&a>s[1]))return;n.min=r,n.max=i}),t.setupGrid(),t.draw(),n.preventEvent||t.getPlaceholder().trigger("plotzoom",[t,n])},t.pan=function(n){var r={x:+n.left,y:+n.top};isNaN(r.x)&&(r.x=0),isNaN(r.y)&&(r.y=0),e.each(t.getAxes(),function(e,t){var n=t.options,i,s,o=r[t.direction];i=t.c2p(t.p2c(t.min)+o),s=t.c2p(t.p2c(t.max)+o);var u=n.panRange;if(u===!1)return;u&&(u[0]!=null&&u[0]>i&&(o=u[0]-i,i+=o,s+=o),u[1]!=null&&u[1]<s&&(o=u[1]-s,i+=o,s+=o)),n.min=i,n.max=s}),t.setupGrid(),t.draw(),n.preventEvent||t.getPlaceholder().trigger("plotpan",[t,n])},t.hooks.bindEvents.push(c),t.hooks.shutdown.push(h)}var t={xaxis:{zoomRange:null,panRange:null},zoom:{interactive:!1,trigger:"dblclick",amount:1.5},pan:{interactive:!1,cursor:"move",frameRate:20}};e.plot.plugins.push({init:n,options:t,name:"navigate",version:"1.3"})}(jQuery); \ No newline at end of file
+(function(i){i.fn.drag=function(j,k,l){if(k){this.bind("dragstart",j)}if(l){this.bind("dragend",l)}return !j?this.trigger("drag"):this.bind("drag",k?k:j)};var d=i.event,c=d.special,h=c.drag={not:":input",distance:0,which:1,dragging:false,setup:function(j){j=i.extend({distance:h.distance,which:h.which,not:h.not},j||{});j.distance=e(j.distance);d.add(this,"mousedown",f,j);if(this.attachEvent){this.attachEvent("ondragstart",a)}},teardown:function(){d.remove(this,"mousedown",f);if(this===h.dragging){h.dragging=h.proxy=false}g(this,true);if(this.detachEvent){this.detachEvent("ondragstart",a)}}};c.dragstart=c.dragend={setup:function(){},teardown:function(){}};function f(j){var k=this,l,m=j.data||{};if(m.elem){k=j.dragTarget=m.elem;j.dragProxy=h.proxy||k;j.cursorOffsetX=m.pageX-m.left;j.cursorOffsetY=m.pageY-m.top;j.offsetX=j.pageX-j.cursorOffsetX;j.offsetY=j.pageY-j.cursorOffsetY}else{if(h.dragging||(m.which>0&&j.which!=m.which)||i(j.target).is(m.not)){return}}switch(j.type){case"mousedown":i.extend(m,i(k).offset(),{elem:k,target:j.target,pageX:j.pageX,pageY:j.pageY});d.add(document,"mousemove mouseup",f,m);g(k,false);h.dragging=null;return false;case !h.dragging&&"mousemove":if(e(j.pageX-m.pageX)+e(j.pageY-m.pageY)<m.distance){break}j.target=m.target;l=b(j,"dragstart",k);if(l!==false){h.dragging=k;h.proxy=j.dragProxy=i(l||k)[0]}case"mousemove":if(h.dragging){l=b(j,"drag",k);if(c.drop){c.drop.allowed=(l!==false);c.drop.handler(j)}if(l!==false){break}j.type="mouseup"}case"mouseup":d.remove(document,"mousemove mouseup",f);if(h.dragging){if(c.drop){c.drop.handler(j)}b(j,"dragend",k)}g(k,true);h.dragging=h.proxy=m.elem=false;break}return true}function b(m,k,j){m.type=k;var l=i.event.handle.call(j,m);return l===false?false:l||m.result}function e(j){return Math.pow(j,2)}function a(){return(h.dragging===false)}function g(j,k){if(!j){return}j.unselectable=k?"off":"on";j.onselectstart=function(){return k};if(j.style){j.style.MozUserSelect=k?"":"none"}}})(jQuery);(function(f){var e=["DOMMouseScroll","mousewheel"];f.event.special.mousewheel={setup:function(){if(this.addEventListener){for(var a=e.length;a;){this.addEventListener(e[--a],d,false)}}else{this.onmousewheel=d}},teardown:function(){if(this.removeEventListener){for(var a=e.length;a;){this.removeEventListener(e[--a],d,false)}}else{this.onmousewheel=null}}};f.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}});function d(b){var h=[].slice.call(arguments,1),a=0,c=true;b=f.event.fix(b||window.event);b.type="mousewheel";if(b.wheelDelta){a=b.wheelDelta/120}if(b.detail){a=-b.detail/3}h.unshift(b,a);return f.event.handle.apply(this,h)}})(jQuery);(function(b){var a={xaxis:{zoomRange:null,panRange:null},zoom:{interactive:false,trigger:"dblclick",amount:1.5},pan:{interactive:false,cursor:"move",frameRate:20}};function c(o){function m(q,p){var r=o.offset();r.left=q.pageX-r.left;r.top=q.pageY-r.top;if(p){o.zoomOut({center:r})}else{o.zoom({center:r})}}function d(p,q){m(p,q<0);return false}var i="default",g=0,e=0,n=null;function f(p){if(p.which!=1){return false}var q=o.getPlaceholder().css("cursor");if(q){i=q}o.getPlaceholder().css("cursor",o.getOptions().pan.cursor);g=p.pageX;e=p.pageY}function j(q){var p=o.getOptions().pan.frameRate;if(n||!p){return}n=setTimeout(function(){o.pan({left:g-q.pageX,top:e-q.pageY});g=q.pageX;e=q.pageY;n=null},1/p*1000)}function h(p){if(n){clearTimeout(n);n=null}o.getPlaceholder().css("cursor",i);o.pan({left:g-p.pageX,top:e-p.pageY})}function l(q,p){var r=q.getOptions();if(r.zoom.interactive){p[r.zoom.trigger](m);p.mousewheel(d)}if(r.pan.interactive){p.bind("dragstart",{distance:10},f);p.bind("drag",j);p.bind("dragend",h)}}o.zoomOut=function(p){if(!p){p={}}if(!p.amount){p.amount=o.getOptions().zoom.amount}p.amount=1/p.amount;o.zoom(p)};o.zoom=function(q){if(!q){q={}}var x=q.center,r=q.amount||o.getOptions().zoom.amount,p=o.width(),t=o.height();if(!x){x={left:p/2,top:t/2}}var s=x.left/p,v=x.top/t,u={x:{min:x.left-s*p/r,max:x.left+(1-s)*p/r},y:{min:x.top-v*t/r,max:x.top+(1-v)*t/r}};b.each(o.getAxes(),function(z,C){var D=C.options,B=u[C.direction].min,w=u[C.direction].max,E=D.zoomRange;if(E===false){return}B=C.c2p(B);w=C.c2p(w);if(B>w){var A=B;B=w;w=A}var y=w-B;if(E&&((E[0]!=null&&y<E[0])||(E[1]!=null&&y>E[1]))){return}D.min=B;D.max=w});o.setupGrid();o.draw();if(!q.preventEvent){o.getPlaceholder().trigger("plotzoom",[o])}};o.pan=function(p){var q={x:+p.left,y:+p.top};if(isNaN(q.x)){q.x=0}if(isNaN(q.y)){q.y=0}b.each(o.getAxes(),function(s,u){var v=u.options,t,r,w=q[u.direction];t=u.c2p(u.p2c(u.min)+w),r=u.c2p(u.p2c(u.max)+w);var x=v.panRange;if(x===false){return}if(x){if(x[0]!=null&&x[0]>t){w=x[0]-t;t+=w;r+=w}if(x[1]!=null&&x[1]<r){w=x[1]-r;t+=w;r+=w}}v.min=t;v.max=r});o.setupGrid();o.draw();if(!p.preventEvent){o.getPlaceholder().trigger("plotpan",[o])}};function k(q,p){p.unbind(q.getOptions().zoom.trigger,m);p.unbind("mousewheel",d);p.unbind("dragstart",f);p.unbind("drag",j);p.unbind("dragend",h);if(n){clearTimeout(n)}}o.hooks.bindEvents.push(l);o.hooks.shutdown.push(k)}b.plot.plugins.push({init:c,options:a,name:"navigate",version:"1.3"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.pie.min.js b/chromium/third_party/flot/jquery.flot.pie.min.js
index 3de8f44c5d0..b7bf870d759 100644
--- a/chromium/third_party/flot/jquery.flot.pie.min.js
+++ b/chromium/third_party/flot/jquery.flot.pie.min.js
@@ -1,56 +1 @@
-/* Flot plugin for rendering pie charts.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The plugin assumes that each series has a single data value, and that each
-value is a positive integer or zero. Negative numbers don't make sense for a
-pie chart, and have unpredictable results. The values do NOT need to be
-passed in as percentages; the plugin will calculate the total and per-slice
-percentages internally.
-
-* Created by Brian Medendorp
-
-* Updated with contributions from btburnett3, Anthony Aragues and Xavi Ivars
-
-The plugin supports these options:
-
- series: {
- pie: {
- show: true/false
- radius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto'
- innerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect
- startAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result
- tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show)
- offset: {
- top: integer value to move the pie up or down
- left: integer value to move the pie left or right, or 'auto'
- },
- stroke: {
- color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF')
- width: integer pixel width of the stroke
- },
- label: {
- show: true/false, or 'auto'
- formatter: a user-defined function that modifies the text/style of the label text
- radius: 0-1 for percentage of fullsize, or a specified pixel length
- background: {
- color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000')
- opacity: 0-1
- },
- threshold: 0-1 for the percentage value at which to hide labels (if they're too small)
- },
- combine: {
- threshold: 0-1 for the percentage value at which to combine slices (if they're too small)
- color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined
- label: any text value of what the combined slice should be labeled
- }
- highlight: {
- opacity: 0-1
- }
- }
- }
-
-More detail and specific examples can be found in the included HTML file.
-
-*/(function(e){function r(r){function p(t,n,r){l||(l=!0,s=t.getCanvas(),o=e(s).parent(),i=t.getOptions(),t.setData(d(t.getData())))}function d(t){var n=0,r=0,s=0,o=i.series.pie.combine.color,u=[];for(var a=0;a<t.length;++a){var f=t[a].data;e.isArray(f)&&f.length==1&&(f=f[0]),e.isArray(f)?!isNaN(parseFloat(f[1]))&&isFinite(f[1])?f[1]=+f[1]:f[1]=0:!isNaN(parseFloat(f))&&isFinite(f)?f=[1,+f]:f=[1,0],t[a].data=[f]}for(var a=0;a<t.length;++a)n+=t[a].data[0][1];for(var a=0;a<t.length;++a){var f=t[a].data[0][1];f/n<=i.series.pie.combine.threshold&&(r+=f,s++,o||(o=t[a].color))}for(var a=0;a<t.length;++a){var f=t[a].data[0][1];(s<2||f/n>i.series.pie.combine.threshold)&&u.push({data:[[1,f]],color:t[a].color,label:t[a].label,angle:f*Math.PI*2/n,percent:f/(n/100)})}return s>1&&u.push({data:[[1,r]],color:o,label:i.series.pie.combine.label,angle:r*Math.PI*2/n,percent:r/(n/100)}),u}function v(r,s){function y(){c.clearRect(0,0,h,p),o.children().filter(".pieLabel, .pieLabelBackground").remove()}function b(){var e=i.series.pie.shadow.left,t=i.series.pie.shadow.top,n=10,r=i.series.pie.shadow.alpha,s=i.series.pie.radius>1?i.series.pie.radius:u*i.series.pie.radius;if(s>=h/2-e||s*i.series.pie.tilt>=p/2-t||s<=n)return;c.save(),c.translate(e,t),c.globalAlpha=r,c.fillStyle="#000",c.translate(a,f),c.scale(1,i.series.pie.tilt);for(var o=1;o<=n;o++)c.beginPath(),c.arc(0,0,s,0,Math.PI*2,!1),c.fill(),s-=o;c.restore()}function w(){function l(e,t,i){if(e<=0||isNaN(e))return;i?c.fillStyle=t:(c.strokeStyle=t,c.lineJoin="round"),c.beginPath(),Math.abs(e-Math.PI*2)>1e-9&&c.moveTo(0,0),c.arc(0,0,n,r,r+e/2,!1),c.arc(0,0,n,r+e/2,r+e,!1),c.closePath(),r+=e,i?c.fill():c.stroke()}function d(){function l(t,n,s){if(t.data[0][1]==0)return!0;var u=i.legend.labelFormatter,l,c=i.series.pie.label.formatter;u?l=u(t.label,t):l=t.label,c&&(l=c(l,t));var d=(n+t.angle+n)/2,v=a+Math.round(Math.cos(d)*r),m=f+Math.round(Math.sin(d)*r)*i.series.pie.tilt,g="<span class='pieLabel' id='pieLabel"+s+"' style='position:absolute;top:"+m+"px;left:"+v+"px;'>"+l+"</span>";o.append(g);var y=o.children("#pieLabel"+s),b=m-y.height()/2,w=v-y.width()/2;y.css("top",b),y.css("left",w);if(0-b>0||0-w>0||p-(b+y.height())<0||h-(w+y.width())<0)return!1;if(i.series.pie.label.background.opacity!=0){var E=i.series.pie.label.background.color;E==null&&(E=t.color);var S="top:"+b+"px;left:"+w+"px;";e("<div class='pieLabelBackground' style='position:absolute;width:"+y.width()+"px;height:"+y.height()+"px;"+S+"background-color:"+E+";'></div>").css("opacity",i.series.pie.label.background.opacity).insertBefore(y)}return!0}var n=t,r=i.series.pie.label.radius>1?i.series.pie.label.radius:u*i.series.pie.label.radius;for(var s=0;s<v.length;++s){if(v[s].percent>=i.series.pie.label.threshold*100&&!l(v[s],n,s))return!1;n+=v[s].angle}return!0}var t=Math.PI*i.series.pie.startAngle,n=i.series.pie.radius>1?i.series.pie.radius:u*i.series.pie.radius;c.save(),c.translate(a,f),c.scale(1,i.series.pie.tilt),c.save();var r=t;for(var s=0;s<v.length;++s)v[s].startAngle=r,l(v[s].angle,v[s].color,!0);c.restore();if(i.series.pie.stroke.width>0){c.save(),c.lineWidth=i.series.pie.stroke.width,r=t;for(var s=0;s<v.length;++s)l(v[s].angle,i.series.pie.stroke.color,!1);c.restore()}return m(c),c.restore(),i.series.pie.label.show?d():!0}if(!o)return;var h=r.getPlaceholder().width(),p=r.getPlaceholder().height(),d=o.children().filter(".legend").children().width()||0;c=s,l=!1,u=Math.min(h,p/i.series.pie.tilt)/2,f=p/2+i.series.pie.offset.top,a=h/2,i.series.pie.offset.left=="auto"?i.legend.position.match("w")?a+=d/2:a-=d/2:a+=i.series.pie.offset.left,a<u?a=u:a>h-u&&(a=h-u);var v=r.getData(),g=0;do g>0&&(u*=n),g+=1,y(),i.series.pie.tilt<=.8&&b();while(!w()&&g<t);g>=t&&(y(),o.prepend("<div class='error'>Could not draw pie with labels contained inside canvas</div>")),r.setSeries&&r.insertLegend&&(r.setSeries(v),r.insertLegend())}function m(e){if(i.series.pie.innerRadius>0){e.save();var t=i.series.pie.innerRadius>1?i.series.pie.innerRadius:u*i.series.pie.innerRadius;e.globalCompositeOperation="destination-out",e.beginPath(),e.fillStyle=i.series.pie.stroke.color,e.arc(0,0,t,0,Math.PI*2,!1),e.fill(),e.closePath(),e.restore(),e.save(),e.beginPath(),e.strokeStyle=i.series.pie.stroke.color,e.arc(0,0,t,0,Math.PI*2,!1),e.stroke(),e.closePath(),e.restore()}}function g(e,t){for(var n=!1,r=-1,i=e.length,s=i-1;++r<i;s=r)(e[r][1]<=t[1]&&t[1]<e[s][1]||e[s][1]<=t[1]&&t[1]<e[r][1])&&t[0]<(e[s][0]-e[r][0])*(t[1]-e[r][1])/(e[s][1]-e[r][1])+e[r][0]&&(n=!n);return n}function y(e,t){var n=r.getData(),i=r.getOptions(),s=i.series.pie.radius>1?i.series.pie.radius:u*i.series.pie.radius,o,l;for(var h=0;h<n.length;++h){var p=n[h];if(p.pie.show){c.save(),c.beginPath(),c.moveTo(0,0),c.arc(0,0,s,p.startAngle,p.startAngle+p.angle/2,!1),c.arc(0,0,s,p.startAngle+p.angle/2,p.startAngle+p.angle,!1),c.closePath(),o=e-a,l=t-f;if(c.isPointInPath){if(c.isPointInPath(e-a,t-f))return c.restore(),{datapoint:[p.percent,p.data],dataIndex:0,series:p,seriesIndex:h}}else{var d=s*Math.cos(p.startAngle),v=s*Math.sin(p.startAngle),m=s*Math.cos(p.startAngle+p.angle/4),y=s*Math.sin(p.startAngle+p.angle/4),b=s*Math.cos(p.startAngle+p.angle/2),w=s*Math.sin(p.startAngle+p.angle/2),E=s*Math.cos(p.startAngle+p.angle/1.5),S=s*Math.sin(p.startAngle+p.angle/1.5),x=s*Math.cos(p.startAngle+p.angle),T=s*Math.sin(p.startAngle+p.angle),N=[[0,0],[d,v],[m,y],[b,w],[E,S],[x,T]],C=[o,l];if(g(N,C))return c.restore(),{datapoint:[p.percent,p.data],dataIndex:0,series:p,seriesIndex:h}}c.restore()}}return null}function b(e){E("plothover",e)}function w(e){E("plotclick",e)}function E(e,t){var n=r.offset(),s=parseInt(t.pageX-n.left),u=parseInt(t.pageY-n.top),a=y(s,u);if(i.grid.autoHighlight)for(var f=0;f<h.length;++f){var l=h[f];l.auto==e&&(!a||l.series!=a.series)&&x(l.series)}a&&S(a.series,e);var c={pageX:t.pageX,pageY:t.pageY};o.trigger(e,[c,a])}function S(e,t){var n=T(e);n==-1?(h.push({series:e,auto:t}),r.triggerRedrawOverlay()):t||(h[n].auto=!1)}function x(e){e==null&&(h=[],r.triggerRedrawOverlay());var t=T(e);t!=-1&&(h.splice(t,1),r.triggerRedrawOverlay())}function T(e){for(var t=0;t<h.length;++t){var n=h[t];if(n.series==e)return t}return-1}function N(e,t){function s(e){if(e.angle<=0||isNaN(e.angle))return;t.fillStyle="rgba(255, 255, 255, "+n.series.pie.highlight.opacity+")",t.beginPath(),Math.abs(e.angle-Math.PI*2)>1e-9&&t.moveTo(0,0),t.arc(0,0,r,e.startAngle,e.startAngle+e.angle/2,!1),t.arc(0,0,r,e.startAngle+e.angle/2,e.startAngle+e.angle,!1),t.closePath(),t.fill()}var n=e.getOptions(),r=n.series.pie.radius>1?n.series.pie.radius:u*n.series.pie.radius;t.save(),t.translate(a,f),t.scale(1,n.series.pie.tilt);for(var i=0;i<h.length;++i)s(h[i].series);m(t),t.restore()}var s=null,o=null,u=null,a=null,f=null,l=!1,c=null,h=[];r.hooks.processOptions.push(function(e,t){t.series.pie.show&&(t.grid.show=!1,t.series.pie.label.show=="auto"&&(t.legend.show?t.series.pie.label.show=!1:t.series.pie.label.show=!0),t.series.pie.radius=="auto"&&(t.series.pie.label.show?t.series.pie.radius=.75:t.series.pie.radius=1),t.series.pie.tilt>1?t.series.pie.tilt=1:t.series.pie.tilt<0&&(t.series.pie.tilt=0))}),r.hooks.bindEvents.push(function(e,t){var n=e.getOptions();n.series.pie.show&&(n.grid.hoverable&&t.unbind("mousemove").mousemove(b),n.grid.clickable&&t.unbind("click").click(w))}),r.hooks.processDatapoints.push(function(e,t,n,r){var i=e.getOptions();i.series.pie.show&&p(e,t,n,r)}),r.hooks.drawOverlay.push(function(e,t){var n=e.getOptions();n.series.pie.show&&N(e,t)}),r.hooks.draw.push(function(e,t){var n=e.getOptions();n.series.pie.show&&v(e,t)})}var t=10,n=.95,i={series:{pie:{show:!1,radius:"auto",innerRadius:0,startAngle:1.5,tilt:1,shadow:{left:5,top:15,alpha:.02},offset:{top:0,left:"auto"},stroke:{color:"#fff",width:1},label:{show:"auto",formatter:function(e,t){return"<div style='font-size:x-small;text-align:center;padding:2px;color:"+t.color+";'>"+e+"<br/>"+Math.round(t.percent)+"%</div>"},radius:1,background:{color:null,opacity:0},threshold:0},combine:{threshold:-1,color:null,label:"Other"},highlight:{opacity:.5}}}};e.plot.plugins.push({init:r,options:i,name:"pie",version:"1.1"})})(jQuery); \ No newline at end of file
+(function(b){function c(D){var h=null;var L=null;var n=null;var B=null;var p=null;var M=0;var F=true;var o=10;var w=0.95;var A=0;var d=false;var z=false;var j=[];D.hooks.processOptions.push(g);D.hooks.bindEvents.push(e);function g(O,N){if(N.series.pie.show){N.grid.show=false;if(N.series.pie.label.show=="auto"){if(N.legend.show){N.series.pie.label.show=false}else{N.series.pie.label.show=true}}if(N.series.pie.radius=="auto"){if(N.series.pie.label.show){N.series.pie.radius=3/4}else{N.series.pie.radius=1}}if(N.series.pie.tilt>1){N.series.pie.tilt=1}if(N.series.pie.tilt<0){N.series.pie.tilt=0}O.hooks.processDatapoints.push(E);O.hooks.drawOverlay.push(H);O.hooks.draw.push(r)}}function e(P,N){var O=P.getOptions();if(O.series.pie.show&&O.grid.hoverable){N.unbind("mousemove").mousemove(t)}if(O.series.pie.show&&O.grid.clickable){N.unbind("click").click(l)}}function G(O){var P="";function N(S,T){if(!T){T=0}for(var R=0;R<S.length;++R){for(var Q=0;Q<T;Q++){P+="\t"}if(typeof S[R]=="object"){P+=""+R+":\n";N(S[R],T+1)}else{P+=""+R+": "+S[R]+"\n"}}}N(O);alert(P)}function q(P){for(var N=0;N<P.length;++N){var O=parseFloat(P[N].data[0][1]);if(O){M+=O}}}function E(Q,N,O,P){if(!d){d=true;h=Q.getCanvas();L=b(h).parent();a=Q.getOptions();Q.setData(K(Q.getData()))}}function I(){A=L.children().filter(".legend").children().width();n=Math.min(h.width,(h.height/a.series.pie.tilt))/2;p=(h.height/2)+a.series.pie.offset.top;B=(h.width/2);if(a.series.pie.offset.left=="auto"){if(a.legend.position.match("w")){B+=A/2}else{B-=A/2}}else{B+=a.series.pie.offset.left}if(B<n){B=n}else{if(B>h.width-n){B=h.width-n}}}function v(O){for(var N=0;N<O.length;++N){if(typeof(O[N].data)=="number"){O[N].data=[[1,O[N].data]]}else{if(typeof(O[N].data)=="undefined"||typeof(O[N].data[0])=="undefined"){if(typeof(O[N].data)!="undefined"&&typeof(O[N].data.label)!="undefined"){O[N].label=O[N].data.label}O[N].data=[[1,0]]}}}return O}function K(Q){Q=v(Q);q(Q);var P=0;var S=0;var N=a.series.pie.combine.color;var R=[];for(var O=0;O<Q.length;++O){Q[O].data[0][1]=parseFloat(Q[O].data[0][1]);if(!Q[O].data[0][1]){Q[O].data[0][1]=0}if(Q[O].data[0][1]/M<=a.series.pie.combine.threshold){P+=Q[O].data[0][1];S++;if(!N){N=Q[O].color}}else{R.push({data:[[1,Q[O].data[0][1]]],color:Q[O].color,label:Q[O].label,angle:(Q[O].data[0][1]*(Math.PI*2))/M,percent:(Q[O].data[0][1]/M*100)})}}if(S>0){R.push({data:[[1,P]],color:N,label:a.series.pie.combine.label,angle:(P*(Math.PI*2))/M,percent:(P/M*100)})}return R}function r(S,Q){if(!L){return}ctx=Q;I();var T=S.getData();var P=0;while(F&&P<o){F=false;if(P>0){n*=w}P+=1;N();if(a.series.pie.tilt<=0.8){O()}R()}if(P>=o){N();L.prepend('<div class="error">Could not draw pie with labels contained inside canvas</div>')}if(S.setSeries&&S.insertLegend){S.setSeries(T);S.insertLegend()}function N(){ctx.clearRect(0,0,h.width,h.height);L.children().filter(".pieLabel, .pieLabelBackground").remove()}function O(){var Z=5;var Y=15;var W=10;var X=0.02;if(a.series.pie.radius>1){var U=a.series.pie.radius}else{var U=n*a.series.pie.radius}if(U>=(h.width/2)-Z||U*a.series.pie.tilt>=(h.height/2)-Y||U<=W){return}ctx.save();ctx.translate(Z,Y);ctx.globalAlpha=X;ctx.fillStyle="#000";ctx.translate(B,p);ctx.scale(1,a.series.pie.tilt);for(var V=1;V<=W;V++){ctx.beginPath();ctx.arc(0,0,U,0,Math.PI*2,false);ctx.fill();U-=V}ctx.restore()}function R(){startAngle=Math.PI*a.series.pie.startAngle;if(a.series.pie.radius>1){var U=a.series.pie.radius}else{var U=n*a.series.pie.radius}ctx.save();ctx.translate(B,p);ctx.scale(1,a.series.pie.tilt);ctx.save();var Y=startAngle;for(var W=0;W<T.length;++W){T[W].startAngle=Y;X(T[W].angle,T[W].color,true)}ctx.restore();ctx.save();ctx.lineWidth=a.series.pie.stroke.width;Y=startAngle;for(var W=0;W<T.length;++W){X(T[W].angle,a.series.pie.stroke.color,false)}ctx.restore();J(ctx);if(a.series.pie.label.show){V()}ctx.restore();function X(ab,Z,aa){if(ab<=0){return}if(aa){ctx.fillStyle=Z}else{ctx.strokeStyle=Z;ctx.lineJoin="round"}ctx.beginPath();if(Math.abs(ab-Math.PI*2)>1e-9){ctx.moveTo(0,0)}else{if(b.browser.msie){ab-=0.0001}}ctx.arc(0,0,U,Y,Y+ab,false);ctx.closePath();Y+=ab;if(aa){ctx.fill()}else{ctx.stroke()}}function V(){var ac=startAngle;if(a.series.pie.label.radius>1){var Z=a.series.pie.label.radius}else{var Z=n*a.series.pie.label.radius}for(var ab=0;ab<T.length;++ab){if(T[ab].percent>=a.series.pie.label.threshold*100){aa(T[ab],ac,ab)}ac+=T[ab].angle}function aa(ap,ai,ag){if(ap.data[0][1]==0){return}var ar=a.legend.labelFormatter,aq,ae=a.series.pie.label.formatter;if(ar){aq=ar(ap.label,ap)}else{aq=ap.label}if(ae){aq=ae(aq,ap)}var aj=((ai+ap.angle)+ai)/2;var ao=B+Math.round(Math.cos(aj)*Z);var am=p+Math.round(Math.sin(aj)*Z)*a.series.pie.tilt;var af='<span class="pieLabel" id="pieLabel'+ag+'" style="position:absolute;top:'+am+"px;left:"+ao+'px;">'+aq+"</span>";L.append(af);var an=L.children("#pieLabel"+ag);var ad=(am-an.height()/2);var ah=(ao-an.width()/2);an.css("top",ad);an.css("left",ah);if(0-ad>0||0-ah>0||h.height-(ad+an.height())<0||h.width-(ah+an.width())<0){F=true}if(a.series.pie.label.background.opacity!=0){var ak=a.series.pie.label.background.color;if(ak==null){ak=ap.color}var al="top:"+ad+"px;left:"+ah+"px;";b('<div class="pieLabelBackground" style="position:absolute;width:'+an.width()+"px;height:"+an.height()+"px;"+al+"background-color:"+ak+';"> </div>').insertBefore(an).css("opacity",a.series.pie.label.background.opacity)}}}}}function J(N){if(a.series.pie.innerRadius>0){N.save();innerRadius=a.series.pie.innerRadius>1?a.series.pie.innerRadius:n*a.series.pie.innerRadius;N.globalCompositeOperation="destination-out";N.beginPath();N.fillStyle=a.series.pie.stroke.color;N.arc(0,0,innerRadius,0,Math.PI*2,false);N.fill();N.closePath();N.restore();N.save();N.beginPath();N.strokeStyle=a.series.pie.stroke.color;N.arc(0,0,innerRadius,0,Math.PI*2,false);N.stroke();N.closePath();N.restore()}}function s(Q,R){for(var S=false,P=-1,N=Q.length,O=N-1;++P<N;O=P){((Q[P][1]<=R[1]&&R[1]<Q[O][1])||(Q[O][1]<=R[1]&&R[1]<Q[P][1]))&&(R[0]<(Q[O][0]-Q[P][0])*(R[1]-Q[P][1])/(Q[O][1]-Q[P][1])+Q[P][0])&&(S=!S)}return S}function u(R,P){var T=D.getData(),O=D.getOptions(),N=O.series.pie.radius>1?O.series.pie.radius:n*O.series.pie.radius;for(var Q=0;Q<T.length;++Q){var S=T[Q];if(S.pie.show){ctx.save();ctx.beginPath();ctx.moveTo(0,0);ctx.arc(0,0,N,S.startAngle,S.startAngle+S.angle,false);ctx.closePath();x=R-B;y=P-p;if(ctx.isPointInPath){if(ctx.isPointInPath(R-B,P-p)){ctx.restore();return{datapoint:[S.percent,S.data],dataIndex:0,series:S,seriesIndex:Q}}}else{p1X=(N*Math.cos(S.startAngle));p1Y=(N*Math.sin(S.startAngle));p2X=(N*Math.cos(S.startAngle+(S.angle/4)));p2Y=(N*Math.sin(S.startAngle+(S.angle/4)));p3X=(N*Math.cos(S.startAngle+(S.angle/2)));p3Y=(N*Math.sin(S.startAngle+(S.angle/2)));p4X=(N*Math.cos(S.startAngle+(S.angle/1.5)));p4Y=(N*Math.sin(S.startAngle+(S.angle/1.5)));p5X=(N*Math.cos(S.startAngle+S.angle));p5Y=(N*Math.sin(S.startAngle+S.angle));arrPoly=[[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]];arrPoint=[x,y];if(s(arrPoly,arrPoint)){ctx.restore();return{datapoint:[S.percent,S.data],dataIndex:0,series:S,seriesIndex:Q}}}ctx.restore()}}return null}function t(N){m("plothover",N)}function l(N){m("plotclick",N)}function m(N,T){var O=D.offset(),R=parseInt(T.pageX-O.left),P=parseInt(T.pageY-O.top),V=u(R,P);if(a.grid.autoHighlight){for(var Q=0;Q<j.length;++Q){var S=j[Q];if(S.auto==N&&!(V&&S.series==V.series)){f(S.series)}}}if(V){k(V.series,N)}var U={pageX:T.pageX,pageY:T.pageY};L.trigger(N,[U,V])}function k(O,P){if(typeof O=="number"){O=series[O]}var N=C(O);if(N==-1){j.push({series:O,auto:P});D.triggerRedrawOverlay()}else{if(!P){j[N].auto=false}}}function f(O){if(O==null){j=[];D.triggerRedrawOverlay()}if(typeof O=="number"){O=series[O]}var N=C(O);if(N!=-1){j.splice(N,1);D.triggerRedrawOverlay()}}function C(P){for(var N=0;N<j.length;++N){var O=j[N];if(O.series==P){return N}}return -1}function H(Q,R){var P=Q.getOptions();var N=P.series.pie.radius>1?P.series.pie.radius:n*P.series.pie.radius;R.save();R.translate(B,p);R.scale(1,P.series.pie.tilt);for(i=0;i<j.length;++i){O(j[i].series)}J(R);R.restore();function O(S){if(S.angle<0){return}R.fillStyle="rgba(255, 255, 255, "+P.series.pie.highlight.opacity+")";R.beginPath();if(Math.abs(S.angle-Math.PI*2)>1e-9){R.moveTo(0,0)}R.arc(0,0,N,S.startAngle,S.startAngle+S.angle,false);R.closePath();R.fill()}}}var a={series:{pie:{show:false,radius:"auto",innerRadius:0,startAngle:3/2,tilt:1,offset:{top:0,left:"auto"},stroke:{color:"#FFF",width:1},label:{show:"auto",formatter:function(d,e){return'<div style="font-size:x-small;text-align:center;padding:2px;color:'+e.color+';">'+d+"<br/>"+Math.round(e.percent)+"%</div>"},radius:1,background:{color:null,opacity:0},threshold:0},combine:{threshold:-1,color:null,label:"Other"},highlight:{opacity:0.5}}}};b.plot.plugins.push({init:c,options:a,name:"pie",version:"1.0"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.resize.min.js b/chromium/third_party/flot/jquery.flot.resize.min.js
index b2ddec10cc7..1fa0771f570 100644
--- a/chromium/third_party/flot/jquery.flot.resize.min.js
+++ b/chromium/third_party/flot/jquery.flot.resize.min.js
@@ -1,19 +1 @@
-/* Flot plugin for automatically redrawing plots as the placeholder resizes.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-It works by listening for changes on the placeholder div (through the jQuery
-resize event plugin) - if the size changes, it will redraw the plot.
-
-There are no options. If you need to disable the plugin for some plots, you
-can just fix the size of their placeholders.
-
-*//* Inline dependency:
- * jQuery resize event - v1.1 - 3/14/2010
- * http://benalman.com/projects/jquery-resize-plugin/
- *
- * Copyright (c) 2010 "Cowboy" Ben Alman
- * Dual licensed under the MIT and GPL licenses.
- * http://benalman.com/about/license/
- */(function(e,t,n){function c(){s=t[o](function(){r.each(function(){var t=e(this),n=t.width(),r=t.height(),i=e.data(this,a);(n!==i.w||r!==i.h)&&t.trigger(u,[i.w=n,i.h=r])}),c()},i[f])}var r=e([]),i=e.resize=e.extend(e.resize,{}),s,o="setTimeout",u="resize",a=u+"-special-event",f="delay",l="throttleWindow";i[f]=250,i[l]=!0,e.event.special[u]={setup:function(){if(!i[l]&&this[o])return!1;var t=e(this);r=r.add(t),e.data(this,a,{w:t.width(),h:t.height()}),r.length===1&&c()},teardown:function(){if(!i[l]&&this[o])return!1;var t=e(this);r=r.not(t),t.removeData(a),r.length||clearTimeout(s)},add:function(t){function s(t,i,s){var o=e(this),u=e.data(this,a);u.w=i!==n?i:o.width(),u.h=s!==n?s:o.height(),r.apply(this,arguments)}if(!i[l]&&this[o])return!1;var r;if(e.isFunction(t))return r=t,s;r=t.handler,t.handler=s}}})(jQuery,this),function(e){function n(e){function t(){var t=e.getPlaceholder();if(t.width()==0||t.height()==0)return;e.resize(),e.setupGrid(),e.draw()}function n(e,n){e.getPlaceholder().resize(t)}function r(e,n){e.getPlaceholder().unbind("resize",t)}e.hooks.bindEvents.push(n),e.hooks.shutdown.push(r)}var t={};e.plot.plugins.push({init:n,options:t,name:"resize",version:"1.0"})}(jQuery); \ No newline at end of file
+(function(n,p,u){var w=n([]),s=n.resize=n.extend(n.resize,{}),o,l="setTimeout",m="resize",t=m+"-special-event",v="delay",r="throttleWindow";s[v]=250;s[r]=true;n.event.special[m]={setup:function(){if(!s[r]&&this[l]){return false}var a=n(this);w=w.add(a);n.data(this,t,{w:a.width(),h:a.height()});if(w.length===1){q()}},teardown:function(){if(!s[r]&&this[l]){return false}var a=n(this);w=w.not(a);a.removeData(t);if(!w.length){clearTimeout(o)}},add:function(b){if(!s[r]&&this[l]){return false}var c;function a(d,h,g){var f=n(this),e=n.data(this,t);e.w=h!==u?h:f.width();e.h=g!==u?g:f.height();c.apply(this,arguments)}if(n.isFunction(b)){c=b;return a}else{c=b.handler;b.handler=a}}};function q(){o=p[l](function(){w.each(function(){var d=n(this),a=d.width(),b=d.height(),c=n.data(this,t);if(a!==c.w||b!==c.h){d.trigger(m,[c.w=a,c.h=b])}});q()},s[v])}})(jQuery,this);(function(b){var a={};function c(f){function e(){var h=f.getPlaceholder();if(h.width()==0||h.height()==0){return}f.resize();f.setupGrid();f.draw()}function g(i,h){i.getPlaceholder().resize(e)}function d(i,h){i.getPlaceholder().unbind("resize",e)}f.hooks.bindEvents.push(g);f.hooks.shutdown.push(d)}b.plot.plugins.push({init:c,options:a,name:"resize",version:"1.0"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.selection.min.js b/chromium/third_party/flot/jquery.flot.selection.min.js
index bbfb975f432..badc0052dbe 100644
--- a/chromium/third_party/flot/jquery.flot.selection.min.js
+++ b/chromium/third_party/flot/jquery.flot.selection.min.js
@@ -1,79 +1 @@
-/* Flot plugin for selecting regions of a plot.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The plugin supports these options:
-
-selection: {
- mode: null or "x" or "y" or "xy",
- color: color,
- shape: "round" or "miter" or "bevel",
- minSize: number of pixels
-}
-
-Selection support is enabled by setting the mode to one of "x", "y" or "xy".
-In "x" mode, the user will only be able to specify the x range, similarly for
-"y" mode. For "xy", the selection becomes a rectangle where both ranges can be
-specified. "color" is color of the selection (if you need to change the color
-later on, you can get to it with plot.getOptions().selection.color). "shape"
-is the shape of the corners of the selection.
-
-"minSize" is the minimum size a selection can be in pixels. This value can
-be customized to determine the smallest size a selection can be and still
-have the selection rectangle be displayed. When customizing this value, the
-fact that it refers to pixels, not axis units must be taken into account.
-Thus, for example, if there is a bar graph in time mode with BarWidth set to 1
-minute, setting "minSize" to 1 will not make the minimum selection size 1
-minute, but rather 1 pixel. Note also that setting "minSize" to 0 will prevent
-"plotunselected" events from being fired when the user clicks the mouse without
-dragging.
-
-When selection support is enabled, a "plotselected" event will be emitted on
-the DOM element you passed into the plot function. The event handler gets a
-parameter with the ranges selected on the axes, like this:
-
- placeholder.bind( "plotselected", function( event, ranges ) {
- alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to)
- // similar for yaxis - with multiple axes, the extra ones are in
- // x2axis, x3axis, ...
- });
-
-The "plotselected" event is only fired when the user has finished making the
-selection. A "plotselecting" event is fired during the process with the same
-parameters as the "plotselected" event, in case you want to know what's
-happening while it's happening,
-
-A "plotunselected" event with no arguments is emitted when the user clicks the
-mouse to remove the selection. As stated above, setting "minSize" to 0 will
-destroy this behavior.
-
-The plugin allso adds the following methods to the plot object:
-
-- setSelection( ranges, preventEvent )
-
- Set the selection rectangle. The passed in ranges is on the same form as
- returned in the "plotselected" event. If the selection mode is "x", you
- should put in either an xaxis range, if the mode is "y" you need to put in
- an yaxis range and both xaxis and yaxis if the selection mode is "xy", like
- this:
-
- setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } });
-
- setSelection will trigger the "plotselected" event when called. If you don't
- want that to happen, e.g. if you're inside a "plotselected" handler, pass
- true as the second parameter. If you are using multiple axes, you can
- specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of
- xaxis, the plugin picks the first one it sees.
-
-- clearSelection( preventEvent )
-
- Clear the selection rectangle. Pass in true to avoid getting a
- "plotunselected" event.
-
-- getSelection()
-
- Returns the current selection in the same format as the "plotselected"
- event. If there's currently no selection, the function returns null.
-
-*/(function(e){function t(t){function s(e){n.active&&(h(e),t.getPlaceholder().trigger("plotselecting",[a()]))}function o(t){if(t.which!=1)return;document.body.focus(),document.onselectstart!==undefined&&r.onselectstart==null&&(r.onselectstart=document.onselectstart,document.onselectstart=function(){return!1}),document.ondrag!==undefined&&r.ondrag==null&&(r.ondrag=document.ondrag,document.ondrag=function(){return!1}),c(n.first,t),n.active=!0,i=function(e){u(e)},e(document).one("mouseup",i)}function u(e){return i=null,document.onselectstart!==undefined&&(document.onselectstart=r.onselectstart),document.ondrag!==undefined&&(document.ondrag=r.ondrag),n.active=!1,h(e),m()?f():(t.getPlaceholder().trigger("plotunselected",[]),t.getPlaceholder().trigger("plotselecting",[null])),!1}function a(){if(!m())return null;if(!n.show)return null;var r={},i=n.first,s=n.second;return e.each(t.getAxes(),function(e,t){if(t.used){var n=t.c2p(i[t.direction]),o=t.c2p(s[t.direction]);r[e]={from:Math.min(n,o),to:Math.max(n,o)}}}),r}function f(){var e=a();t.getPlaceholder().trigger("plotselected",[e]),e.xaxis&&e.yaxis&&t.getPlaceholder().trigger("selected",[{x1:e.xaxis.from,y1:e.yaxis.from,x2:e.xaxis.to,y2:e.yaxis.to}])}function l(e,t,n){return t<e?e:t>n?n:t}function c(e,r){var i=t.getOptions(),s=t.getPlaceholder().offset(),o=t.getPlotOffset();e.x=l(0,r.pageX-s.left-o.left,t.width()),e.y=l(0,r.pageY-s.top-o.top,t.height()),i.selection.mode=="y"&&(e.x=e==n.first?0:t.width()),i.selection.mode=="x"&&(e.y=e==n.first?0:t.height())}function h(e){if(e.pageX==null)return;c(n.second,e),m()?(n.show=!0,t.triggerRedrawOverlay()):p(!0)}function p(e){n.show&&(n.show=!1,t.triggerRedrawOverlay(),e||t.getPlaceholder().trigger("plotunselected",[]))}function d(e,n){var r,i,s,o,u=t.getAxes();for(var a in u){r=u[a];if(r.direction==n){o=n+r.n+"axis",!e[o]&&r.n==1&&(o=n+"axis");if(e[o]){i=e[o].from,s=e[o].to;break}}}e[o]||(r=n=="x"?t.getXAxes()[0]:t.getYAxes()[0],i=e[n+"1"],s=e[n+"2"]);if(i!=null&&s!=null&&i>s){var f=i;i=s,s=f}return{from:i,to:s,axis:r}}function v(e,r){var i,s,o=t.getOptions();o.selection.mode=="y"?(n.first.x=0,n.second.x=t.width()):(s=d(e,"x"),n.first.x=s.axis.p2c(s.from),n.second.x=s.axis.p2c(s.to)),o.selection.mode=="x"?(n.first.y=0,n.second.y=t.height()):(s=d(e,"y"),n.first.y=s.axis.p2c(s.from),n.second.y=s.axis.p2c(s.to)),n.show=!0,t.triggerRedrawOverlay(),!r&&m()&&f()}function m(){var e=t.getOptions().selection.minSize;return Math.abs(n.second.x-n.first.x)>=e&&Math.abs(n.second.y-n.first.y)>=e}var n={first:{x:-1,y:-1},second:{x:-1,y:-1},show:!1,active:!1},r={},i=null;t.clearSelection=p,t.setSelection=v,t.getSelection=a,t.hooks.bindEvents.push(function(e,t){var n=e.getOptions();n.selection.mode!=null&&(t.mousemove(s),t.mousedown(o))}),t.hooks.drawOverlay.push(function(t,r){if(n.show&&m()){var i=t.getPlotOffset(),s=t.getOptions();r.save(),r.translate(i.left,i.top);var o=e.color.parse(s.selection.color);r.strokeStyle=o.scale("a",.8).toString(),r.lineWidth=1,r.lineJoin=s.selection.shape,r.fillStyle=o.scale("a",.4).toString();var u=Math.min(n.first.x,n.second.x)+.5,a=Math.min(n.first.y,n.second.y)+.5,f=Math.abs(n.second.x-n.first.x)-1,l=Math.abs(n.second.y-n.first.y)-1;r.fillRect(u,a,f,l),r.strokeRect(u,a,f,l),r.restore()}}),t.hooks.shutdown.push(function(t,n){n.unbind("mousemove",s),n.unbind("mousedown",o),i&&e(document).unbind("mouseup",i)})}e.plot.plugins.push({init:t,options:{selection:{mode:null,color:"#e8cfac",shape:"round",minSize:5}},name:"selection",version:"1.1"})})(jQuery); \ No newline at end of file
+(function(a){function b(k){var p={first:{x:-1,y:-1},second:{x:-1,y:-1},show:false,active:false};var m={};var r=null;function e(s){if(p.active){l(s);k.getPlaceholder().trigger("plotselecting",[g()])}}function n(s){if(s.which!=1){return}document.body.focus();if(document.onselectstart!==undefined&&m.onselectstart==null){m.onselectstart=document.onselectstart;document.onselectstart=function(){return false}}if(document.ondrag!==undefined&&m.ondrag==null){m.ondrag=document.ondrag;document.ondrag=function(){return false}}d(p.first,s);p.active=true;r=function(t){j(t)};a(document).one("mouseup",r)}function j(s){r=null;if(document.onselectstart!==undefined){document.onselectstart=m.onselectstart}if(document.ondrag!==undefined){document.ondrag=m.ondrag}p.active=false;l(s);if(f()){i()}else{k.getPlaceholder().trigger("plotunselected",[]);k.getPlaceholder().trigger("plotselecting",[null])}return false}function g(){if(!f()){return null}var u={},t=p.first,s=p.second;a.each(k.getAxes(),function(v,w){if(w.used){var y=w.c2p(t[w.direction]),x=w.c2p(s[w.direction]);u[v]={from:Math.min(y,x),to:Math.max(y,x)}}});return u}function i(){var s=g();k.getPlaceholder().trigger("plotselected",[s]);if(s.xaxis&&s.yaxis){k.getPlaceholder().trigger("selected",[{x1:s.xaxis.from,y1:s.yaxis.from,x2:s.xaxis.to,y2:s.yaxis.to}])}}function h(t,u,s){return u<t?t:(u>s?s:u)}function d(w,t){var v=k.getOptions();var u=k.getPlaceholder().offset();var s=k.getPlotOffset();w.x=h(0,t.pageX-u.left-s.left,k.width());w.y=h(0,t.pageY-u.top-s.top,k.height());if(v.selection.mode=="y"){w.x=w==p.first?0:k.width()}if(v.selection.mode=="x"){w.y=w==p.first?0:k.height()}}function l(s){if(s.pageX==null){return}d(p.second,s);if(f()){p.show=true;k.triggerRedrawOverlay()}else{q(true)}}function q(s){if(p.show){p.show=false;k.triggerRedrawOverlay();if(!s){k.getPlaceholder().trigger("plotunselected",[])}}}function c(s,w){var t,y,z,A,x=k.getAxes();for(var u in x){t=x[u];if(t.direction==w){A=w+t.n+"axis";if(!s[A]&&t.n==1){A=w+"axis"}if(s[A]){y=s[A].from;z=s[A].to;break}}}if(!s[A]){t=w=="x"?k.getXAxes()[0]:k.getYAxes()[0];y=s[w+"1"];z=s[w+"2"]}if(y!=null&&z!=null&&y>z){var v=y;y=z;z=v}return{from:y,to:z,axis:t}}function o(t,s){var v,u,w=k.getOptions();if(w.selection.mode=="y"){p.first.x=0;p.second.x=k.width()}else{u=c(t,"x");p.first.x=u.axis.p2c(u.from);p.second.x=u.axis.p2c(u.to)}if(w.selection.mode=="x"){p.first.y=0;p.second.y=k.height()}else{u=c(t,"y");p.first.y=u.axis.p2c(u.from);p.second.y=u.axis.p2c(u.to)}p.show=true;k.triggerRedrawOverlay();if(!s&&f()){i()}}function f(){var s=5;return Math.abs(p.second.x-p.first.x)>=s&&Math.abs(p.second.y-p.first.y)>=s}k.clearSelection=q;k.setSelection=o;k.getSelection=g;k.hooks.bindEvents.push(function(t,s){var u=t.getOptions();if(u.selection.mode!=null){s.mousemove(e);s.mousedown(n)}});k.hooks.drawOverlay.push(function(v,D){if(p.show&&f()){var t=v.getPlotOffset();var s=v.getOptions();D.save();D.translate(t.left,t.top);var z=a.color.parse(s.selection.color);D.strokeStyle=z.scale("a",0.8).toString();D.lineWidth=1;D.lineJoin="round";D.fillStyle=z.scale("a",0.4).toString();var B=Math.min(p.first.x,p.second.x),A=Math.min(p.first.y,p.second.y),C=Math.abs(p.second.x-p.first.x),u=Math.abs(p.second.y-p.first.y);D.fillRect(B,A,C,u);D.strokeRect(B,A,C,u);D.restore()}});k.hooks.shutdown.push(function(t,s){s.unbind("mousemove",e);s.unbind("mousedown",n);if(r){a(document).unbind("mouseup",r)}})}a.plot.plugins.push({init:b,options:{selection:{mode:null,color:"#e8cfac"}},name:"selection",version:"1.1"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.stack.min.js b/chromium/third_party/flot/jquery.flot.stack.min.js
index 14e9931fe70..bba2a0e5ff7 100644
--- a/chromium/third_party/flot/jquery.flot.stack.min.js
+++ b/chromium/third_party/flot/jquery.flot.stack.min.js
@@ -1,36 +1 @@
-/* Flot plugin for stacking data sets rather than overlyaing them.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The plugin assumes the data is sorted on x (or y if stacking horizontally).
-For line charts, it is assumed that if a line has an undefined gap (from a
-null point), then the line above it should have the same gap - insert zeros
-instead of "null" if you want another behaviour. This also holds for the start
-and end of the chart. Note that stacking a mix of positive and negative values
-in most instances doesn't make sense (so it looks weird).
-
-Two or more series are stacked when their "stack" attribute is set to the same
-key (which can be any number or string or just "true"). To specify the default
-stack, you can set the stack option like this:
-
- series: {
- stack: null/false, true, or a key (number/string)
- }
-
-You can also specify it for a single series, like this:
-
- $.plot( $("#placeholder"), [{
- data: [ ... ],
- stack: true
- }])
-
-The stacking order is determined by the order of the data series in the array
-(later series end up on top of the previous).
-
-Internally, the plugin modifies the datapoints in each series, adding an
-offset to the y value. For line series, extra data points are inserted through
-interpolation. If there's a second y value, it's also adjusted (e.g for bar
-charts or filled areas).
-
-*/(function(e){function n(e){function t(e,t){var n=null;for(var r=0;r<t.length;++r){if(e==t[r])break;t[r].stack==e.stack&&(n=t[r])}return n}function n(e,n,r){if(n.stack==null||n.stack===!1)return;var i=t(n,e.getData());if(!i)return;var s=r.pointsize,o=r.points,u=i.datapoints.pointsize,a=i.datapoints.points,f=[],l,c,h,p,d,v,m=n.lines.show,g=n.bars.horizontal,y=s>2&&(g?r.format[2].x:r.format[2].y),b=m&&n.lines.steps,w=!0,E=g?1:0,S=g?0:1,x=0,T=0,N,C;for(;;){if(x>=o.length)break;N=f.length;if(o[x]==null){for(C=0;C<s;++C)f.push(o[x+C]);x+=s}else if(T>=a.length){if(!m)for(C=0;C<s;++C)f.push(o[x+C]);x+=s}else if(a[T]==null){for(C=0;C<s;++C)f.push(null);w=!0,T+=u}else{l=o[x+E],c=o[x+S],p=a[T+E],d=a[T+S],v=0;if(l==p){for(C=0;C<s;++C)f.push(o[x+C]);f[N+S]+=d,v=d,x+=s,T+=u}else if(l>p){if(m&&x>0&&o[x-s]!=null){h=c+(o[x-s+S]-c)*(p-l)/(o[x-s+E]-l),f.push(p),f.push(h+d);for(C=2;C<s;++C)f.push(o[x+C]);v=d}T+=u}else{if(w&&m){x+=s;continue}for(C=0;C<s;++C)f.push(o[x+C]);m&&T>0&&a[T-u]!=null&&(v=d+(a[T-u+S]-d)*(l-p)/(a[T-u+E]-p)),f[N+S]+=v,x+=s}w=!1,N!=f.length&&y&&(f[N+2]+=v)}if(b&&N!=f.length&&N>0&&f[N]!=null&&f[N]!=f[N-s]&&f[N+1]!=f[N-s+1]){for(C=0;C<s;++C)f[N+s+C]=f[N+C];f[N+1]=f[N-s+1]}}r.points=f}e.hooks.processDatapoints.push(n)}var t={series:{stack:null}};e.plot.plugins.push({init:n,options:t,name:"stack",version:"1.2"})})(jQuery); \ No newline at end of file
+(function(b){var a={series:{stack:null}};function c(f){function d(k,j){var h=null;for(var g=0;g<j.length;++g){if(k==j[g]){break}if(j[g].stack==k.stack){h=j[g]}}return h}function e(C,v,g){if(v.stack==null){return}var p=d(v,C.getData());if(!p){return}var z=g.pointsize,F=g.points,h=p.datapoints.pointsize,y=p.datapoints.points,t=[],x,w,k,J,I,r,u=v.lines.show,G=v.bars.horizontal,o=z>2&&(G?g.format[2].x:g.format[2].y),n=u&&v.lines.steps,E=true,q=G?1:0,H=G?0:1,D=0,B=0,A;while(true){if(D>=F.length){break}A=t.length;if(F[D]==null){for(m=0;m<z;++m){t.push(F[D+m])}D+=z}else{if(B>=y.length){if(!u){for(m=0;m<z;++m){t.push(F[D+m])}}D+=z}else{if(y[B]==null){for(m=0;m<z;++m){t.push(null)}E=true;B+=h}else{x=F[D+q];w=F[D+H];J=y[B+q];I=y[B+H];r=0;if(x==J){for(m=0;m<z;++m){t.push(F[D+m])}t[A+H]+=I;r=I;D+=z;B+=h}else{if(x>J){if(u&&D>0&&F[D-z]!=null){k=w+(F[D-z+H]-w)*(J-x)/(F[D-z+q]-x);t.push(J);t.push(k+I);for(m=2;m<z;++m){t.push(F[D+m])}r=I}B+=h}else{if(E&&u){D+=z;continue}for(m=0;m<z;++m){t.push(F[D+m])}if(u&&B>0&&y[B-h]!=null){r=I+(y[B-h+H]-I)*(x-J)/(y[B-h+q]-J)}t[A+H]+=r;D+=z}}E=false;if(A!=t.length&&o){t[A+2]+=r}}}}if(n&&A!=t.length&&A>0&&t[A]!=null&&t[A]!=t[A-z]&&t[A+1]!=t[A-z+1]){for(m=0;m<z;++m){t[A+z+m]=t[A+m]}t[A+1]=t[A-z+1]}}g.points=t}f.hooks.processDatapoints.push(e)}b.plot.plugins.push({init:c,options:a,name:"stack",version:"1.2"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.symbol.min.js b/chromium/third_party/flot/jquery.flot.symbol.min.js
index b78ea2ec5be..272e003ab49 100644
--- a/chromium/third_party/flot/jquery.flot.symbol.min.js
+++ b/chromium/third_party/flot/jquery.flot.symbol.min.js
@@ -1,14 +1 @@
-/* Flot plugin that adds some extra symbols for plotting points.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The symbols are accessed as strings through the standard symbol options:
-
- series: {
- points: {
- symbol: "square" // or "diamond", "triangle", "cross"
- }
- }
-
-*/(function(e){function t(e,t,n){var r={square:function(e,t,n,r,i){var s=r*Math.sqrt(Math.PI)/2;e.rect(t-s,n-s,s+s,s+s)},diamond:function(e,t,n,r,i){var s=r*Math.sqrt(Math.PI/2);e.moveTo(t-s,n),e.lineTo(t,n-s),e.lineTo(t+s,n),e.lineTo(t,n+s),e.lineTo(t-s,n)},triangle:function(e,t,n,r,i){var s=r*Math.sqrt(2*Math.PI/Math.sin(Math.PI/3)),o=s*Math.sin(Math.PI/3);e.moveTo(t-s/2,n+o/2),e.lineTo(t+s/2,n+o/2),i||(e.lineTo(t,n-o/2),e.lineTo(t-s/2,n+o/2))},cross:function(e,t,n,r,i){var s=r*Math.sqrt(Math.PI)/2;e.moveTo(t-s,n-s),e.lineTo(t+s,n+s),e.moveTo(t-s,n+s),e.lineTo(t+s,n-s)}},i=t.points.symbol;r[i]&&(t.points.symbol=r[i])}function n(e){e.hooks.processDatapoints.push(t)}e.plot.plugins.push({init:n,name:"symbols",version:"1.0"})})(jQuery); \ No newline at end of file
+(function(b){function a(h,e,g){var d={square:function(k,j,n,i,m){var l=i*Math.sqrt(Math.PI)/2;k.rect(j-l,n-l,l+l,l+l)},diamond:function(k,j,n,i,m){var l=i*Math.sqrt(Math.PI/2);k.moveTo(j-l,n);k.lineTo(j,n-l);k.lineTo(j+l,n);k.lineTo(j,n+l);k.lineTo(j-l,n)},triangle:function(l,k,o,j,n){var m=j*Math.sqrt(2*Math.PI/Math.sin(Math.PI/3));var i=m*Math.sin(Math.PI/3);l.moveTo(k-m/2,o+i/2);l.lineTo(k+m/2,o+i/2);if(!n){l.lineTo(k,o-i/2);l.lineTo(k-m/2,o+i/2)}},cross:function(k,j,n,i,m){var l=i*Math.sqrt(Math.PI)/2;k.moveTo(j-l,n-l);k.lineTo(j+l,n+l);k.moveTo(j-l,n+l);k.lineTo(j+l,n-l)}};var f=e.points.symbol;if(d[f]){e.points.symbol=d[f]}}function c(d){d.hooks.processDatapoints.push(a)}b.plot.plugins.push({init:c,name:"symbols",version:"1.0"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.threshold.min.js b/chromium/third_party/flot/jquery.flot.threshold.min.js
index 1ca88a6ce9b..d8b79dfc93c 100644
--- a/chromium/third_party/flot/jquery.flot.threshold.min.js
+++ b/chromium/third_party/flot/jquery.flot.threshold.min.js
@@ -1,43 +1 @@
-/* Flot plugin for thresholding data.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-The plugin supports these options:
-
- series: {
- threshold: {
- below: number
- color: colorspec
- }
- }
-
-It can also be applied to a single series, like this:
-
- $.plot( $("#placeholder"), [{
- data: [ ... ],
- threshold: { ... }
- }])
-
-An array can be passed for multiple thresholding, like this:
-
- threshold: [{
- below: number1
- color: color1
- },{
- below: number2
- color: color2
- }]
-
-These multiple threshold objects can be passed in any order since they are
-sorted by the processing function.
-
-The data points below "below" are drawn with the specified color. This makes
-it easy to mark points below 0, e.g. for budget data.
-
-Internally, the plugin works by splitting the data into two series, above and
-below the threshold. The extra series below the threshold will have its label
-cleared and the special "originSeries" attribute set to the original series.
-You may need to check for this in hover events.
-
-*/(function(e){function n(t){function n(t,n,r,i,s){var o=r.pointsize,u,a,f,l,c,h=e.extend({},n);h.datapoints={points:[],pointsize:o,format:r.format},h.label=null,h.color=s,h.threshold=null,h.originSeries=n,h.data=[];var p=r.points,d=n.lines.show,v=[],m=[],g;for(u=0;u<p.length;u+=o){a=p[u],f=p[u+1],c=l,f<i?l=v:l=m;if(d&&c!=l&&a!=null&&u>0&&p[u-o]!=null){var y=a+(i-f)*(a-p[u-o])/(f-p[u-o+1]);c.push(y),c.push(i);for(g=2;g<o;++g)c.push(p[u+g]);l.push(null),l.push(null);for(g=2;g<o;++g)l.push(p[u+g]);l.push(y),l.push(i);for(g=2;g<o;++g)l.push(p[u+g])}l.push(a),l.push(f);for(g=2;g<o;++g)l.push(p[u+g])}r.points=m,h.datapoints.points=v;if(h.datapoints.points.length>0){var b=e.inArray(n,t.getData());t.getData().splice(b+1,0,h)}}function r(t,r,i){if(!r.threshold)return;r.threshold instanceof Array?(r.threshold.sort(function(e,t){return e.below-t.below}),e(r.threshold).each(function(e,o){n(t,r,i,o.below,o.color)})):n(t,r,i,r.threshold.below,r.threshold.color)}t.hooks.processDatapoints.push(r)}var t={series:{threshold:null}};e.plot.plugins.push({init:n,options:t,name:"threshold",version:"1.2"})})(jQuery); \ No newline at end of file
+(function(B){var A={series:{threshold:null}};function C(D){function E(L,S,M){if(!S.threshold){return }var F=M.pointsize,I,O,N,G,K,H=B.extend({},S);H.datapoints={points:[],pointsize:F};H.label=null;H.color=S.threshold.color;H.threshold=null;H.originSeries=S;H.data=[];var P=S.threshold.below,Q=M.points,R=S.lines.show;threspoints=[];newpoints=[];for(I=0;I<Q.length;I+=F){O=Q[I];N=Q[I+1];K=G;if(N<P){G=threspoints}else{G=newpoints}if(R&&K!=G&&O!=null&&I>0&&Q[I-F]!=null){var J=(O-Q[I-F])/(N-Q[I-F+1])*(P-N)+O;K.push(J);K.push(P);for(m=2;m<F;++m){K.push(Q[I+m])}G.push(null);G.push(null);for(m=2;m<F;++m){G.push(Q[I+m])}G.push(J);G.push(P);for(m=2;m<F;++m){G.push(Q[I+m])}}G.push(O);G.push(N)}M.points=newpoints;H.datapoints.points=threspoints;if(H.datapoints.points.length>0){L.getData().push(H)}}D.hooks.processDatapoints.push(E)}B.plot.plugins.push({init:C,options:A,name:"threshold",version:"1.0"})})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.flot.time.min.js b/chromium/third_party/flot/jquery.flot.time.min.js
deleted file mode 100644
index 21d84772388..00000000000
--- a/chromium/third_party/flot/jquery.flot.time.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Pretty handling of time axes.
-
-Copyright (c) 2007-2013 IOLA and Ole Laursen.
-Licensed under the MIT license.
-
-Set axis.mode to "time" to enable. See the section "Time series data" in
-API.txt for details.
-
-*/(function(e){function n(e,t){return t*Math.floor(e/t)}function r(e,t,n,r){if(typeof e.strftime=="function")return e.strftime(t);var i=function(e,t){return e=""+e,t=""+(t==null?"0":t),e.length==1?t+e:e},s=[],o=!1,u=e.getHours(),a=u<12;n==null&&(n=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),r==null&&(r=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]);var f;u>12?f=u-12:u==0?f=12:f=u;for(var l=0;l<t.length;++l){var c=t.charAt(l);if(o){switch(c){case"a":c=""+r[e.getDay()];break;case"b":c=""+n[e.getMonth()];break;case"d":c=i(e.getDate());break;case"e":c=i(e.getDate()," ");break;case"h":case"H":c=i(u);break;case"I":c=i(f);break;case"l":c=i(f," ");break;case"m":c=i(e.getMonth()+1);break;case"M":c=i(e.getMinutes());break;case"q":c=""+(Math.floor(e.getMonth()/3)+1);break;case"S":c=i(e.getSeconds());break;case"y":c=i(e.getFullYear()%100);break;case"Y":c=""+e.getFullYear();break;case"p":c=a?"am":"pm";break;case"P":c=a?"AM":"PM";break;case"w":c=""+e.getDay()}s.push(c),o=!1}else c=="%"?o=!0:s.push(c)}return s.join("")}function i(e){function t(e,t,n,r){e[t]=function(){return n[r].apply(n,arguments)}}var n={date:e};e.strftime!=undefined&&t(n,"strftime",e,"strftime"),t(n,"getTime",e,"getTime"),t(n,"setTime",e,"setTime");var r=["Date","Day","FullYear","Hours","Milliseconds","Minutes","Month","Seconds"];for(var i=0;i<r.length;i++)t(n,"get"+r[i],e,"getUTC"+r[i]),t(n,"set"+r[i],e,"setUTC"+r[i]);return n}function s(e,t){if(t.timezone=="browser")return new Date(e);if(!t.timezone||t.timezone=="utc")return i(new Date(e));if(typeof timezoneJS!="undefined"&&typeof timezoneJS.Date!="undefined"){var n=new timezoneJS.Date;return n.setTimezone(t.timezone),n.setTime(e),n}return i(new Date(e))}function l(t){t.hooks.processOptions.push(function(t,i){e.each(t.getAxes(),function(e,t){var i=t.options;i.mode=="time"&&(t.tickGenerator=function(e){var t=[],r=s(e.min,i),u=0,l=i.tickSize&&i.tickSize[1]==="quarter"||i.minTickSize&&i.minTickSize[1]==="quarter"?f:a;i.minTickSize!=null&&(typeof i.tickSize=="number"?u=i.tickSize:u=i.minTickSize[0]*o[i.minTickSize[1]]);for(var c=0;c<l.length-1;++c)if(e.delta<(l[c][0]*o[l[c][1]]+l[c+1][0]*o[l[c+1][1]])/2&&l[c][0]*o[l[c][1]]>=u)break;var h=l[c][0],p=l[c][1];if(p=="year"){if(i.minTickSize!=null&&i.minTickSize[1]=="year")h=Math.floor(i.minTickSize[0]);else{var d=Math.pow(10,Math.floor(Math.log(e.delta/o.year)/Math.LN10)),v=e.delta/o.year/d;v<1.5?h=1:v<3?h=2:v<7.5?h=5:h=10,h*=d}h<1&&(h=1)}e.tickSize=i.tickSize||[h,p];var m=e.tickSize[0];p=e.tickSize[1];var g=m*o[p];p=="second"?r.setSeconds(n(r.getSeconds(),m)):p=="minute"?r.setMinutes(n(r.getMinutes(),m)):p=="hour"?r.setHours(n(r.getHours(),m)):p=="month"?r.setMonth(n(r.getMonth(),m)):p=="quarter"?r.setMonth(3*n(r.getMonth()/3,m)):p=="year"&&r.setFullYear(n(r.getFullYear(),m)),r.setMilliseconds(0),g>=o.minute&&r.setSeconds(0),g>=o.hour&&r.setMinutes(0),g>=o.day&&r.setHours(0),g>=o.day*4&&r.setDate(1),g>=o.month*2&&r.setMonth(n(r.getMonth(),3)),g>=o.quarter*2&&r.setMonth(n(r.getMonth(),6)),g>=o.year&&r.setMonth(0);var y=0,b=Number.NaN,w;do{w=b,b=r.getTime(),t.push(b);if(p=="month"||p=="quarter")if(m<1){r.setDate(1);var E=r.getTime();r.setMonth(r.getMonth()+(p=="quarter"?3:1));var S=r.getTime();r.setTime(b+y*o.hour+(S-E)*m),y=r.getHours(),r.setHours(0)}else r.setMonth(r.getMonth()+m*(p=="quarter"?3:1));else p=="year"?r.setFullYear(r.getFullYear()+m):r.setTime(b+g)}while(b<e.max&&b!=w);return t},t.tickFormatter=function(e,t){var n=s(e,t.options);if(i.timeformat!=null)return r(n,i.timeformat,i.monthNames,i.dayNames);var u=t.options.tickSize&&t.options.tickSize[1]=="quarter"||t.options.minTickSize&&t.options.minTickSize[1]=="quarter",a=t.tickSize[0]*o[t.tickSize[1]],f=t.max-t.min,l=i.twelveHourClock?" %p":"",c=i.twelveHourClock?"%I":"%H",h;a<o.minute?h=c+":%M:%S"+l:a<o.day?f<2*o.day?h=c+":%M"+l:h="%b %d "+c+":%M"+l:a<o.month?h="%b %d":u&&a<o.quarter||!u&&a<o.year?f<o.year?h="%b":h="%b %Y":u&&a<o.year?f<o.year?h="Q%q":h="Q%q %Y":h="%Y";var p=r(n,h,i.monthNames,i.dayNames);return p})})})}var t={xaxis:{timezone:null,timeformat:null,twelveHourClock:!1,monthNames:null}},o={second:1e3,minute:6e4,hour:36e5,day:864e5,month:2592e6,quarter:7776e6,year:525949.2*60*1e3},u=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[.25,"month"],[.5,"month"],[1,"month"],[2,"month"]],a=u.concat([[3,"month"],[6,"month"],[1,"year"]]),f=u.concat([[1,"quarter"],[2,"quarter"],[1,"year"]]);e.plot.plugins.push({init:l,options:t,name:"time",version:"1.0"}),e.plot.formatDate=r})(jQuery); \ No newline at end of file
diff --git a/chromium/third_party/flot/jquery.min.js b/chromium/third_party/flot/jquery.min.js
index 38837795279..64225231610 100644
--- a/chromium/third_party/flot/jquery.min.js
+++ b/chromium/third_party/flot/jquery.min.js
@@ -1,2 +1,23 @@
-/*! jQuery v1.8.3 jquery.com | jquery.org/license */
-(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window); \ No newline at end of file
+/*
+ * jQuery JavaScript Library v1.5.1
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Wed Feb 23 13:55:29 2011 -0500
+ */
+(function(aY,H){var al=aY.document;var a=(function(){var bn=function(bI,bJ){return new bn.fn.init(bI,bJ,bl)},bD=aY.jQuery,bp=aY.$,bl,bH=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,bv=/\S/,br=/^\s+/,bm=/\s+$/,bq=/\d/,bj=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bw=/^[\],:{}\s]*$/,bF=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,by=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bs=/(?:^|:|,)(?:\s*\[)+/g,bh=/(webkit)[ \/]([\w.]+)/,bA=/(opera)(?:.*version)?[ \/]([\w.]+)/,bz=/(msie) ([\w.]+)/,bB=/(mozilla)(?:.*? rv:([\w.]+))?/,bG=navigator.userAgent,bE,bC=false,bk,e="then done fail isResolved isRejected promise".split(" "),bd,bu=Object.prototype.toString,bo=Object.prototype.hasOwnProperty,bi=Array.prototype.push,bt=Array.prototype.slice,bx=String.prototype.trim,be=Array.prototype.indexOf,bg={};bn.fn=bn.prototype={constructor:bn,init:function(bI,bM,bL){var bK,bN,bJ,bO;if(!bI){return this}if(bI.nodeType){this.context=this[0]=bI;this.length=1;return this}if(bI==="body"&&!bM&&al.body){this.context=al;this[0]=al.body;this.selector="body";this.length=1;return this}if(typeof bI==="string"){bK=bH.exec(bI);if(bK&&(bK[1]||!bM)){if(bK[1]){bM=bM instanceof bn?bM[0]:bM;bO=(bM?bM.ownerDocument||bM:al);bJ=bj.exec(bI);if(bJ){if(bn.isPlainObject(bM)){bI=[al.createElement(bJ[1])];bn.fn.attr.call(bI,bM,true)}else{bI=[bO.createElement(bJ[1])]}}else{bJ=bn.buildFragment([bK[1]],[bO]);bI=(bJ.cacheable?bn.clone(bJ.fragment):bJ.fragment).childNodes}return bn.merge(this,bI)}else{bN=al.getElementById(bK[2]);if(bN&&bN.parentNode){if(bN.id!==bK[2]){return bL.find(bI)}this.length=1;this[0]=bN}this.context=al;this.selector=bI;return this}}else{if(!bM||bM.jquery){return(bM||bL).find(bI)}else{return this.constructor(bM).find(bI)}}}else{if(bn.isFunction(bI)){return bL.ready(bI)}}if(bI.selector!==H){this.selector=bI.selector;this.context=bI.context}return bn.makeArray(bI,this)},selector:"",jquery:"1.5.1",length:0,size:function(){return this.length},toArray:function(){return bt.call(this,0)},get:function(bI){return bI==null?this.toArray():(bI<0?this[this.length+bI]:this[bI])},pushStack:function(bJ,bL,bI){var bK=this.constructor();if(bn.isArray(bJ)){bi.apply(bK,bJ)}else{bn.merge(bK,bJ)}bK.prevObject=this;bK.context=this.context;if(bL==="find"){bK.selector=this.selector+(this.selector?" ":"")+bI}else{if(bL){bK.selector=this.selector+"."+bL+"("+bI+")"}}return bK},each:function(bJ,bI){return bn.each(this,bJ,bI)},ready:function(bI){bn.bindReady();bk.done(bI);return this},eq:function(bI){return bI===-1?this.slice(bI):this.slice(bI,+bI+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bt.apply(this,arguments),"slice",bt.call(arguments).join(","))},map:function(bI){return this.pushStack(bn.map(this,function(bK,bJ){return bI.call(bK,bJ,bK)}))},end:function(){return this.prevObject||this.constructor(null)},push:bi,sort:[].sort,splice:[].splice};bn.fn.init.prototype=bn.fn;bn.extend=bn.fn.extend=function(){var bR,bK,bI,bJ,bO,bP,bN=arguments[0]||{},bM=1,bL=arguments.length,bQ=false;if(typeof bN==="boolean"){bQ=bN;bN=arguments[1]||{};bM=2}if(typeof bN!=="object"&&!bn.isFunction(bN)){bN={}}if(bL===bM){bN=this;--bM}for(;bM<bL;bM++){if((bR=arguments[bM])!=null){for(bK in bR){bI=bN[bK];bJ=bR[bK];if(bN===bJ){continue}if(bQ&&bJ&&(bn.isPlainObject(bJ)||(bO=bn.isArray(bJ)))){if(bO){bO=false;bP=bI&&bn.isArray(bI)?bI:[]}else{bP=bI&&bn.isPlainObject(bI)?bI:{}}bN[bK]=bn.extend(bQ,bP,bJ)}else{if(bJ!==H){bN[bK]=bJ}}}}}return bN};bn.extend({noConflict:function(bI){aY.$=bp;if(bI){aY.jQuery=bD}return bn},isReady:false,readyWait:1,ready:function(bI){if(bI===true){bn.readyWait--}if(!bn.readyWait||(bI!==true&&!bn.isReady)){if(!al.body){return setTimeout(bn.ready,1)}bn.isReady=true;if(bI!==true&&--bn.readyWait>0){return}bk.resolveWith(al,[bn]);if(bn.fn.trigger){bn(al).trigger("ready").unbind("ready")}}},bindReady:function(){if(bC){return}bC=true;if(al.readyState==="complete"){return setTimeout(bn.ready,1)}if(al.addEventListener){al.addEventListener("DOMContentLoaded",bd,false);aY.addEventListener("load",bn.ready,false)}else{if(al.attachEvent){al.attachEvent("onreadystatechange",bd);aY.attachEvent("onload",bn.ready);var bI=false;try{bI=aY.frameElement==null}catch(bJ){}if(al.documentElement.doScroll&&bI){bf()}}}},isFunction:function(bI){return bn.type(bI)==="function"},isArray:Array.isArray||function(bI){return bn.type(bI)==="array"},isWindow:function(bI){return bI&&typeof bI==="object"&&"setInterval" in bI},isNaN:function(bI){return bI==null||!bq.test(bI)||isNaN(bI)},type:function(bI){return bI==null?String(bI):bg[bu.call(bI)]||"object"},isPlainObject:function(bJ){if(!bJ||bn.type(bJ)!=="object"||bJ.nodeType||bn.isWindow(bJ)){return false}if(bJ.constructor&&!bo.call(bJ,"constructor")&&!bo.call(bJ.constructor.prototype,"isPrototypeOf")){return false}var bI;for(bI in bJ){}return bI===H||bo.call(bJ,bI)},isEmptyObject:function(bJ){for(var bI in bJ){return false}return true},error:function(bI){throw bI},parseJSON:function(bI){if(typeof bI!=="string"||!bI){return null}bI=bn.trim(bI);if(bw.test(bI.replace(bF,"@").replace(by,"]").replace(bs,""))){return aY.JSON&&aY.JSON.parse?aY.JSON.parse(bI):(new Function("return "+bI))()}else{bn.error("Invalid JSON: "+bI)}},parseXML:function(bK,bI,bJ){if(aY.DOMParser){bJ=new DOMParser();bI=bJ.parseFromString(bK,"text/xml")}else{bI=new ActiveXObject("Microsoft.XMLDOM");bI.async="false";bI.loadXML(bK)}bJ=bI.documentElement;if(!bJ||!bJ.nodeName||bJ.nodeName==="parsererror"){bn.error("Invalid XML: "+bK)}return bI},noop:function(){},globalEval:function(bK){if(bK&&bv.test(bK)){var bJ=al.head||al.getElementsByTagName("head")[0]||al.documentElement,bI=al.createElement("script");if(bn.support.scriptEval()){bI.appendChild(al.createTextNode(bK))}else{bI.text=bK}bJ.insertBefore(bI,bJ.firstChild);bJ.removeChild(bI)}},nodeName:function(bJ,bI){return bJ.nodeName&&bJ.nodeName.toUpperCase()===bI.toUpperCase()},each:function(bL,bP,bK){var bJ,bM=0,bN=bL.length,bI=bN===H||bn.isFunction(bL);if(bK){if(bI){for(bJ in bL){if(bP.apply(bL[bJ],bK)===false){break}}}else{for(;bM<bN;){if(bP.apply(bL[bM++],bK)===false){break}}}}else{if(bI){for(bJ in bL){if(bP.call(bL[bJ],bJ,bL[bJ])===false){break}}}else{for(var bO=bL[0];bM<bN&&bP.call(bO,bM,bO)!==false;bO=bL[++bM]){}}}return bL},trim:bx?function(bI){return bI==null?"":bx.call(bI)}:function(bI){return bI==null?"":bI.toString().replace(br,"").replace(bm,"")},makeArray:function(bL,bJ){var bI=bJ||[];if(bL!=null){var bK=bn.type(bL);if(bL.length==null||bK==="string"||bK==="function"||bK==="regexp"||bn.isWindow(bL)){bi.call(bI,bL)}else{bn.merge(bI,bL)}}return bI},inArray:function(bK,bL){if(bL.indexOf){return bL.indexOf(bK)}for(var bI=0,bJ=bL.length;bI<bJ;bI++){if(bL[bI]===bK){return bI}}return -1},merge:function(bM,bK){var bL=bM.length,bJ=0;if(typeof bK.length==="number"){for(var bI=bK.length;bJ<bI;bJ++){bM[bL++]=bK[bJ]}}else{while(bK[bJ]!==H){bM[bL++]=bK[bJ++]}}bM.length=bL;return bM},grep:function(bJ,bO,bI){var bK=[],bN;bI=!!bI;for(var bL=0,bM=bJ.length;bL<bM;bL++){bN=!!bO(bJ[bL],bL);if(bI!==bN){bK.push(bJ[bL])}}return bK},map:function(bJ,bO,bI){var bK=[],bN;for(var bL=0,bM=bJ.length;bL<bM;bL++){bN=bO(bJ[bL],bL,bI);if(bN!=null){bK[bK.length]=bN}}return bK.concat.apply([],bK)},guid:1,proxy:function(bK,bJ,bI){if(arguments.length===2){if(typeof bJ==="string"){bI=bK;bK=bI[bJ];bJ=H}else{if(bJ&&!bn.isFunction(bJ)){bI=bJ;bJ=H}}}if(!bJ&&bK){bJ=function(){return bK.apply(bI||this,arguments)}}if(bK){bJ.guid=bK.guid=bK.guid||bJ.guid||bn.guid++}return bJ},access:function(bI,bQ,bO,bK,bN,bP){var bJ=bI.length;if(typeof bQ==="object"){for(var bL in bQ){bn.access(bI,bL,bQ[bL],bK,bN,bO)}return bI}if(bO!==H){bK=!bP&&bK&&bn.isFunction(bO);for(var bM=0;bM<bJ;bM++){bN(bI[bM],bQ,bK?bO.call(bI[bM],bM,bN(bI[bM],bQ)):bO,bP)}return bI}return bJ?bN(bI[0],bQ):H},now:function(){return(new Date()).getTime()},_Deferred:function(){var bL=[],bM,bJ,bK,bI={done:function(){if(!bK){var bO=arguments,bP,bS,bR,bQ,bN;if(bM){bN=bM;bM=0}for(bP=0,bS=bO.length;bP<bS;bP++){bR=bO[bP];bQ=bn.type(bR);if(bQ==="array"){bI.done.apply(bI,bR)}else{if(bQ==="function"){bL.push(bR)}}}if(bN){bI.resolveWith(bN[0],bN[1])}}return this},resolveWith:function(bO,bN){if(!bK&&!bM&&!bJ){bJ=1;try{while(bL[0]){bL.shift().apply(bO,bN)}}catch(bP){throw bP}finally{bM=[bO,bN];bJ=0}}return this},resolve:function(){bI.resolveWith(bn.isFunction(this.promise)?this.promise():this,arguments);return this},isResolved:function(){return !!(bJ||bM)},cancel:function(){bK=1;bL=[];return this}};return bI},Deferred:function(bJ){var bI=bn._Deferred(),bL=bn._Deferred(),bK;bn.extend(bI,{then:function(bN,bM){bI.done(bN).fail(bM);return this},fail:bL.done,rejectWith:bL.resolveWith,reject:bL.resolve,isRejected:bL.isResolved,promise:function(bN){if(bN==null){if(bK){return bK}bK=bN={}}var bM=e.length;while(bM--){bN[e[bM]]=bI[e[bM]]}return bN}});bI.done(bL.cancel).fail(bI.cancel);delete bI.cancel;if(bJ){bJ.call(bI,bI)}return bI},when:function(bJ){var bO=arguments.length,bI=bO<=1&&bJ&&bn.isFunction(bJ.promise)?bJ:bn.Deferred(),bM=bI.promise();if(bO>1){var bN=bt.call(arguments,0),bL=bO,bK=function(bP){return function(bQ){bN[bP]=arguments.length>1?bt.call(arguments,0):bQ;if(!(--bL)){bI.resolveWith(bM,bN)}}};while((bO--)){bJ=bN[bO];if(bJ&&bn.isFunction(bJ.promise)){bJ.promise().then(bK(bO),bI.reject)}else{--bL}}if(!bL){bI.resolveWith(bM,bN)}}else{if(bI!==bJ){bI.resolve(bJ)}}return bM},uaMatch:function(bJ){bJ=bJ.toLowerCase();var bI=bh.exec(bJ)||bA.exec(bJ)||bz.exec(bJ)||bJ.indexOf("compatible")<0&&bB.exec(bJ)||[];return{browser:bI[1]||"",version:bI[2]||"0"}},sub:function(){function bJ(bL,bM){return new bJ.fn.init(bL,bM)}bn.extend(true,bJ,this);bJ.superclass=this;bJ.fn=bJ.prototype=this();bJ.fn.constructor=bJ;bJ.subclass=this.subclass;bJ.fn.init=function bK(bL,bM){if(bM&&bM instanceof bn&&!(bM instanceof bJ)){bM=bJ(bM)}return bn.fn.init.call(this,bL,bM,bI)};bJ.fn.init.prototype=bJ.fn;var bI=bJ(al);return bJ},browser:{}});bk=bn._Deferred();bn.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(bJ,bI){bg["[object "+bI+"]"]=bI.toLowerCase()});bE=bn.uaMatch(bG);if(bE.browser){bn.browser[bE.browser]=true;bn.browser.version=bE.version}if(bn.browser.webkit){bn.browser.safari=true}if(be){bn.inArray=function(bI,bJ){return be.call(bJ,bI)}}if(bv.test("\xA0")){br=/^[\s\xA0]+/;bm=/[\s\xA0]+$/}bl=bn(al);if(al.addEventListener){bd=function(){al.removeEventListener("DOMContentLoaded",bd,false);bn.ready()}}else{if(al.attachEvent){bd=function(){if(al.readyState==="complete"){al.detachEvent("onreadystatechange",bd);bn.ready()}}}}function bf(){if(bn.isReady){return}try{al.documentElement.doScroll("left")}catch(bI){setTimeout(bf,1);return}bn.ready()}return bn})();(function(){a.support={};var bd=al.createElement("div");bd.style.display="none";bd.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var bm=bd.getElementsByTagName("*"),bk=bd.getElementsByTagName("a")[0],bl=al.createElement("select"),be=bl.appendChild(al.createElement("option")),bj=bd.getElementsByTagName("input")[0];if(!bm||!bm.length||!bk){return}a.support={leadingWhitespace:bd.firstChild.nodeType===3,tbody:!bd.getElementsByTagName("tbody").length,htmlSerialize:!!bd.getElementsByTagName("link").length,style:/red/.test(bk.getAttribute("style")),hrefNormalized:bk.getAttribute("href")==="/a",opacity:/^0.55$/.test(bk.style.opacity),cssFloat:!!bk.style.cssFloat,checkOn:bj.value==="on",optSelected:be.selected,deleteExpando:true,optDisabled:false,checkClone:false,noCloneEvent:true,noCloneChecked:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};bj.checked=true;a.support.noCloneChecked=bj.cloneNode(true).checked;bl.disabled=true;a.support.optDisabled=!be.disabled;var bf=null;a.support.scriptEval=function(){if(bf===null){var bo=al.documentElement,bp=al.createElement("script"),br="script"+a.now();try{bp.appendChild(al.createTextNode("window."+br+"=1;"))}catch(bq){}bo.insertBefore(bp,bo.firstChild);if(aY[br]){bf=true;delete aY[br]}else{bf=false}bo.removeChild(bp);bo=bp=br=null}return bf};try{delete bd.test}catch(bh){a.support.deleteExpando=false}if(!bd.addEventListener&&bd.attachEvent&&bd.fireEvent){bd.attachEvent("onclick",function bn(){a.support.noCloneEvent=false;bd.detachEvent("onclick",bn)});bd.cloneNode(true).fireEvent("onclick")}bd=al.createElement("div");bd.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var bg=al.createDocumentFragment();bg.appendChild(bd.firstChild);a.support.checkClone=bg.cloneNode(true).cloneNode(true).lastChild.checked;a(function(){var bp=al.createElement("div"),e=al.getElementsByTagName("body")[0];if(!e){return}bp.style.width=bp.style.paddingLeft="1px";e.appendChild(bp);a.boxModel=a.support.boxModel=bp.offsetWidth===2;if("zoom" in bp.style){bp.style.display="inline";bp.style.zoom=1;a.support.inlineBlockNeedsLayout=bp.offsetWidth===2;bp.style.display="";bp.innerHTML="<div style='width:4px;'></div>";a.support.shrinkWrapBlocks=bp.offsetWidth!==2}bp.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var bo=bp.getElementsByTagName("td");a.support.reliableHiddenOffsets=bo[0].offsetHeight===0;bo[0].style.display="";bo[1].style.display="none";a.support.reliableHiddenOffsets=a.support.reliableHiddenOffsets&&bo[0].offsetHeight===0;bp.innerHTML="";e.removeChild(bp).style.display="none";bp=bo=null});var bi=function(e){var bp=al.createElement("div");e="on"+e;if(!bp.attachEvent){return true}var bo=(e in bp);if(!bo){bp.setAttribute(e,"return;");bo=typeof bp[e]==="function"}bp=null;return bo};a.support.submitBubbles=bi("submit");a.support.changeBubbles=bi("change");bd=bm=bk=null})();var aE=/^(?:\{.*\}|\[.*\])$/;a.extend({cache:{},uuid:0,expando:"jQuery"+(a.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?a.cache[e[a.expando]]:e[a.expando];return !!e&&!P(e)},data:function(bf,bd,bh,bg){if(!a.acceptData(bf)){return}var bk=a.expando,bj=typeof bd==="string",bi,bl=bf.nodeType,e=bl?a.cache:bf,be=bl?bf[a.expando]:bf[a.expando]&&a.expando;if((!be||(bg&&be&&!e[be][bk]))&&bj&&bh===H){return}if(!be){if(bl){bf[a.expando]=be=++a.uuid}else{be=a.expando}}if(!e[be]){e[be]={};if(!bl){e[be].toJSON=a.noop}}if(typeof bd==="object"||typeof bd==="function"){if(bg){e[be][bk]=a.extend(e[be][bk],bd)}else{e[be]=a.extend(e[be],bd)}}bi=e[be];if(bg){if(!bi[bk]){bi[bk]={}}bi=bi[bk]}if(bh!==H){bi[bd]=bh}if(bd==="events"&&!bi[bd]){return bi[bk]&&bi[bk].events}return bj?bi[bd]:bi},removeData:function(bg,be,bh){if(!a.acceptData(bg)){return}var bj=a.expando,bk=bg.nodeType,bd=bk?a.cache:bg,bf=bk?bg[a.expando]:a.expando;if(!bd[bf]){return}if(be){var bi=bh?bd[bf][bj]:bd[bf];if(bi){delete bi[be];if(!P(bi)){return}}}if(bh){delete bd[bf][bj];if(!P(bd[bf])){return}}var e=bd[bf][bj];if(a.support.deleteExpando||bd!=aY){delete bd[bf]}else{bd[bf]=null}if(e){bd[bf]={};if(!bk){bd[bf].toJSON=a.noop}bd[bf][bj]=e}else{if(bk){if(a.support.deleteExpando){delete bg[a.expando]}else{if(bg.removeAttribute){bg.removeAttribute(a.expando)}else{bg[a.expando]=null}}}}},_data:function(bd,e,be){return a.data(bd,e,be,true)},acceptData:function(bd){if(bd.nodeName){var e=a.noData[bd.nodeName.toLowerCase()];if(e){return !(e===true||bd.getAttribute("classid")!==e)}}return true}});a.fn.extend({data:function(bg,bi){var bh=null;if(typeof bg==="undefined"){if(this.length){bh=a.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,be;for(var bf=0,bd=e.length;bf<bd;bf++){be=e[bf].name;if(be.indexOf("data-")===0){be=be.substr(5);aT(this[0],be,bh[be])}}}}return bh}else{if(typeof bg==="object"){return this.each(function(){a.data(this,bg)})}}var bj=bg.split(".");bj[1]=bj[1]?"."+bj[1]:"";if(bi===H){bh=this.triggerHandler("getData"+bj[1]+"!",[bj[0]]);if(bh===H&&this.length){bh=a.data(this[0],bg);bh=aT(this[0],bg,bh)}return bh===H&&bj[1]?this.data(bj[0]):bh}else{return this.each(function(){var bl=a(this),bk=[bj[0],bi];bl.triggerHandler("setData"+bj[1]+"!",bk);a.data(this,bg,bi);bl.triggerHandler("changeData"+bj[1]+"!",bk)})}},removeData:function(e){return this.each(function(){a.removeData(this,e)})}});function aT(be,bd,bf){if(bf===H&&be.nodeType===1){bf=be.getAttribute("data-"+bd);if(typeof bf==="string"){try{bf=bf==="true"?true:bf==="false"?false:bf==="null"?null:!a.isNaN(bf)?parseFloat(bf):aE.test(bf)?a.parseJSON(bf):bf}catch(bg){}a.data(be,bd,bf)}else{bf=H}}return bf}function P(bd){for(var e in bd){if(e!=="toJSON"){return false}}return true}a.extend({queue:function(bd,e,bf){if(!bd){return}e=(e||"fx")+"queue";var be=a._data(bd,e);if(!bf){return be||[]}if(!be||a.isArray(bf)){be=a._data(bd,e,a.makeArray(bf))}else{be.push(bf)}return be},dequeue:function(bf,be){be=be||"fx";var e=a.queue(bf,be),bd=e.shift();if(bd==="inprogress"){bd=e.shift()}if(bd){if(be==="fx"){e.unshift("inprogress")}bd.call(bf,function(){a.dequeue(bf,be)})}if(!e.length){a.removeData(bf,be+"queue",true)}}});a.fn.extend({queue:function(e,bd){if(typeof e!=="string"){bd=e;e="fx"}if(bd===H){return a.queue(this[0],e)}return this.each(function(bf){var be=a.queue(this,e,bd);if(e==="fx"&&be[0]!=="inprogress"){a.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){a.dequeue(this,e)})},delay:function(bd,e){bd=a.fx?a.fx.speeds[bd]||bd:bd;e=e||"fx";return this.queue(e,function(){var be=this;setTimeout(function(){a.dequeue(be,e)},bd)})},clearQueue:function(e){return this.queue(e||"fx",[])}});var aC=/[\n\t\r]/g,a3=/\s+/,aG=/\r/g,a2=/^(?:href|src|style)$/,f=/^(?:button|input)$/i,C=/^(?:button|input|object|select|textarea)$/i,k=/^a(?:rea)?$/i,Q=/^(?:radio|checkbox)$/i;a.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};a.fn.extend({attr:function(e,bd){return a.access(this,e,bd,true,a.attr)},removeAttr:function(e,bd){return this.each(function(){a.attr(this,e,"");if(this.nodeType===1){this.removeAttribute(e)}})},addClass:function(bj){if(a.isFunction(bj)){return this.each(function(bm){var bl=a(this);bl.addClass(bj.call(this,bm,bl.attr("class")))})}if(bj&&typeof bj==="string"){var e=(bj||"").split(a3);for(var bf=0,be=this.length;bf<be;bf++){var bd=this[bf];if(bd.nodeType===1){if(!bd.className){bd.className=bj}else{var bg=" "+bd.className+" ",bi=bd.className;for(var bh=0,bk=e.length;bh<bk;bh++){if(bg.indexOf(" "+e[bh]+" ")<0){bi+=" "+e[bh]}}bd.className=a.trim(bi)}}}}return this},removeClass:function(bh){if(a.isFunction(bh)){return this.each(function(bl){var bk=a(this);bk.removeClass(bh.call(this,bl,bk.attr("class")))})}if((bh&&typeof bh==="string")||bh===H){var bi=(bh||"").split(a3);for(var be=0,bd=this.length;be<bd;be++){var bg=this[be];if(bg.nodeType===1&&bg.className){if(bh){var bf=(" "+bg.className+" ").replace(aC," ");for(var bj=0,e=bi.length;bj<e;bj++){bf=bf.replace(" "+bi[bj]+" "," ")}bg.className=a.trim(bf)}else{bg.className=""}}}}return this},toggleClass:function(bf,bd){var be=typeof bf,e=typeof bd==="boolean";if(a.isFunction(bf)){return this.each(function(bh){var bg=a(this);bg.toggleClass(bf.call(this,bh,bg.attr("class"),bd),bd)})}return this.each(function(){if(be==="string"){var bi,bh=0,bg=a(this),bj=bd,bk=bf.split(a3);while((bi=bk[bh++])){bj=e?bj:!bg.hasClass(bi);bg[bj?"addClass":"removeClass"](bi)}}else{if(be==="undefined"||be==="boolean"){if(this.className){a._data(this,"__className__",this.className)}this.className=this.className||bf===false?"":a._data(this,"__className__")||""}}})},hasClass:function(e){var bf=" "+e+" ";for(var be=0,bd=this.length;be<bd;be++){if((" "+this[be].className+" ").replace(aC," ").indexOf(bf)>-1){return true}}return false},val:function(bk){if(!arguments.length){var be=this[0];if(be){if(a.nodeName(be,"option")){var bd=be.attributes.value;return !bd||bd.specified?be.value:be.text}if(a.nodeName(be,"select")){var bi=be.selectedIndex,bl=[],bm=be.options,bh=be.type==="select-one";if(bi<0){return null}for(var bf=bh?bi:0,bj=bh?bi+1:bm.length;bf<bj;bf++){var bg=bm[bf];if(bg.selected&&(a.support.optDisabled?!bg.disabled:bg.getAttribute("disabled")===null)&&(!bg.parentNode.disabled||!a.nodeName(bg.parentNode,"optgroup"))){bk=a(bg).val();if(bh){return bk}bl.push(bk)}}if(bh&&!bl.length&&bm.length){return a(bm[bi]).val()}return bl}if(Q.test(be.type)&&!a.support.checkOn){return be.getAttribute("value")===null?"on":be.value}return(be.value||"").replace(aG,"")}return H}var e=a.isFunction(bk);return this.each(function(bp){var bo=a(this),bq=bk;if(this.nodeType!==1){return}if(e){bq=bk.call(this,bp,bo.val())}if(bq==null){bq=""}else{if(typeof bq==="number"){bq+=""}else{if(a.isArray(bq)){bq=a.map(bq,function(br){return br==null?"":br+""})}}}if(a.isArray(bq)&&Q.test(this.type)){this.checked=a.inArray(bo.val(),bq)>=0}else{if(a.nodeName(this,"select")){var bn=a.makeArray(bq);a("option",this).each(function(){this.selected=a.inArray(a(this).val(),bn)>=0});if(!bn.length){this.selectedIndex=-1}}else{this.value=bq}}})}});a.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bd,e,bi,bl){if(!bd||bd.nodeType===3||bd.nodeType===8||bd.nodeType===2){return H}if(bl&&e in a.attrFn){return a(bd)[e](bi)}var be=bd.nodeType!==1||!a.isXMLDoc(bd),bh=bi!==H;e=be&&a.props[e]||e;if(bd.nodeType===1){var bg=a2.test(e);if(e==="selected"&&!a.support.optSelected){var bj=bd.parentNode;if(bj){bj.selectedIndex;if(bj.parentNode){bj.parentNode.selectedIndex}}}if((e in bd||bd[e]!==H)&&be&&!bg){if(bh){if(e==="type"&&f.test(bd.nodeName)&&bd.parentNode){a.error("type property can't be changed")}if(bi===null){if(bd.nodeType===1){bd.removeAttribute(e)}}else{bd[e]=bi}}if(a.nodeName(bd,"form")&&bd.getAttributeNode(e)){return bd.getAttributeNode(e).nodeValue}if(e==="tabIndex"){var bk=bd.getAttributeNode("tabIndex");return bk&&bk.specified?bk.value:C.test(bd.nodeName)||k.test(bd.nodeName)&&bd.href?0:H}return bd[e]}if(!a.support.style&&be&&e==="style"){if(bh){bd.style.cssText=""+bi}return bd.style.cssText}if(bh){bd.setAttribute(e,""+bi)}if(!bd.attributes[e]&&(bd.hasAttribute&&!bd.hasAttribute(e))){return H}var bf=!a.support.hrefNormalized&&be&&bg?bd.getAttribute(e,2):bd.getAttribute(e);return bf===null?H:bf}if(bh){bd[e]=bi}return bd[e]}});var aP=/\.(.*)$/,a0=/^(?:textarea|input|select)$/i,K=/\./g,aa=/ /g,aw=/[^\w\s.|`]/g,E=function(e){return e.replace(aw,"\\$&")};a.event={add:function(bg,bk,br,bi){if(bg.nodeType===3||bg.nodeType===8){return}try{if(a.isWindow(bg)&&(bg!==aY&&!bg.frameElement)){bg=aY}}catch(bl){}if(br===false){br=a5}else{if(!br){return}}var be,bp;if(br.handler){be=br;br=be.handler}if(!br.guid){br.guid=a.guid++}var bm=a._data(bg);if(!bm){return}var bq=bm.events,bj=bm.handle;if(!bq){bm.events=bq={}}if(!bj){bm.handle=bj=function(){return typeof a!=="undefined"&&!a.event.triggered?a.event.handle.apply(bj.elem,arguments):H}}bj.elem=bg;bk=bk.split(" ");var bo,bh=0,bd;while((bo=bk[bh++])){bp=be?a.extend({},be):{handler:br,data:bi};if(bo.indexOf(".")>-1){bd=bo.split(".");bo=bd.shift();bp.namespace=bd.slice(0).sort().join(".")}else{bd=[];bp.namespace=""}bp.type=bo;if(!bp.guid){bp.guid=br.guid}var bf=bq[bo],bn=a.event.special[bo]||{};if(!bf){bf=bq[bo]=[];if(!bn.setup||bn.setup.call(bg,bi,bd,bj)===false){if(bg.addEventListener){bg.addEventListener(bo,bj,false)}else{if(bg.attachEvent){bg.attachEvent("on"+bo,bj)}}}}if(bn.add){bn.add.call(bg,bp);if(!bp.handler.guid){bp.handler.guid=br.guid}}bf.push(bp);a.event.global[bo]=true}bg=null},global:{},remove:function(br,bm,be,bi){if(br.nodeType===3||br.nodeType===8){return}if(be===false){be=a5}var bu,bh,bj,bo,bp=0,bf,bk,bn,bg,bl,e,bt,bq=a.hasData(br)&&a._data(br),bd=bq&&bq.events;if(!bq||!bd){return}if(bm&&bm.type){be=bm.handler;bm=bm.type}if(!bm||typeof bm==="string"&&bm.charAt(0)==="."){bm=bm||"";for(bh in bd){a.event.remove(br,bh+bm)}return}bm=bm.split(" ");while((bh=bm[bp++])){bt=bh;e=null;bf=bh.indexOf(".")<0;bk=[];if(!bf){bk=bh.split(".");bh=bk.shift();bn=new RegExp("(^|\\.)"+a.map(bk.slice(0).sort(),E).join("\\.(?:.*\\.)?")+"(\\.|$)")}bl=bd[bh];if(!bl){continue}if(!be){for(bo=0;bo<bl.length;bo++){e=bl[bo];if(bf||bn.test(e.namespace)){a.event.remove(br,bt,e.handler,bo);bl.splice(bo--,1)}}continue}bg=a.event.special[bh]||{};for(bo=bi||0;bo<bl.length;bo++){e=bl[bo];if(be.guid===e.guid){if(bf||bn.test(e.namespace)){if(bi==null){bl.splice(bo--,1)}if(bg.remove){bg.remove.call(br,e)}}if(bi!=null){break}}}if(bl.length===0||bi!=null&&bl.length===1){if(!bg.teardown||bg.teardown.call(br,bk)===false){a.removeEvent(br,bh,bq.handle)}bu=null;delete bd[bh]}}if(a.isEmptyObject(bd)){var bs=bq.handle;if(bs){bs.elem=null}delete bq.events;delete bq.handle;if(a.isEmptyObject(bq)){a.removeData(br,H,true)}}},trigger:function(bd,bi,bf){var bm=bd.type||bd,bh=arguments[3];if(!bh){bd=typeof bd==="object"?bd[a.expando]?bd:a.extend(a.Event(bm),bd):a.Event(bm);if(bm.indexOf("!")>=0){bd.type=bm=bm.slice(0,-1);bd.exclusive=true}if(!bf){bd.stopPropagation();if(a.event.global[bm]){a.each(a.cache,function(){var br=a.expando,bq=this[br];if(bq&&bq.events&&bq.events[bm]){a.event.trigger(bd,bi,bq.handle.elem)}})}}if(!bf||bf.nodeType===3||bf.nodeType===8){return H}bd.result=H;bd.target=bf;bi=a.makeArray(bi);bi.unshift(bd)}bd.currentTarget=bf;var bj=a._data(bf,"handle");if(bj){bj.apply(bf,bi)}var bo=bf.parentNode||bf.ownerDocument;try{if(!(bf&&bf.nodeName&&a.noData[bf.nodeName.toLowerCase()])){if(bf["on"+bm]&&bf["on"+bm].apply(bf,bi)===false){bd.result=false;bd.preventDefault()}}}catch(bn){}if(!bd.isPropagationStopped()&&bo){a.event.trigger(bd,bi,bo,true)}else{if(!bd.isDefaultPrevented()){var be,bk=bd.target,e=bm.replace(aP,""),bp=a.nodeName(bk,"a")&&e==="click",bl=a.event.special[e]||{};if((!bl._default||bl._default.call(bf,bd)===false)&&!bp&&!(bk&&bk.nodeName&&a.noData[bk.nodeName.toLowerCase()])){try{if(bk[e]){be=bk["on"+e];if(be){bk["on"+e]=null}a.event.triggered=true;bk[e]()}}catch(bg){}if(be){bk["on"+e]=be}a.event.triggered=false}}}},handle:function(e){var bl,be,bd,bn,bm,bh=[],bj=a.makeArray(arguments);e=bj[0]=a.event.fix(e||aY.event);e.currentTarget=this;bl=e.type.indexOf(".")<0&&!e.exclusive;if(!bl){bd=e.type.split(".");e.type=bd.shift();bh=bd.slice(0).sort();bn=new RegExp("(^|\\.)"+bh.join("\\.(?:.*\\.)?")+"(\\.|$)")}e.namespace=e.namespace||bh.join(".");bm=a._data(this,"events");be=(bm||{})[e.type];if(bm&&be){be=be.slice(0);for(var bg=0,bf=be.length;bg<bf;bg++){var bk=be[bg];if(bl||bn.test(bk.namespace)){e.handler=bk.handler;e.data=bk.data;e.handleObj=bk;var bi=bk.handler.apply(this,bj);if(bi!==H){e.result=bi;if(bi===false){e.preventDefault();e.stopPropagation()}}if(e.isImmediatePropagationStopped()){break}}}}return e.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(bf){if(bf[a.expando]){return bf}var bd=bf;bf=a.Event(bd);for(var be=this.props.length,bh;be;){bh=this.props[--be];bf[bh]=bd[bh]}if(!bf.target){bf.target=bf.srcElement||al}if(bf.target.nodeType===3){bf.target=bf.target.parentNode}if(!bf.relatedTarget&&bf.fromElement){bf.relatedTarget=bf.fromElement===bf.target?bf.toElement:bf.fromElement}if(bf.pageX==null&&bf.clientX!=null){var bg=al.documentElement,e=al.body;bf.pageX=bf.clientX+(bg&&bg.scrollLeft||e&&e.scrollLeft||0)-(bg&&bg.clientLeft||e&&e.clientLeft||0);bf.pageY=bf.clientY+(bg&&bg.scrollTop||e&&e.scrollTop||0)-(bg&&bg.clientTop||e&&e.clientTop||0)}if(bf.which==null&&(bf.charCode!=null||bf.keyCode!=null)){bf.which=bf.charCode!=null?bf.charCode:bf.keyCode}if(!bf.metaKey&&bf.ctrlKey){bf.metaKey=bf.ctrlKey}if(!bf.which&&bf.button!==H){bf.which=(bf.button&1?1:(bf.button&2?3:(bf.button&4?2:0)))}return bf},guid:100000000,proxy:a.proxy,special:{ready:{setup:a.bindReady,teardown:a.noop},live:{add:function(e){a.event.add(this,n(e.origType,e.selector),a.extend({},e,{handler:af,guid:e.handler.guid}))},remove:function(e){a.event.remove(this,n(e.origType,e.selector),e)}},beforeunload:{setup:function(be,bd,e){if(a.isWindow(this)){this.onbeforeunload=e}},teardown:function(bd,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}}};a.removeEvent=al.removeEventListener?function(bd,e,be){if(bd.removeEventListener){bd.removeEventListener(e,be,false)}}:function(bd,e,be){if(bd.detachEvent){bd.detachEvent("on"+e,be)}};a.Event=function(e){if(!this.preventDefault){return new a.Event(e)}if(e&&e.type){this.originalEvent=e;this.type=e.type;this.isDefaultPrevented=(e.defaultPrevented||e.returnValue===false||e.getPreventDefault&&e.getPreventDefault())?h:a5}else{this.type=e}this.timeStamp=a.now();this[a.expando]=true};function a5(){return false}function h(){return true}a.Event.prototype={preventDefault:function(){this.isDefaultPrevented=h;var bd=this.originalEvent;if(!bd){return}if(bd.preventDefault){bd.preventDefault()}else{bd.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=h;var bd=this.originalEvent;if(!bd){return}if(bd.stopPropagation){bd.stopPropagation()}bd.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=h;this.stopPropagation()},isDefaultPrevented:a5,isPropagationStopped:a5,isImmediatePropagationStopped:a5};var Z=function(be){var bd=be.relatedTarget;try{if(bd!==al&&!bd.parentNode){return}while(bd&&bd!==this){bd=bd.parentNode}if(bd!==this){be.type=be.data;a.event.handle.apply(this,arguments)}}catch(bf){}},aK=function(e){e.type=e.data;a.event.handle.apply(this,arguments)};a.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bd,e){a.event.special[bd]={setup:function(be){a.event.add(this,e,be&&be.selector?aK:Z,bd)},teardown:function(be){a.event.remove(this,e,be&&be.selector?aK:Z)}}});if(!a.support.submitBubbles){a.event.special.submit={setup:function(bd,e){if(this.nodeName&&this.nodeName.toLowerCase()!=="form"){a.event.add(this,"click.specialSubmit",function(bg){var bf=bg.target,be=bf.type;if((be==="submit"||be==="image")&&a(bf).closest("form").length){aN("submit",this,arguments)}});a.event.add(this,"keypress.specialSubmit",function(bg){var bf=bg.target,be=bf.type;if((be==="text"||be==="password")&&a(bf).closest("form").length&&bg.keyCode===13){aN("submit",this,arguments)}})}else{return false}},teardown:function(e){a.event.remove(this,".specialSubmit")}}}if(!a.support.changeBubbles){var a6,j=function(bd){var e=bd.type,be=bd.value;if(e==="radio"||e==="checkbox"){be=bd.checked}else{if(e==="select-multiple"){be=bd.selectedIndex>-1?a.map(bd.options,function(bf){return bf.selected}).join("-"):""}else{if(bd.nodeName.toLowerCase()==="select"){be=bd.selectedIndex}}}return be},X=function X(bf){var bd=bf.target,be,bg;if(!a0.test(bd.nodeName)||bd.readOnly){return}be=a._data(bd,"_change_data");bg=j(bd);if(bf.type!=="focusout"||bd.type!=="radio"){a._data(bd,"_change_data",bg)}if(be===H||bg===be){return}if(be!=null||bg){bf.type="change";bf.liveFired=H;a.event.trigger(bf,arguments[1],bd)}};a.event.special.change={filters:{focusout:X,beforedeactivate:X,click:function(bf){var be=bf.target,bd=be.type;if(bd==="radio"||bd==="checkbox"||be.nodeName.toLowerCase()==="select"){X.call(this,bf)}},keydown:function(bf){var be=bf.target,bd=be.type;if((bf.keyCode===13&&be.nodeName.toLowerCase()!=="textarea")||(bf.keyCode===32&&(bd==="checkbox"||bd==="radio"))||bd==="select-multiple"){X.call(this,bf)}},beforeactivate:function(be){var bd=be.target;a._data(bd,"_change_data",j(bd))}},setup:function(be,bd){if(this.type==="file"){return false}for(var e in a6){a.event.add(this,e+".specialChange",a6[e])}return a0.test(this.nodeName)},teardown:function(e){a.event.remove(this,".specialChange");return a0.test(this.nodeName)}};a6=a.event.special.change.filters;a6.focus=a6.beforeactivate}function aN(bd,bf,e){var be=a.extend({},e[0]);be.type=bd;be.originalEvent={};be.liveFired=H;a.event.handle.call(bf,be);if(be.isDefaultPrevented()){e[0].preventDefault()}}if(al.addEventListener){a.each({focus:"focusin",blur:"focusout"},function(be,e){a.event.special[e]={setup:function(){this.addEventListener(be,bd,true)},teardown:function(){this.removeEventListener(be,bd,true)}};function bd(bf){bf=a.event.fix(bf);bf.type=e;return a.event.handle.call(this,bf)}})}a.each(["bind","one"],function(bd,e){a.fn[e]=function(bj,bk,bi){if(typeof bj==="object"){for(var bg in bj){this[e](bg,bk,bj[bg],bi)}return this}if(a.isFunction(bk)||bk===false){bi=bk;bk=H}var bh=e==="one"?a.proxy(bi,function(bl){a(this).unbind(bl,bh);return bi.apply(this,arguments)}):bi;if(bj==="unload"&&e!=="one"){this.one(bj,bk,bi)}else{for(var bf=0,be=this.length;bf<be;bf++){a.event.add(this[bf],bj,bh,bk)}}return this}});a.fn.extend({unbind:function(bg,bf){if(typeof bg==="object"&&!bg.preventDefault){for(var be in bg){this.unbind(be,bg[be])}}else{for(var bd=0,e=this.length;bd<e;bd++){a.event.remove(this[bd],bg,bf)}}return this},delegate:function(e,bd,bf,be){return this.live(bd,bf,be,e)},undelegate:function(e,bd,be){if(arguments.length===0){return this.unbind("live")}else{return this.die(bd,null,be,e)}},trigger:function(e,bd){return this.each(function(){a.event.trigger(e,bd,this)})},triggerHandler:function(e,be){if(this[0]){var bd=a.Event(e);bd.preventDefault();bd.stopPropagation();a.event.trigger(bd,be,this[0]);return bd.result}},toggle:function(be){var e=arguments,bd=1;while(bd<e.length){a.proxy(be,e[bd++])}return this.click(a.proxy(be,function(bf){var bg=(a._data(this,"lastToggle"+be.guid)||0)%bd;a._data(this,"lastToggle"+be.guid,bg+1);bf.preventDefault();return e[bg].apply(this,arguments)||false}))},hover:function(e,bd){return this.mouseenter(e).mouseleave(bd||e)}});var aH={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};a.each(["live","die"],function(bd,e){a.fn[e]=function(bn,bk,bp,bg){var bo,bl=0,bm,bf,br,bi=bg||this.selector,be=bg?this:a(this.context);if(typeof bn==="object"&&!bn.preventDefault){for(var bq in bn){be[e](bq,bk,bn[bq],bi)}return this}if(a.isFunction(bk)){bp=bk;bk=H}bn=(bn||"").split(" ");while((bo=bn[bl++])!=null){bm=aP.exec(bo);bf="";if(bm){bf=bm[0];bo=bo.replace(aP,"")}if(bo==="hover"){bn.push("mouseenter"+bf,"mouseleave"+bf);continue}br=bo;if(bo==="focus"||bo==="blur"){bn.push(aH[bo]+bf);bo=bo+bf}else{bo=(aH[bo]||bo)+bf}if(e==="live"){for(var bj=0,bh=be.length;bj<bh;bj++){a.event.add(be[bj],"live."+n(bo,bi),{data:bk,selector:bi,handler:bp,origType:bo,origHandler:bp,preType:br})}}else{be.unbind("live."+n(bo,bi),bp)}}return this}});function af(bn){var bk,bf,bt,bh,e,bp,bm,bo,bl,bs,bj,bi,br,bq=[],bg=[],bd=a._data(this,"events");if(bn.liveFired===this||!bd||!bd.live||bn.target.disabled||bn.button&&bn.type==="click"){return}if(bn.namespace){bi=new RegExp("(^|\\.)"+bn.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")}bn.liveFired=this;var be=bd.live.slice(0);for(bm=0;bm<be.length;bm++){e=be[bm];if(e.origType.replace(aP,"")===bn.type){bg.push(e.selector)}else{be.splice(bm--,1)}}bh=a(bn.target).closest(bg,bn.currentTarget);for(bo=0,bl=bh.length;bo<bl;bo++){bj=bh[bo];for(bm=0;bm<be.length;bm++){e=be[bm];if(bj.selector===e.selector&&(!bi||bi.test(e.namespace))&&!bj.elem.disabled){bp=bj.elem;bt=null;if(e.preType==="mouseenter"||e.preType==="mouseleave"){bn.type=e.preType;bt=a(bn.relatedTarget).closest(e.selector)[0]}if(!bt||bt!==bp){bq.push({elem:bp,handleObj:e,level:bj.level})}}}}for(bo=0,bl=bq.length;bo<bl;bo++){bh=bq[bo];if(bf&&bh.level>bf){break}bn.currentTarget=bh.elem;bn.data=bh.handleObj.data;bn.handleObj=bh.handleObj;br=bh.handleObj.origHandler.apply(bh.elem,arguments);if(br===false||bn.isPropagationStopped()){bf=bh.level;if(br===false){bk=false}if(bn.isImmediatePropagationStopped()){break}}}return bk}function n(bd,e){return(bd&&bd!=="*"?bd+".":"")+e.replace(K,"`").replace(aa,"&")}a.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error").split(" "),function(bd,e){a.fn[e]=function(bf,be){if(be==null){be=bf;bf=null}return arguments.length>0?this.bind(e,bf,be):this.trigger(e)};if(a.attrFn){a.attrFn[e]=true}});
+/*
+ * Sizzle CSS Selector Engine
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){var bn=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bo=0,br=Object.prototype.toString,bi=false,bh=true,bp=/\\/g,bv=/\W/;[0,0].sort(function(){bh=false;return 0});var bf=function(bA,e,bD,bE){bD=bD||[];e=e||al;var bG=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bA||typeof bA!=="string"){return bD}var bx,bI,bL,bw,bH,bK,bJ,bC,bz=true,by=bf.isXML(e),bB=[],bF=bA;do{bn.exec("");bx=bn.exec(bF);if(bx){bF=bx[3];bB.push(bx[1]);if(bx[2]){bw=bx[3];break}}}while(bx);if(bB.length>1&&bj.exec(bA)){if(bB.length===2&&bk.relative[bB[0]]){bI=bs(bB[0]+bB[1],e)}else{bI=bk.relative[bB[0]]?[e]:bf(bB.shift(),e);while(bB.length){bA=bB.shift();if(bk.relative[bA]){bA+=bB.shift()}bI=bs(bA,bI)}}}else{if(!bE&&bB.length>1&&e.nodeType===9&&!by&&bk.match.ID.test(bB[0])&&!bk.match.ID.test(bB[bB.length-1])){bH=bf.find(bB.shift(),e,by);e=bH.expr?bf.filter(bH.expr,bH.set)[0]:bH.set[0]}if(e){bH=bE?{expr:bB.pop(),set:bl(bE)}:bf.find(bB.pop(),bB.length===1&&(bB[0]==="~"||bB[0]==="+")&&e.parentNode?e.parentNode:e,by);bI=bH.expr?bf.filter(bH.expr,bH.set):bH.set;if(bB.length>0){bL=bl(bI)}else{bz=false}while(bB.length){bK=bB.pop();bJ=bK;if(!bk.relative[bK]){bK=""}else{bJ=bB.pop()}if(bJ==null){bJ=e}bk.relative[bK](bL,bJ,by)}}else{bL=bB=[]}}if(!bL){bL=bI}if(!bL){bf.error(bK||bA)}if(br.call(bL)==="[object Array]"){if(!bz){bD.push.apply(bD,bL)}else{if(e&&e.nodeType===1){for(bC=0;bL[bC]!=null;bC++){if(bL[bC]&&(bL[bC]===true||bL[bC].nodeType===1&&bf.contains(e,bL[bC]))){bD.push(bI[bC])}}}else{for(bC=0;bL[bC]!=null;bC++){if(bL[bC]&&bL[bC].nodeType===1){bD.push(bI[bC])}}}}}else{bl(bL,bD)}if(bw){bf(bw,bG,bD,bE);bf.uniqueSort(bD)}return bD};bf.uniqueSort=function(bw){if(bq){bi=bh;bw.sort(bq);if(bi){for(var e=1;e<bw.length;e++){if(bw[e]===bw[e-1]){bw.splice(e--,1)}}}}return bw};bf.matches=function(e,bw){return bf(e,null,null,bw)};bf.matchesSelector=function(e,bw){return bf(bw,null,null,[e]).length>0};bf.find=function(bC,e,bD){var bB;if(!bC){return[]}for(var by=0,bx=bk.order.length;by<bx;by++){var bz,bA=bk.order[by];if((bz=bk.leftMatch[bA].exec(bC))){var bw=bz[1];bz.splice(1,1);if(bw.substr(bw.length-1)!=="\\"){bz[1]=(bz[1]||"").replace(bp,"");bB=bk.find[bA](bz,e,bD);if(bB!=null){bC=bC.replace(bk.match[bA],"");break}}}}if(!bB){bB=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bB,expr:bC}};bf.filter=function(bG,bF,bJ,bz){var bB,e,bx=bG,bL=[],bD=bF,bC=bF&&bF[0]&&bf.isXML(bF[0]);while(bG&&bF.length){for(var bE in bk.filter){if((bB=bk.leftMatch[bE].exec(bG))!=null&&bB[2]){var bK,bI,bw=bk.filter[bE],by=bB[1];e=false;bB.splice(1,1);if(by.substr(by.length-1)==="\\"){continue}if(bD===bL){bL=[]}if(bk.preFilter[bE]){bB=bk.preFilter[bE](bB,bD,bJ,bL,bz,bC);if(!bB){e=bK=true}else{if(bB===true){continue}}}if(bB){for(var bA=0;(bI=bD[bA])!=null;bA++){if(bI){bK=bw(bI,bB,bA,bD);var bH=bz^!!bK;if(bJ&&bK!=null){if(bH){e=true}else{bD[bA]=false}}else{if(bH){bL.push(bI);e=true}}}}}if(bK!==H){if(!bJ){bD=bL}bG=bG.replace(bk.match[bE],"");if(!e){return[]}break}}}if(bG===bx){if(e==null){bf.error(bG)}else{break}}bx=bG}return bD};bf.error=function(e){throw"Syntax error, unrecognized expression: "+e};var bk=bf.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bB,bw){var by=typeof bw==="string",bA=by&&!bv.test(bw),bC=by&&!bA;if(bA){bw=bw.toLowerCase()}for(var bx=0,e=bB.length,bz;bx<e;bx++){if((bz=bB[bx])){while((bz=bz.previousSibling)&&bz.nodeType!==1){}bB[bx]=bC||bz&&bz.nodeName.toLowerCase()===bw?bz||false:bz===bw}}if(bC){bf.filter(bw,bB,true)}},">":function(bB,bw){var bA,bz=typeof bw==="string",bx=0,e=bB.length;if(bz&&!bv.test(bw)){bw=bw.toLowerCase();for(;bx<e;bx++){bA=bB[bx];if(bA){var by=bA.parentNode;bB[bx]=by.nodeName.toLowerCase()===bw?by:false}}}else{for(;bx<e;bx++){bA=bB[bx];if(bA){bB[bx]=bz?bA.parentNode:bA.parentNode===bw}}if(bz){bf.filter(bw,bB,true)}}},"":function(by,bw,bA){var bz,bx=bo++,e=bt;if(typeof bw==="string"&&!bv.test(bw)){bw=bw.toLowerCase();bz=bw;e=bd}e("parentNode",bw,bx,by,bz,bA)},"~":function(by,bw,bA){var bz,bx=bo++,e=bt;if(typeof bw==="string"&&!bv.test(bw)){bw=bw.toLowerCase();bz=bw;e=bd}e("previousSibling",bw,bx,by,bz,bA)}},find:{ID:function(bw,bx,by){if(typeof bx.getElementById!=="undefined"&&!by){var e=bx.getElementById(bw[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bx,bA){if(typeof bA.getElementsByName!=="undefined"){var bw=[],bz=bA.getElementsByName(bx[1]);for(var by=0,e=bz.length;by<e;by++){if(bz[by].getAttribute("name")===bx[1]){bw.push(bz[by])}}return bw.length===0?null:bw}},TAG:function(e,bw){if(typeof bw.getElementsByTagName!=="undefined"){return bw.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(by,bw,bx,e,bB,bC){by=" "+by[1].replace(bp,"")+" ";if(bC){return by}for(var bz=0,bA;(bA=bw[bz])!=null;bz++){if(bA){if(bB^(bA.className&&(" "+bA.className+" ").replace(/[\t\n\r]/g," ").indexOf(by)>=0)){if(!bx){e.push(bA)}}else{if(bx){bw[bz]=false}}}}return false},ID:function(e){return e[1].replace(bp,"")},TAG:function(bw,e){return bw[1].replace(bp,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){bf.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bw=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bw[1]+(bw[2]||1))-0;e[3]=bw[3]-0}else{if(e[2]){bf.error(e[0])}}e[0]=bo++;return e},ATTR:function(bz,bw,bx,e,bA,bB){var by=bz[1]=bz[1].replace(bp,"");if(!bB&&bk.attrMap[by]){bz[1]=bk.attrMap[by]}bz[4]=(bz[4]||bz[5]||"").replace(bp,"");if(bz[2]==="~="){bz[4]=" "+bz[4]+" "}return bz},PSEUDO:function(bz,bw,bx,e,bA){if(bz[1]==="not"){if((bn.exec(bz[3])||"").length>1||/^\w/.test(bz[3])){bz[3]=bf(bz[3],null,null,bw)}else{var by=bf.filter(bz[3],bw,bx,true^bA);if(!bx){e.push.apply(e,by)}return false}}else{if(bk.match.POS.test(bz[0])||bk.match.CHILD.test(bz[0])){return true}}return bz},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bx,bw,e){return !!bf(e[3],bx).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(e){return"text"===e.getAttribute("type")},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toLowerCase()==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)}},setFilters:{first:function(bw,e){return e===0},last:function(bx,bw,e,by){return bw===by.length-1},even:function(bw,e){return e%2===0},odd:function(bw,e){return e%2===1},lt:function(bx,bw,e){return bw<e[3]-0},gt:function(bx,bw,e){return bw>e[3]-0},nth:function(bx,bw,e){return e[3]-0===bw},eq:function(bx,bw,e){return e[3]-0===bw}},filter:{PSEUDO:function(bx,bC,bB,bD){var e=bC[1],bw=bk.filters[e];if(bw){return bw(bx,bB,bC,bD)}else{if(e==="contains"){return(bx.textContent||bx.innerText||bf.getText([bx])||"").indexOf(bC[3])>=0}else{if(e==="not"){var by=bC[3];for(var bA=0,bz=by.length;bA<bz;bA++){if(by[bA]===bx){return false}}return true}else{bf.error(e)}}}},CHILD:function(e,by){var bB=by[1],bw=e;switch(bB){case"only":case"first":while((bw=bw.previousSibling)){if(bw.nodeType===1){return false}}if(bB==="first"){return true}bw=e;case"last":while((bw=bw.nextSibling)){if(bw.nodeType===1){return false}}return true;case"nth":var bx=by[2],bE=by[3];if(bx===1&&bE===0){return true}var bA=by[0],bD=e.parentNode;if(bD&&(bD.sizcache!==bA||!e.nodeIndex)){var bz=0;for(bw=bD.firstChild;bw;bw=bw.nextSibling){if(bw.nodeType===1){bw.nodeIndex=++bz}}bD.sizcache=bA}var bC=e.nodeIndex-bE;if(bx===0){return bC===0}else{return(bC%bx===0&&bC/bx>=0)}}},ID:function(bw,e){return bw.nodeType===1&&bw.getAttribute("id")===e},TAG:function(bw,e){return(e==="*"&&bw.nodeType===1)||bw.nodeName.toLowerCase()===e},CLASS:function(bw,e){return(" "+(bw.className||bw.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bA,by){var bx=by[1],e=bk.attrHandle[bx]?bk.attrHandle[bx](bA):bA[bx]!=null?bA[bx]:bA.getAttribute(bx),bB=e+"",bz=by[2],bw=by[4];return e==null?bz==="!=":bz==="="?bB===bw:bz==="*="?bB.indexOf(bw)>=0:bz==="~="?(" "+bB+" ").indexOf(bw)>=0:!bw?bB&&e!==false:bz==="!="?bB!==bw:bz==="^="?bB.indexOf(bw)===0:bz==="$="?bB.substr(bB.length-bw.length)===bw:bz==="|="?bB===bw||bB.substr(0,bw.length+1)===bw+"-":false},POS:function(bz,bw,bx,bA){var e=bw[2],by=bk.setFilters[e];if(by){return by(bz,bx,bw,bA)}}}};var bj=bk.match.POS,be=function(bw,e){return"\\"+(e-0+1)};for(var bg in bk.match){bk.match[bg]=new RegExp(bk.match[bg].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bk.leftMatch[bg]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bk.match[bg].source.replace(/\\(\d+)/g,be))}var bl=function(bw,e){bw=Array.prototype.slice.call(bw,0);if(e){e.push.apply(e,bw);return e}return bw};try{Array.prototype.slice.call(al.documentElement.childNodes,0)[0].nodeType}catch(bu){bl=function(bz,by){var bx=0,bw=by||[];if(br.call(bz)==="[object Array]"){Array.prototype.push.apply(bw,bz)}else{if(typeof bz.length==="number"){for(var e=bz.length;bx<e;bx++){bw.push(bz[bx])}}else{for(;bz[bx];bx++){bw.push(bz[bx])}}}return bw}}var bq,bm;if(al.documentElement.compareDocumentPosition){bq=function(bw,e){if(bw===e){bi=true;return 0}if(!bw.compareDocumentPosition||!e.compareDocumentPosition){return bw.compareDocumentPosition?-1:1}return bw.compareDocumentPosition(e)&4?-1:1}}else{bq=function(bD,bC){var bA,bw,bx=[],e=[],bz=bD.parentNode,bB=bC.parentNode,bE=bz;if(bD===bC){bi=true;return 0}else{if(bz===bB){return bm(bD,bC)}else{if(!bz){return -1}else{if(!bB){return 1}}}}while(bE){bx.unshift(bE);bE=bE.parentNode}bE=bB;while(bE){e.unshift(bE);bE=bE.parentNode}bA=bx.length;bw=e.length;for(var by=0;by<bA&&by<bw;by++){if(bx[by]!==e[by]){return bm(bx[by],e[by])}}return by===bA?bm(bD,e[by],-1):bm(bx[by],bC,1)};bm=function(bw,e,bx){if(bw===e){return bx}var by=bw.nextSibling;while(by){if(by===e){return -1}by=by.nextSibling}return 1}}bf.getText=function(e){var bw="",by;for(var bx=0;e[bx];bx++){by=e[bx];if(by.nodeType===3||by.nodeType===4){bw+=by.nodeValue}else{if(by.nodeType!==8){bw+=bf.getText(by.childNodes)}}}return bw};(function(){var bw=al.createElement("div"),bx="script"+(new Date()).getTime(),e=al.documentElement;bw.innerHTML="<a name='"+bx+"'/>";e.insertBefore(bw,e.firstChild);if(al.getElementById(bx)){bk.find.ID=function(bz,bA,bB){if(typeof bA.getElementById!=="undefined"&&!bB){var by=bA.getElementById(bz[1]);return by?by.id===bz[1]||typeof by.getAttributeNode!=="undefined"&&by.getAttributeNode("id").nodeValue===bz[1]?[by]:H:[]}};bk.filter.ID=function(bA,by){var bz=typeof bA.getAttributeNode!=="undefined"&&bA.getAttributeNode("id");return bA.nodeType===1&&bz&&bz.nodeValue===by}}e.removeChild(bw);e=bw=null})();(function(){var e=al.createElement("div");e.appendChild(al.createComment(""));if(e.getElementsByTagName("*").length>0){bk.find.TAG=function(bw,bA){var bz=bA.getElementsByTagName(bw[1]);if(bw[1]==="*"){var by=[];for(var bx=0;bz[bx];bx++){if(bz[bx].nodeType===1){by.push(bz[bx])}}bz=by}return bz}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bk.attrHandle.href=function(bw){return bw.getAttribute("href",2)}}e=null})();if(al.querySelectorAll){(function(){var e=bf,by=al.createElement("div"),bx="__sizzle__";by.innerHTML="<p class='TEST'></p>";if(by.querySelectorAll&&by.querySelectorAll(".TEST").length===0){return}bf=function(bJ,bA,bE,bI){bA=bA||al;if(!bI&&!bf.isXML(bA)){var bH=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(bJ);if(bH&&(bA.nodeType===1||bA.nodeType===9)){if(bH[1]){return bl(bA.getElementsByTagName(bJ),bE)}else{if(bH[2]&&bk.find.CLASS&&bA.getElementsByClassName){return bl(bA.getElementsByClassName(bH[2]),bE)}}}if(bA.nodeType===9){if(bJ==="body"&&bA.body){return bl([bA.body],bE)}else{if(bH&&bH[3]){var bD=bA.getElementById(bH[3]);if(bD&&bD.parentNode){if(bD.id===bH[3]){return bl([bD],bE)}}else{return bl([],bE)}}}try{return bl(bA.querySelectorAll(bJ),bE)}catch(bF){}}else{if(bA.nodeType===1&&bA.nodeName.toLowerCase()!=="object"){var bB=bA,bC=bA.getAttribute("id"),bz=bC||bx,bL=bA.parentNode,bK=/^\s*[+~]/.test(bJ);if(!bC){bA.setAttribute("id",bz)}else{bz=bz.replace(/'/g,"\\$&")}if(bK&&bL){bA=bA.parentNode}try{if(!bK||bL){return bl(bA.querySelectorAll("[id='"+bz+"'] "+bJ),bE)}}catch(bG){}finally{if(!bC){bB.removeAttribute("id")}}}}}return e(bJ,bA,bE,bI)};for(var bw in e){bf[bw]=e[bw]}by=null})()}(function(){var e=al.documentElement,bx=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector,bw=false;try{bx.call(al.documentElement,"[test!='']:sizzle")}catch(by){bw=true}if(bx){bf.matchesSelector=function(bz,bB){bB=bB.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!bf.isXML(bz)){try{if(bw||!bk.match.PSEUDO.test(bB)&&!/!=/.test(bB)){return bx.call(bz,bB)}}catch(bA){}}return bf(bB,null,null,[bz]).length>0}}})();(function(){var e=al.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bk.order.splice(1,0,"CLASS");bk.find.CLASS=function(bw,bx,by){if(typeof bx.getElementsByClassName!=="undefined"&&!by){return bx.getElementsByClassName(bw[1])}};e=null})();function bd(bw,bB,bA,bE,bC,bD){for(var by=0,bx=bE.length;by<bx;by++){var e=bE[by];if(e){var bz=false;e=e[bw];while(e){if(e.sizcache===bA){bz=bE[e.sizset];break}if(e.nodeType===1&&!bD){e.sizcache=bA;e.sizset=by}if(e.nodeName.toLowerCase()===bB){bz=e;break}e=e[bw]}bE[by]=bz}}}function bt(bw,bB,bA,bE,bC,bD){for(var by=0,bx=bE.length;by<bx;by++){var e=bE[by];if(e){var bz=false;e=e[bw];while(e){if(e.sizcache===bA){bz=bE[e.sizset];break}if(e.nodeType===1){if(!bD){e.sizcache=bA;e.sizset=by}if(typeof bB!=="string"){if(e===bB){bz=true;break}}else{if(bf.filter(bB,[e]).length>0){bz=e;break}}}e=e[bw]}bE[by]=bz}}}if(al.documentElement.contains){bf.contains=function(bw,e){return bw!==e&&(bw.contains?bw.contains(e):true)}}else{if(al.documentElement.compareDocumentPosition){bf.contains=function(bw,e){return !!(bw.compareDocumentPosition(e)&16)}}else{bf.contains=function(){return false}}}bf.isXML=function(e){var bw=(e?e.ownerDocument||e:0).documentElement;return bw?bw.nodeName!=="HTML":false};var bs=function(e,bC){var bA,by=[],bz="",bx=bC.nodeType?[bC]:bC;while((bA=bk.match.PSEUDO.exec(e))){bz+=bA[0];e=e.replace(bk.match.PSEUDO,"")}e=bk.relative[e]?e+"*":e;for(var bB=0,bw=bx.length;bB<bw;bB++){bf(e,bx[bB],by)}return bf.filter(bz,by)};a.find=bf;a.expr=bf.selectors;a.expr[":"]=a.expr.filters;a.unique=bf.uniqueSort;a.text=bf.getText;a.isXMLDoc=bf.isXML;a.contains=bf.contains})();var W=/Until$/,ai=/^(?:parents|prevUntil|prevAll)/,aW=/,/,a9=/^.[^:#\[\.,]*$/,M=Array.prototype.slice,F=a.expr.match.POS,ao={children:true,contents:true,next:true,prev:true};a.fn.extend({find:function(e){var be=this.pushStack("","find",e),bh=0;for(var bf=0,bd=this.length;bf<bd;bf++){bh=be.length;a.find(e,this[bf],be);if(bf>0){for(var bi=bh;bi<be.length;bi++){for(var bg=0;bg<bh;bg++){if(be[bg]===be[bi]){be.splice(bi--,1);break}}}}}return be},has:function(bd){var e=a(bd);return this.filter(function(){for(var bf=0,be=e.length;bf<be;bf++){if(a.contains(this,e[bf])){return true}}})},not:function(e){return this.pushStack(av(this,e,false),"not",e)},filter:function(e){return this.pushStack(av(this,e,true),"filter",e)},is:function(e){return !!e&&a.filter(e,this).length>0},closest:function(bm,bd){var bj=[],bg,be,bl=this[0];if(a.isArray(bm)){var bi,bf,bh={},e=1;if(bl&&bm.length){for(bg=0,be=bm.length;bg<be;bg++){bf=bm[bg];if(!bh[bf]){bh[bf]=a.expr.match.POS.test(bf)?a(bf,bd||this.context):bf}}while(bl&&bl.ownerDocument&&bl!==bd){for(bf in bh){bi=bh[bf];if(bi.jquery?bi.index(bl)>-1:a(bl).is(bi)){bj.push({selector:bf,elem:bl,level:e})}}bl=bl.parentNode;e++}}return bj}var bk=F.test(bm)?a(bm,bd||this.context):null;for(bg=0,be=this.length;bg<be;bg++){bl=this[bg];while(bl){if(bk?bk.index(bl)>-1:a.find.matchesSelector(bl,bm)){bj.push(bl);break}else{bl=bl.parentNode;if(!bl||!bl.ownerDocument||bl===bd){break}}}}bj=bj.length>1?a.unique(bj):bj;return this.pushStack(bj,"closest",bm)},index:function(e){if(!e||typeof e==="string"){return a.inArray(this[0],e?a(e):this.parent().children())}return a.inArray(e.jquery?e[0]:e,this)},add:function(e,bd){var bf=typeof e==="string"?a(e,bd):a.makeArray(e),be=a.merge(this.get(),bf);return this.pushStack(B(bf[0])||B(be[0])?be:a.unique(be))},andSelf:function(){return this.add(this.prevObject)}});function B(e){return !e||!e.parentNode||e.parentNode.nodeType===11}a.each({parent:function(bd){var e=bd.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return a.dir(e,"parentNode")},parentsUntil:function(bd,e,be){return a.dir(bd,"parentNode",be)},next:function(e){return a.nth(e,2,"nextSibling")},prev:function(e){return a.nth(e,2,"previousSibling")},nextAll:function(e){return a.dir(e,"nextSibling")},prevAll:function(e){return a.dir(e,"previousSibling")},nextUntil:function(bd,e,be){return a.dir(bd,"nextSibling",be)},prevUntil:function(bd,e,be){return a.dir(bd,"previousSibling",be)},siblings:function(e){return a.sibling(e.parentNode.firstChild,e)},children:function(e){return a.sibling(e.firstChild)},contents:function(e){return a.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:a.makeArray(e.childNodes)}},function(e,bd){a.fn[e]=function(bh,be){var bg=a.map(this,bd,bh),bf=M.call(arguments);if(!W.test(e)){be=bh}if(be&&typeof be==="string"){bg=a.filter(be,bg)}bg=this.length>1&&!ao[e]?a.unique(bg):bg;if((this.length>1||aW.test(be))&&ai.test(e)){bg=bg.reverse()}return this.pushStack(bg,e,bf.join(","))}});a.extend({filter:function(be,e,bd){if(bd){be=":not("+be+")"}return e.length===1?a.find.matchesSelector(e[0],be)?[e[0]]:[]:a.find.matches(be,e)},dir:function(be,bd,bg){var e=[],bf=be[bd];while(bf&&bf.nodeType!==9&&(bg===H||bf.nodeType!==1||!a(bf).is(bg))){if(bf.nodeType===1){e.push(bf)}bf=bf[bd]}return e},nth:function(bg,e,be,bf){e=e||1;var bd=0;for(;bg;bg=bg[be]){if(bg.nodeType===1&&++bd===e){break}}return bg},sibling:function(be,bd){var e=[];for(;be;be=be.nextSibling){if(be.nodeType===1&&be!==bd){e.push(be)}}return e}});function av(bf,be,e){if(a.isFunction(be)){return a.grep(bf,function(bh,bg){var bi=!!be.call(bh,bg,bh);return bi===e})}else{if(be.nodeType){return a.grep(bf,function(bh,bg){return(bh===be)===e})}else{if(typeof be==="string"){var bd=a.grep(bf,function(bg){return bg.nodeType===1});if(a9.test(be)){return a.filter(be,bd,!e)}else{be=a.filter(be,bd)}}}}return a.grep(bf,function(bh,bg){return(a.inArray(bh,be)>=0)===e})}var ab=/ jQuery\d+="(?:\d+|null)"/g,aj=/^\s+/,O=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,c=/<([\w:]+)/,v=/<tbody/i,T=/<|&#?\w+;/,L=/<(?:script|object|embed|option|style)/i,m=/checked\s*(?:[^=]|=\s*.checked.)/i,an={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};an.optgroup=an.option;an.tbody=an.tfoot=an.colgroup=an.caption=an.thead;an.th=an.td;if(!a.support.htmlSerialize){an._default=[1,"div<div>","</div>"]}a.fn.extend({text:function(e){if(a.isFunction(e)){return this.each(function(be){var bd=a(this);bd.text(e.call(this,be,bd.text()))})}if(typeof e!=="object"&&e!==H){return this.empty().append((this[0]&&this[0].ownerDocument||al).createTextNode(e))}return a.text(this)},wrapAll:function(e){if(a.isFunction(e)){return this.each(function(be){a(this).wrapAll(e.call(this,be))})}if(this[0]){var bd=a(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bd.insertBefore(this[0])}bd.map(function(){var be=this;while(be.firstChild&&be.firstChild.nodeType===1){be=be.firstChild}return be}).append(this)}return this},wrapInner:function(e){if(a.isFunction(e)){return this.each(function(bd){a(this).wrapInner(e.call(this,bd))})}return this.each(function(){var bd=a(this),be=bd.contents();if(be.length){be.wrapAll(e)}else{bd.append(e)}})},wrap:function(e){return this.each(function(){a(this).wrapAll(e)})},unwrap:function(){return this.parent().each(function(){if(!a.nodeName(this,"body")){a(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bd){this.parentNode.insertBefore(bd,this)})}else{if(arguments.length){var e=a(arguments[0]);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bd){this.parentNode.insertBefore(bd,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,a(arguments[0]).toArray());return e}}},remove:function(e,bf){for(var bd=0,be;(be=this[bd])!=null;bd++){if(!e||a.filter(e,[be]).length){if(!bf&&be.nodeType===1){a.cleanData(be.getElementsByTagName("*"));a.cleanData([be])}if(be.parentNode){be.parentNode.removeChild(be)}}}return this},empty:function(){for(var e=0,bd;(bd=this[e])!=null;e++){if(bd.nodeType===1){a.cleanData(bd.getElementsByTagName("*"))}while(bd.firstChild){bd.removeChild(bd.firstChild)}}return this},clone:function(bd,e){bd=bd==null?false:bd;e=e==null?bd:e;return this.map(function(){return a.clone(this,bd,e)})},html:function(bf){if(bf===H){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ab,""):null}else{if(typeof bf==="string"&&!L.test(bf)&&(a.support.leadingWhitespace||!aj.test(bf))&&!an[(c.exec(bf)||["",""])[1].toLowerCase()]){bf=bf.replace(O,"<$1></$2>");try{for(var be=0,bd=this.length;be<bd;be++){if(this[be].nodeType===1){a.cleanData(this[be].getElementsByTagName("*"));this[be].innerHTML=bf}}}catch(bg){this.empty().append(bf)}}else{if(a.isFunction(bf)){this.each(function(bh){var e=a(this);e.html(bf.call(this,bh,e.html()))})}else{this.empty().append(bf)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(a.isFunction(e)){return this.each(function(bf){var be=a(this),bd=be.html();be.replaceWith(e.call(this,bf,bd))})}if(typeof e!=="string"){e=a(e).detach()}return this.each(function(){var be=this.nextSibling,bd=this.parentNode;a(this).remove();if(be){a(be).before(e)}else{a(bd).append(e)}})}else{return this.pushStack(a(a.isFunction(e)?e():e),"replaceWith",e)}},detach:function(e){return this.remove(e,true)},domManip:function(bj,bn,bm){var bf,bg,bi,bl,bk=bj[0],bd=[];if(!a.support.checkClone&&arguments.length===3&&typeof bk==="string"&&m.test(bk)){return this.each(function(){a(this).domManip(bj,bn,bm,true)})}if(a.isFunction(bk)){return this.each(function(bp){var bo=a(this);bj[0]=bk.call(this,bp,bn?bo.html():H);bo.domManip(bj,bn,bm)})}if(this[0]){bl=bk&&bk.parentNode;if(a.support.parentNode&&bl&&bl.nodeType===11&&bl.childNodes.length===this.length){bf={fragment:bl}}else{bf=a.buildFragment(bj,this,bd)}bi=bf.fragment;if(bi.childNodes.length===1){bg=bi=bi.firstChild}else{bg=bi.firstChild}if(bg){bn=bn&&a.nodeName(bg,"tr");for(var be=0,e=this.length,bh=e-1;be<e;be++){bm.call(bn?aX(this[be],bg):this[be],bf.cacheable||(e>1&&be<bh)?a.clone(bi,true,true):bi)}}if(bd.length){a.each(bd,a8)}}return this}});function aX(e,bd){return a.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function s(e,bj){if(bj.nodeType!==1||!a.hasData(e)){return}var bi=a.expando,bf=a.data(e),bg=a.data(bj,bf);if((bf=bf[bi])){var bk=bf.events;bg=bg[bi]=a.extend({},bf);if(bk){delete bg.handle;bg.events={};for(var bh in bk){for(var be=0,bd=bk[bh].length;be<bd;be++){a.event.add(bj,bh+(bk[bh][be].namespace?".":"")+bk[bh][be].namespace,bk[bh][be],bk[bh][be].data)}}}}}function ac(bd,e){if(e.nodeType!==1){return}var be=e.nodeName.toLowerCase();e.clearAttributes();e.mergeAttributes(bd);if(be==="object"){e.outerHTML=bd.outerHTML}else{if(be==="input"&&(bd.type==="checkbox"||bd.type==="radio")){if(bd.checked){e.defaultChecked=e.checked=bd.checked}if(e.value!==bd.value){e.value=bd.value}}else{if(be==="option"){e.selected=bd.defaultSelected}else{if(be==="input"||be==="textarea"){e.defaultValue=bd.defaultValue}}}}e.removeAttribute(a.expando)}a.buildFragment=function(bh,bf,bd){var bg,e,be,bi=(bf&&bf[0]?bf[0].ownerDocument||bf[0]:al);if(bh.length===1&&typeof bh[0]==="string"&&bh[0].length<512&&bi===al&&bh[0].charAt(0)==="<"&&!L.test(bh[0])&&(a.support.checkClone||!m.test(bh[0]))){e=true;be=a.fragments[bh[0]];if(be){if(be!==1){bg=be}}}if(!bg){bg=bi.createDocumentFragment();a.clean(bh,bi,bg,bd)}if(e){a.fragments[bh[0]]=be?bg:1}return{fragment:bg,cacheable:e}};a.fragments={};a.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bd){a.fn[e]=function(be){var bh=[],bk=a(be),bj=this.length===1&&this[0].parentNode;if(bj&&bj.nodeType===11&&bj.childNodes.length===1&&bk.length===1){bk[bd](this[0]);return this}else{for(var bi=0,bf=bk.length;bi<bf;bi++){var bg=(bi>0?this.clone(true):this).get();a(bk[bi])[bd](bg);bh=bh.concat(bg)}return this.pushStack(bh,e,bk.selector)}}});function a1(e){if("getElementsByTagName" in e){return e.getElementsByTagName("*")}else{if("querySelectorAll" in e){return e.querySelectorAll("*")}else{return[]}}}a.extend({clone:function(bg,bi,be){var bh=bg.cloneNode(true),e,bd,bf;if((!a.support.noCloneEvent||!a.support.noCloneChecked)&&(bg.nodeType===1||bg.nodeType===11)&&!a.isXMLDoc(bg)){ac(bg,bh);e=a1(bg);bd=a1(bh);for(bf=0;e[bf];++bf){ac(e[bf],bd[bf])}}if(bi){s(bg,bh);if(be){e=a1(bg);bd=a1(bh);for(bf=0;e[bf];++bf){s(e[bf],bd[bf])}}}return bh},clean:function(be,bg,bn,bi){bg=bg||al;if(typeof bg.createElement==="undefined"){bg=bg.ownerDocument||bg[0]&&bg[0].ownerDocument||al}var bo=[];for(var bm=0,bh;(bh=be[bm])!=null;bm++){if(typeof bh==="number"){bh+=""}if(!bh){continue}if(typeof bh==="string"&&!T.test(bh)){bh=bg.createTextNode(bh)}else{if(typeof bh==="string"){bh=bh.replace(O,"<$1></$2>");var bp=(c.exec(bh)||["",""])[1].toLowerCase(),bf=an[bp]||an._default,bl=bf[0],bd=bg.createElement("div");bd.innerHTML=bf[1]+bh+bf[2];while(bl--){bd=bd.lastChild}if(!a.support.tbody){var e=v.test(bh),bk=bp==="table"&&!e?bd.firstChild&&bd.firstChild.childNodes:bf[1]==="<table>"&&!e?bd.childNodes:[];for(var bj=bk.length-1;bj>=0;--bj){if(a.nodeName(bk[bj],"tbody")&&!bk[bj].childNodes.length){bk[bj].parentNode.removeChild(bk[bj])}}}if(!a.support.leadingWhitespace&&aj.test(bh)){bd.insertBefore(bg.createTextNode(aj.exec(bh)[0]),bd.firstChild)}bh=bd.childNodes}}if(bh.nodeType){bo.push(bh)}else{bo=a.merge(bo,bh)}}if(bn){for(bm=0;bo[bm];bm++){if(bi&&a.nodeName(bo[bm],"script")&&(!bo[bm].type||bo[bm].type.toLowerCase()==="text/javascript")){bi.push(bo[bm].parentNode?bo[bm].parentNode.removeChild(bo[bm]):bo[bm])}else{if(bo[bm].nodeType===1){bo.splice.apply(bo,[bm+1,0].concat(a.makeArray(bo[bm].getElementsByTagName("script"))))}bn.appendChild(bo[bm])}}}return bo},cleanData:function(bd){var bg,be,e=a.cache,bl=a.expando,bj=a.event.special,bi=a.support.deleteExpando;for(var bh=0,bf;(bf=bd[bh])!=null;bh++){if(bf.nodeName&&a.noData[bf.nodeName.toLowerCase()]){continue}be=bf[a.expando];if(be){bg=e[be]&&e[be][bl];if(bg&&bg.events){for(var bk in bg.events){if(bj[bk]){a.event.remove(bf,bk)}else{a.removeEvent(bf,bk,bg.handle)}}if(bg.handle){bg.handle.elem=null}}if(bi){delete bf[a.expando]}else{if(bf.removeAttribute){bf.removeAttribute(a.expando)}}delete e[be]}}}});function a8(e,bd){if(bd.src){a.ajax({url:bd.src,async:false,dataType:"script"})}else{a.globalEval(bd.text||bd.textContent||bd.innerHTML||"")}if(bd.parentNode){bd.parentNode.removeChild(bd)}}var ae=/alpha\([^)]*\)/i,ak=/opacity=([^)]*)/,aM=/-([a-z])/ig,y=/([A-Z])/g,aZ=/^-?\d+(?:px)?$/i,a7=/^-?\d/,aV={position:"absolute",visibility:"hidden",display:"block"},ag=["Left","Right"],aR=["Top","Bottom"],U,ay,aL,l=function(e,bd){return bd.toUpperCase()};a.fn.css=function(e,bd){if(arguments.length===2&&bd===H){return this}return a.access(this,e,bd,true,function(bf,be,bg){return bg!==H?a.style(bf,be,bg):a.css(bf,be)})};a.extend({cssHooks:{opacity:{get:function(be,bd){if(bd){var e=U(be,"opacity","opacity");return e===""?"1":e}else{return be.style.opacity}}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":a.support.cssFloat?"cssFloat":"styleFloat"},style:function(bf,be,bk,bg){if(!bf||bf.nodeType===3||bf.nodeType===8||!bf.style){return}var bj,bh=a.camelCase(be),bd=bf.style,bl=a.cssHooks[bh];be=a.cssProps[bh]||bh;if(bk!==H){if(typeof bk==="number"&&isNaN(bk)||bk==null){return}if(typeof bk==="number"&&!a.cssNumber[bh]){bk+="px"}if(!bl||!("set" in bl)||(bk=bl.set(bf,bk))!==H){try{bd[be]=bk}catch(bi){}}}else{if(bl&&"get" in bl&&(bj=bl.get(bf,false,bg))!==H){return bj}return bd[be]}},css:function(bh,bg,bd){var bf,be=a.camelCase(bg),e=a.cssHooks[be];bg=a.cssProps[be]||be;if(e&&"get" in e&&(bf=e.get(bh,true,bd))!==H){return bf}else{if(U){return U(bh,bg,be)}}},swap:function(bf,be,bg){var e={};for(var bd in be){e[bd]=bf.style[bd];bf.style[bd]=be[bd]}bg.call(bf);for(bd in be){bf.style[bd]=e[bd]}},camelCase:function(e){return e.replace(aM,l)}});a.curCSS=a.css;a.each(["height","width"],function(bd,e){a.cssHooks[e]={get:function(bg,bf,be){var bh;if(bf){if(bg.offsetWidth!==0){bh=o(bg,e,be)}else{a.swap(bg,aV,function(){bh=o(bg,e,be)})}if(bh<=0){bh=U(bg,e,e);if(bh==="0px"&&aL){bh=aL(bg,e,e)}if(bh!=null){return bh===""||bh==="auto"?"0px":bh}}if(bh<0||bh==null){bh=bg.style[e];return bh===""||bh==="auto"?"0px":bh}return typeof bh==="string"?bh:bh+"px"}},set:function(be,bf){if(aZ.test(bf)){bf=parseFloat(bf);if(bf>=0){return bf+"px"}}else{return bf}}}});if(!a.support.opacity){a.cssHooks.opacity={get:function(bd,e){return ak.test((e&&bd.currentStyle?bd.currentStyle.filter:bd.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(bf,bg){var be=bf.style;be.zoom=1;var e=a.isNaN(bg)?"":"alpha(opacity="+bg*100+")",bd=be.filter||"";be.filter=ae.test(bd)?bd.replace(ae,e):be.filter+" "+e}}}if(al.defaultView&&al.defaultView.getComputedStyle){ay=function(bh,e,bf){var be,bg,bd;bf=bf.replace(y,"-$1").toLowerCase();if(!(bg=bh.ownerDocument.defaultView)){return H}if((bd=bg.getComputedStyle(bh,null))){be=bd.getPropertyValue(bf);if(be===""&&!a.contains(bh.ownerDocument.documentElement,bh)){be=a.style(bh,bf)}}return be}}if(al.documentElement.currentStyle){aL=function(bg,be){var bh,bd=bg.currentStyle&&bg.currentStyle[be],e=bg.runtimeStyle&&bg.runtimeStyle[be],bf=bg.style;if(!aZ.test(bd)&&a7.test(bd)){bh=bf.left;if(e){bg.runtimeStyle.left=bg.currentStyle.left}bf.left=be==="fontSize"?"1em":(bd||0);bd=bf.pixelLeft+"px";bf.left=bh;if(e){bg.runtimeStyle.left=e}}return bd===""?"auto":bd}}U=ay||aL;function o(be,bd,e){var bg=bd==="width"?ag:aR,bf=bd==="width"?be.offsetWidth:be.offsetHeight;if(e==="border"){return bf}a.each(bg,function(){if(!e){bf-=parseFloat(a.css(be,"padding"+this))||0}if(e==="margin"){bf+=parseFloat(a.css(be,"margin"+this))||0}else{bf-=parseFloat(a.css(be,"border"+this+"Width"))||0}});return bf}if(a.expr&&a.expr.filters){a.expr.filters.hidden=function(be){var bd=be.offsetWidth,e=be.offsetHeight;return(bd===0&&e===0)||(!a.support.reliableHiddenOffsets&&(be.style.display||a.css(be,"display"))==="none")};a.expr.filters.visible=function(e){return !a.expr.filters.hidden(e)}}var i=/%20/g,ah=/\[\]$/,bc=/\r?\n/g,ba=/#.*$/,ar=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aO=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aB=/(?:^file|^widget|\-extension):$/,aD=/^(?:GET|HEAD)$/,b=/^\/\//,I=/\?/,aU=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,p=/^(?:select|textarea)/i,g=/\s+/,bb=/([?&])_=[^&]*/,R=/(^|\-)([a-z])/g,aJ=function(bd,e,be){return e+be.toUpperCase()},G=/^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,z=a.fn.load,V={},q={},au,r;try{au=al.location.href}catch(am){au=al.createElement("a");au.href="";au=au.href}r=G.exec(au.toLowerCase());function d(e){return function(bg,bi){if(typeof bg!=="string"){bi=bg;bg="*"}if(a.isFunction(bi)){var bf=bg.toLowerCase().split(g),be=0,bh=bf.length,bd,bj,bk;for(;be<bh;be++){bd=bf[be];bk=/^\+/.test(bd);if(bk){bd=bd.substr(1)||"*"}bj=e[bd]=e[bd]||[];bj[bk?"unshift":"push"](bi)}}}}function aI(bd,bm,bh,bl,bj,bf){bj=bj||bm.dataTypes[0];bf=bf||{};bf[bj]=true;var bi=bd[bj],be=0,e=bi?bi.length:0,bg=(bd===V),bk;for(;be<e&&(bg||!bk);be++){bk=bi[be](bm,bh,bl);if(typeof bk==="string"){if(!bg||bf[bk]){bk=H}else{bm.dataTypes.unshift(bk);bk=aI(bd,bm,bh,bl,bk,bf)}}}if((bg||!bk)&&!bf["*"]){bk=aI(bd,bm,bh,bl,"*",bf)}return bk}a.fn.extend({load:function(be,bh,bi){if(typeof be!=="string"&&z){return z.apply(this,arguments)}else{if(!this.length){return this}}var bg=be.indexOf(" ");if(bg>=0){var e=be.slice(bg,be.length);be=be.slice(0,bg)}var bf="GET";if(bh){if(a.isFunction(bh)){bi=bh;bh=H}else{if(typeof bh==="object"){bh=a.param(bh,a.ajaxSettings.traditional);bf="POST"}}}var bd=this;a.ajax({url:be,type:bf,dataType:"html",data:bh,complete:function(bk,bj,bl){bl=bk.responseText;if(bk.isResolved()){bk.done(function(bm){bl=bm});bd.html(e?a("<div>").append(bl.replace(aU,"")).find(e):bl)}if(bi){bd.each(bi,[bl,bj,bk])}}});return this},serialize:function(){return a.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?a.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||p.test(this.nodeName)||aO.test(this.type))}).map(function(e,bd){var be=a(this).val();return be==null?null:a.isArray(be)?a.map(be,function(bg,bf){return{name:bd.name,value:bg.replace(bc,"\r\n")}}):{name:bd.name,value:be.replace(bc,"\r\n")}}).get()}});a.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bd){a.fn[bd]=function(be){return this.bind(bd,be)}});a.each(["get","post"],function(e,bd){a[bd]=function(be,bg,bh,bf){if(a.isFunction(bg)){bf=bf||bh;bh=bg;bg=H}return a.ajax({type:bd,url:be,data:bg,success:bh,dataType:bf})}});a.extend({getScript:function(e,bd){return a.get(e,H,bd,"script")},getJSON:function(e,bd,be){return a.get(e,bd,be,"json")},ajaxSetup:function(be,e){if(!e){e=be;be=a.extend(true,a.ajaxSettings,e)}else{a.extend(true,be,a.ajaxSettings,e)}for(var bd in {context:1,url:1}){if(bd in e){be[bd]=e[bd]}else{if(bd in a.ajaxSettings){be[bd]=a.ajaxSettings[bd]}}}return be},ajaxSettings:{url:au,isLocal:aB.test(r[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":aY.String,"text html":true,"text json":a.parseJSON,"text xml":a.parseXML}},ajaxPrefilter:d(V),ajaxTransport:d(q),ajax:function(bh,bf){if(typeof bh==="object"){bf=bh;bh=H}bf=bf||{};var bl=a.ajaxSetup({},bf),bz=bl.context||bl,bo=bz!==bl&&(bz.nodeType||bz instanceof a)?a(bz):a.event,by=a.Deferred(),bv=a._Deferred(),bj=bl.statusCode||{},bk,bp={},bx,bg,bt,bm,bq,bi=0,be,bs,br={readyState:0,setRequestHeader:function(e,bA){if(!bi){bp[e.toLowerCase().replace(R,aJ)]=bA}return this},getAllResponseHeaders:function(){return bi===2?bx:null},getResponseHeader:function(bA){var e;if(bi===2){if(!bg){bg={};while((e=ar.exec(bx))){bg[e[1].toLowerCase()]=e[2]}}e=bg[bA.toLowerCase()]}return e===H?null:e},overrideMimeType:function(e){if(!bi){bl.mimeType=e}return this},abort:function(e){e=e||"abort";if(bt){bt.abort(e)}bn(0,e);return this}};function bn(bF,bD,bG,bC){if(bi===2){return}bi=2;if(bm){clearTimeout(bm)}bt=H;bx=bC||"";br.readyState=bF?4:0;var bA,bK,bJ,bE=bG?a4(bl,br,bG):H,bB,bI;if(bF>=200&&bF<300||bF===304){if(bl.ifModified){if((bB=br.getResponseHeader("Last-Modified"))){a.lastModified[bk]=bB}if((bI=br.getResponseHeader("Etag"))){a.etag[bk]=bI}}if(bF===304){bD="notmodified";bA=true}else{try{bK=D(bl,bE);bD="success";bA=true}catch(bH){bD="parsererror";bJ=bH}}}else{bJ=bD;if(!bD||bF){bD="error";if(bF<0){bF=0}}}br.status=bF;br.statusText=bD;if(bA){by.resolveWith(bz,[bK,bD,br])}else{by.rejectWith(bz,[br,bD,bJ])}br.statusCode(bj);bj=H;if(be){bo.trigger("ajax"+(bA?"Success":"Error"),[br,bl,bA?bK:bJ])}bv.resolveWith(bz,[br,bD]);if(be){bo.trigger("ajaxComplete",[br,bl]);if(!(--a.active)){a.event.trigger("ajaxStop")}}}by.promise(br);br.success=br.done;br.error=br.fail;br.complete=bv.done;br.statusCode=function(bA){if(bA){var e;if(bi<2){for(e in bA){bj[e]=[bj[e],bA[e]]}}else{e=bA[br.status];br.then(e,e)}}return this};bl.url=((bh||bl.url)+"").replace(ba,"").replace(b,r[1]+"//");bl.dataTypes=a.trim(bl.dataType||"*").toLowerCase().split(g);if(!bl.crossDomain){bq=G.exec(bl.url.toLowerCase());bl.crossDomain=!!(bq&&(bq[1]!=r[1]||bq[2]!=r[2]||(bq[3]||(bq[1]==="http:"?80:443))!=(r[3]||(r[1]==="http:"?80:443))))}if(bl.data&&bl.processData&&typeof bl.data!=="string"){bl.data=a.param(bl.data,bl.traditional)}aI(V,bl,bf,br);if(bi===2){return false}be=bl.global;bl.type=bl.type.toUpperCase();bl.hasContent=!aD.test(bl.type);if(be&&a.active++===0){a.event.trigger("ajaxStart")}if(!bl.hasContent){if(bl.data){bl.url+=(I.test(bl.url)?"&":"?")+bl.data}bk=bl.url;if(bl.cache===false){var bd=a.now(),bw=bl.url.replace(bb,"$1_="+bd);bl.url=bw+((bw===bl.url)?(I.test(bl.url)?"&":"?")+"_="+bd:"")}}if(bl.data&&bl.hasContent&&bl.contentType!==false||bf.contentType){bp["Content-Type"]=bl.contentType}if(bl.ifModified){bk=bk||bl.url;if(a.lastModified[bk]){bp["If-Modified-Since"]=a.lastModified[bk]}if(a.etag[bk]){bp["If-None-Match"]=a.etag[bk]}}bp.Accept=bl.dataTypes[0]&&bl.accepts[bl.dataTypes[0]]?bl.accepts[bl.dataTypes[0]]+(bl.dataTypes[0]!=="*"?", */*; q=0.01":""):bl.accepts["*"];for(bs in bl.headers){br.setRequestHeader(bs,bl.headers[bs])}if(bl.beforeSend&&(bl.beforeSend.call(bz,br,bl)===false||bi===2)){br.abort();return false}for(bs in {success:1,error:1,complete:1}){br[bs](bl[bs])}bt=aI(q,bl,bf,br);if(!bt){bn(-1,"No Transport")}else{br.readyState=1;if(be){bo.trigger("ajaxSend",[br,bl])}if(bl.async&&bl.timeout>0){bm=setTimeout(function(){br.abort("timeout")},bl.timeout)}try{bi=1;bt.send(bp,bn)}catch(bu){if(status<2){bn(-1,bu)}else{a.error(bu)}}}return br},param:function(e,be){var bd=[],bg=function(bh,bi){bi=a.isFunction(bi)?bi():bi;bd[bd.length]=encodeURIComponent(bh)+"="+encodeURIComponent(bi)};if(be===H){be=a.ajaxSettings.traditional}if(a.isArray(e)||(e.jquery&&!a.isPlainObject(e))){a.each(e,function(){bg(this.name,this.value)})}else{for(var bf in e){u(bf,e[bf],be,bg)}}return bd.join("&").replace(i,"+")}});function u(be,bg,bd,bf){if(a.isArray(bg)&&bg.length){a.each(bg,function(bi,bh){if(bd||ah.test(be)){bf(be,bh)}else{u(be+"["+(typeof bh==="object"||a.isArray(bh)?bi:"")+"]",bh,bd,bf)}})}else{if(!bd&&bg!=null&&typeof bg==="object"){if(a.isArray(bg)||a.isEmptyObject(bg)){bf(be,"")}else{for(var e in bg){u(be+"["+e+"]",bg[e],bd,bf)}}}else{bf(be,bg)}}}a.extend({active:0,lastModified:{},etag:{}});function a4(bl,bk,bh){var bd=bl.contents,bj=bl.dataTypes,be=bl.responseFields,bg,bi,bf,e;for(bi in be){if(bi in bh){bk[be[bi]]=bh[bi]}}while(bj[0]==="*"){bj.shift();if(bg===H){bg=bl.mimeType||bk.getResponseHeader("content-type")}}if(bg){for(bi in bd){if(bd[bi]&&bd[bi].test(bg)){bj.unshift(bi);break}}}if(bj[0] in bh){bf=bj[0]}else{for(bi in bh){if(!bj[0]||bl.converters[bi+" "+bj[0]]){bf=bi;break}if(!e){e=bi}}bf=bf||e}if(bf){if(bf!==bj[0]){bj.unshift(bf)}return bh[bf]}}function D(bp,bh){if(bp.dataFilter){bh=bp.dataFilter(bh,bp.dataType)}var bl=bp.dataTypes,bo={},bi,bm,be=bl.length,bj,bk=bl[0],bf,bg,bn,bd,e;for(bi=1;bi<be;bi++){if(bi===1){for(bm in bp.converters){if(typeof bm==="string"){bo[bm.toLowerCase()]=bp.converters[bm]}}}bf=bk;bk=bl[bi];if(bk==="*"){bk=bf}else{if(bf!=="*"&&bf!==bk){bg=bf+" "+bk;bn=bo[bg]||bo["* "+bk];if(!bn){e=H;for(bd in bo){bj=bd.split(" ");if(bj[0]===bf||bj[0]==="*"){e=bo[bj[1]+" "+bk];if(e){bd=bo[bd];if(bd===true){bn=e}else{if(e===true){bn=bd}}break}}}}if(!(bn||e)){a.error("No conversion from "+bg.replace(" "," to "))}if(bn!==true){bh=bn?bn(bh):e(bd(bh))}}}}return bh}var aq=a.now(),t=/(\=)\?(&|$)|()\?\?()/i;a.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return a.expando+"_"+(aq++)}});a.ajaxPrefilter("json jsonp",function(bm,bi,bl){var bk=(typeof bm.data==="string");if(bm.dataTypes[0]==="jsonp"||bi.jsonpCallback||bi.jsonp!=null||bm.jsonp!==false&&(t.test(bm.url)||bk&&t.test(bm.data))){var bj,be=bm.jsonpCallback=a.isFunction(bm.jsonpCallback)?bm.jsonpCallback():bm.jsonpCallback,bh=aY[be],e=bm.url,bg=bm.data,bd="$1"+be+"$2",bf=function(){aY[be]=bh;if(bj&&a.isFunction(bh)){aY[be](bj[0])}};if(bm.jsonp!==false){e=e.replace(t,bd);if(bm.url===e){if(bk){bg=bg.replace(t,bd)}if(bm.data===bg){e+=(/\?/.test(e)?"&":"?")+bm.jsonp+"="+be}}}bm.url=e;bm.data=bg;aY[be]=function(bn){bj=[bn]};bl.then(bf,bf);bm.converters["script json"]=function(){if(!bj){a.error(be+" was not called")}return bj[0]};bm.dataTypes[0]="json";return"script"}});a.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){a.globalEval(e);return e}}});a.ajaxPrefilter("script",function(e){if(e.cache===H){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});a.ajaxTransport("script",function(be){if(be.crossDomain){var e,bd=al.head||al.getElementsByTagName("head")[0]||al.documentElement;return{send:function(bf,bg){e=al.createElement("script");e.async="async";if(be.scriptCharset){e.charset=be.scriptCharset}e.src=be.url;e.onload=e.onreadystatechange=function(bi,bh){if(!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bd&&e.parentNode){bd.removeChild(e)}e=H;if(!bh){bg(200,"success")}}};bd.insertBefore(e,bd.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var x=a.now(),J,at;function A(){a(aY).unload(function(){for(var e in J){J[e](0,1)}})}function aA(){try{return new aY.XMLHttpRequest()}catch(bd){}}function ad(){try{return new aY.ActiveXObject("Microsoft.XMLHTTP")}catch(bd){}}a.ajaxSettings.xhr=aY.ActiveXObject?function(){return !this.isLocal&&aA()||ad()}:aA;at=a.ajaxSettings.xhr();a.support.ajax=!!at;a.support.cors=at&&("withCredentials" in at);at=H;if(a.support.ajax){a.ajaxTransport(function(e){if(!e.crossDomain||a.support.cors){var bd;return{send:function(bj,be){var bi=e.xhr(),bh,bg;if(e.username){bi.open(e.type,e.url,e.async,e.username,e.password)}else{bi.open(e.type,e.url,e.async)}if(e.xhrFields){for(bg in e.xhrFields){bi[bg]=e.xhrFields[bg]}}if(e.mimeType&&bi.overrideMimeType){bi.overrideMimeType(e.mimeType)}if(!(e.crossDomain&&!e.hasContent)&&!bj["X-Requested-With"]){bj["X-Requested-With"]="XMLHttpRequest"}try{for(bg in bj){bi.setRequestHeader(bg,bj[bg])}}catch(bf){}bi.send((e.hasContent&&e.data)||null);bd=function(bs,bm){var bn,bl,bk,bq,bp;try{if(bd&&(bm||bi.readyState===4)){bd=H;if(bh){bi.onreadystatechange=a.noop;delete J[bh]}if(bm){if(bi.readyState!==4){bi.abort()}}else{bn=bi.status;bk=bi.getAllResponseHeaders();bq={};bp=bi.responseXML;if(bp&&bp.documentElement){bq.xml=bp}bq.text=bi.responseText;try{bl=bi.statusText}catch(br){bl=""}if(!bn&&e.isLocal&&!e.crossDomain){bn=bq.text?200:404}else{if(bn===1223){bn=204}}}}}catch(bo){if(!bm){be(-1,bo)}}if(bq){be(bn,bl,bq,bk)}};if(!e.async||bi.readyState===4){bd()}else{if(!J){J={};A()}bh=x++;bi.onreadystatechange=J[bh]=bd}},abort:function(){if(bd){bd(0,1)}}}}})}var N={},ap=/^(?:toggle|show|hide)$/,aF=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,aS,ax=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];a.fn.extend({show:function(bf,bi,bh){var be,bg;if(bf||bf===0){return this.animate(aQ("show",3),bf,bi,bh)}else{for(var bd=0,e=this.length;bd<e;bd++){be=this[bd];bg=be.style.display;if(!a._data(be,"olddisplay")&&bg==="none"){bg=be.style.display=""}if(bg===""&&a.css(be,"display")==="none"){a._data(be,"olddisplay",w(be.nodeName))}}for(bd=0;bd<e;bd++){be=this[bd];bg=be.style.display;if(bg===""||bg==="none"){be.style.display=a._data(be,"olddisplay")||""}}return this}},hide:function(be,bh,bg){if(be||be===0){return this.animate(aQ("hide",3),be,bh,bg)}else{for(var bd=0,e=this.length;bd<e;bd++){var bf=a.css(this[bd],"display");if(bf!=="none"&&!a._data(this[bd],"olddisplay")){a._data(this[bd],"olddisplay",bf)}}for(bd=0;bd<e;bd++){this[bd].style.display="none"}return this}},_toggle:a.fn.toggle,toggle:function(be,bd,bf){var e=typeof be==="boolean";if(a.isFunction(be)&&a.isFunction(bd)){this._toggle.apply(this,arguments)}else{if(be==null||e){this.each(function(){var bg=e?be:a(this).is(":hidden");a(this)[bg?"show":"hide"]()})}else{this.animate(aQ("toggle",3),be,bd,bf)}}return this},fadeTo:function(e,bf,be,bd){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bf},e,be,bd)},animate:function(bg,bd,bf,be){var e=a.speed(bd,bf,be);if(a.isEmptyObject(bg)){return this.each(e.complete)}return this[e.queue===false?"each":"queue"](function(){var bj=a.extend({},e),bn,bk=this.nodeType===1,bl=bk&&a(this).is(":hidden"),bh=this;for(bn in bg){var bi=a.camelCase(bn);if(bn!==bi){bg[bi]=bg[bn];delete bg[bn];bn=bi}if(bg[bn]==="hide"&&bl||bg[bn]==="show"&&!bl){return bj.complete.call(this)}if(bk&&(bn==="height"||bn==="width")){bj.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(a.css(this,"display")==="inline"&&a.css(this,"float")==="none"){if(!a.support.inlineBlockNeedsLayout){this.style.display="inline-block"}else{var bm=w(this.nodeName);if(bm==="inline"){this.style.display="inline-block"}else{this.style.display="inline";this.style.zoom=1}}}}if(a.isArray(bg[bn])){(bj.specialEasing=bj.specialEasing||{})[bn]=bg[bn][1];bg[bn]=bg[bn][0]}}if(bj.overflow!=null){this.style.overflow="hidden"}bj.curAnim=a.extend({},bg);a.each(bg,function(bp,bt){var bs=new a.fx(bh,bj,bp);if(ap.test(bt)){bs[bt==="toggle"?bl?"show":"hide":bt](bg)}else{var br=aF.exec(bt),bu=bs.cur();if(br){var bo=parseFloat(br[2]),bq=br[3]||(a.cssNumber[bp]?"":"px");if(bq!=="px"){a.style(bh,bp,(bo||1)+bq);bu=((bo||1)/bs.cur())*bu;a.style(bh,bp,bu+bq)}if(br[1]){bo=((br[1]==="-="?-1:1)*bo)+bu}bs.custom(bu,bo,bq)}else{bs.custom(bu,bt,"")}}});return true})},stop:function(bd,e){var be=a.timers;if(bd){this.queue([])}this.each(function(){for(var bf=be.length-1;bf>=0;bf--){if(be[bf].elem===this){if(e){be[bf](true)}be.splice(bf,1)}}});if(!e){this.dequeue()}return this}});function aQ(bd,e){var be={};a.each(ax.concat.apply([],ax.slice(0,e)),function(){be[this]=bd});return be}a.each({slideDown:aQ("show",1),slideUp:aQ("hide",1),slideToggle:aQ("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bd){a.fn[e]=function(be,bg,bf){return this.animate(bd,be,bg,bf)}});a.extend({speed:function(be,bf,bd){var e=be&&typeof be==="object"?a.extend({},be):{complete:bd||!bd&&bf||a.isFunction(be)&&be,duration:be,easing:bd&&bf||bf&&!a.isFunction(bf)&&bf};e.duration=a.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in a.fx.speeds?a.fx.speeds[e.duration]:a.fx.speeds._default;e.old=e.complete;e.complete=function(){if(e.queue!==false){a(this).dequeue()}if(a.isFunction(e.old)){e.old.call(this)}};return e},easing:{linear:function(be,bf,e,bd){return e+bd*be},swing:function(be,bf,e,bd){return((-Math.cos(be*Math.PI)/2)+0.5)*bd+e}},timers:[],fx:function(bd,e,be){this.options=e;this.elem=bd;this.prop=be;if(!e.orig){e.orig={}}}});a.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(a.fx.step[this.prop]||a.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bd=a.css(this.elem,this.prop);return isNaN(e=parseFloat(bd))?!bd||bd==="auto"?0:bd:e},custom:function(bh,bg,bf){var e=this,be=a.fx;this.startTime=a.now();this.start=bh;this.end=bg;this.unit=bf||this.unit||(a.cssNumber[this.prop]?"":"px");this.now=this.start;this.pos=this.state=0;function bd(bi){return e.step(bi)}bd.elem=this.elem;if(bd()&&a.timers.push(bd)&&!aS){aS=setInterval(be.tick,be.interval)}},show:function(){this.options.orig[this.prop]=a.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());a(this.elem).show()},hide:function(){this.options.orig[this.prop]=a.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(bf){var bk=a.now(),bg=true;if(bf||bk>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var bh in this.options.curAnim){if(this.options.curAnim[bh]!==true){bg=false}}if(bg){if(this.options.overflow!=null&&!a.support.shrinkWrapBlocks){var be=this.elem,bl=this.options;a.each(["","X","Y"],function(bm,bn){be.style["overflow"+bn]=bl.overflow[bm]})}if(this.options.hide){a(this.elem).hide()}if(this.options.hide||this.options.show){for(var e in this.options.curAnim){a.style(this.elem,e,this.options.orig[e])}}this.options.complete.call(this.elem)}return false}else{var bd=bk-this.startTime;this.state=bd/this.options.duration;var bi=this.options.specialEasing&&this.options.specialEasing[this.prop];var bj=this.options.easing||(a.easing.swing?"swing":"linear");this.pos=a.easing[bi||bj](this.state,bd,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};a.extend(a.fx,{tick:function(){var bd=a.timers;for(var e=0;e<bd.length;e++){if(!bd[e]()){bd.splice(e--,1)}}if(!bd.length){a.fx.stop()}},interval:13,stop:function(){clearInterval(aS);aS=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){a.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=(e.prop==="width"||e.prop==="height"?Math.max(0,e.now):e.now)+e.unit}else{e.elem[e.prop]=e.now}}}});if(a.expr&&a.expr.filters){a.expr.filters.animated=function(e){return a.grep(a.timers,function(bd){return e===bd.elem}).length}}function w(be){if(!N[be]){var e=a("<"+be+">").appendTo("body"),bd=e.css("display");e.remove();if(bd==="none"||bd===""){bd="block"}N[be]=bd}return N[be]}var S=/^t(?:able|d|h)$/i,Y=/^(?:body|html)$/i;if("getBoundingClientRect" in al.documentElement){a.fn.offset=function(bq){var bg=this[0],bj;if(bq){return this.each(function(e){a.offset.setOffset(this,bq,e)})}if(!bg||!bg.ownerDocument){return null}if(bg===bg.ownerDocument.body){return a.offset.bodyOffset(bg)}try{bj=bg.getBoundingClientRect()}catch(bn){}var bp=bg.ownerDocument,be=bp.documentElement;if(!bj||!a.contains(be,bg)){return bj?{top:bj.top,left:bj.left}:{top:0,left:0}}var bk=bp.body,bl=az(bp),bi=be.clientTop||bk.clientTop||0,bm=be.clientLeft||bk.clientLeft||0,bd=(bl.pageYOffset||a.support.boxModel&&be.scrollTop||bk.scrollTop),bh=(bl.pageXOffset||a.support.boxModel&&be.scrollLeft||bk.scrollLeft),bo=bj.top+bd-bi,bf=bj.left+bh-bm;return{top:bo,left:bf}}}else{a.fn.offset=function(bn){var bh=this[0];if(bn){return this.each(function(bo){a.offset.setOffset(this,bn,bo)})}if(!bh||!bh.ownerDocument){return null}if(bh===bh.ownerDocument.body){return a.offset.bodyOffset(bh)}a.offset.initialize();var bk,be=bh.offsetParent,bd=bh,bm=bh.ownerDocument,bf=bm.documentElement,bi=bm.body,bj=bm.defaultView,e=bj?bj.getComputedStyle(bh,null):bh.currentStyle,bl=bh.offsetTop,bg=bh.offsetLeft;while((bh=bh.parentNode)&&bh!==bi&&bh!==bf){if(a.offset.supportsFixedPosition&&e.position==="fixed"){break}bk=bj?bj.getComputedStyle(bh,null):bh.currentStyle;bl-=bh.scrollTop;bg-=bh.scrollLeft;if(bh===be){bl+=bh.offsetTop;bg+=bh.offsetLeft;if(a.offset.doesNotAddBorder&&!(a.offset.doesAddBorderForTableAndCells&&S.test(bh.nodeName))){bl+=parseFloat(bk.borderTopWidth)||0;bg+=parseFloat(bk.borderLeftWidth)||0}bd=be;be=bh.offsetParent}if(a.offset.subtractsBorderForOverflowNotVisible&&bk.overflow!=="visible"){bl+=parseFloat(bk.borderTopWidth)||0;bg+=parseFloat(bk.borderLeftWidth)||0}e=bk}if(e.position==="relative"||e.position==="static"){bl+=bi.offsetTop;bg+=bi.offsetLeft}if(a.offset.supportsFixedPosition&&e.position==="fixed"){bl+=Math.max(bf.scrollTop,bi.scrollTop);bg+=Math.max(bf.scrollLeft,bi.scrollLeft)}return{top:bl,left:bg}}}a.offset={initialize:function(){var e=al.body,bd=al.createElement("div"),bg,bi,bh,bj,be=parseFloat(a.css(e,"marginTop"))||0,bf="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.extend(bd.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});bd.innerHTML=bf;e.insertBefore(bd,e.firstChild);bg=bd.firstChild;bi=bg.firstChild;bj=bg.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(bi.offsetTop!==5);this.doesAddBorderForTableAndCells=(bj.offsetTop===5);bi.style.position="fixed";bi.style.top="20px";this.supportsFixedPosition=(bi.offsetTop===20||bi.offsetTop===15);bi.style.position=bi.style.top="";bg.style.overflow="hidden";bg.style.position="relative";this.subtractsBorderForOverflowNotVisible=(bi.offsetTop===-5);this.doesNotIncludeMarginInBodyOffset=(e.offsetTop!==be);e.removeChild(bd);e=bd=bg=bi=bh=bj=null;a.offset.initialize=a.noop},bodyOffset:function(e){var be=e.offsetTop,bd=e.offsetLeft;a.offset.initialize();if(a.offset.doesNotIncludeMarginInBodyOffset){be+=parseFloat(a.css(e,"marginTop"))||0;bd+=parseFloat(a.css(e,"marginLeft"))||0}return{top:be,left:bd}},setOffset:function(bf,bo,bi){var bj=a.css(bf,"position");if(bj==="static"){bf.style.position="relative"}var bh=a(bf),bd=bh.offset(),e=a.css(bf,"top"),bm=a.css(bf,"left"),bn=(bj==="absolute"&&a.inArray("auto",[e,bm])>-1),bl={},bk={},be,bg;if(bn){bk=bh.position()}be=bn?bk.top:parseInt(e,10)||0;bg=bn?bk.left:parseInt(bm,10)||0;if(a.isFunction(bo)){bo=bo.call(bf,bi,bd)}if(bo.top!=null){bl.top=(bo.top-bd.top)+be}if(bo.left!=null){bl.left=(bo.left-bd.left)+bg}if("using" in bo){bo.using.call(bf,bl)}else{bh.css(bl)}}};a.fn.extend({position:function(){if(!this[0]){return null}var be=this[0],bd=this.offsetParent(),bf=this.offset(),e=Y.test(bd[0].nodeName)?{top:0,left:0}:bd.offset();bf.top-=parseFloat(a.css(be,"marginTop"))||0;bf.left-=parseFloat(a.css(be,"marginLeft"))||0;e.top+=parseFloat(a.css(bd[0],"borderTopWidth"))||0;e.left+=parseFloat(a.css(bd[0],"borderLeftWidth"))||0;return{top:bf.top-e.top,left:bf.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||al.body;while(e&&(!Y.test(e.nodeName)&&a.css(e,"position")==="static")){e=e.offsetParent}return e})}});a.each(["Left","Top"],function(bd,e){var be="scroll"+e;a.fn[be]=function(bh){var bf=this[0],bg;if(!bf){return null}if(bh!==H){return this.each(function(){bg=az(this);if(bg){bg.scrollTo(!bd?bh:a(bg).scrollLeft(),bd?bh:a(bg).scrollTop())}else{this[be]=bh}})}else{bg=az(bf);return bg?("pageXOffset" in bg)?bg[bd?"pageYOffset":"pageXOffset"]:a.support.boxModel&&bg.document.documentElement[be]||bg.document.body[be]:bf[be]}}});function az(e){return a.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}a.each(["Height","Width"],function(bd,e){var be=e.toLowerCase();a.fn["inner"+e]=function(){return this[0]?parseFloat(a.css(this[0],be,"padding")):null};a.fn["outer"+e]=function(bf){return this[0]?parseFloat(a.css(this[0],be,bf?"margin":"border")):null};a.fn[be]=function(bg){var bh=this[0];if(!bh){return bg==null?null:this}if(a.isFunction(bg)){return this.each(function(bl){var bk=a(this);bk[be](bg.call(this,bl,bk[be]()))})}if(a.isWindow(bh)){var bi=bh.document.documentElement["client"+e];return bh.document.compatMode==="CSS1Compat"&&bi||bh.document.body["client"+e]||bi}else{if(bh.nodeType===9){return Math.max(bh.documentElement["client"+e],bh.body["scroll"+e],bh.documentElement["scroll"+e],bh.body["offset"+e],bh.documentElement["offset"+e])}else{if(bg===H){var bj=a.css(bh,be),bf=parseFloat(bj);return a.isNaN(bf)?bj:bf}else{return this.css(be,typeof bg==="string"?bg:bg+"px")}}}}});aY.jQuery=aY.$=a})(window); \ No newline at end of file
diff --git a/chromium/third_party/guava/guava.gyp b/chromium/third_party/guava/guava.gyp
index e300460271f..bfe2a30fe86 100644
--- a/chromium/third_party/guava/guava.gyp
+++ b/chromium/third_party/guava/guava.gyp
@@ -9,8 +9,6 @@
'type': 'none',
'variables': {
'java_in_dir': 'src/guava',
- 'proguard_preprocess': 1,
- 'proguard_config': 'proguard.flags',
},
'dependencies': [
'../../third_party/jsr-305/jsr-305.gyp:jsr_305_javalib',
diff --git a/chromium/third_party/guava/proguard.flags b/chromium/third_party/guava/proguard.flags
deleted file mode 100644
index 015d703a305..00000000000
--- a/chromium/third_party/guava/proguard.flags
+++ /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.
-
--keep class com.google.common.base.** {
- *;
-}
-
--keep class com.google.common.annotations.** {
- *;
-}
-
--keep class com.google.common.collect.** {
- *;
-}
-
--keepattributes Signature
-
-# Don't complain about usage of sun.misc.Unsafe. Guava imports this,
-# but does not use it unless it exists.
-# The gyp-target that uses this is guava.gyp:guava_javalib.
--dontwarn sun.misc.Unsafe
-# Striped64 uses reflection to access some local fields.
--dontnote com.google.common.cache.Striped64
--dontnote com.google.common.cache.Striped64$Cell
-
-# Keep all enum values and valueOf methods. See
-# http://proguard.sourceforge.net/index.html#manual/examples.html
-# for the reason for this. Also, see http://crbug.com/248037.
--keepclassmembers enum * {
- public static **[] values();
- public static ** valueOf(java.lang.String);
-}
diff --git a/chromium/third_party/libusb/README.chromium b/chromium/third_party/libusb/README.chromium
index b0e8ada6ad1..348d919814a 100644
--- a/chromium/third_party/libusb/README.chromium
+++ b/chromium/third_party/libusb/README.chromium
@@ -15,3 +15,4 @@ Local Modifications:
- Exposing an API (libusb_interrupt_handle_event) to explicitly interrupt
libusb_handle_event.
- windows-build.patch has been applied.
+- darwin-sigfpe.patch has been applied.
diff --git a/chromium/third_party/libusb/darwin-sigfpe.patch b/chromium/third_party/libusb/darwin-sigfpe.patch
new file mode 100644
index 00000000000..3c74db18570
--- /dev/null
+++ b/chromium/third_party/libusb/darwin-sigfpe.patch
@@ -0,0 +1,22 @@
+diff --git a/libusb/os/darwin_usb.c b/libusb/os/darwin_usb.c
+index b0ee5b2..fe40899 100644
+--- a/libusb/os/darwin_usb.c
++++ b/libusb/os/darwin_usb.c
+@@ -1449,8 +1449,14 @@ static int submit_bulk_transfer(struct usbi_transfer *itransfer) {
+
+ cInterface = &priv->interfaces[iface];
+
+- (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number,
+- &transferType, &maxPacketSize, &interval);
++ ret = (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number,
++ &transferType, &maxPacketSize, &interval);
++
++ if (ret) {
++ usbi_err (TRANSFER_CTX (transfer), "bulk transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out",
++ darwin_error_str(ret), ret);
++ return darwin_to_libusb (ret);
++ }
+
+ if (0 != (transfer->length % maxPacketSize)) {
+ /* do not need a zero packet */
+
diff --git a/chromium/third_party/libusb/src/libusb/os/darwin_usb.c b/chromium/third_party/libusb/src/libusb/os/darwin_usb.c
index a24558cb593..3f315e84be6 100644
--- a/chromium/third_party/libusb/src/libusb/os/darwin_usb.c
+++ b/chromium/third_party/libusb/src/libusb/os/darwin_usb.c
@@ -1448,8 +1448,14 @@ static int submit_bulk_transfer(struct usbi_transfer *itransfer) {
cInterface = &priv->interfaces[iface];
- (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number,
- &transferType, &maxPacketSize, &interval);
+ ret = (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number,
+ &transferType, &maxPacketSize, &interval);
+
+ if (ret) {
+ usbi_err (TRANSFER_CTX (transfer), "bulk transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out",
+ darwin_error_str(ret), ret);
+ return darwin_to_libusb (ret);
+ }
if (0 != (transfer->length % maxPacketSize)) {
/* do not need a zero packet */
diff --git a/chromium/third_party/libxml/chromium/libxml_utils.h b/chromium/third_party/libxml/chromium/libxml_utils.h
index 80d05f67d8d..d230c5d9b23 100644
--- a/chromium/third_party/libxml/chromium/libxml_utils.h
+++ b/chromium/third_party/libxml/chromium/libxml_utils.h
@@ -133,12 +133,6 @@ class XmlWriter {
return xmlTextWriterEndElement(writer_) >= 0;
}
- // Appends to the content of the current open element.
- bool AppendElementContent(const std::string& content) {
- return xmlTextWriterWriteString(writer_,
- BAD_CAST content.c_str()) >= 0;
- }
-
// Adds an attribute to the current open element. Returns false on error.
bool AddAttribute(const std::string& attribute_name,
const std::string& attribute_value) {
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_access.so b/chromium/third_party/lighttpd/mac/lib/mod_access.so
new file mode 100755
index 00000000000..d09acb9331e
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_access.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_accesslog.so b/chromium/third_party/lighttpd/mac/lib/mod_accesslog.so
new file mode 100755
index 00000000000..7d035d88d58
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_accesslog.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_alias.so b/chromium/third_party/lighttpd/mac/lib/mod_alias.so
new file mode 100755
index 00000000000..af17ad09379
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_alias.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_auth.so b/chromium/third_party/lighttpd/mac/lib/mod_auth.so
new file mode 100755
index 00000000000..46c23a4263d
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_auth.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_cgi.so b/chromium/third_party/lighttpd/mac/lib/mod_cgi.so
new file mode 100755
index 00000000000..cd20b6d9d79
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_cgi.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_cml.so b/chromium/third_party/lighttpd/mac/lib/mod_cml.so
new file mode 100755
index 00000000000..b0e6bbec1e1
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_cml.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_compress.so b/chromium/third_party/lighttpd/mac/lib/mod_compress.so
new file mode 100755
index 00000000000..b68aa5a0544
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_compress.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_dirlisting.so b/chromium/third_party/lighttpd/mac/lib/mod_dirlisting.so
new file mode 100755
index 00000000000..439a1068a47
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_dirlisting.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_evasive.so b/chromium/third_party/lighttpd/mac/lib/mod_evasive.so
new file mode 100755
index 00000000000..35fda5748a8
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_evasive.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_evhost.so b/chromium/third_party/lighttpd/mac/lib/mod_evhost.so
new file mode 100755
index 00000000000..c44f3342fa8
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_evhost.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_expire.so b/chromium/third_party/lighttpd/mac/lib/mod_expire.so
new file mode 100755
index 00000000000..e27d4c0d458
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_expire.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_extforward.so b/chromium/third_party/lighttpd/mac/lib/mod_extforward.so
new file mode 100755
index 00000000000..dca4598d60c
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_extforward.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_fastcgi.so b/chromium/third_party/lighttpd/mac/lib/mod_fastcgi.so
new file mode 100755
index 00000000000..617b3f5a727
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_fastcgi.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_flv_streaming.so b/chromium/third_party/lighttpd/mac/lib/mod_flv_streaming.so
new file mode 100755
index 00000000000..e9803cc7c57
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_flv_streaming.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_indexfile.so b/chromium/third_party/lighttpd/mac/lib/mod_indexfile.so
new file mode 100755
index 00000000000..5f0b7b83edb
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_indexfile.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_magnet.so b/chromium/third_party/lighttpd/mac/lib/mod_magnet.so
new file mode 100755
index 00000000000..194337fe2b3
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_magnet.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_mysql_vhost.so b/chromium/third_party/lighttpd/mac/lib/mod_mysql_vhost.so
new file mode 100755
index 00000000000..673d158f1ca
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_mysql_vhost.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_proxy.so b/chromium/third_party/lighttpd/mac/lib/mod_proxy.so
new file mode 100755
index 00000000000..6fa369fb567
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_proxy.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_redirect.so b/chromium/third_party/lighttpd/mac/lib/mod_redirect.so
new file mode 100755
index 00000000000..a2d4d7ad90a
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_redirect.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_rewrite.so b/chromium/third_party/lighttpd/mac/lib/mod_rewrite.so
new file mode 100755
index 00000000000..60b855459e0
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_rewrite.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_rrdtool.so b/chromium/third_party/lighttpd/mac/lib/mod_rrdtool.so
new file mode 100755
index 00000000000..c05cada52c1
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_rrdtool.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_scgi.so b/chromium/third_party/lighttpd/mac/lib/mod_scgi.so
new file mode 100755
index 00000000000..78fb25b8c4b
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_scgi.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_secdownload.so b/chromium/third_party/lighttpd/mac/lib/mod_secdownload.so
new file mode 100755
index 00000000000..c8fb1afc983
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_secdownload.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_setenv.so b/chromium/third_party/lighttpd/mac/lib/mod_setenv.so
new file mode 100755
index 00000000000..c7421b1d5a7
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_setenv.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_simple_vhost.so b/chromium/third_party/lighttpd/mac/lib/mod_simple_vhost.so
new file mode 100755
index 00000000000..82400689e51
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_simple_vhost.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_ssi.so b/chromium/third_party/lighttpd/mac/lib/mod_ssi.so
new file mode 100755
index 00000000000..be52e10f664
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_ssi.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_staticfile.so b/chromium/third_party/lighttpd/mac/lib/mod_staticfile.so
new file mode 100755
index 00000000000..8f9d612c85d
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_staticfile.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_status.so b/chromium/third_party/lighttpd/mac/lib/mod_status.so
new file mode 100755
index 00000000000..4697030e536
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_status.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_trigger_b4_dl.so b/chromium/third_party/lighttpd/mac/lib/mod_trigger_b4_dl.so
new file mode 100755
index 00000000000..cc2f3957024
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_trigger_b4_dl.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_userdir.so b/chromium/third_party/lighttpd/mac/lib/mod_userdir.so
new file mode 100755
index 00000000000..4a6b3b72ad5
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_userdir.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_usertrack.so b/chromium/third_party/lighttpd/mac/lib/mod_usertrack.so
new file mode 100755
index 00000000000..df27e63f186
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_usertrack.so
Binary files differ
diff --git a/chromium/third_party/lighttpd/mac/lib/mod_webdav.so b/chromium/third_party/lighttpd/mac/lib/mod_webdav.so
new file mode 100755
index 00000000000..57a373ef0ba
--- /dev/null
+++ b/chromium/third_party/lighttpd/mac/lib/mod_webdav.so
Binary files differ
diff --git a/chromium/third_party/protobuf/README.chromium b/chromium/third_party/protobuf/README.chromium
index 50c39c02c72..c8e411f030f 100644
--- a/chromium/third_party/protobuf/README.chromium
+++ b/chromium/third_party/protobuf/README.chromium
@@ -4,7 +4,7 @@ URL: http://protobuf.googlecode.com/svn/trunk
License: BSD
License File: COPYING.txt
Version: unknown
-Revision: r476
+Revision: r428
Security Critical: yes
Local files (not taken from upstream):
@@ -26,7 +26,7 @@ This code has been patched to make the target protobuf_lite a component so that
targets that depend on it can be componentized. See http://crbug.com/172800 for
details, and r179806 for the patch.
-Revision 504 was cherry-picked from upstream.
+Revisions r430, r475, r476 and 504 were cherry-picked from upstream.
Notes about Java:
We have not forked the Java version of protobuf-lite, so the Java version does
diff --git a/chromium/third_party/protobuf/README.txt b/chromium/third_party/protobuf/README.txt
index 17551a5a0cb..a8f66044829 100644
--- a/chromium/third_party/protobuf/README.txt
+++ b/chromium/third_party/protobuf/README.txt
@@ -115,7 +115,7 @@ For advanced usage information on configure and make, see INSTALL.txt.
C++ Installation - Windows
==========================
-If you are using Microsoft Visual C++, see vsprojects/readme.txt.
+If you are using Micosoft Visual C++, see vsprojects/readme.txt.
If you are using Cygwin or MinGW, follow the Unix installation
instructions, above.
diff --git a/chromium/third_party/protobuf/java/pom.xml b/chromium/third_party/protobuf/java/pom.xml
index 9f464c140a3..7ec6d918a4b 100644
--- a/chromium/third_party/protobuf/java/pom.xml
+++ b/chromium/third_party/protobuf/java/pom.xml
@@ -10,8 +10,8 @@
</parent>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
- <version>2.5.0-pre</version>
- <packaging>bundle</packaging>
+ <version>2.4.2-pre</version>
+ <packaging>jar</packaging>
<name>Protocol Buffer Java API</name>
<description>
Protocol Buffers are a way of encoding structured data in an efficient yet
@@ -132,16 +132,6 @@
</execution>
</executions>
</plugin>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Export-Package>*</Export-Package>
- </instructions>
- </configuration>
- </plugin>
</plugins>
</build>
<profiles>
diff --git a/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/ByteString.java b/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/ByteString.java
index 73d831f6eec..1b18169e9e1 100644
--- a/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/ByteString.java
+++ b/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/ByteString.java
@@ -37,6 +37,7 @@ import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
@@ -775,15 +776,6 @@ public abstract class ByteString implements Iterable<Byte> {
flushLastBuffer();
return ByteString.copyFrom(flushedBuffers);
}
-
- /**
- * Implement java.util.Arrays.copyOf() for jdk 1.5.
- */
- private byte[] copyArray(byte[] buffer, int length) {
- byte[] result = new byte[length];
- System.arraycopy(buffer, 0, result, 0, Math.min(buffer.length, length));
- return result;
- }
/**
* Writes the complete contents of this byte array output stream to
@@ -808,7 +800,7 @@ public abstract class ByteString implements Iterable<Byte> {
byteString.writeTo(out);
}
- out.write(copyArray(cachedBuffer, cachedBufferPos));
+ out.write(Arrays.copyOf(cachedBuffer, cachedBufferPos));
}
/**
@@ -861,7 +853,7 @@ public abstract class ByteString implements Iterable<Byte> {
private void flushLastBuffer() {
if (bufferPos < buffer.length) {
if (bufferPos > 0) {
- byte[] bufferCopy = copyArray(buffer, bufferPos);
+ byte[] bufferCopy = Arrays.copyOf(buffer, bufferPos);
flushedBuffers.add(new LiteralByteString(bufferCopy));
}
// We reuse this buffer for further writes.
diff --git a/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/LazyField.java b/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/LazyField.java
index c4f9201cdc2..df9425eb360 100644
--- a/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/LazyField.java
+++ b/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/LazyField.java
@@ -157,10 +157,12 @@ class LazyField {
this.entry = entry;
}
+ @Override
public K getKey() {
return entry.getKey();
}
+ @Override
public Object getValue() {
LazyField field = entry.getValue();
if (field == null) {
@@ -173,6 +175,7 @@ class LazyField {
return entry.getValue();
}
+ @Override
public Object setValue(Object value) {
if (!(value instanceof MessageLite)) {
throw new IllegalArgumentException(
@@ -190,11 +193,13 @@ class LazyField {
this.iterator = iterator;
}
+ @Override
public boolean hasNext() {
return iterator.hasNext();
}
@SuppressWarnings("unchecked")
+ @Override
public Entry<K, Object> next() {
Entry<K, ?> entry = iterator.next();
if (entry.getValue() instanceof LazyField) {
@@ -203,6 +208,7 @@ class LazyField {
return (Entry<K, Object>) entry;
}
+ @Override
public void remove() {
iterator.remove();
}
diff --git a/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java b/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java
index a5f0bd901fd..75c6a4b73d3 100644
--- a/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java
+++ b/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java
@@ -172,6 +172,7 @@ public class LazyStringArrayList extends AbstractList<String>
}
}
+ @Override
public List<?> getUnderlyingElements() {
return Collections.unmodifiableList(list);
}
diff --git a/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java b/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java
index 46997823469..8d44d117723 100644
--- a/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java
+++ b/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java
@@ -36,12 +36,13 @@ import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.io.ByteArrayInputStream;
import java.nio.ByteBuffer;
+import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Deque;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
-import java.util.Stack;
/**
* Class to represent {@code ByteStrings} formed by concatenation of other
@@ -589,7 +590,8 @@ class RopeByteString extends ByteString {
// Stack containing the part of the string, starting from the left, that
// we've already traversed. The final string should be the equivalent of
// concatenating the strings on the stack from bottom to top.
- private final Stack<ByteString> prefixesStack = new Stack<ByteString>();
+ private final Deque<ByteString> prefixesStack =
+ new ArrayDeque<ByteString>(minLengthByDepth.length);
private ByteString balance(ByteString left, ByteString right) {
doBalance(left);
@@ -701,8 +703,8 @@ class RopeByteString extends ByteString {
*/
private static class PieceIterator implements Iterator<LiteralByteString> {
- private final Stack<RopeByteString> breadCrumbs =
- new Stack<RopeByteString>();
+ private final Deque<RopeByteString> breadCrumbs =
+ new ArrayDeque<RopeByteString>(minLengthByDepth.length);
private LiteralByteString next;
private PieceIterator(ByteString root) {
diff --git a/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java b/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java
index 591bca54091..f80f09680bb 100644
--- a/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java
+++ b/chromium/third_party/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java
@@ -145,6 +145,7 @@ public class UnmodifiableLazyStringList extends AbstractList<String>
};
}
+ @Override
public List<?> getUnderlyingElements() {
// The returned value is already unmodifiable.
return list.getUnderlyingElements();
diff --git a/chromium/third_party/protobuf/protobuf_lite.gypi b/chromium/third_party/protobuf/protobuf_lite.gypi
index bbdc072715d..e66d29f758b 100644
--- a/chromium/third_party/protobuf/protobuf_lite.gypi
+++ b/chromium/third_party/protobuf/protobuf_lite.gypi
@@ -32,6 +32,7 @@
'src/google/protobuf/stubs/once.cc',
'src/google/protobuf/stubs/hash.h',
'src/google/protobuf/stubs/map-util.h',
+ 'src/google/protobuf/stubs/stl_util-inl.h',
'src/google/protobuf/extension_set.cc',
'src/google/protobuf/generated_message_util.cc',
'src/google/protobuf/message_lite.cc',
diff --git a/chromium/third_party/protobuf/python/google/protobuf/pyext/python-proto2.cc b/chromium/third_party/protobuf/python/google/protobuf/pyext/python-proto2.cc
index eebb752b780..627534135d8 100644
--- a/chromium/third_party/protobuf/python/google/protobuf/pyext/python-proto2.cc
+++ b/chromium/third_party/protobuf/python/google/protobuf/pyext/python-proto2.cc
@@ -427,6 +427,9 @@ static bool CheckAndSetString(
GOOGLE_DCHECK(descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING ||
descriptor->type() == google::protobuf::FieldDescriptor::TYPE_BYTES);
if (descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING) {
+#else
+ if (descriptor->file()->options().cc_api_version() == 2 &&
+ descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING) {
if (!PyString_Check(arg) && !PyUnicode_Check(arg)) {
FormatTypeError(arg, "str, unicode");
return false;
@@ -454,6 +457,9 @@ static bool CheckAndSetString(
PyObject* encoded_string = NULL;
if (descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING) {
+#else
+ if (descriptor->file()->options().cc_api_version() == 2 &&
+ descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING) {
if (PyString_Check(arg)) {
encoded_string = PyString_AsEncodedObject(arg, "utf-8", NULL);
} else {
diff --git a/chromium/third_party/protobuf/python/setup.py b/chromium/third_party/protobuf/python/setup.py
index 8a986298664..fbe2766030c 100755
--- a/chromium/third_party/protobuf/python/setup.py
+++ b/chromium/third_party/protobuf/python/setup.py
@@ -26,9 +26,7 @@ from distutils.spawn import find_executable
maintainer_email = "protobuf@googlegroups.com"
# Find the Protocol Compiler.
-if 'PROTOC' in os.environ and os.path.exists(os.environ['PROTOC']):
- protoc = os.environ['PROTOC']
-elif os.path.exists("../src/protoc"):
+if os.path.exists("../src/protoc"):
protoc = "../src/protoc"
elif os.path.exists("../src/protoc.exe"):
protoc = "../src/protoc.exe"
@@ -156,7 +154,7 @@ if __name__ == '__main__':
libraries = [ "protobuf" ]))
setup(name = 'protobuf',
- version = '2.5.0-pre',
+ version = '2.4.2-pre',
packages = [ 'google' ],
namespace_packages = [ 'google' ],
test_suite = 'setup.MakeTestSuite',
@@ -167,7 +165,6 @@ if __name__ == '__main__':
'google.protobuf.internal.cpp_message',
'google.protobuf.internal.decoder',
'google.protobuf.internal.encoder',
- 'google.protobuf.internal.enum_type_wrapper',
'google.protobuf.internal.message_listener',
'google.protobuf.internal.python_message',
'google.protobuf.internal.type_checkers',
diff --git a/chromium/third_party/protobuf/src/Makefile.am b/chromium/third_party/protobuf/src/Makefile.am
index df733d9b874..172d0cdddfc 100644
--- a/chromium/third_party/protobuf/src/Makefile.am
+++ b/chromium/third_party/protobuf/src/Makefile.am
@@ -37,63 +37,57 @@ CLEANFILES = $(protoc_outputs) unittest_proto_middleman \
MAINTAINERCLEANFILES = \
Makefile.in
-nobase_include_HEADERS = \
- google/protobuf/stubs/atomicops.h \
- google/protobuf/stubs/atomicops_internals_arm_gcc.h \
- google/protobuf/stubs/atomicops_internals_arm_qnx.h \
- google/protobuf/stubs/atomicops_internals_atomicword_compat.h \
- google/protobuf/stubs/atomicops_internals_macosx.h \
- google/protobuf/stubs/atomicops_internals_mips_gcc.h \
- google/protobuf/stubs/atomicops_internals_pnacl.h \
- google/protobuf/stubs/atomicops_internals_x86_gcc.h \
- google/protobuf/stubs/atomicops_internals_x86_msvc.h \
- google/protobuf/stubs/common.h \
- google/protobuf/stubs/platform_macros.h \
- google/protobuf/stubs/once.h \
- google/protobuf/stubs/template_util.h \
- google/protobuf/stubs/type_traits.h \
- google/protobuf/descriptor.h \
- google/protobuf/descriptor.pb.h \
- google/protobuf/descriptor_database.h \
- google/protobuf/dynamic_message.h \
- google/protobuf/extension_set.h \
- google/protobuf/generated_enum_reflection.h \
- google/protobuf/generated_message_util.h \
- google/protobuf/generated_message_reflection.h \
- google/protobuf/message.h \
- google/protobuf/message_lite.h \
- google/protobuf/reflection_ops.h \
- google/protobuf/repeated_field.h \
- google/protobuf/service.h \
- google/protobuf/text_format.h \
- google/protobuf/unknown_field_set.h \
- google/protobuf/wire_format.h \
- google/protobuf/wire_format_lite.h \
- google/protobuf/wire_format_lite_inl.h \
- google/protobuf/io/coded_stream.h \
- $(GZHEADERS) \
- google/protobuf/io/printer.h \
- google/protobuf/io/tokenizer.h \
- google/protobuf/io/zero_copy_stream.h \
- google/protobuf/io/zero_copy_stream_impl.h \
- google/protobuf/io/zero_copy_stream_impl_lite.h \
- google/protobuf/compiler/code_generator.h \
- google/protobuf/compiler/command_line_interface.h \
- google/protobuf/compiler/importer.h \
- google/protobuf/compiler/parser.h \
- google/protobuf/compiler/plugin.h \
- google/protobuf/compiler/plugin.pb.h \
- google/protobuf/compiler/cpp/cpp_generator.h \
- google/protobuf/compiler/java/java_generator.h \
+nobase_include_HEADERS = \
+ google/protobuf/stubs/atomicops.h \
+ google/protobuf/stubs/atomicops_internals_arm_gcc.h \
+ google/protobuf/stubs/atomicops_internals_macosx.h \
+ google/protobuf/stubs/atomicops_internals_mips_gcc.h \
+ google/protobuf/stubs/atomicops_internals_x86_gcc.h \
+ google/protobuf/stubs/atomicops_internals_x86_msvc.h \
+ google/protobuf/stubs/common.h \
+ google/protobuf/stubs/platform_macros.h \
+ google/protobuf/stubs/once.h \
+ google/protobuf/descriptor.h \
+ google/protobuf/descriptor.pb.h \
+ google/protobuf/descriptor_database.h \
+ google/protobuf/dynamic_message.h \
+ google/protobuf/extension_set.h \
+ google/protobuf/generated_enum_reflection.h \
+ google/protobuf/generated_message_util.h \
+ google/protobuf/generated_message_reflection.h \
+ google/protobuf/message.h \
+ google/protobuf/message_lite.h \
+ google/protobuf/reflection_ops.h \
+ google/protobuf/repeated_field.h \
+ google/protobuf/service.h \
+ google/protobuf/text_format.h \
+ google/protobuf/unknown_field_set.h \
+ google/protobuf/wire_format.h \
+ google/protobuf/wire_format_lite.h \
+ google/protobuf/wire_format_lite_inl.h \
+ google/protobuf/io/coded_stream.h \
+ $(GZHEADERS) \
+ google/protobuf/io/printer.h \
+ google/protobuf/io/tokenizer.h \
+ google/protobuf/io/zero_copy_stream.h \
+ google/protobuf/io/zero_copy_stream_impl.h \
+ google/protobuf/io/zero_copy_stream_impl_lite.h \
+ google/protobuf/compiler/code_generator.h \
+ google/protobuf/compiler/command_line_interface.h \
+ google/protobuf/compiler/importer.h \
+ google/protobuf/compiler/parser.h \
+ google/protobuf/compiler/plugin.h \
+ google/protobuf/compiler/plugin.pb.h \
+ google/protobuf/compiler/cpp/cpp_generator.h \
+ google/protobuf/compiler/java/java_generator.h \
google/protobuf/compiler/python/python_generator.h
lib_LTLIBRARIES = libprotobuf-lite.la libprotobuf.la libprotoc.la
libprotobuf_lite_la_LIBADD = $(PTHREAD_LIBS)
-libprotobuf_lite_la_LDFLAGS = -version-info 8:0:0 -export-dynamic -no-undefined
+libprotobuf_lite_la_LDFLAGS = -version-info 7:0:0 -export-dynamic -no-undefined
libprotobuf_lite_la_SOURCES = \
google/protobuf/stubs/atomicops_internals_x86_gcc.cc \
- google/protobuf/stubs/atomicops_internals_x86_msvc.cc \
google/protobuf/stubs/common.cc \
google/protobuf/stubs/once.cc \
google/protobuf/stubs/hash.h \
@@ -101,6 +95,8 @@ libprotobuf_lite_la_SOURCES = \
google/protobuf/stubs/stl_util.h \
google/protobuf/stubs/stringprintf.cc \
google/protobuf/stubs/stringprintf.h \
+ google/protobuf/stubs/template_util.h \
+ google/protobuf/stubs/type_traits.h \
google/protobuf/extension_set.cc \
google/protobuf/generated_message_util.cc \
google/protobuf/message_lite.cc \
@@ -112,7 +108,7 @@ libprotobuf_lite_la_SOURCES = \
google/protobuf/io/zero_copy_stream_impl_lite.cc
libprotobuf_la_LIBADD = $(PTHREAD_LIBS)
-libprotobuf_la_LDFLAGS = -version-info 8:0:0 -export-dynamic -no-undefined
+libprotobuf_la_LDFLAGS = -version-info 7:0:0 -export-dynamic -no-undefined
libprotobuf_la_SOURCES = \
$(libprotobuf_lite_la_SOURCES) \
google/protobuf/stubs/strutil.cc \
@@ -140,7 +136,7 @@ libprotobuf_la_SOURCES = \
google/protobuf/compiler/parser.cc
libprotoc_la_LIBADD = $(PTHREAD_LIBS) libprotobuf.la
-libprotoc_la_LDFLAGS = -version-info 8:0:0 -export-dynamic -no-undefined
+libprotoc_la_LDFLAGS = -version-info 7:0:0 -export-dynamic -no-undefined
libprotoc_la_SOURCES = \
google/protobuf/compiler/code_generator.cc \
google/protobuf/compiler/command_line_interface.cc \
diff --git a/chromium/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc
index 1eae29b531f..b5f9ab58fdd 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc
@@ -381,6 +381,7 @@ TEST(GeneratedMessageTest, StringCharStarLength) {
EXPECT_EQ("wx", message.repeated_string(0));
}
+
TEST(GeneratedMessageTest, CopyFrom) {
unittest::TestAllTypes message1, message2;
@@ -393,6 +394,7 @@ TEST(GeneratedMessageTest, CopyFrom) {
TestUtil::ExpectAllFieldsSet(message2);
}
+
TEST(GeneratedMessageTest, SwapWithEmpty) {
unittest::TestAllTypes message1, message2;
TestUtil::SetAllFields(&message1);
@@ -491,8 +493,6 @@ TEST(GeneratedMessageTest, CopyAssignmentOperator) {
TestUtil::ExpectAllFieldsSet(message2);
}
-#if !defined(PROTOBUF_TEST_NO_DESCRIPTORS) || \
- !defined(GOOGLE_PROTOBUF_NO_RTTI)
TEST(GeneratedMessageTest, UpcastCopyFrom) {
// Test the CopyFrom method that takes in the generic const Message&
// parameter.
@@ -505,7 +505,6 @@ TEST(GeneratedMessageTest, UpcastCopyFrom) {
TestUtil::ExpectAllFieldsSet(message2);
}
-#endif
#ifndef PROTOBUF_TEST_NO_DESCRIPTORS
@@ -557,9 +556,7 @@ TEST(GeneratedMessageTest, NonEmptyMergeFrom) {
TestUtil::ExpectAllFieldsSet(message1);
}
-#if !defined(PROTOBUF_TEST_NO_DESCRIPTORS) || \
- !defined(GOOGLE_PROTOBUF_NO_RTTI)
-#ifdef PROTOBUF_HAS_DEATH_TEST
+#ifdef GTEST_HAS_DEATH_TEST
TEST(GeneratedMessageTest, MergeFromSelf) {
unittest::TestAllTypes message;
@@ -568,8 +565,7 @@ TEST(GeneratedMessageTest, MergeFromSelf) {
"&from");
}
-#endif // PROTOBUF_HAS_DEATH_TEST
-#endif // !PROTOBUF_TEST_NO_DESCRIPTORS || !GOOGLE_PROTOBUF_NO_RTTI
+#endif // GTEST_HAS_DEATH_TEST
// Test the generated SerializeWithCachedSizesToArray(),
TEST(GeneratedMessageTest, SerializationToArray) {
@@ -1203,7 +1199,7 @@ TEST_F(GeneratedServiceTest, CallMethod) {
TEST_F(GeneratedServiceTest, CallMethodTypeFailure) {
// Verify death if we call Foo() with Bar's message types.
-#ifdef PROTOBUF_HAS_DEATH_TEST // death tests do not work on Windows yet
+#ifdef GTEST_HAS_DEATH_TEST // death tests do not work on Windows yet
EXPECT_DEBUG_DEATH(
mock_service_.CallMethod(foo_, &mock_controller_,
&foo_request_, &bar_response_, done_.get()),
@@ -1214,7 +1210,7 @@ TEST_F(GeneratedServiceTest, CallMethodTypeFailure) {
mock_service_.CallMethod(foo_, &mock_controller_,
&bar_request_, &foo_response_, done_.get()),
"dynamic_cast");
-#endif // PROTOBUF_HAS_DEATH_TEST
+#endif // GTEST_HAS_DEATH_TEST
}
TEST_F(GeneratedServiceTest, GetPrototypes) {
diff --git a/chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.pb.cc b/chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.pb.cc
index 88559b8fcaf..7b0b1f92478 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.pb.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.pb.cc
@@ -139,9 +139,7 @@ void protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {
"atorResponse\022\r\n\005error\030\001 \001(\t\022B\n\004file\030\017 \003("
"\01324.google.protobuf.compiler.CodeGenerat"
"orResponse.File\032>\n\004File\022\014\n\004name\030\001 \001(\t\022\027\n"
- "\017insertion_point\030\002 \001(\t\022\017\n\007content\030\017 \001(\tB"
- ",\n\034com.google.protobuf.compilerB\014PluginP"
- "rotos", 445);
+ "\017insertion_point\030\002 \001(\t\022\017\n\007content\030\017 \001(\t", 399);
::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
"google/protobuf/compiler/plugin.proto", &protobuf_RegisterTypes);
CodeGeneratorRequest::default_instance_ = new CodeGeneratorRequest();
diff --git a/chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.pb.h b/chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.pb.h
index 68cc21c7f8f..46478c739c1 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.pb.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.pb.h
@@ -8,12 +8,12 @@
#include <google/protobuf/stubs/common.h>
-#if GOOGLE_PROTOBUF_VERSION < 2005000
+#if GOOGLE_PROTOBUF_VERSION < 2004000
#error This file was generated by a newer version of protoc which is
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 2005000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 2004002 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.proto b/chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.proto
index 77b888f37ed..651ed10c222 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.proto
+++ b/chromium/third_party/protobuf/src/google/protobuf/compiler/plugin.proto
@@ -45,8 +45,6 @@
// flag "--${NAME}_out" is passed to protoc.
package google.protobuf.compiler;
-option java_package = "com.google.protobuf.compiler";
-option java_outer_classname = "PluginProtos";
import "google/protobuf/descriptor.proto";
diff --git a/chromium/third_party/protobuf/src/google/protobuf/compiler/subprocess.cc b/chromium/third_party/protobuf/src/google/protobuf/compiler/subprocess.cc
index 67da120d622..860fc8755c4 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/compiler/subprocess.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/compiler/subprocess.cc
@@ -295,8 +295,8 @@ void Subprocess::Start(const string& program, SearchMode search_mode) {
int stdin_pipe[2];
int stdout_pipe[2];
- GOOGLE_CHECK(pipe(stdin_pipe) != -1);
- GOOGLE_CHECK(pipe(stdout_pipe) != -1);
+ pipe(stdin_pipe);
+ pipe(stdout_pipe);
char* argv[2] = { strdup(program.c_str()), NULL };
@@ -324,11 +324,9 @@ void Subprocess::Start(const string& program, SearchMode search_mode) {
// Write directly to STDERR_FILENO to avoid stdio code paths that may do
// stuff that is unsafe here.
- int ignored;
- ignored = write(STDERR_FILENO, argv[0], strlen(argv[0]));
+ write(STDERR_FILENO, argv[0], strlen(argv[0]));
const char* message = ": program not found or is not executable\n";
- ignored = write(STDERR_FILENO, message, strlen(message));
- (void) ignored;
+ write(STDERR_FILENO, message, strlen(message));
// Must use _exit() rather than exit() to avoid flushing output buffers
// that will also be flushed by the parent.
diff --git a/chromium/third_party/protobuf/src/google/protobuf/descriptor.cc b/chromium/third_party/protobuf/src/google/protobuf/descriptor.cc
index bcbf1e079f6..45293fef7d3 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/descriptor.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/descriptor.cc
@@ -2987,11 +2987,7 @@ template<class DescriptorT> void DescriptorBuilder::AllocateOptionsImpl(
// tables_->AllocateMessage<typename DescriptorT::OptionsType>();
typename DescriptorT::OptionsType* const dummy = NULL;
typename DescriptorT::OptionsType* options = tables_->AllocateMessage(dummy);
- // Avoid using MergeFrom()/CopyFrom() in this class to make it -fno-rtti
- // friendly. Without RTTI, MergeFrom() and CopyFrom() will fallback to the
- // reflection based method, which requires the Descriptor. However, we are in
- // the middle of building the descriptors, thus the deadlock.
- options->ParseFromString(orig_options.SerializeAsString());
+ options->CopyFrom(orig_options);
descriptor->options_ = options;
// Don't add to options_to_interpret_ unless there were uninterpreted
@@ -4132,26 +4128,16 @@ void DescriptorBuilder::ValidateFieldOptions(FieldDescriptor* field,
void DescriptorBuilder::ValidateEnumOptions(EnumDescriptor* enm,
const EnumDescriptorProto& proto) {
VALIDATE_OPTIONS_FROM_ARRAY(enm, value, EnumValue);
- if (!enm->options().has_allow_alias() || !enm->options().allow_alias()) {
+ if (!enm->options().allow_alias()) {
map<int, string> used_values;
for (int i = 0; i < enm->value_count(); ++i) {
const EnumValueDescriptor* enum_value = enm->value(i);
if (used_values.find(enum_value->number()) != used_values.end()) {
- string error =
- "\"" + enum_value->full_name() +
- "\" uses the same enum value as \"" +
- used_values[enum_value->number()] + "\". If this is intended, set "
- "'option allow_alias = true;' to the enum definition.";
- if (!enm->options().allow_alias()) {
- // Generate error if duplicated enum values are explicitly disallowed.
- AddError(enm->full_name(), proto,
- DescriptorPool::ErrorCollector::NUMBER,
- error);
- } else {
- // Generate warning if duplicated values are found but the option
- // isn't set.
- GOOGLE_LOG(ERROR) << error;
- }
+ AddError(enm->full_name(), proto,
+ DescriptorPool::ErrorCollector::NUMBER,
+ "\"" + enum_value->full_name() +
+ "\" uses the same enum value as \"" +
+ used_values[enum_value->number()] + "\"");
} else {
used_values[enum_value->number()] = enum_value->full_name();
}
diff --git a/chromium/third_party/protobuf/src/google/protobuf/descriptor.h b/chromium/third_party/protobuf/src/google/protobuf/descriptor.h
index 33e3af7241b..410d3ed4df4 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/descriptor.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/descriptor.h
@@ -58,10 +58,6 @@
#include <vector>
#include <google/protobuf/stubs/common.h>
-// TYPE_BOOL is defined in the MacOS's ConditionalMacros.h.
-#ifdef TYPE_BOOL
-#undef TYPE_BOOL
-#endif // TYPE_BOOL
namespace google {
namespace protobuf {
@@ -1338,7 +1334,7 @@ PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension_range,
const Descriptor::ExtensionRange*)
PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension,
const FieldDescriptor*)
-PROTOBUF_DEFINE_OPTIONS_ACCESSOR(Descriptor, MessageOptions)
+PROTOBUF_DEFINE_OPTIONS_ACCESSOR(Descriptor, MessageOptions);
PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, name)
PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, full_name)
@@ -1355,7 +1351,7 @@ PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, message_type, const Descriptor*)
PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, enum_type, const EnumDescriptor*)
PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, experimental_map_key,
const FieldDescriptor*)
-PROTOBUF_DEFINE_OPTIONS_ACCESSOR(FieldDescriptor, FieldOptions)
+PROTOBUF_DEFINE_OPTIONS_ACCESSOR(FieldDescriptor, FieldOptions);
PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, has_default_value, bool)
PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int32 , int32 )
PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int64 , int64 )
@@ -1375,13 +1371,13 @@ PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, containing_type, const Descriptor*)
PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, value_count, int)
PROTOBUF_DEFINE_ARRAY_ACCESSOR(EnumDescriptor, value,
const EnumValueDescriptor*)
-PROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumDescriptor, EnumOptions)
+PROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumDescriptor, EnumOptions);
PROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, name)
PROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, full_name)
PROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, number, int)
PROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, type, const EnumDescriptor*)
-PROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumValueDescriptor, EnumValueOptions)
+PROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumValueDescriptor, EnumValueOptions);
PROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, name)
PROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, full_name)
@@ -1389,14 +1385,14 @@ PROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, file, const FileDescriptor*)
PROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, method_count, int)
PROTOBUF_DEFINE_ARRAY_ACCESSOR(ServiceDescriptor, method,
const MethodDescriptor*)
-PROTOBUF_DEFINE_OPTIONS_ACCESSOR(ServiceDescriptor, ServiceOptions)
+PROTOBUF_DEFINE_OPTIONS_ACCESSOR(ServiceDescriptor, ServiceOptions);
PROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, name)
PROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, full_name)
PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, service, const ServiceDescriptor*)
PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, input_type, const Descriptor*)
PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, output_type, const Descriptor*)
-PROTOBUF_DEFINE_OPTIONS_ACCESSOR(MethodDescriptor, MethodOptions)
+PROTOBUF_DEFINE_OPTIONS_ACCESSOR(MethodDescriptor, MethodOptions);
PROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, name)
PROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, package)
PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, pool, const DescriptorPool*)
@@ -1407,7 +1403,7 @@ PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, message_type_count, int)
PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, enum_type_count, int)
PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, service_count, int)
PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, extension_count, int)
-PROTOBUF_DEFINE_OPTIONS_ACCESSOR(FileDescriptor, FileOptions)
+PROTOBUF_DEFINE_OPTIONS_ACCESSOR(FileDescriptor, FileOptions);
PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, message_type, const Descriptor*)
PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, enum_type, const EnumDescriptor*)
diff --git a/chromium/third_party/protobuf/src/google/protobuf/descriptor.pb.h b/chromium/third_party/protobuf/src/google/protobuf/descriptor.pb.h
index f6b83cea5ae..5c1175cb7d7 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/descriptor.pb.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/descriptor.pb.h
@@ -8,12 +8,12 @@
#include <google/protobuf/stubs/common.h>
-#if GOOGLE_PROTOBUF_VERSION < 2005000
+#if GOOGLE_PROTOBUF_VERSION < 2004000
#error This file was generated by a newer version of protoc which is
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
-#if 2005000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#if 2004002 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
diff --git a/chromium/third_party/protobuf/src/google/protobuf/descriptor_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/descriptor_unittest.cc
index 86e6a49d8c8..3503f13ecdb 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/descriptor_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/descriptor_unittest.cc
@@ -1739,7 +1739,7 @@ TEST_F(MiscTest, DefaultValues) {
message->field(3)->default_value_uint64());
EXPECT_EQ(4.5 , message->field(4)->default_value_float ());
EXPECT_EQ(10e100 , message->field(5)->default_value_double());
- EXPECT_TRUE( message->field(6)->default_value_bool ());
+ EXPECT_EQ(true , message->field(6)->default_value_bool ());
EXPECT_EQ("hello" , message->field(7)->default_value_string());
EXPECT_EQ("\001\002\003" , message->field(8)->default_value_string());
EXPECT_EQ(enum_value_b , message->field(9)->default_value_enum ());
@@ -1762,7 +1762,7 @@ TEST_F(MiscTest, DefaultValues) {
EXPECT_EQ(0 , message->field(14)->default_value_uint64());
EXPECT_EQ(0.0f , message->field(15)->default_value_float ());
EXPECT_EQ(0.0 , message->field(16)->default_value_double());
- EXPECT_FALSE( message->field(17)->default_value_bool ());
+ EXPECT_EQ(false, message->field(17)->default_value_bool ());
EXPECT_EQ("" , message->field(18)->default_value_string());
EXPECT_EQ("" , message->field(19)->default_value_string());
EXPECT_EQ(enum_value_a, message->field(20)->default_value_enum());
@@ -2167,7 +2167,7 @@ TEST(CustomOptions, OptionTypes) {
options =
&protobuf_unittest::CustomOptionMinIntegerValues::descriptor()->options();
- EXPECT_FALSE( options->GetExtension(protobuf_unittest::bool_opt));
+ EXPECT_EQ(false , options->GetExtension(protobuf_unittest::bool_opt));
EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::int32_opt));
EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::int64_opt));
EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::uint32_opt));
@@ -2181,7 +2181,7 @@ TEST(CustomOptions, OptionTypes) {
options =
&protobuf_unittest::CustomOptionMaxIntegerValues::descriptor()->options();
- EXPECT_TRUE( options->GetExtension(protobuf_unittest::bool_opt));
+ EXPECT_EQ(true , options->GetExtension(protobuf_unittest::bool_opt));
EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::int32_opt));
EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::int64_opt));
EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::uint32_opt));
@@ -4001,9 +4001,7 @@ TEST_F(ValidationErrorTest, DisallowEnumAlias) {
" options { allow_alias: false }"
"}",
"foo.proto: Bar: NUMBER: "
- "\"ENUM_B\" uses the same enum value as \"ENUM_A\". "
- "If this is intended, set 'option allow_alias = true;' to the enum "
- "definition.\n");
+ "\"ENUM_B\" uses the same enum value as \"ENUM_A\"\n");
}
// ===================================================================
diff --git a/chromium/third_party/protobuf/src/google/protobuf/dynamic_message.cc b/chromium/third_party/protobuf/src/google/protobuf/dynamic_message.cc
index 09bec54363a..e4bebb2531c 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/dynamic_message.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/dynamic_message.cc
@@ -208,6 +208,14 @@ class DynamicMessage : public Message {
Metadata GetMetadata() const;
+ // We actually allocate more memory than sizeof(*this) when this
+ // class's memory is allocated via the global operator new. Thus, we need to
+ // manually call the global operator delete. Calling the destructor is taken
+ // care of for us.
+ static void operator delete(void* ptr) {
+ ::operator delete(ptr);
+ }
+
private:
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessage);
diff --git a/chromium/third_party/protobuf/src/google/protobuf/extension_set_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/extension_set_unittest.cc
index 559de6e138f..1e7c5a5e8d9 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/extension_set_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/extension_set_unittest.cc
@@ -550,7 +550,7 @@ TEST(ExtensionSetTest, SpaceUsedExcludingSelf) {
}
}
-#ifdef PROTOBUF_HAS_DEATH_TEST
+#ifdef GTEST_HAS_DEATH_TEST
TEST(ExtensionSetTest, InvalidEnumDeath) {
unittest::TestAllExtensions message;
@@ -560,7 +560,7 @@ TEST(ExtensionSetTest, InvalidEnumDeath) {
"IsValid");
}
-#endif // PROTOBUF_HAS_DEATH_TEST
+#endif // GTEST_HAS_DEATH_TEST
TEST(ExtensionSetTest, DynamicExtensions) {
// Test adding a dynamic extension to a compiled-in message object.
@@ -695,11 +695,7 @@ TEST(ExtensionSetTest, DynamicExtensions) {
const Message& sub_message =
message.GetReflection()->GetMessage(message, message_extension);
const unittest::ForeignMessage* typed_sub_message =
-#ifdef GOOGLE_PROTOBUF_NO_RTTI
- static_cast<const unittest::ForeignMessage*>(&sub_message);
-#else
dynamic_cast<const unittest::ForeignMessage*>(&sub_message);
-#endif
ASSERT_TRUE(typed_sub_message != NULL);
EXPECT_EQ(456, typed_sub_message->c());
}
diff --git a/chromium/third_party/protobuf/src/google/protobuf/generated_message_reflection.h b/chromium/third_party/protobuf/src/google/protobuf/generated_message_reflection.h
index c1c142fa8aa..e6670aea4cd 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/generated_message_reflection.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/generated_message_reflection.h
@@ -50,9 +50,9 @@
namespace google {
namespace upb {
-namespace google_opensource {
-class GMR_Handlers;
-} // namespace google_opensource
+namespace proto2_bridge_opensource {
+class FieldAccessor;
+} // namespace protobuf_bridge_google3
} // namespace upb
namespace protobuf {
@@ -287,9 +287,9 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection {
private:
friend class GeneratedMessage;
- // To parse directly into a proto2 generated class, the class GMR_Handlers
- // needs access to member offsets and hasbits.
- friend class LIBPROTOBUF_EXPORT upb::google_opensource::GMR_Handlers;
+ // To parse directly into a proto2 generated class, FieldAccessor needs
+ // access to member offsets and hasbits.
+ friend class LIBPROTOBUF_EXPORT upb::proto2_bridge_opensource::FieldAccessor;
const Descriptor* descriptor_;
const Message* default_instance_;
diff --git a/chromium/third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc
index 39aa55fb4a5..f60e430d589 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc
@@ -427,7 +427,7 @@ TEST(GeneratedMessageReflectionTest, ReleaseExtensionMessageTest) {
TestUtil::ExpectAllExtensionsSet(message);
}
-#ifdef PROTOBUF_HAS_DEATH_TEST
+#ifdef GTEST_HAS_DEATH_TEST
TEST(GeneratedMessageReflectionTest, UsageErrors) {
unittest::TestAllTypes message;
@@ -476,7 +476,7 @@ TEST(GeneratedMessageReflectionTest, UsageErrors) {
#undef f
}
-#endif // PROTOBUF_HAS_DEATH_TEST
+#endif // GTEST_HAS_DEATH_TEST
} // namespace
diff --git a/chromium/third_party/protobuf/src/google/protobuf/io/gzip_stream.h b/chromium/third_party/protobuf/src/google/protobuf/io/gzip_stream.h
index 365e9ea5f58..7ee24bc3183 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/io/gzip_stream.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/io/gzip_stream.h
@@ -118,7 +118,7 @@ class LIBPROTOBUF_EXPORT GzipOutputStream : public ZeroCopyOutputStream {
ZLIB = 2,
};
- struct LIBPROTOBUF_EXPORT Options {
+ struct Options {
// Defaults to GZIP.
Format format;
diff --git a/chromium/third_party/protobuf/src/google/protobuf/io/printer_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/io/printer_unittest.cc
index c9b3035960f..399395c81e1 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/io/printer_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/io/printer_unittest.cc
@@ -220,7 +220,7 @@ TEST(Printer, Indenting) {
}
// Death tests do not work on Windows as of yet.
-#ifdef PROTOBUF_HAS_DEATH_TEST
+#ifdef GTEST_HAS_DEATH_TEST
TEST(Printer, Death) {
char buffer[8192];
@@ -231,7 +231,7 @@ TEST(Printer, Death) {
EXPECT_DEBUG_DEATH(printer.Print("$unclosed"), "Unclosed variable name");
EXPECT_DEBUG_DEATH(printer.Outdent(), "without matching Indent");
}
-#endif // PROTOBUF__HAS_DEATH_TEST
+#endif // GTEST_HAS_DEATH_TEST
TEST(Printer, WriteFailurePartial) {
char buffer[17];
diff --git a/chromium/third_party/protobuf/src/google/protobuf/io/tokenizer_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/io/tokenizer_unittest.cc
index dbb5be4f601..8de43939be8 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/io/tokenizer_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/io/tokenizer_unittest.cc
@@ -741,7 +741,7 @@ TEST_F(TokenizerTest, ParseInteger) {
EXPECT_EQ(0, ParseInteger("0x"));
uint64 i;
-#ifdef PROTOBUF_HASDEATH_TEST // death tests do not work on Windows yet
+#ifdef GTEST_HAS_DEATH_TEST // death tests do not work on Windows yet
// Test invalid integers that will never be tokenized as integers.
EXPECT_DEBUG_DEATH(Tokenizer::ParseInteger("zxy", kuint64max, &i),
"passed text that could not have been tokenized as an integer");
@@ -753,7 +753,7 @@ TEST_F(TokenizerTest, ParseInteger) {
"passed text that could not have been tokenized as an integer");
EXPECT_DEBUG_DEATH(Tokenizer::ParseInteger("-1", kuint64max, &i),
"passed text that could not have been tokenized as an integer");
-#endif // PROTOBUF_HASDEATH_TEST
+#endif // GTEST_HAS_DEATH_TEST
// Test overflows.
EXPECT_TRUE (Tokenizer::ParseInteger("0", 0, &i));
@@ -796,7 +796,7 @@ TEST_F(TokenizerTest, ParseFloat) {
EXPECT_EQ( 0.0, Tokenizer::ParseFloat("1e-9999999999999999999999999999"));
EXPECT_EQ(HUGE_VAL, Tokenizer::ParseFloat("1e+9999999999999999999999999999"));
-#ifdef PROTOBUF_HASDEATH_TEST // death tests do not work on Windows yet
+#ifdef GTEST_HAS_DEATH_TEST // death tests do not work on Windows yet
// Test invalid integers that will never be tokenized as integers.
EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat("zxy"),
"passed text that could not have been tokenized as a float");
@@ -804,7 +804,7 @@ TEST_F(TokenizerTest, ParseFloat) {
"passed text that could not have been tokenized as a float");
EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat("-1.0"),
"passed text that could not have been tokenized as a float");
-#endif // PROTOBUF_HASDEATH_TEST
+#endif // GTEST_HAS_DEATH_TEST
}
TEST_F(TokenizerTest, ParseString) {
@@ -843,10 +843,10 @@ TEST_F(TokenizerTest, ParseString) {
EXPECT_EQ("u0", output);
// Test invalid strings that will never be tokenized as strings.
-#ifdef PROTOBUF_HASDEATH_TEST // death tests do not work on Windows yet
+#ifdef GTEST_HAS_DEATH_TEST // death tests do not work on Windows yet
EXPECT_DEBUG_DEATH(Tokenizer::ParseString("", &output),
"passed text that could not have been tokenized as a string");
-#endif // PROTOBUF_HASDEATH_TEST
+#endif // GTEST_HAS_DEATH_TEST
}
TEST_F(TokenizerTest, ParseStringAppend) {
diff --git a/chromium/third_party/protobuf/src/google/protobuf/message.h b/chromium/third_party/protobuf/src/google/protobuf/message.h
index 0f90bc1a15b..77faa9a77a5 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/message.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/message.h
@@ -750,27 +750,6 @@ class LIBPROTOBUF_EXPORT MessageFactory {
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFactory);
};
-#define DECLARE_GET_REPEATED_FIELD(TYPE) \
-template<> \
-LIBPROTOBUF_EXPORT \
-const RepeatedField<TYPE>& Reflection::GetRepeatedField<TYPE>( \
- const Message& message, const FieldDescriptor* field) const; \
- \
-template<> \
-LIBPROTOBUF_EXPORT \
-RepeatedField<TYPE>* Reflection::MutableRepeatedField<TYPE>( \
- Message* message, const FieldDescriptor* field) const;
-
-DECLARE_GET_REPEATED_FIELD(int32)
-DECLARE_GET_REPEATED_FIELD(int64)
-DECLARE_GET_REPEATED_FIELD(uint32)
-DECLARE_GET_REPEATED_FIELD(uint64)
-DECLARE_GET_REPEATED_FIELD(float)
-DECLARE_GET_REPEATED_FIELD(double)
-DECLARE_GET_REPEATED_FIELD(bool)
-
-#undef DECLARE_GET_REPEATED_FIELD
-
// =============================================================================
// Implementation details for {Get,Mutable}RawRepeatedPtrField. We provide
// specializations for <string>, <StringPieceField> and <Message> and handle
diff --git a/chromium/third_party/protobuf/src/google/protobuf/message_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/message_unittest.cc
index a1449c76f47..8aaeabb4be9 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/message_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/message_unittest.cc
@@ -205,7 +205,7 @@ TEST(MessageTest, InitializationErrorString) {
EXPECT_EQ("a, b, c", message.InitializationErrorString());
}
-#ifdef PROTOBUF_HAS_DEATH_TEST
+#ifdef GTEST_HAS_DEATH_TEST // death tests do not work on Windows yet.
TEST(MessageTest, SerializeFailsIfNotInitialized) {
unittest::TestRequired message;
@@ -222,7 +222,7 @@ TEST(MessageTest, CheckInitialized) {
"fields: a, b, c");
}
-#endif // PROTOBUF_HAS_DEATH_TEST
+#endif // GTEST_HAS_DEATH_TEST
TEST(MessageTest, BypassInitializationCheckOnSerialize) {
unittest::TestRequired message;
diff --git a/chromium/third_party/protobuf/src/google/protobuf/reflection_ops_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/reflection_ops_unittest.cc
index 29229b5a7e4..1cd56f1e64e 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/reflection_ops_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/reflection_ops_unittest.cc
@@ -152,7 +152,7 @@ TEST(ReflectionOpsTest, MergeUnknown) {
EXPECT_EQ(2, message1.unknown_fields().field(1).varint());
}
-#ifdef PROTOBUF_HAS_DEATH_TEST
+#ifdef GTEST_HAS_DEATH_TEST
TEST(ReflectionOpsTest, MergeFromSelf) {
// Note: Copy is implemented in terms of Merge() so technically the Copy
@@ -165,7 +165,7 @@ TEST(ReflectionOpsTest, MergeFromSelf) {
"&from");
}
-#endif // PROTOBUF_HAS_DEATH_TEST
+#endif // GTEST_HAS_DEATH_TEST
TEST(ReflectionOpsTest, Clear) {
unittest::TestAllTypes message;
diff --git a/chromium/third_party/protobuf/src/google/protobuf/repeated_field.h b/chromium/third_party/protobuf/src/google/protobuf/repeated_field.h
index 570d4b75129..b9db2b61dd3 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/repeated_field.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/repeated_field.h
@@ -57,9 +57,9 @@
namespace google {
namespace upb {
-namespace google_opensource {
-class GMR_Handlers;
-} // namespace google_opensource
+namespace proto2_bridge_opensource {
+class FieldAccessor;
+} // namespace protobuf_bridge_opensource
} // namespace upb
namespace protobuf {
@@ -235,9 +235,9 @@ class LIBPROTOBUF_EXPORT RepeatedPtrFieldBase {
// use of AddFromCleared(), which is not part of the public interface.
friend class ExtensionSet;
- // To parse directly into a proto2 generated class, the upb class GMR_Handlers
+ // To parse directly into a proto2 generated class, the upb FieldAccessor
// needs to be able to modify a RepeatedPtrFieldBase directly.
- friend class LIBPROTOBUF_EXPORT upb::google_opensource::GMR_Handlers;
+ friend class LIBPROTOBUF_EXPORT upb::proto2_bridge_opensource::FieldAccessor;
RepeatedPtrFieldBase();
diff --git a/chromium/third_party/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc
index a40162d0b78..5fcfb007b67 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc
@@ -120,7 +120,7 @@ TEST(RepeatedFieldReflectionTest, RegularFields) {
EXPECT_EQ(rf_double.Get(i), Func(i, 2));
EXPECT_EQ(rpf_string.Get(i), StrFunc(i, 5));
EXPECT_EQ(rpf_foreign_message.Get(i).c(), Func(i, 6));
- EXPECT_EQ(down_cast<const ForeignMessage*>(&rpf_message.Get(i))->c(),
+ EXPECT_EQ(down_cast<const ForeignMessage&>(rpf_message.Get(i)).c(),
Func(i, 6));
// Check gets through mutable objects.
@@ -128,7 +128,7 @@ TEST(RepeatedFieldReflectionTest, RegularFields) {
EXPECT_EQ(mrf_double->Get(i), Func(i, 2));
EXPECT_EQ(mrpf_string->Get(i), StrFunc(i, 5));
EXPECT_EQ(mrpf_foreign_message->Get(i).c(), Func(i, 6));
- EXPECT_EQ(down_cast<const ForeignMessage*>(&mrpf_message->Get(i))->c(),
+ EXPECT_EQ(down_cast<const ForeignMessage&>(mrpf_message->Get(i)).c(),
Func(i, 6));
// Check sets through mutable objects.
@@ -144,7 +144,6 @@ TEST(RepeatedFieldReflectionTest, RegularFields) {
EXPECT_EQ(message.repeated_foreign_message(i).c(), Func(i, 7));
}
-#ifdef PROTOBUF_HAS_DEATH_TEST
// Make sure types are checked correctly at runtime.
const FieldDescriptor* fd_optional_int32 =
desc->FindFieldByName("optional_int32");
@@ -154,7 +153,6 @@ TEST(RepeatedFieldReflectionTest, RegularFields) {
message, fd_repeated_int32), "not the right type");
EXPECT_DEATH(refl->GetRepeatedPtrField<TestAllTypes>(
message, fd_repeated_foreign_message), "wrong submessage type");
-#endif // PROTOBUF_HAS_DEATH_TEST
}
diff --git a/chromium/third_party/protobuf/src/google/protobuf/repeated_field_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/repeated_field_unittest.cc
index 257701eb317..99d5842d593 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/repeated_field_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/repeated_field_unittest.cc
@@ -331,7 +331,7 @@ TEST(RepeatedField, Truncate) {
// Truncations that don't change the size are allowed, but growing is not
// allowed.
field.Truncate(field.size());
-#ifdef PROTOBUF_HAS_DEATH_TEST
+#ifdef GTEST_HAS_DEATH_TEST
EXPECT_DEBUG_DEATH(field.Truncate(field.size() + 1), "new_size");
#endif
}
@@ -1007,13 +1007,11 @@ class RepeatedPtrFieldPtrsIteratorTest : public testing::Test {
TEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertiblePtr) {
RepeatedPtrField<string>::pointer_iterator iter =
proto_array_.pointer_begin();
- (void) iter;
}
TEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertibleConstPtr) {
RepeatedPtrField<string>::const_pointer_iterator iter =
const_proto_array_->pointer_begin();
- (void) iter;
}
TEST_F(RepeatedPtrFieldPtrsIteratorTest, MutablePtrIteration) {
@@ -1138,6 +1136,8 @@ TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrSTLAlgorithms_lower_bound) {
proto_array_.Add()->assign("y");
{
+ RepeatedPtrField<string>::pointer_iterator iter =
+ proto_array_.pointer_begin();
string v = "f";
RepeatedPtrField<string>::pointer_iterator it =
lower_bound(proto_array_.pointer_begin(), proto_array_.pointer_end(),
@@ -1149,6 +1149,8 @@ TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrSTLAlgorithms_lower_bound) {
EXPECT_TRUE(it == proto_array_.pointer_begin() + 3);
}
{
+ RepeatedPtrField<string>::const_pointer_iterator iter =
+ const_proto_array_->pointer_begin();
string v = "f";
RepeatedPtrField<string>::const_pointer_iterator it =
lower_bound(const_proto_array_->pointer_begin(),
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops.h b/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops.h
index ab935b02c6b..9b795ee4bfc 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops.h
@@ -54,7 +54,7 @@
#define GOOGLE_PROTOBUF_ATOMICOPS_H_
// Don't include this file for people not concerned about thread safety.
-#ifndef GOOGLE_PROTOBUF_NO_THREAD_SAFETY
+#ifndef GOOGLE_PROTOBUF_NO_THREADSAFETY
#include <google/protobuf/stubs/platform_macros.h>
@@ -181,12 +181,8 @@ GOOGLE_PROTOBUF_ATOMICOPS_ERROR
#include <google/protobuf/stubs/atomicops_internals_x86_gcc.h>
#elif defined(GOOGLE_PROTOBUF_ARCH_ARM)
#include <google/protobuf/stubs/atomicops_internals_arm_gcc.h>
-#elif defined(GOOGLE_PROTOBUF_ARCH_ARM_QNX)
-#include <google/protobuf/stubs/atomicops_internals_arm_qnx.h>
#elif defined(GOOGLE_PROTOBUF_ARCH_MIPS)
#include <google/protobuf/stubs/atomicops_internals_mips_gcc.h>
-#elif defined(__pnacl__)
-#include <google/protobuf/stubs/atomicops_internals_pnacl.h>
#else
GOOGLE_PROTOBUF_ATOMICOPS_ERROR
#endif
@@ -204,6 +200,6 @@ GOOGLE_PROTOBUF_ATOMICOPS_ERROR
#undef GOOGLE_PROTOBUF_ATOMICOPS_ERROR
-#endif // GOOGLE_PROTOBUF_NO_THREAD_SAFETY
+#endif // GOOGLE_PROTOBUF_NO_THREADSAFETY
#endif // GOOGLE_PROTOBUF_ATOMICOPS_H_
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h b/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h
deleted file mode 100644
index f0507697868..00000000000
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h
+++ /dev/null
@@ -1,146 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// This file is an internal atomic implementation, use atomicops.h instead.
-
-#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_
-#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_
-
-// For _smp_cmpxchg()
-#include <pthread.h>
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-inline Atomic32 QNXCmpxchg(Atomic32 old_value,
- Atomic32 new_value,
- volatile Atomic32* ptr) {
- return static_cast<Atomic32>(
- _smp_cmpxchg((volatile unsigned *)ptr,
- (unsigned)old_value,
- (unsigned)new_value));
-}
-
-
-inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
- Atomic32 old_value,
- Atomic32 new_value) {
- Atomic32 prev_value = *ptr;
- do {
- if (!QNXCmpxchg(old_value, new_value,
- const_cast<Atomic32*>(ptr))) {
- return old_value;
- }
- prev_value = *ptr;
- } while (prev_value == old_value);
- return prev_value;
-}
-
-inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
- Atomic32 new_value) {
- Atomic32 old_value;
- do {
- old_value = *ptr;
- } while (QNXCmpxchg(old_value, new_value,
- const_cast<Atomic32*>(ptr)));
- return old_value;
-}
-
-inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
- Atomic32 increment) {
- return Barrier_AtomicIncrement(ptr, increment);
-}
-
-inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
- Atomic32 increment) {
- for (;;) {
- // Atomic exchange the old value with an incremented one.
- Atomic32 old_value = *ptr;
- Atomic32 new_value = old_value + increment;
- if (QNXCmpxchg(old_value, new_value,
- const_cast<Atomic32*>(ptr)) == 0) {
- // The exchange took place as expected.
- return new_value;
- }
- // Otherwise, *ptr changed mid-loop and we need to retry.
- }
-}
-
-inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
- Atomic32 old_value,
- Atomic32 new_value) {
- return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
- Atomic32 old_value,
- Atomic32 new_value) {
- return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
-}
-
-inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
- *ptr = value;
-}
-
-inline void MemoryBarrier() {
- __sync_synchronize();
-}
-
-inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
- *ptr = value;
- MemoryBarrier();
-}
-
-inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
- MemoryBarrier();
- *ptr = value;
-}
-
-inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
- return *ptr;
-}
-
-inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
- Atomic32 value = *ptr;
- MemoryBarrier();
- return value;
-}
-
-inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
- MemoryBarrier();
- return *ptr;
-}
-
-} // namespace internal
-} // namespace protobuf
-} // namespace google
-
-#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h b/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h
index e9d86797b53..8d9a726c280 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h
@@ -44,7 +44,7 @@
// On LP64 platforms, AtomicWord and Atomic64 are both always long,
// so this problem doesn't occur.
-#if !defined(GOOGLE_PROTOBUF_ARCH_64_BIT)
+#if !defined(GOOGLE_PROTOBUF_HOST_ARCH_64_BIT)
namespace google {
namespace protobuf {
@@ -117,6 +117,6 @@ inline AtomicWord Release_Load(volatile const AtomicWord* ptr) {
} // namespace protobuf
} // namespace google
-#endif // !defined(GOOGLE_PROTOBUF_ARCH_64_BIT)
+#endif // !defined(GOOGLE_PROTOBUF_HOST_ARCH_64_BIT)
#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h b/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h
index f9b7581ad56..9af6d636d6c 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h
@@ -136,7 +136,7 @@ inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
Atomic64 prev_value;
do {
if (OSAtomicCompareAndSwap64(old_value, new_value,
- reinterpret_cast<volatile int64_t*>(ptr))) {
+ const_cast<Atomic64*>(ptr))) {
return old_value;
}
prev_value = *ptr;
@@ -150,19 +150,18 @@ inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
do {
old_value = *ptr;
} while (!OSAtomicCompareAndSwap64(old_value, new_value,
- reinterpret_cast<volatile int64_t*>(ptr)));
+ const_cast<Atomic64*>(ptr)));
return old_value;
}
inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
Atomic64 increment) {
- return OSAtomicAdd64(increment, reinterpret_cast<volatile int64_t*>(ptr));
+ return OSAtomicAdd64(increment, const_cast<Atomic64*>(ptr));
}
inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
Atomic64 increment) {
- return OSAtomicAdd64Barrier(increment,
- reinterpret_cast<volatile int64_t*>(ptr));
+ return OSAtomicAdd64Barrier(increment, const_cast<Atomic64*>(ptr));
}
inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
@@ -170,8 +169,8 @@ inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
Atomic64 new_value) {
Atomic64 prev_value;
do {
- if (OSAtomicCompareAndSwap64Barrier(
- old_value, new_value, reinterpret_cast<volatile int64_t*>(ptr))) {
+ if (OSAtomicCompareAndSwap64Barrier(old_value, new_value,
+ const_cast<Atomic64*>(ptr))) {
return old_value;
}
prev_value = *ptr;
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h b/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h
deleted file mode 100644
index 04a91a83f87..00000000000
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2012 Google Inc. All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// This file is an internal atomic implementation, use atomicops.h instead.
-
-#ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_PNACL_H_
-#define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_PNACL_H_
-
-namespace google {
-namespace protobuf {
-namespace internal {
-
-inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
- Atomic32 old_value,
- Atomic32 new_value) {
- return __sync_val_compare_and_swap(ptr, old_value, new_value);
-}
-
-inline void MemoryBarrier() {
- __sync_synchronize();
-}
-
-inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
- Atomic32 old_value,
- Atomic32 new_value) {
- Atomic32 ret = NoBarrier_CompareAndSwap(ptr, old_value, new_value);
- MemoryBarrier();
- return ret;
-}
-
-inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
- MemoryBarrier();
- *ptr = value;
-}
-
-inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
- Atomic32 value = *ptr;
- MemoryBarrier();
- return value;
-}
-
-} // namespace internal
-} // namespace protobuf
-} // namespace google
-
-#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_PNACL_H_
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc b/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc
index 0b359796ed2..8366a891069 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc
@@ -32,7 +32,7 @@
// Therefore we move the code depending on windows.h to this separate cc file.
// Don't compile this file for people not concerned about thread safety.
-#ifndef GOOGLE_PROTOBUF_NO_THREAD_SAFETY
+#ifndef GOOGLE_PROTOBUF_NO_THREADSAFETY
#include <google/protobuf/stubs/atomicops.h>
@@ -109,4 +109,4 @@ Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
} // namespace google
#endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_MSVC_H_
-#endif // GOOGLE_PROTOBUF_NO_THREAD_SAFETY
+#endif // GOOGLE_PROTOBUF_NO_THREADSAFETY
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/common.cc b/chromium/third_party/protobuf/src/google/protobuf/stubs/common.cc
index e6045026774..16d7852820b 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/common.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/common.cc
@@ -110,7 +110,7 @@ void DefaultLogHandler(LogLevel level, const char* filename, int line,
// We use fprintf() instead of cerr because we want this to work at static
// initialization time.
- fprintf(stderr, "[libprotobuf %s %s:%d] %s\n",
+ fprintf(stderr, "libprotobuf %s %s:%d] %s\n",
level_names[level], filename, line, message.c_str());
fflush(stderr); // Needed on MSVC.
}
@@ -183,15 +183,15 @@ void LogMessage::Finish() {
if (level_ != LOGLEVEL_FATAL) {
InitLogSilencerCountOnce();
MutexLock lock(log_silencer_count_mutex_);
- suppress = log_silencer_count_ > 0;
+ suppress = internal::log_silencer_count_ > 0;
}
if (!suppress) {
- log_handler_(level_, filename_, line_, message_);
+ internal::log_handler_(level_, filename_, line_, message_);
}
if (level_ == LOGLEVEL_FATAL) {
-#if PROTOBUF_USE_EXCEPTIONS
+#ifdef PROTOBUF_USE_EXCEPTIONS
throw FatalException(filename_, line_, message_);
#else
abort();
@@ -383,7 +383,7 @@ void ShutdownProtobufLibrary() {
internal::shutdown_functions_mutex = NULL;
}
-#if PROTOBUF_USE_EXCEPTIONS
+#ifdef PROTOBUF_USE_EXCEPTIONS
FatalException::~FatalException() throw() {}
const char* FatalException::what() const throw() {
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/common.h b/chromium/third_party/protobuf/src/google/protobuf/stubs/common.h
index e9d0e352556..4c3e0cb313f 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/common.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/common.h
@@ -48,17 +48,12 @@
#include <stdint.h>
#endif
-#ifndef PROTOBUF_USE_EXCEPTIONS
#if defined(_MSC_VER) && defined(_CPPUNWIND)
- #define PROTOBUF_USE_EXCEPTIONS 1
+ #define PROTOBUF_USE_EXCEPTIONS
#elif defined(__EXCEPTIONS)
- #define PROTOBUF_USE_EXCEPTIONS 1
-#else
- #define PROTOBUF_USE_EXCEPTIONS 0
-#endif
+ #define PROTOBUF_USE_EXCEPTIONS
#endif
-
-#if PROTOBUF_USE_EXCEPTIONS
+#ifdef PROTOBUF_USE_EXCEPTIONS
#include <exception>
#endif
@@ -128,24 +123,24 @@ namespace internal {
// The current version, represented as a single integer to make comparison
// easier: major * 10^6 + minor * 10^3 + micro
-#define GOOGLE_PROTOBUF_VERSION 2005000
+#define GOOGLE_PROTOBUF_VERSION 2004002
// The minimum library version which works with the current version of the
// headers.
-#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 2005000
+#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 2004000
// The minimum header version which works with the current version of
// the library. This constant should only be used by protoc's C++ code
// generator.
-static const int kMinHeaderVersionForLibrary = 2005000;
+static const int kMinHeaderVersionForLibrary = 2004000;
// The minimum protoc version which works with the current version of the
// headers.
-#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION 2005000
+#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION 2004000
// The minimum header version which works with the current version of
// protoc. This constant should only be used in VerifyVersion().
-static const int kMinHeaderVersionForProtoc = 2005000;
+static const int kMinHeaderVersionForProtoc = 2004000;
// Verifies that the headers and libraries are compatible. Use the macro
// below to call this.
@@ -361,6 +356,12 @@ inline To down_cast(From* f) { // so we only accept pointers
return static_cast<To>(f);
}
+// Simplified down_cast for reference type.
+template<typename To, typename From>
+inline To down_cast(From& f) {
+ return static_cast<To>(f);
+}
+
} // namespace internal
// We made these internal so that they would show up as such in the docs,
@@ -1208,7 +1209,7 @@ LIBPROTOBUF_EXPORT void OnShutdown(void (*func)());
} // namespace internal
-#if PROTOBUF_USE_EXCEPTIONS
+#ifdef PROTOBUF_USE_EXCEPTIONS
class FatalException : public std::exception {
public:
FatalException(const char* filename, int line, const std::string& message)
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/common_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/stubs/common_unittest.cc
index 43cd6d010be..4109a52cb95 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/common_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/common_unittest.cc
@@ -94,9 +94,9 @@ TEST(LoggingTest, DefaultLogging) {
string text = GetCapturedTestStderr();
EXPECT_EQ(
- "[libprotobuf INFO "__FILE__":" + SimpleItoa(line + 1) + "] A message.\n"
- "[libprotobuf WARNING "__FILE__":" + SimpleItoa(line + 2) + "] A warning.\n"
- "[libprotobuf ERROR "__FILE__":" + SimpleItoa(line + 3) + "] An error.\n",
+ "libprotobuf INFO "__FILE__":" + SimpleItoa(line + 1) + "] A message.\n"
+ "libprotobuf WARNING "__FILE__":" + SimpleItoa(line + 2) + "] A warning.\n"
+ "libprotobuf ERROR "__FILE__":" + SimpleItoa(line + 3) + "] An error.\n",
text);
}
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/once.h b/chromium/third_party/protobuf/src/google/protobuf/stubs/once.h
index 7fbc117fe43..ead86fbd59e 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/once.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/once.h
@@ -118,8 +118,8 @@ typedef internal::AtomicWord ProtobufOnceType;
#define GOOGLE_PROTOBUF_ONCE_INIT ::google::protobuf::ONCE_STATE_UNINITIALIZED
-LIBPROTOBUF_EXPORT
-void GoogleOnceInitImpl(ProtobufOnceType* once, Closure* closure);
+LIBPROTOBUF_EXPORT void GoogleOnceInitImpl(ProtobufOnceType* once,
+ Closure* closure);
inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()) {
if (internal::Acquire_Load(once) != ONCE_STATE_DONE) {
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/platform_macros.h b/chromium/third_party/protobuf/src/google/protobuf/stubs/platform_macros.h
index b1df60e4679..cba9fbd029e 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/platform_macros.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/platform_macros.h
@@ -43,9 +43,6 @@
#elif defined(_M_IX86) || defined(__i386__)
#define GOOGLE_PROTOBUF_ARCH_IA32 1
#define GOOGLE_PROTOBUF_ARCH_32_BIT 1
-#elif defined(__QNX__)
-#define GOOGLE_PROTOBUF_ARCH_ARM_QNX 1
-#define GOOGLE_PROTOBUF_ARCH_32_BIT 1
#elif defined(__ARMEL__)
#define GOOGLE_PROTOBUF_ARCH_ARM 1
#define GOOGLE_PROTOBUF_ARCH_32_BIT 1
@@ -54,9 +51,6 @@
#define GOOGLE_PROTOBUF_ARCH_32_BIT 1
#elif defined(__pnacl__)
#define GOOGLE_PROTOBUF_ARCH_32_BIT 1
-#elif defined(__ppc__)
-#define GOOGLE_PROTOBUF_ARCH_PPC 1
-#define GOOGLE_PROTOBUF_ARCH_32_BIT 1
#else
#error Host architecture was not detected as supported by protobuf
#endif
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/stl_util-inl.h b/chromium/third_party/protobuf/src/google/protobuf/stubs/stl_util-inl.h
new file mode 100644
index 00000000000..a2e671bb746
--- /dev/null
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/stl_util-inl.h
@@ -0,0 +1,121 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// from google3/util/gtl/stl_util-inl.h
+
+#ifndef GOOGLE_PROTOBUF_STUBS_STL_UTIL_INL_H__
+#define GOOGLE_PROTOBUF_STUBS_STL_UTIL_INL_H__
+
+#include <google/protobuf/stubs/common.h>
+
+namespace google {
+namespace protobuf {
+
+// STLDeleteContainerPointers()
+// For a range within a container of pointers, calls delete
+// (non-array version) on these pointers.
+// NOTE: for these three functions, we could just implement a DeleteObject
+// functor and then call for_each() on the range and functor, but this
+// requires us to pull in all of algorithm.h, which seems expensive.
+// For hash_[multi]set, it is important that this deletes behind the iterator
+// because the hash_set may call the hash function on the iterator when it is
+// advanced, which could result in the hash function trying to deference a
+// stale pointer.
+template <class ForwardIterator>
+void STLDeleteContainerPointers(ForwardIterator begin,
+ ForwardIterator end) {
+ while (begin != end) {
+ ForwardIterator temp = begin;
+ ++begin;
+ delete *temp;
+ }
+}
+
+// Inside Google, this function implements a horrible, disgusting hack in which
+// we reach into the string's private implementation and resize it without
+// initializing the new bytes. In some cases doing this can significantly
+// improve performance. However, since it's totally non-portable it has no
+// place in open source code. Feel free to fill this function in with your
+// own disgusting hack if you want the perf boost.
+inline void STLStringResizeUninitialized(string* s, size_t new_size) {
+ s->resize(new_size);
+}
+
+// Return a mutable char* pointing to a string's internal buffer,
+// which may not be null-terminated. Writing through this pointer will
+// modify the string.
+//
+// string_as_array(&str)[i] is valid for 0 <= i < str.size() until the
+// next call to a string method that invalidates iterators.
+//
+// As of 2006-04, there is no standard-blessed way of getting a
+// mutable reference to a string's internal buffer. However, issue 530
+// (http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#530)
+// proposes this as the method. According to Matt Austern, this should
+// already work on all current implementations.
+inline char* string_as_array(string* str) {
+ // DO NOT USE const_cast<char*>(str->data())! See the unittest for why.
+ return str->empty() ? NULL : &*str->begin();
+}
+
+// STLDeleteElements() deletes all the elements in an STL container and clears
+// the container. This function is suitable for use with a vector, set,
+// hash_set, or any other STL container which defines sensible begin(), end(),
+// and clear() methods.
+//
+// If container is NULL, this function is a no-op.
+//
+// As an alternative to calling STLDeleteElements() directly, consider
+// ElementDeleter (defined below), which ensures that your container's elements
+// are deleted when the ElementDeleter goes out of scope.
+template <class T>
+void STLDeleteElements(T *container) {
+ if (!container) return;
+ STLDeleteContainerPointers(container->begin(), container->end());
+ container->clear();
+}
+
+// Given an STL container consisting of (key, value) pairs, STLDeleteValues
+// deletes all the "value" components and clears the container. Does nothing
+// in the case it's given a NULL pointer.
+
+template <class T>
+void STLDeleteValues(T *v) {
+ if (!v) return;
+ for (typename T::iterator i = v->begin(); i != v->end(); ++i) {
+ delete i->second;
+ }
+ v->clear();
+}
+
+} // namespace protobuf
+} // namespace google
+
+#endif // GOOGLE_PROTOBUF_STUBS_STL_UTIL_INL_H__
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/stringprintf.h b/chromium/third_party/protobuf/src/google/protobuf/stubs/stringprintf.h
index 4a03e5ff99a..573f30f3aef 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/stringprintf.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/stringprintf.h
@@ -50,25 +50,25 @@ namespace google {
namespace protobuf {
// Return a C++ string
-LIBPROTOBUF_EXPORT extern string StringPrintf(const char* format, ...);
+extern string StringPrintf(const char* format, ...);
// Store result into a supplied string and return it
-LIBPROTOBUF_EXPORT extern const string& SStringPrintf(string* dst, const char* format, ...);
+extern const string& SStringPrintf(string* dst, const char* format, ...);
// Append result to a supplied string
-LIBPROTOBUF_EXPORT extern void StringAppendF(string* dst, const char* format, ...);
+extern void StringAppendF(string* dst, const char* format, ...);
// Lower-level routine that takes a va_list and appends to a specified
// string. All other routines are just convenience wrappers around it.
-LIBPROTOBUF_EXPORT extern void StringAppendV(string* dst, const char* format, va_list ap);
+extern void StringAppendV(string* dst, const char* format, va_list ap);
// The max arguments supported by StringPrintfVector
-LIBPROTOBUF_EXPORT extern const int kStringPrintfVectorMaxArgs;
+extern const int kStringPrintfVectorMaxArgs;
// You can use this version when all your arguments are strings, but
// you don't know how many arguments you'll have at compile time.
// StringPrintfVector will LOG(FATAL) if v.size() > kStringPrintfVectorMaxArgs
-LIBPROTOBUF_EXPORT extern string StringPrintfVector(const char* format, const vector<string>& v);
+extern string StringPrintfVector(const char* format, const vector<string>& v);
} // namespace protobuf
} // namespace google
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/type_traits.h b/chromium/third_party/protobuf/src/google/protobuf/stubs/type_traits.h
index e41f5e6f699..997f35d4d6e 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/type_traits.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/type_traits.h
@@ -333,4 +333,14 @@ struct is_convertible
} // namespace protobuf
} // namespace google
+// Right now these macros are no-ops, and mostly just document the fact
+// these types are PODs, for human use. They may be made more contentful
+// later. The typedef is just to make it legal to put a semicolon after
+// these macros.
+#define DECLARE_POD(TypeName) typedef int Dummy_Type_For_DECLARE_POD
+#define DECLARE_NESTED_POD(TypeName) DECLARE_POD(TypeName)
+#define PROPAGATE_POD_FROM_TEMPLATE_ARGUMENT(TemplateName) \
+ typedef int Dummy_Type_For_PROPAGATE_POD_FROM_TEMPLATE_ARGUMENT
+#define ENFORCE_POD(TypeName) typedef int Dummy_Type_For_ENFORCE_POD
+
#endif // GOOGLE_PROTOBUF_TYPE_TRAITS_H_
diff --git a/chromium/third_party/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc
index 7a8cbfb8b28..00e5a47636b 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc
@@ -47,6 +47,27 @@ using std::string;
using std::vector;
using std::pair;
+using google::protobuf::internal::add_reference;
+using google::protobuf::internal::has_trivial_assign;
+using google::protobuf::internal::has_trivial_constructor;
+using google::protobuf::internal::has_trivial_copy;
+using google::protobuf::internal::has_trivial_destructor;
+#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
+using google::protobuf::internal::is_convertible;
+using google::protobuf::internal::is_enum;
+#endif
+using google::protobuf::internal::is_floating_point;
+using google::protobuf::internal::is_integral;
+using google::protobuf::internal::is_pointer;
+using google::protobuf::internal::is_pod;
+using google::protobuf::internal::is_reference;
+using google::protobuf::internal::is_same;
+using google::protobuf::internal::remove_const;
+using google::protobuf::internal::remove_cv;
+using google::protobuf::internal::remove_pointer;
+using google::protobuf::internal::remove_reference;
+using google::protobuf::internal::remove_volatile;
+
// This assertion produces errors like "error: invalid use of
// incomplete type 'struct <unnamed>::AssertTypesEq<const int, int>'"
@@ -154,7 +175,6 @@ class J {
namespace google {
namespace protobuf {
-namespace internal {
namespace {
// A base class and a derived class that inherits from it, used for
@@ -623,6 +643,5 @@ TEST(TypeTraitsTest, TestConvertible) {
}
} // anonymous namespace
-} // namespace internal
} // namespace protobuf
} // namespace google
diff --git a/chromium/third_party/protobuf/src/google/protobuf/test_util.cc b/chromium/third_party/protobuf/src/google/protobuf/test_util.cc
index a9666fe409f..841f4b30b7c 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/test_util.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/test_util.cc
@@ -309,7 +309,7 @@ void TestUtil::ExpectAllFieldsSet(const unittest::TestAllTypes& message) {
EXPECT_EQ(110 , message.optional_sfixed64());
EXPECT_EQ(111 , message.optional_float ());
EXPECT_EQ(112 , message.optional_double ());
- EXPECT_TRUE( message.optional_bool ());
+ EXPECT_EQ(true , message.optional_bool ());
EXPECT_EQ("115", message.optional_string ());
EXPECT_EQ("116", message.optional_bytes ());
@@ -369,7 +369,7 @@ void TestUtil::ExpectAllFieldsSet(const unittest::TestAllTypes& message) {
EXPECT_EQ(210 , message.repeated_sfixed64(0));
EXPECT_EQ(211 , message.repeated_float (0));
EXPECT_EQ(212 , message.repeated_double (0));
- EXPECT_TRUE( message.repeated_bool (0));
+ EXPECT_EQ(true , message.repeated_bool (0));
EXPECT_EQ("215", message.repeated_string (0));
EXPECT_EQ("216", message.repeated_bytes (0));
@@ -396,7 +396,7 @@ void TestUtil::ExpectAllFieldsSet(const unittest::TestAllTypes& message) {
EXPECT_EQ(310 , message.repeated_sfixed64(1));
EXPECT_EQ(311 , message.repeated_float (1));
EXPECT_EQ(312 , message.repeated_double (1));
- EXPECT_FALSE( message.repeated_bool (1));
+ EXPECT_EQ(false, message.repeated_bool (1));
EXPECT_EQ("315", message.repeated_string (1));
EXPECT_EQ("316", message.repeated_bytes (1));
@@ -446,7 +446,7 @@ void TestUtil::ExpectAllFieldsSet(const unittest::TestAllTypes& message) {
EXPECT_EQ(410 , message.default_sfixed64());
EXPECT_EQ(411 , message.default_float ());
EXPECT_EQ(412 , message.default_double ());
- EXPECT_FALSE( message.default_bool ());
+ EXPECT_EQ(false, message.default_bool ());
EXPECT_EQ("415", message.default_string ());
EXPECT_EQ("416", message.default_bytes ());
@@ -503,7 +503,7 @@ void TestUtil::ExpectClear(const unittest::TestAllTypes& message) {
EXPECT_EQ(0 , message.optional_sfixed64());
EXPECT_EQ(0 , message.optional_float ());
EXPECT_EQ(0 , message.optional_double ());
- EXPECT_FALSE( message.optional_bool ());
+ EXPECT_EQ(false, message.optional_bool ());
EXPECT_EQ("" , message.optional_string ());
EXPECT_EQ("" , message.optional_bytes ());
@@ -592,7 +592,7 @@ void TestUtil::ExpectClear(const unittest::TestAllTypes& message) {
EXPECT_EQ(-50 , message.default_sfixed64());
EXPECT_EQ( 51.5 , message.default_float ());
EXPECT_EQ( 52e3 , message.default_double ());
- EXPECT_TRUE( message.default_bool ());
+ EXPECT_EQ(true , message.default_bool ());
EXPECT_EQ("hello", message.default_string ());
EXPECT_EQ("world", message.default_bytes ());
@@ -651,7 +651,7 @@ void TestUtil::ExpectRepeatedFieldsModified(
EXPECT_EQ(210 , message.repeated_sfixed64(0));
EXPECT_EQ(211 , message.repeated_float (0));
EXPECT_EQ(212 , message.repeated_double (0));
- EXPECT_TRUE( message.repeated_bool (0));
+ EXPECT_EQ(true , message.repeated_bool (0));
EXPECT_EQ("215", message.repeated_string (0));
EXPECT_EQ("216", message.repeated_bytes (0));
@@ -679,7 +679,7 @@ void TestUtil::ExpectRepeatedFieldsModified(
EXPECT_EQ(510 , message.repeated_sfixed64(1));
EXPECT_EQ(511 , message.repeated_float (1));
EXPECT_EQ(512 , message.repeated_double (1));
- EXPECT_TRUE( message.repeated_bool (1));
+ EXPECT_EQ(true , message.repeated_bool (1));
EXPECT_EQ("515", message.repeated_string (1));
EXPECT_EQ("516", message.repeated_bytes (1));
@@ -812,7 +812,7 @@ void TestUtil::ExpectPackedFieldsSet(const unittest::TestPackedTypes& message) {
EXPECT_EQ(610 , message.packed_sfixed64(0));
EXPECT_EQ(611 , message.packed_float (0));
EXPECT_EQ(612 , message.packed_double (0));
- EXPECT_TRUE( message.packed_bool (0));
+ EXPECT_EQ(true , message.packed_bool (0));
EXPECT_EQ(unittest::FOREIGN_BAR, message.packed_enum(0));
EXPECT_EQ(701 , message.packed_int32 (1));
@@ -827,7 +827,7 @@ void TestUtil::ExpectPackedFieldsSet(const unittest::TestPackedTypes& message) {
EXPECT_EQ(710 , message.packed_sfixed64(1));
EXPECT_EQ(711 , message.packed_float (1));
EXPECT_EQ(712 , message.packed_double (1));
- EXPECT_FALSE( message.packed_bool (1));
+ EXPECT_EQ(false, message.packed_bool (1));
EXPECT_EQ(unittest::FOREIGN_BAZ, message.packed_enum(1));
}
@@ -862,7 +862,7 @@ void TestUtil::ExpectUnpackedFieldsSet(
EXPECT_EQ(610 , message.unpacked_sfixed64(0));
EXPECT_EQ(611 , message.unpacked_float (0));
EXPECT_EQ(612 , message.unpacked_double (0));
- EXPECT_TRUE( message.unpacked_bool (0));
+ EXPECT_EQ(true , message.unpacked_bool (0));
EXPECT_EQ(unittest::FOREIGN_BAR, message.unpacked_enum(0));
EXPECT_EQ(701 , message.unpacked_int32 (1));
@@ -877,7 +877,7 @@ void TestUtil::ExpectUnpackedFieldsSet(
EXPECT_EQ(710 , message.unpacked_sfixed64(1));
EXPECT_EQ(711 , message.unpacked_float (1));
EXPECT_EQ(712 , message.unpacked_double (1));
- EXPECT_FALSE( message.unpacked_bool (1));
+ EXPECT_EQ(false, message.unpacked_bool (1));
EXPECT_EQ(unittest::FOREIGN_BAZ, message.unpacked_enum(1));
}
@@ -934,7 +934,7 @@ void TestUtil::ExpectPackedFieldsModified(
EXPECT_EQ(610 , message.packed_sfixed64(0));
EXPECT_EQ(611 , message.packed_float (0));
EXPECT_EQ(612 , message.packed_double (0));
- EXPECT_TRUE( message.packed_bool (0));
+ EXPECT_EQ(true , message.packed_bool (0));
EXPECT_EQ(unittest::FOREIGN_BAR, message.packed_enum(0));
// Actually verify the second (modified) elements now.
EXPECT_EQ(801 , message.packed_int32 (1));
@@ -949,7 +949,7 @@ void TestUtil::ExpectPackedFieldsModified(
EXPECT_EQ(810 , message.packed_sfixed64(1));
EXPECT_EQ(811 , message.packed_float (1));
EXPECT_EQ(812 , message.packed_double (1));
- EXPECT_TRUE( message.packed_bool (1));
+ EXPECT_EQ(true , message.packed_bool (1));
EXPECT_EQ(unittest::FOREIGN_FOO, message.packed_enum(1));
}
@@ -1178,7 +1178,7 @@ void TestUtil::ExpectAllExtensionsSet(
EXPECT_EQ(110 , message.GetExtension(unittest::optional_sfixed64_extension));
EXPECT_EQ(111 , message.GetExtension(unittest::optional_float_extension ));
EXPECT_EQ(112 , message.GetExtension(unittest::optional_double_extension ));
- EXPECT_TRUE( message.GetExtension(unittest::optional_bool_extension ));
+ EXPECT_EQ(true , message.GetExtension(unittest::optional_bool_extension ));
EXPECT_EQ("115", message.GetExtension(unittest::optional_string_extension ));
EXPECT_EQ("116", message.GetExtension(unittest::optional_bytes_extension ));
@@ -1238,7 +1238,7 @@ void TestUtil::ExpectAllExtensionsSet(
EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension, 0));
EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension , 0));
EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension , 0));
- EXPECT_TRUE( message.GetExtension(unittest::repeated_bool_extension , 0));
+ EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension , 0));
EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension , 0));
EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension , 0));
@@ -1267,7 +1267,7 @@ void TestUtil::ExpectAllExtensionsSet(
EXPECT_EQ(310 , message.GetExtension(unittest::repeated_sfixed64_extension, 1));
EXPECT_EQ(311 , message.GetExtension(unittest::repeated_float_extension , 1));
EXPECT_EQ(312 , message.GetExtension(unittest::repeated_double_extension , 1));
- EXPECT_FALSE( message.GetExtension(unittest::repeated_bool_extension , 1));
+ EXPECT_EQ(false, message.GetExtension(unittest::repeated_bool_extension , 1));
EXPECT_EQ("315", message.GetExtension(unittest::repeated_string_extension , 1));
EXPECT_EQ("316", message.GetExtension(unittest::repeated_bytes_extension , 1));
@@ -1321,7 +1321,7 @@ void TestUtil::ExpectAllExtensionsSet(
EXPECT_EQ(410 , message.GetExtension(unittest::default_sfixed64_extension));
EXPECT_EQ(411 , message.GetExtension(unittest::default_float_extension ));
EXPECT_EQ(412 , message.GetExtension(unittest::default_double_extension ));
- EXPECT_FALSE( message.GetExtension(unittest::default_bool_extension ));
+ EXPECT_EQ(false, message.GetExtension(unittest::default_bool_extension ));
EXPECT_EQ("415", message.GetExtension(unittest::default_string_extension ));
EXPECT_EQ("416", message.GetExtension(unittest::default_bytes_extension ));
@@ -1386,7 +1386,7 @@ void TestUtil::ExpectExtensionsClear(
EXPECT_EQ(0 , message.GetExtension(unittest::optional_sfixed64_extension));
EXPECT_EQ(0 , message.GetExtension(unittest::optional_float_extension ));
EXPECT_EQ(0 , message.GetExtension(unittest::optional_double_extension ));
- EXPECT_FALSE( message.GetExtension(unittest::optional_bool_extension ));
+ EXPECT_EQ(false, message.GetExtension(unittest::optional_bool_extension ));
EXPECT_EQ("" , message.GetExtension(unittest::optional_string_extension ));
EXPECT_EQ("" , message.GetExtension(unittest::optional_bytes_extension ));
@@ -1479,7 +1479,7 @@ void TestUtil::ExpectExtensionsClear(
EXPECT_EQ(-50 , message.GetExtension(unittest::default_sfixed64_extension));
EXPECT_EQ( 51.5 , message.GetExtension(unittest::default_float_extension ));
EXPECT_EQ( 52e3 , message.GetExtension(unittest::default_double_extension ));
- EXPECT_TRUE( message.GetExtension(unittest::default_bool_extension ));
+ EXPECT_EQ(true , message.GetExtension(unittest::default_bool_extension ));
EXPECT_EQ("hello", message.GetExtension(unittest::default_string_extension ));
EXPECT_EQ("world", message.GetExtension(unittest::default_bytes_extension ));
@@ -1538,7 +1538,7 @@ void TestUtil::ExpectRepeatedExtensionsModified(
EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension, 0));
EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension , 0));
EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension , 0));
- EXPECT_TRUE( message.GetExtension(unittest::repeated_bool_extension , 0));
+ EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension , 0));
EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension , 0));
EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension , 0));
@@ -1568,7 +1568,7 @@ void TestUtil::ExpectRepeatedExtensionsModified(
EXPECT_EQ(510 , message.GetExtension(unittest::repeated_sfixed64_extension, 1));
EXPECT_EQ(511 , message.GetExtension(unittest::repeated_float_extension , 1));
EXPECT_EQ(512 , message.GetExtension(unittest::repeated_double_extension , 1));
- EXPECT_TRUE( message.GetExtension(unittest::repeated_bool_extension , 1));
+ EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension , 1));
EXPECT_EQ("515", message.GetExtension(unittest::repeated_string_extension , 1));
EXPECT_EQ("516", message.GetExtension(unittest::repeated_bytes_extension , 1));
@@ -1671,7 +1671,7 @@ void TestUtil::ExpectPackedExtensionsSet(
EXPECT_EQ(610 , message.GetExtension(unittest::packed_sfixed64_extension, 0));
EXPECT_EQ(611 , message.GetExtension(unittest::packed_float_extension , 0));
EXPECT_EQ(612 , message.GetExtension(unittest::packed_double_extension , 0));
- EXPECT_TRUE( message.GetExtension(unittest::packed_bool_extension , 0));
+ EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension , 0));
EXPECT_EQ(unittest::FOREIGN_BAR,
message.GetExtension(unittest::packed_enum_extension, 0));
EXPECT_EQ(701 , message.GetExtension(unittest::packed_int32_extension , 1));
@@ -1686,7 +1686,7 @@ void TestUtil::ExpectPackedExtensionsSet(
EXPECT_EQ(710 , message.GetExtension(unittest::packed_sfixed64_extension, 1));
EXPECT_EQ(711 , message.GetExtension(unittest::packed_float_extension , 1));
EXPECT_EQ(712 , message.GetExtension(unittest::packed_double_extension , 1));
- EXPECT_FALSE( message.GetExtension(unittest::packed_bool_extension , 1));
+ EXPECT_EQ(false, message.GetExtension(unittest::packed_bool_extension , 1));
EXPECT_EQ(unittest::FOREIGN_BAZ,
message.GetExtension(unittest::packed_enum_extension, 1));
}
@@ -1741,7 +1741,7 @@ void TestUtil::ExpectPackedExtensionsModified(
EXPECT_EQ(610 , message.GetExtension(unittest::packed_sfixed64_extension, 0));
EXPECT_EQ(611 , message.GetExtension(unittest::packed_float_extension , 0));
EXPECT_EQ(612 , message.GetExtension(unittest::packed_double_extension , 0));
- EXPECT_TRUE( message.GetExtension(unittest::packed_bool_extension , 0));
+ EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension , 0));
EXPECT_EQ(unittest::FOREIGN_BAR,
message.GetExtension(unittest::packed_enum_extension, 0));
@@ -1758,7 +1758,7 @@ void TestUtil::ExpectPackedExtensionsModified(
EXPECT_EQ(810 , message.GetExtension(unittest::packed_sfixed64_extension, 1));
EXPECT_EQ(811 , message.GetExtension(unittest::packed_float_extension , 1));
EXPECT_EQ(812 , message.GetExtension(unittest::packed_double_extension , 1));
- EXPECT_TRUE( message.GetExtension(unittest::packed_bool_extension , 1));
+ EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension , 1));
EXPECT_EQ(unittest::FOREIGN_FOO,
message.GetExtension(unittest::packed_enum_extension, 1));
}
@@ -1835,7 +1835,7 @@ void TestUtil::ExpectLastRepeatedsRemoved(
EXPECT_EQ(210 , message.repeated_sfixed64(0));
EXPECT_EQ(211 , message.repeated_float (0));
EXPECT_EQ(212 , message.repeated_double (0));
- EXPECT_TRUE( message.repeated_bool (0));
+ EXPECT_EQ(true , message.repeated_bool (0));
EXPECT_EQ("215", message.repeated_string (0));
EXPECT_EQ("216", message.repeated_bytes (0));
@@ -1895,7 +1895,7 @@ void TestUtil::ExpectLastRepeatedExtensionsRemoved(
EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension, 0));
EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension , 0));
EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension , 0));
- EXPECT_TRUE( message.GetExtension(unittest::repeated_bool_extension , 0));
+ EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension , 0));
EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension , 0));
EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension , 0));
@@ -1988,7 +1988,7 @@ void TestUtil::ExpectRepeatedsSwapped(
EXPECT_EQ(210 , message.repeated_sfixed64(1));
EXPECT_EQ(211 , message.repeated_float (1));
EXPECT_EQ(212 , message.repeated_double (1));
- EXPECT_TRUE( message.repeated_bool (1));
+ EXPECT_EQ(true , message.repeated_bool (1));
EXPECT_EQ("215", message.repeated_string (1));
EXPECT_EQ("216", message.repeated_bytes (1));
@@ -2014,7 +2014,7 @@ void TestUtil::ExpectRepeatedsSwapped(
EXPECT_EQ(310 , message.repeated_sfixed64(0));
EXPECT_EQ(311 , message.repeated_float (0));
EXPECT_EQ(312 , message.repeated_double (0));
- EXPECT_FALSE( message.repeated_bool (0));
+ EXPECT_EQ(false, message.repeated_bool (0));
EXPECT_EQ("315", message.repeated_string (0));
EXPECT_EQ("316", message.repeated_bytes (0));
@@ -2072,7 +2072,7 @@ void TestUtil::ExpectRepeatedExtensionsSwapped(
EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension, 1));
EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension , 1));
EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension , 1));
- EXPECT_TRUE( message.GetExtension(unittest::repeated_bool_extension , 1));
+ EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension , 1));
EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension , 1));
EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension , 1));
@@ -2101,7 +2101,7 @@ void TestUtil::ExpectRepeatedExtensionsSwapped(
EXPECT_EQ(310 , message.GetExtension(unittest::repeated_sfixed64_extension, 0));
EXPECT_EQ(311 , message.GetExtension(unittest::repeated_float_extension , 0));
EXPECT_EQ(312 , message.GetExtension(unittest::repeated_double_extension , 0));
- EXPECT_FALSE( message.GetExtension(unittest::repeated_bool_extension , 0));
+ EXPECT_EQ(false, message.GetExtension(unittest::repeated_bool_extension , 0));
EXPECT_EQ("315", message.GetExtension(unittest::repeated_string_extension , 0));
EXPECT_EQ("316", message.GetExtension(unittest::repeated_bytes_extension , 0));
@@ -2443,7 +2443,7 @@ void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection1(
EXPECT_EQ(110 , reflection->GetInt64 (message, F("optional_sfixed64")));
EXPECT_EQ(111 , reflection->GetFloat (message, F("optional_float" )));
EXPECT_EQ(112 , reflection->GetDouble(message, F("optional_double" )));
- EXPECT_TRUE( reflection->GetBool (message, F("optional_bool" )));
+ EXPECT_EQ(true , reflection->GetBool (message, F("optional_bool" )));
EXPECT_EQ("115", reflection->GetString(message, F("optional_string" )));
EXPECT_EQ("116", reflection->GetString(message, F("optional_bytes" )));
@@ -2523,7 +2523,7 @@ void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection2(
EXPECT_EQ(210 , reflection->GetRepeatedInt64 (message, F("repeated_sfixed64"), 0));
EXPECT_EQ(211 , reflection->GetRepeatedFloat (message, F("repeated_float" ), 0));
EXPECT_EQ(212 , reflection->GetRepeatedDouble(message, F("repeated_double" ), 0));
- EXPECT_TRUE( reflection->GetRepeatedBool (message, F("repeated_bool" ), 0));
+ EXPECT_EQ(true , reflection->GetRepeatedBool (message, F("repeated_bool" ), 0));
EXPECT_EQ("215", reflection->GetRepeatedString(message, F("repeated_string" ), 0));
EXPECT_EQ("216", reflection->GetRepeatedString(message, F("repeated_bytes" ), 0));
@@ -2565,7 +2565,7 @@ void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection2(
EXPECT_EQ(310 , reflection->GetRepeatedInt64 (message, F("repeated_sfixed64"), 1));
EXPECT_EQ(311 , reflection->GetRepeatedFloat (message, F("repeated_float" ), 1));
EXPECT_EQ(312 , reflection->GetRepeatedDouble(message, F("repeated_double" ), 1));
- EXPECT_FALSE( reflection->GetRepeatedBool (message, F("repeated_bool" ), 1));
+ EXPECT_EQ(false, reflection->GetRepeatedBool (message, F("repeated_bool" ), 1));
EXPECT_EQ("315", reflection->GetRepeatedString(message, F("repeated_string" ), 1));
EXPECT_EQ("316", reflection->GetRepeatedString(message, F("repeated_bytes" ), 1));
@@ -2640,7 +2640,7 @@ void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection3(
EXPECT_EQ(410 , reflection->GetInt64 (message, F("default_sfixed64")));
EXPECT_EQ(411 , reflection->GetFloat (message, F("default_float" )));
EXPECT_EQ(412 , reflection->GetDouble(message, F("default_double" )));
- EXPECT_FALSE( reflection->GetBool (message, F("default_bool" )));
+ EXPECT_EQ(false, reflection->GetBool (message, F("default_bool" )));
EXPECT_EQ("415", reflection->GetString(message, F("default_string" )));
EXPECT_EQ("416", reflection->GetString(message, F("default_bytes" )));
@@ -2690,7 +2690,7 @@ void TestUtil::ReflectionTester::ExpectPackedFieldsSetViaReflection(
EXPECT_EQ(610 , reflection->GetRepeatedInt64 (message, F("packed_sfixed64"), 0));
EXPECT_EQ(611 , reflection->GetRepeatedFloat (message, F("packed_float" ), 0));
EXPECT_EQ(612 , reflection->GetRepeatedDouble(message, F("packed_double" ), 0));
- EXPECT_TRUE( reflection->GetRepeatedBool (message, F("packed_bool" ), 0));
+ EXPECT_EQ(true , reflection->GetRepeatedBool (message, F("packed_bool" ), 0));
EXPECT_EQ(foreign_bar_,
reflection->GetRepeatedEnum(message, F("packed_enum"), 0));
@@ -2706,7 +2706,7 @@ void TestUtil::ReflectionTester::ExpectPackedFieldsSetViaReflection(
EXPECT_EQ(710 , reflection->GetRepeatedInt64 (message, F("packed_sfixed64"), 1));
EXPECT_EQ(711 , reflection->GetRepeatedFloat (message, F("packed_float" ), 1));
EXPECT_EQ(712 , reflection->GetRepeatedDouble(message, F("packed_double" ), 1));
- EXPECT_FALSE( reflection->GetRepeatedBool (message, F("packed_bool" ), 1));
+ EXPECT_EQ(false, reflection->GetRepeatedBool (message, F("packed_bool" ), 1));
EXPECT_EQ(foreign_baz_,
reflection->GetRepeatedEnum(message, F("packed_enum"), 1));
}
@@ -2763,7 +2763,7 @@ void TestUtil::ReflectionTester::ExpectClearViaReflection(
EXPECT_EQ(0 , reflection->GetInt64 (message, F("optional_sfixed64")));
EXPECT_EQ(0 , reflection->GetFloat (message, F("optional_float" )));
EXPECT_EQ(0 , reflection->GetDouble(message, F("optional_double" )));
- EXPECT_FALSE( reflection->GetBool (message, F("optional_bool" )));
+ EXPECT_EQ(false, reflection->GetBool (message, F("optional_bool" )));
EXPECT_EQ("" , reflection->GetString(message, F("optional_string" )));
EXPECT_EQ("" , reflection->GetString(message, F("optional_bytes" )));
@@ -2867,7 +2867,7 @@ void TestUtil::ReflectionTester::ExpectClearViaReflection(
EXPECT_EQ(-50 , reflection->GetInt64 (message, F("default_sfixed64")));
EXPECT_EQ( 51.5 , reflection->GetFloat (message, F("default_float" )));
EXPECT_EQ( 52e3 , reflection->GetDouble(message, F("default_double" )));
- EXPECT_TRUE( reflection->GetBool (message, F("default_bool" )));
+ EXPECT_EQ(true , reflection->GetBool (message, F("default_bool" )));
EXPECT_EQ("hello", reflection->GetString(message, F("default_string" )));
EXPECT_EQ("world", reflection->GetString(message, F("default_bytes" )));
diff --git a/chromium/third_party/protobuf/src/google/protobuf/testing/googletest.h b/chromium/third_party/protobuf/src/google/protobuf/testing/googletest.h
index 003be106072..6b17ae4ff82 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/testing/googletest.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/testing/googletest.h
@@ -38,11 +38,6 @@
#include <vector>
#include <google/protobuf/stubs/common.h>
-// Disable death tests if we use exceptions in CHECK().
-#if !PROTOBUF_USE_EXCEPTIONS && defined(GTEST_HAS_DEATH_TEST)
-#define PROTOBUF_HAS_DEATH_TEST
-#endif
-
namespace google {
namespace protobuf {
diff --git a/chromium/third_party/protobuf/src/google/protobuf/text_format.cc b/chromium/third_party/protobuf/src/google/protobuf/text_format.cc
index cabb99ed9ce..1ee3df50ded 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/text_format.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/text_format.cc
@@ -434,8 +434,8 @@ class TextFormat::Parser::ParserImpl {
// If a parse info tree exists, add the location for the parsed
// field.
if (parse_info_tree_ != NULL) {
- RecordLocation(parse_info_tree_, field,
- ParseLocation(start_line, start_column));
+ parse_info_tree_->RecordLocation(field,
+ ParseLocation(start_line, start_column));
}
return true;
@@ -483,7 +483,7 @@ class TextFormat::Parser::ParserImpl {
// for the nested message.
ParseInfoTree* parent = parse_info_tree_;
if (parent != NULL) {
- parse_info_tree_ = CreateNested(parent, field);
+ parse_info_tree_ = parent->CreateNested(field);
}
string delimeter;
diff --git a/chromium/third_party/protobuf/src/google/protobuf/text_format.h b/chromium/third_party/protobuf/src/google/protobuf/text_format.h
index 01f3ffb0865..0974139708a 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/text_format.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/text_format.h
@@ -339,30 +339,9 @@ class LIBPROTOBUF_EXPORT TextFormat {
};
private:
- // Hack: ParseInfoTree declares TextFormat as a friend which should extend
- // the friendship to TextFormat::Parser::ParserImpl, but unfortunately some
- // old compilers (e.g. GCC 3.4.6) don't implement this correctly. We provide
- // helpers for ParserImpl to call methods of ParseInfoTree.
- static inline void RecordLocation(ParseInfoTree* info_tree,
- const FieldDescriptor* field,
- ParseLocation location);
- static inline ParseInfoTree* CreateNested(ParseInfoTree* info_tree,
- const FieldDescriptor* field);
-
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormat);
};
-inline void TextFormat::RecordLocation(ParseInfoTree* info_tree,
- const FieldDescriptor* field,
- ParseLocation location) {
- info_tree->RecordLocation(field, location);
-}
-
-inline TextFormat::ParseInfoTree* TextFormat::CreateNested(
- ParseInfoTree* info_tree, const FieldDescriptor* field) {
- return info_tree->CreateNested(field);
-}
-
} // namespace protobuf
} // namespace google
diff --git a/chromium/third_party/protobuf/src/google/protobuf/text_format_unittest.cc b/chromium/third_party/protobuf/src/google/protobuf/text_format_unittest.cc
index 304fb844048..353a5e49b8e 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/text_format_unittest.cc
+++ b/chromium/third_party/protobuf/src/google/protobuf/text_format_unittest.cc
@@ -858,12 +858,6 @@ TEST_F(TextFormatParserTest, ParseFieldValueFromString) {
EXPECT_EQ(value, message->optional_##name()); \
EXPECT_TRUE(message->has_optional_##name());
-#define EXPECT_BOOL_FIELD(name, value, valuestring) \
- EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \
- valuestring, d->FindFieldByName("optional_" #name), message.get())); \
- EXPECT_TRUE(message->optional_##name() == value); \
- EXPECT_TRUE(message->has_optional_##name());
-
#define EXPECT_FLOAT_FIELD(name, value, valuestring) \
EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \
valuestring, d->FindFieldByName("optional_" #name), message.get())); \
@@ -921,12 +915,12 @@ TEST_F(TextFormatParserTest, ParseFieldValueFromString) {
EXPECT_INVALID(fixed64, "1,2");
// bool
- EXPECT_BOOL_FIELD(bool, true, "true");
- EXPECT_BOOL_FIELD(bool, false, "false");
- EXPECT_BOOL_FIELD(bool, true, "1");
- EXPECT_BOOL_FIELD(bool, true, "t");
- EXPECT_BOOL_FIELD(bool, false, "0");
- EXPECT_BOOL_FIELD(bool, false, "f");
+ EXPECT_FIELD(bool, true, "true");
+ EXPECT_FIELD(bool, false, "false");
+ EXPECT_FIELD(bool, true, "1");
+ EXPECT_FIELD(bool, true, "t");
+ EXPECT_FIELD(bool, false, "0");
+ EXPECT_FIELD(bool, false, "f");
EXPECT_INVALID(bool, "2");
EXPECT_INVALID(bool, "-0");
EXPECT_INVALID(bool, "on");
@@ -968,7 +962,6 @@ TEST_F(TextFormatParserTest, ParseFieldValueFromString) {
EXPECT_INVALID(nested_message, "any");
#undef EXPECT_FIELD
-#undef EXPECT_BOOL_FIELD
#undef EXPECT_FLOAT_FIELD
#undef EXPECT_DOUBLE_FIELD
#undef EXPECT_INVALID
diff --git a/chromium/third_party/protobuf/src/google/protobuf/unittest.proto b/chromium/third_party/protobuf/src/google/protobuf/unittest.proto
index 6eb2d86f51f..0305be6534f 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/unittest.proto
+++ b/chromium/third_party/protobuf/src/google/protobuf/unittest.proto
@@ -434,7 +434,6 @@ message TestNestedMessageHasBits {
// Test an enum that has multiple values with the same number.
enum TestEnumWithDupValue {
- option allow_alias = true;
FOO1 = 1;
BAR1 = 2;
BAZ = 3;
diff --git a/chromium/third_party/protobuf/src/google/protobuf/wire_format.h b/chromium/third_party/protobuf/src/google/protobuf/wire_format.h
index fc60f51bf6d..8a89881bec0 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/wire_format.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/wire_format.h
@@ -230,9 +230,6 @@ inline void WireFormat::VerifyUTF8String(const char* data, int size,
WireFormat::Operation op) {
#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED
WireFormat::VerifyUTF8StringFallback(data, size, op);
-#else
- // Avoid the compiler warning about unsued variables.
- (void)data; (void)size; (void)op;
#endif
}
diff --git a/chromium/third_party/protobuf/src/google/protobuf/wire_format_lite_inl.h b/chromium/third_party/protobuf/src/google/protobuf/wire_format_lite_inl.h
index 641cc92f65b..0f97386d8ac 100644
--- a/chromium/third_party/protobuf/src/google/protobuf/wire_format_lite_inl.h
+++ b/chromium/third_party/protobuf/src/google/protobuf/wire_format_lite_inl.h
@@ -299,12 +299,12 @@ inline bool WireFormatLite::ReadRepeatedPrimitive< \
tag_size, tag, input, values); \
}
-READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint32, TYPE_FIXED32)
-READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint64, TYPE_FIXED64)
-READ_REPEATED_FIXED_SIZE_PRIMITIVE(int32, TYPE_SFIXED32)
-READ_REPEATED_FIXED_SIZE_PRIMITIVE(int64, TYPE_SFIXED64)
-READ_REPEATED_FIXED_SIZE_PRIMITIVE(float, TYPE_FLOAT)
-READ_REPEATED_FIXED_SIZE_PRIMITIVE(double, TYPE_DOUBLE)
+READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint32, TYPE_FIXED32);
+READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint64, TYPE_FIXED64);
+READ_REPEATED_FIXED_SIZE_PRIMITIVE(int32, TYPE_SFIXED32);
+READ_REPEATED_FIXED_SIZE_PRIMITIVE(int64, TYPE_SFIXED64);
+READ_REPEATED_FIXED_SIZE_PRIMITIVE(float, TYPE_FLOAT);
+READ_REPEATED_FIXED_SIZE_PRIMITIVE(double, TYPE_DOUBLE);
#undef READ_REPEATED_FIXED_SIZE_PRIMITIVE
diff --git a/chromium/third_party/protobuf/vsprojects/extract_includes.bat b/chromium/third_party/protobuf/vsprojects/extract_includes.bat
index a92d114bdf5..4dcb4e1446e 100755
--- a/chromium/third_party/protobuf/vsprojects/extract_includes.bat
+++ b/chromium/third_party/protobuf/vsprojects/extract_includes.bat
@@ -12,8 +12,6 @@ copy ..\src\google\protobuf\stubs\atomicops_internals_x86_msvc.h include\google\
copy ..\src\google\protobuf\stubs\common.h include\google\protobuf\stubs\common.h
copy ..\src\google\protobuf\stubs\once.h include\google\protobuf\stubs\once.h
copy ..\src\google\protobuf\stubs\platform_macros.h include\google\protobuf\stubs\platform_macros.h
-copy ..\src\google\protobuf\stubs\template_util.h include\google\protobuf\stubs\template_util.h
-copy ..\src\google\protobuf\stubs\type_traits.h include\google\protobuf\stubs\type_traits.h
copy ..\src\google\protobuf\descriptor.h include\google\protobuf\descriptor.h
copy ..\src\google\protobuf\descriptor.pb.h include\google\protobuf\descriptor.pb.h
copy ..\src\google\protobuf\descriptor_database.h include\google\protobuf\descriptor_database.h
diff --git a/chromium/third_party/skia/gyp/gmslides.gypi b/chromium/third_party/skia/gyp/gmslides.gypi
index bc0fc65415b..87c46e776fd 100644
--- a/chromium/third_party/skia/gyp/gmslides.gypi
+++ b/chromium/third_party/skia/gyp/gmslides.gypi
@@ -19,7 +19,6 @@
'../gm/blurs.cpp',
'../gm/blurquickreject.cpp',
'../gm/blurrect.cpp',
- '../gm/canvasstate.cpp',
'../gm/circles.cpp',
'../gm/circularclips.cpp',
'../gm/colorfilterimagefilter.cpp',
diff --git a/chromium/third_party/skia/include/core/SkCanvas.h b/chromium/third_party/skia/include/core/SkCanvas.h
index a368182cb4d..b4853f7f336 100644
--- a/chromium/third_party/skia/include/core/SkCanvas.h
+++ b/chromium/third_party/skia/include/core/SkCanvas.h
@@ -239,12 +239,6 @@ public:
operate on this copy.
When the balancing call to restore() is made, the previous matrix, clip,
and drawFilter are restored.
- @param flags The flags govern what portion of the Matrix/Clip/drawFilter
- state the save (and matching restore) effect. For example,
- if only kMatrix is specified, then only the matrix state
- will be pushed and popped. Likewise for the clip if kClip
- is specified. However, the drawFilter is always affected
- by calls to save/restore.
@return The value to pass to restoreToCount() to balance this save()
*/
virtual int save(SaveFlags flags = kMatrixClip_SaveFlag);
diff --git a/chromium/third_party/skia/src/core/SkPictureRecord.cpp b/chromium/third_party/skia/src/core/SkPictureRecord.cpp
index 2c2d334caf0..915736373d0 100644
--- a/chromium/third_party/skia/src/core/SkPictureRecord.cpp
+++ b/chromium/third_party/skia/src/core/SkPictureRecord.cpp
@@ -24,7 +24,6 @@ enum {
// A lot of basic types get stored as a uint32_t: bools, ints, paint indices, etc.
static int const kUInt32Size = 4;
-static const uint32_t kSaveSize = 2 * kUInt32Size;
static const uint32_t kSaveLayerNoBoundsSize = 4 * kUInt32Size;
static const uint32_t kSaveLayerWithBoundsSize = 4 * kUInt32Size + sizeof(SkRect);
@@ -149,7 +148,7 @@ int SkPictureRecord::save(SaveFlags flags) {
fRestoreOffsetStack.push(-(int32_t)fWriter.size());
// op + flags
- uint32_t size = kSaveSize;
+ uint32_t size = 2 * kUInt32Size;
uint32_t initialOffset = this->addDraw(SAVE, &size);
addInt(flags);
@@ -480,16 +479,6 @@ static bool collapse_save_clip_restore(SkWriter32* writer, int32_t offset,
return false;
}
SkASSERT(SAVE == op);
- SkASSERT(kSaveSize == opSize);
-
- // get the save flag (last 4-bytes of the space allocated for the opSize)
- SkCanvas::SaveFlags saveFlags = (SkCanvas::SaveFlags) *writer->peek32(offset+4);
- if (SkCanvas::kMatrixClip_SaveFlag != saveFlags) {
- // This function's optimization is only correct for kMatrixClip style saves.
- // TODO: set checkMatrix & checkClip booleans here and then check for the
- // offending operations in the following loop.
- return false;
- }
// Walk forward until we get back to either a draw-verb (abort) or we hit
// our restore (success).
diff --git a/chromium/third_party/skia/src/core/SkTypefaceCache.cpp b/chromium/third_party/skia/src/core/SkTypefaceCache.cpp
index f864e1c9dc5..b75b2a9af95 100644
--- a/chromium/third_party/skia/src/core/SkTypefaceCache.cpp
+++ b/chromium/third_party/skia/src/core/SkTypefaceCache.cpp
@@ -13,21 +13,6 @@
#define TYPEFACE_CACHE_LIMIT 1024
-SkTypefaceCache::SkTypefaceCache() {}
-
-SkTypefaceCache::~SkTypefaceCache() {
- const Rec* curr = fArray.begin();
- const Rec* stop = fArray.end();
- while (curr < stop) {
- if (curr->fStrong) {
- curr->fFace->unref();
- } else {
- curr->fFace->weak_unref();
- }
- curr += 1;
- }
-}
-
void SkTypefaceCache::add(SkTypeface* face,
SkTypeface::Style requestedStyle,
bool strong) {
diff --git a/chromium/third_party/skia/src/core/SkTypefaceCache.h b/chromium/third_party/skia/src/core/SkTypefaceCache.h
index ae37ab76ec4..b6cab8163fa 100644
--- a/chromium/third_party/skia/src/core/SkTypefaceCache.h
+++ b/chromium/third_party/skia/src/core/SkTypefaceCache.h
@@ -23,9 +23,6 @@
class SkTypefaceCache {
public:
- SkTypefaceCache();
- ~SkTypefaceCache();
-
/**
* Callback for FindByProc. Returns true if the given typeface is a match
* for the given context. The passed typeface is owned by the cache and is
@@ -34,12 +31,20 @@ public:
typedef bool (*FindProc)(SkTypeface*, SkTypeface::Style, void* context);
/**
+ * Helper: returns a unique fontID to pass to the constructor of
+ * your subclass of SkTypeface
+ */
+ static SkFontID NewFontID();
+
+ /**
* Add a typeface to the cache. This ref()s the typeface, so that the
* cache is also an owner. Later, if we need to purge the cache, typefaces
* whose refcnt is 1 (meaning only the cache is an owner) will be
* unref()ed.
*/
- void add(SkTypeface*, SkTypeface::Style requested, bool strong = true);
+ static void Add(SkTypeface*,
+ SkTypeface::Style requested,
+ bool strong = true);
/**
* Search the cache for a typeface with the specified fontID (uniqueID).
@@ -47,14 +52,14 @@ public:
* is found, return NULL. The reference count is unmodified as it is
* assumed that the stack will contain a ref to the typeface.
*/
- SkTypeface* findByID(SkFontID findID) const;
+ static SkTypeface* FindByID(SkFontID fontID);
/**
* Iterate through the cache, calling proc(typeface, ctx) with each
* typeface. If proc returns true, then we return that typeface (this
* ref()s the typeface). If it never returns true, we return NULL.
*/
- SkTypeface* findByProcAndRef(FindProc proc, void* ctx) const;
+ static SkTypeface* FindByProcAndRef(FindProc proc, void* ctx);
/**
* This will unref all of the typefaces in the cache for which the cache
@@ -62,21 +67,6 @@ public:
* This function is exposed for clients that explicitly want to purge the
* cache (e.g. to look for leaks).
*/
- void purgeAll();
-
- /**
- * Helper: returns a unique fontID to pass to the constructor of
- * your subclass of SkTypeface
- */
- static SkFontID NewFontID();
-
- // These are static wrappers around a global instance of a cache.
-
- static void Add(SkTypeface*,
- SkTypeface::Style requested,
- bool strong = true);
- static SkTypeface* FindByID(SkFontID fontID);
- static SkTypeface* FindByProcAndRef(FindProc proc, void* ctx);
static void PurgeAll();
/**
@@ -87,7 +77,11 @@ public:
private:
static SkTypefaceCache& Get();
+ void add(SkTypeface*, SkTypeface::Style requested, bool strong = true);
+ SkTypeface* findByID(SkFontID findID) const;
+ SkTypeface* findByProcAndRef(FindProc proc, void* ctx) const;
void purge(int count);
+ void purgeAll();
struct Rec {
SkTypeface* fFace;
diff --git a/chromium/third_party/skia/src/ports/SkFontHost_win.cpp b/chromium/third_party/skia/src/ports/SkFontHost_win.cpp
index 017c1eab765..708c66fdf72 100755
--- a/chromium/third_party/skia/src/ports/SkFontHost_win.cpp
+++ b/chromium/third_party/skia/src/ports/SkFontHost_win.cpp
@@ -357,6 +357,15 @@ void SkLOGFONTFromTypeface(const SkTypeface* face, LOGFONT* lf) {
}
}
+static void GetLogFontByID(SkFontID fontID, LOGFONT* lf) {
+ LogFontTypeface* face = static_cast<LogFontTypeface*>(SkTypefaceCache::FindByID(fontID));
+ if (face) {
+ *lf = face->fLogFont;
+ } else {
+ sk_bzero(lf, sizeof(LOGFONT));
+ }
+}
+
// Construct Glyph to Unicode table.
// Unicode code points that require conjugate pairs in utf16 are not
// supported.
diff --git a/chromium/third_party/skia/src/ports/SkFontHost_win_dw.cpp b/chromium/third_party/skia/src/ports/SkFontHost_win_dw.cpp
index e1685e63b07..5df90b47f38 100644
--- a/chromium/third_party/skia/src/ports/SkFontHost_win_dw.cpp
+++ b/chromium/third_party/skia/src/ports/SkFontHost_win_dw.cpp
@@ -725,6 +725,9 @@ void SkDWriteFontFromTypeface(const SkTypeface* face, IDWriteFont** font) {
*font = SkRefComPtr(static_cast<const DWriteFontTypeface*>(face)->fDWriteFont.get());
}
}
+static DWriteFontTypeface* GetDWriteFontByID(SkFontID fontID) {
+ return static_cast<DWriteFontTypeface*>(SkTypefaceCache::FindByID(fontID));
+}
SkScalerContext_DW::SkScalerContext_DW(DWriteFontTypeface* typeface,
const SkDescriptor* desc)
diff --git a/chromium/tools/android/android_tools.gyp b/chromium/tools/android/android_tools.gyp
index c38cd70d58a..5aeb96fca22 100644
--- a/chromium/tools/android/android_tools.gyp
+++ b/chromium/tools/android/android_tools.gyp
@@ -5,7 +5,7 @@
{
'targets': [
# Intermediate target grouping the android tools needed to run native
- # unittests and instrumentation test apks.
+ # unittests apks.
{
'target_name': 'android_tools',
'type': 'none',
diff --git a/chromium/tools/deep_memory_profiler/policy.android.renderer.json b/chromium/tools/deep_memory_profiler/policy.android.renderer.json
index c039c6f97a6..dc1e3b5e9fc 100644
--- a/chromium/tools/deep_memory_profiler/policy.android.renderer.json
+++ b/chromium/tools/deep_memory_profiler/policy.android.renderer.json
@@ -52,7 +52,6 @@
"tc-webcore-events-related",
"tc-webcore-document-write",
"tc-webcore-node-create-renderer",
- "tc-webcore-image-frame-generator",
"tc-webcore-render-catch-all",
"tc-webcore-setInnerHTML-except-node",
"tc-wtf-StringImpl-user-catch-all",
@@ -415,11 +414,6 @@
"allocator": "malloc"
},
{
- "name": "tc-webcore-image-frame-generator",
- "stacktrace": ".*WebCore::ImageFrameGenerator.*",
- "allocator": "malloc"
- },
- {
"name": "tc-webcore-render-catch-all",
"stacktrace": ".*WebCore::RenderLayer.*",
"allocator": "malloc"
diff --git a/chromium/tools/deep_memory_profiler/visualizer/main.css b/chromium/tools/deep_memory_profiler/visualizer/main.css
deleted file mode 100644
index 5d9ed53f48d..00000000000
--- a/chromium/tools/deep_memory_profiler/visualizer/main.css
+++ /dev/null
@@ -1,9 +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. */
-
-.plot-container {
- width: 1240px;
- height: 720px;
- margin: 30px auto 30px auto;
-} \ No newline at end of file
diff --git a/chromium/tools/deep_memory_profiler/visualizer/main.html b/chromium/tools/deep_memory_profiler/visualizer/main.html
deleted file mode 100644
index fdd78745910..00000000000
--- a/chromium/tools/deep_memory_profiler/visualizer/main.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<!--
-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.
--->
-<meta charset="utf-8">
-<link rel="stylesheet" href="main.css">
-<script src="../../../third_party/flot/jquery.min.js"></script>
-<script src="../../../third_party/flot/jquery.flot.min.js"></script>
-<script src="../../../third_party/flot/jquery.flot.stack.min.js"></script>
-<script src="main.js"></script>
-
-<body>
- <h2>Deep Memory Profiler Visulaizer</h2>
- <div id="plot" class="plot-container"></div>
-</body>
diff --git a/chromium/tools/deep_memory_profiler/visualizer/main.js b/chromium/tools/deep_memory_profiler/visualizer/main.js
deleted file mode 100644
index 8c4dff84c4b..00000000000
--- a/chromium/tools/deep_memory_profiler/visualizer/main.js
+++ /dev/null
@@ -1,160 +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.
-
-/**
- * This class provides data access interface for dump file profiler
- * @constructor
- */
-var Profiler = function(jsonData) {
- this._jsonData = jsonData;
-};
-
-/**
- * Get units of a snapshot in a world.
- * Exception will be thrown when no world of given name exists.
- * @param {string} worldName
- * @param {number} snapshotIndex
- * @return {Object.<string, number>}
- */
-Profiler.prototype.getUnits = function(worldName, snapshotIndex) {
- var snapshot = this._jsonData.snapshots[snapshotIndex];
- if (!snapshot.worlds[worldName])
- throw 'no world ' + worldName + ' in snapshot ' + index;
-
- // Return units.
- var world = snapshot.worlds[worldName];
- var units = {};
- for (var unitName in world.units)
- units[unitName] = world.units[unitName][0];
- return units;
-};
-
-/**
- * Get first-level breakdowns of a snapshot in a world.
- * Exception will be thrown when no world of given name exists.
- * @param {string} worldName
- * @param {number} snapshotIndex
- * @return {Object.<string, Object>}
- */
-Profiler.prototype.getBreakdowns = function(worldName, snapshotIndex) {
- var snapshot = this._jsonData.snapshots[snapshotIndex];
- if (!snapshot.worlds[worldName])
- throw 'no world ' + worldName + ' in snapshot ' + index;
-
- // Return breakdowns.
- // TODO(junjianx): handle breakdown with arbitrary-level structure.
- return snapshot.worlds[worldName].breakdown;
-};
-
-/**
- * Get categories from fixed hard-coded worlds and breakdowns temporarily.
- * TODO(junjianx): remove the hard-code and support general cases.
- * @return {Array.<Object>}
- */
-Profiler.prototype.getCategories = function() {
- var categories = [];
- var snapshotNum = this._jsonData.snapshots.length;
-
- for (var snapshotIndex = 0; snapshotIndex < snapshotNum; ++snapshotIndex) {
- // Initial categories object for one snapshot.
- categories.push({});
-
- // Handle breakdowns in malloc world.
- var mallocBreakdown = this.getBreakdowns('malloc', snapshotIndex);
- var mallocUnits = this.getUnits('malloc', snapshotIndex);
- if (!mallocBreakdown['component'])
- throw 'no breakdown ' + 'component' + ' in snapshot ' + snapshotIndex;
-
- var componentBreakdown = mallocBreakdown['component'];
- var componentMemory = 0;
- Object.keys(componentBreakdown).forEach(function(breakdownName) {
- var breakdown = componentBreakdown[breakdownName];
- var memory = breakdown.units.reduce(function(previous, current) {
- return previous + mallocUnits[current];
- }, 0);
- componentMemory += memory;
-
- if (componentBreakdown['hidden'] === true)
- return;
- else
- categories[snapshotIndex][breakdownName] = memory;
- });
-
- // Handle breakdowns in vm world.
- var vmBreakdown = this.getBreakdowns('vm', snapshotIndex);
- var vmUnits = this.getUnits('vm', snapshotIndex);
- if (!vmBreakdown['map'])
- throw 'no breakdown ' + 'map' + ' in snapshot ' + snapshotIndex;
-
- var mapBreakdown = vmBreakdown['map'];
-
- Object.keys(mapBreakdown).forEach(function(breakdownName) {
- var breakdown = mapBreakdown[breakdownName];
- var memory = breakdown.units.reduce(function(previous, current) {
- return previous + vmUnits[current];
- }, 0);
-
- if (vmBreakdown['hidden'] === true)
- return;
- else if (breakdownName === 'mmap-tcmalloc')
- categories[snapshotIndex]['tc-unused'] = memory - componentMemory;
- else
- categories[snapshotIndex][breakdownName] = memory;
- });
- }
-
- return categories;
-};
-
-/**
- * Generate lines for flot plotting.
- * @param {Array.<Object>} categories
- * @return {Array.<Object>}
- */
-var generateLines = function(categories) {
- var lines = {};
- var snapshotNum = categories.length;
-
- // Initialize lines with all zero.
- categories.forEach(function(categories) {
- Object.keys(categories).forEach(function(breakdownName) {
- if (lines[breakdownName])
- return;
- lines[breakdownName] = [];
- for (var i = 0; i < snapshotNum; ++i)
- lines[breakdownName].push([i, 0]);
- });
- });
-
- // Assignment lines with values of categories.
- categories.forEach(function(categories, index) {
- Object.keys(categories).forEach(function(breakdownName) {
- lines[breakdownName][index] = [index, categories[breakdownName]];
- });
- });
-
- return Object.keys(lines).map(function(breakdownName) {
- return {
- label: breakdownName,
- data: lines[breakdownName]
- };
- });
-};
-
-$(function() {
- // Read original data and plot.
- $.getJSON('data/result.json', function(jsonData) {
- var profiler = new Profiler(jsonData);
- var categories = profiler.getCategories();
- var lines = generateLines(categories);
-
- // Plot stack graph.
- $.plot('#plot', lines, {
- series: {
- stack: true,
- lines: { show: true, fill: true }
- }
- });
- });
-}); \ No newline at end of file
diff --git a/chromium/tools/gn/BUILD.gn b/chromium/tools/gn/BUILD.gn
index 17be36c0f4f..f699ab35ab7 100644
--- a/chromium/tools/gn/BUILD.gn
+++ b/chromium/tools/gn/BUILD.gn
@@ -1,7 +1,5 @@
static_library("gn_lib") {
sources = [
- "binary_target_generator.cc",
- "binary_target_generator.h",
"build_settings.cc",
"build_settings.h",
"command_desc.cc",
@@ -17,8 +15,6 @@ static_library("gn_lib") {
"config_values_extractors.h",
"config_values_generator.cc",
"config_values_generator.h",
- "copy_target_generator.cc",
- "copy_target_generator.h",
"err.cc",
"err.h",
"escape.cc",
@@ -37,8 +33,6 @@ static_library("gn_lib") {
"function_template.cc",
"function_toolchain.cc",
"function_write_file.cc",
- "group_target_generator.cc",
- "group_target_generator.h",
"import_manager.cc",
"import_manager.h",
"input_conversion.cc",
@@ -56,18 +50,10 @@ static_library("gn_lib") {
"label.cc",
"label.h",
"location.h",
- "ninja_binary_target_writer.cc",
- "ninja_binary_target_writer.h",
"ninja_build_writer.cc",
"ninja_build_writer.h",
- "ninja_copy_target_writer.cc",
- "ninja_copy_target_writer.h",
- "ninja_group_target_writer.cc",
- "ninja_group_target_writer.h",
"ninja_helper.cc",
"ninja_helper.h",
- "ninja_script_target_writer.cc",
- "ninja_script_target_writer.h",
"ninja_target_writer.cc",
"ninja_target_writer.h",
"ninja_toolchain_writer.cc",
@@ -91,10 +77,6 @@ static_library("gn_lib") {
"scope.h",
"scope_per_file_provider.cc",
"scope_per_file_provider.h",
- "script_target_generator.cc",
- "script_target_generator.h",
- "script_values.cc",
- "script_values.h",
"settings.cc",
"settings.h",
"setup.cc",
diff --git a/chromium/tools/gn/binary_target_generator.cc b/chromium/tools/gn/binary_target_generator.cc
deleted file mode 100644
index d7e488a5a6c..00000000000
--- a/chromium/tools/gn/binary_target_generator.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 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 "tools/gn/binary_target_generator.h"
-
-#include "tools/gn/config_values_generator.h"
-#include "tools/gn/err.h"
-
-BinaryTargetGenerator::BinaryTargetGenerator(Target* target,
- Scope* scope,
- const Token& function_token,
- Target::OutputType type,
- Err* err)
- : TargetGenerator(target, scope, function_token, err),
- output_type_(type) {
-}
-
-BinaryTargetGenerator::~BinaryTargetGenerator() {
-}
-
-void BinaryTargetGenerator::DoRun() {
- target_->set_output_type(output_type_);
-
- FillSources();
- FillConfigs();
-
- // Config values (compiler flags, etc.) set directly on this target.
- ConfigValuesGenerator gen(&target_->config_values(), scope_,
- function_token_, input_directory_, err_);
- gen.Run();
- if (err_->has_error())
- return;
-
- SetToolchainDependency();
-}
diff --git a/chromium/tools/gn/binary_target_generator.h b/chromium/tools/gn/binary_target_generator.h
deleted file mode 100644
index dacb4974bd5..00000000000
--- a/chromium/tools/gn/binary_target_generator.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 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 TOOLS_GN_BINARY_TARGET_GENERATOR_H_
-#define TOOLS_GN_BINARY_TARGET_GENERATOR_H_
-
-#include "base/compiler_specific.h"
-#include "tools/gn/target_generator.h"
-
-// Populates a Target with the values from a binary rule (executable, shared
-// library, or static library).
-class BinaryTargetGenerator : public TargetGenerator {
- public:
- BinaryTargetGenerator(Target* target,
- Scope* scope,
- const Token& function_token,
- Target::OutputType type,
- Err* err);
- virtual ~BinaryTargetGenerator();
-
- protected:
- virtual void DoRun() OVERRIDE;
-
- private:
- Target::OutputType output_type_;
-
- DISALLOW_COPY_AND_ASSIGN(BinaryTargetGenerator);
-};
-
-#endif // TOOLS_GN_BINARY_TARGET_GENERATOR_H_
-
diff --git a/chromium/tools/gn/config_values_extractors.cc b/chromium/tools/gn/config_values_extractors.cc
index 646e2d7bb2e..96b514aae06 100644
--- a/chromium/tools/gn/config_values_extractors.cc
+++ b/chromium/tools/gn/config_values_extractors.cc
@@ -4,23 +4,12 @@
#include "tools/gn/config_values_extractors.h"
-#include "tools/gn/escape.h"
-
namespace {
-class EscapedStringWriter {
- public:
- EscapedStringWriter(const EscapeOptions& escape_options)
- : escape_options_(escape_options) {
- }
-
+struct StringWriter {
void operator()(const std::string& s, std::ostream& out) const {
- out << " ";
- EscapeStringToStream(out, s, escape_options_);
+ out << " " << s;
}
-
- private:
- const EscapeOptions& escape_options_;
};
} // namespace
@@ -28,8 +17,6 @@ class EscapedStringWriter {
void RecursiveTargetConfigStringsToStream(
const Target* target,
const std::vector<std::string>& (ConfigValues::* getter)() const,
- const EscapeOptions& escape_options,
std::ostream& out) {
- RecursiveTargetConfigToStream(target, getter,
- EscapedStringWriter(escape_options), out);
+ RecursiveTargetConfigToStream(target, getter, StringWriter(), out);
}
diff --git a/chromium/tools/gn/config_values_extractors.h b/chromium/tools/gn/config_values_extractors.h
index 1b3e52c4469..4698f8c4363 100644
--- a/chromium/tools/gn/config_values_extractors.h
+++ b/chromium/tools/gn/config_values_extractors.h
@@ -13,8 +13,6 @@
#include "tools/gn/config_values.h"
#include "tools/gn/target.h"
-struct EscapeOptions;
-
template<typename T, class Writer>
inline void ConfigValuesToStream(
const ConfigValues& values,
@@ -52,7 +50,6 @@ inline void RecursiveTargetConfigToStream(
void RecursiveTargetConfigStringsToStream(
const Target* target,
const std::vector<std::string>& (ConfigValues::* getter)() const,
- const EscapeOptions& escape_options,
std::ostream& out);
#endif // TOOLS_GN_CONFIG_VALUES_EXTRACTORS_H_
diff --git a/chromium/tools/gn/copy_target_generator.cc b/chromium/tools/gn/copy_target_generator.cc
deleted file mode 100644
index 6347ca23ac8..00000000000
--- a/chromium/tools/gn/copy_target_generator.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (c) 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 "tools/gn/copy_target_generator.h"
-
-#include "tools/gn/build_settings.h"
-#include "tools/gn/filesystem_utils.h"
-#include "tools/gn/scope.h"
-#include "tools/gn/value.h"
-
-CopyTargetGenerator::CopyTargetGenerator(Target* target,
- Scope* scope,
- const Token& function_token,
- Err* err)
- : TargetGenerator(target, scope, function_token, err) {
-}
-
-CopyTargetGenerator::~CopyTargetGenerator() {
-}
-
-void CopyTargetGenerator::DoRun() {
- target_->set_output_type(Target::COPY_FILES);
-
- FillSources();
- FillDestDir();
-
- SetToolchainDependency();
-}
-
-void CopyTargetGenerator::FillDestDir() {
- // Destdir is required for all targets that use it.
- const Value* value = scope_->GetValue("destdir", true);
- if (!value) {
- *err_ = Err(function_token_, "This target type requires a \"destdir\".");
- return;
- }
- if (!value->VerifyTypeIs(Value::STRING, err_))
- return;
-
- if (!EnsureStringIsInOutputDir(
- GetBuildSettings()->build_dir(),
- value->string_value(), *value, err_))
- return;
- target_->set_destdir(SourceDir(value->string_value()));
-}
-
diff --git a/chromium/tools/gn/copy_target_generator.h b/chromium/tools/gn/copy_target_generator.h
deleted file mode 100644
index b6f7e14b2b1..00000000000
--- a/chromium/tools/gn/copy_target_generator.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 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 TOOLS_GN_COPY_TARGET_GENERATOR_H_
-#define TOOLS_GN_COPY_TARGET_GENERATOR_H_
-
-#include "base/compiler_specific.h"
-#include "tools/gn/target_generator.h"
-
-// Populates a Target with the values from a copy rule.
-class CopyTargetGenerator : public TargetGenerator {
- public:
- CopyTargetGenerator(Target* target,
- Scope* scope,
- const Token& function_token,
- Err* err);
- virtual ~CopyTargetGenerator();
-
- protected:
- virtual void DoRun() OVERRIDE;
-
- private:
- void FillDestDir();
-
- DISALLOW_COPY_AND_ASSIGN(CopyTargetGenerator);
-};
-
-#endif // TOOLS_GN_COPY_TARGET_GENERATOR_H_
-
diff --git a/chromium/tools/gn/filesystem_utils.cc b/chromium/tools/gn/filesystem_utils.cc
index 230a12a2909..a1089590f4b 100644
--- a/chromium/tools/gn/filesystem_utils.cc
+++ b/chromium/tools/gn/filesystem_utils.cc
@@ -102,12 +102,17 @@ const char* GetExtensionForOutputType(Target::OutputType type,
switch (os) {
case Settings::MAC:
switch (type) {
+ case Target::NONE:
+ NOTREACHED();
+ return "";
case Target::EXECUTABLE:
return "";
case Target::SHARED_LIBRARY:
return "dylib";
case Target::STATIC_LIBRARY:
return "a";
+ case Target::LOADABLE_MODULE:
+ return "dylib"; // TODO(brettw) what's this?
default:
NOTREACHED();
}
@@ -115,25 +120,17 @@ const char* GetExtensionForOutputType(Target::OutputType type,
case Settings::WIN:
switch (type) {
+ case Target::NONE:
+ NOTREACHED();
+ return "";
case Target::EXECUTABLE:
return "exe";
case Target::SHARED_LIBRARY:
return "dll.lib"; // Extension of import library.
case Target::STATIC_LIBRARY:
return "lib";
- default:
- NOTREACHED();
- }
- break;
-
- case Settings::LINUX:
- switch (type) {
- case Target::EXECUTABLE:
- return "";
- case Target::SHARED_LIBRARY:
- return "so";
- case Target::STATIC_LIBRARY:
- return "a";
+ case Target::LOADABLE_MODULE:
+ return "dll"; // TODO(brettw) what's this?
default:
NOTREACHED();
}
diff --git a/chromium/tools/gn/function_exec_script.cc b/chromium/tools/gn/function_exec_script.cc
index 4121324f8ed..89454e3f35d 100644
--- a/chromium/tools/gn/function_exec_script.cc
+++ b/chromium/tools/gn/function_exec_script.cc
@@ -4,9 +4,6 @@
#include "base/command_line.h"
#include "base/file_util.h"
-#include "base/logging.h"
-#include "base/process/kill.h"
-#include "base/process/launch.h"
#include "base/strings/string_number_conversions.h"
#include "build/build_config.h"
#include "tools/gn/err.h"
@@ -25,13 +22,6 @@
#include "base/win/scoped_process_information.h"
#endif
-#if defined(OS_POSIX)
-#include <fcntl.h>
-#include <unistd.h>
-
-#include "base/posix/file_descriptor_shuffle.h"
-#endif
-
namespace functions {
namespace {
@@ -138,91 +128,7 @@ bool ExecProcess(const CommandLine& cmdline,
std::string* std_out,
std::string* std_err,
int* exit_code) {
- *exit_code = EXIT_FAILURE;
-
- std::vector<std::string> argv = cmdline.argv();
-
- int pipe_fd[2];
- pid_t pid;
- base::InjectiveMultimap fd_shuffle1, fd_shuffle2;
- scoped_ptr<char*[]> argv_cstr(new char*[argv.size() + 1]);
-
- fd_shuffle1.reserve(3);
- fd_shuffle2.reserve(3);
-
- if (pipe(pipe_fd) < 0)
- return false;
-
- switch (pid = fork()) {
- case -1: // error
- close(pipe_fd[0]);
- close(pipe_fd[1]);
- return false;
- case 0: // child
- {
-#if defined(OS_MACOSX)
- base::RestoreDefaultExceptionHandler();
-#endif
- // DANGER: no calls to malloc are allowed from now on:
- // http://crbug.com/36678
-
- // Obscure fork() rule: in the child, if you don't end up doing exec*(),
- // you call _exit() instead of exit(). This is because _exit() does not
- // call any previously-registered (in the parent) exit handlers, which
- // might do things like block waiting for threads that don't even exist
- // in the child.
- int dev_null = open("/dev/null", O_WRONLY);
- if (dev_null < 0)
- _exit(127);
-
- fd_shuffle1.push_back(
- base::InjectionArc(pipe_fd[1], STDOUT_FILENO, true));
- fd_shuffle1.push_back(
- base::InjectionArc(dev_null, STDERR_FILENO, true));
- fd_shuffle1.push_back(
- base::InjectionArc(dev_null, STDIN_FILENO, true));
- // Adding another element here? Remeber to increase the argument to
- // reserve(), above.
-
- std::copy(fd_shuffle1.begin(), fd_shuffle1.end(),
- std::back_inserter(fd_shuffle2));
-
- if (!ShuffleFileDescriptors(&fd_shuffle1))
- _exit(127);
-
- chdir(startup_dir.value().c_str());
-
- // TODO(brettw) the base version GetAppOutput does a
- // CloseSuperfluousFds call here. Do we need this?
-
- for (size_t i = 0; i < argv.size(); i++)
- argv_cstr[i] = const_cast<char*>(argv[i].c_str());
- argv_cstr[argv.size()] = NULL;
- execvp(argv_cstr[0], argv_cstr.get());
- _exit(127);
- }
- default: // parent
- {
- // Close our writing end of pipe now. Otherwise later read would not
- // be able to detect end of child's output (in theory we could still
- // write to the pipe).
- close(pipe_fd[1]);
-
- char buffer[256];
- ssize_t bytes_read = 0;
-
- while (true) {
- bytes_read = HANDLE_EINTR(read(pipe_fd[0], buffer, sizeof(buffer)));
- if (bytes_read <= 0)
- break;
- std_out->append(buffer, bytes_read);
- }
- close(pipe_fd[0]);
-
- return base::WaitForExitCode(pid, exit_code);
- }
- }
-
+ //NOTREACHED() << "Implement me.";
return false;
}
#endif
@@ -294,7 +200,7 @@ Value RunExecScript(Scope* scope,
// Add all dependencies of this script, including the script itself, to the
// build deps.
- g_scheduler->AddGenDependency(script_path);
+ g_scheduler->AddGenDependency(script_source);
if (args.size() == 4) {
const Value& deps_value = args[3];
if (!deps_value.VerifyTypeIs(Value::LIST, err))
@@ -303,9 +209,8 @@ Value RunExecScript(Scope* scope,
for (size_t i = 0; i < deps_value.list_value().size(); i++) {
if (!deps_value.list_value()[0].VerifyTypeIs(Value::STRING, err))
return Value();
- g_scheduler->AddGenDependency(
- build_settings->GetFullPath(cur_dir.ResolveRelativeFile(
- deps_value.list_value()[0].string_value())));
+ g_scheduler->AddGenDependency(cur_dir.ResolveRelativeFile(
+ deps_value.list_value()[0].string_value()));
}
}
diff --git a/chromium/tools/gn/function_read_file.cc b/chromium/tools/gn/function_read_file.cc
index 01de7c8baf0..f64ede91a4f 100644
--- a/chromium/tools/gn/function_read_file.cc
+++ b/chromium/tools/gn/function_read_file.cc
@@ -56,7 +56,7 @@ Value RunReadFile(Scope* scope,
scope->settings()->build_settings()->GetFullPath(source_file);
// Ensure that everything is recomputed if the read file changes.
- g_scheduler->AddGenDependency(file_path);
+ g_scheduler->AddGenDependency(source_file);
// Read contents.
std::string file_contents;
diff --git a/chromium/tools/gn/gn.gyp b/chromium/tools/gn/gn.gyp
index 14267ddf6fa..00cb2562a47 100644
--- a/chromium/tools/gn/gn.gyp
+++ b/chromium/tools/gn/gn.gyp
@@ -10,8 +10,6 @@
'../../base/base.gyp:base',
],
'sources': [
- 'binary_target_generator.cc',
- 'binary_target_generator.h',
'build_settings.cc',
'build_settings.h',
'command_desc.cc',
@@ -27,8 +25,6 @@
'config_values_extractors.h',
'config_values_generator.cc',
'config_values_generator.h',
- 'copy_target_generator.cc',
- 'copy_target_generator.h',
'err.cc',
'err.h',
'escape.cc',
@@ -47,8 +43,6 @@
'function_template.cc',
'function_toolchain.cc',
'function_write_file.cc',
- 'group_target_generator.cc',
- 'group_target_generator.h',
'import_manager.cc',
'import_manager.h',
'input_conversion.cc',
@@ -66,18 +60,10 @@
'label.cc',
'label.h',
'location.h',
- 'ninja_binary_target_writer.cc',
- 'ninja_binary_target_writer.h',
'ninja_build_writer.cc',
'ninja_build_writer.h',
- 'ninja_copy_target_writer.cc',
- 'ninja_copy_target_writer.h',
- 'ninja_group_target_writer.cc',
- 'ninja_group_target_writer.h',
'ninja_helper.cc',
'ninja_helper.h',
- 'ninja_script_target_writer.cc',
- 'ninja_script_target_writer.h',
'ninja_target_writer.cc',
'ninja_target_writer.h',
'ninja_toolchain_writer.cc',
@@ -101,10 +87,6 @@
'scope.h',
'scope_per_file_provider.cc',
'scope_per_file_provider.h',
- 'script_target_generator.cc',
- 'script_target_generator.h',
- 'script_values.cc',
- 'script_values.h',
'settings.cc',
'settings.h',
'setup.cc',
diff --git a/chromium/tools/gn/group_target_generator.cc b/chromium/tools/gn/group_target_generator.cc
deleted file mode 100644
index 6f6fe32b355..00000000000
--- a/chromium/tools/gn/group_target_generator.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 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 "tools/gn/group_target_generator.h"
-
-GroupTargetGenerator::GroupTargetGenerator(Target* target,
- Scope* scope,
- const Token& function_token,
- Err* err)
- : TargetGenerator(target, scope, function_token, err) {
-}
-
-GroupTargetGenerator::~GroupTargetGenerator() {
-}
-
-void GroupTargetGenerator::DoRun() {
- target_->set_output_type(Target::GROUP);
- // Groups only have the default types filled in by the target generator
- // base class.
-}
diff --git a/chromium/tools/gn/group_target_generator.h b/chromium/tools/gn/group_target_generator.h
deleted file mode 100644
index a88ec03c881..00000000000
--- a/chromium/tools/gn/group_target_generator.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 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 TOOLS_GN_GROUP_TARGET_GENERATOR_H_
-#define TOOLS_GN_GROUP_TARGET_GENERATOR_H_
-
-#include "base/compiler_specific.h"
-#include "tools/gn/target_generator.h"
-
-// Populates a Target with the values for a group rule.
-class GroupTargetGenerator : public TargetGenerator {
- public:
- GroupTargetGenerator(Target* target,
- Scope* scope,
- const Token& function_token,
- Err* err);
- virtual ~GroupTargetGenerator();
-
- protected:
- virtual void DoRun() OVERRIDE;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(GroupTargetGenerator);
-};
-
-#endif // TOOLS_GN_GROUP_TARGET_GENERATOR_H_
-
diff --git a/chromium/tools/gn/input_conversion.cc b/chromium/tools/gn/input_conversion.cc
index 19a8047e882..3b104ef06ca 100644
--- a/chromium/tools/gn/input_conversion.cc
+++ b/chromium/tools/gn/input_conversion.cc
@@ -36,7 +36,7 @@ std::string GetExampleOfBadInput(const std::string& input) {
}
TrimWhitespaceASCII(result, TRIM_ALL, &result);
- const size_t kMaxSize = 50;
+ const int kMaxSize = 50;
if (result.size() > kMaxSize) {
trimmed = true;
result.resize(kMaxSize);
diff --git a/chromium/tools/gn/ninja_binary_target_writer.cc b/chromium/tools/gn/ninja_binary_target_writer.cc
deleted file mode 100644
index 3ca925477b4..00000000000
--- a/chromium/tools/gn/ninja_binary_target_writer.cc
+++ /dev/null
@@ -1,346 +0,0 @@
-// Copyright (c) 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 "tools/gn/ninja_binary_target_writer.h"
-
-#include "tools/gn/config_values_extractors.h"
-#include "tools/gn/err.h"
-#include "tools/gn/escape.h"
-#include "tools/gn/string_utils.h"
-
-namespace {
-
-// Returns the proper escape options for writing compiler and linker flags.
-EscapeOptions GetFlagOptions() {
- EscapeOptions opts;
- opts.mode = ESCAPE_NINJA;
-
- // Some flag strings are actually multiple flags that expect to be just
- // added to the command line. We assume that quoting is done by the
- // buildfiles if it wants such things quoted.
- opts.inhibit_quoting = true;
-
- return opts;
-}
-
-struct DefineWriter {
- void operator()(const std::string& s, std::ostream& out) const {
- out << " -D" << s;
- }
-};
-
-struct IncludeWriter {
- IncludeWriter(PathOutput& path_output,
- const NinjaHelper& h)
- : helper(h),
- path_output_(path_output),
- old_inhibit_quoting_(path_output.inhibit_quoting()) {
- // Inhibit quoting since we'll put quotes around the whole thing ourselves.
- // Since we're writing in NINJA escaping mode, this won't actually do
- // anything, but I think we may need to change to shell-and-then-ninja
- // escaping for this in the future.
- path_output_.set_inhibit_quoting(true);
- }
- ~IncludeWriter() {
- path_output_.set_inhibit_quoting(old_inhibit_quoting_);
- }
-
- void operator()(const SourceDir& d, std::ostream& out) const {
- out << " \"-I";
- // It's important not to include the trailing slash on directories or on
- // Windows it will be a backslash and the compiler might think we're
- // escaping the quote!
- path_output_.WriteDir(out, d, PathOutput::DIR_NO_LAST_SLASH);
- out << "\"";
- }
-
- const NinjaHelper& helper;
- PathOutput& path_output_;
- bool old_inhibit_quoting_; // So we can put the PathOutput back.
-};
-
-} // namespace
-
-NinjaBinaryTargetWriter::NinjaBinaryTargetWriter(const Target* target,
- std::ostream& out)
- : NinjaTargetWriter(target, out) {
-}
-
-NinjaBinaryTargetWriter::~NinjaBinaryTargetWriter() {
-}
-
-void NinjaBinaryTargetWriter::Run() {
- WriteEnvironment();
-
- WriteCompilerVars();
-
- std::vector<OutputFile> obj_files;
- WriteSources(&obj_files);
-
- WriteLinkerStuff(obj_files);
-}
-
-void NinjaBinaryTargetWriter::WriteCompilerVars() {
- // Defines.
- out_ << "defines =";
- RecursiveTargetConfigToStream(target_, &ConfigValues::defines,
- DefineWriter(), out_);
- out_ << std::endl;
-
- // Includes.
- out_ << "includes =";
- RecursiveTargetConfigToStream(target_, &ConfigValues::includes,
- IncludeWriter(path_output_, helper_), out_);
-
- out_ << std::endl;
-
- // C flags and friends.
- EscapeOptions flag_escape_options = GetFlagOptions();
-#define WRITE_FLAGS(name) \
- out_ << #name " ="; \
- RecursiveTargetConfigStringsToStream(target_, &ConfigValues::name, \
- flag_escape_options, out_); \
- out_ << std::endl;
-
- WRITE_FLAGS(cflags)
- WRITE_FLAGS(cflags_c)
- WRITE_FLAGS(cflags_cc)
- WRITE_FLAGS(cflags_objc)
- WRITE_FLAGS(cflags_objcc)
-
-#undef WRITE_FLAGS
-
- out_ << std::endl;
-}
-
-void NinjaBinaryTargetWriter::WriteSources(
- std::vector<OutputFile>* object_files) {
- const Target::FileList& sources = target_->sources();
- object_files->reserve(sources.size());
-
- for (size_t i = 0; i < sources.size(); i++) {
- const SourceFile& input_file = sources[i];
-
- SourceFileType input_file_type = GetSourceFileType(input_file,
- settings_->target_os());
- if (input_file_type == SOURCE_UNKNOWN)
- continue; // Skip unknown file types.
- const char* command = GetCommandForSourceType(input_file_type);
- if (!command)
- continue; // Skip files not needing compilation.
-
- OutputFile output_file = helper_.GetOutputFileForSource(
- target_, input_file, input_file_type);
- object_files->push_back(output_file);
-
- out_ << "build ";
- path_output_.WriteFile(out_, output_file);
- out_ << ": " << command << " ";
- path_output_.WriteFile(out_, input_file);
- out_ << std::endl;
- }
- out_ << std::endl;
-}
-
-void NinjaBinaryTargetWriter::WriteLinkerStuff(
- const std::vector<OutputFile>& object_files) {
- // Manifest file on Windows.
- // TODO(brettw) this seems not to be necessary for static libs, skip in
- // that case?
- OutputFile windows_manifest;
- if (settings_->IsWin()) {
- windows_manifest.value().assign(helper_.GetTargetOutputDir(target_));
- windows_manifest.value().append(target_->label().name());
- windows_manifest.value().append(".intermediate.manifest");
- out_ << "manifests = ";
- path_output_.WriteFile(out_, windows_manifest);
- out_ << std::endl;
- }
-
- // Linker flags, append manifest flag on Windows to reference our file.
- out_ << "ldflags =";
- RecursiveTargetConfigStringsToStream(target_, &ConfigValues::ldflags,
- GetFlagOptions(), out_);
- // HACK ERASEME BRETTW FIXME
- if (settings_->IsWin()) {
- out_ << " /MANIFEST /ManifestFile:";
- path_output_.WriteFile(out_, windows_manifest);
- out_ << " /DEBUG /MACHINE:X86 /LIBPATH:\"C:\\Program Files (x86)\\Windows Kits\\8.0\\Lib\\win8\\um\\x86\" /DELAYLOAD:dbghelp.dll /DELAYLOAD:dwmapi.dll /DELAYLOAD:shell32.dll /DELAYLOAD:uxtheme.dll /safeseh /dynamicbase /ignore:4199 /ignore:4221 /nxcompat /SUBSYSTEM:CONSOLE /INCREMENTAL /FIXED:NO /DYNAMICBASE:NO wininet.lib dnsapi.lib version.lib msimg32.lib ws2_32.lib usp10.lib psapi.lib dbghelp.lib winmm.lib shlwapi.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib user32.lib uuid.lib odbc32.lib odbccp32.lib delayimp.lib /NXCOMPAT";
- }
- out_ << std::endl;
-
- // Libraries to link.
- out_ << "libs =";
- if (settings_->IsMac()) {
- // TODO(brettw) fix this.
- out_ << " -framework AppKit -framework ApplicationServices -framework Carbon -framework CoreFoundation -framework Foundation -framework IOKit -framework Security";
- }
- out_ << std::endl;
-
- // The external output file is the one that other libs depend on.
- OutputFile external_output_file = helper_.GetTargetOutputFile(target_);
-
- // The internal output file is the "main thing" we think we're making. In
- // the case of shared libraries, this is the shared library and the external
- // output file is the import library. In other cases, the internal one and
- // the external one are the same.
- OutputFile internal_output_file;
- if (target_->output_type() == Target::SHARED_LIBRARY) {
- if (settings_->IsWin()) {
- internal_output_file = OutputFile(target_->label().name() + ".dll");
- } else {
- internal_output_file = external_output_file;
- }
- } else {
- internal_output_file = external_output_file;
- }
-
- // In Python see "self.ninja.build(output, command, input,"
- WriteLinkCommand(external_output_file, internal_output_file, object_files);
-
- if (target_->output_type() == Target::SHARED_LIBRARY) {
- // The shared object name doesn't include a path.
- out_ << " soname = ";
- out_ << FindFilename(&internal_output_file.value());
- out_ << std::endl;
-
- out_ << " lib = ";
- path_output_.WriteFile(out_, internal_output_file);
- out_ << std::endl;
-
- if (settings_->IsWin()) {
- out_ << " dll = ";
- path_output_.WriteFile(out_, internal_output_file);
- out_ << std::endl;
- }
-
- if (settings_->IsWin()) {
- out_ << " implibflag = /IMPLIB:";
- path_output_.WriteFile(out_, external_output_file);
- out_ << std::endl;
- }
-
- // TODO(brettw) postbuild steps.
- if (settings_->IsMac())
- out_ << " postbuilds = $ && (export BUILT_PRODUCTS_DIR=/Users/brettw/prj/src/out/gn; export CONFIGURATION=Debug; export DYLIB_INSTALL_NAME_BASE=@rpath; export EXECUTABLE_NAME=libbase.dylib; export EXECUTABLE_PATH=libbase.dylib; export FULL_PRODUCT_NAME=libbase.dylib; export LD_DYLIB_INSTALL_NAME=@rpath/libbase.dylib; export MACH_O_TYPE=mh_dylib; export PRODUCT_NAME=base; export PRODUCT_TYPE=com.apple.product-type.library.dynamic; export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk; export SRCROOT=/Users/brettw/prj/src/out/gn/../../base; export SOURCE_ROOT=\"$${SRCROOT}\"; export TARGET_BUILD_DIR=/Users/brettw/prj/src/out/gn; export TEMP_DIR=\"$${TMPDIR}\"; (cd ../../base && ../build/mac/strip_from_xcode); G=$$?; ((exit $$G) || rm -rf libbase.dylib) && exit $$G)";
- }
-
- out_ << std::endl;
-}
-
-void NinjaBinaryTargetWriter::WriteLinkCommand(
- const OutputFile& external_output_file,
- const OutputFile& internal_output_file,
- const std::vector<OutputFile>& object_files) {
- out_ << "build ";
- path_output_.WriteFile(out_, internal_output_file);
- if (external_output_file != internal_output_file) {
- out_ << " ";
- path_output_.WriteFile(out_, external_output_file);
- }
- out_ << ": " << GetCommandForTargetType();
-
- // Object files.
- for (size_t i = 0; i < object_files.size(); i++) {
- out_ << " ";
- path_output_.WriteFile(out_, object_files[i]);
- }
-
- // Library inputs (deps and inherited static libraries).
- //
- // Static libraries since they're just a collection of the object files so
- // don't need libraries linked with them, but we still need to go through
- // the list and find non-linkable data deps in the "deps" section. We'll
- // collect all non-linkable deps and put it in the order-only deps below.
- std::vector<const Target*> extra_data_deps;
- const std::vector<const Target*>& deps = target_->deps();
- const std::set<const Target*>& inherited = target_->inherited_libraries();
- for (size_t i = 0; i < deps.size(); i++) {
- if (inherited.find(deps[i]) != inherited.end())
- continue;
- if (target_->output_type() != Target::STATIC_LIBRARY &&
- deps[i]->IsLinkable()) {
- out_ << " ";
- path_output_.WriteFile(out_, helper_.GetTargetOutputFile(deps[i]));
- } else {
- extra_data_deps.push_back(deps[i]);
- }
- }
- for (std::set<const Target*>::const_iterator i = inherited.begin();
- i != inherited.end(); ++i) {
- if (target_->output_type() == Target::STATIC_LIBRARY) {
- extra_data_deps.push_back(*i);
- } else {
- out_ << " ";
- path_output_.WriteFile(out_, helper_.GetTargetOutputFile(*i));
- }
- }
-
- // Append data dependencies as order-only dependencies.
- const std::vector<const Target*>& datadeps = target_->datadeps();
- const std::vector<SourceFile>& data = target_->data();
- if (!extra_data_deps.empty() || !datadeps.empty() || !data.empty()) {
- out_ << " ||";
-
- // Non-linkable deps in the deps section above.
- for (size_t i = 0; i < extra_data_deps.size(); i++) {
- out_ << " ";
- path_output_.WriteFile(out_,
- helper_.GetTargetOutputFile(extra_data_deps[i]));
- }
-
- // Data deps.
- for (size_t i = 0; i < datadeps.size(); i++) {
- out_ << " ";
- path_output_.WriteFile(out_, helper_.GetTargetOutputFile(datadeps[i]));
- }
-
- // Data files.
- const std::vector<SourceFile>& data = target_->data();
- for (size_t i = 0; i < data.size(); i++) {
- out_ << " ";
- path_output_.WriteFile(out_, data[i]);
- }
- }
-
- out_ << std::endl;
-}
-
-const char* NinjaBinaryTargetWriter::GetCommandForSourceType(
- SourceFileType type) const {
- if (type == SOURCE_C)
- return "cc";
- if (type == SOURCE_CC)
- return "cxx";
-
- // TODO(brettw) asm files.
-
- if (settings_->IsMac()) {
- if (type == SOURCE_M)
- return "objc";
- if (type == SOURCE_MM)
- return "objcxx";
- }
-
- if (settings_->IsWin()) {
- if (type == SOURCE_RC)
- return "rc";
- }
-
- // TODO(brettw) stuff about "S" files on non-Windows.
- return NULL;
-}
-
-const char* NinjaBinaryTargetWriter::GetCommandForTargetType() const {
- if (target_->output_type() == Target::STATIC_LIBRARY) {
- // TODO(brettw) stuff about standalong static libraryes on Unix in
- // WriteTarget in the Python one, and lots of postbuild steps.
- return "alink";
- }
-
- if (target_->output_type() == Target::SHARED_LIBRARY)
- return "solink";
-
- return "link";
-}
diff --git a/chromium/tools/gn/ninja_binary_target_writer.h b/chromium/tools/gn/ninja_binary_target_writer.h
deleted file mode 100644
index f21e11d8ec8..00000000000
--- a/chromium/tools/gn/ninja_binary_target_writer.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 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 TOOLS_GN_NINJA_BINARY_TARGET_WRITER_H_
-#define TOOLS_GN_NINJA_BINARY_TARGET_WRITER_H_
-
-#include "base/compiler_specific.h"
-#include "tools/gn/ninja_target_writer.h"
-
-// Writes a .ninja file for a binary target type (an executable, a shared
-// library, or a static library).
-class NinjaBinaryTargetWriter : public NinjaTargetWriter {
- public:
- NinjaBinaryTargetWriter(const Target* target, std::ostream& out);
- virtual ~NinjaBinaryTargetWriter();
-
- virtual void Run() OVERRIDE;
-
- private:
- void WriteCompilerVars();
- void WriteSources(std::vector<OutputFile>* object_files);
- void WriteLinkerStuff(const std::vector<OutputFile>& object_files);
-
- // Writes the build line for linking the target. Includes newline.
- void WriteLinkCommand(const OutputFile& external_output_file,
- const OutputFile& internal_output_file,
- const std::vector<OutputFile>& object_files);
-
- // Returns NULL if the source type should not be compiled on this target.
- const char* GetCommandForSourceType(SourceFileType type) const;
-
- const char* GetCommandForTargetType() const;
-
- DISALLOW_COPY_AND_ASSIGN(NinjaBinaryTargetWriter);
-};
-
-#endif // TOOLS_GN_NINJA_BINARY_TARGET_WRITER_H_
-
diff --git a/chromium/tools/gn/ninja_build_writer.cc b/chromium/tools/gn/ninja_build_writer.cc
index bcbd48c8be5..c41422b1db4 100644
--- a/chromium/tools/gn/ninja_build_writer.cc
+++ b/chromium/tools/gn/ninja_build_writer.cc
@@ -117,9 +117,11 @@ void NinjaBuildWriter::WriteNinjaRules() {
out_ << " " << EscapeString(FilePathToUTF8(input_files[i]), ninja_options);
// Other files read by the build.
- std::vector<base::FilePath> other_files = g_scheduler->GetGenDependencies();
- for (size_t i = 0; i < other_files.size(); i++)
- out_ << " " << EscapeString(FilePathToUTF8(other_files[i]), ninja_options);
+ std::vector<SourceFile> other_files = g_scheduler->GetGenDependencies();
+ for (size_t i = 0; i < other_files.size(); i++) {
+ out_ << " ";
+ path_output_.WriteFile(out_, other_files[i]);
+ }
out_ << std::endl << std::endl;
}
@@ -141,6 +143,8 @@ void NinjaBuildWriter::WritePhonyAndAllRules() {
// we'll get naming conflicts).
for (size_t i = 0; i < default_toolchain_targets_.size(); i++) {
const Target* target = default_toolchain_targets_[i];
+ if (target->output_type() == Target::NONE)
+ continue; // Nothing to generate.
OutputFile target_file = helper_.GetTargetOutputFile(target);
if (target_file.value() != target->label().name()) {
diff --git a/chromium/tools/gn/ninja_copy_target_writer.cc b/chromium/tools/gn/ninja_copy_target_writer.cc
deleted file mode 100644
index 4d2ebe07684..00000000000
--- a/chromium/tools/gn/ninja_copy_target_writer.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 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 "tools/gn/ninja_copy_target_writer.h"
-
-#include "base/strings/string_util.h"
-#include "tools/gn/string_utils.h"
-
-NinjaCopyTargetWriter::NinjaCopyTargetWriter(const Target* target,
- std::ostream& out)
- : NinjaTargetWriter(target, out) {
-}
-
-NinjaCopyTargetWriter::~NinjaCopyTargetWriter() {
-}
-
-void NinjaCopyTargetWriter::Run() {
- // The dest dir should be inside the output dir so we can just remove the
- // prefix and get ninja-relative paths.
- const std::string& output_dir =
- settings_->build_settings()->build_dir().value();
- const std::string& dest_dir = target_->destdir().value();
- DCHECK(StartsWithASCII(dest_dir, output_dir, true));
- std::string relative_dest_dir(&dest_dir[output_dir.size()],
- dest_dir.size() - output_dir.size());
-
- const Target::FileList& sources = target_->sources();
- std::vector<OutputFile> dest_files;
- dest_files.reserve(sources.size());
-
- // Write out rules for each file copied.
- for (size_t i = 0; i < sources.size(); i++) {
- const SourceFile& input_file = sources[i];
-
- // The files should have the same name but in the dest dir.
- base::StringPiece name_part = FindFilename(&input_file.value());
- OutputFile dest_file(relative_dest_dir);
- AppendStringPiece(&dest_file.value(), name_part);
-
- dest_files.push_back(dest_file);
-
- out_ << "build ";
- path_output_.WriteFile(out_, dest_file);
- out_ << ": copy ";
- path_output_.WriteFile(out_, input_file);
- out_ << std::endl;
- }
-
- // Write out the rule for the target to copy all of them.
- out_ << std::endl << "build ";
- path_output_.WriteFile(out_, helper_.GetTargetOutputFile(target_));
- out_ << ": stamp";
- for (size_t i = 0; i < dest_files.size(); i++) {
- out_ << " ";
- path_output_.WriteFile(out_, dest_files[i]);
- }
- out_ << std::endl;
-
- // TODO(brettw) need some kind of stamp file for depending on this, as well
- // as order_only=prebuild.
- // TODO(brettw) also need to write out the dependencies of this rule (maybe
- // we're copying output files around).
-}
diff --git a/chromium/tools/gn/ninja_copy_target_writer.h b/chromium/tools/gn/ninja_copy_target_writer.h
deleted file mode 100644
index 99bbaffd8b5..00000000000
--- a/chromium/tools/gn/ninja_copy_target_writer.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 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 TOOLS_GN_NINJA_COPY_TARGET_WRITER_H_
-#define TOOLS_GN_NINJA_COPY_TARGET_WRITER_H_
-
-#include "base/compiler_specific.h"
-#include "tools/gn/ninja_target_writer.h"
-
-// Writes a .ninja file for a copy target type.
-class NinjaCopyTargetWriter : public NinjaTargetWriter {
- public:
- NinjaCopyTargetWriter(const Target* target, std::ostream& out);
- virtual ~NinjaCopyTargetWriter();
-
- virtual void Run() OVERRIDE;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(NinjaCopyTargetWriter);
-};
-
-#endif // TOOLS_GN_NINJA_COPY_TARGET_WRITER_H_
diff --git a/chromium/tools/gn/ninja_group_target_writer.cc b/chromium/tools/gn/ninja_group_target_writer.cc
deleted file mode 100644
index f31bf1a0ae5..00000000000
--- a/chromium/tools/gn/ninja_group_target_writer.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 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 "tools/gn/ninja_group_target_writer.h"
-
-#include "base/strings/string_util.h"
-#include "tools/gn/string_utils.h"
-
-NinjaGroupTargetWriter::NinjaGroupTargetWriter(const Target* target,
- std::ostream& out)
- : NinjaTargetWriter(target, out) {
-}
-
-NinjaGroupTargetWriter::~NinjaGroupTargetWriter() {
-}
-
-void NinjaGroupTargetWriter::Run() {
- // A group rule just generates a stamp file with dependencies on each of
- // the deps in the group.
- out_ << std::endl << "build ";
- path_output_.WriteFile(out_, helper_.GetTargetOutputFile(target_));
- out_ << ": stamp";
-
- const std::vector<const Target*>& deps = target_->deps();
- for (size_t i = 0; i < deps.size(); i++) {
- out_ << " ";
- path_output_.WriteFile(out_, helper_.GetTargetOutputFile(deps[i]));
- }
-
- const std::vector<const Target*>& datadeps = target_->datadeps();
- for (size_t i = 0; i < datadeps.size(); i++) {
- out_ << " ";
- path_output_.WriteFile(out_, helper_.GetTargetOutputFile(datadeps[i]));
- }
- out_ << std::endl;
-}
diff --git a/chromium/tools/gn/ninja_group_target_writer.h b/chromium/tools/gn/ninja_group_target_writer.h
deleted file mode 100644
index 31625f8f5f4..00000000000
--- a/chromium/tools/gn/ninja_group_target_writer.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 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 TOOLS_GN_NINJA_GROUP_TARGET_WRITER_H_
-#define TOOLS_GN_NINJA_GROUP_TARGET_WRITER_H_
-
-#include "base/compiler_specific.h"
-#include "tools/gn/ninja_target_writer.h"
-
-// Writes a .ninja file for a group target type.
-class NinjaGroupTargetWriter : public NinjaTargetWriter {
- public:
- NinjaGroupTargetWriter(const Target* target, std::ostream& out);
- virtual ~NinjaGroupTargetWriter();
-
- virtual void Run() OVERRIDE;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(NinjaGroupTargetWriter);
-};
-
-#endif // TOOLS_GN_NINJA_GROUP_TARGET_WRITER_H_
diff --git a/chromium/tools/gn/ninja_helper.cc b/chromium/tools/gn/ninja_helper.cc
index b9f15da5766..e4f4082817a 100644
--- a/chromium/tools/gn/ninja_helper.cc
+++ b/chromium/tools/gn/ninja_helper.cc
@@ -109,6 +109,10 @@ OutputFile NinjaHelper::GetOutputFileForSource(
OutputFile NinjaHelper::GetTargetOutputFile(const Target* target) const {
OutputFile ret;
+ if (target->output_type() == Target::NONE) {
+ NOTREACHED();
+ return ret;
+ }
// This is prepended to the output file name.
const char* prefix;
@@ -120,7 +124,7 @@ OutputFile NinjaHelper::GetTargetOutputFile(const Target* target) const {
prefix = "";
const char* extension;
- if (target->output_type() == Target::GROUP ||
+ if (target->output_type() == Target::NONE ||
target->output_type() == Target::COPY_FILES ||
target->output_type() == Target::CUSTOM) {
extension = "stamp";
@@ -135,6 +139,7 @@ OutputFile NinjaHelper::GetTargetOutputFile(const Target* target) const {
// Binaries and loadable libraries go into the toolchain root.
if (target->output_type() == Target::EXECUTABLE ||
+ target->output_type() == Target::LOADABLE_MODULE ||
(target->settings()->IsMac() &&
(target->output_type() == Target::SHARED_LIBRARY ||
target->output_type() == Target::STATIC_LIBRARY)) ||
diff --git a/chromium/tools/gn/ninja_script_target_writer.cc b/chromium/tools/gn/ninja_script_target_writer.cc
deleted file mode 100644
index 44e13c67794..00000000000
--- a/chromium/tools/gn/ninja_script_target_writer.cc
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright (c) 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 "tools/gn/ninja_script_target_writer.h"
-
-#include "base/strings/string_util.h"
-#include "tools/gn/err.h"
-#include "tools/gn/file_template.h"
-#include "tools/gn/string_utils.h"
-#include "tools/gn/target.h"
-
-NinjaScriptTargetWriter::NinjaScriptTargetWriter(const Target* target,
- std::ostream& out)
- : NinjaTargetWriter(target, out) {
-}
-
-NinjaScriptTargetWriter::~NinjaScriptTargetWriter() {
-}
-
-void NinjaScriptTargetWriter::Run() {
- WriteEnvironment();
-
- // Run the script from the dir of the BUILD file. This has no trailing
- // slash.
- const SourceDir& script_cd = target_->label().dir();
- std::string script_cd_to_root = InvertDir(script_cd);
- if (script_cd_to_root.empty()) {
- script_cd_to_root = ".";
- } else {
- // Remove trailing slash
- DCHECK(script_cd_to_root[script_cd_to_root.size() - 1] == '/');
- script_cd_to_root.resize(script_cd_to_root.size() - 1);
- }
- std::string script_relative_to_cd =
- script_cd_to_root + target_->script_values().script().value();
-
- std::string custom_rule_name = WriteRuleDefinition(script_relative_to_cd);
-
- // Precompute the common dependencies for each step. This includes the
- // script itself (changing the script should force a rebuild) and any data
- // files.
- //
- // TODO(brettw) this needs to be re-thought. "data" is supposed to be runtime
- // data (i.e. for tests and such) rather than compile-time dependencies for
- // each target. If we really need this, we need to have a different way to
- // express it.
- //
- // One idea: add an "inputs" variable to specify this kind of thing. We
- // should probably make it an error to specify data but no inputs for a
- // script as a way to catch people doing the wrong way.
- std::ostringstream common_deps_stream;
- path_output_.WriteFile(common_deps_stream, target_->script_values().script());
- const Target::FileList& datas = target_->data();
- for (size_t i = 0; i < datas.size(); i++) {
- common_deps_stream << " ";
- path_output_.WriteFile(common_deps_stream, datas[i]);
- }
- const std::string& common_deps = common_deps_stream.str();
-
- // Collects all output files for writing below.
- std::vector<OutputFile> output_files;
-
- if (!has_sources()) {
- // Write separate rules for each input source file.
- WriteSourceRules(custom_rule_name, common_deps, script_cd,
- script_cd_to_root, &output_files);
- } else {
- // No sources, write a rule that invokes the script once with the
- // outputs as outputs, and the data as inputs.
- out_ << "build";
- const Target::FileList& outputs = target_->script_values().outputs();
- for (size_t i = 0; i < outputs.size(); i++) {
- OutputFile output_path(
- RemovePrefix(outputs[i].value(),
- settings_->build_settings()->build_dir().value()));
- output_files.push_back(output_path);
- out_ << " ";
- path_output_.WriteFile(out_, output_path);
- }
- out_ << ": " << custom_rule_name << " " << common_deps << std::endl;
- }
- out_ << std::endl;
-
- WriteStamp(output_files);
-}
-
-std::string NinjaScriptTargetWriter::WriteRuleDefinition(
- const std::string& script_relative_to_cd) {
- // Make a unique name for this rule.
- std::string target_label = target_->label().GetUserVisibleName(true);
- std::string custom_rule_name(target_label);
- ReplaceChars(custom_rule_name, ":/()", "_", &custom_rule_name);
- custom_rule_name.append("_rule");
-
- // Use a unique name for the response file when there are multiple build
- // steps so that they don't stomp on each other. When there are no sources,
- // there will be only one invocation so we can use a simple name.
- std::string rspfile = custom_rule_name;
- if (has_sources())
- rspfile += ".$unique_name";
- rspfile += ".rsp";
-
- out_ << "rule " << custom_rule_name << std::endl;
- out_ << " command = $pythonpath gyp-win-tool action-wrapper $arch "
- << rspfile << " ";
- path_output_.WriteDir(out_, target_->label().dir(),
- PathOutput::DIR_NO_LAST_SLASH);
- out_ << std::endl;
- out_ << " description = CUSTOM " << target_label << std::endl;
- out_ << " restat = 1" << std::endl;
- out_ << " rspfile = " << rspfile << std::endl;
-
- // The build command goes in the rsp file.
- out_ << " rspfile_content = $pythonpath " << script_relative_to_cd;
- for (size_t i = 0; i < target_->script_values().args().size(); i++) {
- const std::string& arg = target_->script_values().args()[i];
- out_ << " ";
- WriteArg(arg);
- }
- out_ << std::endl;
- return custom_rule_name;
-}
-
-void NinjaScriptTargetWriter::WriteArg(const std::string& arg) {
- // This can be optimized if it's called a lot.
- EscapeOptions options;
- options.mode = ESCAPE_NINJA;
- std::string output_str = EscapeString(arg, options);
-
- // Do this substitution after escaping our our $ will be escaped (which we
- // don't want).
- ReplaceSubstringsAfterOffset(&output_str, 0, FileTemplate::kSource,
- "${source}");
- ReplaceSubstringsAfterOffset(&output_str, 0, FileTemplate::kSourceNamePart,
- "${source_name_part}");
- out_ << output_str;
-}
-
-void NinjaScriptTargetWriter::WriteSourceRules(
- const std::string& custom_rule_name,
- const std::string& common_deps,
- const SourceDir& script_cd,
- const std::string& script_cd_to_root,
- std::vector<OutputFile>* output_files) {
- // Construct the template for generating the output files from each source.
- const Target::FileList& outputs = target_->script_values().outputs();
- std::vector<std::string> output_template_args;
- for (size_t i = 0; i < outputs.size(); i++) {
- // All outputs should be in the output dir.
- output_template_args.push_back(
- RemovePrefix(outputs[i].value(),
- settings_->build_settings()->build_dir().value()));
- }
- FileTemplate output_template(output_template_args);
-
- // Prevent re-allocating each time by initializing outside the loop.
- std::vector<std::string> output_template_result;
-
- // Path output formatter for wrigin source paths passed to the script.
- PathOutput script_source_path_output(script_cd, ESCAPE_SHELL, true);
-
- const Target::FileList& sources = target_->sources();
- for (size_t i = 0; i < sources.size(); i++) {
- // Write outputs for this source file computed by the template.
- out_ << "build";
- output_template.ApplyString(sources[i].value(), &output_template_result);
- for (size_t out_i = 0; out_i < output_template_result.size(); out_i++) {
- OutputFile output_path(output_template_result[out_i]);
- output_files->push_back(output_path);
- out_ << " ";
- path_output_.WriteFile(out_, output_path);
- }
-
- out_ << ": " << custom_rule_name
- << " " << common_deps
- << " ";
- path_output_.WriteFile(out_, sources[i]);
- out_ << std::endl;
-
- out_ << " unique_name = " << i << std::endl;
-
- // The source file here should be relative to the script directory since
- // this is the variable passed to the script. Here we slightly abuse the
- // OutputFile object by putting a non-output-relative path in it to signal
- // that the PathWriter should not prepend directories.
- out_ << " source = ";
- script_source_path_output.WriteFile(out_, sources[i]);
- out_ << std::endl;
-
- out_ << " source_name_part = "
- << FindFilenameNoExtension(&sources[i].value()).as_string()
- << std::endl;
- }
-}
-
-void NinjaScriptTargetWriter::WriteStamp(
- const std::vector<OutputFile>& output_files) {
- out_ << "build ";
- path_output_.WriteFile(out_, helper_.GetTargetOutputFile(target_));
- out_ << ": stamp";
- for (size_t i = 0; i < output_files.size(); i++) {
- out_ << " ";
- path_output_.WriteFile(out_, output_files[i]);
- }
- out_ << std::endl;
-}
diff --git a/chromium/tools/gn/ninja_script_target_writer.h b/chromium/tools/gn/ninja_script_target_writer.h
deleted file mode 100644
index 27ba45d160c..00000000000
--- a/chromium/tools/gn/ninja_script_target_writer.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 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 TOOLS_GN_NINJA_SCRIPT_TARGET_WRITER_H_
-#define TOOLS_GN_NINJA_SCRIPT_TARGET_WRITER_H_
-
-#include "base/compiler_specific.h"
-#include "tools/gn/ninja_target_writer.h"
-
-// Writes a .ninja file for a custom script target type.
-class NinjaScriptTargetWriter : public NinjaTargetWriter {
- public:
- NinjaScriptTargetWriter(const Target* target, std::ostream& out);
- virtual ~NinjaScriptTargetWriter();
-
- virtual void Run() OVERRIDE;
-
- private:
- bool has_sources() const { return !target_->sources().empty(); }
-
- // Writes the Ninja rule for invoking the script.
- //
- // Returns the name of the custom rule generated. This will be based on the
- // target name, and will include the string "$unique_name" if there are
- // multiple inputs.
- std::string WriteRuleDefinition(const std::string& script_relative_to_cd);
-
- // Writes the rules for compiling each source, writing all output files
- // to the given vector.
- //
- // common_deps is a precomputed string of all ninja files that are common
- // to each build step. This is added to each one.
- void WriteSourceRules(const std::string& custom_rule_name,
- const std::string& common_deps,
- const SourceDir& script_cd,
- const std::string& script_cd_to_root,
- std::vector<OutputFile>* output_files);
-
- void WriteArg(const std::string& arg);
-
- // Writes the .stamp rule that names this target and collects all invocations
- // of the script into one thing that other targets can depend on.
- void WriteStamp(const std::vector<OutputFile>& output_files);
-
- DISALLOW_COPY_AND_ASSIGN(NinjaScriptTargetWriter);
-};
-
-#endif // TOOLS_GN_NINJA_SCRIPT_TARGET_WRITER_H_
diff --git a/chromium/tools/gn/ninja_target_writer.cc b/chromium/tools/gn/ninja_target_writer.cc
index 16a2f7d2268..7ff6df0ebd2 100644
--- a/chromium/tools/gn/ninja_target_writer.cc
+++ b/chromium/tools/gn/ninja_target_writer.cc
@@ -8,14 +8,62 @@
#include <sstream>
#include "base/file_util.h"
+#include "base/logging.h"
+#include "base/strings/string_util.h"
+#include "tools/gn/config_values_extractors.h"
#include "tools/gn/err.h"
-#include "tools/gn/ninja_binary_target_writer.h"
-#include "tools/gn/ninja_copy_target_writer.h"
-#include "tools/gn/ninja_group_target_writer.h"
-#include "tools/gn/ninja_script_target_writer.h"
+#include "tools/gn/escape.h"
+#include "tools/gn/file_template.h"
+#include "tools/gn/filesystem_utils.h"
+#include "tools/gn/location.h"
+#include "tools/gn/path_output.h"
#include "tools/gn/scheduler.h"
+#include "tools/gn/string_utils.h"
#include "tools/gn/target.h"
+namespace {
+
+static const char kCustomTargetSourceKey[] = "{{source}}";
+static const char kCustomTargetSourceNamePartKey[] = "{{source_name_part}}";
+
+struct DefineWriter {
+ void operator()(const std::string& s, std::ostream& out) const {
+ out << " -D" << s;
+ }
+};
+
+struct IncludeWriter {
+ IncludeWriter(PathOutput& path_output,
+ const NinjaHelper& h)
+ : helper(h),
+ path_output_(path_output),
+ old_inhibit_quoting_(path_output.inhibit_quoting()) {
+ // Inhibit quoting since we'll put quotes around the whole thing ourselves.
+ // Since we're writing in NINJA escaping mode, this won't actually do
+ // anything, but I think we may need to change to shell-and-then-ninja
+ // escaping for this in the future.
+ path_output_.set_inhibit_quoting(true);
+ }
+ ~IncludeWriter() {
+ path_output_.set_inhibit_quoting(old_inhibit_quoting_);
+ }
+
+ void operator()(const SourceDir& d, std::ostream& out) const {
+ out << " \"-I";
+ // It's important not to include the trailing slash on directories or on
+ // Windows it will be a backslash and the compiler might think we're
+ // escaping the quote!
+ path_output_.WriteDir(out, d, PathOutput::DIR_NO_LAST_SLASH);
+ out << "\"";
+ }
+
+ const NinjaHelper& helper;
+ PathOutput& path_output_;
+ bool old_inhibit_quoting_; // So we can put the PathOutput back.
+};
+
+} // namespace
+
NinjaTargetWriter::NinjaTargetWriter(const Target* target, std::ostream& out)
: settings_(target->settings()),
target_(target),
@@ -28,8 +76,30 @@ NinjaTargetWriter::NinjaTargetWriter(const Target* target, std::ostream& out)
NinjaTargetWriter::~NinjaTargetWriter() {
}
+void NinjaTargetWriter::Run() {
+ // TODO(brettw) have a better way to do the environment setup on Windows.
+ if (target_->settings()->IsWin())
+ out_ << "arch = environment.x86\n";
+
+ if (target_->output_type() == Target::COPY_FILES) {
+ WriteCopyRules();
+ } else if (target_->output_type() == Target::CUSTOM) {
+ WriteCustomRules();
+ } else {
+ WriteCompilerVars();
+
+ std::vector<OutputFile> obj_files;
+ WriteSources(&obj_files);
+
+ WriteLinkerStuff(obj_files);
+ }
+}
+
// static
void NinjaTargetWriter::RunAndWriteFile(const Target* target) {
+ if (target->output_type() == Target::NONE)
+ return;
+
const Settings* settings = target->settings();
NinjaHelper helper(settings->build_settings());
@@ -53,31 +123,496 @@ void NinjaTargetWriter::RunAndWriteFile(const Target* target) {
return;
}
- // Call out to the correct sub-type of writer.
- if (target->output_type() == Target::COPY_FILES) {
- NinjaCopyTargetWriter writer(target, file);
- writer.Run();
- } else if (target->output_type() == Target::CUSTOM) {
- NinjaScriptTargetWriter writer(target, file);
- writer.Run();
- } else if (target->output_type() == Target::GROUP) {
- NinjaGroupTargetWriter writer(target, file);
- writer.Run();
- } else if (target->output_type() == Target::EXECUTABLE ||
- target->output_type() == Target::STATIC_LIBRARY ||
- target->output_type() == Target::SHARED_LIBRARY) {
- NinjaBinaryTargetWriter writer(target, file);
- writer.Run();
- } else {
- CHECK(0);
- }
+ NinjaTargetWriter gen(target, file);
+ gen.Run();
std::string contents = file.str();
file_util::WriteFile(ninja_file, contents.c_str(), contents.size());
}
-void NinjaTargetWriter::WriteEnvironment() {
- // TODO(brettw) have a better way to do the environment setup on Windows.
- if (target_->settings()->IsWin())
- out_ << "arch = environment.x86\n";
+void NinjaTargetWriter::WriteCopyRules() {
+ // The dest dir should be inside the output dir so we can just remove the
+ // prefix and get ninja-relative paths.
+ const std::string& output_dir =
+ settings_->build_settings()->build_dir().value();
+ const std::string& dest_dir = target_->destdir().value();
+ DCHECK(StartsWithASCII(dest_dir, output_dir, true));
+ std::string relative_dest_dir(&dest_dir[output_dir.size()],
+ dest_dir.size() - output_dir.size());
+
+ const Target::FileList& sources = target_->sources();
+ std::vector<OutputFile> dest_files;
+ dest_files.reserve(sources.size());
+
+ // Write out rules for each file copied.
+ for (size_t i = 0; i < sources.size(); i++) {
+ const SourceFile& input_file = sources[i];
+
+ // The files should have the same name but in the dest dir.
+ base::StringPiece name_part = FindFilename(&input_file.value());
+ OutputFile dest_file(relative_dest_dir);
+ AppendStringPiece(&dest_file.value(), name_part);
+
+ dest_files.push_back(dest_file);
+
+ out_ << "build ";
+ path_output_.WriteFile(out_, dest_file);
+ out_ << ": copy ";
+ path_output_.WriteFile(out_, input_file);
+ out_ << std::endl;
+ }
+
+ // Write out the rule for the target to copy all of them.
+ out_ << std::endl << "build ";
+ path_output_.WriteFile(out_, helper_.GetTargetOutputFile(target_));
+ out_ << ": stamp";
+ for (size_t i = 0; i < dest_files.size(); i++) {
+ out_ << " ";
+ path_output_.WriteFile(out_, dest_files[i]);
+ }
+ out_ << std::endl;
+
+ // TODO(brettw) need some kind of stamp file for depending on this, as well
+ // as order_only=prebuild.
+}
+
+void NinjaTargetWriter::WriteCustomRules() {
+ // Make a unique name for this rule.
+ std::string target_label = target_->label().GetUserVisibleName(true);
+ std::string custom_rule_name(target_label);
+ ReplaceChars(custom_rule_name, ":/()", "_", &custom_rule_name);
+ custom_rule_name.append("_rule");
+
+ // Run the script from the dir of the BUILD file. This has no trailing
+ // slash.
+ const SourceDir& script_cd = target_->label().dir();
+ std::string script_cd_to_root = InvertDir(script_cd);
+ if (script_cd_to_root.empty()) {
+ script_cd_to_root = ".";
+ } else {
+ // Remove trailing slash
+ DCHECK(script_cd_to_root[script_cd_to_root.size() - 1] == '/');
+ script_cd_to_root.resize(script_cd_to_root.size() - 1);
+ }
+
+ std::string script_relative_to_cd =
+ script_cd_to_root + target_->script().value();
+
+ bool no_sources = target_->sources().empty();
+
+ // Use a unique name for the response file when there are multiple build
+ // steps so that they don't stomp on each other.
+ std::string rspfile = custom_rule_name;
+ if (!no_sources)
+ rspfile += ".$unique_name";
+ rspfile += ".rsp";
+
+ // First write the custom rule.
+ out_ << "rule " << custom_rule_name << std::endl;
+ out_ << " command = $pythonpath gyp-win-tool action-wrapper $arch "
+ << rspfile << " ";
+ path_output_.WriteDir(out_, script_cd, PathOutput::DIR_NO_LAST_SLASH);
+ out_ << std::endl;
+ out_ << " description = CUSTOM " << target_label << std::endl;
+ out_ << " restat = 1" << std::endl;
+ out_ << " rspfile = " << rspfile << std::endl;
+
+ // The build command goes in the rsp file.
+ out_ << " rspfile_content = $pythonpath " << script_relative_to_cd;
+ for (size_t i = 0; i < target_->script_args().size(); i++) {
+ const std::string& arg = target_->script_args()[i];
+ out_ << " ";
+ WriteCustomArg(arg);
+ }
+ out_ << std::endl << std::endl;
+
+ // Precompute the common dependencies for each step. This includes the
+ // script itself (changing the script should force a rebuild) and any data
+ // files.
+ //
+ // TODO(brettW) this needs to be re-thought. "data" is supposed to be runtime
+ // data (i.e. for tests and such) rather than compile-time dependencies for
+ // each target. If we really need this, we need to have a different way to
+ // express it.
+ //
+ // One idea: add an "inputs" variable to specify this kind of thing. We
+ // should probably make it an error to specify data but no inputs for a
+ // script as a way to catch people doing the wrong way.
+ std::ostringstream common_deps_stream;
+ path_output_.WriteFile(common_deps_stream, target_->script());
+ const Target::FileList& datas = target_->data();
+ for (size_t i = 0; i < datas.size(); i++) {
+ common_deps_stream << " ";
+ path_output_.WriteFile(common_deps_stream, datas[i]);
+ }
+ const std::string& common_deps = common_deps_stream.str();
+
+ // Collects all output files for writing below.
+ std::vector<OutputFile> output_files;
+
+ if (no_sources) {
+ // No sources, write a rule that invokes the script once with the
+ // outputs as outputs, and the data as inputs.
+ out_ << "build";
+ const Target::FileList& outputs = target_->outputs();
+ for (size_t i = 0; i < outputs.size(); i++) {
+ OutputFile output_path(
+ RemovePrefix(outputs[i].value(),
+ settings_->build_settings()->build_dir().value()));
+ output_files.push_back(output_path);
+ out_ << " ";
+ path_output_.WriteFile(out_, output_path);
+ }
+ out_ << ": " << custom_rule_name << " " << common_deps << std::endl;
+ } else {
+ // Write separate rules for each input source file.
+ WriteCustomSourceRules(custom_rule_name, common_deps, script_cd,
+ script_cd_to_root, &output_files);
+ }
+ out_ << std::endl;
+
+ // Last write a stamp rule to collect all outputs.
+ out_ << "build ";
+ path_output_.WriteFile(out_, helper_.GetTargetOutputFile(target_));
+ out_ << ": stamp";
+ for (size_t i = 0; i < output_files.size(); i++) {
+ out_ << " ";
+ path_output_.WriteFile(out_, output_files[i]);
+ }
+ out_ << std::endl;
+}
+
+void NinjaTargetWriter::WriteCustomArg(const std::string& arg) {
+ // This can be optimized if it's called a lot.
+ EscapeOptions options;
+ options.mode = ESCAPE_NINJA;
+ std::string output_str = EscapeString(arg, options);
+
+ // Do this substitution after escaping our our $ will be escaped (which we
+ // don't want).
+ ReplaceSubstringsAfterOffset(&output_str, 0, FileTemplate::kSource,
+ "${source}");
+ ReplaceSubstringsAfterOffset(&output_str, 0, FileTemplate::kSourceNamePart,
+ "${source_name_part}");
+ out_ << output_str;
+}
+
+void NinjaTargetWriter::WriteCustomSourceRules(
+ const std::string& custom_rule_name,
+ const std::string& common_deps,
+ const SourceDir& script_cd,
+ const std::string& script_cd_to_root,
+ std::vector<OutputFile>* output_files) {
+ // Construct the template for generating the output files from each source.
+ const Target::FileList& outputs = target_->outputs();
+ std::vector<std::string> output_template_args;
+ for (size_t i = 0; i < outputs.size(); i++) {
+ // All outputs should be in the output dir.
+ output_template_args.push_back(
+ RemovePrefix(outputs[i].value(),
+ settings_->build_settings()->build_dir().value()));
+ }
+ FileTemplate output_template(output_template_args);
+
+ // Prevent re-allocating each time by initializing outside the loop.
+ std::vector<std::string> output_template_result;
+
+ // Path output formatter for wrigin source paths passed to the script.
+ PathOutput script_source_path_output(script_cd, ESCAPE_SHELL, true);
+
+ const Target::FileList& sources = target_->sources();
+ for (size_t i = 0; i < sources.size(); i++) {
+ // Write outputs for this source file computed by the template.
+ out_ << "build";
+ output_template.ApplyString(sources[i].value(), &output_template_result);
+ for (size_t out_i = 0; out_i < output_template_result.size(); out_i++) {
+ OutputFile output_path(output_template_result[out_i]);
+ output_files->push_back(output_path);
+ out_ << " ";
+ path_output_.WriteFile(out_, output_path);
+ }
+
+ out_ << ": " << custom_rule_name
+ << " " << common_deps
+ << " ";
+ path_output_.WriteFile(out_, sources[i]);
+ out_ << std::endl;
+
+ out_ << " unique_name = " << i << std::endl;
+
+ // The source file here should be relative to the script directory since
+ // this is the variable passed to the script. Here we slightly abuse the
+ // OutputFile object by putting a non-output-relative path in it to signal
+ // that the PathWriter should not prepend directories.
+ out_ << " source = ";
+ script_source_path_output.WriteFile(out_, sources[i]);
+ out_ << std::endl;
+
+ out_ << " source_name_part = "
+ << FindFilenameNoExtension(&sources[i].value()).as_string()
+ << std::endl;
+ }
+}
+
+void NinjaTargetWriter::WriteCompilerVars() {
+ // Defines.
+ out_ << "defines =";
+ RecursiveTargetConfigToStream(target_, &ConfigValues::defines,
+ DefineWriter(), out_);
+ out_ << std::endl;
+
+ // Includes.
+ out_ << "includes =";
+ RecursiveTargetConfigToStream(target_, &ConfigValues::includes,
+ IncludeWriter(path_output_, helper_), out_);
+
+ out_ << std::endl;
+
+ // C flags and friends.
+#define WRITE_FLAGS(name) \
+ out_ << #name " ="; \
+ RecursiveTargetConfigStringsToStream(target_, &ConfigValues::name, out_); \
+ out_ << std::endl;
+
+ WRITE_FLAGS(cflags)
+ WRITE_FLAGS(cflags_c)
+ WRITE_FLAGS(cflags_cc)
+ WRITE_FLAGS(cflags_objc)
+ WRITE_FLAGS(cflags_objcc)
+
+#undef WRITE_FLAGS
+
+ out_ << std::endl;
+}
+
+void NinjaTargetWriter::WriteSources(
+ std::vector<OutputFile>* object_files) {
+ const Target::FileList& sources = target_->sources();
+ object_files->reserve(sources.size());
+
+ for (size_t i = 0; i < sources.size(); i++) {
+ const SourceFile& input_file = sources[i];
+
+ SourceFileType input_file_type = GetSourceFileType(input_file,
+ settings_->target_os());
+ if (input_file_type == SOURCE_UNKNOWN)
+ continue; // Skip unknown file types.
+ const char* command = GetCommandForSourceType(input_file_type);
+ if (!command)
+ continue; // Skip files not needing compilation.
+
+ OutputFile output_file = helper_.GetOutputFileForSource(
+ target_, input_file, input_file_type);
+ object_files->push_back(output_file);
+
+ out_ << "build ";
+ path_output_.WriteFile(out_, output_file);
+ out_ << ": " << command << " ";
+ path_output_.WriteFile(out_, input_file);
+ out_ << std::endl;
+ }
+ out_ << std::endl;
+}
+
+void NinjaTargetWriter::WriteLinkerStuff(
+ const std::vector<OutputFile>& object_files) {
+ // Manifest file on Windows.
+ // TODO(brettw) this seems not to be necessary for static libs, skip in
+ // that case?
+ OutputFile windows_manifest;
+ if (settings_->IsWin()) {
+ windows_manifest.value().assign(helper_.GetTargetOutputDir(target_));
+ windows_manifest.value().append(target_->label().name());
+ windows_manifest.value().append(".intermediate.manifest");
+ out_ << "manifests = ";
+ path_output_.WriteFile(out_, windows_manifest);
+ out_ << std::endl;
+ }
+
+ // Linker flags, append manifest flag on Windows to reference our file.
+ out_ << "ldflags =";
+ RecursiveTargetConfigStringsToStream(target_, &ConfigValues::ldflags, out_);
+ // HACK ERASEME BRETTW FIXME
+ if (settings_->IsWin()) {
+ out_ << " /MANIFEST /ManifestFile:";
+ path_output_.WriteFile(out_, windows_manifest);
+ out_ << " /DEBUG /MACHINE:X86 /LIBPATH:\"C:\\Program Files (x86)\\Windows Kits\\8.0\\Lib\\win8\\um\\x86\" /DELAYLOAD:dbghelp.dll /DELAYLOAD:dwmapi.dll /DELAYLOAD:shell32.dll /DELAYLOAD:uxtheme.dll /safeseh /dynamicbase /ignore:4199 /ignore:4221 /nxcompat /SUBSYSTEM:CONSOLE /INCREMENTAL /FIXED:NO /DYNAMICBASE:NO wininet.lib dnsapi.lib version.lib msimg32.lib ws2_32.lib usp10.lib psapi.lib dbghelp.lib winmm.lib shlwapi.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib user32.lib uuid.lib odbc32.lib odbccp32.lib delayimp.lib /NXCOMPAT";
+ }
+ out_ << std::endl;
+
+ // Libraries to link.
+ out_ << "libs =";
+ if (settings_->IsMac()) {
+ // TODO(brettw) fix this.
+ out_ << " -framework AppKit -framework ApplicationServices -framework Carbon -framework CoreFoundation -framework Foundation -framework IOKit -framework Security";
+ }
+ out_ << std::endl;
+
+ // The external output file is the one that other libs depend on.
+ OutputFile external_output_file = helper_.GetTargetOutputFile(target_);
+
+ // The internal output file is the "main thing" we think we're making. In
+ // the case of shared libraries, this is the shared library and the external
+ // output file is the import library. In other cases, the internal one and
+ // the external one are the same.
+ OutputFile internal_output_file;
+ if (target_->output_type() == Target::SHARED_LIBRARY) {
+ if (settings_->IsWin()) {
+ internal_output_file = OutputFile(target_->label().name() + ".dll");
+ } else {
+ internal_output_file = external_output_file;
+ }
+ } else {
+ internal_output_file = external_output_file;
+ }
+
+ // In Python see "self.ninja.build(output, command, input,"
+ WriteLinkCommand(external_output_file, internal_output_file, object_files);
+
+ if (target_->output_type() == Target::SHARED_LIBRARY) {
+ out_ << " soname = ";
+ path_output_.WriteFile(out_, internal_output_file);
+ out_ << std::endl;
+
+ out_ << " lib = ";
+ path_output_.WriteFile(out_, internal_output_file);
+ out_ << std::endl;
+
+ out_ << " dll = ";
+ path_output_.WriteFile(out_, internal_output_file);
+ out_ << std::endl;
+
+ if (settings_->IsWin()) {
+ out_ << " implibflag = /IMPLIB:";
+ path_output_.WriteFile(out_, external_output_file);
+ out_ << std::endl;
+ }
+
+ // TODO(brettw) postbuild steps.
+ if (settings_->IsMac())
+ out_ << " postbuilds = $ && (export BUILT_PRODUCTS_DIR=/Users/brettw/prj/src/out/gn; export CONFIGURATION=Debug; export DYLIB_INSTALL_NAME_BASE=@rpath; export EXECUTABLE_NAME=libbase.dylib; export EXECUTABLE_PATH=libbase.dylib; export FULL_PRODUCT_NAME=libbase.dylib; export LD_DYLIB_INSTALL_NAME=@rpath/libbase.dylib; export MACH_O_TYPE=mh_dylib; export PRODUCT_NAME=base; export PRODUCT_TYPE=com.apple.product-type.library.dynamic; export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk; export SRCROOT=/Users/brettw/prj/src/out/gn/../../base; export SOURCE_ROOT=\"$${SRCROOT}\"; export TARGET_BUILD_DIR=/Users/brettw/prj/src/out/gn; export TEMP_DIR=\"$${TMPDIR}\"; (cd ../../base && ../build/mac/strip_from_xcode); G=$$?; ((exit $$G) || rm -rf libbase.dylib) && exit $$G)";
+ }
+
+ out_ << std::endl;
+}
+
+void NinjaTargetWriter::WriteLinkCommand(
+ const OutputFile& external_output_file,
+ const OutputFile& internal_output_file,
+ const std::vector<OutputFile>& object_files) {
+ out_ << "build ";
+ path_output_.WriteFile(out_, internal_output_file);
+ if (external_output_file != internal_output_file) {
+ out_ << " ";
+ path_output_.WriteFile(out_, external_output_file);
+ }
+ out_ << ": " << GetCommandForTargetType();
+
+ // Object files.
+ for (size_t i = 0; i < object_files.size(); i++) {
+ out_ << " ";
+ path_output_.WriteFile(out_, object_files[i]);
+ }
+
+ // Library inputs (deps and inherited static libraries).
+ //
+ // Static libraries since they're just a collection of the object files so
+ // don't need libraries linked with them, but we still need to go through
+ // the list and find non-linkable data deps in the "deps" section. We'll
+ // collect all non-linkable deps and put it in the order-only deps below.
+ std::vector<const Target*> extra_data_deps;
+ const std::vector<const Target*>& deps = target_->deps();
+ const std::set<const Target*>& inherited = target_->inherited_libraries();
+ for (size_t i = 0; i < deps.size(); i++) {
+ if (inherited.find(deps[i]) != inherited.end())
+ continue;
+ if (target_->output_type() != Target::STATIC_LIBRARY &&
+ deps[i]->IsLinkable()) {
+ out_ << " ";
+ path_output_.WriteFile(out_, helper_.GetTargetOutputFile(deps[i]));
+ } else {
+ extra_data_deps.push_back(deps[i]);
+ }
+ }
+ for (std::set<const Target*>::const_iterator i = inherited.begin();
+ i != inherited.end(); ++i) {
+ if (target_->output_type() == Target::STATIC_LIBRARY) {
+ extra_data_deps.push_back(*i);
+ } else {
+ out_ << " ";
+ path_output_.WriteFile(out_, helper_.GetTargetOutputFile(*i));
+ }
+ }
+
+ // Append data dependencies as order-only dependencies.
+ const std::vector<const Target*>& datadeps = target_->datadeps();
+ const std::vector<SourceFile>& data = target_->data();
+ if (!extra_data_deps.empty() || !datadeps.empty() || !data.empty()) {
+ out_ << " ||";
+
+ // Non-linkable deps in the deps section above.
+ for (size_t i = 0; i < extra_data_deps.size(); i++) {
+ out_ << " ";
+ path_output_.WriteFile(out_,
+ helper_.GetTargetOutputFile(extra_data_deps[i]));
+ }
+
+ // Data deps.
+ for (size_t i = 0; i < datadeps.size(); i++) {
+ out_ << " ";
+ path_output_.WriteFile(out_, helper_.GetTargetOutputFile(datadeps[i]));
+ }
+
+ // Data files.
+ const std::vector<SourceFile>& data = target_->data();
+ for (size_t i = 0; i < data.size(); i++) {
+ out_ << " ";
+ path_output_.WriteFile(out_, data[i]);
+ }
+ }
+
+ out_ << std::endl;
+}
+
+const char* NinjaTargetWriter::GetCommandForSourceType(
+ SourceFileType type) const {
+ if (type == SOURCE_C)
+ return "cc";
+ if (type == SOURCE_CC)
+ return "cxx";
+
+ // TODO(brettw) asm files.
+
+ if (settings_->IsMac()) {
+ if (type == SOURCE_M)
+ return "objc";
+ if (type == SOURCE_MM)
+ return "objcxx";
+ }
+
+ if (settings_->IsWin()) {
+ if (type == SOURCE_RC)
+ return "rc";
+ }
+
+ // TODO(brettw) stuff about "S" files on non-Windows.
+ return NULL;
+}
+
+const char* NinjaTargetWriter::GetCommandForTargetType() const {
+ if (target_->output_type() == Target::NONE) {
+ NOTREACHED();
+ return "";
+ }
+
+ if (target_->output_type() == Target::STATIC_LIBRARY) {
+ // TODO(brettw) stuff about standalong static libraryes on Unix in
+ // WriteTarget in the Python one, and lots of postbuild steps.
+ return "alink";
+ }
+
+ if (target_->output_type() == Target::SHARED_LIBRARY)
+ return "solink";
+
+ return "link";
}
diff --git a/chromium/tools/gn/ninja_target_writer.h b/chromium/tools/gn/ninja_target_writer.h
index 087a8b82117..076f8b3e7f7 100644
--- a/chromium/tools/gn/ninja_target_writer.h
+++ b/chromium/tools/gn/ninja_target_writer.h
@@ -22,14 +22,42 @@ class Target;
class NinjaTargetWriter {
public:
NinjaTargetWriter(const Target* target, std::ostream& out);
- virtual ~NinjaTargetWriter();
+ ~NinjaTargetWriter();
+
+ void Run();
static void RunAndWriteFile(const Target* target);
- virtual void Run() = 0;
+ private:
+ void WriteCopyRules();
+
+ void WriteCustomRules();
+ void WriteCustomArg(const std::string& arg);
+
+ // Writs the rules for compiling each source, writing all output files
+ // to the given vector.
+ //
+ // common_deps is a precomputed string of all ninja files that are common
+ // to each build step. This is added to each one.
+ void WriteCustomSourceRules(const std::string& custom_rule_name,
+ const std::string& common_deps,
+ const SourceDir& script_cd,
+ const std::string& script_cd_to_root,
+ std::vector<OutputFile>* output_files);
+
+ void WriteCompilerVars();
+ void WriteSources(std::vector<OutputFile>* object_files);
+ void WriteLinkerStuff(const std::vector<OutputFile>& object_files);
- protected:
- void WriteEnvironment();
+ // Writes the build line for linking the target. Includes newline.
+ void WriteLinkCommand(const OutputFile& external_output_file,
+ const OutputFile& internal_output_file,
+ const std::vector<OutputFile>& object_files);
+
+ // Returns NULL if the source type should not be compiled on this target.
+ const char* GetCommandForSourceType(SourceFileType type) const;
+
+ const char* GetCommandForTargetType() const;
const Settings* settings_; // Non-owning.
const Target* target_; // Non-owning.
@@ -38,9 +66,6 @@ class NinjaTargetWriter {
NinjaHelper helper_;
- private:
- void WriteCopyRules();
-
DISALLOW_COPY_AND_ASSIGN(NinjaTargetWriter);
};
diff --git a/chromium/tools/gn/ninja_toolchain_writer.cc b/chromium/tools/gn/ninja_toolchain_writer.cc
index 8dd2175c469..0e38b8c3fc9 100644
--- a/chromium/tools/gn/ninja_toolchain_writer.cc
+++ b/chromium/tools/gn/ninja_toolchain_writer.cc
@@ -84,9 +84,11 @@ void NinjaToolchainWriter::WriteRules() {
void NinjaToolchainWriter::WriteSubninjas() {
for (size_t i = 0; i < targets_.size(); i++) {
- out_ << "subninja ";
- path_output_.WriteFile(out_, helper_.GetNinjaFileForTarget(targets_[i]));
- out_ << std::endl;
+ if (targets_[i]->output_type() != Target::NONE) {
+ out_ << "subninja ";
+ path_output_.WriteFile(out_, helper_.GetNinjaFileForTarget(targets_[i]));
+ out_ << std::endl;
+ }
}
out_ << std::endl;
}
diff --git a/chromium/tools/gn/scheduler.cc b/chromium/tools/gn/scheduler.cc
index 05dd76fd60c..33c8f1a4463 100644
--- a/chromium/tools/gn/scheduler.cc
+++ b/chromium/tools/gn/scheduler.cc
@@ -77,12 +77,12 @@ void Scheduler::ScheduleTargetFileWrite(const Target* target) {
base::SequencedWorkerPool::BLOCK_SHUTDOWN);
}
-void Scheduler::AddGenDependency(const base::FilePath& file) {
+void Scheduler::AddGenDependency(const SourceFile& source_file) {
base::AutoLock lock(lock_);
- gen_dependencies_.push_back(file);
+ gen_dependencies_.push_back(source_file);
}
-std::vector<base::FilePath> Scheduler::GetGenDependencies() const {
+std::vector<SourceFile> Scheduler::GetGenDependencies() const {
base::AutoLock lock(lock_);
return gen_dependencies_;
}
diff --git a/chromium/tools/gn/scheduler.h b/chromium/tools/gn/scheduler.h
index 4b2c0608742..eab996da696 100644
--- a/chromium/tools/gn/scheduler.h
+++ b/chromium/tools/gn/scheduler.h
@@ -7,7 +7,6 @@
#include "base/atomic_ref_count.h"
#include "base/basictypes.h"
-#include "base/files/file_path.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/synchronization/lock.h"
@@ -47,8 +46,8 @@ class Scheduler {
// TODO(brettw) this is global rather than per-BuildSettings. If we
// start using >1 build settings, then we probably want this to take a
// BuildSettings object so we know the depdency on a per-build basis.
- void AddGenDependency(const base::FilePath& file);
- std::vector<base::FilePath> GetGenDependencies() const;
+ void AddGenDependency(const SourceFile& source_file);
+ std::vector<SourceFile> GetGenDependencies() const;
// We maintain a count of the things we need to do that works like a
// refcount. When this reaches 0, the program exits.
@@ -80,7 +79,7 @@ class Scheduler {
bool is_failed_;
// Additional input dependencies. Protected by the lock.
- std::vector<base::FilePath> gen_dependencies_;
+ std::vector<SourceFile> gen_dependencies_;
DISALLOW_COPY_AND_ASSIGN(Scheduler);
};
diff --git a/chromium/tools/gn/scope_per_file_provider.cc b/chromium/tools/gn/scope_per_file_provider.cc
index 87f921cb67e..acb1b3c161b 100644
--- a/chromium/tools/gn/scope_per_file_provider.cc
+++ b/chromium/tools/gn/scope_per_file_provider.cc
@@ -29,8 +29,6 @@ const Value* ScopePerFileProvider::GetProgrammaticValue(
if (ident == variables::kPythonPath)
return GetPythonPath();
- if (ident == variables::kRelativeBuildToSourceRootDir)
- return GetRelativeBuildToSourceRootDir();
if (ident == variables::kRelativeRootOutputDir)
return GetRelativeRootOutputDir();
if (ident == variables::kRelativeRootGenDir)
@@ -69,16 +67,6 @@ const Value* ScopePerFileProvider::GetPythonPath() {
return python_path_.get();
}
-const Value* ScopePerFileProvider::GetRelativeBuildToSourceRootDir() {
- if (!relative_build_to_source_root_dir_) {
- const SourceDir& build_dir =
- scope_->settings()->build_settings()->build_dir();
- relative_build_to_source_root_dir_.reset(
- new Value(NULL, InvertDirWithNoLastSlash(build_dir)));
- }
- return relative_build_to_source_root_dir_.get();
-}
-
const Value* ScopePerFileProvider::GetRelativeRootOutputDir() {
if (!relative_root_output_dir_) {
relative_root_output_dir_.reset(new Value(NULL,
@@ -138,13 +126,7 @@ std::string ScopePerFileProvider::GetFileDirWithNoLastSlash() const {
}
std::string ScopePerFileProvider::GetRelativeRootWithNoLastSlash() const {
- return InvertDirWithNoLastSlash(source_file_.GetDir());
-}
-
-// static
-std::string ScopePerFileProvider::InvertDirWithNoLastSlash(
- const SourceDir& dir) {
- std::string inverted = InvertDir(dir);
+ std::string inverted = InvertDir(source_file_.GetDir());
if (inverted.empty())
return ".";
return inverted.substr(0, inverted.size() - 1);
diff --git a/chromium/tools/gn/scope_per_file_provider.h b/chromium/tools/gn/scope_per_file_provider.h
index 9b6bb3477eb..c6d6537671e 100644
--- a/chromium/tools/gn/scope_per_file_provider.h
+++ b/chromium/tools/gn/scope_per_file_provider.h
@@ -25,7 +25,6 @@ class ScopePerFileProvider : public Scope::ProgrammaticProvider {
const Value* GetCurrentToolchain();
const Value* GetDefaultToolchain();
const Value* GetPythonPath();
- const Value* GetRelativeBuildToSourceRootDir();
const Value* GetRelativeRootOutputDir();
const Value* GetRelativeRootGenDir();
const Value* GetRelativeTargetOutputDir();
@@ -37,17 +36,12 @@ class ScopePerFileProvider : public Scope::ProgrammaticProvider {
std::string GetFileDirWithNoLastSlash() const;
std::string GetRelativeRootWithNoLastSlash() const;
- // Inverts the given directory, returning it with no trailing slash. If the
- // result would be empty, "." is returned to indicate the current dir.
- static std::string InvertDirWithNoLastSlash(const SourceDir& dir);
-
SourceFile source_file_;
// All values are lazily created.
scoped_ptr<Value> current_toolchain_;
scoped_ptr<Value> default_toolchain_;
scoped_ptr<Value> python_path_;
- scoped_ptr<Value> relative_build_to_source_root_dir_;
scoped_ptr<Value> relative_root_output_dir_;
scoped_ptr<Value> relative_root_gen_dir_;
scoped_ptr<Value> relative_target_output_dir_;
diff --git a/chromium/tools/gn/script_target_generator.cc b/chromium/tools/gn/script_target_generator.cc
deleted file mode 100644
index 58243d5df4f..00000000000
--- a/chromium/tools/gn/script_target_generator.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) 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 "tools/gn/script_target_generator.h"
-
-#include "tools/gn/err.h"
-#include "tools/gn/filesystem_utils.h"
-#include "tools/gn/scope.h"
-#include "tools/gn/value.h"
-#include "tools/gn/value_extractors.h"
-
-ScriptTargetGenerator::ScriptTargetGenerator(Target* target,
- Scope* scope,
- const Token& function_token,
- Err* err)
- : TargetGenerator(target, scope, function_token, err) {
-}
-
-ScriptTargetGenerator::~ScriptTargetGenerator() {
-}
-
-void ScriptTargetGenerator::DoRun() {
- target_->set_output_type(Target::CUSTOM);
-
- FillSources();
- FillScript();
- FillScriptArgs();
- FillOutputs();
-
- // Script outputs don't depend on the current toolchain so we can skip adding
- // that dependency.
-}
-
-void ScriptTargetGenerator::FillScript() {
- // If this gets called, the target type requires a script, so error out
- // if it doesn't have one.
- // TODO(brettw) hook up a constant in variables.h
- const Value* value = scope_->GetValue("script", true);
- if (!value) {
- *err_ = Err(function_token_, "This target type requires a \"script\".");
- return;
- }
- if (!value->VerifyTypeIs(Value::STRING, err_))
- return;
-
- target_->script_values().set_script(
- input_directory_.ResolveRelativeFile(value->string_value()));
-}
-
-void ScriptTargetGenerator::FillScriptArgs() {
- const Value* value = scope_->GetValue("args", true);
- if (!value)
- return;
-
- std::vector<std::string> args;
- if (!ExtractListOfStringValues(*value, &args, err_))
- return;
- target_->script_values().swap_in_args(&args);
-}
-
-void ScriptTargetGenerator::FillOutputs() {
- // TODO(brettw) hook up a constant in variables.h
- const Value* value = scope_->GetValue("outputs", true);
- if (!value)
- return;
-
- Target::FileList outputs;
- if (!ExtractListOfRelativeFiles(*value, input_directory_, &outputs, err_))
- return;
-
- // Validate that outputs are in the output dir.
- CHECK(outputs.size() == value->list_value().size());
- for (size_t i = 0; i < outputs.size(); i++) {
- if (!EnsureStringIsInOutputDir(
- GetBuildSettings()->build_dir(),
- outputs[i].value(), value->list_value()[i], err_))
- return;
- }
- target_->script_values().swap_in_outputs(&outputs);
-}
-
diff --git a/chromium/tools/gn/script_target_generator.h b/chromium/tools/gn/script_target_generator.h
deleted file mode 100644
index c5e18111dba..00000000000
--- a/chromium/tools/gn/script_target_generator.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 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 TOOLS_GN_SCRIPT_TARGET_GENERATOR_H_
-#define TOOLS_GN_SCRIPT_TARGET_GENERATOR_H_
-
-#include "base/compiler_specific.h"
-#include "tools/gn/target_generator.h"
-
-// Populates a Target with the values from a custom script rule.
-class ScriptTargetGenerator : public TargetGenerator {
- public:
- ScriptTargetGenerator(Target* target,
- Scope* scope,
- const Token& function_token,
- Err* err);
- virtual ~ScriptTargetGenerator();
-
- protected:
- virtual void DoRun() OVERRIDE;
-
- private:
- void FillScript();
- void FillScriptArgs();
- void FillOutputs();
-
- DISALLOW_COPY_AND_ASSIGN(ScriptTargetGenerator);
-};
-
-#endif // TOOLS_GN_SCRIPT_TARGET_GENERATOR_H_
-
diff --git a/chromium/tools/gn/script_values.cc b/chromium/tools/gn/script_values.cc
deleted file mode 100644
index c5d7989f3f1..00000000000
--- a/chromium/tools/gn/script_values.cc
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 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 "tools/gn/script_values.h"
-
-ScriptValues::ScriptValues() {
-}
-
-ScriptValues::~ScriptValues() {
-}
diff --git a/chromium/tools/gn/script_values.h b/chromium/tools/gn/script_values.h
deleted file mode 100644
index 4a874b9e065..00000000000
--- a/chromium/tools/gn/script_values.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 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 TOOLS_GN_SCRIPT_VALUES_H_
-#define TOOLS_GN_SCRIPT_VALUES_H_
-
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "tools/gn/source_file.h"
-
-// Holds the values (outputs, args, script name, etc.) for a script-based
-// target.
-class ScriptValues {
- public:
- ScriptValues();
- ~ScriptValues();
-
- // Filename of the script to execute.
- const SourceFile& script() const { return script_; }
- void set_script(const SourceFile& s) { script_ = s; }
-
- // Arguments to the script.
- const std::vector<std::string>& args() const { return args_; }
- void swap_in_args(std::vector<std::string>* a) { args_.swap(*a); }
-
- // Files created by the script.
- const std::vector<SourceFile>& outputs() const { return outputs_; }
- void swap_in_outputs(std::vector<SourceFile>* op) { outputs_.swap(*op); }
-
- private:
- SourceFile script_;
- std::vector<std::string> args_;
- std::vector<SourceFile> outputs_;
-
- DISALLOW_COPY_AND_ASSIGN(ScriptValues);
-};
-
-#endif // TOOLS_GN_SCRIPT_VALUES_H_
diff --git a/chromium/tools/gn/secondary/BUILD.gn b/chromium/tools/gn/secondary/BUILD.gn
index 5f7c1b53c37..2039b8297fe 100644
--- a/chromium/tools/gn/secondary/BUILD.gn
+++ b/chromium/tools/gn/secondary/BUILD.gn
@@ -1,10 +1,6 @@
-# Copyright (c) 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.
-
-group("root") {
- deps = [
- "//tools/gn",
- "//ipc",
- ]
-}
+group("root") {
+ deps = [
+ "//tools/gn",
+ "//ipc",
+ ]
+}
diff --git a/chromium/tools/gn/secondary/base/BUILD.gn b/chromium/tools/gn/secondary/base/BUILD.gn
index 2fe83ef62d4..c0013bb0c3e 100644
--- a/chromium/tools/gn/secondary/base/BUILD.gn
+++ b/chromium/tools/gn/secondary/base/BUILD.gn
@@ -1,990 +1,967 @@
-# Copyright (c) 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.
-
-config("base_libs") {
- if (!is_win) {
- ldflags = [ "-ldl" ]
- }
-}
-
-component("base") {
- sources = [
- "../build/build_config.h",
- "third_party/dmg_fp/dmg_fp.h",
- "third_party/dmg_fp/g_fmt.cc",
- "third_party/dmg_fp/dtoa_wrapper.cc",
- "third_party/icu/icu_utf.cc",
- "third_party/icu/icu_utf.h",
- "allocator/allocator_extension.cc",
- "allocator/allocator_extension.h",
- "allocator/type_profiler_control.cc",
- "allocator/type_profiler_control.h",
- "android/activity_status.cc",
- "android/activity_status.h",
- "android/base_jni_registrar.cc",
- "android/base_jni_registrar.h",
- "android/build_info.cc",
- "android/build_info.h",
- "android/cpu_features.cc",
- "android/fifo_utils.cc",
- "android/fifo_utils.h",
- "android/important_file_writer_android.cc",
- "android/important_file_writer_android.h",
- "android/scoped_java_ref.cc",
- "android/scoped_java_ref.h",
- "android/jni_android.cc",
- "android/jni_android.h",
- "android/jni_array.cc",
- "android/jni_array.h",
- "android/jni_helper.cc",
- "android/jni_helper.h",
- "android/jni_registrar.cc",
- "android/jni_registrar.h",
- "android/jni_string.cc",
- "android/jni_string.h",
- "android/memory_pressure_listener_android.cc",
- "android/memory_pressure_listener_android.h",
- "android/path_service_android.cc",
- "android/path_service_android.h",
- "android/path_utils.cc",
- "android/path_utils.h",
- "android/sys_utils.cc",
- "android/sys_utils.h",
- "android/thread_utils.h",
- "at_exit.cc",
- "at_exit.h",
- "atomic_ref_count.h",
- "atomic_sequence_num.h",
- "atomicops.h",
- "atomicops_internals_gcc.h",
- "atomicops_internals_mac.h",
- "atomicops_internals_tsan.h",
- "atomicops_internals_x86_gcc.cc",
- "atomicops_internals_x86_gcc.h",
- "atomicops_internals_x86_msvc.h",
- "base_export.h",
- "base_paths.cc",
- "base_paths.h",
- "base_paths_android.cc",
- "base_paths_android.h",
- "base_paths_mac.h",
- "base_paths_mac.mm",
- "base_paths_posix.cc",
- "base_paths_posix.h",
- "base_paths_win.cc",
- "base_paths_win.h",
- "base_switches.h",
- "base64.cc",
- "base64.h",
- "basictypes.h",
- "bind.h",
- "bind_helpers.cc",
- "bind_helpers.h",
- "bind_internal.h",
- "bind_internal_win.h",
- "bits.h",
- "build_time.cc",
- "build_time.h",
- "callback.h",
- "callback_helpers.h",
- "callback_internal.cc",
- "callback_internal.h",
- "cancelable_callback.h",
- "chromeos/chromeos_version.cc",
- "chromeos/chromeos_version.h",
- "command_line.cc",
- "command_line.h",
- "compiler_specific.h",
- "containers/hash_tables.h",
- "containers/linked_list.h",
- "containers/mru_cache.h",
- "containers/small_map.h",
- "containers/stack_container.h",
- "cpu.cc",
- "cpu.h",
- "critical_closure.h",
- "critical_closure_ios.mm",
- "debug/alias.cc",
- "debug/alias.h",
- "debug/crash_logging.cc",
- "debug/crash_logging.h",
- "debug/debug_on_start_win.cc",
- "debug/debug_on_start_win.h",
- "debug/debugger.cc",
- "debug/debugger.h",
- "debug/debugger_posix.cc",
- "debug/debugger_win.cc",
- # This file depends on files from the "allocator" target,
- # but this target does not depend on "allocator" (see
- # allocator.gyp for details).
- "debug/leak_annotations.h",
- "debug/leak_tracker.h",
- "debug/proc_maps_linux.cc",
- "debug/proc_maps_linux.h",
- "debug/profiler.cc",
- "debug/profiler.h",
- "debug/stack_trace.cc",
- "debug/stack_trace.h",
- "debug/stack_trace_android.cc",
- "debug/stack_trace_ios.mm",
- "debug/stack_trace_posix.cc",
- "debug/stack_trace_win.cc",
- "debug/trace_event.h",
- "debug/trace_event_android.cc",
- "debug/trace_event_impl.cc",
- "debug/trace_event_impl.h",
- "debug/trace_event_impl_constants.cc",
- "debug/trace_event_memory.cc",
- "debug/trace_event_memory.h",
- "debug/trace_event_win.cc",
- "deferred_sequenced_task_runner.cc",
- "deferred_sequenced_task_runner.h",
- "environment.cc",
- "environment.h",
- "file_descriptor_posix.h",
- "file_util.cc",
- "file_util.h",
- "file_util_android.cc",
- "file_util_linux.cc",
- "file_util_mac.mm",
- "file_util_posix.cc",
- "file_util_win.cc",
- "file_version_info.h",
- "file_version_info_mac.h",
- "file_version_info_mac.mm",
- "file_version_info_win.cc",
- "file_version_info_win.h",
- "files/dir_reader_fallback.h",
- "files/dir_reader_linux.h",
- "files/dir_reader_posix.h",
- "files/file_enumerator.cc",
- "files/file_enumerator.h",
- "files/file_enumerator_posix.cc",
- "files/file_enumerator_win.cc",
- "files/file_path.cc",
- "files/file_path.h",
- "files/file_path_constants.cc",
- "files/file_path_watcher.cc",
- "files/file_path_watcher.h",
- "files/file_path_watcher_kqueue.cc",
- "files/file_path_watcher_linux.cc",
- "files/file_path_watcher_stub.cc",
- "files/file_path_watcher_win.cc",
- "files/file_util_proxy.cc",
- "files/file_util_proxy.h",
- "files/important_file_writer.h",
- "files/important_file_writer.cc",
- "files/memory_mapped_file.cc",
- "files/memory_mapped_file.h",
- "files/memory_mapped_file_posix.cc",
- "files/memory_mapped_file_win.cc",
- "files/scoped_temp_dir.cc",
- "files/scoped_temp_dir.h",
- "float_util.h",
- "format_macros.h",
- "gtest_prod_util.h",
- "guid.cc",
- "guid.h",
- "guid_posix.cc",
- "guid_win.cc",
- "hash.cc",
- "hash.h",
- "id_map.h",
- "ini_parser.cc",
- "ini_parser.h",
- "ios/device_util.h",
- "ios/device_util.mm",
- "ios/ios_util.h",
- "ios/ios_util.mm",
- "ios/scoped_critical_action.h",
- "ios/scoped_critical_action.mm",
- "json/json_file_value_serializer.cc",
- "json/json_file_value_serializer.h",
- "json/json_parser.cc",
- "json/json_parser.h",
- "json/json_reader.cc",
- "json/json_reader.h",
- "json/json_string_value_serializer.cc",
- "json/json_string_value_serializer.h",
- "json/json_value_converter.h",
- "json/json_writer.cc",
- "json/json_writer.h",
- "json/string_escape.cc",
- "json/string_escape.h",
- "lazy_instance.cc",
- "lazy_instance.h",
- "location.cc",
- "location.h",
- "logging.cc",
- "logging.h",
- "logging_win.cc",
- "logging_win.h",
- "mac/authorization_util.h",
- "mac/authorization_util.mm",
- "mac/bind_objc_block.h",
- "mac/bundle_locations.h",
- "mac/bundle_locations.mm",
- "mac/cocoa_protocols.h",
- "mac/foundation_util.h",
- "mac/foundation_util.mm",
- "mac/launch_services_util.cc",
- "mac/launch_services_util.h",
- "mac/launchd.cc",
- "mac/launchd.h",
- "mac/libdispatch_task_runner.cc",
- "mac/libdispatch_task_runner.h",
- "mac/mac_logging.h",
- "mac/mac_logging.cc",
- "mac/mac_util.h",
- "mac/mac_util.mm",
- "mac/objc_property_releaser.h",
- "mac/objc_property_releaser.mm",
- "mac/os_crash_dumps.cc",
- "mac/os_crash_dumps.h",
- "mac/scoped_aedesc.h",
- "mac/scoped_authorizationref.h",
- "mac/scoped_block.h",
- "mac/scoped_cftyperef.h",
- "mac/scoped_ioobject.h",
- "mac/scoped_ioplugininterface.h",
- "mac/scoped_launch_data.h",
- "mac/scoped_mach_port.cc",
- "mac/scoped_mach_port.h",
- "mac/scoped_nsautorelease_pool.h",
- "mac/scoped_nsautorelease_pool.mm",
- "mac/scoped_nsexception_enabler.h",
- "mac/scoped_nsexception_enabler.mm",
- "mac/scoped_nsobject.h",
- "mac/scoped_sending_event.h",
- "mac/scoped_sending_event.mm",
- "mac/sdk_forward_declarations.h",
- "memory/aligned_memory.cc",
- "memory/aligned_memory.h",
- "memory/discardable_memory.cc",
- "memory/discardable_memory.h",
- "memory/discardable_memory_android.cc",
- "memory/discardable_memory_mac.cc",
- "memory/linked_ptr.h",
- "memory/manual_constructor.h",
- "memory/memory_pressure_listener.cc",
- "memory/memory_pressure_listener.h",
- "memory/raw_scoped_refptr_mismatch_checker.h",
- "memory/ref_counted.cc",
- "memory/ref_counted.h",
- "memory/ref_counted_delete_on_message_loop.h",
- "memory/ref_counted_memory.cc",
- "memory/ref_counted_memory.h",
- "memory/scoped_handle.h",
- "memory/scoped_open_process.h",
- "memory/scoped_policy.h",
- "memory/scoped_ptr.h",
- "memory/scoped_vector.h",
- "memory/shared_memory.h",
- "memory/shared_memory_android.cc",
- "memory/shared_memory_nacl.cc",
- "memory/shared_memory_posix.cc",
- "memory/shared_memory_win.cc",
- "memory/singleton.cc",
- "memory/singleton.h",
- "memory/weak_ptr.cc",
- "memory/weak_ptr.h",
- "message_loop/incoming_task_queue.cc",
- "message_loop/incoming_task_queue.h",
- "message_loop/message_loop.cc",
- "message_loop/message_loop.h",
- "message_loop/message_loop_proxy.cc",
- "message_loop/message_loop_proxy.h",
- "message_loop/message_loop_proxy_impl.cc",
- "message_loop/message_loop_proxy_impl.h",
- "message_loop/message_pump.cc",
- "message_loop/message_pump.h",
- "message_loop/message_pump_android.cc",
- "message_loop/message_pump_android.h",
- "message_loop/message_pump_aurax11.cc",
- "message_loop/message_pump_aurax11.h",
- "message_loop/message_pump_default.cc",
- "message_loop/message_pump_default.h",
- "message_loop/message_pump_glib.cc",
- "message_loop/message_pump_glib.h",
- "message_loop/message_pump_gtk.cc",
- "message_loop/message_pump_gtk.h",
- "message_loop/message_pump_io_ios.cc",
- "message_loop/message_pump_io_ios.h",
- "message_loop/message_pump_libevent.cc",
- "message_loop/message_pump_libevent.h",
- "message_loop/message_pump_mac.h",
- "message_loop/message_pump_mac.mm",
- "message_loop/message_pump_observer.h",
- "message_loop/message_pump_ozone.cc",
- "message_loop/message_pump_ozone.h",
- "message_loop/message_pump_win.cc",
- "message_loop/message_pump_win.h",
- "metrics/field_trial.cc",
- "metrics/field_trial.h",
- "metrics/sample_map.cc",
- "metrics/sample_map.h",
- "metrics/sample_vector.cc",
- "metrics/sample_vector.h",
- "metrics/bucket_ranges.cc",
- "metrics/bucket_ranges.h",
- "metrics/histogram.cc",
- "metrics/histogram.h",
- "metrics/histogram_base.cc",
- "metrics/histogram_base.h",
- "metrics/histogram_flattener.h",
- "metrics/histogram_samples.cc",
- "metrics/histogram_samples.h",
- "metrics/histogram_snapshot_manager.cc",
- "metrics/histogram_snapshot_manager.h",
- "metrics/sparse_histogram.cc",
- "metrics/sparse_histogram.h",
- "metrics/statistics_recorder.cc",
- "metrics/statistics_recorder.h",
- "metrics/stats_counters.cc",
- "metrics/stats_counters.h",
- "metrics/stats_table.cc",
- "metrics/stats_table.h",
- "move.h",
- "native_library.h",
- "native_library_mac.mm",
- "native_library_posix.cc",
- "native_library_win.cc",
- "nix/mime_util_xdg.cc",
- "nix/mime_util_xdg.h",
- "nix/xdg_util.cc",
- "nix/xdg_util.h",
- "observer_list.h",
- "observer_list_threadsafe.h",
- "os_compat_android.cc",
- "os_compat_android.h",
- "os_compat_nacl.cc",
- "os_compat_nacl.h",
- "path_service.cc",
- "path_service.h",
- "pending_task.cc",
- "pending_task.h",
- "pickle.cc",
- "pickle.h",
- "platform_file.cc",
- "platform_file.h",
- "platform_file_posix.cc",
- "platform_file_win.cc",
- "port.h",
- "posix/eintr_wrapper.h",
- "posix/file_descriptor_shuffle.cc",
- "posix/file_descriptor_shuffle.y",
- "posix/global_descriptors.cc",
- "posix/global_descriptors.h",
- "posix/unix_domain_socket_linux.cc",
- "posix/unix_domain_socket_linux.h",
- "power_monitor/power_monitor.cc",
- "power_monitor/power_monitor.h",
- "power_monitor/power_monitor_device_source.cc",
- "power_monitor/power_monitor_device_source.h",
- "power_monitor/power_monitor_device_source_android.cc",
- "power_monitor/power_monitor_device_source_android.h",
- "power_monitor/power_monitor_device_source_ios.mm",
- "power_monitor/power_monitor_device_source_mac.mm",
- "power_monitor/power_monitor_device_source_posix.cc",
- "power_monitor/power_monitor_device_source_win.cc",
- "power_monitor/power_monitor_source.cc",
- "power_monitor/power_monitor_source.h",
- "power_monitor/power_observer.h",
- "process/internal_linux.cc",
- "process/internal_linux.h",
- "process/kill.cc",
- "process/kill.h",
- "process/kill_mac.cc",
- "process/kill_posix.cc",
- "process/kill_win.cc",
- "process/launch.h",
- "process/launch_ios.cc",
- "process/launch_mac.cc",
- "process/launch_posix.cc",
- "process/launch_win.cc",
- "process/memory.h",
- "process/memory_linux.cc",
- "process/memory_mac.mm",
- "process/memory_win.cc",
- "process/process.h",
- "process/process_handle_freebsd.cc",
- "process/process_handle_linux.cc",
- "process/process_handle_mac.cc",
- "process/process_handle_openbsd.cc",
- "process/process_handle_posix.cc",
- "process/process_handle_win.cc",
- "process/process_info.h",
- "process/process_info_mac.cc",
- "process/process_info_win.cc",
- "process/process_iterator.cc",
- "process/process_iterator.h",
- "process/process_iterator_freebsd.cc",
- "process/process_iterator_linux.cc",
- "process/process_iterator_mac.cc",
- "process/process_iterator_openbsd.cc",
- "process/process_iterator_win.cc",
- "process/process_linux.cc",
- "process/process_metrics.h",
- "process/process_metrics_freebsd.cc",
- "process/process_metrics_ios.cc",
- "process/process_metrics_linux.cc",
- "process/process_metrics_mac.cc",
- "process/process_metrics_openbsd.cc",
- "process/process_metrics_posix.cc",
- "process/process_metrics_win.cc",
- "process/process_posix.cc",
- "process/process_util.h",
- "process/process_win.cc",
- "profiler/scoped_profile.cc",
- "profiler/scoped_profile.h",
- "profiler/alternate_timer.cc",
- "profiler/alternate_timer.h",
- "profiler/tracked_time.cc",
- "profiler/tracked_time.h",
- "rand_util.cc",
- "rand_util.h",
- "rand_util_nacl.cc",
- "rand_util_posix.cc",
- "rand_util_win.cc",
- "run_loop.cc",
- "run_loop.h",
- "safe_numerics.h",
- "safe_strerror_posix.cc",
- "safe_strerror_posix.h",
- "scoped_native_library.cc",
- "scoped_native_library.h",
- "sequence_checker.h",
- "sequence_checker_impl.cc",
- "sequence_checker_impl.h",
- "sequenced_task_runner.cc",
- "sequenced_task_runner.h",
- "sequenced_task_runner_helpers.h",
- "sha1.h",
- "sha1_portable.cc",
- "sha1_win.cc",
- "single_thread_task_runner.h",
- "stl_util.h",
- "strings/latin1_string_conversions.cc",
- "strings/latin1_string_conversions.h",
- "strings/nullable_string16.cc",
- "strings/nullable_string16.h",
- "strings/string16.cc",
- "strings/string16.h",
- "strings/string_number_conversions.cc",
- "strings/string_split.cc",
- "strings/string_split.h",
- "strings/string_number_conversions.h",
- "strings/string_piece.cc",
- "strings/string_piece.h",
- "strings/string_tokenizer.h",
- "strings/string_util.cc",
- "strings/string_util.h",
- "strings/string_util_constants.cc",
- "strings/string_util_posix.h",
- "strings/string_util_win.h",
- "strings/stringize_macros.h",
- "strings/stringprintf.cc",
- "strings/stringprintf.h",
- "strings/sys_string_conversions.h",
- "strings/sys_string_conversions_mac.mm",
- "strings/sys_string_conversions_posix.cc",
- "strings/sys_string_conversions_win.cc",
- "strings/utf_offset_string_conversions.cc",
- "strings/utf_offset_string_conversions.h",
- "strings/utf_string_conversion_utils.cc",
- "strings/utf_string_conversion_utils.h",
- "strings/utf_string_conversions.cc",
- "strings/utf_string_conversions.h",
- "supports_user_data.cc",
- "supports_user_data.h",
- "sync_socket.h",
- "sync_socket_posix.cc",
- "sync_socket_win.cc",
- "synchronization/cancellation_flag.cc",
- "synchronization/cancellation_flag.h",
- "synchronization/condition_variable.h",
- "synchronization/condition_variable_posix.cc",
- "synchronization/condition_variable_win.cc",
- "synchronization/lock.cc",
- "synchronization/lock.h",
- "synchronization/lock_impl.h",
- "synchronization/lock_impl_posix.cc",
- "synchronization/lock_impl_win.cc",
- "synchronization/spin_wait.h",
- "synchronization/waitable_event.h",
- "synchronization/waitable_event_posix.cc",
- "synchronization/waitable_event_watcher.h",
- "synchronization/waitable_event_watcher_posix.cc",
- "synchronization/waitable_event_watcher_win.cc",
- "synchronization/waitable_event_win.cc",
- "system_monitor/system_monitor.cc",
- "system_monitor/system_monitor.h",
- "sys_byteorder.h",
- "sys_info.cc",
- "sys_info.h",
- "sys_info_android.cc",
- "sys_info_chromeos.cc",
- "sys_info_freebsd.cc",
- "sys_info_ios.mm",
- "sys_info_linux.cc",
- "sys_info_mac.cc",
- "sys_info_openbsd.cc",
- "sys_info_posix.cc",
- "sys_info_win.cc",
- "task_runner.cc",
- "task_runner.h",
- "task_runner_util.h",
- "template_util.h",
- "thread_task_runner_handle.cc",
- "thread_task_runner_handle.h",
- "threading/non_thread_safe.h",
- "threading/non_thread_safe_impl.cc",
- "threading/non_thread_safe_impl.h",
- "threading/platform_thread.h",
- "threading/platform_thread_android.cc",
- "threading/platform_thread_linux.cc",
- "threading/platform_thread_mac.mm",
- "threading/platform_thread_posix.cc",
- "threading/platform_thread_win.cc",
- "threading/post_task_and_reply_impl.cc",
- "threading/post_task_and_reply_impl.h",
- "threading/sequenced_worker_pool.cc",
- "threading/sequenced_worker_pool.h",
- "threading/simple_thread.cc",
- "threading/simple_thread.h",
- "threading/thread.cc",
- "threading/thread.h",
- "threading/thread_checker.h",
- "threading/thread_checker_impl.cc",
- "threading/thread_checker_impl.h",
- "threading/thread_collision_warner.cc",
- "threading/thread_collision_warner.h",
- "threading/thread_id_name_manager.cc",
- "threading/thread_id_name_manager.h",
- "threading/thread_local.h",
- "threading/thread_local_posix.cc",
- "threading/thread_local_storage.h",
- "threading/thread_local_storage_posix.cc",
- "threading/thread_local_storage_win.cc",
- "threading/thread_local_win.cc",
- "threading/thread_restrictions.h",
- "threading/thread_restrictions.cc",
- "threading/watchdog.cc",
- "threading/watchdog.h",
- "threading/worker_pool.h",
- "threading/worker_pool.cc",
- "threading/worker_pool_posix.cc",
- "threading/worker_pool_posix.h",
- "threading/worker_pool_win.cc",
- "time/clock.cc",
- "time/clock.h",
- "time/default_clock.cc",
- "time/default_clock.h",
- "time/default_tick_clock.cc",
- "time/default_tick_clock.h",
- "time/tick_clock.cc",
- "time/tick_clock.h",
- "time/time.cc",
- "time/time.h",
- "time/time_mac.cc",
- "time/time_posix.cc",
- "time/time_win.cc",
- "timer/hi_res_timer_manager_posix.cc",
- "timer/hi_res_timer_manager_win.cc",
- "timer/hi_res_timer_manager.h",
- "timer/timer.cc",
- "timer/timer.h",
- "tracked_objects.cc",
- "tracked_objects.h",
- "tracking_info.cc",
- "tracking_info.h",
- "tuple.h",
- "values.cc",
- "values.h",
- "value_conversions.cc",
- "value_conversions.h",
- "version.cc",
- "version.h",
- "vlog.cc",
- "vlog.h",
- "win/enum_variant.cc",
- "win/enum_variant.h",
- "win/event_trace_consumer.h",
- "win/event_trace_controller.cc",
- "win/event_trace_controller.h",
- "win/event_trace_provider.cc",
- "win/event_trace_provider.h",
- "win/i18n.cc",
- "win/i18n.h",
- "win/iat_patch_function.cc",
- "win/iat_patch_function.h",
- "win/iunknown_impl.cc",
- "win/iunknown_impl.h",
- "win/message_window.cc",
- "win/message_window.h",
- "win/metro.cc",
- "win/metro.h",
- "win/object_watcher.cc",
- "win/object_watcher.h",
- "win/registry.cc",
- "win/registry.h",
- "win/resource_util.cc",
- "win/resource_util.h",
- "win/sampling_profiler.cc",
- "win/sampling_profiler.h",
- "win/scoped_bstr.cc",
- "win/scoped_bstr.h",
- "win/scoped_co_mem.h",
- "win/scoped_com_initializer.h",
- "win/scoped_comptr.h",
- "win/scoped_gdi_object.h",
- "win/scoped_handle.cc",
- "win/scoped_handle.h",
- "win/scoped_hdc.h",
- "win/scoped_hglobal.h",
- "win/scoped_process_information.cc",
- "win/scoped_process_information.h",
- "win/scoped_propvariant.h",
- "win/scoped_select_object.h",
- "win/scoped_variant.cc",
- "win/scoped_variant.h",
- "win/shortcut.cc",
- "win/shortcut.h",
- "win/startup_information.cc",
- "win/startup_information.h",
- "win/text_services_message_filter.cc",
- "win/text_services_message_filter.h",
- "win/win_util.cc",
- "win/win_util.h",
- "win/windows_version.cc",
- "win/windows_version.h",
- "win/wrapped_window_proc.cc",
- "win/wrapped_window_proc.h",
- ]
-
- # TODO(brettw) I don't understand the conditions this file is used.
- sources -= "files/file_path_watcher_stub.cc"
-
- sources -= [
- # TODO(brettw) do these properly.
- "message_loop/message_pump_aurax11.cc",
- "message_loop/message_pump_aurax11.h",
- "message_loop/message_pump_ozone.cc",
- "message_loop/message_pump_ozone.h",
-
- "process/process_handle_freebsd.cc",
- "process/process_handle_openbsd.cc",
- "process/process_iterator_freebsd.cc",
- "process/process_iterator_openbsd.cc",
- "process/process_metrics_freebsd.cc",
- "process/process_metrics_openbsd.cc",
- "sys_info_freebsd.cc",
- "sys_info_openbsd.cc",
- ]
-
- defines = [
- "BASE_IMPLEMENTATION",
- ]
-
- deps = [
- ":base_static",
- "//base/allocator:allocator_extension_thunks",
- "//base/third_party/dynamic_annotations",
- "//base/third_party/nspr",
- "//third_party/modp_b64",
- ]
-
- # So we can append below without worrying about whether it has been
- # previously defined or not.
- all_dependent_configs = [ ":base_libs" ]
- ldflags = []
-
- if (!is_chromeos) {
- sources -= [
- "sys_info_chromeos.cc",
- ]
- }
-
- # Remove nacl stuff.
- if (!is_nacl) {
- sources -= [
- "os_compat_nacl.cc",
- "os_compat_nacl.h",
- "rand_util_nacl.cc",
- "memory/shared_memory_nacl.cc",
- ]
- }
-
- # Windows.
- if (is_win && !is_nacl) {
- sources -= [
- "strings/string16.cc",
- # Not using sha1_win.cc because it may have caused a
- # regression to page cycler moz.
- "sha1_win.cc",
- ]
-
- if (is_component_build) {
- sources -= "debug/debug_on_start_win.cc"
- }
- } else {
- # Non-Windows.
- deps += "//third_party/libevent"
- }
-
- # Mac.
- if (is_mac) {
- sources -= [
- "base_paths_posix.cc",
- "native_library_posix.cc",
- "strings/sys_string_conversions_posix.cc",
- ]
- deps += "//third_party/mach_override"
- } else {
- # Non-Mac.
- sources -= "files/file_path_watcher_kqueue.cc"
- }
-
- # Linux.
- if (is_linux) {
- # TODO(brettw) these will need to be parameterized at some point.
- linux_configs = [
- "//build/config/linux/system:glib",
- "//build/config/linux/system:gtk",
- "//build/config/linux/system:x11",
- ]
- configs += linux_configs
- all_dependent_configs += linux_configs
-
- deps += [
- "//base/third_party/symbolize",
- "//base/third_party/xdg_mime",
- "//base/third_party/xdg_user_dirs",
- ]
- } else {
- # Non-Linux.
- sources -= [
- "message_loop/message_pump_glib.cc",
- "message_loop/message_pump_glib.h",
- "message_loop/message_pump_gtk.cc",
- "message_loop/message_pump_gtk.h",
- ]
- }
-
- # Non-Mac Unix stuff.
- if (is_mac) { #!is_posix || is_mac) {
- sources -= [
- "nix/mime_util_xdg.cc",
- "nix/mime_util_xdg.h",
- "nix/xdg_util.cc",
- "nix/xdg_util.h",
- "third_party/xdg_mime/xdgmime.h",
- ]
- }
-}
-
-# This is the subset of files from base that should not be used with a dynamic
-# library. Note that this library cannot depend on base because base depends on
-# base_static.
-static_library("base_static") {
- sources = [
- "base_switches.cc",
- "base_switches.h",
- "win/pe_image.cc",
- "win/pe_image.h",
- ]
-}
-
-component("base_i18n") {
- sources = [
- "i18n/base_i18n_export.h",
- "i18n/bidi_line_iterator.cc",
- "i18n/bidi_line_iterator.h",
- "i18n/break_iterator.cc",
- "i18n/break_iterator.h",
- "i18n/char_iterator.cc",
- "i18n/char_iterator.h",
- "i18n/case_conversion.cc",
- "i18n/case_conversion.h",
- "i18n/file_util_icu.cc",
- "i18n/file_util_icu.h",
- "i18n/icu_encoding_detection.cc",
- "i18n/icu_encoding_detection.h",
- "i18n/icu_string_conversions.cc",
- "i18n/icu_string_conversions.h",
- "i18n/icu_util.cc",
- "i18n/icu_util.h",
- "i18n/number_formatting.cc",
- "i18n/number_formatting.h",
- "i18n/rtl.cc",
- "i18n/rtl.h",
- "i18n/string_compare.cc",
- "i18n/string_compare.h",
- "i18n/string_search.cc",
- "i18n/string_search.h",
- "i18n/time_formatting.cc",
- "i18n/time_formatting.h",
- ]
- deps = [
- ":base",
- "//base/third_party/dynamic_annotations",
- "//third_party/icu:icui18n",
- "//third_party/icu:icuuc",
- ]
- defines = [
- "BASE_I18N_IMPLEMENTATION",
- ]
- #'conditions': [
- # ['toolkit_uses_gtk==1', {
- # 'deps': [
- # # i18n/rtl.cc uses gtk
- # '../build/linux/system.gyp:gtk',
- # ],
- # }],
- # ['OS == "win"', {
- # # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
- # 'msvs_disabled_warnings': [
- # 4267,
- # ],
- # }],
- #],
- #'export_dependent_settings': [
- # 'base',
- #],
- #'variables': {
- # 'enable_wexit_time_destructors': 1,
- # 'optimize': 'max',
- #},
-}
-
-static_library("test_support_base") {
- sources = [
- "perftimer.cc",
- "test/expectations/expectation.cc",
- "test/expectations/expectation.h",
- "test/expectations/parser.cc",
- "test/expectations/parser.h",
- "test/mock_chrome_application_mac.h",
- "test/mock_chrome_application_mac.mm",
- "test/mock_devices_changed_observer.cc",
- "test/mock_devices_changed_observer.h",
- "test/mock_time_provider.cc",
- "test/mock_time_provider.h",
- "test/multiprocess_test.cc",
- "test/multiprocess_test.h",
- "test/multiprocess_test_android.cc",
- "test/null_task_runner.cc",
- "test/null_task_runner.h",
- "test/perf_test_suite.cc",
- "test/perf_test_suite.h",
- "test/scoped_locale.cc",
- "test/scoped_locale.h",
- "test/scoped_path_override.cc",
- "test/scoped_path_override.h",
- "test/sequenced_task_runner_test_template.cc",
- "test/sequenced_task_runner_test_template.h",
- "test/sequenced_worker_pool_owner.cc",
- "test/sequenced_worker_pool_owner.h",
- "test/simple_test_clock.cc",
- "test/simple_test_clock.h",
- "test/simple_test_tick_clock.cc",
- "test/simple_test_tick_clock.h",
- "test/task_runner_test_template.cc",
- "test/task_runner_test_template.h",
- "test/test_file_util.h",
- "test/test_file_util_linux.cc",
- "test/test_file_util_mac.cc",
- "test/test_file_util_posix.cc",
- "test/test_file_util_win.cc",
- "test/test_listener_ios.h",
- "test/test_listener_ios.mm",
- "test/test_pending_task.cc",
- "test/test_pending_task.h",
- "test/test_process_killer_win.cc",
- "test/test_process_killer_win.h",
- "test/test_reg_util_win.cc",
- "test/test_reg_util_win.h",
- "test/test_shortcut_win.cc",
- "test/test_shortcut_win.h",
- "test/test_simple_task_runner.cc",
- "test/test_simple_task_runner.h",
- "test/test_suite.cc",
- "test/test_suite.h",
- "test/test_support_android.cc",
- "test/test_support_android.h",
- "test/test_support_ios.h",
- "test/test_support_ios.mm",
- "test/test_switches.cc",
- "test/test_switches.h",
- "test/test_timeouts.cc",
- "test/test_timeouts.h",
- "test/thread_test_helper.cc",
- "test/thread_test_helper.h",
- "test/trace_event_analyzer.cc",
- "test/trace_event_analyzer.h",
- "test/values_test_util.cc",
- "test/values_test_util.h",
- ]
- deps = [
- ":base",
- ":base_static",
- ":base_i18n",
- "//testing:gmock",
- "//testing:gtest",
- ]
-
- if (!is_posix) {
- sources -= [
- "test/scoped_locale.cc",
- "test/scoped_locale.h",
- ]
- }
- if (is_ios) {
- # Pull in specific Mac files for iOS (which have been filtered out
- # by file name rules).
- { # Temporarily override the assignment filter in a new scope.
- set_sources_assignment_filter([])
- sources += "test/test_file_util_mac.cc"
- }
- }
- #if (!is_bsd) {
- # sources -= "test/test_file_util_linux.cc"
- #}
- #if (use_gtk) {
- # deps += "/build/linux/system:gtk"
- #}
- #export_dependent_settings [
- # 'base',
- #]
-}
-
-config("perf_test_config") {
- defines = [ "PERF_TEST" ]
-}
-
-static_library("test_support_perf") {
- sources = [
- "perftimer.cc",
- "test/run_all_perftests.cc",
- ]
- deps = [
- ":base",
- "//testing:gtest",
- ]
-
- direct_dependent_configs = [ ":perf_test_config" ]
-
- #if (toolkit_uses_gtk) {
- # deps += "/build/linux/system:gtk",
- #}
-}
-
-static_library("run_all_unittests") {
- sources = [
- "test/run_all_unittests.cc",
- ]
- deps = [
- ":test_support_base",
- ]
-}
+# found in the LICENSE file.
+
+component("base") {
+ sources = [
+ "../build/build_config.h",
+ "third_party/dmg_fp/dmg_fp.h",
+ "third_party/dmg_fp/g_fmt.cc",
+ "third_party/dmg_fp/dtoa_wrapper.cc",
+ "third_party/icu/icu_utf.cc",
+ "third_party/icu/icu_utf.h",
+ "third_party/nspr/prcpucfg.h",
+ "third_party/nspr/prcpucfg_freebsd.h",
+ "third_party/nspr/prcpucfg_linux.h",
+ "third_party/nspr/prcpucfg_mac.h",
+ "third_party/nspr/prcpucfg_nacl.h",
+ "third_party/nspr/prcpucfg_openbsd.h",
+ "third_party/nspr/prcpucfg_solaris.h",
+ "third_party/nspr/prcpucfg_win.h",
+ "third_party/nspr/prtime.cc",
+ "third_party/nspr/prtime.h",
+ "third_party/nspr/prtypes.h",
+ "third_party/xdg_mime/xdgmime.h",
+ "allocator/allocator_extension.cc",
+ "allocator/allocator_extension.h",
+ "allocator/type_profiler_control.cc",
+ "allocator/type_profiler_control.h",
+ "android/activity_status.cc",
+ "android/activity_status.h",
+ "android/base_jni_registrar.cc",
+ "android/base_jni_registrar.h",
+ "android/build_info.cc",
+ "android/build_info.h",
+ "android/cpu_features.cc",
+ "android/fifo_utils.cc",
+ "android/fifo_utils.h",
+ "android/important_file_writer_android.cc",
+ "android/important_file_writer_android.h",
+ "android/scoped_java_ref.cc",
+ "android/scoped_java_ref.h",
+ "android/jni_android.cc",
+ "android/jni_android.h",
+ "android/jni_array.cc",
+ "android/jni_array.h",
+ "android/jni_helper.cc",
+ "android/jni_helper.h",
+ "android/jni_registrar.cc",
+ "android/jni_registrar.h",
+ "android/jni_string.cc",
+ "android/jni_string.h",
+ "android/memory_pressure_listener_android.cc",
+ "android/memory_pressure_listener_android.h",
+ "android/path_service_android.cc",
+ "android/path_service_android.h",
+ "android/path_utils.cc",
+ "android/path_utils.h",
+ "android/sys_utils.cc",
+ "android/sys_utils.h",
+ "android/thread_utils.h",
+ "at_exit.cc",
+ "at_exit.h",
+ "atomic_ref_count.h",
+ "atomic_sequence_num.h",
+ "atomicops.h",
+ "atomicops_internals_gcc.h",
+ "atomicops_internals_mac.h",
+ "atomicops_internals_tsan.h",
+ "atomicops_internals_x86_gcc.cc",
+ "atomicops_internals_x86_gcc.h",
+ "atomicops_internals_x86_msvc.h",
+ "base_export.h",
+ "base_paths.cc",
+ "base_paths.h",
+ "base_paths_android.cc",
+ "base_paths_android.h",
+ "base_paths_mac.h",
+ "base_paths_mac.mm",
+ "base_paths_posix.cc",
+ "base_paths_posix.h",
+ "base_paths_win.cc",
+ "base_paths_win.h",
+ "base_switches.h",
+ "base64.cc",
+ "base64.h",
+ "basictypes.h",
+ "bind.h",
+ "bind_helpers.cc",
+ "bind_helpers.h",
+ "bind_internal.h",
+ "bind_internal_win.h",
+ "bits.h",
+ "build_time.cc",
+ "build_time.h",
+ "callback.h",
+ "callback_helpers.h",
+ "callback_internal.cc",
+ "callback_internal.h",
+ "cancelable_callback.h",
+ "chromeos/chromeos_version.cc",
+ "chromeos/chromeos_version.h",
+ "command_line.cc",
+ "command_line.h",
+ "compiler_specific.h",
+ "containers/hash_tables.h",
+ "containers/linked_list.h",
+ "containers/mru_cache.h",
+ "containers/small_map.h",
+ "containers/stack_container.h",
+ "cpu.cc",
+ "cpu.h",
+ "critical_closure.h",
+ "critical_closure_ios.mm",
+ "debug/alias.cc",
+ "debug/alias.h",
+ "debug/crash_logging.cc",
+ "debug/crash_logging.h",
+ "debug/debug_on_start_win.cc",
+ "debug/debug_on_start_win.h",
+ "debug/debugger.cc",
+ "debug/debugger.h",
+ "debug/debugger_posix.cc",
+ "debug/debugger_win.cc",
+ # This file depends on files from the "allocator" target,
+ # but this target does not depend on "allocator" (see
+ # allocator.gyp for details).
+ "debug/leak_annotations.h",
+ "debug/leak_tracker.h",
+ "debug/proc_maps_linux.cc",
+ "debug/proc_maps_linux.h",
+ "debug/profiler.cc",
+ "debug/profiler.h",
+ "debug/stack_trace.cc",
+ "debug/stack_trace.h",
+ "debug/stack_trace_android.cc",
+ "debug/stack_trace_ios.mm",
+ "debug/stack_trace_posix.cc",
+ "debug/stack_trace_win.cc",
+ "debug/trace_event.h",
+ "debug/trace_event_android.cc",
+ "debug/trace_event_impl.cc",
+ "debug/trace_event_impl.h",
+ "debug/trace_event_impl_constants.cc",
+ "debug/trace_event_win.cc",
+ "deferred_sequenced_task_runner.cc",
+ "deferred_sequenced_task_runner.h",
+ "environment.cc",
+ "environment.h",
+ "file_descriptor_posix.h",
+ "file_util.cc",
+ "file_util.h",
+ "file_util_android.cc",
+ "file_util_linux.cc",
+ "file_util_mac.mm",
+ "file_util_posix.cc",
+ "file_util_win.cc",
+ "file_version_info.h",
+ "file_version_info_mac.h",
+ "file_version_info_mac.mm",
+ "file_version_info_win.cc",
+ "file_version_info_win.h",
+ "files/dir_reader_fallback.h",
+ "files/dir_reader_linux.h",
+ "files/dir_reader_posix.h",
+ "files/file_enumerator.cc",
+ "files/file_enumerator.h",
+ "files/file_enumerator_posix.cc",
+ "files/file_enumerator_win.cc",
+ "files/file_path.cc",
+ "files/file_path.h",
+ "files/file_path_constants.cc",
+ "files/file_path_watcher.cc",
+ "files/file_path_watcher.h",
+ "files/file_path_watcher_kqueue.cc",
+ "files/file_path_watcher_linux.cc",
+ "files/file_path_watcher_stub.cc",
+ "files/file_path_watcher_win.cc",
+ "files/file_util_proxy.cc",
+ "files/file_util_proxy.h",
+ "files/important_file_writer.h",
+ "files/important_file_writer.cc",
+ "files/memory_mapped_file.cc",
+ "files/memory_mapped_file.h",
+ "files/memory_mapped_file_posix.cc",
+ "files/memory_mapped_file_win.cc",
+ "files/scoped_temp_dir.cc",
+ "files/scoped_temp_dir.h",
+ "float_util.h",
+ "format_macros.h",
+ "gtest_prod_util.h",
+ "guid.cc",
+ "guid.h",
+ "guid_posix.cc",
+ "guid_win.cc",
+ "hash.cc",
+ "hash.h",
+ "id_map.h",
+ "ini_parser.cc",
+ "ini_parser.h",
+ "ios/device_util.h",
+ "ios/device_util.mm",
+ "ios/ios_util.h",
+ "ios/ios_util.mm",
+ "ios/scoped_critical_action.h",
+ "ios/scoped_critical_action.mm",
+ "json/json_file_value_serializer.cc",
+ "json/json_file_value_serializer.h",
+ "json/json_parser.cc",
+ "json/json_parser.h",
+ "json/json_reader.cc",
+ "json/json_reader.h",
+ "json/json_string_value_serializer.cc",
+ "json/json_string_value_serializer.h",
+ "json/json_value_converter.h",
+ "json/json_writer.cc",
+ "json/json_writer.h",
+ "json/string_escape.cc",
+ "json/string_escape.h",
+ "lazy_instance.cc",
+ "lazy_instance.h",
+ "location.cc",
+ "location.h",
+ "logging.cc",
+ "logging.h",
+ "logging_win.cc",
+ "logging_win.h",
+ "mac/authorization_util.h",
+ "mac/authorization_util.mm",
+ "mac/bind_objc_block.h",
+ "mac/bundle_locations.h",
+ "mac/bundle_locations.mm",
+ "mac/cocoa_protocols.h",
+ "mac/foundation_util.h",
+ "mac/foundation_util.mm",
+ "mac/launch_services_util.cc",
+ "mac/launch_services_util.h",
+ "mac/launchd.cc",
+ "mac/launchd.h",
+ "mac/libdispatch_task_runner.cc",
+ "mac/libdispatch_task_runner.h",
+ "mac/mac_logging.h",
+ "mac/mac_logging.cc",
+ "mac/mac_util.h",
+ "mac/mac_util.mm",
+ "mac/objc_property_releaser.h",
+ "mac/objc_property_releaser.mm",
+ "mac/os_crash_dumps.cc",
+ "mac/os_crash_dumps.h",
+ "mac/scoped_aedesc.h",
+ "mac/scoped_authorizationref.h",
+ "mac/scoped_block.h",
+ "mac/scoped_cftyperef.h",
+ "mac/scoped_ioobject.h",
+ "mac/scoped_ioplugininterface.h",
+ "mac/scoped_launch_data.h",
+ "mac/scoped_mach_port.cc",
+ "mac/scoped_mach_port.h",
+ "mac/scoped_nsautorelease_pool.h",
+ "mac/scoped_nsautorelease_pool.mm",
+ "mac/scoped_nsexception_enabler.h",
+ "mac/scoped_nsexception_enabler.mm",
+ "mac/scoped_nsobject.h",
+ "mac/scoped_sending_event.h",
+ "mac/scoped_sending_event.mm",
+ "mac/sdk_forward_declarations.h",
+ "memory/aligned_memory.cc",
+ "memory/aligned_memory.h",
+ "memory/discardable_memory.cc",
+ "memory/discardable_memory.h",
+ "memory/discardable_memory_android.cc",
+ "memory/discardable_memory_mac.cc",
+ "memory/linked_ptr.h",
+ "memory/manual_constructor.h",
+ "memory/memory_pressure_listener.cc",
+ "memory/memory_pressure_listener.h",
+ "memory/raw_scoped_refptr_mismatch_checker.h",
+ "memory/ref_counted.cc",
+ "memory/ref_counted.h",
+ "memory/ref_counted_delete_on_message_loop.h",
+ "memory/ref_counted_memory.cc",
+ "memory/ref_counted_memory.h",
+ "memory/scoped_handle.h",
+ "memory/scoped_open_process.h",
+ "memory/scoped_policy.h",
+ "memory/scoped_ptr.h",
+ "memory/scoped_vector.h",
+ "memory/shared_memory.h",
+ "memory/shared_memory_android.cc",
+ "memory/shared_memory_nacl.cc",
+ "memory/shared_memory_posix.cc",
+ "memory/shared_memory_win.cc",
+ "memory/singleton.cc",
+ "memory/singleton.h",
+ "memory/weak_ptr.cc",
+ "memory/weak_ptr.h",
+ "message_loop/incoming_task_queue.cc",
+ "message_loop/incoming_task_queue.h",
+ "message_loop/message_loop.cc",
+ "message_loop/message_loop.h",
+ "message_loop/message_loop_proxy.cc",
+ "message_loop/message_loop_proxy.h",
+ "message_loop/message_loop_proxy_impl.cc",
+ "message_loop/message_loop_proxy_impl.h",
+ "message_loop/message_pump.cc",
+ "message_loop/message_pump.h",
+ "message_loop/message_pump_android.cc",
+ "message_loop/message_pump_android.h",
+ "message_loop/message_pump_aurax11.cc",
+ "message_loop/message_pump_aurax11.h",
+ "message_loop/message_pump_default.cc",
+ "message_loop/message_pump_default.h",
+ "message_loop/message_pump_glib.cc",
+ "message_loop/message_pump_glib.h",
+ "message_loop/message_pump_gtk.cc",
+ "message_loop/message_pump_gtk.h",
+ "message_loop/message_pump_io_ios.cc",
+ "message_loop/message_pump_io_ios.h",
+ "message_loop/message_pump_libevent.cc",
+ "message_loop/message_pump_libevent.h",
+ "message_loop/message_pump_mac.h",
+ "message_loop/message_pump_mac.mm",
+ "message_loop/message_pump_observer.h",
+ "message_loop/message_pump_ozone.cc",
+ "message_loop/message_pump_ozone.h",
+ "message_loop/message_pump_win.cc",
+ "message_loop/message_pump_win.h",
+ "metrics/field_trial.cc",
+ "metrics/field_trial.h",
+ "metrics/sample_map.cc",
+ "metrics/sample_map.h",
+ "metrics/sample_vector.cc",
+ "metrics/sample_vector.h",
+ "metrics/bucket_ranges.cc",
+ "metrics/bucket_ranges.h",
+ "metrics/histogram.cc",
+ "metrics/histogram.h",
+ "metrics/histogram_base.cc",
+ "metrics/histogram_base.h",
+ "metrics/histogram_flattener.h",
+ "metrics/histogram_samples.cc",
+ "metrics/histogram_samples.h",
+ "metrics/histogram_snapshot_manager.cc",
+ "metrics/histogram_snapshot_manager.h",
+ "metrics/sparse_histogram.cc",
+ "metrics/sparse_histogram.h",
+ "metrics/statistics_recorder.cc",
+ "metrics/statistics_recorder.h",
+ "metrics/stats_counters.cc",
+ "metrics/stats_counters.h",
+ "metrics/stats_table.cc",
+ "metrics/stats_table.h",
+ "move.h",
+ "native_library.h",
+ "native_library_mac.mm",
+ "native_library_posix.cc",
+ "native_library_win.cc",
+ "nix/mime_util_xdg.cc",
+ "nix/mime_util_xdg.h",
+ "nix/xdg_util.cc",
+ "nix/xdg_util.h",
+ "observer_list.h",
+ "observer_list_threadsafe.h",
+ "os_compat_android.cc",
+ "os_compat_android.h",
+ "os_compat_nacl.cc",
+ "os_compat_nacl.h",
+ "path_service.cc",
+ "path_service.h",
+ "pending_task.cc",
+ "pending_task.h",
+ "pickle.cc",
+ "pickle.h",
+ "platform_file.cc",
+ "platform_file.h",
+ "platform_file_posix.cc",
+ "platform_file_win.cc",
+ "port.h",
+ "posix/eintr_wrapper.h",
+ "posix/file_descriptor_shuffle.cc",
+ "posix/file_descriptor_shuffle.y",
+ "posix/global_descriptors.cc",
+ "posix/global_descriptors.h",
+ "posix/unix_domain_socket_linux.cc",
+ "posix/unix_domain_socket_linux.h",
+ "power_monitor/power_monitor.cc",
+ "power_monitor/power_monitor.h",
+ "power_monitor/power_monitor_device_source.cc",
+ "power_monitor/power_monitor_device_source.h",
+ "power_monitor/power_monitor_device_source_android.cc",
+ "power_monitor/power_monitor_device_source_android.h",
+ "power_monitor/power_monitor_device_source_ios.mm",
+ "power_monitor/power_monitor_device_source_mac.mm",
+ "power_monitor/power_monitor_device_source_posix.cc",
+ "power_monitor/power_monitor_device_source_win.cc",
+ "power_monitor/power_monitor_source.cc",
+ "power_monitor/power_monitor_source.h",
+ "power_monitor/power_observer.h",
+ "process/internal_linux.cc",
+ "process/internal_linux.h",
+ "process/kill.cc",
+ "process/kill.h",
+ "process/kill_mac.cc",
+ "process/kill_posix.cc",
+ "process/kill_win.cc",
+ "process/launch.h",
+ "process/launch_ios.cc",
+ "process/launch_mac.cc",
+ "process/launch_posix.cc",
+ "process/launch_win.cc",
+ "process/memory.h",
+ "process/memory_linux.cc",
+ "process/memory_mac.mm",
+ "process/memory_win.cc",
+ "process/process.h",
+ "process/process_handle_freebsd.cc",
+ "process/process_handle_linux.cc",
+ "process/process_handle_mac.cc",
+ "process/process_handle_openbsd.cc",
+ "process/process_handle_posix.cc",
+ "process/process_handle_win.cc",
+ "process/process_info.h",
+ "process/process_info_mac.cc",
+ "process/process_info_win.cc",
+ "process/process_iterator.cc",
+ "process/process_iterator.h",
+ "process/process_iterator_freebsd.cc",
+ "process/process_iterator_linux.cc",
+ "process/process_iterator_mac.cc",
+ "process/process_iterator_openbsd.cc",
+ "process/process_iterator_win.cc",
+ "process/process_linux.cc",
+ "process/process_metrics.h",
+ "process/process_metrics_freebsd.cc",
+ "process/process_metrics_ios.cc",
+ "process/process_metrics_linux.cc",
+ "process/process_metrics_mac.cc",
+ "process/process_metrics_openbsd.cc",
+ "process/process_metrics_posix.cc",
+ "process/process_metrics_win.cc",
+ "process/process_posix.cc",
+ "process/process_util.h",
+ "process/process_win.cc",
+ "profiler/scoped_profile.cc",
+ "profiler/scoped_profile.h",
+ "profiler/alternate_timer.cc",
+ "profiler/alternate_timer.h",
+ "profiler/tracked_time.cc",
+ "profiler/tracked_time.h",
+ "rand_util.cc",
+ "rand_util.h",
+ "rand_util_nacl.cc",
+ "rand_util_posix.cc",
+ "rand_util_win.cc",
+ "run_loop.cc",
+ "run_loop.h",
+ "safe_numerics.h",
+ "safe_strerror_posix.cc",
+ "safe_strerror_posix.h",
+ "scoped_native_library.cc",
+ "scoped_native_library.h",
+ "sequence_checker.h",
+ "sequence_checker_impl.cc",
+ "sequence_checker_impl.h",
+ "sequenced_task_runner.cc",
+ "sequenced_task_runner.h",
+ "sequenced_task_runner_helpers.h",
+ "sha1.h",
+ "sha1_portable.cc",
+ "sha1_win.cc",
+ "single_thread_task_runner.h",
+ "stl_util.h",
+ "strings/latin1_string_conversions.cc",
+ "strings/latin1_string_conversions.h",
+ "strings/nullable_string16.cc",
+ "strings/nullable_string16.h",
+ "strings/string16.cc",
+ "strings/string16.h",
+ "strings/string_number_conversions.cc",
+ "strings/string_split.cc",
+ "strings/string_split.h",
+ "strings/string_number_conversions.h",
+ "strings/string_piece.cc",
+ "strings/string_piece.h",
+ "strings/string_tokenizer.h",
+ "strings/string_util.cc",
+ "strings/string_util.h",
+ "strings/string_util_constants.cc",
+ "strings/string_util_posix.h",
+ "strings/string_util_win.h",
+ "strings/stringize_macros.h",
+ "strings/stringprintf.cc",
+ "strings/stringprintf.h",
+ "strings/sys_string_conversions.h",
+ "strings/sys_string_conversions_mac.mm",
+ "strings/sys_string_conversions_posix.cc",
+ "strings/sys_string_conversions_win.cc",
+ "strings/utf_offset_string_conversions.cc",
+ "strings/utf_offset_string_conversions.h",
+ "strings/utf_string_conversion_utils.cc",
+ "strings/utf_string_conversion_utils.h",
+ "strings/utf_string_conversions.cc",
+ "strings/utf_string_conversions.h",
+ "supports_user_data.cc",
+ "supports_user_data.h",
+ "sync_socket.h",
+ "sync_socket_posix.cc",
+ "sync_socket_win.cc",
+ "synchronization/cancellation_flag.cc",
+ "synchronization/cancellation_flag.h",
+ "synchronization/condition_variable.h",
+ "synchronization/condition_variable_posix.cc",
+ "synchronization/condition_variable_win.cc",
+ "synchronization/lock.cc",
+ "synchronization/lock.h",
+ "synchronization/lock_impl.h",
+ "synchronization/lock_impl_posix.cc",
+ "synchronization/lock_impl_win.cc",
+ "synchronization/spin_wait.h",
+ "synchronization/waitable_event.h",
+ "synchronization/waitable_event_posix.cc",
+ "synchronization/waitable_event_watcher.h",
+ "synchronization/waitable_event_watcher_posix.cc",
+ "synchronization/waitable_event_watcher_win.cc",
+ "synchronization/waitable_event_win.cc",
+ "system_monitor/system_monitor.cc",
+ "system_monitor/system_monitor.h",
+ "sys_byteorder.h",
+ "sys_info.cc",
+ "sys_info.h",
+ "sys_info_android.cc",
+ "sys_info_chromeos.cc",
+ "sys_info_freebsd.cc",
+ "sys_info_ios.mm",
+ "sys_info_linux.cc",
+ "sys_info_mac.cc",
+ "sys_info_openbsd.cc",
+ "sys_info_posix.cc",
+ "sys_info_win.cc",
+ "task_runner.cc",
+ "task_runner.h",
+ "task_runner_util.h",
+ "template_util.h",
+ "thread_task_runner_handle.cc",
+ "thread_task_runner_handle.h",
+ "threading/non_thread_safe.h",
+ "threading/non_thread_safe_impl.cc",
+ "threading/non_thread_safe_impl.h",
+ "threading/platform_thread.h",
+ "threading/platform_thread_android.cc",
+ "threading/platform_thread_linux.cc",
+ "threading/platform_thread_mac.mm",
+ "threading/platform_thread_posix.cc",
+ "threading/platform_thread_win.cc",
+ "threading/post_task_and_reply_impl.cc",
+ "threading/post_task_and_reply_impl.h",
+ "threading/sequenced_worker_pool.cc",
+ "threading/sequenced_worker_pool.h",
+ "threading/simple_thread.cc",
+ "threading/simple_thread.h",
+ "threading/thread.cc",
+ "threading/thread.h",
+ "threading/thread_checker.h",
+ "threading/thread_checker_impl.cc",
+ "threading/thread_checker_impl.h",
+ "threading/thread_collision_warner.cc",
+ "threading/thread_collision_warner.h",
+ "threading/thread_id_name_manager.cc",
+ "threading/thread_id_name_manager.h",
+ "threading/thread_local.h",
+ "threading/thread_local_posix.cc",
+ "threading/thread_local_storage.h",
+ "threading/thread_local_storage_posix.cc",
+ "threading/thread_local_storage_win.cc",
+ "threading/thread_local_win.cc",
+ "threading/thread_restrictions.h",
+ "threading/thread_restrictions.cc",
+ "threading/watchdog.cc",
+ "threading/watchdog.h",
+ "threading/worker_pool.h",
+ "threading/worker_pool.cc",
+ "threading/worker_pool_posix.cc",
+ "threading/worker_pool_posix.h",
+ "threading/worker_pool_win.cc",
+ "time/clock.cc",
+ "time/clock.h",
+ "time/default_clock.cc",
+ "time/default_clock.h",
+ "time/default_tick_clock.cc",
+ "time/default_tick_clock.h",
+ "time/tick_clock.cc",
+ "time/tick_clock.h",
+ "time/time.cc",
+ "time/time.h",
+ "time/time_mac.cc",
+ "time/time_posix.cc",
+ "time/time_win.cc",
+ "timer/hi_res_timer_manager_posix.cc",
+ "timer/hi_res_timer_manager_win.cc",
+ "timer/hi_res_timer_manager.h",
+ "timer/timer.cc",
+ "timer/timer.h",
+ "tracked_objects.cc",
+ "tracked_objects.h",
+ "tracking_info.cc",
+ "tracking_info.h",
+ "tuple.h",
+ "values.cc",
+ "values.h",
+ "value_conversions.cc",
+ "value_conversions.h",
+ "version.cc",
+ "version.h",
+ "vlog.cc",
+ "vlog.h",
+ "win/enum_variant.cc",
+ "win/enum_variant.h",
+ "win/event_trace_consumer.h",
+ "win/event_trace_controller.cc",
+ "win/event_trace_controller.h",
+ "win/event_trace_provider.cc",
+ "win/event_trace_provider.h",
+ "win/i18n.cc",
+ "win/i18n.h",
+ "win/iat_patch_function.cc",
+ "win/iat_patch_function.h",
+ "win/iunknown_impl.cc",
+ "win/iunknown_impl.h",
+ "win/message_window.cc",
+ "win/message_window.h",
+ "win/metro.cc",
+ "win/metro.h",
+ "win/object_watcher.cc",
+ "win/object_watcher.h",
+ "win/registry.cc",
+ "win/registry.h",
+ "win/resource_util.cc",
+ "win/resource_util.h",
+ "win/sampling_profiler.cc",
+ "win/sampling_profiler.h",
+ "win/scoped_bstr.cc",
+ "win/scoped_bstr.h",
+ "win/scoped_co_mem.h",
+ "win/scoped_com_initializer.h",
+ "win/scoped_comptr.h",
+ "win/scoped_gdi_object.h",
+ "win/scoped_handle.cc",
+ "win/scoped_handle.h",
+ "win/scoped_hdc.h",
+ "win/scoped_hglobal.h",
+ "win/scoped_process_information.cc",
+ "win/scoped_process_information.h",
+ "win/scoped_propvariant.h",
+ "win/scoped_select_object.h",
+ "win/scoped_variant.cc",
+ "win/scoped_variant.h",
+ "win/shortcut.cc",
+ "win/shortcut.h",
+ "win/startup_information.cc",
+ "win/startup_information.h",
+ "win/text_services_message_filter.cc",
+ "win/text_services_message_filter.h",
+ "win/win_util.cc",
+ "win/win_util.h",
+ "win/windows_version.cc",
+ "win/windows_version.h",
+ "win/wrapped_window_proc.cc",
+ "win/wrapped_window_proc.h",
+ ]
+
+ # TODO(brettw) I don't understand the conditions this file is used.
+ sources -= "files/file_path_watcher_stub.cc"
+
+ sources -= [
+ # TODO(brettw) do these properly.
+ "message_loop/message_pump_aurax11.cc",
+ "message_loop/message_pump_aurax11.h",
+ "message_loop/message_pump_glib.cc",
+ "message_loop/message_pump_glib.h",
+ "message_loop/message_pump_gtk.cc",
+ "message_loop/message_pump_gtk.h",
+ "message_loop/message_pump_ozone.cc",
+ "message_loop/message_pump_ozone.h",
+
+ "process/process_handle_freebsd.cc",
+ "process/process_handle_openbsd.cc",
+ "process/process_iterator_freebsd.cc",
+ "process/process_iterator_openbsd.cc",
+ "process/process_metrics_freebsd.cc",
+ "process/process_metrics_openbsd.cc",
+ "sys_info_freebsd.cc",
+ "sys_info_openbsd.cc",
+ ]
+
+ if (!is_chromeos) {
+ sources -= [
+ "sys_info_chromeos.cc",
+ ]
+ }
+
+ # Remove nacl stuff.
+ if (!is_nacl) {
+ sources -= [
+ "os_compat_nacl.cc",
+ "os_compat_nacl.h",
+ "rand_util_nacl.cc",
+ "third_party/nspr/prcpucfg_nacl.h",
+ "memory/shared_memory_nacl.cc",
+ ]
+ }
+
+ # Windows.
+ if (is_win && !is_nacl) {
+ sources -= [
+ "strings/string16.cc",
+ # Not using sha1_win.cc because it may have caused a
+ # regression to page cycler moz.
+ "sha1_win.cc",
+ ]
+
+ if (is_component_build) {
+ sources -= "debug/debug_on_start_win.cc"
+ }
+ }
+
+ # Mac.
+ if (is_mac) {
+ sources -= [
+ "base_paths_posix.cc",
+ "native_library_posix.cc",
+ "strings/sys_string_conversions_posix.cc",
+ ]
+ } else {
+ sources -= "files/file_path_watcher_kqueue.cc"
+ }
+
+ # Non-Mac Unix stuff.
+ if (is_mac) { #!is_posix || is_mac) {
+ sources -= [
+ "nix/mime_util_xdg.cc",
+ "nix/mime_util_xdg.h",
+ "nix/xdg_util.cc",
+ "nix/xdg_util.h",
+ "third_party/xdg_mime/xdgmime.h",
+ ]
+ }
+
+ defines = [
+ "BASE_IMPLEMENTATION",
+ ]
+
+ deps = [
+ ":base_static",
+ "//base/allocator:allocator_extension_thunks",
+ "//third_party/modp_b64",
+ "//base/third_party/dynamic_annotations",
+ ]
+
+ if (!is_win) {
+ deps += "//third_party/libevent"
+ }
+ if (is_mac) {
+ deps += "//third_party/mach_override"
+ }
+}
+
+# This is the subset of files from base that should not be used with a dynamic
+# library. Note that this library cannot depend on base because base depends on
+# base_static.
+static_library("base_static") {
+ sources = [
+ "base_switches.cc",
+ "base_switches.h",
+ "win/pe_image.cc",
+ "win/pe_image.h",
+ ]
+}
+
+component("base_i18n") {
+ sources = [
+ "i18n/base_i18n_export.h",
+ "i18n/bidi_line_iterator.cc",
+ "i18n/bidi_line_iterator.h",
+ "i18n/break_iterator.cc",
+ "i18n/break_iterator.h",
+ "i18n/char_iterator.cc",
+ "i18n/char_iterator.h",
+ "i18n/case_conversion.cc",
+ "i18n/case_conversion.h",
+ "i18n/file_util_icu.cc",
+ "i18n/file_util_icu.h",
+ "i18n/icu_encoding_detection.cc",
+ "i18n/icu_encoding_detection.h",
+ "i18n/icu_string_conversions.cc",
+ "i18n/icu_string_conversions.h",
+ "i18n/icu_util.cc",
+ "i18n/icu_util.h",
+ "i18n/number_formatting.cc",
+ "i18n/number_formatting.h",
+ "i18n/rtl.cc",
+ "i18n/rtl.h",
+ "i18n/string_compare.cc",
+ "i18n/string_compare.h",
+ "i18n/string_search.cc",
+ "i18n/string_search.h",
+ "i18n/time_formatting.cc",
+ "i18n/time_formatting.h",
+ ]
+ deps = [
+ ":base",
+ "//base/third_party/dynamic_annotations",
+ "//third_party/icu:icui18n",
+ "//third_party/icu:icuuc",
+ ]
+ defines = [
+ "BASE_I18N_IMPLEMENTATION",
+ ]
+ #'conditions': [
+ # ['toolkit_uses_gtk==1', {
+ # 'deps': [
+ # # i18n/rtl.cc uses gtk
+ # '../build/linux/system.gyp:gtk',
+ # ],
+ # }],
+ # ['OS == "win"', {
+ # # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
+ # 'msvs_disabled_warnings': [
+ # 4267,
+ # ],
+ # }],
+ #],
+ #'export_dependent_settings': [
+ # 'base',
+ #],
+ #'variables': {
+ # 'enable_wexit_time_destructors': 1,
+ # 'optimize': 'max',
+ #},
+}
+
+static_library("test_support_base") {
+ sources = [
+ "perftimer.cc",
+ "test/expectations/expectation.cc",
+ "test/expectations/expectation.h",
+ "test/expectations/parser.cc",
+ "test/expectations/parser.h",
+ "test/mock_chrome_application_mac.h",
+ "test/mock_chrome_application_mac.mm",
+ "test/mock_devices_changed_observer.cc",
+ "test/mock_devices_changed_observer.h",
+ "test/mock_time_provider.cc",
+ "test/mock_time_provider.h",
+ "test/multiprocess_test.cc",
+ "test/multiprocess_test.h",
+ "test/multiprocess_test_android.cc",
+ "test/null_task_runner.cc",
+ "test/null_task_runner.h",
+ "test/perf_test_suite.cc",
+ "test/perf_test_suite.h",
+ "test/scoped_locale.cc",
+ "test/scoped_locale.h",
+ "test/scoped_path_override.cc",
+ "test/scoped_path_override.h",
+ "test/sequenced_task_runner_test_template.cc",
+ "test/sequenced_task_runner_test_template.h",
+ "test/sequenced_worker_pool_owner.cc",
+ "test/sequenced_worker_pool_owner.h",
+ "test/simple_test_clock.cc",
+ "test/simple_test_clock.h",
+ "test/simple_test_tick_clock.cc",
+ "test/simple_test_tick_clock.h",
+ "test/task_runner_test_template.cc",
+ "test/task_runner_test_template.h",
+ "test/test_file_util.h",
+ "test/test_file_util_linux.cc",
+ "test/test_file_util_mac.cc",
+ "test/test_file_util_posix.cc",
+ "test/test_file_util_win.cc",
+ "test/test_listener_ios.h",
+ "test/test_listener_ios.mm",
+ "test/test_pending_task.cc",
+ "test/test_pending_task.h",
+ "test/test_process_killer_win.cc",
+ "test/test_process_killer_win.h",
+ "test/test_reg_util_win.cc",
+ "test/test_reg_util_win.h",
+ "test/test_shortcut_win.cc",
+ "test/test_shortcut_win.h",
+ "test/test_simple_task_runner.cc",
+ "test/test_simple_task_runner.h",
+ "test/test_suite.cc",
+ "test/test_suite.h",
+ "test/test_support_android.cc",
+ "test/test_support_android.h",
+ "test/test_support_ios.h",
+ "test/test_support_ios.mm",
+ "test/test_switches.cc",
+ "test/test_switches.h",
+ "test/test_timeouts.cc",
+ "test/test_timeouts.h",
+ "test/thread_test_helper.cc",
+ "test/thread_test_helper.h",
+ "test/trace_event_analyzer.cc",
+ "test/trace_event_analyzer.h",
+ "test/values_test_util.cc",
+ "test/values_test_util.h",
+ ]
+ deps = [
+ ":base",
+ ":base_static",
+ ":base_i18n",
+ "//testing:gmock",
+ "//testing:gtest",
+ ]
+
+ if (!is_posix) {
+ sources -= [
+ "test/scoped_locale.cc",
+ "test/scoped_locale.h",
+ ]
+ }
+ if (is_ios) {
+ # Pull in specific Mac files for iOS (which have been filtered out
+ # by file name rules).
+ { # Temporarily override the assignment filter in a new scope.
+ set_sources_assignment_filter([])
+ sources += "test/test_file_util_mac.cc"
+ }
+ }
+ #if (!is_bsd) {
+ # sources -= "test/test_file_util_linux.cc"
+ #}
+ #if (use_gtk) {
+ # deps += "/build/linux/system:gtk"
+ #}
+ #export_dependent_settings [
+ # 'base',
+ #]
+}
+
+config("perf_test_config") {
+ defines = [ "PERF_TEST" ]
+}
+
+static_library("test_support_perf") {
+ sources = [
+ "perftimer.cc",
+ "test/run_all_perftests.cc",
+ ]
+ deps = [
+ ":base",
+ "//testing:gtest",
+ ]
+
+ direct_dependent_configs = [ ":perf_test_config" ]
+
+ #if (toolkit_uses_gtk) {
+ # deps += "/build/linux/system:gtk",
+ #}
+}
+
+static_library("run_all_unittests") {
+ sources = [
+ "test/run_all_unittests.cc",
+ ]
+ deps = [
+ ":test_support_base",
+ ]
+}
diff --git a/chromium/tools/gn/secondary/base/allocator/BUILD.gn b/chromium/tools/gn/secondary/base/allocator/BUILD.gn
index 6766911463f..bbcfe655c64 100644
--- a/chromium/tools/gn/secondary/base/allocator/BUILD.gn
+++ b/chromium/tools/gn/secondary/base/allocator/BUILD.gn
@@ -1,10 +1,6 @@
-# Copyright (c) 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.
-
-static_library("allocator_extension_thunks") {
- sources = [
- "allocator_extension_thunks.cc",
- "allocator_extension_thunks.h",
- ]
-}
+static_library("allocator_extension_thunks") {
+ sources = [
+ "allocator_extension_thunks.cc",
+ "allocator_extension_thunks.h",
+ ]
+}
diff --git a/chromium/tools/gn/secondary/base/third_party/dynamic_annotations/BUILD.gn b/chromium/tools/gn/secondary/base/third_party/dynamic_annotations/BUILD.gn
index bf050bf7914..e3939c35542 100644
--- a/chromium/tools/gn/secondary/base/third_party/dynamic_annotations/BUILD.gn
+++ b/chromium/tools/gn/secondary/base/third_party/dynamic_annotations/BUILD.gn
@@ -1,11 +1,7 @@
-# Copyright (c) 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.
-
-static_library("dynamic_annotations") {
- sources = [
- "dynamic_annotations.c",
- "dynamic_annotations.h",
- "../valgrind/valgrind.h",
- ]
-}
+static_library("dynamic_annotations") {
+ sources = [
+ "dynamic_annotations.c",
+ "dynamic_annotations.h",
+ "../valgrind/valgrind.h",
+ ]
+}
diff --git a/chromium/tools/gn/secondary/base/third_party/nspr/BUILD.gn b/chromium/tools/gn/secondary/base/third_party/nspr/BUILD.gn
deleted file mode 100644
index dafd9f19c3d..00000000000
--- a/chromium/tools/gn/secondary/base/third_party/nspr/BUILD.gn
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (c) 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.
-
-static_library("nspr") {
- sources = [
- "prcpucfg.h",
- "prcpucfg_freebsd.h",
- "prcpucfg_linux.h",
- "prcpucfg_mac.h",
- "prcpucfg_nacl.h",
- "prcpucfg_openbsd.h",
- "prcpucfg_solaris.h",
- "prcpucfg_win.h",
- "prtime.cc",
- "prtime.h",
- "prtypes.h",
- ]
-}
diff --git a/chromium/tools/gn/secondary/base/third_party/symbolize/BUILD.gn b/chromium/tools/gn/secondary/base/third_party/symbolize/BUILD.gn
deleted file mode 100644
index c13c0d86f4f..00000000000
--- a/chromium/tools/gn/secondary/base/third_party/symbolize/BUILD.gn
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (c) 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.
-
-static_library("symbolize") {
- sources = [
- "config.h",
- "demangle.cc",
- "demangle.h",
- "glog/logging.h",
- "glog/raw_logging.h",
- "symbolize.cc",
- "symbolize.h",
- "utilities.h",
- ]
-
- configs -= "//build/config/compiler:chromium_code"
- configs += "//build/config/compiler:no_chromium_code"
-}
diff --git a/chromium/tools/gn/secondary/base/third_party/xdg_mime/BUILD.gn b/chromium/tools/gn/secondary/base/third_party/xdg_mime/BUILD.gn
deleted file mode 100644
index 9e51bc112ea..00000000000
--- a/chromium/tools/gn/secondary/base/third_party/xdg_mime/BUILD.gn
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (c) 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.
-
-static_library("xdg_mime") {
- sources = [
- "xdgmime.c",
- "xdgmime.h",
- "xdgmimealias.c",
- "xdgmimealias.h",
- "xdgmimecache.c",
- "xdgmimecache.h",
- "xdgmimeglob.c",
- "xdgmimeglob.h",
- "xdgmimeicon.c",
- "xdgmimeicon.h",
- "xdgmimeint.c",
- "xdgmimeint.h",
- "xdgmimemagic.c",
- "xdgmimemagic.h",
- "xdgmimeparent.c",
- "xdgmimeparent.h",
- ]
-
- configs -= "//build/config/compiler:chromium_code"
- configs += "//build/config/compiler:no_chromium_code"
-}
diff --git a/chromium/tools/gn/secondary/base/third_party/xdg_user_dirs/BUILD.gn b/chromium/tools/gn/secondary/base/third_party/xdg_user_dirs/BUILD.gn
deleted file mode 100644
index f2145b7863f..00000000000
--- a/chromium/tools/gn/secondary/base/third_party/xdg_user_dirs/BUILD.gn
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 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.
-
-static_library("xdg_user_dirs") {
- sources = [
- "xdg_user_dir_lookup.cc",
- "xdg_user_dir_lookup.h",
- ]
-}
diff --git a/chromium/tools/gn/secondary/build/config/BUILD.gn b/chromium/tools/gn/secondary/build/config/BUILD.gn
index c9fc2e7d3d0..94cb3973509 100644
--- a/chromium/tools/gn/secondary/build/config/BUILD.gn
+++ b/chromium/tools/gn/secondary/build/config/BUILD.gn
@@ -1,52 +1,48 @@
-# Copyright (c) 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.
-
-config("my_msvs") {
- defines = [
- "CHROMIUM_BUILD",
- "TOOLKIT_VIEWS=1",
- "USE_LIBJPEG_TURBO=1",
- "ENABLE_ONE_CLICK_SIGNIN",
- "ENABLE_REMOTING=1",
- "ENABLE_WEBRTC=1",
- "ENABLE_CONFIGURATION_POLICY",
- "ENABLE_INPUT_SPEECH",
- "ENABLE_NOTIFICATIONS",
- "ENABLE_GPU=1",
- "ENABLE_EGLIMAGE=1",
- "ENABLE_TASK_MANAGER=1",
- "ENABLE_EXTENSIONS=1",
- "ENABLE_PLUGIN_INSTALLATION=1",
- "ENABLE_PLUGINS=1",
- "ENABLE_SESSION_SERVICE=1",
- "ENABLE_THEMES=1",
- "ENABLE_AUTOFILL_DIALOG=1",
- "ENABLE_BACKGROUND=1",
- "ENABLE_AUTOMATION=1",
- "ENABLE_GOOGLE_NOW=1",
- "ENABLE_LANGUAGE_DETECTION=1",
- "ENABLE_PRINTING=1",
- "ENABLE_CAPTIVE_PORTAL_DETECTION=1",
- "ENABLE_APP_LIST=1",
- "ENABLE_MESSAGE_CENTER=1",
- "ENABLE_SETTINGS_APP=1",
- "ENABLE_MANAGED_USERS=1",
- ]
-}
-
-config("feature_flags") {
- #defines =
-}
-
-config("debug") {
- defines = [
- "_DEBUG",
- "DYNAMIC_ANNOTATIONS_ENABLED=1",
- "WTF_USE_DYNAMIC_ANNOTATIONS=1",
- ]
-}
-
-config("release") {
-
-}
+config("my_msvs") {
+ defines = [
+ "CHROMIUM_BUILD",
+ "TOOLKIT_VIEWS=1",
+ "USE_LIBJPEG_TURBO=1",
+ "ENABLE_ONE_CLICK_SIGNIN",
+ "ENABLE_REMOTING=1",
+ "ENABLE_WEBRTC=1",
+ "ENABLE_CONFIGURATION_POLICY",
+ "ENABLE_INPUT_SPEECH",
+ "ENABLE_NOTIFICATIONS",
+ "ENABLE_GPU=1",
+ "ENABLE_EGLIMAGE=1",
+ "ENABLE_TASK_MANAGER=1",
+ "ENABLE_EXTENSIONS=1",
+ "ENABLE_PLUGIN_INSTALLATION=1",
+ "ENABLE_PLUGINS=1",
+ "ENABLE_SESSION_SERVICE=1",
+ "ENABLE_THEMES=1",
+ "ENABLE_AUTOFILL_DIALOG=1",
+ "ENABLE_BACKGROUND=1",
+ "ENABLE_AUTOMATION=1",
+ "ENABLE_GOOGLE_NOW=1",
+ "ENABLE_LANGUAGE_DETECTION=1",
+ "ENABLE_PRINTING=1",
+ "ENABLE_CAPTIVE_PORTAL_DETECTION=1",
+ "ENABLE_APP_LIST=1",
+ "ENABLE_MESSAGE_CENTER=1",
+ "ENABLE_SETTINGS_APP=1",
+ "ENABLE_MANAGED_USERS=1",
+ ]
+}
+
+config("feature_flags") {
+ #defines =
+}
+
+config("debug") {
+ defines = [
+ "_DEBUG",
+ "DYNAMIC_ANNOTATIONS_ENABLED=1",
+ "WTF_USE_DYNAMIC_ANNOTATIONS=1",
+ ]
+}
+
+config("release") {
+
+}
diff --git a/chromium/tools/gn/secondary/build/config/BUILDCONFIG.gn b/chromium/tools/gn/secondary/build/config/BUILDCONFIG.gn
index 5756e84eb79..d203677b2d1 100644
--- a/chromium/tools/gn/secondary/build/config/BUILDCONFIG.gn
+++ b/chromium/tools/gn/secondary/build/config/BUILDCONFIG.gn
@@ -1,210 +1,202 @@
-# Copyright (c) 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.
-
-# =============================================================================
-# BUILD FLAGS
-# =============================================================================
-#
-# This block lists input arguments to the build, along with their default
-# values. GN requires listing them explicitly so it can validate input and have
-# a central place to manage the build flags.
-#
-# If a value is specified on the command line, it will overwrite the defaults
-# given here, otherwise the default will be injected into the root scope.
-#
-# KEEP IN ALPHABETICAL ORDER and write a good description for everything.
-# Use "is_*" names for intrinsic platform descriptions and build modes, and
-# "use_*" names for optional features libraries, and configurations.
-declare_args() {
- is_android = 0
- is_component_build = 1
- is_chromeos = 0
- is_debug = 1
- is_ios = 0
- use_ash = 0
- use_aura = 0
- use_ozone = 0
-}
-
-# =============================================================================
-# SOURCES FILTERS
-# =============================================================================
-#
-# These patterns filter out platform-specific files when assigning to the
-# sources variable. The magic variable |sources_assignment_filter| is applied
-# to each assignment or appending to the sources variable and matches are
-# automatcally removed.
-#
-# We define lists of filters for each platform for all builds so they can
-# be used by individual targets if necessary (a target can always change
-# sources_assignment_filter on itself if it needs something more specific).
-#
-# Note that the patterns are NOT regular expressions. Only "*" and "\b" (path
-# boundary = end of string or slash) are supported, and the entire string
-# muct match the pattern (so you need "*.cc" to match all .cc files, for
-# example).
-
-windows_sources_filters = [
- "*_win.cc",
- "*_win.h",
- "*_win_unittest.cc",
- "*\bwin/*",
-]
-mac_sources_filters = [
- "*_mac.h",
- "*_mac.cc",
- "*_mac.mm",
- "*_mac_unittest.h",
- "*_mac_unittest.cc",
- "*_mac_unittest.mm",
- "*\bmac/*",
- "*_cocoa.h",
- "*_cocoa.cc",
- "*_cocoa.mm",
- "*_cocoa_unittest.h",
- "*_cocoa_unittest.cc",
- "*_cocoa_unittest.mm",
- "*\bcocoa/*",
-]
-ios_sources_filters = [
- "*_ios.h",
- "*_ios.cc",
- "*_ios.mm",
- "*_ios_unittest.h",
- "*_ios_unittest.cc",
- "*_ios_unittest.mm",
- "*\bios/*",
-]
-objective_c_sources_filters = [
- "*.mm",
-]
-linux_sources_filters = [
- "*_linux.h",
- "*_linux.cc",
- "*_linux_unittest.h",
- "*_linux_unittest.cc",
- "*\blinux/*",
-]
-android_sources_filters = [
- "*_android.h",
- "*_android.cc",
- "*_android_unittest.h",
- "*_android_unittest.cc",
- "*\bandroid/*",
-]
-posix_sources_filters = [
- "*_posix.h",
- "*_posix.cc",
- "*_posix_unittest.h",
- "*_posix_unittest.cc",
- "*\bposix/*",
-]
-
-# Construct the full list of sources we're using for this platform.
-sources_assignment_filter = []
-if (is_win) {
- sources_assignment_filter += posix_sources_filters
-} else {
- sources_assignment_filter += windows_sources_filters
-}
-if (!is_mac) {
- sources_assignment_filter += mac_sources_filters
-}
-if (!is_ios) {
- sources_assignment_filter += ios_sources_filters
-}
-if (!is_mac && !is_ios) {
- sources_assignment_filter += objective_c_sources_filters
-}
-if (!is_linux) {
- sources_assignment_filter += linux_sources_filters
-}
-if (!is_android) {
- sources_assignment_filter += android_sources_filters
-}
-
-# This is the actual set.
-set_sources_assignment_filter(sources_assignment_filter)
-
-# =============================================================================
-# SYSTEM CONFIG
-# =============================================================================
-
-is_nacl = 0
-
-# =============================================================================
-# BUILD OPTIONS
-# =============================================================================
-
-if (is_component_build) {
- component_mode = "shared_library"
-} else {
- component_mode = "static_library"
-}
-
-# =============================================================================
-# TARGET DEFAULTS
-# =============================================================================
-#
-# Set up the default configuration for every build target of the given type.
-# The values configured here will be automatically set on the scope of the
-# corresponding target. Target definitions can add or remove to the settings
-# here as needed.
-
-# Holds all configs used for making native executables and libraries, to avoid
-# duplication in each target below.
-native_compiler_configs = [
- "//build/config:my_msvs", # TODO(brettw) eraseme
-
- "//build/config/compiler:compiler",
- "//build/config/compiler:chromium_code",
- "//build/config/compiler:default_warnings",
- "//build/config/compiler:no_rtti",
- "//build/config/compiler:runtime_library",
-]
-if (is_win) {
- native_compiler_configs += "//build/config/win:sdk"
-} else if (is_mac) {
- # TODO(brettw) this should be in an if (is_clang) block instead but I haven't
- # written an is_clang flag yet.
- native_compiler_configs += "//build/config/clang:find_bad_constructs"
-}
-
-if (is_debug) {
- native_compiler_configs += "//build/config:debug"
-} else {
- native_compiler_configs += "//build/config:release"
-}
-
-set_defaults("executable") {
- configs = native_compiler_configs
- if (is_mac) {
- configs += "//build/config/mac:mac_dynamic_flags"
- } else if (is_linux) {
- configs += "//build/config/linux:executable_ldconfig"
- }
-}
-
-set_defaults("static_library") {
- configs = native_compiler_configs
-}
-
-set_defaults("shared_library") {
- configs = native_compiler_configs
- if (is_mac) {
- configs += "//build/config/mac:mac_dynamic_flags"
- }
-}
-
-# ==============================================================================
-# TOOLCHAIN SETUP
-# ==============================================================================
-
-if (is_win) {
- set_default_toolchain("//build/config/win:32")
-} else if (is_linux) {
- set_default_toolchain("//build/config/linux/toolchain:gcc")
-} else if (is_mac) {
- set_default_toolchain("//build/config/mac:clang")
-}
+# =============================================================================
+# BUILD FLAGS
+# =============================================================================
+#
+# This block lists input arguments to the build, along with their default
+# values. GN requires listing them explicitly so it can validate input and have
+# a central place to manage the build flags.
+#
+# If a value is specified on the command line, it will overwrite the defaults
+# given here, otherwise the default will be injected into the root scope.
+#
+# KEEP IN ALPHABETICAL ORDER and write a good description for everything.
+# Use "is_*" names for intrinsic platform descriptions and build modes, and
+# "use_*" names for optional features libraries, and configurations.
+declare_args() {
+ is_android = 0
+ is_component_build = 1
+ is_chromeos = 0
+ is_debug = 1
+ is_ios = 0
+ use_ash = 0
+ use_aura = 0
+ use_ozone = 0
+}
+
+# =============================================================================
+# SOURCES FILTERS
+# =============================================================================
+#
+# These patterns filter out platform-specific files when assigning to the
+# sources variable. The magic variable |sources_assignment_filter| is applied
+# to each assignment or appending to the sources variable and matches are
+# automatcally removed.
+#
+# We define lists of filters for each platform for all builds so they can
+# be used by individual targets if necessary (a target can always change
+# sources_assignment_filter on itself if it needs something more specific).
+#
+# Note that the patterns are NOT regular expressions. Only "*" and "\b" (path
+# boundary = end of string or slash) are supported, and the entire string
+# muct match the pattern (so you need "*.cc" to match all .cc files, for
+# example).
+
+windows_sources_filters = [
+ "*_win.cc",
+ "*_win.h",
+ "*_win_unittest.cc",
+ "*\bwin/*",
+]
+mac_sources_filters = [
+ "*_mac.h",
+ "*_mac.cc",
+ "*_mac.mm",
+ "*_mac_unittest.h",
+ "*_mac_unittest.cc",
+ "*_mac_unittest.mm",
+ "*\bmac/*",
+ "*_cocoa.h",
+ "*_cocoa.cc",
+ "*_cocoa.mm",
+ "*_cocoa_unittest.h",
+ "*_cocoa_unittest.cc",
+ "*_cocoa_unittest.mm",
+ "*\bcocoa/*",
+]
+ios_sources_filters = [
+ "*_ios.h",
+ "*_ios.cc",
+ "*_ios.mm",
+ "*_ios_unittest.h",
+ "*_ios_unittest.cc",
+ "*_ios_unittest.mm",
+ "*\bios/*",
+]
+objective_c_sources_filters = [
+ "*.mm",
+]
+linux_sources_filters = [
+ "*_linux.h",
+ "*_linux.cc",
+ "*_linux_unittest.h",
+ "*_linux_unittest.cc",
+ "*\blinux/*",
+]
+android_sources_filters = [
+ "*_android.h",
+ "*_android.cc",
+ "*_android_unittest.h",
+ "*_android_unittest.cc",
+ "*\bandroid/*",
+]
+posix_sources_filters = [
+ "*_posix.h",
+ "*_posix.cc",
+ "*_posix_unittest.h",
+ "*_posix_unittest.cc",
+ "*\bposix/*",
+]
+
+# Construct the full list of sources we're using for this platform.
+sources_assignment_filter = []
+if (is_win) {
+ sources_assignment_filter += posix_sources_filters
+} else {
+ sources_assignment_filter += windows_sources_filters
+}
+if (!is_mac) {
+ sources_assignment_filter += mac_sources_filters
+}
+if (!is_ios) {
+ sources_assignment_filter += ios_sources_filters
+}
+if (!is_mac && !is_ios) {
+ sources_assignment_filter += objective_c_sources_filters
+}
+if (!is_linux) {
+ sources_assignment_filter += linux_sources_filters
+}
+if (!is_android) {
+ sources_assignment_filter += android_sources_filters
+}
+
+# This is the actual set.
+set_sources_assignment_filter(sources_assignment_filter)
+
+# =============================================================================
+# SYSTEM CONFIG
+# =============================================================================
+
+is_nacl = 0
+
+# =============================================================================
+# BUILD OPTIONS
+# =============================================================================
+
+if (is_component_build) {
+ component_mode = "shared_library"
+} else {
+ component_mode = "static_library"
+}
+
+# =============================================================================
+# TARGET DEFAULTS
+# =============================================================================
+#
+# Set up the default configuration for every build target of the given type.
+# The values configured here will be automatically set on the scope of the
+# corresponding target. Target definitions can add or remove to the settings
+# here as needed.
+
+# Holds all configs used for making native executables and libraries, to avoid
+# duplication in each target below.
+native_compiler_configs = [
+ "//build/config:my_msvs", # TODO(brettw) eraseme
+
+ "//build/config/compiler:compiler",
+ "//build/config/compiler:chromium_code",
+ "//build/config/compiler:default_warnings",
+ "//build/config/compiler:no_rtti",
+ "//build/config/compiler:runtime_library",
+]
+if (is_win) {
+ native_compiler_configs += "//build/config/win:sdk"
+} else if (is_mac) {
+ # TODO(brettw) this should be in an if (is_clang) block instead but I haven't
+ # written an is_clang flag yet.
+ native_compiler_configs += "//build/config/clang:find_bad_constructs"
+}
+
+if (is_debug) {
+ native_compiler_configs += "//build/config:debug"
+} else {
+ native_compiler_configs += "//build/config:release"
+}
+
+set_defaults("executable") {
+ configs = native_compiler_configs
+ if (is_mac) {
+ configs += "//build/config/mac:mac_dynamic_flags"
+ }
+}
+
+set_defaults("static_library") {
+ configs = native_compiler_configs
+}
+
+set_defaults("shared_library") {
+ configs = native_compiler_configs
+ if (is_mac) {
+ configs += "//build/config/mac:mac_dynamic_flags"
+ }
+}
+
+# ==============================================================================
+# TOOLCHAIN SETUP
+# ==============================================================================
+
+if (is_win) {
+ set_default_toolchain("//build/config/win:32")
+} else if (is_mac) {
+ set_default_toolchain("//build/config/mac:clang")
+}
diff --git a/chromium/tools/gn/secondary/build/config/compiler/BUILD.gn b/chromium/tools/gn/secondary/build/config/compiler/BUILD.gn
index 00ebe8f098c..04f73e077dc 100644
--- a/chromium/tools/gn/secondary/build/config/compiler/BUILD.gn
+++ b/chromium/tools/gn/secondary/build/config/compiler/BUILD.gn
@@ -11,121 +11,67 @@ config("compiler") {
"/Od", "/WX", "/Zi", "/Gy", "/GS", "/RTC1", "/EHsc",
]
} else {
- # Common GCC compiler flags setup.
- # --------------------------------
cflags = [
- "-fno-strict-aliasing", # See http://crbug.com/32204
- "-fvisibility=hidden",
- "-g", # Debug symbols.
- ]
- cflags_c = [
- ]
- cflags_cc = [
- "-fno-exceptions",
+ # TODO(brettw) obviously this needs to be parameterized.
+ "-arch i386",
+
+ # See http://crbug.com/32204
+ "-fno-strict-aliasing",
+
"-fno-threadsafe-statics",
+ "-fstack-protector-all",
+ "-fvisibility=hidden",
"-fvisibility-inlines-hidden",
]
- ldflags = [
- "-Wl,-z,now",
- "-Wl,-z,relro",
- ]
+ # !!! Please keep additions sorted alphabetically.
- # Optimization.
- if (is_debug) {
+ # TODO(brettw) these should be clang-only.
+ # if (is_clang) {
cflags += [
- "-O0" # No optimization.
+ "-fcolor-diagnostics",
]
- } else {
- # TODO(brettw) release optimization.
- }
-
- # Stack protection.
- # TODO(brettw) why do we have different values for all of these cases?
- if (is_mac) {
- cflags += "-fstack-protector-all"
- } else if (is_chromeos) {
- cflags += "-fstack-protector-strong"
- } else if (is_linux) {
- cflags += [ "-fstack-protector", "--param=ssp-buffer-size=4" ]
- }
+ #}
- # Mac-specific compiler flags setup.
- # ----------------------------------
- if (is_mac) {
- # These flags are shared between the C compiler and linker.
- common_mac_flags = [
- # TODO(brettw) obviously this arch flag needs to be parameterized.
- "-arch i386",
-
- # Set which SDK to use.
- # TODO(brettw) this needs to be configurable somehow.
- "-isysroot", "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk",
+ cflags_c = [
+ "-std=c99",
+ ]
- "-mmacosx-version-min=10.6",
- ]
+ cflags_cc = [
+ "-fno-exceptions",
+ "-std=gnu++11",
+ ]
+ }
- cflags += common_mac_flags + [
- # Without this, the constructors and destructors of a C++ object inside
- # an Objective C struct won't be called, which is very bad.
- "-fobjc-call-cxx-cdtors",
- ]
+ if (is_mac) {
+ # These are used for both compiler and linker flags on Mac.
+ common_mac_flags = [
+ # TODO(brettw) obviously this needs to be parameterized.
+ "-arch i386",
- cflags_c += [ "-std=c99" ]
- cflags_cc += [ "-std=gnu++11" ]
+ # Set which SDK to use.
+ # TODO(brettw) this needs to be configurable somehow.
+ "-isysroot", "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk",
- ldflags += common_mac_flags + [
- "-L.",
+ "-mmacosx-version-min=10.6",
+ ]
- # TODO(brettW) I don't understand these options.
- "-Wl,-rpath,@loader_path/.",
- "-Wl,-rpath,@loader_path/../../..",
- ]
- }
+ # Mac compiler flags.
+ cflags += [
+ # Without this, the constructors and destructors of a C++ object inside
+ # an Objective C struct won't be called, which is very bad.
+ "-fobjc-call-cxx-cdtors",
+ ]
+ cflags += common_mac_flags
- # Linux-specific compiler flags setup.
- # ------------------------------------
- if (is_linux) {
- cflags += [
- "-fPIC",
- "-pthread",
- "-pipe", # Use pipes for communicating between sub-processes. Faster.
- ]
- ldflags += [
- # Use Gold for linking: it is checked out in the source tree.
- "-B$relative_build_to_source_root_dir/third_party/gold",
-
- "-fPIC",
- "-pthread",
- "-Wl,-z,noexecstack",
-
- # TODO(brettw) gold linker flags, only target.
- # There seems to be a conflict of --icf and -pie in gold which can
- # generate crashy binaries. As a security measure, -pie takes
- # precendence for now.
- # TODO(brettw) common.gypi has this only for target toolset.
- #"-Wl,--icf=safe",
- "-Wl,--icf=none",
-
- # TODO(brettw) gold linker flags, only target.
- # Experimentation found that using four linking threads
- # saved ~20% of link time.
- # https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/281527606915bb36
- # Only apply this to the target linker, since the host
- # linker might not be gold, but isn't used much anyway.
- "-Wl,--threads",
- "-Wl,--thread-count=4",
- ]
- }
+ # Mac linker flags.
+ ldflags = [
+ "-L.",
- # Clang-specific compiler flags setup.
- # ------------------------------------
- # TODO(brettw) these should be clang-only. For now, make it mac-only since
- # that's where we always use clang.
- if (is_mac) { # if (is_clang) {
- cflags += [
- "-fcolor-diagnostics",
- ]
- }
+ # TODO(brettW) I don't understand these options.
+ "-Wl,-rpath,@loader_path/.",
+ "-Wl,-rpath,@loader_path/../../..",
+ ]
+ ldflags += common_mac_flags
}
}
@@ -188,30 +134,12 @@ config("chromium_code") {
cflags = [
"/W4", # Warning level 4.
]
- } else {
+ } else if (is_mac) {
cflags = [
"-Wall",
"-Werror",
-
- # GCC turns on -Wsign-compare for C++ under -Wall, but clang doesn't,
- # so we specify it explicitly.
- # TODO(fischman): remove this if http://llvm.org/PR10448 obsoletes it.
- # http://code.google.com/p/chromium/issues/detail?id=90453
- "-Wsign-compare",
- ]
-
- # In Chromium code, we define __STDC_foo_MACROS in order to get the
- # C99 macros on Mac and Linux.
- defines = [
- "__STDC_CONSTANT_MACROS",
- "__STDC_FORMAT_MACROS",
+ "-Wextra",
]
-
- # TODO(brettw) this should also be enabled on Linux but some files
- # currently fail.
- if (is_mac) {
- cflags += "-Wextra"
- }
}
}
config("no_chromium_code") {
@@ -283,27 +211,26 @@ config("default_warnings") {
"/wd4706", # Assignment within conditional expression.
"/wd4819", # Character not in the current code page.
]
- } else {
- # Common GCC warning setup.
+ }
+
+ # TODO(brettw) this should probably be if(clang).
+ if (is_mac) {
cflags = [
- # Enables.
- "-Wendif-labels", # Weird old-style text after an #endif.
+ # Warn for weird old-style text after an #endif.
+ "-Wendif-labels",
- # Disables.
- "-Wno-missing-field-initializers", # "struct foo f = {0};"
- "-Wno-unused-parameter", # Unused function parameters.
- "-Wno-write-strings",
- ]
+ "-Wnewline-eof",
- if (is_mac) {
- cflags += [
- "-Wnewline-eof",
- ]
- }
+ # Don't warn about the "struct foo f = {0};" initialization pattern.
+ "-Wno-missing-field-initializers",
+
+ # Don't warn about unused function parameters.
+ "-Wno-unused-parameter",
+ ]
# TODO(brettw) Ones below here should be clang-only when we have a flag
# for it.
- if (is_mac) { #if (is_clang) {
+ #if (is_clang) {
cflags += [
"-Wheader-hygiene",
@@ -333,6 +260,6 @@ config("default_warnings") {
# Warns when a const char[] is converted to bool.
"-Wstring-conversion",
]
- }
+ #} #is_clang
}
}
diff --git a/chromium/tools/gn/secondary/build/config/linux/BUILD.gn b/chromium/tools/gn/secondary/build/config/linux/BUILD.gn
deleted file mode 100644
index 74804cb483a..00000000000
--- a/chromium/tools/gn/secondary/build/config/linux/BUILD.gn
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright (c) 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.
-
-# Sets up the dynamic library search path to include our "lib" directory.
-config("executable_ldconfig") {
- ldflags = [
- # Want to pass "\$". Need to escape both '\' and '$'. GN will re-escape as
- # required for ninja.
- "-Wl,-rpath=\\\$ORIGIN/lib/",
-
- "-Wl,-rpath-link=lib/",
- ]
-}
diff --git a/chromium/tools/gn/secondary/build/config/linux/system/BUILD.gn b/chromium/tools/gn/secondary/build/config/linux/system/BUILD.gn
deleted file mode 100644
index 3cecca8d4b3..00000000000
--- a/chromium/tools/gn/secondary/build/config/linux/system/BUILD.gn
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright (c) 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.
-
-pkg_script = "pkg-config.py"
-
-config("glib") {
- glib_packages = "glib-2.0 gmodule-2.0 gobject-2.0 gthread-2.0"
-
- cflags = exec_script(pkg_script, [ "--cflags", glib_packages ], "list lines")
- ldflags = exec_script(pkg_script, [ "--libs", glib_packages ], "list lines")
- # if (use_x11) { # TODO(brettw) need to add use_x11
- ldflags += "-lXtst"
- #}
-}
-
-config("gtk") {
- # Gtk requires gmodule, but it does not list it as a dependency in some
- # misconfigured systems.
- gtk_packages = "gmodule-2.0 gtk+-2.0 gthread-2.0"
-
- cflags = exec_script(pkg_script, [ "--cflags", gtk_packages ], "list lines")
- ldflags = exec_script(pkg_script, [ "--libs", gtk_packages ], "list lines")
-}
-
-config("x11") {
- x11_packages = "x11 xi"
-
- cflags = exec_script(pkg_script, [ "--cflags", x11_packages ], "list lines")
- ldflags = exec_script(pkg_script, [ "--libs", x11_packages ], "list lines")
-}
diff --git a/chromium/tools/gn/secondary/build/config/linux/system/pkg-config.py b/chromium/tools/gn/secondary/build/config/linux/system/pkg-config.py
deleted file mode 100644
index 1cee44883e1..00000000000
--- a/chromium/tools/gn/secondary/build/config/linux/system/pkg-config.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 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.
-
-import subprocess
-import sys
-
-sys.exit(subprocess.call(["pkg-config"] + sys.argv[1:]))
diff --git a/chromium/tools/gn/secondary/build/config/linux/toolchain/BUILD.gn b/chromium/tools/gn/secondary/build/config/linux/toolchain/BUILD.gn
deleted file mode 100644
index b3aed22e450..00000000000
--- a/chromium/tools/gn/secondary/build/config/linux/toolchain/BUILD.gn
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright (c) 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.
-
-cc = "gcc"
-cxx = "g++"
-ld = cxx
-
-toolchain("gcc") {
- tool("cc") {
- # cflags_pch_c
- command = "$cc -MMD -MF \$out.d \$defines \$includes \$cflags \$cflags_c -c \$in -o \$out"
- description = "CC \$out"
- depfile = "\$out.d"
- deps = "gcc"
- }
- tool("cxx") {
- # cflags_pch_cc
- command = "$cxx -MMD -MF \$out.d \$defines \$includes \$cflags \$cflags_cc -c \$in -o \$out"
- description = "CXX \$out"
- depfile = "\$out.d"
- deps = "gcc"
- }
- tool("alink") {
- command = "rm -f \$out && ar rcs \$out \$in"
- description = "AR \$out"
- }
- tool("solink") {
- command = "if [ ! -e \$lib -o ! -e \${lib}.TOC ]; then $ld -shared \$ldflags -o \$lib -Wl,-soname=\$soname -Wl,--whole-archive \$in \$solibs -Wl,--no-whole-archive \$libs && { readelf -d \${lib} | grep SONAME ; nm -gD -f p \${lib} | cut -f1-2 -d' '; } > \${lib}.TOC; else $ld -shared \$ldflags -o \$lib -Wl,-soname=\$soname -Wl,--whole-archive \$in \$solibs -Wl,--no-whole-archive \$libs && { readelf -d \${lib} | grep SONAME ; nm -gD -f p \${lib} | cut -f1-2 -d' '; } > \${lib}.tmp && if ! cmp -s \${lib}.tmp \${lib}.TOC; then mv \${lib}.tmp \${lib}.TOC ; fi; fi"
- description = "SOLINK \$lib"
- #pool = "link_pool"
- restat = "1"
- }
- tool("link") {
- command = "$ld \$ldflags -o \$out -Wl,--start-group \$in \$solibs -Wl,--end-group \$libs"
- description = "LINK \$out"
- #pool = "link_pool"
- }
- tool("stamp") {
- command = "\${postbuilds}touch \$out"
- description = "STAMP \$out"
- }
- tool("copy") {
- command = "ln -f \$in \$out 2>/dev/null || (rm -rf \$out && cp -af \$in \$out)"
- description = "COPY \$in \$out"
- }
-}
diff --git a/chromium/tools/gn/secondary/build/config/mac/BUILD.gn b/chromium/tools/gn/secondary/build/config/mac/BUILD.gn
index cc33e517a60..55ffd03cd20 100644
--- a/chromium/tools/gn/secondary/build/config/mac/BUILD.gn
+++ b/chromium/tools/gn/secondary/build/config/mac/BUILD.gn
@@ -9,6 +9,7 @@ config("mac_dynamic_flags") {
]
}
+
cc = "../../third_party/llvm-build/Release+Asserts/bin/clang"
cxx = "../../third_party/llvm-build/Release+Asserts/bin/clang++"
ld = cxx
diff --git a/chromium/tools/gn/secondary/build/config/win/BUILD.gn b/chromium/tools/gn/secondary/build/config/win/BUILD.gn
index 95b1b307378..955504a5ef3 100644
--- a/chromium/tools/gn/secondary/build/config/win/BUILD.gn
+++ b/chromium/tools/gn/secondary/build/config/win/BUILD.gn
@@ -1,184 +1,184 @@
-# Copyright (c) 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.
-
-# Should only be running on Windows.
-assert(is_win)
-
-# Setup the Visual Studio state.
-#
-# Its argument is the location to write the environment files.
-# It will write "environment.x86" and "environment.x64" to this directory,
-# and return a list to us.
-#
-# The list contains the include path as its only element. (I'm expecting to
-# add more so it's currently a list inside a list.)
-msvc_config = [["foo"]]
-#exec_script("get_msvc_config.py",
- # [relative_root_output_dir],
- # "value")
-
-# 32-bit toolchain -------------------------------------------------------------
-
-toolchain("32") {
- tool("cc") {
- command = "ninja -t msvc -e \$arch -- cl.exe /nologo /showIncludes /FC @\$out.rsp /c \$in /Fo\$out /Fd\$pdbname"
- description = "CC \$out"
- rspfile = "\$out.rsp"
- rspfile_content = "\$defines \$includes \$cflags \$cflags_c"
- deps = "msvc"
- }
- tool("cxx") {
- command = "ninja -t msvc -e \$arch -- cl.exe /nologo /showIncludes /FC @\$out.rsp /c \$in /Fo\$out /Fd\$pdbname"
- description = "CXX \$out"
- rspfile = "\$out.rsp"
- rspfile_content = "\$defines \$includes \$cflags \$cflags_cc"
- deps = "msvc"
- }
- #tool("idl") {
- # command = $python_path gyp-win-tool midl-wrapper \$arch \$outdir \$tlb \$h \$dlldata \$iid \$
- # \$proxy \$in \$idlflags
- # description = IDL \$in
- #}
- #tool("rc") {
- # command = $python_path gyp-win-tool rc-wrapper \$arch rc.exe \$defines \$includes \$rcflags \$
- # /fo\$out \$in
- # description = RC \$in
- #}
- #tool("asm") {
- # command = $python_path gyp-win-tool asm-wrapper \$arch ml.exe \$defines \$includes /c /Fo \$
- # \$out \$in
- # description = ASM \$in
- #}
- tool("alink") {
- command = "$python_path gyp-win-tool link-wrapper \$arch lib.exe /nologo /ignore:4221 /OUT:\$out @\$out.rsp"
- description = "LIB \$out"
- rspfile = "\$out.rsp"
- rspfile_content = "\$in_newline \$libflags"
- }
- #tool("solink_embed_inc") {
- # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag \$
- # /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool \$
- # manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && \$
- # $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests \$
- # -out:\$dll.manifest && $python_path gyp-win-tool manifest-to-rc \$arch \$dll.manifest \$
- # \$dll.manifest.rc 2 && $python_path gyp-win-tool rc-wrapper \$arch rc.exe \$
- # \$dll.manifest.rc && $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$
- # \$implibflag /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp \$dll.manifest.res
- # description = LINK_EMBED_INC(DLL) \$dll
- # restat = 1
- # rspfile = \$dll.rsp
- # rspfile_content = \$libs \$in_newline \$ldflags
- #}
- #tool("solink_module_embed_inc") {
- # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag \$
- # /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool \$
- # manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && \$
- # $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests \$
- # -out:\$dll.manifest && $python_path gyp-win-tool manifest-to-rc \$arch \$dll.manifest \$
- # \$dll.manifest.rc 2 && $python_path gyp-win-tool rc-wrapper \$arch rc.exe \$
- # \$dll.manifest.rc && $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$
- # \$implibflag /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp \$dll.manifest.res
- # description = LINK_EMBED_INC(DLL) \$dll
- # restat = 1
- # rspfile = \$dll.rsp
- # rspfile_content = \$libs \$in_newline \$ldflags
- #}
- #rule link_embed_inc
- # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo /OUT:\$out \$
- # /PDB:\$out.pdb @\$out.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c \$
- # if exist \$out.manifest del \$out.manifest && $python_path gyp-win-tool \$
- # manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -out:\$out.manifest && \$
- # $python_path gyp-win-tool manifest-to-rc \$arch \$out.manifest \$out.manifest.rc 1 && \$
- # $python_path gyp-win-tool rc-wrapper \$arch rc.exe \$out.manifest.rc && \$
- # $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo /OUT:\$out /PDB:\$out.pdb \$
- # @\$out.rsp \$out.manifest.res
- # description = LINK_EMBED_INC \$out
- # rspfile = \$out.rsp
- # rspfile_content = \$in_newline \$libs \$ldflags
- #rule solink_embed
- # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag \$
- # /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool \$
- # manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && \$
- # $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests \$
- # -outputresource:\$dll;2
- # description = LINK_EMBED(DLL) \$dll
- # restat = 1
- # rspfile = \$dll.rsp
- # rspfile_content = \$libs \$in_newline \$ldflags
- #rule solink_module_embed
- # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag \$
- # /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool \$
- # manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && \$
- # $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests \$
- # -outputresource:\$dll;2
- # description = LINK_EMBED(DLL) \$dll
- # restat = 1
- # rspfile = \$dll.rsp
- # rspfile_content = \$libs \$in_newline \$ldflags
- #rule link_embed
- # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo /OUT:\$out \$
- # /PDB:\$out.pdb @\$out.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c \$
- # if exist \$out.manifest del \$out.manifest && $python_path gyp-win-tool \$
- # manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -outputresource:\$out;1
- # description = LINK_EMBED \$out
- # rspfile = \$out.rsp
- # rspfile_content = \$in_newline \$libs \$ldflags
- tool("solink") {
- command = "cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -out:\$dll.manifest"
- description = "LINK(DLL) \$dll"
- restat = "1"
- rspfile = "\$dll.rsp"
- rspfile_content = "\$libs \$in_newline \$ldflags"
- }
- tool("solink_module") {
- command = "cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -out:\$dll.manifet"
- description = "LINK(DLL) \$dll"
- restat = "1"
- rspfile = "\$dll.rsp"
- rspfile_content = "\$libs \$in_newline \$ldflags"
- }
- tool("link") {
- command = "cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo /OUT:\$out /PDB:\$out.pdb @\$out.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c if exist \$out.manifest del \$out.manifest && $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -out:\$out.manifest"
- description = "LINK \$out"
- rspfile = "\$out.rsp"
- rspfile_content = "\$in_newline \$libs \$ldflags"
- }
- tool("stamp") {
- command = "$python_path gyp-win-tool stamp \$out"
- description = "STAMP \$out"
- }
- tool("copy") {
- command = "$python_path gyp-win-tool recursive-mirror \$in \$out"
- description = "COPY \$in \$out"
- }
-}
-
-# 64-bit toolchain -------------------------------------------------------------
-
-toolchain("64") {
-}
-
-# SDK setup --------------------------------------------------------------------
-
-config("sdk") {
- # The include path is the stuff returned by the script plus out own WTL
- # checkout.
- # TODO(brettw) should adding WTL be at this level or should it be more on
- # a per-project basis?
- includes = msvc_config[0] + "../../third_party/wtl/include"
-
- defines = [
- "_ATL_NO_OPENGL",
- "_SECURE_ATL",
- "_WIN32_WINNT=0x0602",
- "_WINDOWS",
- "CERT_CHAIN_PARA_HAS_EXTRA_FIELDS",
- "NOMINMAX",
- "NTDDI_VERSION=0x06020000",
- "PSAPI_VERSION=1",
- "WIN32",
- "WIN32_LEAN_AND_MEAN",
- "WINVER=0x0602",
- ]
-}
+# Copyright (c) 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.
+
+# Should only be running on Windows.
+assert(is_win)
+
+# Setup the Visual Studio state.
+#
+# Its argument is the location to write the environment files.
+# It will write "environment.x86" and "environment.x64" to this directory,
+# and return a list to us.
+#
+# The list contains the include path as its only element. (I'm expecting to
+# add more so it's currently a list inside a list.)
+msvc_config = [["foo"]]
+#exec_script("get_msvc_config.py",
+ # [relative_root_output_dir],
+ # "value")
+
+# 32-bit toolchain -------------------------------------------------------------
+
+toolchain("32") {
+ tool("cc") {
+ command = "ninja -t msvc -e \$arch -- cl.exe /nologo /showIncludes /FC @\$out.rsp /c \$in /Fo\$out /Fd\$pdbname"
+ description = "CC \$out"
+ rspfile = "\$out.rsp"
+ rspfile_content = "\$defines \$includes \$cflags \$cflags_c"
+ deps = "msvc"
+ }
+ tool("cxx") {
+ command = "ninja -t msvc -e \$arch -- cl.exe /nologo /showIncludes /FC @\$out.rsp /c \$in /Fo\$out /Fd\$pdbname"
+ description = "CXX \$out"
+ rspfile = "\$out.rsp"
+ rspfile_content = "\$defines \$includes \$cflags \$cflags_cc"
+ deps = "msvc"
+ }
+ #tool("idl") {
+ # command = $python_path gyp-win-tool midl-wrapper \$arch \$outdir \$tlb \$h \$dlldata \$iid \$
+ # \$proxy \$in \$idlflags
+ # description = IDL \$in
+ #}
+ #tool("rc") {
+ # command = $python_path gyp-win-tool rc-wrapper \$arch rc.exe \$defines \$includes \$rcflags \$
+ # /fo\$out \$in
+ # description = RC \$in
+ #}
+ #tool("asm") {
+ # command = $python_path gyp-win-tool asm-wrapper \$arch ml.exe \$defines \$includes /c /Fo \$
+ # \$out \$in
+ # description = ASM \$in
+ #}
+ tool("alink") {
+ command = "$python_path gyp-win-tool link-wrapper \$arch lib.exe /nologo /ignore:4221 /OUT:\$out @\$out.rsp"
+ description = "LIB \$out"
+ rspfile = "\$out.rsp"
+ rspfile_content = "\$in_newline \$libflags"
+ }
+ #tool("solink_embed_inc") {
+ # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag \$
+ # /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool \$
+ # manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && \$
+ # $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests \$
+ # -out:\$dll.manifest && $python_path gyp-win-tool manifest-to-rc \$arch \$dll.manifest \$
+ # \$dll.manifest.rc 2 && $python_path gyp-win-tool rc-wrapper \$arch rc.exe \$
+ # \$dll.manifest.rc && $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$
+ # \$implibflag /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp \$dll.manifest.res
+ # description = LINK_EMBED_INC(DLL) \$dll
+ # restat = 1
+ # rspfile = \$dll.rsp
+ # rspfile_content = \$libs \$in_newline \$ldflags
+ #}
+ #tool("solink_module_embed_inc") {
+ # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag \$
+ # /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool \$
+ # manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && \$
+ # $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests \$
+ # -out:\$dll.manifest && $python_path gyp-win-tool manifest-to-rc \$arch \$dll.manifest \$
+ # \$dll.manifest.rc 2 && $python_path gyp-win-tool rc-wrapper \$arch rc.exe \$
+ # \$dll.manifest.rc && $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$
+ # \$implibflag /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp \$dll.manifest.res
+ # description = LINK_EMBED_INC(DLL) \$dll
+ # restat = 1
+ # rspfile = \$dll.rsp
+ # rspfile_content = \$libs \$in_newline \$ldflags
+ #}
+ #rule link_embed_inc
+ # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo /OUT:\$out \$
+ # /PDB:\$out.pdb @\$out.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c \$
+ # if exist \$out.manifest del \$out.manifest && $python_path gyp-win-tool \$
+ # manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -out:\$out.manifest && \$
+ # $python_path gyp-win-tool manifest-to-rc \$arch \$out.manifest \$out.manifest.rc 1 && \$
+ # $python_path gyp-win-tool rc-wrapper \$arch rc.exe \$out.manifest.rc && \$
+ # $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo /OUT:\$out /PDB:\$out.pdb \$
+ # @\$out.rsp \$out.manifest.res
+ # description = LINK_EMBED_INC \$out
+ # rspfile = \$out.rsp
+ # rspfile_content = \$in_newline \$libs \$ldflags
+ #rule solink_embed
+ # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag \$
+ # /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool \$
+ # manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && \$
+ # $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests \$
+ # -outputresource:\$dll;2
+ # description = LINK_EMBED(DLL) \$dll
+ # restat = 1
+ # rspfile = \$dll.rsp
+ # rspfile_content = \$libs \$in_newline \$ldflags
+ #rule solink_module_embed
+ # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag \$
+ # /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool \$
+ # manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && \$
+ # $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests \$
+ # -outputresource:\$dll;2
+ # description = LINK_EMBED(DLL) \$dll
+ # restat = 1
+ # rspfile = \$dll.rsp
+ # rspfile_content = \$libs \$in_newline \$ldflags
+ #rule link_embed
+ # command = cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo /OUT:\$out \$
+ # /PDB:\$out.pdb @\$out.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c \$
+ # if exist \$out.manifest del \$out.manifest && $python_path gyp-win-tool \$
+ # manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -outputresource:\$out;1
+ # description = LINK_EMBED \$out
+ # rspfile = \$out.rsp
+ # rspfile_content = \$in_newline \$libs \$ldflags
+ tool("solink") {
+ command = "cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -out:\$dll.manifest"
+ description = "LINK(DLL) \$dll"
+ restat = "1"
+ rspfile = "\$dll.rsp"
+ rspfile_content = "\$libs \$in_newline \$ldflags"
+ }
+ tool("solink_module") {
+ command = "cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo \$implibflag /DLL /OUT:\$dll /PDB:\$dll.pdb @\$dll.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c if exist \$dll.manifest del \$dll.manifest && $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -out:\$dll.manifet"
+ description = "LINK(DLL) \$dll"
+ restat = "1"
+ rspfile = "\$dll.rsp"
+ rspfile_content = "\$libs \$in_newline \$ldflags"
+ }
+ tool("link") {
+ command = "cmd /c $python_path gyp-win-tool link-wrapper \$arch link.exe /nologo /OUT:\$out /PDB:\$out.pdb @\$out.rsp && $python_path gyp-win-tool manifest-wrapper \$arch cmd /c if exist \$out.manifest del \$out.manifest && $python_path gyp-win-tool manifest-wrapper \$arch mt.exe -nologo -manifest \$manifests -out:\$out.manifest"
+ description = "LINK \$out"
+ rspfile = "\$out.rsp"
+ rspfile_content = "\$in_newline \$libs \$ldflags"
+ }
+ tool("stamp") {
+ command = "$python_path gyp-win-tool stamp \$out"
+ description = "STAMP \$out"
+ }
+ tool("copy") {
+ command = "$python_path gyp-win-tool recursive-mirror \$in \$out"
+ description = "COPY \$in \$out"
+ }
+}
+
+# 64-bit toolchain -------------------------------------------------------------
+
+toolchain("64") {
+}
+
+# SDK setup --------------------------------------------------------------------
+
+config("sdk") {
+ # The include path is the stuff returned by the script plus out own WTL
+ # checkout.
+ # TODO(brettw) should adding WTL be at this level or should it be more on
+ # a per-project basis?
+ includes = msvc_config[0] + "../../third_party/wtl/include"
+
+ defines = [
+ "_ATL_NO_OPENGL",
+ "_SECURE_ATL",
+ "_WIN32_WINNT=0x0602",
+ "_WINDOWS",
+ "CERT_CHAIN_PARA_HAS_EXTRA_FIELDS",
+ "NOMINMAX",
+ "NTDDI_VERSION=0x06020000",
+ "PSAPI_VERSION=1",
+ "WIN32",
+ "WIN32_LEAN_AND_MEAN",
+ "WINVER=0x0602",
+ ]
+}
diff --git a/chromium/tools/gn/secondary/ipc/BUILD.gn b/chromium/tools/gn/secondary/ipc/BUILD.gn
index f85208886fd..5e55ee90835 100644
--- a/chromium/tools/gn/secondary/ipc/BUILD.gn
+++ b/chromium/tools/gn/secondary/ipc/BUILD.gn
@@ -1,168 +1,168 @@
-# 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.
-
-component("ipc") {
- sources = [
- "file_descriptor_set_posix.cc",
- "file_descriptor_set_posix.h",
- "ipc_channel.cc",
- "ipc_channel.h",
- "ipc_channel_factory.cc",
- "ipc_channel_factory.h",
- "ipc_channel_handle.h",
- "ipc_channel_nacl.cc",
- "ipc_channel_nacl.h",
- "ipc_channel_posix.cc",
- "ipc_channel_posix.h",
- "ipc_channel_proxy.cc",
- "ipc_channel_proxy.h",
- "ipc_channel_reader.cc",
- "ipc_channel_reader.h",
- "ipc_channel_win.cc",
- "ipc_channel_win.h",
- "ipc_descriptors.h",
- "ipc_export.h",
- "ipc_forwarding_message_filter.cc",
- "ipc_forwarding_message_filter.h",
- "ipc_listener.h",
- "ipc_logging.cc",
- "ipc_logging.h",
- "ipc_message.cc",
- "ipc_message.h",
- "ipc_message_macros.h",
- "ipc_message_start.h",
- "ipc_message_utils.cc",
- "ipc_message_utils.h",
- "ipc_param_traits.h",
- "ipc_platform_file.cc",
- "ipc_platform_file.h",
- "ipc_sender.h",
- "ipc_switches.cc",
- "ipc_switches.h",
- "ipc_sync_channel.cc",
- "ipc_sync_channel.h",
- "ipc_sync_message.cc",
- "ipc_sync_message.h",
- "ipc_sync_message_filter.cc",
- "ipc_sync_message_filter.h",
- "param_traits_log_macros.h",
- "param_traits_macros.h",
- "param_traits_read_macros.h",
- "param_traits_write_macros.h",
- "struct_constructor_macros.h",
- "struct_destructor_macros.h",
- "unix_domain_socket_util.cc",
- "unix_domain_socket_util.h",
- ]
-
- #if (!is_untrusted_nacl) {
- sources -= [
- "ipc_channel_nacl.cc",
- "ipc_channel_nacl.h",
- ]
-
- if (is_win || is_ios) {
- sources -= [
- "ipc_channel_factory.cc",
- "unix_domain_socket_util.cc",
- ]
- }
-
- defines = [ "IPC_IMPLEMENTATION" ]
-
- deps = [
- "//base",
- # TODO(viettrungluu): Needed for base/lazy_instance.h, which is suspect.
- "//base/third_party/dynamic_annotations",
- ]
-}
-
-test("ipc_tests") {
- sources = [
- "file_descriptor_set_posix_unittest.cc",
- "ipc_channel_posix_unittest.cc",
- "ipc_channel_unittest.cc",
- "ipc_fuzzing_tests.cc",
- "ipc_message_unittest.cc",
- "ipc_message_utils_unittest.cc",
- "ipc_send_fds_test.cc",
- "ipc_sync_channel_unittest.cc",
- "ipc_sync_message_unittest.cc",
- "ipc_sync_message_unittest.h",
- "ipc_test_base.cc",
- "ipc_test_base.h",
- "sync_socket_unittest.cc",
- "unix_domain_socket_util_unittest.cc",
- ]
-
- #if (toolkit_uses_gtk) {
- # deps += "/build/linux/system:gtk"
- #}
- if (is_win || is_ios) {
- sources -= "unix_domain_socket_util_unittest.cc"
- }
- #if (is_android && gtest_target_type == "shared_library") {
- # deps += "/testing/android/native_test.gyp:native_testNative_code"
- #}
- #if (is_posix && !is_mac && !is_android) {
- # if (linux_use_tcmalloc) {
- # deps += "/base/allocator"
- # }
- #}
-
- deps = [
- ":ipc",
- ":test_support_ipc",
- "//base",
- "//base:base_i18n",
- "//base:run_all_unittests",
- "//base:test_support_base",
- "//testing:gtest",
- ]
-}
-
-test("ipc_perftests") {
- sources = [
- "ipc_perftests.cc",
- "ipc_test_base.cc",
- "ipc_test_base.h",
- ]
-
- #if (toolkit_uses_gtk) {
- # deps += "/build/linux/system:gtk"
- #}
- #if (is_android && gtest_target_type == "shared_library") {
- # deps += "/testing/android/native_test.gyp:native_testNative_code"
- #}
- #if (is_posix && !is_mac && !is_android) {
- # if (linux_use_tcmalloc) {
- # deps += "/base/allocator"
- # }
- #}
-
- deps = [
- ":ipc",
- ":test_support_ipc",
- "//base",
- "//base:base_i18n",
- "//base:test_support_base",
- "//base:test_support_perf",
- "//testing:gtest",
- ]
-}
-
-static_library("test_support_ipc") {
- sources = [
- "ipc_multiprocess_test.cc",
- "ipc_multiprocess_test.h",
- "ipc_test_sink.cc",
- "ipc_test_sink.h",
- ]
- deps = [
- ":ipc",
- "//base",
- "//testing:gtest",
- ]
-}
-
+# 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.
+
+component("ipc") {
+ sources = [
+ "file_descriptor_set_posix.cc",
+ "file_descriptor_set_posix.h",
+ "ipc_channel.cc",
+ "ipc_channel.h",
+ "ipc_channel_factory.cc",
+ "ipc_channel_factory.h",
+ "ipc_channel_handle.h",
+ "ipc_channel_nacl.cc",
+ "ipc_channel_nacl.h",
+ "ipc_channel_posix.cc",
+ "ipc_channel_posix.h",
+ "ipc_channel_proxy.cc",
+ "ipc_channel_proxy.h",
+ "ipc_channel_reader.cc",
+ "ipc_channel_reader.h",
+ "ipc_channel_win.cc",
+ "ipc_channel_win.h",
+ "ipc_descriptors.h",
+ "ipc_export.h",
+ "ipc_forwarding_message_filter.cc",
+ "ipc_forwarding_message_filter.h",
+ "ipc_listener.h",
+ "ipc_logging.cc",
+ "ipc_logging.h",
+ "ipc_message.cc",
+ "ipc_message.h",
+ "ipc_message_macros.h",
+ "ipc_message_start.h",
+ "ipc_message_utils.cc",
+ "ipc_message_utils.h",
+ "ipc_param_traits.h",
+ "ipc_platform_file.cc",
+ "ipc_platform_file.h",
+ "ipc_sender.h",
+ "ipc_switches.cc",
+ "ipc_switches.h",
+ "ipc_sync_channel.cc",
+ "ipc_sync_channel.h",
+ "ipc_sync_message.cc",
+ "ipc_sync_message.h",
+ "ipc_sync_message_filter.cc",
+ "ipc_sync_message_filter.h",
+ "param_traits_log_macros.h",
+ "param_traits_macros.h",
+ "param_traits_read_macros.h",
+ "param_traits_write_macros.h",
+ "struct_constructor_macros.h",
+ "struct_destructor_macros.h",
+ "unix_domain_socket_util.cc",
+ "unix_domain_socket_util.h",
+ ]
+
+ #if (!is_untrusted_nacl) {
+ sources -= [
+ "ipc_channel_nacl.cc",
+ "ipc_channel_nacl.h",
+ ]
+
+ if (is_win || is_ios) {
+ sources -= [
+ "ipc_channel_factory.cc",
+ "unix_domain_socket_util.cc",
+ ]
+ }
+
+ defines = [ "IPC_IMPLEMENTATION" ]
+
+ deps = [
+ "//base",
+ # TODO(viettrungluu): Needed for base/lazy_instance.h, which is suspect.
+ "//base/third_party/dynamic_annotations",
+ ]
+}
+
+test("ipc_tests") {
+ sources = [
+ "file_descriptor_set_posix_unittest.cc",
+ "ipc_channel_posix_unittest.cc",
+ "ipc_channel_unittest.cc",
+ "ipc_fuzzing_tests.cc",
+ "ipc_message_unittest.cc",
+ "ipc_message_utils_unittest.cc",
+ "ipc_send_fds_test.cc",
+ "ipc_sync_channel_unittest.cc",
+ "ipc_sync_message_unittest.cc",
+ "ipc_sync_message_unittest.h",
+ "ipc_test_base.cc",
+ "ipc_test_base.h",
+ "sync_socket_unittest.cc",
+ "unix_domain_socket_util_unittest.cc",
+ ]
+
+ #if (toolkit_uses_gtk) {
+ # deps += "/build/linux/system:gtk"
+ #}
+ if (is_win || is_ios) {
+ sources -= "unix_domain_socket_util_unittest.cc"
+ }
+ #if (is_android && gtest_target_type == "shared_library") {
+ # deps += "/testing/android/native_test.gyp:native_testNative_code"
+ #}
+ #if (is_posix && !is_mac && !is_android) {
+ # if (linux_use_tcmalloc) {
+ # deps += "/base/allocator"
+ # }
+ #}
+
+ deps = [
+ ":ipc",
+ ":test_support_ipc",
+ "//base",
+ "//base:base_i18n",
+ "//base:run_all_unittests",
+ "//base:test_support_base",
+ "//testing:gtest",
+ ]
+}
+
+test("ipc_perftests") {
+ sources = [
+ "ipc_perftests.cc",
+ "ipc_test_base.cc",
+ "ipc_test_base.h",
+ ]
+
+ #if (toolkit_uses_gtk) {
+ # deps += "/build/linux/system:gtk"
+ #}
+ #if (is_android && gtest_target_type == "shared_library") {
+ # deps += "/testing/android/native_test.gyp:native_testNative_code"
+ #}
+ #if (is_posix && !is_mac && !is_android) {
+ # if (linux_use_tcmalloc) {
+ # deps += "/base/allocator"
+ # }
+ #}
+
+ deps = [
+ ":ipc",
+ ":test_support_ipc",
+ "//base",
+ "//base:base_i18n",
+ "//base:test_support_base",
+ "//base:test_support_perf",
+ "//testing:gtest",
+ ]
+}
+
+static_library("test_support_ipc") {
+ sources = [
+ "ipc_multiprocess_test.cc",
+ "ipc_multiprocess_test.h",
+ "ipc_test_sink.cc",
+ "ipc_test_sink.h",
+ ]
+ deps = [
+ ":ipc",
+ "//base",
+ "//testing:gtest",
+ ]
+}
+
diff --git a/chromium/tools/gn/secondary/testing/BUILD.gn b/chromium/tools/gn/secondary/testing/BUILD.gn
index 4e854b64e73..b54cebabd25 100644
--- a/chromium/tools/gn/secondary/testing/BUILD.gn
+++ b/chromium/tools/gn/secondary/testing/BUILD.gn
@@ -1,44 +1,44 @@
-# Copyright (c) 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.
-
-static_library("gtest") {
- sources = [
- "gtest/include/gtest/gtest-death-test.h",
- "gtest/include/gtest/gtest-message.h",
- "gtest/include/gtest/gtest-param-test.h",
- "gtest/include/gtest/gtest-printers.h",
- "gtest/include/gtest/gtest-spi.h",
- "gtest/include/gtest/gtest-test-part.h",
- "gtest/include/gtest/gtest-typed-test.h",
- "gtest/include/gtest/gtest.h",
- "gtest/include/gtest/gtest_pred_impl.h",
- "gtest/include/gtest/internal/gtest-death-test-internal.h",
- "gtest/include/gtest/internal/gtest-filepath.h",
- "gtest/include/gtest/internal/gtest-internal.h",
- "gtest/include/gtest/internal/gtest-linked_ptr.h",
- "gtest/include/gtest/internal/gtest-param-util-generated.h",
- "gtest/include/gtest/internal/gtest-param-util.h",
- "gtest/include/gtest/internal/gtest-port.h",
- "gtest/include/gtest/internal/gtest-string.h",
- "gtest/include/gtest/internal/gtest-tuple.h",
- "gtest/include/gtest/internal/gtest-type-util.h",
- #"gtest/src/gtest-all.cc", # Not needed by our build.
- "gtest/src/gtest-death-test.cc",
- "gtest/src/gtest-filepath.cc",
- "gtest/src/gtest-internal-inl.h",
- "gtest/src/gtest-port.cc",
- "gtest/src/gtest-printers.cc",
- "gtest/src/gtest-test-part.cc",
- "gtest/src/gtest-typed-test.cc",
- "gtest/src/gtest.cc",
- "multiprocess_func_list.cc",
- "multiprocess_func_list.h",
- "platform_test.h",
- ]
-
-}
-
-static_library("gmock") {
-
-}
+# Copyright (c) 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.
+
+static_library("gtest") {
+ sources = [
+ "gtest/include/gtest/gtest-death-test.h",
+ "gtest/include/gtest/gtest-message.h",
+ "gtest/include/gtest/gtest-param-test.h",
+ "gtest/include/gtest/gtest-printers.h",
+ "gtest/include/gtest/gtest-spi.h",
+ "gtest/include/gtest/gtest-test-part.h",
+ "gtest/include/gtest/gtest-typed-test.h",
+ "gtest/include/gtest/gtest.h",
+ "gtest/include/gtest/gtest_pred_impl.h",
+ "gtest/include/gtest/internal/gtest-death-test-internal.h",
+ "gtest/include/gtest/internal/gtest-filepath.h",
+ "gtest/include/gtest/internal/gtest-internal.h",
+ "gtest/include/gtest/internal/gtest-linked_ptr.h",
+ "gtest/include/gtest/internal/gtest-param-util-generated.h",
+ "gtest/include/gtest/internal/gtest-param-util.h",
+ "gtest/include/gtest/internal/gtest-port.h",
+ "gtest/include/gtest/internal/gtest-string.h",
+ "gtest/include/gtest/internal/gtest-tuple.h",
+ "gtest/include/gtest/internal/gtest-type-util.h",
+ #"gtest/src/gtest-all.cc", # Not needed by our build.
+ "gtest/src/gtest-death-test.cc",
+ "gtest/src/gtest-filepath.cc",
+ "gtest/src/gtest-internal-inl.h",
+ "gtest/src/gtest-port.cc",
+ "gtest/src/gtest-printers.cc",
+ "gtest/src/gtest-test-part.cc",
+ "gtest/src/gtest-typed-test.cc",
+ "gtest/src/gtest.cc",
+ "multiprocess_func_list.cc",
+ "multiprocess_func_list.h",
+ "platform_test.h",
+ ]
+
+}
+
+static_library("gmock") {
+
+}
diff --git a/chromium/tools/gn/secondary/third_party/icu/BUILD.gn b/chromium/tools/gn/secondary/third_party/icu/BUILD.gn
deleted file mode 100644
index 3fa919ee590..00000000000
--- a/chromium/tools/gn/secondary/third_party/icu/BUILD.gn
+++ /dev/null
@@ -1,5 +0,0 @@
-
-component("icui18n") {
-}
-component("icuuc") {
-}
diff --git a/chromium/tools/gn/secondary/third_party/libevent/BUILD.gn b/chromium/tools/gn/secondary/third_party/libevent/BUILD.gn
index afbd67de9f3..d494c84f55b 100644
--- a/chromium/tools/gn/secondary/third_party/libevent/BUILD.gn
+++ b/chromium/tools/gn/secondary/third_party/libevent/BUILD.gn
@@ -32,8 +32,7 @@ static_library("libevent") {
if (is_mac) {
includes = [ "mac" ]
- } else if (is_linux) {
- includes = [ "linux" ]
+ } else {
sources -= [ "kqueue.c" ]
}
diff --git a/chromium/tools/gn/secondary/third_party/modp_b64/BUILD.gn b/chromium/tools/gn/secondary/third_party/modp_b64/BUILD.gn
index 539abe1580a..5598f12f182 100644
--- a/chromium/tools/gn/secondary/third_party/modp_b64/BUILD.gn
+++ b/chromium/tools/gn/secondary/third_party/modp_b64/BUILD.gn
@@ -1,11 +1,11 @@
-# Copyright (c) 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.
-
-static_library("modp_b64") {
- sources = [
- "modp_b64.cc",
- "modp_b64.h",
- "modp_b64_data.h",
- ]
-}
+# Copyright (c) 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.
+
+static_library("modp_b64") {
+ sources = [
+ "modp_b64.cc",
+ "modp_b64.h",
+ "modp_b64_data.h",
+ ]
+}
diff --git a/chromium/tools/gn/target.cc b/chromium/tools/gn/target.cc
index e01fa80e240..0936f22ba3a 100644
--- a/chromium/tools/gn/target.cc
+++ b/chromium/tools/gn/target.cc
@@ -19,7 +19,7 @@ void TargetResolvedThunk(const base::Callback<void(const Target*)>& cb,
Target::Target(const Settings* settings, const Label& label)
: Item(label),
settings_(settings),
- output_type_(UNKNOWN),
+ output_type_(NONE),
generated_(false),
generator_function_(NULL) {
}
@@ -54,13 +54,15 @@ void Target::OnResolved() {
// Direct dependent libraries.
if (deps_[dep]->output_type() == STATIC_LIBRARY ||
- deps_[dep]->output_type() == SHARED_LIBRARY)
+ deps_[dep]->output_type() == SHARED_LIBRARY ||
+ deps_[dep]->output_type() == LOADABLE_MODULE)
inherited_libraries_.insert(deps_[dep]);
- // Inherited libraries. Don't pull transitive libraries from shared
+ // Inherited libraries. DOn't pull transitive libraries from shared
// libraries, since obviously those shouldn't be linked directly into
// later deps unless explicitly specified.
if (deps_[dep]->output_type() != SHARED_LIBRARY &&
+ deps_[dep]->output_type() != LOADABLE_MODULE &&
deps_[dep]->output_type() != EXECUTABLE) {
const std::set<const Target*> inherited =
deps_[dep]->inherited_libraries();
diff --git a/chromium/tools/gn/target.h b/chromium/tools/gn/target.h
index b5ea78cbb9b..ac0fc59c908 100644
--- a/chromium/tools/gn/target.h
+++ b/chromium/tools/gn/target.h
@@ -16,7 +16,6 @@
#include "base/synchronization/lock.h"
#include "tools/gn/config_values.h"
#include "tools/gn/item.h"
-#include "tools/gn/script_values.h"
#include "tools/gn/source_file.h"
class InputFile;
@@ -26,11 +25,11 @@ class Token;
class Target : public Item {
public:
enum OutputType {
- UNKNOWN,
- GROUP,
+ NONE,
EXECUTABLE,
SHARED_LIBRARY,
STATIC_LIBRARY,
+ LOADABLE_MODULE,
COPY_FILES,
CUSTOM,
};
@@ -103,12 +102,20 @@ class Target : public Item {
ConfigValues& config_values() { return config_values_; }
const ConfigValues& config_values() const { return config_values_; }
- ScriptValues& script_values() { return script_values_; }
- const ScriptValues& script_values() const { return script_values_; }
-
const SourceDir& destdir() const { return destdir_; }
void set_destdir(const SourceDir& d) { destdir_ = d; }
+ const SourceFile& script() const { return script_; }
+ void set_script(const SourceFile& s) { script_ = s; }
+
+ const std::vector<std::string>& script_args() const { return script_args_; }
+ void swap_in_script_args(std::vector<std::string>* sa) {
+ script_args_.swap(*sa);
+ }
+
+ const FileList& outputs() const { return outputs_; }
+ void swap_in_outputs(FileList* s) { outputs_.swap(*s); }
+
private:
const Settings* settings_;
OutputType output_type_;
@@ -126,11 +133,15 @@ class Target : public Item {
// pushed beyond shared library boundaries.
std::set<const Target*> inherited_libraries_;
- ConfigValues config_values_; // Used for all binary targets.
- ScriptValues script_values_; // Used for script (CUSTOM) targets.
+ ConfigValues config_values_;
SourceDir destdir_;
+ // Script target stuff.
+ SourceFile script_;
+ std::vector<std::string> script_args_;
+ FileList outputs_;
+
bool generated_;
const Token* generator_function_; // Who generated this: for error messages.
diff --git a/chromium/tools/gn/target_generator.cc b/chromium/tools/gn/target_generator.cc
index 72f7b004168..3fdd9e39a10 100644
--- a/chromium/tools/gn/target_generator.cc
+++ b/chromium/tools/gn/target_generator.cc
@@ -4,31 +4,71 @@
#include "tools/gn/target_generator.h"
-#include "tools/gn/binary_target_generator.h"
+#include "base/files/file_path.h"
+#include "base/logging.h"
#include "tools/gn/build_settings.h"
#include "tools/gn/config.h"
-#include "tools/gn/copy_target_generator.h"
+#include "tools/gn/config_values_generator.h"
#include "tools/gn/err.h"
+#include "tools/gn/filesystem_utils.h"
#include "tools/gn/functions.h"
-#include "tools/gn/group_target_generator.h"
+#include "tools/gn/input_file.h"
#include "tools/gn/item_node.h"
+#include "tools/gn/ninja_target_writer.h"
#include "tools/gn/parse_tree.h"
#include "tools/gn/scheduler.h"
#include "tools/gn/scope.h"
-#include "tools/gn/script_target_generator.h"
#include "tools/gn/target_manager.h"
#include "tools/gn/token.h"
#include "tools/gn/value.h"
#include "tools/gn/value_extractors.h"
#include "tools/gn/variables.h"
+namespace {
+
+bool TypeHasConfigs(Target::OutputType type) {
+ return type == Target::EXECUTABLE ||
+ type == Target::SHARED_LIBRARY ||
+ type == Target::STATIC_LIBRARY ||
+ type == Target::LOADABLE_MODULE;
+}
+
+bool TypeHasConfigValues(Target::OutputType type) {
+ return type == Target::EXECUTABLE ||
+ type == Target::SHARED_LIBRARY ||
+ type == Target::STATIC_LIBRARY ||
+ type == Target::LOADABLE_MODULE;
+}
+
+bool TypeHasSources(Target::OutputType type) {
+ return type != Target::NONE;
+}
+
+bool TypeHasData(Target::OutputType type) {
+ return type != Target::NONE;
+}
+
+bool TypeHasDestDir(Target::OutputType type) {
+ return type == Target::COPY_FILES;
+}
+
+bool TypeHasOutputs(Target::OutputType type) {
+ return type == Target::CUSTOM;
+}
+
+} // namespace
+
TargetGenerator::TargetGenerator(Target* target,
Scope* scope,
const Token& function_token,
+ const std::vector<Value>& args,
+ const std::string& output_type,
Err* err)
: target_(target),
scope_(scope),
function_token_(function_token),
+ args_(args),
+ output_type_(output_type),
err_(err),
input_directory_(function_token.location().file()->dir()) {
}
@@ -37,20 +77,57 @@ TargetGenerator::~TargetGenerator() {
}
void TargetGenerator::Run() {
- // All target types use these.
- FillDependentConfigs();
- FillData();
- FillDependencies();
-
- // To type-specific generation.
- DoRun();
-
- // Mark the target as complete.
- if (!err_->has_error()) {
- target_->SetGenerated(&function_token_);
- GetBuildSettings()->target_manager().TargetGenerationComplete(
- target_->label(), err_);
+ // Output type.
+ Target::OutputType output_type = GetOutputType();
+ target_->set_output_type(output_type);
+ if (err_->has_error())
+ return;
+
+ if (TypeHasConfigs(output_type)) {
+ FillConfigs();
+ FillAllDependentConfigs();
+ FillDirectDependentConfigs();
+ }
+ if (TypeHasSources(output_type))
+ FillSources();
+ if (TypeHasData(output_type))
+ FillData();
+ if (output_type == Target::CUSTOM) {
+ FillScript();
+ FillScriptArgs();
+ }
+ if (TypeHasOutputs(output_type))
+ FillOutputs();
+ FillDependencies(); // All types have dependencies.
+ FillDataDependencies(); // All types have dependencies.
+
+ if (TypeHasConfigValues(output_type)) {
+ ConfigValuesGenerator gen(&target_->config_values(), scope_,
+ function_token_, input_directory_, err_);
+ gen.Run();
+ if (err_->has_error())
+ return;
}
+
+ if (TypeHasDestDir(output_type))
+ FillDestDir();
+
+ // Set the toolchain as a dependency of the target.
+ // TODO(brettw) currently we lock separately for each config, dep, and
+ // toolchain we add which is bad! Do this in one lock.
+ {
+ ItemTree* tree = &GetBuildSettings()->item_tree();
+ base::AutoLock lock(tree->lock());
+ ItemNode* tc_node =
+ tree->GetExistingNodeLocked(ToolchainLabelForScope(scope_));
+ if (!tree->GetExistingNodeLocked(target_->label())->AddDependency(
+ GetBuildSettings(), function_token_.range(), tc_node, err_))
+ return;
+ }
+
+ target_->SetGenerated(&function_token_);
+ GetBuildSettings()->target_manager().TargetGenerationComplete(
+ target_->label(), err_);
}
// static
@@ -77,95 +154,35 @@ void TargetGenerator::GenerateTarget(Scope* scope,
if (g_scheduler->verbose_logging())
g_scheduler->Log("Generating target", label.GetUserVisibleName(true));
- Target* target =
- scope->settings()->build_settings()->target_manager().GetTarget(
- label, function_token.range(), NULL, err);
+ Target* t = scope->settings()->build_settings()->target_manager().GetTarget(
+ label, function_token.range(), NULL, err);
if (err->has_error())
return;
- // Create and call out to the proper generator.
- if (output_type == functions::kCopy) {
- CopyTargetGenerator generator(target, scope, function_token, err);
- generator.Run();
- } else if (output_type == functions::kCustom) {
- ScriptTargetGenerator generator(target, scope, function_token, err);
- generator.Run();
- } else if (output_type == functions::kExecutable) {
- BinaryTargetGenerator generator(target, scope, function_token,
- Target::EXECUTABLE, err);
- generator.Run();
- } else if (output_type == functions::kGroup) {
- GroupTargetGenerator generator(target, scope, function_token, err);
- generator.Run();
- } else if (output_type == functions::kSharedLibrary) {
- BinaryTargetGenerator generator(target, scope, function_token,
- Target::SHARED_LIBRARY, err);
- generator.Run();
- } else if (output_type == functions::kStaticLibrary) {
- BinaryTargetGenerator generator(target, scope, function_token,
- Target::STATIC_LIBRARY, err);
- generator.Run();
- } else {
- *err = Err(function_token, "Not a known output type",
- "I am very confused.");
- }
-}
-
-const BuildSettings* TargetGenerator::GetBuildSettings() const {
- return scope_->settings()->build_settings();
+ TargetGenerator gen(t, scope, function_token, args, output_type, err);
+ gen.Run();
}
-void TargetGenerator::FillSources() {
- const Value* value = scope_->GetValue(variables::kSources, true);
- if (!value)
- return;
-
- Target::FileList dest_sources;
- if (!ExtractListOfRelativeFiles(*value, input_directory_, &dest_sources,
- err_))
- return;
- target_->swap_in_sources(&dest_sources);
-}
-
-void TargetGenerator::FillConfigs() {
- FillGenericConfigs(variables::kConfigs, &Target::swap_in_configs);
-}
-
-void TargetGenerator::FillDependentConfigs() {
- FillGenericConfigs(variables::kAllDependentConfigs,
- &Target::swap_in_all_dependent_configs);
- FillGenericConfigs(variables::kDirectDependentConfigs,
- &Target::swap_in_direct_dependent_configs);
-}
-
-void TargetGenerator::FillData() {
- // TODO(brettW) hook this up to the constant when we have cleaned up
- // how data files are used.
- const Value* value = scope_->GetValue("data", true);
- if (!value)
- return;
-
- Target::FileList dest_data;
- if (!ExtractListOfRelativeFiles(*value, input_directory_, &dest_data,
- err_))
- return;
- target_->swap_in_data(&dest_data);
-}
-
-void TargetGenerator::FillDependencies() {
- FillGenericDeps(variables::kDeps, &Target::swap_in_deps);
- FillGenericDeps(variables::kDatadeps, &Target::swap_in_datadeps);
-}
-
-void TargetGenerator::SetToolchainDependency() {
- // TODO(brettw) currently we lock separately for each config, dep, and
- // toolchain we add which is bad! Do this in one lock.
- ItemTree* tree = &GetBuildSettings()->item_tree();
- base::AutoLock lock(tree->lock());
- ItemNode* tc_node =
- tree->GetExistingNodeLocked(ToolchainLabelForScope(scope_));
- tree->GetExistingNodeLocked(target_->label())->AddDependency(
- GetBuildSettings(), function_token_.range(), tc_node, err_);
+Target::OutputType TargetGenerator::GetOutputType() const {
+ if (output_type_ == functions::kGroup)
+ return Target::NONE;
+ if (output_type_ == functions::kExecutable)
+ return Target::EXECUTABLE;
+ if (output_type_ == functions::kSharedLibrary)
+ return Target::SHARED_LIBRARY;
+ if (output_type_ == functions::kStaticLibrary)
+ return Target::STATIC_LIBRARY;
+ // TODO(brettw) what does loadable module mean?
+ //if (output_type_ == ???)
+ // return Target::LOADABLE_MODULE;
+ if (output_type_ == functions::kCopy)
+ return Target::COPY_FILES;
+ if (output_type_ == functions::kCustom)
+ return Target::CUSTOM;
+
+ *err_ = Err(function_token_, "Not a known output type",
+ "I am very confused.");
+ return Target::NONE;
}
void TargetGenerator::FillGenericConfigs(
@@ -217,13 +234,117 @@ void TargetGenerator::FillGenericDeps(
(target_->*setter)(&dest_deps);
}
+void TargetGenerator::FillConfigs() {
+ FillGenericConfigs(variables::kConfigs, &Target::swap_in_configs);
+}
+
+void TargetGenerator::FillAllDependentConfigs() {
+ FillGenericConfigs(variables::kAllDependentConfigs,
+ &Target::swap_in_all_dependent_configs);
+}
+
+void TargetGenerator::FillDirectDependentConfigs() {
+ FillGenericConfigs(variables::kDirectDependentConfigs,
+ &Target::swap_in_direct_dependent_configs);
+}
+
+void TargetGenerator::FillSources() {
+ const Value* value = scope_->GetValue(variables::kSources, true);
+ if (!value)
+ return;
+
+ Target::FileList dest_sources;
+ if (!ExtractListOfRelativeFiles(*value, input_directory_, &dest_sources,
+ err_))
+ return;
+ target_->swap_in_sources(&dest_sources);
+}
+
+void TargetGenerator::FillData() {
+ // TODO(brettW) hook this up to the constant when we have cleaned up
+ // how data files are used.
+ const Value* value = scope_->GetValue("data", true);
+ if (!value)
+ return;
+
+ Target::FileList dest_data;
+ if (!ExtractListOfRelativeFiles(*value, input_directory_, &dest_data,
+ err_))
+ return;
+ target_->swap_in_data(&dest_data);
+}
+
+void TargetGenerator::FillDependencies() {
+ FillGenericDeps(variables::kDeps, &Target::swap_in_deps);
+}
+void TargetGenerator::FillDataDependencies() {
+ FillGenericDeps(variables::kDatadeps, &Target::swap_in_datadeps);
+}
+void TargetGenerator::FillDestDir() {
+ // Destdir is required for all targets that use it.
+ const Value* value = scope_->GetValue("destdir", true);
+ if (!value) {
+ *err_ = Err(function_token_, "This target type requires a \"destdir\".");
+ return;
+ }
+ if (!value->VerifyTypeIs(Value::STRING, err_))
+ return;
+ if (!EnsureStringIsInOutputDir(
+ GetBuildSettings()->build_dir(),
+ value->string_value(), *value, err_))
+ return;
+ target_->set_destdir(SourceDir(value->string_value()));
+}
+void TargetGenerator::FillScript() {
+ // If this gets called, the target type requires a script, so error out
+ // if it doesn't have one.
+ const Value* value = scope_->GetValue("script", true);
+ if (!value) {
+ *err_ = Err(function_token_, "This target type requires a \"script\".");
+ return;
+ }
+ if (!value->VerifyTypeIs(Value::STRING, err_))
+ return;
+ target_->set_script(
+ input_directory_.ResolveRelativeFile(value->string_value()));
+}
+void TargetGenerator::FillScriptArgs() {
+ const Value* value = scope_->GetValue("args", true);
+ if (!value)
+ return;
+ std::vector<std::string> args;
+ if (!ExtractListOfStringValues(*value, &args, err_))
+ return;
+ target_->swap_in_script_args(&args);
+}
+void TargetGenerator::FillOutputs() {
+ const Value* value = scope_->GetValue("outputs", true);
+ if (!value)
+ return;
+ Target::FileList outputs;
+ if (!ExtractListOfRelativeFiles(*value, input_directory_, &outputs, err_))
+ return;
+
+ // Validate that outputs are in the output dir.
+ CHECK(outputs.size() == value->list_value().size());
+ for (size_t i = 0; i < outputs.size(); i++) {
+ if (!EnsureStringIsInOutputDir(
+ GetBuildSettings()->build_dir(),
+ outputs[i].value(), value->list_value()[i], err_))
+ return;
+ }
+ target_->swap_in_outputs(&outputs);
+}
+const BuildSettings* TargetGenerator::GetBuildSettings() const {
+ return scope_->settings()->build_settings();
+}
diff --git a/chromium/tools/gn/target_generator.h b/chromium/tools/gn/target_generator.h
index f970cccbdfa..faaa1b54ebf 100644
--- a/chromium/tools/gn/target_generator.h
+++ b/chromium/tools/gn/target_generator.h
@@ -9,6 +9,7 @@
#include <vector>
#include "base/basictypes.h"
+#include "base/gtest_prod_util.h"
#include "base/memory/scoped_ptr.h"
#include "tools/gn/source_dir.h"
#include "tools/gn/target.h"
@@ -20,15 +21,14 @@ class Scope;
class Token;
class Value;
-// Fills the variables in a Target object from a Scope (the result of a script
-// execution). Target-type-specific derivations of this class will be used
-// for each different type of function call. This class implements the common
-// behavior.
+// Creates Target objects from a Scope (the result of a script execution).
class TargetGenerator {
public:
TargetGenerator(Target* target,
Scope* scope,
const Token& function_token,
+ const std::vector<Value>& args,
+ const std::string& output_type,
Err* err);
~TargetGenerator();
@@ -42,39 +42,43 @@ class TargetGenerator {
const std::string& output_type,
Err* err);
- protected:
- // Derived classes implement this to do type-specific generation.
- virtual void DoRun() = 0;
+ private:
+ // Sets err_ on failure.
+ Target::OutputType GetOutputType() const;
- const BuildSettings* GetBuildSettings() const;
+ // Reads configs/deps from the given var name, and uses the given setting on
+ // the target to save them.
+ void FillGenericConfigs(const char* var_name,
+ void (Target::*setter)(std::vector<const Config*>*));
+ void FillGenericDeps(const char* var_name,
+ void (Target::*setter)(std::vector<const Target*>*));
- void FillSources();
void FillConfigs();
+ void FillAllDependentConfigs();
+ void FillDirectDependentConfigs();
+ void FillSources();
+ void FillData();
+ void FillDependencies();
+ void FillDataDependencies();
+ void FillDestDir();
+ void FillScript();
+ void FillScriptArgs();
+ void FillOutputs();
- // Sets the current toolchain as a dependecy of this target. All targets with
- // a dependency on the toolchain should call this function.
- void SetToolchainDependency();
+ const BuildSettings* GetBuildSettings() const;
Target* target_;
Scope* scope_;
const Token& function_token_;
+ std::vector<Value> args_;
+ std::string output_type_;
Err* err_;
// Sources are relative to this. This comes from the input file which doesn't
// get freed so we don't acautlly have to make a copy.
const SourceDir& input_directory_;
- private:
- void FillDependentConfigs(); // Includes all types of dependent configs.
- void FillData();
- void FillDependencies(); // Includes data dependencies.
-
- // Reads configs/deps from the given var name, and uses the given setting on
- // the target to save them.
- void FillGenericConfigs(const char* var_name,
- void (Target::*setter)(std::vector<const Config*>*));
- void FillGenericDeps(const char* var_name,
- void (Target::*setter)(std::vector<const Target*>*));
+ FRIEND_TEST_ALL_PREFIXES(TargetGenerator, ResolveInputPath);
DISALLOW_COPY_AND_ASSIGN(TargetGenerator);
};
diff --git a/chromium/tools/gn/variables.cc b/chromium/tools/gn/variables.cc
index e3e0b6d3b13..7b96516b617 100644
--- a/chromium/tools/gn/variables.cc
+++ b/chromium/tools/gn/variables.cc
@@ -8,10 +8,10 @@ namespace variables {
// Built-in variables ----------------------------------------------------------
-const char kCurrentToolchain[] = "current_toolchain";
-const char kCurrentToolchain_HelpShort[] =
+extern const char kCurrentToolchain[] = "current_toolchain";
+extern const char kCurrentToolchain_HelpShort[] =
"current_toolchain: [string] Label of the current toolchain.";
-const char kCurrentToolchain_Help[] =
+extern const char kCurrentToolchain_Help[] =
"current_toolchain: Label of the current toolchain.\n"
"\n"
" A fully-qualified label representing the current toolchain. You can\n"
@@ -24,51 +24,29 @@ const char kCurrentToolchain_Help[] =
" executable(\"output_thats_64_bit_only\") {\n"
" ...\n";
-const char kDefaultToolchain[] = "default_toolchain";
-const char kDefaultToolchain_HelpShort[] =
+extern const char kDefaultToolchain[] = "default_toolchain";
+extern const char kDefaultToolchain_HelpShort[] =
"default_toolchain: [string] Label of the default toolchain.";
-const char kDefaultToolchain_Help[] =
+extern const char kDefaultToolchain_Help[] =
"default_toolchain: [string] Label of the default toolchain.\n"
"\n"
" A fully-qualified label representing the default toolchain, which may\n"
" not necessarily be the current one (see \"current_toolchain\").\n";
-const char kPythonPath[] = "python_path";
-const char kPythonPath_HelpShort[] =
+extern const char kPythonPath[] = "python_path";
+extern const char kPythonPath_HelpShort[] =
"python_path: [string] Absolute path of Python.";
-const char kPythonPath_Help[] =
+extern const char kPythonPath_Help[] =
"python_path: Absolute path of Python.\n"
"\n"
" Normally used in toolchain definitions if running some command\n"
" requires Python. You will normally not need this when invoking scripts\n"
" since GN automatically finds it for you.\n";
-const char kRelativeBuildToSourceRootDir[] =
- "relative_build_to_source_root_dir";
-const char kRelativeBuildToSourceRootDir_HelpShort[] =
- "relative_build_to_source_root_dir: [string] Relative location of root";
-const char kRelativeBuildToSourceRootDir_Help[] =
- "relative_build_to_source_root_dir: Relative location of root.\n"
- "\n"
- " A relative path from the build directory to the root of the source\n"
- " tree, with no terminating slash. The build directory will be the\n"
- " directory when executing normal build commands (except for scripts).\n"
- "\n"
- " If the checkout is in \"/foo/src/\" and the build directory is in\n"
- " \"/foo/src/out/Debug/\" then the relative build to source root dir\n"
- " will be \"../..\".\n"
- "\n"
- "Example:\n"
- " This is typically used to invoke tools checked out in the tree:\n"
- "\n"
- " tool(\"link\") {\n"
- " command = \"$relative_build_to_source_root_dir/third_party/gold/ld\n"
- " }\n";
-
-const char kRelativeRootGenDir[] = "relative_root_gen_dir";
-const char kRelativeRootGenDir_HelpShort[] =
+extern const char kRelativeRootGenDir[] = "relative_root_gen_dir";
+extern const char kRelativeRootGenDir_HelpShort[] =
"relative_root_gen_dir: [string] Relative root dir for generated files.";
-const char kRelativeRootGenDir_Help[] =
+extern const char kRelativeRootGenDir_Help[] =
"relative_root_gen_dir: Relative root for generated files.\n"
"\n"
" Relative path from the directory of the current build file to the\n"
@@ -82,10 +60,10 @@ const char kRelativeRootGenDir_Help[] =
" If your current build file is in \"//tools\", you might write\n"
" args = [ \"$relative_root_gen_dir/output.txt\" ]\n";
-const char kRelativeRootOutputDir[] = "relative_root_output_dir";
-const char kRelativeRootOutputDir_HelpShort[] =
+extern const char kRelativeRootOutputDir[] = "relative_root_output_dir";
+extern const char kRelativeRootOutputDir_HelpShort[] =
"relative_root_output_dir: [string] Relative dir for output files.";
-const char kRelativeRootOutputDir_Help[] =
+extern const char kRelativeRootOutputDir_Help[] =
"relative_root_output_dir: Relative dir for output files.\n"
"\n"
" Relative path from the directory of the current build file to the\n"
@@ -93,10 +71,10 @@ const char kRelativeRootOutputDir_Help[] =
"\n"
" Generally scripts should use \"relative_target_output_dir\" instead.\n";
-const char kRelativeTargetGenDir[] = "relative_target_gen_dir";
-const char kRelativeTargetGenDir_HelpShort[] =
+extern const char kRelativeTargetGenDir[] = "relative_target_gen_dir";
+extern const char kRelativeTargetGenDir_HelpShort[] =
"relative_target_gen_dir: [string] Relative dir for generated files.";
-const char kRelativeTargetGenDir_Help[] =
+extern const char kRelativeTargetGenDir_Help[] =
"relative_target_gen_dir: Relative dir for generated files.\n"
"\n"
" Relative path from the directory of the current build file to the\n"
@@ -113,10 +91,10 @@ const char kRelativeTargetGenDir_Help[] =
" If your current build file is in \"//tools\", you might write\n"
" args = [ \"$relative_root_gen_dir/output.txt\" ]\n";
-const char kRelativeTargetOutputDir[] = "relative_target_output_dir";
-const char kRelativeTargetOutputDir_HelpShort[] =
+extern const char kRelativeTargetOutputDir[] = "relative_target_output_dir";
+extern const char kRelativeTargetOutputDir_HelpShort[] =
"relative_target_output_dir: [string] Relative dir for build results.";
-const char kRelativeTargetOutputDir_Help[] =
+extern const char kRelativeTargetOutputDir_Help[] =
"relative_target_output_dir: Relative dir for build results."
"\n"
" Relative path from the directory of the current build file to the\n"
@@ -160,12 +138,6 @@ const char kCflags[] = "cflags";
const char kCflags_HelpShort[] =
"cflags: [string list] Flags passed to all C compiler variants.";
// Avoid writing long help for each variant.
-#define COMMON_FLAGS_HELP \
- "\n"\
- " Flags are never quoted. If your flag includes a string that must be\n"\
- " quoted, you must do it yourself. This also means that you can\n"\
- " specify more than one flag in a string if necessary (\"--foo --bar\")\n"\
- " and have them be seen as separate by the tool.\n"
const char kCommonCflagsHelp[] =
"cflags*: Flags passed to the C compiler.\n"
"\n"
@@ -176,8 +148,7 @@ const char kCommonCflagsHelp[] =
"\n"
" To target one of these variants individually, use \"cflags_c\",\n"
" \"cflags_cc\", \"cflags_objc\", and \"cflags_objcc\", respectively.\n"
- " These variant-specific versions will be appended to the \"cflags\".\n"
- COMMON_FLAGS_HELP;
+ " These variant-specific versions will be appended to the \"cflags\".\n";
const char* kCflags_Help = kCommonCflagsHelp;
const char kCflagsC[] = "cflags_c";
@@ -300,8 +271,7 @@ const char kLdflags_Help[] =
"\n"
" A list of strings.\n"
"\n"
- " These flags are passed on the command-line to the linker.\n"
- COMMON_FLAGS_HELP;
+ " These flags are passed on the command-line to the linker.\n";
const char kSources[] = "sources";
const char kSources_HelpShort[] =
diff --git a/chromium/tools/gn/variables.h b/chromium/tools/gn/variables.h
index 4751c3e1d4c..2d461000cf1 100644
--- a/chromium/tools/gn/variables.h
+++ b/chromium/tools/gn/variables.h
@@ -25,10 +25,6 @@ extern const char kPythonPath[];
extern const char kPythonPath_HelpShort[];
extern const char kPythonPath_Help[];
-extern const char kRelativeBuildToSourceRootDir[];
-extern const char kRelativeBuildToSourceRootDir_HelpShort[];
-extern const char kRelativeBuildToSourceRootDir_Help[];
-
extern const char kRelativeRootGenDir[];
extern const char kRelativeRootGenDir_HelpShort[];
extern const char kRelativeRootGenDir_Help[];
diff --git a/chromium/tools/heapcheck/suppressions.txt b/chromium/tools/heapcheck/suppressions.txt
index 6df68fba8eb..f6288e6cf5a 100644
--- a/chromium/tools/heapcheck/suppressions.txt
+++ b/chromium/tools/heapcheck/suppressions.txt
@@ -180,11 +180,21 @@
fun:aura::RootWindowHost::Create
}
-# When NSS 3.15 is the minimum version required, this should be removed.
+# There is not CloseTestNSSDB due to NSS bug 588269.
+# When NSS 3.14 is the minimum version required, this should be removed.
+# http://crbug.com/156433 .
{
- bug_272673
+ bug_156433_a
Heapcheck:Leak
- fun:*
+ fun:sqlite3MemMalloc
+ fun:*OpenUserDB
+ fun:*OpenTestNSSDB
+ fun:*ScopedTestNSSDB
+}
+{
+ bug_156433_b
+ Heapcheck:Leak
+ fun:PORT_Alloc_Util
fun:*OpenUserDB
fun:*OpenTestNSSDB
fun:*ScopedTestNSSDB
@@ -840,15 +850,11 @@
fun:message_center::MessageCenterViewTest::SetUp
}
{
- bug_272083
- Heapcheck:Leak
- fun:ThemeService::SetManagedUserTheme
- fun:ThemeService::OnManagedUserInitialized
-}
-{
- bug_272596
+ bug_271431
Heapcheck:Leak
- fun:*
- fun:net::NSSCertDatabase::ListCerts
- fun:LoadNSSCertificates
+ ...
+ fun:CreateBubble
+ fun:autofill::GeneratedCreditCardBubbleController::Show
+ fun:autofill::GeneratedCreditCardBubbleController::SetupAndShow
+ fun:autofill::GeneratedCreditCardBubbleController::Show
}
diff --git a/chromium/tools/idl_parser/idl_lexer.py b/chromium/tools/idl_parser/idl_lexer.py
index d7311df1ca6..c2569e95aab 100755
--- a/chromium/tools/idl_parser/idl_lexer.py
+++ b/chromium/tools/idl_parser/idl_lexer.py
@@ -14,6 +14,7 @@ PLY can be found at:
http://www.dabeaz.com/ply/
"""
+import optparse
import os.path
import sys
@@ -25,7 +26,7 @@ try:
# Disable lint check which fails to find the ply module.
# pylint: disable=F0401
from ply import lex
-except ImportError:
+except:
module_path, module_name = os.path.split(__file__)
third_party = os.path.join(module_path, '..', '..', 'third_party')
sys.path.append(third_party)
@@ -36,13 +37,6 @@ except ImportError:
# IDL Lexer
#
class IDLLexer(object):
- # 'literals' is a value expected by lex which specifies a list of valid
- # literal tokens, meaning the token type and token value are identical.
- literals = r'"*.(){}[],;:=+-/~|&^?<>'
-
- # 't_ignore' contains ignored characters (spaces and tabs)
- t_ignore = ' \t'
-
# 'tokens' is a value required by lex which specifies the complete list
# of valid token types.
tokens = [
@@ -112,15 +106,10 @@ class IDLLexer(object):
# regular expression where a match will emit a token of type <TYPE>. In the
# case of a function, the function is called when a match is made. These
# definitions come from WebIDL.
- #
- # These need to be methods for lexer construction, despite not using self.
- # pylint: disable=R0201
def t_ELLIPSIS(self, t):
r'\.\.\.'
return t
- # Regex needs to be in the docstring
- # pylint: disable=C0301
def t_float(self, t):
r'-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)'
return t
@@ -247,6 +236,12 @@ class IDLLexer(object):
self._lexobj = lex.lex(object=self, lextab=None, optimize=0)
return self._lexobj
+ def _AddConstDefs(self):
+ # 'literals' is a value expected by lex which specifies a list of valid
+ # literal tokens, meaning the token type and token value are identical.
+ self.literals = r'"*.(){}[],;:=+-/~|&^?<>'
+ self.t_ignore = ' \t'
+
def _AddToken(self, token):
if token in self.tokens:
raise RuntimeError('Same token: ' + token)
@@ -274,12 +269,11 @@ class IDLLexer(object):
self.filename = None
self.keywords = {}
self.tokens = []
+ self._AddConstDefs()
self._AddTokens(IDLLexer.tokens)
self._AddKeywords(IDLLexer.keywords)
self._lexobj = None
- self.last = None
- self.lines = None
# If run by itself, attempt to build the lexer
if __name__ == '__main__':
- lexer_object = IDLLexer()
+ lexer = IDLLexer()
diff --git a/chromium/tools/idl_parser/idl_lexer_test.py b/chromium/tools/idl_parser/idl_lexer_test.py
index 8b20da85fbd..cba4e482bee 100755
--- a/chromium/tools/idl_parser/idl_lexer_test.py
+++ b/chromium/tools/idl_parser/idl_lexer_test.py
@@ -3,6 +3,10 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import json
+import optparse
+import os
+import sys
import unittest
from idl_lexer import IDLLexer
@@ -96,4 +100,4 @@ class PepperIDLLexer(WebIDLLexer):
if __name__ == '__main__':
- unittest.main()
+ unittest.main() \ No newline at end of file
diff --git a/chromium/tools/idl_parser/idl_parser.py b/chromium/tools/idl_parser/idl_parser.py
index 8a682ea688b..10428de513a 100755
--- a/chromium/tools/idl_parser/idl_parser.py
+++ b/chromium/tools/idl_parser/idl_parser.py
@@ -36,22 +36,8 @@ import time
from idl_lexer import IDLLexer
from idl_node import IDLAttribute, IDLNode
-#
-# Try to load the ply module, if not, then assume it is in the third_party
-# directory.
-#
-try:
- # Disable lint check which fails to find the ply module.
- # pylint: disable=F0401
- from ply import lex
- from ply import yacc
-except ImportError:
- module_path, module_name = os.path.split(__file__)
- third_party = os.path.join(module_path, os.par, os.par, 'third_party')
- sys.path.append(third_party)
- # pylint: disable=F0401
- from ply import lex
- from ply import yacc
+from ply import lex
+from ply import yacc
#
# ERROR_REMAP
@@ -876,7 +862,7 @@ class IDLParser(object):
def __init__(self, lexer, verbose=False, debug=False, mute_error=False):
self.lexer = lexer
self.tokens = lexer.KnownTokens()
- self.yaccobj = yacc.yacc(module=self, tabmodule=None, debug=debug,
+ self.yaccobj = yacc.yacc(module=self, tabmodule=None, debug=False,
optimize=0, write_tables=0)
self.parse_debug = debug
self.verbose = verbose
@@ -987,8 +973,6 @@ class IDLParser(object):
return IDLAttribute(key, Boolean(True))
def GetErrors(self):
- # Access lexer errors, despite being private
- # pylint: disable=W0212
return self._parse_errors + self.lexer._lex_errors
#
diff --git a/chromium/tools/idl_parser/idl_ppapi_lexer.py b/chromium/tools/idl_parser/idl_ppapi_lexer.py
index 9e834863c8d..2595f1c5dbe 100755
--- a/chromium/tools/idl_parser/idl_ppapi_lexer.py
+++ b/chromium/tools/idl_parser/idl_ppapi_lexer.py
@@ -15,25 +15,23 @@ PLY can be found at:
"""
from idl_lexer import IDLLexer
+import optparse
+import os.path
+import sys
#
# IDL PPAPI Lexer
#
class IDLPPAPILexer(IDLLexer):
- # Token definitions
- #
- # These need to be methods for lexer construction, despite not using self.
- # pylint: disable=R0201
-
# Special multi-character operators
def t_LSHIFT(self, t):
r'<<'
- return t
+ return t;
def t_RSHIFT(self, t):
r'>>'
- return t
+ return t;
def t_INLINE(self, t):
r'\#inline (.|\n)*?\#endinl.*'
@@ -47,15 +45,15 @@ class IDLPPAPILexer(IDLLexer):
self._AddKeywords(['label', 'struct'])
# Add number types
- self._AddKeywords(['char', 'int8_t', 'int16_t', 'int32_t', 'int64_t'])
- self._AddKeywords(['uint8_t', 'uint16_t', 'uint32_t', 'uint64_t'])
- self._AddKeywords(['double_t', 'float_t'])
+ self._AddKeywords(['char', 'int8_t', 'int16_t', 'int32_t', 'int64_t']);
+ self._AddKeywords(['uint8_t', 'uint16_t', 'uint32_t', 'uint64_t']);
+ self._AddKeywords(['double_t', 'float_t']);
# Add handle types
- self._AddKeywords(['handle_t', 'PP_FileHandle'])
+ self._AddKeywords(['handle_t', 'PP_FileHandle']);
# Add pointer types (void*, char*, const char*, const void*)
- self._AddKeywords(['mem_t', 'str_t', 'cstr_t', 'interface_t'])
+ self._AddKeywords(['mem_t', 'str_t', 'cstr_t', 'interface_t']);
# Remove JS types
self._DelKeywords(['boolean', 'byte', 'Date', 'DOMString', 'double',
@@ -67,4 +65,4 @@ if __name__ == '__main__':
lexer = IDLPPAPILexer()
lexer.Tokenize(open('test_parser/inline_ppapi.idl').read())
for tok in lexer.GetTokens():
- print '\n' + str(tok)
+ print '\n' + str(tok) \ No newline at end of file
diff --git a/chromium/tools/idl_parser/idl_ppapi_parser.py b/chromium/tools/idl_parser/idl_ppapi_parser.py
index c02e42c818f..33eb5037bcc 100755
--- a/chromium/tools/idl_parser/idl_ppapi_parser.py
+++ b/chromium/tools/idl_parser/idl_ppapi_parser.py
@@ -29,11 +29,13 @@
# pylint: disable=R0201
# pylint: disable=C0301
+import os.path
import sys
+import time
from idl_ppapi_lexer import IDLPPAPILexer
from idl_parser import IDLParser, ListFromConcat, ParseFile
-from idl_node import IDLNode
+from idl_node import IDLAttribute, IDLNode
class IDLPPAPIParser(IDLParser):
#
@@ -102,8 +104,7 @@ class IDLPPAPIParser(IDLParser):
def p_LabelCont(self, p):
"""LabelCont : ',' LabelList
|"""
- if len(p) > 1:
- p[0] = p[2]
+ if len(p) > 1: p[0] = p[2]
def p_LabelContError(self, p):
"""LabelCont : error LabelCont"""
@@ -259,21 +260,20 @@ class IDLPPAPIParser(IDLParser):
arguments = self.BuildProduction('Values', p, 2, p[3])
p[0] = self.BuildNamed('ExtAttribute', p, 1, arguments)
- def p_ValueList(self, p):
- """ValueList : ConstValue ValueListCont"""
- p[0] = ListFromConcat(p[1], p[2])
-
- def p_ValueListCont(self, p):
- """ValueListCont : ValueList
- |"""
- if len(p) > 1:
- p[0] = p[1]
-
# [76]
def p_ExtendedAttributeIdentConst(self, p):
"""ExtendedAttributeIdentConst : identifier '=' ConstValue"""
p[0] = self.BuildNamed('ExtAttribute', p, 1, p[3])
+ def p_ValueListCont(self, p):
+ """ValueListCont : ConstValue ValueListCont
+ |"""
+ if len(p) > 1:
+ p[0] = ListFromConcat(p[1], p[2])
+
+ def p_ValueList(self, p):
+ """ValueList : ConstValue ValueListCont"""
+ values = self.BuildProduction('Values', p, 2, ListFromConcat(p[1], p[2]))
def __init__(self, lexer, verbose=False, debug=False, mute_error=False):
IDLParser.__init__(self, lexer, verbose, debug, mute_error)
@@ -301,4 +301,4 @@ def main(argv):
if __name__ == '__main__':
- sys.exit(main(sys.argv[1:]))
+ sys.exit(main(sys.argv[1:])) \ No newline at end of file
diff --git a/chromium/tools/idl_parser/test_parser/extattr_ppapi.idl b/chromium/tools/idl_parser/test_parser/extattr_ppapi.idl
deleted file mode 100644
index 0206901eba6..00000000000
--- a/chromium/tools/idl_parser/test_parser/extattr_ppapi.idl
+++ /dev/null
@@ -1,91 +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. */
-
-/* Test ExtendedAttribute productions
-
-Run with --test to generate an AST and verify that all comments accurately
-reflect the state of the Nodes.
-
-BUILD Type(Name)
-This comment signals that a node of type <Type> is created with the
-name <Name>.
-
-ERROR Error String
-This comment signals that a error of <Error String> is generated. The error
-is not assigned to a node, but are expected in order.
-
-PROP Key=Value
-This comment signals that a property has been set on the Node such that
-<Key> = <Value>.
-
-TREE
-Type(Name)
- Type(Name)
- Type(Name)
- Type(Name)
- ...
-This comment signals that a tree of nodes matching the BUILD comment
-symatics should exist. This is an exact match.
-*/
-
-/* TREE
- *Interface(Foo)
- * ExtAttributes()
- * ExtAttribute(foo)
- * Arguments()
- */
-
-[foo()] interface Foo {};
-
-/* TREE
- *Interface(Foo)
- * ExtAttributes()
- * ExtAttribute(foo)
- * Values()
- */
-
-[foo(1)] interface Foo {};
-
-/* TREE
- *Interface(Foo)
- * ExtAttributes()
- * ExtAttribute(foo)
- * Values()
- */
-
-[foo(1 true 1.2e-3)] interface Foo {};
-
-/* TREE
- *Interface(Foo)
- * ExtAttributes()
- * ExtAttribute(foo)
- * Arguments()
- * Error(Unexpected ).)
- */
-
-[foo(null)] interface Foo {};
-
-/* TREE
- *Interface(Foo)
- * ExtAttributes()
- * ExtAttribute(foo)
- */
-
-[foo=1] interface Foo {};
-
-/* TREE
- *Interface(Foo)
- * ExtAttributes()
- * ExtAttribute(foo)
- */
-
-[foo=true] interface Foo {};
-
-/* TREE
- *Interface(Foo)
- * ExtAttributes()
- * ExtAttribute(foo)
- */
-
-[foo=1.2e-3] interface Foo {};
diff --git a/chromium/tools/json_schema_compiler/cc_generator.py b/chromium/tools/json_schema_compiler/cc_generator.py
index d7d565e3846..2c55b1ee3ef 100644
--- a/chromium/tools/json_schema_compiler/cc_generator.py
+++ b/chromium/tools/json_schema_compiler/cc_generator.py
@@ -449,7 +449,7 @@ class _Generator(object):
var: variable or variable*
- E.g for std::string, generate new base::StringValue(var)
+ E.g for std::string, generate base::Value::CreateStringValue(var)
"""
underlying_type = self._type_helper.FollowRef(type_)
if (underlying_type.property_type == PropertyType.CHOICES or
@@ -466,7 +466,7 @@ class _Generator(object):
vardot = '(%s).' % var
return '%sDeepCopy()' % vardot
elif underlying_type.property_type == PropertyType.ENUM:
- return 'new base::StringValue(ToString(%s))' % var
+ return 'base::Value::CreateStringValue(ToString(%s))' % var
elif underlying_type.property_type == PropertyType.BINARY:
if is_ptr:
vardot = var + '->'
diff --git a/chromium/tools/json_schema_compiler/util.cc b/chromium/tools/json_schema_compiler/util.cc
index d0e77659e6a..c03d0764667 100644
--- a/chromium/tools/json_schema_compiler/util.cc
+++ b/chromium/tools/json_schema_compiler/util.cc
@@ -45,19 +45,19 @@ bool GetItemFromList(const base::ListValue& from, int index,
}
void AddItemToList(const int from, base::ListValue* out) {
- out->Append(new base::FundamentalValue(from));
+ out->Append(base::Value::CreateIntegerValue(from));
}
void AddItemToList(const bool from, base::ListValue* out) {
- out->Append(new base::FundamentalValue(from));
+ out->Append(base::Value::CreateBooleanValue(from));
}
void AddItemToList(const double from, base::ListValue* out) {
- out->Append(new base::FundamentalValue(from));
+ out->Append(base::Value::CreateDoubleValue(from));
}
void AddItemToList(const std::string& from, base::ListValue* out) {
- out->Append(new base::StringValue(from));
+ out->Append(base::Value::CreateStringValue(from));
}
void AddItemToList(const linked_ptr<base::Value>& from,
diff --git a/chromium/tools/lsan/suppressions.txt b/chromium/tools/lsan/suppressions.txt
index f2dbbc5d56e..5231000b130 100644
--- a/chromium/tools/lsan/suppressions.txt
+++ b/chromium/tools/lsan/suppressions.txt
@@ -10,14 +10,13 @@ leak:WTF::StringImpl::createStatic
# V8 leak, expect 1024 bytes leaked per process. http://crbug.com/99304
leak:v8::internal::V8::Initialize
+# V8 GC issue which comes up in lots of tests. http://crbug.com/169678
+leak:v8::internal::SlotsBufferAllocator::AllocateBuffer
+
# V8 GC issues in ProxyResolver tests, probably harmless. http://crbug.com/67378
leak:net::ProxyResolverV8::SetPacScript
leak:net::(anonymous namespace)::ProxyResolverV8WithMockBindings::SetPacScriptFromDisk
leak:net::(anonymous namespace)::InitResolver
-leak:net::ProxyResolverScriptData::FromUTF8
-
-# http://crbug.com/270180
-leak:net::ProxyResolverV8::Context::ResolveProxy
# NSS leaks in CertDatabaseNSSTest tests. http://crbug.com/51988
leak:net::NSSCertDatabase::ImportFromPKCS12
@@ -34,6 +33,10 @@ leak:libplds4
# Skia leaks. http://crbug.com/189170
leak:FontConfigTypeface::LegacyCreateTypeface
+# Angle leaks. http://crbug.com/181691
+leak:InitializeGlobalParseContext
+leak:InitializeGlobalPools
+
# Skia leaks GrGpuGL::ProgramCache::Entry. http://crbug.com/262934
leak:GrGpuGL::flushGraphicsState
@@ -42,10 +45,3 @@ leak:ppapi::proxy::PPP_Instance_Private_ProxyTest_PPPInstancePrivate_Test
# Leak in base_unittests. http://crbug.com/268267
leak:base::WeakPtrTest_MoveOwnershipAfterInvalidate_Test::TestBody
-
-# GTK leaks. GTK is deprecated, so we won't be fixing these.
-# Most of them should apply to the full browser process only.
-leak:StatusIconGtk::UpdatePlatformContextMenu
-leak:GlobalMenuBar::GlobalMenuBar
-leak:BookmarkBubbleGtk::InitFolderComboModel
-leak:TranslateInfoBarBase::CreateLanguageCombobox
diff --git a/chromium/tools/metrics/histograms/histograms.xml b/chromium/tools/metrics/histograms/histograms.xml
index bdb1c4f4214..dba13c9f0eb 100644
--- a/chromium/tools/metrics/histograms/histograms.xml
+++ b/chromium/tools/metrics/histograms/histograms.xml
@@ -3885,34 +3885,6 @@ other types of suffix sets.
</summary>
</histogram>
-<histogram name="FileBrowser.FolderShortcut.Add">
- <summary>
- Chrome OS File Browser: this is recorded when the user adds a folder
- shortcut.
- </summary>
-</histogram>
-
-<histogram name="FileBrowser.FolderShortcut.Count">
- <summary>
- Chrome OS File Browser: number of saved folder shorcuts. This is recorded
- when Files.app is launched.
- </summary>
-</histogram>
-
-<histogram name="FileBrowser.FolderShortcut.Navigate">
- <summary>
- Chrome OS File Browser: this is recorded when the user clicks or selects a
- folder shortcut and is navigated to the target folder.
- </summary>
-</histogram>
-
-<histogram name="FileBrowser.FolderShortcut.Remove">
- <summary>
- Chrome OS File Browser: this is recorded when the user removes a folder
- shortcut.
- </summary>
-</histogram>
-
<histogram name="FileBrowser.Load" units="milliseconds">
<summary>
Chrome OS File Browser is an built-in extension without a background page.
@@ -6809,7 +6781,7 @@ other types of suffix sets.
</summary>
</histogram>
-<histogram name="Net.PreconnectedLinkNavigations" enum="PreconnectedNavigation">
+<histogram name="Net.PreconnectedLinkNavigation" enum="PreconnectedNavigation">
<summary>
Indicate whether a link navigation was preceded by a recent pre-connect
trigger (within 10 seconds). There is a high chance that loading the page
@@ -9443,17 +9415,6 @@ other types of suffix sets.
<summary>Time spent on the Suggested Sites NTP pane, in seconds.</summary>
</histogram>
-<histogram name="NewTabPage.ThumbnailErrorRate">
- <summary>
- The percentage of errors per attempts to load image thumbnails on the New
- Tab Page. When an error occurs, a grey tile is shown instead of a thumbnail
- image. We measure the rate instead of the number of errors because multiple
- attempts are made to load images at different times during the NTP's
- lifetime. Each NTP session's error rate is logged after the user navigates
- to a new URL from that NTP.
- </summary>
-</histogram>
-
<histogram name="NewTabPage.VisibleScreenshots">
<summary>
The number of screenshots that were cached for the visible suggestions on
@@ -9560,6 +9521,12 @@ other types of suffix sets.
</summary>
</histogram>
+<histogram name="Omnibox.SearchEngineType" enum="OmniboxSearchEngineType">
+ <summary>
+ The type of search engine associated with a match opened from the omnibox.
+ </summary>
+</histogram>
+
<histogram name="Omnibox.SuggestRequest.Failure.GoogleResponseTime"
units="milliseconds">
<summary>
@@ -9626,14 +9593,6 @@ other types of suffix sets.
</summary>
</histogram>
-<histogram name="PasswordManager.ProvisionalSaveFailure"
- enum="ProvisionalSaveFailure">
- <summary>
- Breakdown of cases where a password is submitted, but we don't even try and
- save it. Recorded for every password form submit.
- </summary>
-</histogram>
-
<histogram name="PasswordManager.TimesGeneratedPasswordUsed">
<summary>
The number of times each generated password has been used to log in.
@@ -10585,13 +10544,6 @@ other types of suffix sets.
<summary>TBD</summary>
</histogram>
-<histogram name="PLT.BeginToFinish_AfterPreconnectRequest" units="milliseconds">
- <summary>
- PLT.BeginToFinish, but for pages requested just after a new preconnect
- request.
- </summary>
-</histogram>
-
<histogram name="PLT.BeginToFinish_ContentPrefetcher" units="milliseconds">
<summary>
PLT.BeginToFinish, but for pages which contained prefetch links.
@@ -10610,14 +10562,6 @@ other types of suffix sets.
<summary>TBD</summary>
</histogram>
-<histogram name="PLT.BeginToFinishDoc_AfterPreconnectRequest"
- units="milliseconds">
- <summary>
- PLT.BeginToFinishDoc, but for pages requested just after a new preconnect
- request.
- </summary>
-</histogram>
-
<histogram name="PLT.BeginToFinishDoc_ContentPrefetcher" units="milliseconds">
<summary>
PLT.BeginToFinishDoc, but for pages which contained prefetch links.
@@ -13329,6 +13273,25 @@ other types of suffix sets.
</summary>
</histogram>
+<histogram name="Search.DefaultSearchProviderType"
+ enum="OmniboxSearchEngineType">
+ <summary>
+ The type of the default search engine that is loaded when a profile is
+ opened or after a profile reset. Note that at least one profile is opened
+ on startup.
+ </summary>
+</histogram>
+
+<histogram name="Settings.DefaultSearchProvider" enum="OmniboxSearchEngine">
+ <obsolete>
+ Deprecated in Chrome 30. Use Search.DefaultSearchProviderType instead.
+ </obsolete>
+ <summary>
+ The id of the default search engine domain that is specified in user
+ preferences when a profile is loaded.
+ </summary>
+</histogram>
+
<histogram name="Settings.GivenShowHomeButton_HomePageIsNewTabPage"
enum="Boolean">
<summary>
@@ -13337,6 +13300,26 @@ other types of suffix sets.
</summary>
</histogram>
+<histogram name="Settings.HomePageDomain" enum="OmniboxSearchEngine">
+ <obsolete>
+ Deprecated in Chrome 30. Replaced by Settings.HomePageEngineType.
+ </obsolete>
+ <summary>
+ The id of the home page domain that is specified in user preferences when a
+ profile is loaded.
+ </summary>
+</histogram>
+
+<histogram name="Settings.HomePageEngineType" enum="OmniboxSearchEngineType">
+ <summary>
+ Tries to pretend the home page URL is a search URL, and records the search
+ engine type of that URL by comparing the TLD+1 of the home page URL with
+ those of the different known search engines. Recorded when a profile is
+ opened, if a home page URL has been set. Note that at least one profile is
+ opened on startup.
+ </summary>
+</histogram>
+
<histogram name="Settings.HomePageIsNewTabPage" enum="Boolean">
<obsolete>
Deprecated 08/05/2013. Replaced by
@@ -13383,6 +13366,27 @@ other types of suffix sets.
</summary>
</histogram>
+<histogram name="Settings.StartupPageDomains" enum="OmniboxSearchEngine">
+ <obsolete>
+ Deprecated in Chrome 30. Replaced by Settings.StartupPageEngineTypes.
+ </obsolete>
+ <summary>
+ The ids of startup page domains that are specified in user preferences when
+ a profile is loaded.
+ </summary>
+</histogram>
+
+<histogram name="Settings.StartupPageEngineTypes"
+ enum="OmniboxSearchEngineType">
+ <summary>
+ Tries to pretend the startup page URLs are search URLs, and records the
+ search engine types of those URLs by comparing the TLD+1s of the URLs with
+ those of the different known search engines. Recorded when a profile is
+ opened, if startup page URLs have been set. Note that at least one profile
+ is opened on startup.
+ </summary>
+</histogram>
+
<histogram name="Settings.StartupPageLoadSettings" enum="SessionStartupPref">
<summary>The startup page settings when a profile is loaded.</summary>
</histogram>
@@ -15187,13 +15191,6 @@ other types of suffix sets.
</summary>
</histogram>
-<histogram name="WebCore.PreloadDelayMs" units="milliseconds">
- <summary>
- The delay between when the preload scanner discovers a resource on the
- parser thread and when the preload request is issued on the main thread.
- </summary>
-</histogram>
-
<histogram name="WebCore.V8DOMWindowShell.createContext.IsolatedWorld"
units="milliseconds">
<summary>
@@ -17208,7 +17205,7 @@ other types of suffix sets.
<int value="34" label="AUTOTESTPRIVATE_RESTART"/>
<int value="35" label="USB_CLAIMINTERFACE"/>
<int value="36" label="MEDIAPLAYERPRIVATE_SETWINDOWHEIGHT"/>
- <int value="37" label="PROCESSES_GETPROCESSINFO"/>
+ <int value="37" label="EXPERIMENTAL_PROCESSES_GETPROCESSINFO"/>
<int value="38" label="HISTORY_GETVISITS"/>
<int value="39" label="SOCKET_BIND"/>
<int value="40" label="TABS_MOVE"/>
@@ -17273,7 +17270,7 @@ other types of suffix sets.
<int value="99" label="WINDOWS_CREATE"/>
<int value="100" label="DEVELOPERPRIVATE_LOADUNPACKED"/>
<int value="101" label="DELETED_DOWNLOADS_SETDESTINATION"/>
- <int value="102" label="PROCESSES_GETPROCESSIDFORTAB"/>
+ <int value="102" label="EXPERIMENTAL_PROCESSES_GETPROCESSIDFORTAB"/>
<int value="103" label="BOOKMARKS_GETCHILDREN"/>
<int value="104" label="BROWSERACTION_GETTITLE"/>
<int value="105" label="TERMINALPRIVATE_OPENTERMINALPROCESS"/>
@@ -17467,7 +17464,7 @@ other types of suffix sets.
<int value="292" label="EXPERIMENTAL_APP_NOTIFY"/>
<int value="293" label="METRICSPRIVATE_RECORDLONGTIME"/>
<int value="294" label="SOCKET_READ"/>
- <int value="295" label="PROCESSES_TERMINATE"/>
+ <int value="295" label="EXPERIMENTAL_PROCESSES_TERMINATE"/>
<int value="296" label="METRICSPRIVATE_RECORDTIME"/>
<int value="297" label="BOOKMARKMANAGERPRIVATE_GETSTRINGS"/>
<int value="298" label="USB_ISOCHRONOUSTRANSFER"/>
@@ -20462,6 +20459,7 @@ other types of suffix sets.
<int value="32" label="diri"/>
<int value="33" label="Custom"/>
<int value="35" label="AOL"/>
+ <int value="36" label="Conduit"/>
<int value="37" label="Rediff"/>
<int value="38" label="guruji"/>
<int value="40" label="GO.com"/>
@@ -20469,6 +20467,7 @@ other types of suffix sets.
<int value="44" label="NETI"/>
<int value="45" label="DELFI"/>
<int value="46" label="Fonecta 02.fi"/>
+ <int value="50" label="AVG"/>
<int value="51" label="search.ch"/>
<int value="54" label="in.gr"/>
<int value="55" label="Walla!"/>
@@ -20493,6 +20492,70 @@ other types of suffix sets.
<int value="99" label="Spray"/>
<int value="100" label="Sanook!"/>
<int value="101" label="MYNET"/>
+ <int value="102" label="searchnu.com"/>
+ <int value="103" label="babylon.com"/>
+ <int value="104" label="delta-search.com"/>
+ <int value="105" label="iminent.com"/>
+ <int value="106" label="hao123.com"/>
+ <int value="107" label="sweetim.com"/>
+ <int value="108" label="snap.do"/>
+ <int value="109" label="snapdo.com"/>
+ <int value="110" label="softonic.com"/>
+ <int value="111" label="searchfunmoods.com"/>
+ <int value="112" label="incredibar.com"/>
+ <int value="113" label="sweetpacks.com"/>
+ <int value="114" label="imesh.net"/>
+</enum>
+
+<enum name="OmniboxSearchEngineType" type="int">
+ <int value="0" label="Unknown"/>
+ <int value="1" label="AOL"/>
+ <int value="2" label="Ask"/>
+ <int value="3" label="Atlas"/>
+ <int value="4" label="AVG"/>
+ <int value="5" label="Baidu"/>
+ <int value="6" label="Babylon"/>
+ <int value="7" label="Bing"/>
+ <int value="8" label="Conduit"/>
+ <int value="9" label="Daum"/>
+ <int value="10" label="DELFI"/>
+ <int value="11" label="Delta"/>
+ <int value="12" label="Funmoods"/>
+ <int value="13" label="goo"/>
+ <int value="14" label="Google"/>
+ <int value="15" label="iminent.com"/>
+ <int value="16" label="IMesh"/>
+ <int value="17" label="in.gr"/>
+ <int value="18" label="incredibar.com"/>
+ <int value="19" label="Kvasir"/>
+ <int value="20" label="Libero"/>
+ <int value="21" label="@MAIL.RU"/>
+ <int value="22" label="Najdi.si"/>
+ <int value="23" label="Nate"/>
+ <int value="24" label="Naver"/>
+ <int value="25" label="NETI"/>
+ <int value="26" label="Nigma"/>
+ <int value="27" label="OK.hu"/>
+ <int value="28" label="Onet.pl"/>
+ <int value="29" label="Rambler"/>
+ <int value="30" label="SAPO"/>
+ <int value="31" label="searchnu"/>
+ <int value="32" label="search-results.com"/>
+ <int value="33" label="Seznam"/>
+ <int value="34" label="snap.do"/>
+ <int value="35" label="softonic.com"/>
+ <int value="36" label="Sogou"/>
+ <int value="37" label="Soso"/>
+ <int value="38" label="sweetim.com/sweetpacks.com"/>
+ <int value="39" label="Terra"/>
+ <int value="40" label="TUT.BY"/>
+ <int value="41" label="Vinden.nl"/>
+ <int value="42" label="Virgilio"/>
+ <int value="43" label="Walla!"/>
+ <int value="44" label="Wirtualna Polska"/>
+ <int value="45" label="Yahoo!"/>
+ <int value="46" label="Yandex"/>
+ <int value="47" label="Zoznam"/>
</enum>
<enum name="OmniboxSuggestRequests" type="int">
@@ -20935,16 +20998,6 @@ other types of suffix sets.
<int value="5" label="SPDY 3.0"/>
</enum>
-<enum name="ProvisionalSaveFailure" type="int">
- <int value="0" label="SAVING_DISABLED"/>
- <int value="1" label="EMPTY_PASSWORD"/>
- <int value="2" label="NO_MATCHING_FORM"/>
- <int value="3" label="MATCHING_NOT_COMPLETE"/>
- <int value="4" label="FORM_BLACKLISTED"/>
- <int value="5" label="INVALID_FORM"/>
- <int value="6" label="AUTOCOMPLETE_OFF"/>
-</enum>
-
<enum name="ProxyStatus" type="int">
<int value="0" label="PROXY_STATUS_IGNORED"/>
<int value="1" label="PROXY_UNINITIALIZED"/>
diff --git a/chromium/tools/perf/benchmarks/page_cycler.py b/chromium/tools/perf/benchmarks/page_cycler.py
index bca43f787fd..ea06ad35934 100644
--- a/chromium/tools/perf/benchmarks/page_cycler.py
+++ b/chromium/tools/perf/benchmarks/page_cycler.py
@@ -32,7 +32,7 @@ class PageCyclerIntlArFaHe(test.Test):
class PageCyclerIntlEsFrPtBr(test.Test):
test = page_cycler.PageCycler
- page_set = 'page_sets/intl_es_fr_pt-BR.json'
+ page_set = 'page_sets/intel_es_fr_pt-BR.json'
options = {'pageset_repeat_iters': 10}
@@ -56,7 +56,7 @@ class PageCyclerIntlKoThVi(test.Test):
class PageCyclerMorejs(test.Test):
test = page_cycler.PageCycler
- page_set = 'page_sets/page_cycler/morejs.json'
+ page_set = 'page_sets/morejs.json'
options = {'pageset_repeat_iters': 10}
@@ -69,7 +69,7 @@ class PageCyclerMoz(test.Test):
class PageCyclerNetsimTop25(test.Test):
"""Measures load time of the top 25 sites under simulated cable network."""
test = page_cycler.PageCycler
- page_set = 'page_sets/top_25.json'
+ page_set = 'tools/perf/page_sets/top_25.json'
options = {
'extra_wpr_args': [
'--shaping_type=proxy',
diff --git a/chromium/tools/perf/measurements/blink_perf.py b/chromium/tools/perf/measurements/blink_perf.py
index f21cf98fb84..39ed0a29583 100644
--- a/chromium/tools/perf/measurements/blink_perf.py
+++ b/chromium/tools/perf/measurements/blink_perf.py
@@ -82,7 +82,6 @@ class BlinkPerf(page_measurement.PageMeasurement):
def CustomizeBrowserOptions(self, options):
options.AppendExtraBrowserArg('--js-flags=--expose_gc')
- options.AppendExtraBrowserArg('--enable-experimental-web-platform-features')
def MeasurePage(self, page, tab, results):
def _IsDone():
diff --git a/chromium/tools/perf/measurements/page_cycler.py b/chromium/tools/perf/measurements/page_cycler.py
index 50d11e84109..5ea989796bd 100644
--- a/chromium/tools/perf/measurements/page_cycler.py
+++ b/chromium/tools/perf/measurements/page_cycler.py
@@ -19,7 +19,6 @@ import os
import sys
from metrics import histogram
-from metrics import io
from metrics import memory
from telemetry.core import util
from telemetry.page import page_measurement
@@ -84,6 +83,35 @@ class PageCycler(page_measurement.PageMeasurement):
print 'typical_25 is currently disabled on mac. Skipping test.'
sys.exit(0)
+ def MeasureIO(self, tab, results):
+ io_stats = tab.browser.io_stats
+ if not io_stats['Browser']:
+ return
+
+ def AddSummariesForProcessType(process_type_io, process_type_trace):
+ if 'ReadOperationCount' in io_stats[process_type_io]:
+ results.AddSummary('read_operations_' + process_type_trace, '',
+ io_stats[process_type_io]
+ ['ReadOperationCount'],
+ data_type='unimportant')
+ if 'WriteOperationCount' in io_stats[process_type_io]:
+ results.AddSummary('write_operations_' + process_type_trace, '',
+ io_stats[process_type_io]
+ ['WriteOperationCount'],
+ data_type='unimportant')
+ if 'ReadTransferCount' in io_stats[process_type_io]:
+ results.AddSummary('read_bytes_' + process_type_trace, 'kb',
+ io_stats[process_type_io]
+ ['ReadTransferCount'] / 1024,
+ data_type='unimportant')
+ if 'WriteTransferCount' in io_stats[process_type_io]:
+ results.AddSummary('write_bytes_' + process_type_trace, 'kb',
+ io_stats[process_type_io]
+ ['WriteTransferCount'] / 1024,
+ data_type='unimportant')
+ AddSummariesForProcessType('Browser', 'browser')
+ AddSummariesForProcessType('Renderer', 'renderer')
+ AddSummariesForProcessType('Gpu', 'gpu')
def MeasurePage(self, page, tab, results):
def _IsDone():
@@ -100,5 +128,5 @@ class PageCycler(page_measurement.PageMeasurement):
def DidRunTest(self, tab, results):
self._memory_metric.Stop()
self._memory_metric.AddResults(tab, results)
- io.IOMetric().AddSummaryResults(tab, results)
+ self.MeasureIO(tab, results)
diff --git a/chromium/tools/perf/metrics/__init__.py b/chromium/tools/perf/metrics/__init__.py
index d46cf7ef23e..31be4688f00 100644
--- a/chromium/tools/perf/metrics/__init__.py
+++ b/chromium/tools/perf/metrics/__init__.py
@@ -11,17 +11,6 @@ class Metric(object):
about one thing.
"""
- def CustomizeBrowserOptions(self, options):
- """Add browser options that are required by this metric.
-
- Some metrics do not have any special browser options that need
- to be added, and they do not need to override this method; by
- default, no browser options are added.
-
- To add options here, call options.AppendExtraBrowserArg(arg).
- """
- pass
-
def Start(self, page, tab):
"""Start collecting data for this metric."""
raise NotImplementedError()
diff --git a/chromium/tools/perf/metrics/io.py b/chromium/tools/perf/metrics/io.py
deleted file mode 100644
index 29d186405ae..00000000000
--- a/chromium/tools/perf/metrics/io.py
+++ /dev/null
@@ -1,57 +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.
-
-from metrics import Metric
-
-class IOMetric(Metric):
- """IO-related metrics, obtained via telemetry.core.Browser."""
-
- def Start(self, page, tab):
- raise NotImplementedError()
-
- def Stop(self, page, tab):
- raise NotImplementedError()
-
- def AddResults(self, tab, results):
- # This metric currently only returns summary results, not per-page results.
- raise NotImplementedError()
-
- def AddSummaryResults(self, tab, results):
- """Add summary results to the results object."""
- io_stats = tab.browser.io_stats
- if not io_stats['Browser']:
- return
-
- def AddSummariesForProcessType(process_type_io, process_type_trace):
- """For a given process type, add all relevant summary results.
-
- Args:
- process_type_io: Type of process (eg Browser or Renderer).
- process_type_trace: String to be added to the trace name in the results.
- """
- if 'ReadOperationCount' in io_stats[process_type_io]:
- results.AddSummary('read_operations_' + process_type_trace, 'count',
- io_stats[process_type_io]
- ['ReadOperationCount'],
- data_type='unimportant')
- if 'WriteOperationCount' in io_stats[process_type_io]:
- results.AddSummary('write_operations_' + process_type_trace, 'count',
- io_stats[process_type_io]
- ['WriteOperationCount'],
- data_type='unimportant')
- if 'ReadTransferCount' in io_stats[process_type_io]:
- results.AddSummary('read_bytes_' + process_type_trace, 'kb',
- io_stats[process_type_io]
- ['ReadTransferCount'] / 1024,
- data_type='unimportant')
- if 'WriteTransferCount' in io_stats[process_type_io]:
- results.AddSummary('write_bytes_' + process_type_trace, 'kb',
- io_stats[process_type_io]
- ['WriteTransferCount'] / 1024,
- data_type='unimportant')
-
- AddSummariesForProcessType('Browser', 'browser')
- AddSummariesForProcessType('Renderer', 'renderer')
- AddSummariesForProcessType('Gpu', 'gpu')
-
diff --git a/chromium/tools/perf/page_sets/blank_page/blank_page.html b/chromium/tools/perf/page_sets/blank_page.html
index e69de29bb2d..e69de29bb2d 100644
--- a/chromium/tools/perf/page_sets/blank_page/blank_page.html
+++ b/chromium/tools/perf/page_sets/blank_page.html
diff --git a/chromium/tools/perf/page_sets/blank_page.json b/chromium/tools/perf/page_sets/blank_page.json
index 79bb01d0478..ebd896c9318 100644
--- a/chromium/tools/perf/page_sets/blank_page.json
+++ b/chromium/tools/perf/page_sets/blank_page.json
@@ -1,6 +1,6 @@
{
"description": "A single blank page.",
"pages": [
- { "url": "file:///blank_page/blank_page.html" }
+ { "url": "file:///blank_page.html" }
]
}
diff --git a/chromium/tools/telemetry/support/html_output/results-template.html b/chromium/tools/telemetry/support/html_output/results-template.html
index c6f2317001e..898d057822f 100644
--- a/chromium/tools/telemetry/support/html_output/results-template.html
+++ b/chromium/tools/telemetry/support/html_output/results-template.html
@@ -212,8 +212,8 @@ function PerfTestMetric(name, metric, unit, isImportant) {
unit == 'KB' ||
unit == 'MB' ||
unit == 'bytes' ||
- unit == 'count' ||
- !metric.indexOf('V8.'));
+ !metric.indexOf('V8.') ||
+ metric == 'processes');
}
this.addResult = function (newResult) {
testResults.push(newResult);
diff --git a/chromium/tools/telemetry/telemetry/core/backends/webdriver/__init__.py b/chromium/tools/telemetry/telemetry/core/backends/webdriver/__init__.py
deleted file mode 100644
index 9228df89b0e..00000000000
--- a/chromium/tools/telemetry/telemetry/core/backends/webdriver/__init__.py
+++ /dev/null
@@ -1,3 +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.
diff --git a/chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_browser_backend.py b/chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_browser_backend.py
deleted file mode 100644
index 2eb01f2eb27..00000000000
--- a/chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_browser_backend.py
+++ /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.
-
-from telemetry.core.backends import browser_backend
-from telemetry.core.backends.webdriver import webdriver_tab_list_backend
-
-class WebDriverBrowserBackend(browser_backend.BrowserBackend):
- """The webdriver-based backend for controlling a locally-executed browser
- instance, on Linux, Mac, and Windows.
- """
-
- def __init__(self, driver_creator, supports_extensions, options):
- super(WebDriverBrowserBackend, self).__init__(
- is_content_shell=False,
- supports_extensions=supports_extensions,
- options=options,
- tab_list_backend=webdriver_tab_list_backend.WebDriverTabListBackend)
-
- self._driver_creator = driver_creator
- self._driver = None
- self.webpagereplay_local_http_port = 80
- self.webpagereplay_local_https_port = 443
- self.webpagereplay_remote_http_port = self.webpagereplay_local_http_port
- self.webpagereplay_remote_https_port = self.webpagereplay_local_https_port
-
- def Start(self):
- assert not self._driver
- self._driver = self._driver_creator()
-
- @property
- def driver(self):
- assert self._driver
- return self._driver
-
- @property
- def supports_tab_control(self):
- # Based on webdriver protocol API, only closing a tab is supported while
- # activating or creating a tab is not. Thus, tab control is not supported.
- return False
-
- @property
- def supports_tracing(self):
- # Tracing is not available in IE/Firefox yet and not supported through
- # webdriver API.
- return False
-
- def GetProcessName(self, _):
- # Leave implementation details to subclass as process name depends on the
- # type of browser.
- raise NotImplementedError()
-
- def Close(self):
- if self._driver:
- self._driver.quit()
- self._driver = None
-
- def CreateForwarder(self, *port_pairs):
- return browser_backend.DoNothingForwarder(*port_pairs)
-
- def IsBrowserRunning(self):
- # Assume the browser is running if not explicitly closed.
- return self._driver is not None
-
- def GetStandardOutput(self):
- # TODO(chrisgao): check if python client can get stdout of browsers.
- return ''
-
- def __del__(self):
- self.Close()
diff --git a/chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_desktop_browser_finder.py b/chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_desktop_browser_finder.py
deleted file mode 100644
index 13c298946ec..00000000000
--- a/chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_desktop_browser_finder.py
+++ /dev/null
@@ -1,103 +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.
-"""Finds desktop browsers that can be controlled by telemetry."""
-
-import logging
-import os
-import sys
-
-from telemetry.core import browser
-from telemetry.core import possible_browser
-from telemetry.core import platform
-from telemetry.core import util
-from telemetry.core.backends.webdriver import webdriver_browser_backend
-
-# Try to import the selenium python lib which may be not available.
-try:
- from selenium import webdriver # pylint: disable=F0401
-except ImportError:
- webdriver = None
- pylib = os.path.join(util.GetChromiumSrcDir(),
- 'third_party', 'webdriver', 'pylib')
- if (os.path.isdir(pylib)):
- sys.path.insert(0, pylib)
- try:
- from selenium import webdriver # pylint: disable=F0401
- except ImportError:
- webdriver = None
-
-ALL_BROWSER_TYPES = ''
-if webdriver:
- ALL_BROWSER_TYPES = ','.join([
- 'internet-explorer',
- 'internet-explorer-x64'])
-else:
- logging.warning('Webdriver backend is unsupported without selenium pylib. '
- 'For installation of selenium pylib, please refer to '
- 'https://code.google.com/p/selenium/wiki/PythonBindings.')
-
-
-class PossibleWebDriverBrowser(possible_browser.PossibleBrowser):
- """A browser that can be controlled through webdriver API."""
-
- def __init__(self, browser_type, options):
- super(PossibleWebDriverBrowser, self).__init__(browser_type, options)
-
- def CreateWebDriverBackend(self):
- raise NotImplementedError()
-
- def Create(self):
- backend = self.CreateWebDriverBackend()
- b = browser.Browser(backend, platform.CreatePlatformBackendForCurrentOS())
- return b
-
- def SupportsOptions(self, options):
- # TODO(chrisgao): Check if some options are not supported.
- return True
-
- @property
- def last_modification_time(self):
- return -1
-
- def SelectDefaultBrowser(self, possible_browsers): # pylint: disable=W0613
- return None
-
-
-class PossibleDesktopIE(PossibleWebDriverBrowser):
- def __init__(self, browser_type, options, architecture):
- super(PossibleDesktopIE, self).__init__(browser_type, options)
- self._architecture = architecture
-
- def CreateWebDriverBackend(self):
- assert webdriver
- def DriverCreator():
- # TODO(chrisgao): Check in IEDriverServer.exe and specify path to it when
- # creating the webdriver instance. crbug.com/266170
- return webdriver.Ie()
- return webdriver_browser_backend.WebDriverBrowserBackend(
- DriverCreator, False, self.options)
-
-
-def FindAllAvailableBrowsers(options):
- """Finds all the desktop browsers available on this machine."""
- browsers = []
- if not webdriver:
- return browsers
-
- # Look for the IE browser in the standard location.
- if sys.platform.startswith('win'):
- ie_path = os.path.join('Internet Explorer', 'iexplore.exe')
- win_search_paths = {
- '32' : { 'path' : os.getenv('PROGRAMFILES(X86)'),
- 'type' : 'internet-explorer'},
- '64' : { 'path' : os.getenv('PROGRAMFILES'),
- 'type' : 'internet-explorer-x64'}}
- for architecture, ie_info in win_search_paths.iteritems():
- if not ie_info['path']:
- continue
- if os.path.exists(os.path.join(ie_info['path'], ie_path)):
- browsers.append(
- PossibleDesktopIE(ie_info['type'], options, architecture))
-
- return browsers
diff --git a/chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_tab_backend.py b/chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_tab_backend.py
deleted file mode 100644
index df2e7ae62e3..00000000000
--- a/chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_tab_backend.py
+++ /dev/null
@@ -1,120 +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.
-
-import logging
-
-# TODO(chrisgao): Make png_bitmap sharable for both chrome and webdriver.
-from telemetry.core.chrome import png_bitmap
-
-class WebDriverTabBackend(object):
- def __init__(self, browser_backend, window_handle):
- self._browser_backend = browser_backend
- self._window_handle = window_handle
-
- def Disconnect(self):
- pass
-
- @property
- def browser(self):
- return self._browser_backend.browser
-
- @property
- def window_handle(self):
- return self._window_handle
-
- @property
- def url(self):
- self._browser_backend.driver.switch_to_window(self._window_handle)
- return self._browser_backend.driver.current_url
-
- def Activate(self):
- # Webdriver doesn't support tab control.
- raise NotImplementedError()
-
- def Close(self):
- self._browser_backend.driver.switch_to_window(self._window_handle)
- self._browser_backend.driver.close()
-
- def WaitForDocumentReadyStateToBeComplete(self, timeout=None):
- # TODO(chrisgao): Double check of document state.
- pass
-
- def WaitForDocumentReadyStateToBeInteractiveOrBetter(self, timeout=None):
- # TODO(chrisgao): Double check of document state.
- pass
-
- @property
- def screenshot_supported(self):
- return True
-
- def Screenshot(self, timeout=None): # pylint: disable=W0613
- if timeout:
- logging.warning('timeout is not supported')
- self._browser_backend.driver.switch_to_window(self._window_handle)
- snap = self._browser_backend.driver.get_screenshot_as_base64()
- if snap:
- return png_bitmap.PngBitmap(snap)
- return None
-
- @property
- def message_output_stream(self):
- # Webdriver has no API for grabbing console messages.
- raise NotImplementedError()
-
- @message_output_stream.setter
- def message_output_stream(self, stream):
- raise NotImplementedError()
-
- def GetDOMStats(self, timeout=None):
- # Webdriver has no API for DOM status.
- raise NotImplementedError()
-
- def PerformActionAndWaitForNavigate(self, action_function, _):
- # TODO(chrisgao): Double check of navigation.
- action_function()
-
- def Navigate(self, url, script_to_evaluate_on_commit=None, timeout=None):
- if script_to_evaluate_on_commit:
- raise NotImplementedError('script_to_evaluate_on_commit is NOT supported')
- self._browser_backend.driver.switch_to_window(self._window_handle)
- if timeout:
- self._browser_backend.driver.set_page_load_timeout(timeout * 1000)
- self._browser_backend.driver.get(url)
-
- def GetCookieByName(self, name, timeout=None):
- if timeout:
- logging.warning('timeout is not supported')
- self._browser_backend.driver.switch_to_window(self._window_handle)
- cookie = self._browser_backend.driver.get_cookie(name)
- if cookie:
- return cookie['value']
- return None
-
- def ExecuteJavaScript(self, expr, timeout=None):
- self._browser_backend.driver.switch_to_window(self._window_handle)
- if timeout:
- logging.warning('timeout is not supported')
- self._browser_backend.driver.execute_script(expr)
-
- def EvaluateJavaScript(self, expr, timeout=None):
- self._browser_backend.driver.switch_to_window(self._window_handle)
- if timeout:
- logging.warning('timeout is not supported')
- return self._browser_backend.driver.execute_script(
- 'return eval(\'%s\')' % expr.replace('\'', '\\\'').replace('\n', ' '))
-
- @property
- def timeline_model(self):
- # IE/Firefox has no timeline.
- raise NotImplementedError()
-
- def StartTimelineRecording(self):
- raise NotImplementedError()
-
- def StopTimelineRecording(self):
- raise NotImplementedError()
-
- def ClearCache(self):
- # Can't find a way to clear cache of a tab in IE/Firefox.
- raise NotImplementedError()
diff --git a/chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_tab_list_backend.py b/chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_tab_list_backend.py
deleted file mode 100644
index ea9c8346c4b..00000000000
--- a/chromium/tools/telemetry/telemetry/core/backends/webdriver/webdriver_tab_list_backend.py
+++ /dev/null
@@ -1,47 +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.
-
-from telemetry.core.backends.webdriver import webdriver_tab_backend
-
-class WebDriverTabListBackend(object):
- def __init__(self, browser_backend):
- self._browser_backend = browser_backend
- # Stores the window handles.
- self._tab_list = []
-
- def Init(self):
- self._UpdateTabList()
-
- def New(self, timeout=None):
- # Webdriver API doesn't support tab controlling.
- raise NotImplementedError()
-
- def __iter__(self):
- self._UpdateTabList()
- return self._tab_list.__iter__()
-
- def __len__(self):
- self._UpdateTabList()
- return len(self._tab_list)
-
- def __getitem__(self, index):
- self._UpdateTabList()
- if len(self._tab_list) <= index:
- raise IndexError('list index out of range')
- return self._tab_list[index]
-
- def _UpdateTabList(self):
- window_handles = self._browser_backend.driver.window_handles
- old_tab_list = self._tab_list
- self._tab_list = []
- for window_handle in window_handles:
- tab = None
- for old_tab in old_tab_list:
- if old_tab.window_handle == window_handle:
- tab = old_tab
- break
- else:
- tab = webdriver_tab_backend.WebDriverTabBackend(
- self._browser_backend, window_handle)
- self._tab_list.append(tab)
diff --git a/chromium/tools/telemetry/telemetry/core/browser_finder.py b/chromium/tools/telemetry/telemetry/core/browser_finder.py
index 0248857fb53..e316e05a84a 100644
--- a/chromium/tools/telemetry/telemetry/core/browser_finder.py
+++ b/chromium/tools/telemetry/telemetry/core/browser_finder.py
@@ -5,7 +5,6 @@
import logging
-from telemetry.core.backends.webdriver import webdriver_desktop_browser_finder
from telemetry.core.chrome import android_browser_finder
from telemetry.core.chrome import cros_browser_finder
from telemetry.core.chrome import desktop_browser_finder
@@ -13,8 +12,7 @@ from telemetry.core.chrome import desktop_browser_finder
BROWSER_FINDERS = [
desktop_browser_finder,
android_browser_finder,
- cros_browser_finder,
- webdriver_desktop_browser_finder,
+ cros_browser_finder
]
ALL_BROWSER_TYPES = ','.join([bf.ALL_BROWSER_TYPES for bf in BROWSER_FINDERS])
diff --git a/chromium/tools/telemetry/telemetry/core/browser_options.py b/chromium/tools/telemetry/telemetry/core/browser_options.py
index 70d3c1ff340..69f304823a1 100644
--- a/chromium/tools/telemetry/telemetry/core/browser_options.py
+++ b/chromium/tools/telemetry/telemetry/core/browser_options.py
@@ -54,7 +54,6 @@ class BrowserOptions(optparse.Values):
self.repeat_options = repeat_options.RepeatOptions()
self.output_file = None
- self.skip_navigate_on_repeat = False
def Copy(self):
return copy.deepcopy(self)
diff --git a/chromium/tools/telemetry/telemetry/core/chrome/android_browser_finder.py b/chromium/tools/telemetry/telemetry/core/chrome/android_browser_finder.py
index d3a7bdcfc2e..86a942fa2ff 100644
--- a/chromium/tools/telemetry/telemetry/core/chrome/android_browser_finder.py
+++ b/chromium/tools/telemetry/telemetry/core/chrome/android_browser_finder.py
@@ -101,17 +101,6 @@ def CanFindAvailableBrowsers(logging=real_logging):
adb_works = True
else:
adb_works = False
- if adb_works and sys.platform.startswith('linux'):
- # Workaround for crbug.com/268450
- import psutil
- adb_commands.GetAttachedDevices()
- pids = [p.pid for p in psutil.process_iter() if 'adb' in p.name]
- with open(os.devnull, 'w') as devnull:
- for pid in pids:
- subprocess.check_call(['taskset', '-p', '0x1', str(pid)],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- stdin=devnull)
return adb_works
diff --git a/chromium/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py b/chromium/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py
index 805a48147c5..0f73add3119 100644
--- a/chromium/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py
+++ b/chromium/tools/telemetry/telemetry/core/chrome/cros_browser_backend.py
@@ -106,7 +106,7 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
def _GetSessionManagerPid(self, procs):
"""Returns the pid of the session_manager process, given the list of
processes."""
- for pid, process, _, _ in procs:
+ for pid, process, _ in procs:
if process.startswith('/sbin/session_manager '):
return pid
return None
@@ -129,7 +129,7 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
return None
# Find the chrome process that is the child of the session_manager.
- for pid, process, ppid, _ in procs:
+ for pid, process, ppid in procs:
if ppid != session_manager_pid:
continue
for path in self.CHROME_PATHS:
diff --git a/chromium/tools/telemetry/telemetry/core/chrome/cros_interface.py b/chromium/tools/telemetry/telemetry/core/chrome/cros_interface.py
index 6f1f16084eb..a825e5b290a 100644
--- a/chromium/tools/telemetry/telemetry/core/chrome/cros_interface.py
+++ b/chromium/tools/telemetry/telemetry/core/chrome/cros_interface.py
@@ -245,19 +245,19 @@ class CrOSInterface(object):
return res
def ListProcesses(self):
- """Returns (pid, cmd, ppid, state) of all processes on the device."""
+ """Returns a tuple (pid, cmd, ppid) of all processes on the device."""
stdout, stderr = self.RunCmdOnDevice([
'/bin/ps', '--no-headers',
'-A',
- '-o', 'pid,ppid,args,state'], quiet=True)
+ '-o', 'pid,ppid,args'], quiet=True)
assert stderr == '', stderr
procs = []
for l in stdout.split('\n'): # pylint: disable=E1103
if l == '':
continue
- m = re.match('^\s*(\d+)\s+(\d+)\s+(.+)\s+(.+)', l, re.DOTALL)
+ m = re.match('^\s*(\d+)\s+(\d+)\s+(.+)', l, re.DOTALL)
assert m
- procs.append((int(m.group(1)), m.group(3), int(m.group(2)), m.group(4)))
+ procs.append((int(m.group(1)), m.group(3), int(m.group(2))))
logging.debug("ListProcesses(<predicate>)->[%i processes]" % len(procs))
return procs
@@ -267,7 +267,7 @@ class CrOSInterface(object):
def KillAllMatching(self, predicate):
kills = ['kill', '-KILL']
- for pid, cmd, _, _ in self.ListProcesses():
+ for pid, cmd, _ in self.ListProcesses():
if predicate(cmd):
logging.info('Killing %s, pid %d' % cmd, pid)
kills.append(pid)
diff --git a/chromium/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py b/chromium/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py
index 93f33d8c677..8ef4d6d1bcc 100644
--- a/chromium/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py
+++ b/chromium/tools/telemetry/telemetry/core/chrome/desktop_browser_finder.py
@@ -150,13 +150,10 @@ def FindAllAvailableBrowsers(options):
else:
raise Exception('Platform not recognized')
- def IsExecutable(path):
- return os.path.isfile(path) and os.access(path, os.X_OK)
-
# Add the explicit browser executable if given.
if options.browser_executable:
normalized_executable = os.path.expanduser(options.browser_executable)
- if IsExecutable(normalized_executable):
+ if os.path.exists(normalized_executable):
browser_directory = os.path.dirname(options.browser_executable)
browsers.append(PossibleDesktopBrowser('exact', options,
normalized_executable, flash_path,
@@ -168,7 +165,7 @@ def FindAllAvailableBrowsers(options):
def AddIfFound(browser_type, build_dir, type_dir, app_name, content_shell):
browser_directory = os.path.join(chrome_root, build_dir, type_dir)
app = os.path.join(browser_directory, app_name)
- if IsExecutable(app):
+ if os.path.exists(app):
browsers.append(PossibleDesktopBrowser(browser_type, options,
app, flash_path, content_shell,
browser_directory,
@@ -189,12 +186,12 @@ def FindAllAvailableBrowsers(options):
mac_canary = mac_canary_root + 'Contents/MacOS/Google Chrome Canary'
mac_system_root = '/Applications/Google Chrome.app'
mac_system = mac_system_root + '/Contents/MacOS/Google Chrome'
- if IsExecutable(mac_canary):
+ if os.path.exists(mac_canary):
browsers.append(PossibleDesktopBrowser('canary', options,
mac_canary, None, False,
mac_canary_root))
- if IsExecutable(mac_system):
+ if os.path.exists(mac_system):
browsers.append(PossibleDesktopBrowser('system', options,
mac_system, None, False,
mac_system_root))
@@ -226,7 +223,7 @@ def FindAllAvailableBrowsers(options):
def AddIfFoundWin(browser_name, app_path):
browser_directory = os.path.join(path, app_path)
app = os.path.join(browser_directory, chromium_app_name)
- if IsExecutable(app):
+ if os.path.exists(app):
browsers.append(PossibleDesktopBrowser(browser_name, options,
app, flash_path, False,
browser_directory))
diff --git a/chromium/tools/telemetry/telemetry/core/platform/cros_platform_backend.py b/chromium/tools/telemetry/telemetry/core/platform/cros_platform_backend.py
index 02f6a71b89d..3c0a25c7069 100644
--- a/chromium/tools/telemetry/telemetry/core/platform/cros_platform_backend.py
+++ b/chromium/tools/telemetry/telemetry/core/platform/cros_platform_backend.py
@@ -53,18 +53,6 @@ class CrosPlatformBackend(platform_backend.PlatformBackend):
def GetOSName(self):
return 'chromeos'
- def GetChildPids(self, pid):
- """Returns a list of child pids of |pid|."""
- all_process_info = self._cri.ListProcesses()
- processes = []
- for pid, _, ppid, state in all_process_info:
- processes.append((pid, ppid, state))
- return proc_util.GetChildPids(processes, pid)
-
- def GetCommandLine(self, pid):
- command = self._GetPsOutput(['command'], pid)
- return command[0] if command else None
-
def CanFlushIndividualFilesFromSystemCache(self):
return True
diff --git a/chromium/tools/telemetry/telemetry/core/platform/posix_platform_backend.py b/chromium/tools/telemetry/telemetry/core/platform/posix_platform_backend.py
index fa20b54b930..e3c60ace394 100644
--- a/chromium/tools/telemetry/telemetry/core/platform/posix_platform_backend.py
+++ b/chromium/tools/telemetry/telemetry/core/platform/posix_platform_backend.py
@@ -4,8 +4,9 @@
import subprocess
+from collections import defaultdict
+
from telemetry.core.platform import desktop_platform_backend
-from telemetry.core.platform import proc_util
class PosixPlatformBackend(desktop_platform_backend.DesktopPlatformBackend):
@@ -37,11 +38,23 @@ class PosixPlatformBackend(desktop_platform_backend.DesktopPlatformBackend):
def GetChildPids(self, pid):
"""Returns a list of child pids of |pid|."""
- ps_output = self._GetPsOutput(['pid', 'ppid', 'state'])
- processes = []
- for pid_ppid_state in ps_output:
- processes.append(pid_ppid_state.split())
- return proc_util.GetChildPids(processes, pid)
+ pid_ppid_state_list = self._GetPsOutput(['pid', 'ppid', 'state'])
+
+ child_dict = defaultdict(list)
+ for pid_ppid_state in pid_ppid_state_list:
+ curr_pid, curr_ppid, state = pid_ppid_state.split()
+ if 'Z' in state:
+ continue # Ignore zombie processes
+ child_dict[int(curr_ppid)].append(int(curr_pid))
+ queue = [pid]
+ child_ids = []
+ while queue:
+ parent = queue.pop()
+ if parent in child_dict:
+ children = child_dict[parent]
+ queue.extend(children)
+ child_ids.extend(children)
+ return child_ids
def GetCommandLine(self, pid):
command = self._GetPsOutput(['command'], pid)
diff --git a/chromium/tools/telemetry/telemetry/core/platform/proc_util.py b/chromium/tools/telemetry/telemetry/core/platform/proc_util.py
index 656eb846996..9be108f946b 100644
--- a/chromium/tools/telemetry/telemetry/core/platform/proc_util.py
+++ b/chromium/tools/telemetry/telemetry/core/platform/proc_util.py
@@ -2,8 +2,6 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-from collections import defaultdict
-
try:
import resource # pylint: disable=F0401
except ImportError:
@@ -13,7 +11,6 @@ except ImportError:
def _ConvertKbToByte(value):
return int(value.replace('kB','')) * 1024
-
def _GetProcFileDict(contents):
retval = {}
for line in contents.splitlines():
@@ -21,7 +18,6 @@ def _GetProcFileDict(contents):
retval[key.strip()] = value.strip()
return retval
-
def GetSystemCommitCharge(meminfo_contents):
meminfo = _GetProcFileDict(meminfo_contents)
return (_ConvertKbToByte(meminfo['MemTotal'])
@@ -29,7 +25,6 @@ def GetSystemCommitCharge(meminfo_contents):
- _ConvertKbToByte(meminfo['Buffers'])
- _ConvertKbToByte(meminfo['Cached']))
-
def GetMemoryStats(status_contents, stats):
status = _GetProcFileDict(status_contents)
if not status or not stats or 'Z' in status['State']:
@@ -39,27 +34,9 @@ def GetMemoryStats(status_contents, stats):
'WorkingSetSize': int(stats[23]) * resource.getpagesize(),
'WorkingSetSizePeak': _ConvertKbToByte(status['VmHWM'])}
-
def GetIOStats(io_contents):
io = _GetProcFileDict(io_contents)
return {'ReadOperationCount': int(io['syscr']),
'WriteOperationCount': int(io['syscw']),
'ReadTransferCount': int(io['rchar']),
'WriteTransferCount': int(io['wchar'])}
-
-
-def GetChildPids(processes, pid):
- child_dict = defaultdict(list)
- for curr_pid, curr_ppid, state in processes:
- if 'Z' in state:
- continue # Ignore zombie processes
- child_dict[int(curr_ppid)].append(int(curr_pid))
- queue = [pid]
- child_ids = []
- while queue:
- parent = queue.pop()
- if parent in child_dict:
- children = child_dict[parent]
- queue.extend(children)
- child_ids.extend(children)
- return child_ids
diff --git a/chromium/tools/telemetry/telemetry/core/platform/profiler/strace_profiler.py b/chromium/tools/telemetry/telemetry/core/platform/profiler/strace_profiler.py
deleted file mode 100644
index 186a8d0025d..00000000000
--- a/chromium/tools/telemetry/telemetry/core/platform/profiler/strace_profiler.py
+++ /dev/null
@@ -1,251 +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.
-
-import json
-import logging
-import re
-import signal
-import subprocess
-import sys
-import tempfile
-
-from telemetry.core.platform import profiler
-
-
-# Parses one line of strace output, for example:
-# 6052 1311456063.159722 read(8, "\1\0\0\0\0\0\0\0", 8) = 8 <0.000022>
-_STRACE_LINE_RE = re.compile(
- '^(?P<tid>\d+)\s+'
- '(?P<ts>\d+)'
- '(?P<micro>.\d+)\s+'
- '(?P<func>.*?)'
- '[(](?P<args>.*?)[)]\s+=\s+'
- '(?P<ret>.*?)\s+'
- '<(?P<dur>[\d.]+)>$')
-
-_UNFINISHED_LINE_RE = re.compile(
- '^(?P<tid>\d+)\s+'
- '(?P<line>.*?)'
- '<unfinished ...>$')
-
-_RESUMED_LINE_RE = re.compile(
- '^(?P<tid>\d+)\s+'
- '(?P<ts>\d+)'
- '(?P<micro>.\d+)\s+'
- '<[.][.][.]\s(?P<func>.*?)\sresumed>'
- '(?P<line>.*?)$')
-
-_KILLED_LINE_RE = re.compile(
- '^(?P<tid>\d+)\s+'
- '(?P<ts>\d+)'
- '(?P<micro>.\d+)\s+'
- '[+][+][+] killed by SIGKILL [+][+][+]$')
-
-
-def _StraceToChromeTrace(pid, infile):
- """Returns chrometrace json format for |infile| strace output."""
- # Map of fd:file_name for open file descriptors. Useful for displaying
- # file name instead of the descriptor number.
- fd_map = {}
-
- # Map of tid:interrupted_call for the interrupted call on each thread. It is
- # possible to context switch during a system call. In this case we must
- # match up the lines.
- interrupted_call_map = {}
-
- out = []
- with open(infile, 'r') as f:
- for line in f.readlines():
- # Ignore kill lines for now.
- m = _KILLED_LINE_RE.match(line)
- if m:
- continue
-
- # If this line is interrupted, then remember it and continue.
- m = _UNFINISHED_LINE_RE.match(line)
- if m:
- assert m.group('tid') not in interrupted_call_map
- interrupted_call_map[m.group('tid')] = line
- continue
-
- # If this is a resume of a previous line, stitch it together.
- interrupted = False
- m = _RESUMED_LINE_RE.match(line)
- if m:
- interrupted = True
- assert m.group('tid') in interrupted_call_map
- line = interrupted_call_map[m.group('tid')].replace(
- '<unfinished ...>', m.group('line'))
- del interrupted_call_map[m.group('tid')]
-
- # At this point we can do a normal match.
- m = _STRACE_LINE_RE.match(line)
- if not m:
- if ('exit' not in line and
- 'Profiling timer expired' not in line and
- '<unavailable>' not in line):
- logging.warn('Failed to parse line: %s' % line)
- continue
-
- ts_begin = int(1000000 * (int(m.group('ts')) + float(m.group('micro'))))
- ts_end = ts_begin + int(1000000 * float(m.group('dur')))
- tid = int(m.group('tid'))
- function_name = unicode(m.group('func'), errors='ignore')
- function_args = unicode(m.group('args'), errors='ignore')
- ret = unicode(m.group('ret'), errors='ignore')
- cat = 'strace'
-
- possible_fd_arg = None
- first_arg = function_args.split(',')[0]
- if first_arg and first_arg.strip().isdigit():
- possible_fd_arg = first_arg.strip()
-
- if function_name == 'open' and ret.isdigit():
- # 1918 1311606151.649379 open("/foo/bar.so", O_RDONLY) = 7 <0.000088>
- fd_map[ret] = first_arg
-
- args = {
- 'args': function_args,
- 'ret': ret,
- }
- if interrupted:
- args['interrupted'] = True
- if possible_fd_arg and possible_fd_arg in fd_map:
- args['fd%s' % first_arg] = fd_map[possible_fd_arg]
-
- out.append({
- 'cat': cat,
- 'pid': pid,
- 'tid': tid,
- 'ts': ts_begin,
- 'ph': 'B', # Begin
- 'name': function_name,
- })
- out.append({
- 'cat': cat,
- 'pid': pid,
- 'tid': tid,
- 'ts': ts_end,
- 'ph': 'E', # End
- 'name': function_name,
- 'args': args,
- })
-
- return out
-
-
-def _GenerateTraceMetadata(model):
- out = []
- for process in model.processes:
- out.append({
- 'name': 'process_name',
- 'ph': 'M', # Metadata
- 'pid': process,
- 'args': {
- 'name': model.processes[process].name
- }
- })
- for thread in model.processes[process].threads:
- out.append({
- 'name': 'thread_name',
- 'ph': 'M', # Metadata
- 'pid': process,
- 'tid': thread,
- 'args': {
- 'name': model.processes[process].threads[thread].name
- }
- })
- return out
-
-
-class _SingleProcessStraceProfiler(object):
- """An internal class for using perf for a given process."""
- def __init__(self, pid, output_file, platform_backend):
- self._pid = pid
- self._platform_backend = platform_backend
- self._output_file = output_file
- self._tmp_output_file = tempfile.NamedTemporaryFile('w', 0)
- self._proc = subprocess.Popen(
- ['strace', '-ttt', '-f', '-T', '-p', str(pid), '-o', output_file],
- stdout=self._tmp_output_file, stderr=subprocess.STDOUT)
-
- def CollectProfile(self):
- if ('renderer' in self._output_file and
- not self._platform_backend.GetCommandLine(self._pid)):
- logging.warning('Renderer was swapped out during profiling. '
- 'To collect a full profile rerun with '
- '"--extra-browser-args=--single-process"')
- self._proc.send_signal(signal.SIGINT)
- exit_code = self._proc.wait()
- try:
- if exit_code:
- raise Exception('strace failed with exit code %d. Output:\n%s' % (
- exit_code, self._GetStdOut()))
- finally:
- self._tmp_output_file.close()
-
- return _StraceToChromeTrace(self._pid, self._output_file)
-
- def _GetStdOut(self):
- self._tmp_output_file.flush()
- try:
- with open(self._tmp_output_file.name) as f:
- return f.read()
- except IOError:
- return ''
-
-
-class StraceProfiler(profiler.Profiler):
-
- def __init__(self, browser_backend, platform_backend, output_path):
- super(StraceProfiler, self).__init__(
- browser_backend, platform_backend, output_path)
- assert self._browser_backend.supports_tracing
- self._browser_backend.StartTracing(None, 10)
- process_output_file_map = self._GetProcessOutputFileMap()
- self._process_profilers = []
- self._output_file = output_path + '.json'
- for pid, output_file in process_output_file_map.iteritems():
- if 'zygote' in output_file:
- continue
- self._process_profilers.append(
- _SingleProcessStraceProfiler(pid, output_file, platform_backend))
-
- @classmethod
- def name(cls):
- return 'strace'
-
- @classmethod
- def is_supported(cls, options):
- if sys.platform != 'linux2':
- return False
- # TODO(tonyg): This should be supported on android and cros.
- if options and (options.browser_type.startswith('android')
- or options.browser_type.startswith('cros')):
- return False
- return True
-
- @classmethod
- def CustomizeBrowserOptions(cls, options):
- options.AppendExtraBrowserArg('--no-sandbox')
- options.AppendExtraBrowserArg('--allow-sandbox-debugging')
-
- def CollectProfile(self):
- print 'Processing trace...'
-
- out_json = []
-
- for single_process in self._process_profilers:
- out_json.extend(single_process.CollectProfile())
-
- self._browser_backend.StopTracing()
- model = self._browser_backend.GetTraceResultAndReset().AsTimelineModel()
- out_json.extend(_GenerateTraceMetadata(model))
-
- with open(self._output_file, 'w') as f:
- f.write(json.dumps(out_json, separators=(',', ':')))
-
- print 'Trace saved as %s' % self._output_file
- print 'To view, open in chrome://tracing'
- return [self._output_file]
diff --git a/chromium/tools/telemetry/telemetry/page/actions/wait.py b/chromium/tools/telemetry/telemetry/page/actions/wait.py
index 39f061ae149..bfe0b27e6fd 100644
--- a/chromium/tools/telemetry/telemetry/page/actions/wait.py
+++ b/chromium/tools/telemetry/telemetry/page/actions/wait.py
@@ -1,8 +1,6 @@
# 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.
-
-import re
import time
from telemetry.core import util
@@ -45,14 +43,14 @@ class WaitAction(page_action.PageAction):
elif self.condition == 'element':
assert hasattr(self, 'text') or hasattr(self, 'selector')
- if hasattr(self, 'text'):
+ if self.text:
callback_code = 'function(element) { return element != null; }'
util.WaitFor(
lambda: util.FindElementAndPerformAction(
tab, self.text, callback_code), self.DEFAULT_TIMEOUT)
- else:
+ elif self.selector:
util.WaitFor(lambda: tab.EvaluateJavaScript(
- 'document.querySelector("%s") != null' % re.escape(self.selector)),
+ 'document.querySelector("%s") != null' % self.selector),
self.DEFAULT_TIMEOUT)
elif self.condition == 'javascript':
diff --git a/chromium/tools/telemetry/telemetry/page/cloud_storage.py b/chromium/tools/telemetry/telemetry/page/cloud_storage.py
index 5d537c822ac..d52c62252e1 100644
--- a/chromium/tools/telemetry/telemetry/page/cloud_storage.py
+++ b/chromium/tools/telemetry/telemetry/page/cloud_storage.py
@@ -27,14 +27,6 @@ class CloudStorageError(Exception):
pass
-class CredentialsError(CloudStorageError):
- def __init__(self, gsutil_path):
- super(CredentialsError, self).__init__(
- 'Attempted to download a file from Cloud Storage but you have no '
- 'configured credentials. Run "%s config" to configure your '
- 'credentials. The project-id field can be left blank.' % gsutil_path)
-
-
def _DownloadGsutil():
logging.info('Downloading gsutil')
response = urllib2.urlopen(_GSUTIL_URL)
@@ -72,10 +64,7 @@ def _RunCommand(args):
stdout, stderr = gsutil.communicate()
if gsutil.returncode:
- if ('You are attempting to access protected data with '
- 'no configured credentials.' in stderr):
- raise CredentialsError(gsutil_path)
- raise CloudStorageError(stderr)
+ raise CloudStorageError(stderr.splitlines()[-1])
return stdout
diff --git a/chromium/tools/telemetry/telemetry/page/page_runner.py b/chromium/tools/telemetry/telemetry/page/page_runner.py
index 89ab3115de7..1df51dec457 100644
--- a/chromium/tools/telemetry/telemetry/page/page_runner.py
+++ b/chromium/tools/telemetry/telemetry/page/page_runner.py
@@ -32,7 +32,6 @@ class _RunState(object):
self._first_browser = True
self.first_page = collections.defaultdict(lambda: True)
self.profiler_dir = None
- self.repeat_state = None
def StartBrowser(self, test, page_set, page, possible_browser,
credentials_path, archive_path):
@@ -111,9 +110,12 @@ class PageState(object):
def PreparePage(self, page, tab, test=None):
if page.is_file:
- serving_dirs = page.serving_dirs_and_file[0]
+ serving_dirs, filename = page.serving_dirs_and_file
if tab.browser.SetHTTPServerDirectories(serving_dirs) and test:
test.DidStartHTTPServer(tab)
+ target_side_url = tab.browser.http_server.UrlOf(filename)
+ else:
+ target_side_url = page.url
if page.credentials:
if not tab.browser.credentials.LoginNeeded(tab, page.credentials):
@@ -123,19 +125,6 @@ class PageState(object):
if test:
if test.clear_cache_before_each_run:
tab.ClearCache()
-
- def ImplicitPageNavigation(self, page, tab, test=None):
- """Executes the implicit navigation that occurs for every page iteration.
-
- This function will be called once per page before any actions are executed.
- """
- if page.is_file:
- filename = page.serving_dirs_and_file[1]
- target_side_url = tab.browser.http_server.UrlOf(filename)
- else:
- target_side_url = page.url
-
- if test:
test.WillNavigateToPage(page, tab)
tab.Navigate(target_side_url, page.script_to_evaluate_on_commit)
if test:
@@ -192,7 +181,7 @@ def _PrepareAndRunPage(test, page_set, expectations, options, page,
state.browser.platform, page)
try:
- _RunPage(test, page, state, expectation,
+ _RunPage(test, page, state.tab, expectation,
results_for_current_run, options)
_CheckThermalThrottling(state.browser.platform)
except exceptions.TabCrashException:
@@ -273,19 +262,19 @@ def Run(test, page_set, expectations, options):
try:
test.WillRunTest(state.tab)
- state.repeat_state = page_runner_repeat.PageRunnerRepeatState(
- options.repeat_options)
+ repeat_state = page_runner_repeat.PageRunnerRepeatState(
+ options.repeat_options)
- state.repeat_state.WillRunPageSet()
- while state.repeat_state.ShouldRepeatPageSet():
+ repeat_state.WillRunPageSet()
+ while repeat_state.ShouldRepeatPageSet():
for page in pages:
- state.repeat_state.WillRunPage()
- while state.repeat_state.ShouldRepeatPage():
+ repeat_state.WillRunPage()
+ while repeat_state.ShouldRepeatPage():
# execute test on page
_PrepareAndRunPage(test, page_set, expectations, options, page,
credentials_path, possible_browser, results, state)
- state.repeat_state.DidRunPage()
- state.repeat_state.DidRunPageSet()
+ repeat_state.DidRunPage()
+ repeat_state.DidRunPageSet()
test.DidRunTest(state.tab, results)
finally:
@@ -367,24 +356,13 @@ def _CheckArchives(page_set, pages, results):
pages_missing_archive_path + pages_missing_archive_data]
-def _RunPage(test, page, state, expectation, results, options):
+def _RunPage(test, page, tab, expectation, results, options):
logging.info('Running %s' % page.url)
page_state = PageState()
- tab = state.tab
-
- def ProcessError():
- logging.error('%s:\n%s', page.url, traceback.format_exc())
- if expectation == 'fail':
- logging.info('Error was expected\n')
- results.AddSuccess(page)
- else:
- results.AddError(page, sys.exc_info())
try:
page_state.PreparePage(page, tab, test)
- if state.repeat_state.ShouldNavigate(options.skip_navigate_on_repeat):
- page_state.ImplicitPageNavigation(page, tab, test)
test.Run(options, page, tab, results)
util.CloseConnections(tab)
except page_test.Failure:
@@ -396,9 +374,11 @@ def _RunPage(test, page, state, expectation, results, options):
results.AddFailure(page, sys.exc_info())
except (util.TimeoutException, exceptions.LoginException,
exceptions.ProfilingException):
- ProcessError()
+ logging.error('%s:\n%s', page.url, traceback.format_exc())
+ results.AddError(page, sys.exc_info())
except (exceptions.TabCrashException, exceptions.BrowserGoneException):
- ProcessError()
+ logging.error('%s:\n%s', page.url, traceback.format_exc())
+ results.AddError(page, sys.exc_info())
# Run() catches these exceptions to relaunch the tab/browser, so re-raise.
raise
except Exception:
diff --git a/chromium/tools/telemetry/telemetry/page/page_runner_repeat.py b/chromium/tools/telemetry/telemetry/page/page_runner_repeat.py
index 5c80f5c68fd..acec0b0b714 100644
--- a/chromium/tools/telemetry/telemetry/page/page_runner_repeat.py
+++ b/chromium/tools/telemetry/telemetry/page/page_runner_repeat.py
@@ -52,10 +52,3 @@ class PageRunnerRepeatState(object):
self.page_iters >= self.options.page_repeat_iters):
return False
return True
-
- def ShouldNavigate(self, skip_navigate_on_repeat):
- """Returns whether we are navigating to pages on page repeats.
-
- Always navigate on the first iteration of a page and on every new pageset.
- """
- return self.page_iters == 0 or not skip_navigate_on_repeat \ No newline at end of file
diff --git a/chromium/tools/telemetry/telemetry/page/page_runner_unittest.py b/chromium/tools/telemetry/telemetry/page/page_runner_unittest.py
index 815683b56c6..2ff1cfc9f02 100644
--- a/chromium/tools/telemetry/telemetry/page/page_runner_unittest.py
+++ b/chromium/tools/telemetry/telemetry/page/page_runner_unittest.py
@@ -59,27 +59,8 @@ class PageRunnerTests(unittest.TestCase):
options.output_format = 'none'
results = page_runner.Run(Test('RunTest'), ps, expectations, options)
self.assertEquals(0, len(results.successes))
- self.assertEquals(0, len(results.failures))
self.assertEquals(1, len(results.errors))
- def testHandlingOfCrashedTabWithExpectedFailure(self):
- ps = page_set.PageSet()
- expectations = test_expectations.TestExpectations()
- expectations.Fail('chrome://crash')
- page1 = page_module.Page('chrome://crash', ps)
- ps.pages.append(page1)
-
- class Test(page_test.PageTest):
- def RunTest(self, *args):
- pass
-
- options = options_for_unittests.GetCopy()
- options.output_format = 'none'
- results = page_runner.Run(Test('RunTest'), ps, expectations, options)
- self.assertEquals(1, len(results.successes))
- self.assertEquals(0, len(results.failures))
- self.assertEquals(0, len(results.errors))
-
def testDiscardFirstResult(self):
ps = page_set.PageSet()
expectations = test_expectations.TestExpectations()
diff --git a/chromium/tools/telemetry/telemetry/page/test_expectations.py b/chromium/tools/telemetry/telemetry/page/test_expectations.py
index 2ed9faa30a0..45689223878 100644
--- a/chromium/tools/telemetry/telemetry/page/test_expectations.py
+++ b/chromium/tools/telemetry/telemetry/page/test_expectations.py
@@ -6,7 +6,7 @@ import fnmatch
OS_MODIFIERS = ['win', 'xp', 'vista', 'win7',
'mac', 'leopard', 'snowleopard', 'lion', 'mountainlion',
- 'linux', 'chromeos', 'android']
+ 'linux', 'chromeos']
GPU_MODIFIERS = ['nvidia', 'amd', 'intel']
CONFIG_MODIFIERS = ['debug', 'release']
diff --git a/chromium/tools/telemetry/telemetry/unittest/system_stub.py b/chromium/tools/telemetry/telemetry/unittest/system_stub.py
index b647f5fb593..42078444e74 100644
--- a/chromium/tools/telemetry/telemetry/unittest/system_stub.py
+++ b/chromium/tools/telemetry/telemetry/unittest/system_stub.py
@@ -88,9 +88,6 @@ class OsModuleStub(object):
def exists(self, path):
return path in self.files
- def isfile(self, path):
- return path in self.files
-
def join(self, *paths):
def IsAbsolutePath(path):
if self.sys.platform.startswith('win'):
@@ -118,8 +115,6 @@ class OsModuleStub(object):
def dirname(self, filename): # pylint: disable=R0201
return os.path.dirname(filename)
- X_OK = os.X_OK
-
def __init__(self, sys_module=real_sys):
self.path = OsModuleStub.OsPathModuleStub(sys_module)
self.display = ':0'
@@ -128,9 +123,6 @@ class OsModuleStub(object):
self.program_files_x86 = None
self.devnull = os.devnull
- def access(self, path, _):
- return path in self.path.files
-
def getenv(self, name):
if name == 'DISPLAY':
return self.display
diff --git a/chromium/tools/valgrind/gtest_exclude/ash_unittests.gtest.txt b/chromium/tools/valgrind/gtest_exclude/ash_unittests.gtest.txt
new file mode 100644
index 00000000000..b7a178d7a60
--- /dev/null
+++ b/chromium/tools/valgrind/gtest_exclude/ash_unittests.gtest.txt
@@ -0,0 +1,2 @@
+# crbug.com/234854
+PanelLayoutManagerTest.PanelAlignmentSecondDisplay
diff --git a/chromium/tools/valgrind/gtest_exclude/content_unittests.gtest_mac.txt b/chromium/tools/valgrind/gtest_exclude/content_unittests.gtest_mac.txt
index 6e109511c92..562c2429c90 100644
--- a/chromium/tools/valgrind/gtest_exclude/content_unittests.gtest_mac.txt
+++ b/chromium/tools/valgrind/gtest_exclude/content_unittests.gtest_mac.txt
@@ -48,5 +48,8 @@ WebRTCAudioDeviceTest.WebRtcRecordingSetupTime
FontSerializationTest.StyledFonts
MacSandboxTest.FontLoadingTest
+# http://crbug.com/247685
+DesktopCaptureDeviceTest.Capture
+
# http://crbug.com/270254
DeviceOrientationEventPumpTest.*
diff --git a/chromium/tools/valgrind/gtest_exclude/unit_tests.gtest_linux.txt b/chromium/tools/valgrind/gtest_exclude/unit_tests.gtest_linux.txt
index 5bc4480e255..c6141b3b011 100644
--- a/chromium/tools/valgrind/gtest_exclude/unit_tests.gtest_linux.txt
+++ b/chromium/tools/valgrind/gtest_exclude/unit_tests.gtest_linux.txt
@@ -32,6 +32,3 @@ CpuInfoProviderTest.*
# Fails flakily. http://crbug.com/255771
NetworkStatsTestUDP.UDPEcho*
-
-# Fails flakily. http://crbug.com/269965
-DesktopMediaPickerModelTest.UpdateThumbnail \ No newline at end of file
diff --git a/chromium/tools/valgrind/memcheck/suppressions.txt b/chromium/tools/valgrind/memcheck/suppressions.txt
index b68046922e8..2bd1806022c 100644
--- a/chromium/tools/valgrind/memcheck/suppressions.txt
+++ b/chromium/tools/valgrind/memcheck/suppressions.txt
@@ -6641,17 +6641,6 @@
fun:_ZN7WebCore14NodeV8InternalL37appendChildMethodCallbackForMainWorldERKN2v820FunctionCallbackInfoINS1_5ValueEEE
}
{
- bug_241892d
- Memcheck:Leak
- fun:malloc
- fun:_ZN3WTF10fastMallocEm
- fun:_ZN3WTF10RefCountedIN7WebCore11CSSSelector8RareDataEEnwEm
- fun:_ZN7WebCore11CSSSelector8RareData6createEN3WTF10PassRefPtrINS2_10StringImplEEE
- fun:_ZN7WebCore11CSSSelector14createRareDataEv
- ...
- fun:_Z10cssyyparsePN7WebCore9CSSParserE
-}
-{
bug_241932
Memcheck:Leak
fun:calloc
@@ -7184,48 +7173,39 @@
fun:_ZN4base11MessageLoop8PostTaskERKN15tracked_objects8LocationERKNS_8CallbackIFvvEEE
}
{
- bug_270312
+ bug_269884a
Memcheck:Leak
fun:_Znw*
- fun:_ZN14message_center22MessageCenterButtonBarC1EPNS_17MessageCenterViewEPNS_13MessageCenterEPNS_24NotifierSettingsProviderEb
- fun:_ZN14message_center17MessageCenterViewC1EPNS_13MessageCenterEPNS_17MessageCenterTrayEibb
- fun:_ZN14message_center21MessageCenterViewTest5SetUpEv
-}
-{
- bug_272179_a
- Memcheck:Uninitialized
- ...
- fun:_ZN7WebCore14HarfBuzzShaper17shapeHarfBuzzRuns*
-}
-{
- bug_272179_b
- Memcheck:Uninitialized
- ...
- fun:_ZN7WebCore14HarfBuzzShaper19collectHarfBuzzRunsEv
+ fun:_ZN24SkColorFilterImageFilter6CreateEP13SkColorFilterP13SkImageFilterPK7SkIRect
+ fun:_ZN7WebCore22SkiaImageFilterBuilder19transformColorSpaceEP13SkImageFilterNS_10ColorSpaceES3_
+ fun:_ZN7WebCore22SkiaImageFilterBuilder5buildERKNS_16FilterOperationsE
}
{
- bug_272179_c
- Memcheck:Param
- sendmsg(msg.msg_iov[0])
- obj:/lib/x86_64-linux-gnu/libpthread-2.15.so
- ...
- fun:_ZN7WebCore14HarfBuzzShaper19collectHarfBuzzRunsEv
+ bug_269884b
+ Memcheck:Leak
+ fun:_Znw*
+ fun:_ZN19SkPerlinNoiseShader15CreateTubulenceEffifPK7SkTSizeIiE
+ fun:_ZN7WebCore12FETurbulence12createShaderERKNS_7IntRectE
+ fun:_ZN7WebCore12FETurbulence17createImageFilterEPNS_22SkiaImageFilterBuilderE
+ fun:_ZN7WebCore22SkiaImageFilterBuilder5buildEPNS_12FilterEffectENS_10ColorSpaceE
+ fun:_ZN7WebCore22SkiaImageFilterBuilder5buildERKNS_16FilterOperationsE
}
{
- bug_272596
+ bug_270312
Memcheck:Leak
- ...
- fun:nssPKIObjectCollection_AddInstanceAsObject
- fun:nssToken_TraverseCertificates
- fun:NSSTrustDomain_TraverseCertificates
- fun:PK11_ListCerts
- fun:_ZN3net15NSSCertDatabase9ListCertsEPSt6vectorI13scoped_refptrINS_15X509CertificateEESaIS4_EE
- fun:_ZN8chromeos12_GLOBAL__N_119LoadNSSCertificatesEPSt6vectorI13scoped_refptrIN3net15X509CertificateEESaIS5_EE
+ fun:_Znw*
+ fun:_ZN14message_center22MessageCenterButtonBarC1EPNS_17MessageCenterViewEPNS_13MessageCenterEPNS_24NotifierSettingsProviderEb
+ fun:_ZN14message_center17MessageCenterViewC1EPNS_13MessageCenterEPNS_17MessageCenterTrayEibb
+ fun:_ZN14message_center21MessageCenterViewTest5SetUpEv
}
{
- bug_272083
+ bug_271431
Memcheck:Leak
fun:_Znw*
- fun:_ZN12ThemeService19SetManagedUserThemeEv
- fun:_ZN12ThemeService24OnManagedUserInitializedEv
+ fun:_ZN8autofill33TestGeneratedCreditCardBubbleView6CreateERKN4base7WeakPtrINS_35GeneratedCreditCardBubbleControllerEEE
+ fun:_ZN8autofill12_GLOBAL__N_139TestGeneratedCreditCardBubbleController12CreateBubbleEv
+ fun:_ZN8autofill35GeneratedCreditCardBubbleController4ShowEb
+ fun:_ZN8autofill35GeneratedCreditCardBubbleController12SetupAndShowERKSbItN4base20string16_char_traitsESaItEES6_
+ fun:_ZN8autofill35GeneratedCreditCardBubbleController4ShowEPN7content11WebContentsERKSbItN4base20string16_char_traitsESaItEES9_
+ fun:_ZN8autofill12_GLOBAL__N_139GeneratedCreditCardBubbleControllerTest4ShowEv
}
diff --git a/chromium/tools/valgrind/tsan/ignores_win32.txt b/chromium/tools/valgrind/tsan/ignores_win32.txt
index f38b00f4541..c6c12a55ef5 100644
--- a/chromium/tools/valgrind/tsan/ignores_win32.txt
+++ b/chromium/tools/valgrind/tsan/ignores_win32.txt
@@ -59,6 +59,3 @@ fun_r:_lock
fun_r:_flsbuf
fun_r:_unlock_file
fun_r:_getstream
-
-# http://crbug.com/272065
-obj:*NLAapi.dll
diff --git a/chromium/tools/valgrind/tsan_v2/suppressions.txt b/chromium/tools/valgrind/tsan_v2/suppressions.txt
index fbcaacb295f..2514e17c9bc 100644
--- a/chromium/tools/valgrind/tsan_v2/suppressions.txt
+++ b/chromium/tools/valgrind/tsan_v2/suppressions.txt
@@ -14,7 +14,6 @@ race:libevent/event.c
# http://crbug.com/46840
race:history::HistoryBackend::DeleteFTSIndexDatabases
-race:history::InMemoryHistoryBackend::Init
# http://crbug.com/84094
race:sqlite3StatusSet
@@ -116,6 +115,3 @@ race:gLibCleanupFunctions
# http://crbug.com/270675
race:net::RuleBasedHostResolverProc::Resolve
-
-# http://crbug.com/272095
-race:base::g_top_manager
diff --git a/chromium/ui/android/java/src/org/chromium/ui/gfx/SurfaceTextureBridge.java b/chromium/ui/android/java/src/org/chromium/ui/gfx/SurfaceTextureBridge.java
new file mode 100644
index 00000000000..2333a01bb2f
--- /dev/null
+++ b/chromium/ui/android/java/src/org/chromium/ui/gfx/SurfaceTextureBridge.java
@@ -0,0 +1,64 @@
+// 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.
+
+package org.chromium.ui.gfx;
+
+import android.graphics.SurfaceTexture;
+import android.os.Build;
+
+import org.chromium.base.CalledByNative;
+import org.chromium.base.JNINamespace;
+
+/**
+ * Wrapper class for the underlying platform's SurfaceTexture in order to
+ * provide a stable JNI API.
+ */
+@JNINamespace("gfx")
+class SurfaceTextureBridge {
+ @CalledByNative
+ private static SurfaceTexture create(int textureId) {
+ return new SurfaceTexture(textureId);
+ }
+
+ @CalledByNative
+ private static void destroy(SurfaceTexture surfaceTexture) {
+ surfaceTexture.setOnFrameAvailableListener(null);
+ surfaceTexture.release();
+ }
+
+ @CalledByNative
+ private static void setFrameAvailableCallback(SurfaceTexture surfaceTexture,
+ int nativeSurfaceTextureListener) {
+ surfaceTexture.setOnFrameAvailableListener(
+ new SurfaceTextureListener(nativeSurfaceTextureListener));
+ }
+
+ @CalledByNative
+ private static void updateTexImage(SurfaceTexture surfaceTexture) {
+ surfaceTexture.updateTexImage();
+ }
+
+ @CalledByNative
+ private static void setDefaultBufferSize(SurfaceTexture surfaceTexture, int width,
+ int height) {
+ surfaceTexture.setDefaultBufferSize(width, height);
+ }
+
+ @CalledByNative
+ private static void getTransformMatrix(SurfaceTexture surfaceTexture, float[] matrix) {
+ surfaceTexture.getTransformMatrix(matrix);
+ }
+
+ @CalledByNative
+ private static void attachToGLContext(SurfaceTexture surfaceTexture, int texName) {
+ assert Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
+ surfaceTexture.attachToGLContext(texName);
+ }
+
+ @CalledByNative
+ private static void detachFromGLContext(SurfaceTexture surfaceTexture) {
+ assert Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
+ surfaceTexture.detachFromGLContext();
+ }
+} \ No newline at end of file
diff --git a/chromium/ui/android/java/src/org/chromium/ui/gfx/SurfaceTextureListener.java b/chromium/ui/android/java/src/org/chromium/ui/gfx/SurfaceTextureListener.java
index 8efe6dd7c90..1b77370e4b6 100644
--- a/chromium/ui/android/java/src/org/chromium/ui/gfx/SurfaceTextureListener.java
+++ b/chromium/ui/android/java/src/org/chromium/ui/gfx/SurfaceTextureListener.java
@@ -6,7 +6,6 @@ package org.chromium.ui.gfx;
import android.graphics.SurfaceTexture;
-import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
/**
@@ -15,9 +14,9 @@ import org.chromium.base.JNINamespace;
@JNINamespace("gfx")
class SurfaceTextureListener implements SurfaceTexture.OnFrameAvailableListener {
// Used to determine the class instance to dispatch the native call to.
- private int mNativeSurfaceTextureListener = 0;
+ private final int mNativeSurfaceTextureListener;
- private SurfaceTextureListener(int nativeSurfaceTextureListener) {
+ SurfaceTextureListener(int nativeSurfaceTextureListener) {
assert nativeSurfaceTextureListener != 0;
mNativeSurfaceTextureListener = nativeSurfaceTextureListener;
}
@@ -36,11 +35,6 @@ class SurfaceTextureListener implements SurfaceTexture.OnFrameAvailableListener
}
}
- @CalledByNative
- private static SurfaceTextureListener create(int nativeSurfaceTextureListener) {
- return new SurfaceTextureListener(nativeSurfaceTextureListener);
- }
-
private native void nativeFrameAvailable(int nativeSurfaceTextureListener);
private native void nativeDestroy(int nativeSurfaceTextureListener);
}
diff --git a/chromium/ui/app_list/cocoa/current_user_menu_item_view.mm b/chromium/ui/app_list/cocoa/current_user_menu_item_view.mm
index 94ac0ddfa22..6aac34c6a99 100644
--- a/chromium/ui/app_list/cocoa/current_user_menu_item_view.mm
+++ b/chromium/ui/app_list/cocoa/current_user_menu_item_view.mm
@@ -16,9 +16,6 @@ namespace {
// Padding on the left of the indicator icon.
const CGFloat kMenuLeftMargin = 3;
-// Padding on the top and bottom of the menu item.
-const CGFloat kMenuTopBottomPadding = 2;
-
}
@interface CurrentUserMenuItemView ()
@@ -36,14 +33,14 @@ const CGFloat kMenuTopBottomPadding = 2;
if ((self = [super initWithFrame:NSZeroRect])) {
NSImage* userImage = ui::ResourceBundle::GetSharedInstance().
GetNativeImageNamed(IDR_APP_LIST_USER_INDICATOR).AsNSImage();
- NSRect imageRect = NSMakeRect(kMenuLeftMargin, kMenuTopBottomPadding, 0, 0);
+ NSRect imageRect = NSMakeRect(kMenuLeftMargin, 0, 0, 0);
imageRect.size = [userImage size];
base::scoped_nsobject<NSImageView> userImageView(
[[NSImageView alloc] initWithFrame:imageRect]);
[userImageView setImage:userImage];
[self addSubview:userImageView];
- NSPoint labelOrigin = NSMakePoint(NSMaxX(imageRect), kMenuTopBottomPadding);
+ NSPoint labelOrigin = NSMakePoint(NSMaxX(imageRect), 0);
NSTextField* userField =
[self addLabelWithFrame:labelOrigin
labelText:delegate->GetCurrentUserName()];
@@ -60,7 +57,7 @@ const CGFloat kMenuTopBottomPadding = 2;
labelFrame.size.width = NSWidth([userField frame]);
[self setFrameSize:NSMakeSize(
NSMaxX(labelFrame) + NSMaxX(imageRect),
- NSMaxY(labelFrame) + kMenuTopBottomPadding)];
+ NSMaxY(labelFrame))];
}
return self;
}
diff --git a/chromium/ui/aura/bench/DEPS b/chromium/ui/aura/bench/DEPS
index 1fda55436bc..69deb976808 100644
--- a/chromium/ui/aura/bench/DEPS
+++ b/chromium/ui/aura/bench/DEPS
@@ -1,5 +1,4 @@
include_rules = [
- "+cc",
"+third_party/khronos",
"+third_party/WebKit/public/platform",
]
diff --git a/chromium/ui/aura/bench/bench_main.cc b/chromium/ui/aura/bench/bench_main.cc
index 17ed068e60b..aee7e79c83a 100644
--- a/chromium/ui/aura/bench/bench_main.cc
+++ b/chromium/ui/aura/bench/bench_main.cc
@@ -10,7 +10,6 @@
#include "base/message_loop/message_loop.h"
#include "base/strings/string_split.h"
#include "base/time/time.h"
-#include "cc/output/context_provider.h"
#include "third_party/khronos/GLES2/gl2.h"
#include "third_party/skia/include/core/SkXfermode.h"
#include "ui/aura/client/default_capture_client.h"
@@ -182,7 +181,7 @@ class WebGLBench : public BenchCompositorObserver {
parent_(parent),
webgl_(ui::LAYER_TEXTURED),
compositor_(compositor),
- context_provider_(),
+ context_(),
texture_(),
fbo_(0),
do_draw_(true) {
@@ -208,26 +207,24 @@ class WebGLBench : public BenchCompositorObserver {
webgl_.SetBounds(bounds);
parent_->Add(&webgl_);
- context_provider_ = ui::ContextFactory::GetInstance()
- ->OffscreenContextProviderForMainThread();
- WebKit::WebGraphicsContext3D* context = context_provider_->Context3d();
- context->makeContextCurrent();
- texture_ = new WebGLTexture(context, bounds.size());
- fbo_ = context->createFramebuffer();
+ context_ = ui::ContextFactory::GetInstance()->CreateOffscreenContext();
+ context_->makeContextCurrent();
+ texture_ = new WebGLTexture(context_.get(), bounds.size());
+ fbo_ = context_->createFramebuffer();
compositor->AddObserver(this);
webgl_.SetExternalTexture(texture_.get());
- context->bindFramebuffer(GL_FRAMEBUFFER, fbo_);
- context->framebufferTexture2D(
+ context_->bindFramebuffer(GL_FRAMEBUFFER, fbo_);
+ context_->framebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, texture_->PrepareTexture(), 0);
- context->clearColor(0.f, 1.f, 0.f, 1.f);
- context->clear(GL_COLOR_BUFFER_BIT);
- context->flush();
+ context_->clearColor(0.f, 1.f, 0.f, 1.f);
+ context_->clear(GL_COLOR_BUFFER_BIT);
+ context_->flush();
}
virtual ~WebGLBench() {
- context_provider_->Context3d()->makeContextCurrent();
- context_provider_->Context3d()->deleteFramebuffer(fbo_);
+ context_->makeContextCurrent();
+ context_->deleteFramebuffer(fbo_);
webgl_.SetExternalTexture(NULL);
texture_ = NULL;
compositor_->RemoveObserver(this);
@@ -235,11 +232,10 @@ class WebGLBench : public BenchCompositorObserver {
virtual void Draw() OVERRIDE {
if (do_draw_) {
- WebKit::WebGraphicsContext3D* context = context_provider_->Context3d();
- context->makeContextCurrent();
- context->clearColor((frames() % kFrames)*1.0/kFrames, 1.f, 0.f, 1.f);
- context->clear(GL_COLOR_BUFFER_BIT);
- context->flush();
+ context_->makeContextCurrent();
+ context_->clearColor((frames() % kFrames)*1.0/kFrames, 1.f, 0.f, 1.f);
+ context_->clear(GL_COLOR_BUFFER_BIT);
+ context_->flush();
}
webgl_.SetExternalTexture(texture_.get());
webgl_.SchedulePaint(gfx::Rect(webgl_.bounds().size()));
@@ -250,7 +246,7 @@ class WebGLBench : public BenchCompositorObserver {
Layer* parent_;
Layer webgl_;
Compositor* compositor_;
- scoped_refptr<cc::ContextProvider> context_provider_;
+ scoped_ptr<WebGraphicsContext3D> context_;
scoped_refptr<WebGLTexture> texture_;
// The FBO that is used to render to the texture.
diff --git a/chromium/ui/aura/remote_root_window_host_win.cc b/chromium/ui/aura/remote_root_window_host_win.cc
index d4285389578..f5dc26bff55 100644
--- a/chromium/ui/aura/remote_root_window_host_win.cc
+++ b/chromium/ui/aura/remote_root_window_host_win.cc
@@ -339,6 +339,13 @@ bool RemoteRootWindowHostWin::ConfineCursorToRootWindow() {
return true;
}
+bool RemoteRootWindowHostWin::CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) {
+ NOTIMPLEMENTED();
+ return false;
+}
+
void RemoteRootWindowHostWin::UnConfineCursor() {
}
diff --git a/chromium/ui/aura/remote_root_window_host_win.h b/chromium/ui/aura/remote_root_window_host_win.h
index e2e6d1ca286..132f0f236f0 100644
--- a/chromium/ui/aura/remote_root_window_host_win.h
+++ b/chromium/ui/aura/remote_root_window_host_win.h
@@ -184,6 +184,9 @@ class AURA_EXPORT RemoteRootWindowHostWin : public RootWindowHost {
virtual void OnCursorVisibilityChanged(bool show) OVERRIDE;
virtual void MoveCursorTo(const gfx::Point& location) OVERRIDE;
virtual void SetFocusWhenShown(bool focus_when_shown) OVERRIDE;
+ virtual bool CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) OVERRIDE;
virtual void PostNativeEvent(const base::NativeEvent& native_event) OVERRIDE;
virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE;
virtual void PrepareForShutdown() OVERRIDE;
diff --git a/chromium/ui/aura/root_window.cc b/chromium/ui/aura/root_window.cc
index a638dc1bbe6..43366f001aa 100644
--- a/chromium/ui/aura/root_window.cc
+++ b/chromium/ui/aura/root_window.cc
@@ -499,6 +499,15 @@ void RootWindow::SetFocusWhenShown(bool focused) {
host_->SetFocusWhenShown(focused);
}
+bool RootWindow::CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) {
+ DCHECK(canvas);
+ DCHECK(bounds().Contains(source_bounds));
+ gfx::Rect source_pixels = ui::ConvertRectToPixel(layer(), source_bounds);
+ return host_->CopyAreaToSkCanvas(source_pixels, dest_offset, canvas);
+}
+
gfx::Point RootWindow::GetLastMouseLocationInRoot() const {
gfx::Point location = Env::GetInstance()->last_mouse_location();
client::ScreenPositionClient* client = client::GetScreenPositionClient(this);
diff --git a/chromium/ui/aura/root_window.h b/chromium/ui/aura/root_window.h
index d9055175163..e8a6b260f85 100644
--- a/chromium/ui/aura/root_window.h
+++ b/chromium/ui/aura/root_window.h
@@ -29,6 +29,8 @@
#include "ui/gfx/point.h"
#include "ui/gfx/transform.h"
+class SkCanvas;
+
namespace gfx {
class Size;
class Transform;
@@ -237,6 +239,12 @@ class AURA_EXPORT RootWindow : public ui::CompositorDelegate,
// Sets if the window should be focused when shown.
void SetFocusWhenShown(bool focus_when_shown);
+ // Copies |source_bounds| from the root window (as displayed on the host
+ // machine) to |canvas| at offset |dest_offset|.
+ bool CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas);
+
// Gets the last location seen in a mouse event in this root window's
// coordinates. This may return a point outside the root window's bounds.
gfx::Point GetLastMouseLocationInRoot() const;
diff --git a/chromium/ui/aura/root_window_host.h b/chromium/ui/aura/root_window_host.h
index f1b52041707..09e48fad817 100644
--- a/chromium/ui/aura/root_window_host.h
+++ b/chromium/ui/aura/root_window_host.h
@@ -12,6 +12,8 @@
#include "ui/base/cursor/cursor.h"
#include "ui/gfx/native_widget_types.h"
+class SkCanvas;
+
namespace gfx {
class Insets;
class Point;
@@ -97,6 +99,13 @@ class AURA_EXPORT RootWindowHost {
// Sets if the window should be focused when shown.
virtual void SetFocusWhenShown(bool focus_when_shown) = 0;
+ // Copies |source_bounds| from the root window (as displayed on the host
+ // machine) to |canvas| at offset |dest_offset|. The bounds need to be in
+ // physical pixels.
+ virtual bool CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) = 0;
+
// Posts |native_event| to the platform's event queue.
#if !defined(OS_MACOSX)
virtual void PostNativeEvent(const base::NativeEvent& native_event) = 0;
diff --git a/chromium/ui/aura/root_window_host_mac.mm b/chromium/ui/aura/root_window_host_mac.mm
index de00e9b244f..28943a958f9 100644
--- a/chromium/ui/aura/root_window_host_mac.mm
+++ b/chromium/ui/aura/root_window_host_mac.mm
@@ -46,6 +46,9 @@ class RootWindowHostMac : public RootWindowHost,
virtual void MoveCursorTo(const gfx::Point& location) OVERRIDE;
virtual bool ConfineCursorToRootWindow() OVERRIDE;
virtual void UnConfineCursor() OVERRIDE;
+ virtual bool CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) OVERRIDE;
// RootWindowHostMacDelegate:
virtual void SendEvent(const base::NativeEvent& native_event) OVERRIDE;
diff --git a/chromium/ui/aura/root_window_host_ozone.cc b/chromium/ui/aura/root_window_host_ozone.cc
index d3fe7c3865d..28c8d0c4807 100644
--- a/chromium/ui/aura/root_window_host_ozone.cc
+++ b/chromium/ui/aura/root_window_host_ozone.cc
@@ -106,6 +106,13 @@ void RootWindowHostOzone::SetFocusWhenShown(bool focus_when_shown) {
NOTIMPLEMENTED();
}
+bool RootWindowHostOzone::CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) {
+ NOTIMPLEMENTED();
+ return false;
+}
+
void RootWindowHostOzone::PostNativeEvent(
const base::NativeEvent& native_event) {
NOTIMPLEMENTED();
diff --git a/chromium/ui/aura/root_window_host_ozone.h b/chromium/ui/aura/root_window_host_ozone.h
index f510d418678..6acd1a2c0ce 100644
--- a/chromium/ui/aura/root_window_host_ozone.h
+++ b/chromium/ui/aura/root_window_host_ozone.h
@@ -46,6 +46,9 @@ class RootWindowHostOzone : public RootWindowHost,
virtual void OnCursorVisibilityChanged(bool show) OVERRIDE;
virtual void MoveCursorTo(const gfx::Point& location) OVERRIDE;
virtual void SetFocusWhenShown(bool focus_when_shown) OVERRIDE;
+ virtual bool CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) OVERRIDE;
virtual void PostNativeEvent(const base::NativeEvent& event) OVERRIDE;
virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE;
virtual void PrepareForShutdown() OVERRIDE;
diff --git a/chromium/ui/aura/root_window_host_win.cc b/chromium/ui/aura/root_window_host_win.cc
index 723de57fe0a..5c67b776d07 100644
--- a/chromium/ui/aura/root_window_host_win.cc
+++ b/chromium/ui/aura/root_window_host_win.cc
@@ -210,6 +210,13 @@ bool RootWindowHostWin::ConfineCursorToRootWindow() {
return ClipCursor(&window_rect) != 0;
}
+bool RootWindowHostWin::CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) {
+ NOTIMPLEMENTED();
+ return false;
+}
+
void RootWindowHostWin::UnConfineCursor() {
ClipCursor(NULL);
}
diff --git a/chromium/ui/aura/root_window_host_win.h b/chromium/ui/aura/root_window_host_win.h
index e2a60ddf738..491ab903445 100644
--- a/chromium/ui/aura/root_window_host_win.h
+++ b/chromium/ui/aura/root_window_host_win.h
@@ -37,6 +37,9 @@ class RootWindowHostWin : public RootWindowHost, public ui::WindowImpl {
virtual void OnCursorVisibilityChanged(bool show) OVERRIDE;
virtual void MoveCursorTo(const gfx::Point& location) OVERRIDE;
virtual void SetFocusWhenShown(bool focus_when_shown) OVERRIDE;
+ virtual bool CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) OVERRIDE;
virtual void PostNativeEvent(const base::NativeEvent& native_event) OVERRIDE;
virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE;
virtual void PrepareForShutdown() OVERRIDE;
diff --git a/chromium/ui/aura/root_window_host_x11.cc b/chromium/ui/aura/root_window_host_x11.cc
index 783e960095d..f69a54a8898 100644
--- a/chromium/ui/aura/root_window_host_x11.cc
+++ b/chromium/ui/aura/root_window_host_x11.cc
@@ -25,6 +25,9 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkPostConfig.h"
#include "ui/aura/client/capture_client.h"
#include "ui/aura/client/cursor_client.h"
#include "ui/aura/client/screen_position_client.h"
@@ -42,6 +45,7 @@
#include "ui/base/x/x11_util.h"
#include "ui/compositor/dip_util.h"
#include "ui/compositor/layer.h"
+#include "ui/gfx/codec/png_codec.h"
#include "ui/gfx/screen.h"
#if defined(OS_CHROMEOS)
@@ -815,6 +819,51 @@ void RootWindowHostX11::SetFocusWhenShown(bool focus_when_shown) {
}
}
+bool RootWindowHostX11::CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) {
+ ui::XScopedImage scoped_image(
+ XGetImage(xdisplay_, xwindow_,
+ source_bounds.x(), source_bounds.y(),
+ source_bounds.width(), source_bounds.height(),
+ AllPlanes, ZPixmap));
+ XImage* image = scoped_image.get();
+ if (!image) {
+ LOG(ERROR) << "XGetImage failed";
+ return false;
+ }
+
+ if (image->bits_per_pixel == 32) {
+ if ((0xff << SK_R32_SHIFT) != image->red_mask ||
+ (0xff << SK_G32_SHIFT) != image->green_mask ||
+ (0xff << SK_B32_SHIFT) != image->blue_mask) {
+ LOG(WARNING) << "XImage and Skia byte orders differ";
+ return false;
+ }
+
+ // Set the alpha channel before copying to the canvas. Otherwise, areas of
+ // the framebuffer that were cleared by ply-image rather than being obscured
+ // by an image during boot may end up transparent.
+ // TODO(derat|marcheu): Remove this if/when ply-image has been updated to
+ // set the framebuffer's alpha channel regardless of whether the device
+ // claims to support alpha or not.
+ for (int i = 0; i < image->width * image->height * 4; i += 4)
+ image->data[i + 3] = 0xff;
+
+ SkBitmap bitmap;
+ bitmap.setConfig(SkBitmap::kARGB_8888_Config,
+ image->width, image->height,
+ image->bytes_per_line);
+ bitmap.setPixels(image->data);
+ canvas->drawBitmap(bitmap, SkIntToScalar(0), SkIntToScalar(0), NULL);
+ } else {
+ NOTIMPLEMENTED() << "Unsupported bits-per-pixel " << image->bits_per_pixel;
+ return false;
+ }
+
+ return true;
+}
+
void RootWindowHostX11::PostNativeEvent(
const base::NativeEvent& native_event) {
DCHECK(xwindow_);
diff --git a/chromium/ui/aura/root_window_host_x11.h b/chromium/ui/aura/root_window_host_x11.h
index ac9cc74933e..c38002dda07 100644
--- a/chromium/ui/aura/root_window_host_x11.h
+++ b/chromium/ui/aura/root_window_host_x11.h
@@ -63,6 +63,9 @@ class RootWindowHostX11 : public RootWindowHost,
virtual void OnCursorVisibilityChanged(bool show) OVERRIDE;
virtual void MoveCursorTo(const gfx::Point& location) OVERRIDE;
virtual void SetFocusWhenShown(bool focus_when_shown) OVERRIDE;
+ virtual bool CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) OVERRIDE;
virtual void PostNativeEvent(const base::NativeEvent& event) OVERRIDE;
virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE;
virtual void PrepareForShutdown() OVERRIDE;
diff --git a/chromium/ui/base/accessibility/accessible_view_state.h b/chromium/ui/base/accessibility/accessible_view_state.h
index 18090255c09..8e835ec2c63 100644
--- a/chromium/ui/base/accessibility/accessible_view_state.h
+++ b/chromium/ui/base/accessibility/accessible_view_state.h
@@ -6,6 +6,7 @@
#define UI_BASE_ACCESSIBILITY_ACCESSIBLE_VIEW_STATE_H_
#include "base/basictypes.h"
+#include "base/callback.h"
#include "base/strings/string16.h"
#include "ui/base/accessibility/accessibility_types.h"
#include "ui/base/ui_export.h"
@@ -54,6 +55,17 @@ struct UI_EXPORT AccessibleViewState {
// index and count should be -1 otherwise.
int index;
int count;
+
+ // An optional callback that can be used by accessibility clients to
+ // set the string value of this view. This only applies to roles where
+ // setting the value makes sense, like a text box. Not often used by
+ // screen readers, but often used by automation software to script
+ // things like logging into portals or filling forms.
+ //
+ // This callback is only valid for the lifetime of the view, and should
+ // be a safe no-op if the view is deleted. Typically, accessible views
+ // should use a WeakPtr when binding the callback.
+ base::Callback<void(const base::string16&)> set_value_callback;
};
} // namespace ui
diff --git a/chromium/ui/base/clipboard/clipboard_android.cc b/chromium/ui/base/clipboard/clipboard_android.cc
index 0204c1b619b..4eb052acf7a 100644
--- a/chromium/ui/base/clipboard/clipboard_android.cc
+++ b/chromium/ui/base/clipboard/clipboard_android.cc
@@ -28,6 +28,7 @@
using base::android::AttachCurrentThread;
using base::android::ClearException;
using base::android::ConvertJavaStringToUTF8;
+using base::android::ConvertUTF8ToJavaString;
using base::android::ScopedJavaGlobalRef;
using base::android::ScopedJavaLocalRef;
@@ -96,8 +97,8 @@ void ClipboardMap::Set(const std::string& format, const std::string& data) {
map_[format] = data;
if (format == kPlainTextFormat) {
- ScopedJavaLocalRef<jstring> str(
- env, env->NewStringUTF(data.c_str()));
+ ScopedJavaLocalRef<jstring> str = ConvertUTF8ToJavaString(
+ env, data.c_str());
DCHECK(str.obj() && !ClearException(env));
Java_Clipboard_setText(env, clipboard_manager_.obj(), str.obj());
}
diff --git a/chromium/ui/base/clipboard/clipboard_unittest.cc b/chromium/ui/base/clipboard/clipboard_unittest.cc
index f131e0ea381..6e7ad4cafb8 100644
--- a/chromium/ui/base/clipboard/clipboard_unittest.cc
+++ b/chromium/ui/base/clipboard/clipboard_unittest.cc
@@ -25,6 +25,7 @@
#if defined(OS_ANDROID)
#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
#endif
namespace ui {
@@ -643,6 +644,7 @@ TEST_F(ClipboardTest, InternalClipboardInvalidation) {
// Simulate that another application copied something in the Clipboard
//
std::string new_value("Some text copied by some other app");
+ using base::android::ConvertUTF8ToJavaString;
using base::android::MethodID;
using base::android::ScopedJavaLocalRef;
@@ -660,7 +662,8 @@ TEST_F(ClipboardTest, InternalClipboardInvalidation) {
"(Ljava/lang/String;)Ljava/lang/Object;");
// Retrieve the system service.
- ScopedJavaLocalRef<jstring> service_name(env, env->NewStringUTF("clipboard"));
+ ScopedJavaLocalRef<jstring> service_name = ConvertUTF8ToJavaString(
+ env, "clipboard");
ScopedJavaLocalRef<jobject> clipboard_manager(
env, env->CallObjectMethod(
context, get_system_service, service_name.obj()));
@@ -670,11 +673,13 @@ TEST_F(ClipboardTest, InternalClipboardInvalidation) {
base::android::GetClass(env, "android/text/ClipboardManager");
jmethodID set_text = MethodID::Get<MethodID::TYPE_INSTANCE>(
env, clipboard_class.obj(), "setText", "(Ljava/lang/CharSequence;)V");
+ ScopedJavaLocalRef<jstring> new_value_string = ConvertUTF8ToJavaString(
+ env, new_value.c_str());
// Will need to call toString as CharSequence is not always a String.
env->CallVoidMethod(clipboard_manager.obj(),
set_text,
- env->NewStringUTF(new_value.c_str()));
+ new_value_string.obj());
// The bitmap that should have been available should be gone.
EXPECT_FALSE(clipboard().IsFormatAvailable(Clipboard::GetBitmapFormatType(),
diff --git a/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc b/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc
index c937b760daa..69203f034d8 100644
--- a/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc
+++ b/chromium/ui/base/dragdrop/os_exchange_data_provider_win.cc
@@ -859,9 +859,10 @@ ULONG DataObjectImpl::Release() {
static STGMEDIUM* GetStorageForBytes(const void* data, size_t bytes) {
HANDLE handle = GlobalAlloc(GPTR, static_cast<int>(bytes));
- base::win::ScopedHGlobal<uint8> scoped(handle);
- size_t allocated = static_cast<size_t>(GlobalSize(handle));
- memcpy(scoped.get(), data, allocated);
+ if (handle) {
+ base::win::ScopedHGlobal<uint8> scoped(handle);
+ memcpy(scoped.get(), data, bytes);
+ }
STGMEDIUM* storage = new STGMEDIUM;
storage->hGlobal = handle;
diff --git a/chromium/ui/base/ime/input_method_ibus.cc b/chromium/ui/base/ime/input_method_ibus.cc
index 70b05f0f3e5..7c4f803d445 100644
--- a/chromium/ui/base/ime/input_method_ibus.cc
+++ b/chromium/ui/base/ime/input_method_ibus.cc
@@ -656,12 +656,6 @@ bool InputMethodIBus::HasInputMethodResult() const {
return result_text_.length() || composition_changed_;
}
-void InputMethodIBus::SendFakeProcessKeyEvent(bool pressed) const {
- DispatchFabricatedKeyEventPostIME(pressed ? ET_KEY_PRESSED : ET_KEY_RELEASED,
- VKEY_PROCESSKEY,
- 0);
-}
-
void InputMethodIBus::AbandonAllPendingKeyEvents() {
pending_key_events_.clear();
}
@@ -687,9 +681,7 @@ void InputMethodIBus::CommitText(const chromeos::IBusText& text) {
// If we are not handling key event, do not bother sending text result if the
// focused text input client does not support text input.
if (pending_key_events_.empty() && !IsTextInputTypeNone()) {
- SendFakeProcessKeyEvent(true);
GetTextInputClient()->InsertText(utf16_text);
- SendFakeProcessKeyEvent(false);
result_text_.clear();
}
}
@@ -754,9 +746,7 @@ void InputMethodIBus::UpdatePreeditText(const chromeos::IBusText& text,
// If we receive a composition text without pending key event, then we need to
// send it to the focused text input client directly.
if (pending_key_events_.empty()) {
- SendFakeProcessKeyEvent(true);
GetTextInputClient()->SetCompositionText(composition_);
- SendFakeProcessKeyEvent(false);
composition_changed_ = false;
composition_.Clear();
}
diff --git a/chromium/ui/base/ime/input_method_ibus.h b/chromium/ui/base/ime/input_method_ibus.h
index 858052877a5..bc6aa6ec83c 100644
--- a/chromium/ui/base/ime/input_method_ibus.h
+++ b/chromium/ui/base/ime/input_method_ibus.h
@@ -138,10 +138,6 @@ class UI_EXPORT InputMethodIBus
// Checks if there is pending input method result.
bool HasInputMethodResult() const;
- // Fabricates a key event with VKEY_PROCESSKEY key code and dispatches it to
- // the focused View.
- void SendFakeProcessKeyEvent(bool pressed) const;
-
// Abandons all pending key events. It usually happends when we lose keyboard
// focus, the text input type is changed or we are destroyed.
void AbandonAllPendingKeyEvents();
diff --git a/chromium/ui/base/ime/input_method_win.cc b/chromium/ui/base/ime/input_method_win.cc
index 21c3d061311..4e3df395de4 100644
--- a/chromium/ui/base/ime/input_method_win.cc
+++ b/chromium/ui/base/ime/input_method_win.cc
@@ -148,10 +148,6 @@ LRESULT InputMethodWin::OnChar(HWND window_handle,
if (GetTextInputClient()) {
GetTextInputClient()->InsertChar(static_cast<char16>(wparam),
ui::GetModifiersFromKeyState());
-
- // If Windows sends a WM_CHAR, then any previously sent WM_DEADCHARs (which
- // are displayed as the composition text) should be cleared.
- GetTextInputClient()->ClearCompositionText();
}
// Explicitly show the system menu at a good location on [Alt]+[Space].
diff --git a/chromium/ui/base/resource/resource_bundle.cc b/chromium/ui/base/resource/resource_bundle.cc
index 893d5f43198..70623c29bc2 100644
--- a/chromium/ui/base/resource/resource_bundle.cc
+++ b/chromium/ui/base/resource/resource_bundle.cc
@@ -321,7 +321,7 @@ gfx::Image& ResourceBundle::GetImageNamed(int resource_id) {
image = delegate_->GetImageNamed(resource_id);
if (image.IsEmpty()) {
- DCHECK(!data_packs_.empty()) <<
+ DCHECK(!delegate_ && !data_packs_.empty()) <<
"Missing call to SetResourcesDataDLL?";
// TODO(oshima): Consider reading the image size from png IHDR chunk and
diff --git a/chromium/ui/base/strings/ui_strings_am.xtb b/chromium/ui/base/strings/ui_strings_am.xtb
index d4f225a3ab2..d3576a6c805 100644
--- a/chromium/ui/base/strings/ui_strings_am.xtb
+++ b/chromium/ui/base/strings/ui_strings_am.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">ጨርስ</translation>
+<translation id="5341849548509163798">ከ<ph name="NUMBER_MANY"/> ሰዓቶች በፊት</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> ሰከንድ ይቀራል</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> ሰከንድ ይቀራል</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> ደቂቃ ይቀራል</translation>
<translation id="1801827354178857021">ነቁጥ</translation>
<translation id="1190609913194133056">የማሳወቂያ ማዕከል</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> ደቂቃዎች ቀርተዋል</translation>
<translation id="5613020302032141669">ግራ ቀስት</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> ፋይል(.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918">ከ<ph name="NUMBER_ZERO"/> ደቂቃ በፊት</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> ሰከንድ</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> ሰዓቶች ይቀራሉ</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">ሰርዝ</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> ባ</translation>
<translation id="3660179305079774227">የላይ ቀስት</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> ሜባ/ሰ</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ሰዓት</translation>
<translation id="3990502903496589789">የቀኝ ጠርዝ</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> ደቂቃ</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> ቀናት ይቀራሉ</translation>
<translation id="932327136139879170">መነሻ</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> ደቂቃ ይቀራል</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> ቀናት ይቀራሉ</translation>
+<translation id="6390842777729054533">ከ<ph name="NUMBER_ZERO"/> ሰከንድ በፊት</translation>
<translation id="3909791450649380159">&amp;ቁረጥ</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> ደቂቃዎች ቀርተዋል</translation>
<translation id="688711909580084195">ርዕስ-አልባ ድረ-ገጽ</translation>
+<translation id="3353284378027041011">ከ<ph name="NUMBER_FEW"/> ቀናት በፊት</translation>
<translation id="5076340679995252485">&amp;ለጥፍ</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> ቴባ</translation>
+<translation id="364720409959344976">የሚሰቀል ዓቃፊ ይምረጡ</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016">ከ<ph name="NUMBER_TWO"/> ደቂቃ በፊት</translation>
<translation id="3234408098842461169">ዝቅዝቅ ቀስት</translation>
<translation id="3087734570205094154">ግርጌ</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> ደቂቃ ይቀራል</translation>
<translation id="1860796786778352021">ማሳወቂያ ዝጋ</translation>
<translation id="6364916375976753737">ወደ ግራ ሸብልል</translation>
+<translation id="2629089419211541119">ከ<ph name="NUMBER_ONE"/> ሰዓት በፊት</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="6719684875142564568"><ph name="NUMBER_ZERO"/> ሰዓት</translation>
+<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> ደቂቃ ቀርቷል</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> ደቂቃ</translation>
<translation id="8210608804940886430">ወደታች አንቀሳቅስ</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ቀናት</translation>
+<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ሰዓቶች ይቀራሉ</translation>
<translation id="5329858601952122676">&amp;ሠርዝ</translation>
+<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> ሰከንድ</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> ኪባ</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> ደቂቃዎች</translation>
+<translation id="7275974018215686543">ከ<ph name="NUMBER_MANY"/> ሰከንድ በፊት</translation>
+<translation id="7781829728241885113">ትናንት</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> ደቂቃዎች</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> ደቂቃ ይቀራል</translation>
<translation id="6659594942844771486">ትር</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> ሜባ</translation>
+<translation id="4988273303304146523">ከ<ph name="NUMBER_DEFAULT"/> ቀን በፊት</translation>
<translation id="8428213095426709021">ቅንብሮች</translation>
<translation id="2497284189126895209">ሁሉም ፋይሎች</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> ደቂቃዎች ቀርተዋል</translation>
+<translation id="5110450810124758964">ከ<ph name="NUMBER_ONE"/> ቀን በፊት</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> ሰከንድ</translation>
<translation id="7814458197256864873">&amp;ቅዳ</translation>
<translation id="3889424535448813030">ቀኝ ቀስት</translation>
+<translation id="4229495110203539533">ከ<ph name="NUMBER_ONE"/> ሰከንድ በፊት</translation>
+<translation id="2544782972264605588">ከ<ph name="NUMBER_DEFAULT"/> ሰከንድ በፊት</translation>
<translation id="6829324100069873704">ወደ ማሳወቂያዎች ተመለስ።</translation>
<translation id="6528179044667508675">አትረብሽ</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> ሰከንዶች</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> ደቂቃ</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> ሰዓት ይቀራል</translation>
<translation id="7135556860107312402">ማሳወቂያዎች ከሚከተሉት እንዲመጡ ፍቀድ፦</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> ደቂቃ</translation>
+<translation id="8448317557906454022">ከ<ph name="NUMBER_ZERO"/> ሰከንድ በፊት</translation>
<translation id="4927753642311223124">እዚህ ምንም የሚታይ ነገር የለም፣ ይቀጥሉ።</translation>
<translation id="2482878487686419369">ማስታወቂያዎች</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> ቀን</translation>
<translation id="3183922693828471536">ወደ እዚህ ሸብልል</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ሰዓቶች</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> ኪባ/ሰ</translation>
+<translation id="2148716181193084225">ዛሬ</translation>
<translation id="7960078400008666149">ለአንድ ሰዓት አትረብሽ</translation>
+<translation id="4373894838514502496">ከ<ph name="NUMBER_FEW"/> ደቂቃ በፊት</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> ቀናት</translation>
<translation id="2190355936436201913">(ባዶ)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> ሰዓት ይቀራል</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> ሰከንድ ይቀራል</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">ወደ ቀኝ ሸብልል</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ሰዓት ይቀራል</translation>
<translation id="2666092431469916601">ላይ</translation>
<translation id="8331626408530291785">ወደ ላይ ሸብልል</translation>
<translation id="4773379706300191099">የ<ph name="EXTENSION_NAME"/> ማሳወቂያዎችን አሰናክል</translation>
<translation id="7907591526440419938">ፋይል ክፈት</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> ቀን ይቀራል</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">ከ<ph name="NUMBER_DEFAULT"/> ሰዓት በፊት</translation>
<translation id="815598010540052116">ወደ ታች ሸብልል</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> ደቂቃ ይቀራል</translation>
<translation id="3157931365184549694">እነበረበት መልስ</translation>
+<translation id="1243314992276662751">ስቀል</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> ቀን ይቀራል</translation>
<translation id="8179976553408161302">አስገባ</translation>
<translation id="945522503751344254">ግብረ መልስ ላክ</translation>
<translation id="9170848237812810038">&amp;ቀልብስ</translation>
+<translation id="1285266685456062655">ከ<ph name="NUMBER_FEW"/> ሰዓቶች በፊት</translation>
+<translation id="6918245111648057970">ከሚከተሉት ውስጥ ለእያንዳንዱ ተጠቃሚ ማሳወቂያዎችን ይፍቀዱ፦</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> ሰከንድ</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> ደቂቃዎች ቀርተዋል</translation>
+<translation id="6358975074282722691">ከ<ph name="NUMBER_TWO"/> ሰከንድ በፊት</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> ፔታ</translation>
<translation id="2983818520079887040">ቅንብሮች ...</translation>
<translation id="6845383723252244143">አቃፊ ምረጥ</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> ሰከንዶች</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> ሰከንድ</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534">ከ<ph name="NUMBER_MANY"/> ቀናት በፊት</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> ቀናት</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> ሰዓት</translation>
+<translation id="2679312662830811292">ከ<ph name="NUMBER_ONE"/> ደቂቃ በፊት</translation>
+<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="9098468523912235228">ከ<ph name="NUMBER_DEFAULT"/> ሰከንድ በፊት</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> ሰከንድ ይቀራል</translation>
<translation id="4570886800634958009">ማሳወቂያ ዘርጋ</translation>
<translation id="436869212180315161">ተጫን</translation>
+<translation id="4860787810836767172">ከ<ph name="NUMBER_FEW"/> ሰከንድ በፊት</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> ቴባ/ሰ</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> ደቂቃዎች</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> ደቂቃዎች ቀርተዋል</translation>
<translation id="6040143037577758943">ዝጋ</translation>
+<translation id="1101671447232096497">ከ<ph name="NUMBER_MANY"/> ደቂቃ በፊት</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> ባ/ሰ</translation>
<translation id="7649070708921625228">እገዛ</translation>
<translation id="8226233771743600312">ለአንድ ቀን አትረብሽ</translation>
<translation id="7457942297256758195">ሁሉንም አጽዳ</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - ማሳወቂያዎች</translation>
+<translation id="822618367988303761">ከ<ph name="NUMBER_TWO"/> ቀናት በፊት</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> ደቂቃ</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> ቀን ይቀራል</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> ደቂቃዎች</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> ሰዓቶች ይቀራሉ</translation>
+<translation id="8959208747503200525">ከ<ph name="NUMBER_TWO"/> ሰዓቶች በፊት</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> ሰከንድ</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> ሰከንድ</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> ሰከንዶች</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> ቀን ይቀራል</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> ፔባ/ሰ</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - ማሳወቂያዎች (<ph name="QUANTITY"/> ያልተነበቡ)</translation>
<translation id="6965382102122355670">ይሁን</translation>
<translation id="7850320739366109486">አትረብሽ</translation>
+<translation id="6978839998405419496">ከ<ph name="NUMBER_ZERO"/> ቀን በፊት</translation>
<translation id="5941711191222866238">አሳንስ</translation>
<translation id="6394627529324717982">ኮማ</translation>
<translation id="4469842253116033348">ማስታወቂያዎችን ከ<ph name="SITE"/> አሰናክል</translation>
<translation id="3036649622769666520">ፋይሎች ክፈት</translation>
<translation id="8328145009876646418">የግራ ጠርዝ</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> ሰከንዶች</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_ar.xtb b/chromium/ui/base/strings/ui_strings_ar.xtb
index c10130a3c45..d9769f3f4bb 100644
--- a/chromium/ui/base/strings/ui_strings_ar.xtb
+++ b/chromium/ui/base/strings/ui_strings_ar.xtb
@@ -1,92 +1,185 @@
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="ar">
-<translation id="4820616160060340806">المفتاح Command+<ph name="KEY_COMBO_NAME"/></translation>
-<translation id="1871244248791675517">مفتاح Ins</translation>
-<translation id="6135826906199951471">مفتاح Del (حذف)</translation>
-<translation id="528468243742722775">مفتاح End</translation>
+<translation id="4820616160060340806">‏المفتاح Command+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="1871244248791675517">‏مفتاح Ins</translation>
+<translation id="6135826906199951471">‏مفتاح Del (حذف)</translation>
+<translation id="528468243742722775">‏مفتاح End</translation>
+<translation id="5341849548509163798">قبل <ph name="NUMBER_MANY"/> ساعة</translation>
+<translation id="6310545596129886942">عدد الثواني المتبقية <ph name="NUMBER_FEW"/></translation>
+<translation id="9213479837033539041">عدد الثواني المتبقية: <ph name="NUMBER_MANY"/></translation>
+<translation id="1209866192426315618">عدد الدقائق المتبقية: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="1801827354178857021">نقطة</translation>
<translation id="1190609913194133056">مركز الإشعارات</translation>
+<translation id="7470933019269157899">عدد الدقائق المتبقية: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="5613020302032141669">مفتاح سهم إلى اليسار</translation>
<translation id="8602707065186045623">ملف <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918">قبل <ph name="NUMBER_ZERO"/> دقيقة</translation>
+<translation id="7121570032414343252">عدد الثواني: <ph name="NUMBER_TWO"/></translation>
+<translation id="7511635910912978956">عدد الساعات المتبقية: <ph name="NUMBER_FEW"/></translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">إلغاء</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> بايت</translation>
<translation id="3660179305079774227">مفتاح سهم إلى أعلى</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> ميغابايات/ثانية</translation>
+<translation id="5608669887400696928">عدد الساعات: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="3990502903496589789">الحافة اليسرى</translation>
+<translation id="8507996248087185956">عدد الدقائق: <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="3520476450377425184">عدد الأيام المتبقيّة <ph name="NUMBER_MANY"/></translation>
<translation id="932327136139879170">الصفحة الرئيسية</translation>
+<translation id="5600907569873192868">عدد الدقائق المتبقية: <ph name="NUMBER_MANY"/></translation>
+<translation id="8666066831007952346">عدد الأيام المتبقية <ph name="NUMBER_TWO"/></translation>
+<translation id="6390842777729054533">عدد الثواني المتبقية: <ph name="NUMBER_ZERO"/></translation>
<translation id="3909791450649380159">&amp;قص</translation>
+<translation id="2560788951337264832">عدد الدقائق المتبقية: <ph name="NUMBER_ZERO"/></translation>
<translation id="688711909580084195">صفحة ويب بدون عنوان</translation>
+<translation id="3353284378027041011">قبل <ph name="NUMBER_FEW"/> يوم</translation>
<translation id="5076340679995252485">ل&amp;صق</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> تيرابايت</translation>
+<translation id="364720409959344976">حدد مجلدًا للتحميل</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016">قبل <ph name="NUMBER_TWO"/> دقيقة</translation>
<translation id="3234408098842461169">مفتاح سهم إلى أسفل</translation>
<translation id="3087734570205094154">أسفل</translation>
+<translation id="5935630983280450497">عدد الدقائق المتبقية: <ph name="NUMBER_ONE"/></translation>
<translation id="1860796786778352021">إغلاق الإشعار</translation>
<translation id="6364916375976753737">التمرير إلى اليمين</translation>
+<translation id="2629089419211541119">قبل <ph name="NUMBER_ONE"/> ساعة</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="6719684875142564568"><ph name="NUMBER_ZERO"/> ساعة</translation>
+<translation id="7836361698254323868">عدد الدقائق المتبقية: <ph name="NUMBER_ONE"/></translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> دقيقة</translation>
<translation id="8210608804940886430">صفحة إلى أسفل</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> يومًا</translation>
+<translation id="7163503212501929773">عدد الساعات المتبقية: <ph name="NUMBER_MANY"/></translation>
<translation id="5329858601952122676">&amp;حذف</translation>
+<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> ثانية</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> كيلوبايت</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> دقيقة</translation>
+<translation id="7275974018215686543">قبل <ph name="NUMBER_MANY"/> ثانية</translation>
+<translation id="7781829728241885113">أمس</translation>
+<translation id="3424538384153559412">دقيقتان (<ph name="NUMBER_TWO"/>)</translation>
+<translation id="50960180632766478">عدد الدقائق المتبقية: <ph name="NUMBER_FEW"/></translation>
<translation id="6659594942844771486">علامة تبويب</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> ميغابايت</translation>
+<translation id="4988273303304146523">قبل <ph name="NUMBER_DEFAULT"/> يوم</translation>
<translation id="8428213095426709021">الإعدادات</translation>
<translation id="2497284189126895209">الملفّات كلّها</translation>
+<translation id="7487278341251176613">عدد الدقائق المتبقية: <ph name="NUMBER_TWO"/></translation>
+<translation id="5110450810124758964">قبل <ph name="NUMBER_ONE"/> يوم</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> ثانية</translation>
<translation id="7814458197256864873">&amp;نسخ</translation>
<translation id="3889424535448813030">مفتاح سهم إلى اليمين</translation>
+<translation id="4229495110203539533">قبل <ph name="NUMBER_ONE"/> ثانية</translation>
+<translation id="2544782972264605588">عدد الثواني المتبقية: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="6829324100069873704">الرجوع إلى الإشعارات</translation>
<translation id="6528179044667508675">الرجاء عدم الإزعاج</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> ثانية</translation>
+<translation id="290555789621781773">عدد الدقائق: <ph name="NUMBER_TWO"/></translation>
+<translation id="5149131957118398098">متبقٍ <ph name="NUMBER_ZERO"/> ساعة</translation>
<translation id="7135556860107312402">السماح بالإشعارات من الجهات التالية:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> دقيقة واحدة</translation>
+<translation id="8448317557906454022">قبل <ph name="NUMBER_ZERO"/> ثانية</translation>
<translation id="4927753642311223124">ليس هناك شيء تراه هنا، انتقل إلى مكان آخر.</translation>
<translation id="2482878487686419369">التنبيهات</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> يوم</translation>
<translation id="3183922693828471536">التمرير إلى هنا</translation>
-<translation id="4552416320897244156">مفتاح PgDwn (صفحة إلى أسفل)</translation>
+<translation id="4552416320897244156">‏مفتاح PgDwn (صفحة إلى أسفل)</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ساعة</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> كيلوبايت/ثانية</translation>
+<translation id="2148716181193084225">اليوم</translation>
<translation id="7960078400008666149">الرجاء عدم الإزعاج لمدة ساعة واحدة</translation>
+<translation id="4373894838514502496">قبل <ph name="NUMBER_FEW"/> دقيقة</translation>
+<translation id="4115153316875436289">عدد الأيام: <ph name="NUMBER_TWO"/></translation>
<translation id="2190355936436201913">(فارغ)</translation>
-<translation id="8447116497070723931">مفتاح PgUp (صفحة إلى أعلى)</translation>
+<translation id="1164369517022005061">عدد الساعات المتبقية: <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="152482086482215392">عدد الثواني المتبقية: <ph name="NUMBER_ONE"/></translation>
+<translation id="8447116497070723931">‏مفتاح PgUp (صفحة إلى أعلى)</translation>
<translation id="4588090240171750605">التمرير إلى اليسار</translation>
+<translation id="7414887922320653780">عدد الساعات المتبقية: <ph name="NUMBER_ONE"/></translation>
<translation id="2666092431469916601">أعلى</translation>
<translation id="8331626408530291785">التمرير إلى أعلى</translation>
<translation id="4773379706300191099">تعطيل الإشعارات من <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">فتح ملف</translation>
+<translation id="2864069933652346933">متبقٍ <ph name="NUMBER_ZERO"/> يوم</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">قبل <ph name="NUMBER_DEFAULT"/> ساعة</translation>
<translation id="815598010540052116">التمرير إلى أسفل</translation>
+<translation id="1308727876662951186">متبقٍ <ph name="NUMBER_ZERO"/> دقيقة</translation>
<translation id="3157931365184549694">استعادة</translation>
+<translation id="1243314992276662751">تحميل</translation>
+<translation id="50030952220075532">عدد الأيام المتبقية <ph name="NUMBER_ONE"/></translation>
<translation id="8179976553408161302">تفضل</translation>
<translation id="945522503751344254">إرسال تعليقات</translation>
<translation id="9170848237812810038">&amp;إلغاء</translation>
+<translation id="1285266685456062655">قبل <ph name="NUMBER_FEW"/> ساعة</translation>
+<translation id="6918245111648057970">السماح بإشعارات مما يلي لكل مستخدم:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> ثانية واحدة</translation>
+<translation id="3994835489895548312">عدد الدقائق المتبقية: <ph name="NUMBER_MANY"/></translation>
+<translation id="6358975074282722691">قبل <ph name="NUMBER_TWO"/> ثانية</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> بيتابايت</translation>
<translation id="2983818520079887040">الإعدادات...</translation>
<translation id="6845383723252244143">تحديد مجلد</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> ثوانٍ</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> ثوانٍ</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534">قبل <ph name="NUMBER_MANY"/> يوم</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> أيام</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> ساعة</translation>
+<translation id="2679312662830811292">قبل <ph name="NUMBER_ONE"/> دقيقة</translation>
+<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="9098468523912235228">قبل <ph name="NUMBER_DEFAULT"/> ثانية</translation>
+<translation id="494645311413743213">عدد الثواني المتبقية: <ph name="NUMBER_TWO"/></translation>
<translation id="4570886800634958009">توسيع الإشعار</translation>
<translation id="436869212180315161">اضغط</translation>
+<translation id="4860787810836767172">قبل <ph name="NUMBER_FEW"/> ثانية</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> تيرابايت/ثانية</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> بلا دقائق</translation>
+<translation id="1858722859751911017">عدد الدقائق المتبقية: <ph name="NUMBER_FEW"/></translation>
<translation id="6040143037577758943">إغلاق</translation>
+<translation id="1101671447232096497">قبل <ph name="NUMBER_MANY"/> دقيقة</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> بايت/ثانية</translation>
<translation id="7649070708921625228">مساعدة</translation>
<translation id="8226233771743600312">الرجاء عدم الإزعاج لمدة يوم واحد</translation>
<translation id="7457942297256758195">محو الكل</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - الإشعارات</translation>
+<translation id="822618367988303761">قبل <ph name="NUMBER_TWO"/> يوم</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> دقيقة</translation>
+<translation id="1963692530539281474">عدد الأيام المتبقية <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> دقائق</translation>
+<translation id="5906719743126878045">عدد الساعات المتبقية: <ph name="NUMBER_TWO"/></translation>
+<translation id="8959208747503200525">قبل <ph name="NUMBER_TWO"/> ساعة</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> من الثواني</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> ثانية</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> ثانية</translation>
+<translation id="3759876923365568382">عدد الأيام المتبقية <ph name="NUMBER_FEW"/></translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> بيتابايت/ثانية</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - الإشعارات (<ph name="QUANTITY"/> من الإشعارات غير المقروءة)</translation>
<translation id="6965382102122355670">موافق</translation>
<translation id="7850320739366109486">الرجاء عدم الإزعاج</translation>
+<translation id="6978839998405419496">قبل <ph name="NUMBER_ZERO"/> يوم</translation>
<translation id="5941711191222866238">تصغير</translation>
<translation id="6394627529324717982">فاصلة</translation>
<translation id="4469842253116033348">تعطيل التنبيهات من الموقع <ph name="SITE"/></translation>
<translation id="3036649622769666520">فتح الملفات</translation>
<translation id="8328145009876646418">الحافة اليمنى</translation>
+<translation id="7372005818821648611">ثانيتان (<ph name="NUMBER_TWO"/>)</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_bg.xtb b/chromium/ui/base/strings/ui_strings_bg.xtb
index daf2a5b6776..859ba008b87 100644
--- a/chromium/ui/base/strings/ui_strings_bg.xtb
+++ b/chromium/ui/base/strings/ui_strings_bg.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798">преди <ph name="NUMBER_MANY"/> часа</translation>
+<translation id="6310545596129886942">Остават <ph name="NUMBER_FEW"/> сек</translation>
+<translation id="9213479837033539041">Остават <ph name="NUMBER_MANY"/> сек</translation>
+<translation id="1209866192426315618">Остават <ph name="NUMBER_DEFAULT"/> минути</translation>
<translation id="1801827354178857021">Точка</translation>
<translation id="1190609913194133056">Център за известия</translation>
+<translation id="7470933019269157899">Остават <ph name="NUMBER_DEFAULT"/> минути</translation>
<translation id="5613020302032141669">Стрелка наляво</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> файл (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> сек</translation>
+<translation id="7511635910912978956">Остават <ph name="NUMBER_FEW"/> часа</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Отказ</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> Б</translation>
<translation id="3660179305079774227">Стрелка нагоре</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> МБ/сек</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> часа</translation>
<translation id="3990502903496589789">Десн край</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> мин</translation>
+<translation id="3520476450377425184">Остават <ph name="NUMBER_MANY"/> дни</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868">Остават <ph name="NUMBER_MANY"/> мин</translation>
+<translation id="8666066831007952346">Остават <ph name="NUMBER_TWO"/> дни</translation>
+<translation id="6390842777729054533">Остават <ph name="NUMBER_ZERO"/> сек</translation>
<translation id="3909791450649380159">Изрязва&amp;не</translation>
+<translation id="2560788951337264832">Остават <ph name="NUMBER_ZERO"/> минути</translation>
<translation id="688711909580084195">Неозаглавена уеб страница</translation>
+<translation id="3353284378027041011">преди <ph name="NUMBER_FEW"/> дни</translation>
<translation id="5076340679995252485">&amp;Поставяне</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> ТБ</translation>
+<translation id="364720409959344976">Избиране на папка за качване</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016">преди <ph name="NUMBER_TWO"/> мин</translation>
<translation id="3234408098842461169">Стрелка надолу</translation>
<translation id="3087734570205094154">Най-долу</translation>
+<translation id="5935630983280450497">Остава <ph name="NUMBER_ONE"/> мин</translation>
<translation id="1860796786778352021">Затваряне на известието</translation>
<translation id="6364916375976753737">Превъртане наляво</translation>
+<translation id="2629089419211541119">преди <ph name="NUMBER_ONE"/> час/а</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868">Остава <ph name="NUMBER_ONE"/> минута</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> мин</translation>
<translation id="8210608804940886430">Страница надолу</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> дни</translation>
+<translation id="7163503212501929773">Остават <ph name="NUMBER_MANY"/> часа</translation>
<translation id="5329858601952122676">&amp;Изтриване</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>
+<translation id="7275974018215686543">преди <ph name="NUMBER_MANY"/> сек</translation>
+<translation id="7781829728241885113">Вчера</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> минути</translation>
+<translation id="50960180632766478">Остават <ph name="NUMBER_FEW"/> мин</translation>
<translation id="6659594942844771486">Раздел</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> МБ</translation>
+<translation id="4988273303304146523">преди <ph name="NUMBER_DEFAULT"/> дни</translation>
<translation id="8428213095426709021">Настройки</translation>
<translation id="2497284189126895209">Всички файлове</translation>
+<translation id="7487278341251176613">Остават <ph name="NUMBER_TWO"/> минути</translation>
+<translation id="5110450810124758964">преди <ph name="NUMBER_ONE"/> ден/дни</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> сек</translation>
<translation id="7814458197256864873">&amp;Копиране</translation>
<translation id="3889424535448813030">Стрелка надясно</translation>
+<translation id="4229495110203539533">преди <ph name="NUMBER_ONE"/> сек</translation>
+<translation id="2544782972264605588">Остават <ph name="NUMBER_DEFAULT"/> сек</translation>
<translation id="6829324100069873704">Назад към известията</translation>
<translation id="6528179044667508675">Не безпокойте</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> секунди</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> мин</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Разрешаване на известията от следните неща:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> минута</translation>
+<translation id="8448317557906454022">преди <ph name="NUMBER_ZERO"/> сек</translation>
<translation id="4927753642311223124">Тук няма нищо, продължете нататък.</translation>
<translation id="2482878487686419369">Известия</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Превъртане до тук</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> часа</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> КБ/сек</translation>
+<translation id="2148716181193084225">Днес</translation>
<translation id="7960078400008666149">Не безпокойте за един час</translation>
+<translation id="4373894838514502496">преди <ph name="NUMBER_FEW"/> мин</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> дни</translation>
<translation id="2190355936436201913">(празно)</translation>
+<translation id="1164369517022005061">Остават <ph name="NUMBER_DEFAULT"/> часа</translation>
+<translation id="152482086482215392">Остава <ph name="NUMBER_ONE"/> сек</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Превъртане надясно</translation>
+<translation id="7414887922320653780">Остава <ph name="NUMBER_ONE"/> час</translation>
<translation id="2666092431469916601">Най-горе</translation>
<translation id="8331626408530291785">Превъртане нагоре</translation>
<translation id="4773379706300191099">Деактивиране на известията от <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Отваряне на файл</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">преди <ph name="NUMBER_DEFAULT"/> часа</translation>
<translation id="815598010540052116">Превъртане надолу</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Възстановяване</translation>
+<translation id="1243314992276662751">Качване</translation>
+<translation id="50030952220075532">Остава <ph name="NUMBER_ONE"/> ден</translation>
<translation id="8179976553408161302">Влизане</translation>
<translation id="945522503751344254">Изпращане на отзиви</translation>
<translation id="9170848237812810038">&amp;Отмяна</translation>
+<translation id="1285266685456062655">преди <ph name="NUMBER_FEW"/> часа</translation>
+<translation id="6918245111648057970">Разрешаване на известията от следните неща за всеки потребител:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> секунда</translation>
+<translation id="3994835489895548312">Остават <ph name="NUMBER_MANY"/> минути</translation>
+<translation id="6358975074282722691">преди <ph name="NUMBER_TWO"/> сек</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> ПБ</translation>
<translation id="2983818520079887040">Настройки...</translation>
<translation id="6845383723252244143">Избор на папка</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> секунди</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> сек</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534">преди <ph name="NUMBER_MANY"/> дни</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> дни</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> час</translation>
+<translation id="2679312662830811292">преди <ph name="NUMBER_ONE"/> мин</translation>
+<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="9098468523912235228">преди <ph name="NUMBER_DEFAULT"/> сек</translation>
+<translation id="494645311413743213">Остават <ph name="NUMBER_TWO"/> сек</translation>
<translation id="4570886800634958009">Разгъване на известието</translation>
<translation id="436869212180315161">Натиснете</translation>
+<translation id="4860787810836767172">преди <ph name="NUMBER_FEW"/> сек</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> ТБ/сек</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> минути</translation>
+<translation id="1858722859751911017">Остават <ph name="NUMBER_FEW"/> минути</translation>
<translation id="6040143037577758943">Затваряне</translation>
+<translation id="1101671447232096497">преди <ph name="NUMBER_MANY"/> мин</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> Б/сек</translation>
<translation id="7649070708921625228">Помощ</translation>
<translation id="8226233771743600312">Не безпокойте за един ден</translation>
<translation id="7457942297256758195">Изчистване на всички</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – Известия</translation>
+<translation id="822618367988303761">преди <ph name="NUMBER_TWO"/> дни</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> мин</translation>
+<translation id="1963692530539281474">Остават <ph name="NUMBER_DEFAULT"/> дни</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> минути</translation>
+<translation id="5906719743126878045">Остават <ph name="NUMBER_TWO"/> часа</translation>
+<translation id="8959208747503200525">преди <ph name="NUMBER_TWO"/> часа</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> сек</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> сек</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> секунди</translation>
+<translation id="3759876923365568382">Остават <ph name="NUMBER_FEW"/> дни</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> ПБ/сек</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – Известия (<ph name="QUANTITY"/> непрочетени)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Не безпокойте</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Намаляване</translation>
<translation id="6394627529324717982">Запетая</translation>
<translation id="4469842253116033348">Деактивиране на известията от <ph name="SITE"/></translation>
<translation id="3036649622769666520">Отваряне на файлове</translation>
<translation id="8328145009876646418">Ляв край</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> секунди</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_bn.xtb b/chromium/ui/base/strings/ui_strings_bn.xtb
index 707848f4fa1..2466e539ce5 100644
--- a/chromium/ui/base/strings/ui_strings_bn.xtb
+++ b/chromium/ui/base/strings/ui_strings_bn.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> সেকেন্ড বাকি</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> সেকেন্ড বাকি</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> মিনিট বাকি</translation>
<translation id="1801827354178857021">সময়কাল</translation>
<translation id="1190609913194133056">বিজ্ঞপ্তি কেন্দ্র</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> মিনিট বাকি</translation>
<translation id="5613020302032141669">Left Arrow</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> ফাইল (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> সেকেন্ড</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> ঘন্টা বাকি</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">বাতিল</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Up Arrow</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ঘন্টা</translation>
<translation id="3990502903496589789">ডান প্রান্ত</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> মিনিট</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> দিন বাকি</translation>
<translation id="932327136139879170">হোম</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> মিনিট বাকি</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> দিন বাকি</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> সেকেন্ড বাকি</translation>
<translation id="3909791450649380159">ছেদ&amp;ন</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> মিনিট বাকি</translation>
<translation id="688711909580084195">শিরোনামহীন ওয়েবপৃষ্ঠা</translation>
+<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="364720409959344976">আপলোড করার জন্য ফোল্ডার নির্বাচন করুন</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
<translation id="3234408098842461169">Down Arrow</translation>
<translation id="3087734570205094154">নীচে</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> মিনিট বাকি</translation>
<translation id="1860796786778352021">বিজ্ঞপ্তি বন্ধ করা হয়েছে</translation>
<translation id="6364916375976753737">বাম দিকে স্ক্রোল করুন</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> মিনিট বাকি</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> মিনিট</translation>
<translation id="8210608804940886430">পৃষ্ঠা উপরে</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> দিন</translation>
+<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ঘন্টা বাকি</translation>
<translation id="5329858601952122676">&amp;মুছুন</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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">গতকাল</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> মিনিট</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> মিনিট বাকি</translation>
<translation id="6659594942844771486">ট্যাব</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> দিন আগে</translation>
<translation id="8428213095426709021">সেটিংস</translation>
<translation id="2497284189126895209">সকল ফাইল</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> মিনিট বাকি</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> day ago</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> সেকেন্ড</translation>
<translation id="7814458197256864873">&amp;copy</translation>
<translation id="3889424535448813030">Right Arrow</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> sec ago</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> সেকেন্ড বাকি</translation>
<translation id="6829324100069873704">বিজ্ঞপ্তিগুলিতে ফিরে যান</translation>
<translation id="6528179044667508675">বিরক্ত করবেন না</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> সেকেন্ড</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> মিনিট</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">নিম্নলিখিত থেকে বিজ্ঞপ্তিগুলি মঞ্জুরি করুন:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> মিনিট</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">এখানে দেখার কিছু নেই , এগিয়ে যান৷</translation>
<translation id="2482878487686419369">বিজ্ঞপ্তিগুলি</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">এখান পর্যন্ত স্ক্রোল করুন</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ঘন্টা</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">আজ</translation>
<translation id="7960078400008666149">এক ঘন্টার জন্য বিরক্ত করবেন না</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> দিন</translation>
<translation id="2190355936436201913">(খালি)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> ঘন্টা বাকি</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> সেকেন্ড বাকি</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">ডান দিকে স্ক্রোল করুন</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ঘন্টা বাকি</translation>
<translation id="2666092431469916601">শীর্ষ</translation>
<translation id="8331626408530291785">উপরে স্ক্রোল করুন</translation>
<translation id="4773379706300191099"><ph name="EXTENSION_NAME"/> থেকে বিজ্ঞপ্তিগুলি অক্ষম করুন</translation>
<translation id="7907591526440419938">খোলা ফাইল</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> ঘন্টা আগে</translation>
<translation id="815598010540052116">নীচে স্ক্রোল করুন</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">পুনরুদ্ধার করুন</translation>
+<translation id="1243314992276662751">আপলোড</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> দিন বাকি</translation>
<translation id="8179976553408161302">প্রবেশ করুন</translation>
<translation id="945522503751344254">প্রতিক্রিয়া প্রেরণ করুন</translation>
<translation id="9170848237812810038">&amp;পূর্বাবস্থায় ফিরুন</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">প্রত্যেক ব্যবহারকারীর জন্য নিম্নলিখিত থেকে বিজ্ঞপ্তি মঞ্জুর করুন:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> সেকেন্ড</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> মিনিট বাকি</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">সেটিংস...</translation>
<translation id="6845383723252244143">ফোল্ডার নির্বাচন করুন</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> সেকেন্ড</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> সেকেন্ড</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> দিন</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> ঘন্টা</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> min ago</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> সেকেন্ড আগে</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> সেকেন্ড বাকি</translation>
<translation id="4570886800634958009">বিজ্ঞপ্তি প্রসারিত করুন</translation>
<translation id="436869212180315161">টিপুন</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> মিনিট</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> মিনিট বাকি</translation>
<translation id="6040143037577758943">বন্ধ</translation>
+<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="8226233771743600312">এক দিনের জন্য বিরক্ত করবেন না</translation>
<translation id="7457942297256758195">সমস্ত সাফ করুন</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - বিজ্ঞপ্তিগুলি</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> মিনিট</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> দিন বাকি</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> মিনিট</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> ঘন্টা বাকি</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> সেকেন্ড</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> সেকেন্ড</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> সেকেন্ড</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> দিন বাকি</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - বিজ্ঞপ্তিগুলি (<ph name="QUANTITY"/>টি অপঠিত)</translation>
<translation id="6965382102122355670">ওকে</translation>
<translation id="7850320739366109486">বিরক্ত করবেন না</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">ছোট করুন</translation>
<translation id="6394627529324717982">কমা</translation>
<translation id="4469842253116033348"><ph name="SITE"/>-এর থেকে বিজ্ঞপ্তি অক্ষম করুন</translation>
<translation id="3036649622769666520">খোলা ফাইল</translation>
<translation id="8328145009876646418">বাম প্রান্ত</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> সেকেন্ড</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_ca.xtb b/chromium/ui/base/strings/ui_strings_ca.xtb
index 2221bf0404c..d07f75bcad8 100644
--- a/chromium/ui/base/strings/ui_strings_ca.xtb
+++ b/chromium/ui/base/strings/ui_strings_ca.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Supr</translation>
<translation id="528468243742722775">Fi</translation>
+<translation id="5341849548509163798">Fa <ph name="NUMBER_MANY"/> hores</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> segons restants</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> segons restants</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minuts restants</translation>
<translation id="1801827354178857021">Punt</translation>
<translation id="1190609913194133056">Centre de notificacions</translation>
+<translation id="7470933019269157899">Queden <ph name="NUMBER_DEFAULT"/> minuts</translation>
<translation id="5613020302032141669">Fletxa esquerra</translation>
<translation id="8602707065186045623">Fitxer <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> segons</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> hores restants</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Cancel·la</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Fletxa amunt</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minuts</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dies restants</translation>
<translation id="932327136139879170">Inici</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minuts restants</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> dies restants</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> segons restants</translation>
<translation id="3909791450649380159">Re&amp;talla</translation>
+<translation id="2560788951337264832">Queden <ph name="NUMBER_ZERO"/> minuts</translation>
<translation id="688711909580084195">Pàgina web sense títol</translation>
+<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="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>
<translation id="3234408098842461169">Fletxa avall</translation>
<translation id="3087734570205094154">Part inferior</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minut restant</translation>
<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="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="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>
<translation id="8210608804940886430">Av Pàg</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> segons</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minuts</translation>
+<translation id="7275974018215686543">Fa <ph name="NUMBER_MANY"/> segons</translation>
+<translation id="7781829728241885113">Ahir</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuts</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minuts restants</translation>
<translation id="6659594942844771486">Pestanya</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523">Fa <ph name="NUMBER_DEFAULT"/> dies</translation>
<translation id="8428213095426709021">Configuració</translation>
<translation id="2497284189126895209">Tots els fitxers</translation>
+<translation id="7487278341251176613">Queden <ph name="NUMBER_TWO"/> minuts</translation>
+<translation id="5110450810124758964">Fa <ph name="NUMBER_ONE"/> dia</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> segon</translation>
<translation id="7814458197256864873">&amp;Copia</translation>
<translation id="3889424535448813030">Fletxa dreta</translation>
+<translation id="4229495110203539533">Fa <ph name="NUMBER_ONE"/> segon</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> segons restants</translation>
<translation id="6829324100069873704">Torna a les notificacions</translation>
<translation id="6528179044667508675">No molesteu</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> segons</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Notificacions</translation>
+<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="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hores</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Avui</translation>
<translation id="7960078400008666149">No molesteu durant una hora</translation>
+<translation id="4373894838514502496">Fa <ph name="NUMBER_FEW"/> minuts</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> dies</translation>
<translation id="2190355936436201913">(buit)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> hores restants</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> segon restant</translation>
<translation id="8447116497070723931">Re Pàg</translation>
<translation id="4588090240171750605">Desplaçament a la dreta</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hores restants</translation>
<translation id="2666092431469916601">Superior</translation>
<translation id="8331626408530291785">Desplaçament amunt</translation>
<translation id="4773379706300191099">Desactiva les notificacions de <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Obre un fitxer</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">Fa <ph name="NUMBER_DEFAULT"/> hores</translation>
<translation id="815598010540052116">Desplaçament avall</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restaura</translation>
+<translation id="1243314992276662751">Penja</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dia restant</translation>
<translation id="8179976553408161302">Intro</translation>
<translation id="945522503751344254">Envia comentaris</translation>
<translation id="9170848237812810038">&amp;Desfés</translation>
+<translation id="1285266685456062655">Fa <ph name="NUMBER_FEW"/> hores</translation>
+<translation id="6918245111648057970">Permet les notificacions de les opcions següents per a cada usuari:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> segon</translation>
+<translation id="3994835489895548312">Queden <ph name="NUMBER_MANY"/> minuts</translation>
+<translation id="6358975074282722691">Fa <ph name="NUMBER_TWO"/> segons</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Configuració...</translation>
<translation id="6845383723252244143">Selecció d'una carpeta</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> segons</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> segons</translation>
<translation id="5583640892426849032">Retrocés</translation>
+<translation id="5263972071113911534">Fa <ph name="NUMBER_MANY"/> dies</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> dies</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> hora</translation>
+<translation id="2679312662830811292">Fa <ph name="NUMBER_ONE"/> minut</translation>
+<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="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="436869212180315161">Prem</translation>
+<translation id="4860787810836767172">Fa <ph name="NUMBER_FEW"/> segons</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minuts</translation>
+<translation id="1858722859751911017">Queden <ph name="NUMBER_FEW"/> minuts</translation>
<translation id="6040143037577758943">Tanca</translation>
+<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="8226233771743600312">No molesteu durant un dia</translation>
<translation id="7457942297256758195">Esborra-ho tot</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/>: notificacions</translation>
+<translation id="822618367988303761">Fa <ph name="NUMBER_TWO"/> dies</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minuts</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> dies restants</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minuts</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> hores restants</translation>
+<translation id="8959208747503200525">Fa <ph name="NUMBER_TWO"/> hores</translation>
<translation id="8400147561352026160">Maj+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> segons</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> segons</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> segons</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> dies restants</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/>: notificacions (<ph name="QUANTITY"/> no llegides)</translation>
<translation id="6965382102122355670">D'acord</translation>
<translation id="7850320739366109486">No molesteu</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimitza</translation>
<translation id="6394627529324717982">Coma</translation>
<translation id="4469842253116033348">Desactiva les notificacions de <ph name="SITE"/></translation>
<translation id="3036649622769666520">Obre fitxers</translation>
<translation id="8328145009876646418">Extrem esquerre</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> segons</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_cs.xtb b/chromium/ui/base/strings/ui_strings_cs.xtb
index 9fa78c2c689..d6882c7751c 100644
--- a/chromium/ui/base/strings/ui_strings_cs.xtb
+++ b/chromium/ui/base/strings/ui_strings_cs.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Klávesa Ins</translation>
<translation id="6135826906199951471">Klávesa Del</translation>
<translation id="528468243742722775">Klávesa End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942">Zbývá: <ph name="NUMBER_FEW"/> s</translation>
+<translation id="9213479837033539041">Zbývá: <ph name="NUMBER_MANY"/> s</translation>
+<translation id="1209866192426315618">Zbývá: <ph name="NUMBER_DEFAULT"/> min</translation>
<translation id="1801827354178857021">Tečka</translation>
<translation id="1190609913194133056">Centrum oznámení</translation>
+<translation id="7470933019269157899">Zbývá <ph name="NUMBER_DEFAULT"/> min</translation>
<translation id="5613020302032141669">Klávesa šipka vlevo</translation>
<translation id="8602707065186045623">Soubor <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> s</translation>
+<translation id="7511635910912978956">Zbývá: <ph name="NUMBER_FEW"/> hod</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Zrušit</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Klávesa šipka nahoru</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minut</translation>
+<translation id="3520476450377425184">Zbývá: <ph name="NUMBER_MANY"/> dnů</translation>
<translation id="932327136139879170">Domů</translation>
+<translation id="5600907569873192868">Zbývá: <ph name="NUMBER_MANY"/> min</translation>
+<translation id="8666066831007952346">Zbývá: <ph name="NUMBER_TWO"/> dny</translation>
+<translation id="6390842777729054533">Zbývá: <ph name="NUMBER_ZERO"/> s</translation>
<translation id="3909791450649380159">Vyjmou&amp;t</translation>
+<translation id="2560788951337264832">Zbývá <ph name="NUMBER_ZERO"/> minut</translation>
<translation id="688711909580084195">Nepojmenovaná webová stránka</translation>
+<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="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>
<translation id="3234408098842461169">Klávesa šipka dolů</translation>
<translation id="3087734570205094154">Až dolů</translation>
+<translation id="5935630983280450497">Zbývá: <ph name="NUMBER_ONE"/> min</translation>
<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="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="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>
<translation id="8210608804940886430">Klávesa PageDown</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> s</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> min</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Včera</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> min</translation>
+<translation id="50960180632766478">Zbývá: <ph name="NUMBER_FEW"/> min</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>
<translation id="8428213095426709021">Nastavení</translation>
<translation id="2497284189126895209">Všechny soubory</translation>
+<translation id="7487278341251176613">Zbývají <ph name="NUMBER_TWO"/> minuty</translation>
+<translation id="5110450810124758964">Před <ph name="NUMBER_ONE"/> dnem</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> s</translation>
<translation id="7814458197256864873">&amp;Kopírovat</translation>
<translation id="3889424535448813030">Klávesa šipka vpravo</translation>
+<translation id="4229495110203539533">Před <ph name="NUMBER_ONE"/> sekundou</translation>
+<translation id="2544782972264605588">Zbývá: <ph name="NUMBER_DEFAULT"/> s</translation>
<translation id="6829324100069873704">Přejít zpět k oznámením</translation>
<translation id="6528179044667508675">Nerušit</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> s</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Oznámení</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Posunout sem</translation>
<translation id="4552416320897244156">Klávesa PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hod</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
+<translation id="2148716181193084225">Dnes</translation>
<translation id="7960078400008666149">Nerušit jednu hodinu</translation>
+<translation id="4373894838514502496">před <ph name="NUMBER_FEW"/> minutami</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> dnů</translation>
<translation id="2190355936436201913">(prázdné)</translation>
+<translation id="1164369517022005061">Zbývá: <ph name="NUMBER_DEFAULT"/> hod</translation>
+<translation id="152482086482215392">Zbývá: <ph name="NUMBER_ONE"/> s</translation>
<translation id="8447116497070723931">Klávesa PgUp</translation>
<translation id="4588090240171750605">Posuv doprava</translation>
+<translation id="7414887922320653780">Zbývá: <ph name="NUMBER_ONE"/> hod</translation>
<translation id="2666092431469916601">Nahoru</translation>
<translation id="8331626408530291785">Posuv nahoru</translation>
<translation id="4773379706300191099">Deaktivovat oznámení rozšíření <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Otevřít soubor</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Klávesa Esc</translation>
+<translation id="2797524280730715045">Před <ph name="NUMBER_DEFAULT"/> hodinami</translation>
<translation id="815598010540052116">Posuv dolů</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Obnovit</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="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>
+<translation id="6918245111648057970">Povolit oznámení z následujících zdrojů pro všechny uživatele:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> s</translation>
+<translation id="3994835489895548312">Zbývá <ph name="NUMBER_MANY"/> minut</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Nastavení...</translation>
<translation id="6845383723252244143">Vybrat složku</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> s</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> s</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> dnů</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> hod</translation>
+<translation id="2679312662830811292">Před <ph name="NUMBER_ONE"/> minutou</translation>
+<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="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="436869212180315161">Tisk</translation>
+<translation id="4860787810836767172">Před <ph name="NUMBER_FEW"/> sekundami</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> min</translation>
+<translation id="1858722859751911017">Zbývají <ph name="NUMBER_FEW"/> minuty</translation>
<translation id="6040143037577758943">Zavřít</translation>
+<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="8226233771743600312">Nerušit jeden den</translation>
<translation id="7457942297256758195">Vymazat vše</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – oznámení</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min</translation>
+<translation id="1963692530539281474">Zbývá: <ph name="NUMBER_DEFAULT"/> dnů</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> min</translation>
+<translation id="5906719743126878045">Zbývá: <ph name="NUMBER_TWO"/> hod</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> s</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> s</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> s</translation>
+<translation id="3759876923365568382">Zbývá: <ph name="NUMBER_FEW"/> dnů</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – oznámení (nepřečteno: <ph name="QUANTITY"/>)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Nerušit</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimalizovat</translation>
<translation id="6394627529324717982">Čárka</translation>
<translation id="4469842253116033348">Deaktivovat oznámení z webu <ph name="SITE"/></translation>
<translation id="3036649622769666520">Otevřít soubory</translation>
<translation id="8328145009876646418">Levý okraj</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> s</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_da.xtb b/chromium/ui/base/strings/ui_strings_da.xtb
index 3d5c4ecc6f2..abd0fe6edf9 100644
--- a/chromium/ui/base/strings/ui_strings_da.xtb
+++ b/chromium/ui/base/strings/ui_strings_da.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> timer siden</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> sek. tilbage</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> sek. tilbage</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minutter tilbage</translation>
<translation id="1801827354178857021">Periode</translation>
<translation id="1190609913194133056">Underretningcenter</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> minutter tilbage</translation>
<translation id="5613020302032141669">Venstrepil</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> Fil (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> sek.</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> timer tilbage</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Annuller</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Pil opad</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutter</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dage tilbage</translation>
<translation id="932327136139879170">Start</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minutter tilbage</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> dage tilbage</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> sek. tilbage</translation>
<translation id="3909791450649380159">Kli&amp;p</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutter tilbage</translation>
<translation id="688711909580084195">Ikke-navngivet webside</translation>
+<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="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>
<translation id="3234408098842461169">Pil nedad</translation>
<translation id="3087734570205094154">Bund</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minutter tilbage</translation>
<translation id="1860796786778352021">Luk underretning</translation>
<translation id="6364916375976753737">Scroll Left</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> time siden</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="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>
<translation id="8210608804940886430">Side ned</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> sek.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutter</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> sekunder siden</translation>
+<translation id="7781829728241885113">I går</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutter</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutter tilbage</translation>
<translation id="6659594942844771486">Fane</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> dage siden</translation>
<translation id="8428213095426709021">Indstillinger</translation>
<translation id="2497284189126895209">Alle filer</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutter tilbage</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> dag siden</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sek.</translation>
<translation id="7814458197256864873">&amp;Kopier</translation>
<translation id="3889424535448813030">Højrepil</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> sekund siden</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> sek. tilbage</translation>
<translation id="6829324100069873704">Gå tilbage til underretninger</translation>
<translation id="6528179044667508675">Vil ikke forstyrres</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> sekunder</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Meddelelser</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Scroll hertil</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> timer</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/sek.</translation>
+<translation id="2148716181193084225">I dag</translation>
<translation id="7960078400008666149">Vil ikke forstyrres i en time</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> minutter siden</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> dage</translation>
<translation id="2190355936436201913">(tom)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> timer tilbage</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> sek. tilbage</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Scroll til højre</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> timer tilbage</translation>
<translation id="2666092431469916601">Top</translation>
<translation id="8331626408530291785">Scroll Up</translation>
<translation id="4773379706300191099">Deaktiver underretninger fra <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Åbn fil</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> timer siden</translation>
<translation id="815598010540052116">Scroll Down</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Gendan</translation>
+<translation id="1243314992276662751">Upload</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dage tilbage</translation>
<translation id="8179976553408161302">Start</translation>
<translation id="945522503751344254">Send feedback</translation>
<translation id="9170848237812810038">&amp;Fortryd</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> timer siden</translation>
+<translation id="6918245111648057970">Tillad underretninger fra følgende for hver bruger:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> sekund</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutter tilbage</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> sekunder siden</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Indstillinger...</translation>
<translation id="6845383723252244143">Vælg mappe</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> sekunder</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> sek.</translation>
<translation id="5583640892426849032">Returtast</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> dage siden</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> dage</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> time</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> minut siden</translation>
+<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="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="436869212180315161">Tryk</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> sekunder siden</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/sek.</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutter</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minutter tilbage</translation>
<translation id="6040143037577758943">Luk</translation>
+<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="8226233771743600312">Vil ikke forstyrres i et døgn</translation>
<translation id="7457942297256758195">Ryd alle</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – Underretninger</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> dage siden</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutter</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> dage tilbage</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutter</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> timer tilbage</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> timer siden</translation>
<translation id="8400147561352026160">Skift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> sek.</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> sek.</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> sekunder</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> dage tilbage</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/sek.</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – Underretninger (<ph name="QUANTITY"/> ulæste)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Vil ikke forstyrres</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimer</translation>
<translation id="6394627529324717982">Komma</translation>
<translation id="4469842253116033348">Deaktiver meddelelser fra <ph name="SITE"/></translation>
<translation id="3036649622769666520">Åbn filer</translation>
<translation id="8328145009876646418">Venstre kant</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> sekunder</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_de.xtb b/chromium/ui/base/strings/ui_strings_de.xtb
index 43f42cb97eb..df63bb041ac 100644
--- a/chromium/ui/base/strings/ui_strings_de.xtb
+++ b/chromium/ui/base/strings/ui_strings_de.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Einfg</translation>
<translation id="6135826906199951471">Entf</translation>
<translation id="528468243742722775">Ende</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> Sekunden übrig</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> Sekunden übrig</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> Minuten übrig</translation>
<translation id="1801827354178857021">Punkt</translation>
<translation id="1190609913194133056">Benachrichtigungscenter</translation>
+<translation id="7470933019269157899">Noch <ph name="NUMBER_DEFAULT"/> Minuten</translation>
<translation id="5613020302032141669">Linkspfeil</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/>-Datei (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> Sekunden</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> Stunden übrig</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Abbrechen</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Aufwärtspfeil</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> Minuten</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> Tage übrig</translation>
<translation id="932327136139879170">Startseite</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> Minuten übrig</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> Tage übrig</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> Sekunden übrig</translation>
<translation id="3909791450649380159">&amp;Ausschneiden</translation>
+<translation id="2560788951337264832">Noch <ph name="NUMBER_ZERO"/> Minuten</translation>
<translation id="688711909580084195">Unbenannte Webseite</translation>
+<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="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>
<translation id="3234408098842461169">Abwärtspfeil</translation>
<translation id="3087734570205094154">Unten</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> Minute übrig</translation>
<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="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="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>
<translation id="8210608804940886430">Nach unten</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> Sekunden</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> Minuten</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Gestern</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> Minuten</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> Minuten übrig</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523">Vor <ph name="NUMBER_DEFAULT"/> Tagen</translation>
<translation id="8428213095426709021">Einstellungen</translation>
<translation id="2497284189126895209">Alle Dateien</translation>
+<translation id="7487278341251176613">Noch <ph name="NUMBER_TWO"/> Minuten</translation>
+<translation id="5110450810124758964">Vor <ph name="NUMBER_ONE"/> Tag</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> Sekunde</translation>
<translation id="7814458197256864873">&amp;Kopieren</translation>
<translation id="3889424535448813030">Rechtspfeil</translation>
+<translation id="4229495110203539533">Vor <ph name="NUMBER_ONE"/> Sekunde</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> Sekunden übrig</translation>
<translation id="6829324100069873704">Zurück zu den Benachrichtigungen</translation>
<translation id="6528179044667508675">Nicht stören</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> Sekunden</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Benachrichtigungen</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Hierher blättern</translation>
<translation id="4552416320897244156">BildAb</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> Stunden</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Heute</translation>
<translation id="7960078400008666149">1 Stunde nicht stören</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> Tage</translation>
<translation id="2190355936436201913">(leer)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> Stunden übrig</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> Sekunde übrig</translation>
<translation id="8447116497070723931">BildAuf</translation>
<translation id="4588090240171750605">Nach rechts blättern</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> Stunde übrig</translation>
<translation id="2666092431469916601">Oben</translation>
<translation id="8331626408530291785">Nach oben blättern</translation>
<translation id="4773379706300191099">Benachrichtigungen von <ph name="EXTENSION_NAME"/> deaktivieren</translation>
<translation id="7907591526440419938">Datei öffnen</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">Vor <ph name="NUMBER_DEFAULT"/> Stunden</translation>
<translation id="815598010540052116">Nach unten blättern</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Wiederherstellen</translation>
+<translation id="1243314992276662751">Hochladen</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> Tag übrig</translation>
<translation id="8179976553408161302">Enter</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>
+<translation id="6918245111648057970">Benachrichtigungen von Folgendem für jeden Nutzer zulassen:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> Sekunde</translation>
+<translation id="3994835489895548312">Noch <ph name="NUMBER_MANY"/> Minuten</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Einstellungen...</translation>
<translation id="6845383723252244143">Ordner auswählen</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> Sekunden</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> Sekunden</translation>
<translation id="5583640892426849032">Rücktaste</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> Tage</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> Stunde</translation>
+<translation id="2679312662830811292">Vor <ph name="NUMBER_ONE"/> Minute</translation>
+<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="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="436869212180315161">Klicken</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> Minuten</translation>
+<translation id="1858722859751911017">Noch <ph name="NUMBER_FEW"/> Minuten</translation>
<translation id="6040143037577758943">Schließen</translation>
+<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="8226233771743600312">1 Tag nicht stören</translation>
<translation id="7457942297256758195">Alle löschen</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – Benachrichtigungen</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> Minuten</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> Tage übrig</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> Minuten</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> Stunden übrig</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Umschalt+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> Sekunden</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> Sekunden</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> Sekunden</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> Tage übrig</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – Benachrichtigungen (<ph name="QUANTITY"/> ungelesen)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Nicht stören</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Verkleinern</translation>
<translation id="6394627529324717982">Komma</translation>
<translation id="4469842253116033348">Benachrichtigungen von <ph name="SITE"/> deaktivieren</translation>
<translation id="3036649622769666520">Dateien öffnen</translation>
<translation id="8328145009876646418">Linker Rand</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> Sekunden</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_el.xtb b/chromium/ui/base/strings/ui_strings_el.xtb
index a87c8e447d7..7fbfbf0c735 100644
--- a/chromium/ui/base/strings/ui_strings_el.xtb
+++ b/chromium/ui/base/strings/ui_strings_el.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798">Πριν από <ph name="NUMBER_MANY"/> ώρες</translation>
+<translation id="6310545596129886942">Υπολείπονται <ph name="NUMBER_FEW"/> δευτερόλεπτα</translation>
+<translation id="9213479837033539041">Υπολείπονται <ph name="NUMBER_MANY"/> δευτερόλεπτα</translation>
+<translation id="1209866192426315618">υπολείπονται <ph name="NUMBER_DEFAULT"/> λεπτά</translation>
<translation id="1801827354178857021">Τελεία</translation>
<translation id="1190609913194133056">Κέντρο ειδοποιήσεων</translation>
+<translation id="7470933019269157899">Υπολείπονται <ph name="NUMBER_DEFAULT"/> λεπτά</translation>
<translation id="5613020302032141669">Αριστερό βέλος</translation>
<translation id="8602707065186045623">Αρχείο <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> δευτερόλεπτα</translation>
+<translation id="7511635910912978956">Υπολείπονται <ph name="NUMBER_FEW"/> ώρες</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Ακύρωση</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> Β</translation>
<translation id="3660179305079774227">Πάνω βέλος</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ώρες</translation>
<translation id="3990502903496589789">Δεξιά άκρη</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> λεπτά</translation>
+<translation id="3520476450377425184">Υπολείπονται <ph name="NUMBER_MANY"/> ημέρες</translation>
<translation id="932327136139879170">Αρχική σελίδα</translation>
+<translation id="5600907569873192868">Υπολείπονται <ph name="NUMBER_MANY"/> λεπτά</translation>
+<translation id="8666066831007952346">Υπολείπονται <ph name="NUMBER_TWO"/> ημέρες</translation>
+<translation id="6390842777729054533">Υπολείπονται <ph name="NUMBER_ZERO"/> δευτερόλεπτα</translation>
<translation id="3909791450649380159">Απο&amp;κοπή</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutes left</translation>
<translation id="688711909580084195">Ιστοσελίδα χωρίς τίτλο</translation>
+<translation id="3353284378027041011">Πριν από <ph name="NUMBER_FEW"/> ημέρες</translation>
<translation id="5076340679995252485">&amp;Επικόλληση</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="364720409959344976">Επιλέξτε φάκελο για μεταφόρτωση</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016">Πριν από <ph name="NUMBER_TWO"/> λεπτά</translation>
<translation id="3234408098842461169">Κάτω βέλος</translation>
<translation id="3087734570205094154">Κάτω</translation>
+<translation id="5935630983280450497">Υπολείπεται <ph name="NUMBER_ONE"/> λεπτό</translation>
<translation id="1860796786778352021">Κλείσιμο ειδοποίησης</translation>
<translation id="6364916375976753737">Κύλιση αριστερά</translation>
+<translation id="2629089419211541119">Πριν από <ph name="NUMBER_ONE"/> ώρα</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868">Υπολείπεται <ph name="NUMBER_ONE"/> λεπτό</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> λεπτό</translation>
<translation id="8210608804940886430">Επόμενη σελίδα</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ημέρες</translation>
+<translation id="7163503212501929773">Υπολείπονται <ph name="NUMBER_MANY"/> ώρες</translation>
<translation id="5329858601952122676">&amp;Διαγραφή</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>
+<translation id="7275974018215686543">Πριν από <ph name="NUMBER_MANY"/> δευτερόλεπτα</translation>
+<translation id="7781829728241885113">Χθες</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> λεπτά</translation>
+<translation id="50960180632766478">Υπολείπονται <ph name="NUMBER_FEW"/> λεπτά</translation>
<translation id="6659594942844771486">Καρτέλα</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523">Πριν από <ph name="NUMBER_DEFAULT"/> ημέρες</translation>
<translation id="8428213095426709021">Ρυθμίσεις</translation>
<translation id="2497284189126895209">Όλα τα αρχεία</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964">Πριν από <ph name="NUMBER_ONE"/> ημέρα</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> δευτερόλεπτο</translation>
<translation id="7814458197256864873">&amp;Αντιγραφή</translation>
<translation id="3889424535448813030">Δεξιό βέλος</translation>
+<translation id="4229495110203539533">Πριν από <ph name="NUMBER_ONE"/> δευτερόλεπτο</translation>
+<translation id="2544782972264605588">Υπολείπονται <ph name="NUMBER_DEFAULT"/> δευτερόλεπτα</translation>
<translation id="6829324100069873704">Επιστροφή στις ειδοποιήσεις</translation>
<translation id="6528179044667508675">Μην ενοχλείτε</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> δευτερόλεπτα</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> λεπτά</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Να επιτρέπονται ειδοποιήσεις από:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> λεπτό</translation>
+<translation id="8448317557906454022">Πριν από <ph name="NUMBER_ZERO"/> δευτερόλεπτα</translation>
<translation id="4927753642311223124">Δεν υπάρχει τίποτα να δείτε εδώ, συνεχίστε με αυτό που κάνατε.</translation>
<translation id="2482878487686419369">Ειδοποιήσεις</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Κύλιση εδώ</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">Πλήκτρο F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ώρες</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Σήμερα</translation>
<translation id="7960078400008666149">Μην ενοχλείτε για μία ώρα</translation>
+<translation id="4373894838514502496">Πριν από <ph name="NUMBER_FEW"/> λεπτά</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> ημέρες</translation>
<translation id="2190355936436201913">(κενό)</translation>
+<translation id="1164369517022005061">Υπολείπονται <ph name="NUMBER_DEFAULT"/> ώρες</translation>
+<translation id="152482086482215392">Υπολείπεται <ph name="NUMBER_ONE"/> δευτερόλεπτο</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Κύλιση δεξιά</translation>
+<translation id="7414887922320653780">Υπολείπεται <ph name="NUMBER_ONE"/> ώρα</translation>
<translation id="2666092431469916601">Κορυφή</translation>
<translation id="8331626408530291785">Κύλιση επάνω</translation>
<translation id="4773379706300191099">Απενεργοποίηση ειδοποιήσεων από <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Άνοιγμα Αρχείου</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">Πριν από <ph name="NUMBER_DEFAULT"/> ώρες</translation>
<translation id="815598010540052116">Κύλιση κάτω</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Επαναφορά</translation>
+<translation id="1243314992276662751">Μεταφόρτωση</translation>
+<translation id="50030952220075532">Υπολείπεται <ph name="NUMBER_ONE"/> ημέρα</translation>
<translation id="8179976553408161302">Είσοδος</translation>
<translation id="945522503751344254">Αποστολή σχολίων</translation>
<translation id="9170848237812810038">Αναί&amp;ρεση</translation>
+<translation id="1285266685456062655">Πριν από <ph name="NUMBER_FEW"/> ώρες</translation>
+<translation id="6918245111648057970">Να επιτρέπονται οι ειδοποιήσεις από τις παρακάτω πηγές για κάθε χρήστη:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> δευτερόλεπτο</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691">Πριν από <ph name="NUMBER_TWO"/> δευτερόλεπτα</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Ρυθμίσεις...</translation>
<translation id="6845383723252244143">Επιλογή Φακέλου</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> δευτερόλεπτα</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> δευτερόλεπτα</translation>
<translation id="5583640892426849032">Πλήκτρο Backspace</translation>
+<translation id="5263972071113911534">Πριν από <ph name="NUMBER_MANY"/> ημέρες</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> ημέρες</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> ώρα</translation>
+<translation id="2679312662830811292">Πριν από <ph name="NUMBER_ONE"/> λεπτό</translation>
+<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="9098468523912235228">Πριν από <ph name="NUMBER_DEFAULT"/> δευτερόλεπτα</translation>
+<translation id="494645311413743213">Υπολείπονται <ph name="NUMBER_TWO"/> δευτερόλεπτα</translation>
<translation id="4570886800634958009">Επέκταση ειδοποίησης</translation>
<translation id="436869212180315161">Πιέστε</translation>
+<translation id="4860787810836767172">Πριν από <ph name="NUMBER_FEW"/> δευτερόλεπτα</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> λεπτά</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minutes left</translation>
<translation id="6040143037577758943">Κλείσιμο</translation>
+<translation id="1101671447232096497">Πριν από <ph name="NUMBER_MANY"/> λεπτά</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">Βοήθεια</translation>
<translation id="8226233771743600312">Μην ενοχλείτε για μία ημέρα</translation>
<translation id="7457942297256758195">Εκκαθάριση όλων</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - Ειδοποιήσεις</translation>
+<translation id="822618367988303761">Πριν από <ph name="NUMBER_TWO"/> ημέρες</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> λεπτά</translation>
+<translation id="1963692530539281474">Υπολείπονται <ph name="NUMBER_DEFAULT"/> ημέρες</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> λεπτά</translation>
+<translation id="5906719743126878045">Υπολείπονται <ph name="NUMBER_TWO"/> ώρες</translation>
+<translation id="8959208747503200525">Πριν από <ph name="NUMBER_TWO"/> ώρες</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> δευτερόλεπτα</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> δευτερόλεπτα</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> δευτερόλεπτα</translation>
+<translation id="3759876923365568382">Υπολείπονται <ph name="NUMBER_FEW"/> ημέρες</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - Ειδοποιήσεις (<ph name="QUANTITY"/> μη αναγνωσμένες)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Μην ενοχλείτε</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Ελαχιστοποίηση</translation>
<translation id="6394627529324717982">Κόμμα</translation>
<translation id="4469842253116033348">Απενεργοποίηση ειδοποιήσεων από τον ιστότοπο <ph name="SITE"/></translation>
<translation id="3036649622769666520">Άνοιγμα Αρχείων</translation>
<translation id="8328145009876646418">Αριστερή άκρη</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> δευτερόλεπτα</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_en-GB.xtb b/chromium/ui/base/strings/ui_strings_en-GB.xtb
index e630ad12c04..fbe4dbd26d6 100644
--- a/chromium/ui/base/strings/ui_strings_en-GB.xtb
+++ b/chromium/ui/base/strings/ui_strings_en-GB.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> secs left</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> secs left</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> mins left</translation>
<translation id="1801827354178857021">Full Stop</translation>
<translation id="1190609913194133056">Notification Centre</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> minutes left</translation>
<translation id="5613020302032141669">Left Arrow</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> File (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> secs</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> hours left</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Cancel</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Up Arrow</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> mins</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> mins left</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> days left</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> secs left</translation>
<translation id="3909791450649380159">Cu&amp;t</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutes left</translation>
<translation id="688711909580084195">Untitled Web Page</translation>
+<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="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>
<translation id="3234408098842461169">Down Arrow</translation>
<translation id="3087734570205094154">Bottom</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> min left</translation>
<translation id="1860796786778352021">Notification close</translation>
<translation id="6364916375976753737">Scroll Left</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</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="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>
<translation id="8210608804940886430">Page Down</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Yesterday</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> mins left</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
<translation id="8428213095426709021">Settings</translation>
<translation id="2497284189126895209">All Files</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> day ago</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sec</translation>
<translation id="7814458197256864873">&amp;Copy</translation>
<translation id="3889424535448813030">Right Arrow</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> sec ago</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> secs left</translation>
<translation id="6829324100069873704">Go back to notifications</translation>
<translation id="6528179044667508675">Do not disturb</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> seconds</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Notifications</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Scroll to Here</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hours</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Today</translation>
<translation id="7960078400008666149">Do not disturb for one hour</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> days</translation>
<translation id="2190355936436201913">(empty)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> hours left</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> sec left</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Scroll Right</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hour left</translation>
<translation id="2666092431469916601">Top</translation>
<translation id="8331626408530291785">Scroll Up</translation>
<translation id="4773379706300191099">Disable notifications from <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Open File</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> hours ago</translation>
<translation id="815598010540052116">Scroll Down</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restore</translation>
+<translation id="1243314992276662751">Upload</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> day left</translation>
<translation id="8179976553408161302">Enter</translation>
<translation id="945522503751344254">Send feedback</translation>
<translation id="9170848237812810038">&amp;Undo</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">Allow notifications from the following for each user:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> second</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Settings...</translation>
<translation id="6845383723252244143">Select Folder</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> seconds</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> secs</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> days</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> hour</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> min ago</translation>
+<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="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="436869212180315161">Press</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutes</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minutes left</translation>
<translation id="6040143037577758943">Close</translation>
+<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="8226233771743600312">Do not disturb for one day</translation>
<translation id="7457942297256758195">Clear All</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - Notifications</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mins</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> days left</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutes</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> hours left</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> secs</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> secs</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> days left</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - Notifications (<ph name="QUANTITY"/> unread)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Do Not Disturb</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimise</translation>
<translation id="6394627529324717982">Comma</translation>
<translation id="4469842253116033348">Disable notifications from <ph name="SITE"/></translation>
<translation id="3036649622769666520">Open Files</translation>
<translation id="8328145009876646418">Left Edge</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconds</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_es-419.xtb b/chromium/ui/base/strings/ui_strings_es-419.xtb
index 02a4c88e73f..8ad1a3de438 100644
--- a/chromium/ui/base/strings/ui_strings_es-419.xtb
+++ b/chromium/ui/base/strings/ui_strings_es-419.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Insert</translation>
<translation id="6135826906199951471">Supr</translation>
<translation id="528468243742722775">Fin</translation>
+<translation id="5341849548509163798">Hace <ph name="NUMBER_MANY"/> horas</translation>
+<translation id="6310545596129886942">Faltan <ph name="NUMBER_FEW"/> segundos</translation>
+<translation id="9213479837033539041">Faltan <ph name="NUMBER_MANY"/> segundos</translation>
+<translation id="1209866192426315618">Faltan <ph name="NUMBER_DEFAULT"/> minutos</translation>
<translation id="1801827354178857021">Punto</translation>
<translation id="1190609913194133056">Centro de notificaciones</translation>
+<translation id="7470933019269157899">Faltan <ph name="NUMBER_DEFAULT"/> minutos.</translation>
<translation id="5613020302032141669">Flecha izquierda</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> Archivo (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> seg.</translation>
+<translation id="7511635910912978956">Faltan <ph name="NUMBER_FEW"/> horas</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Cancelar</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Flecha arriba</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutos</translation>
+<translation id="3520476450377425184">Faltan <ph name="NUMBER_MANY"/> días</translation>
<translation id="932327136139879170">Inicio</translation>
+<translation id="5600907569873192868">Faltan <ph name="NUMBER_MANY"/> minutos</translation>
+<translation id="8666066831007952346">Faltan <ph name="NUMBER_TWO"/> días</translation>
+<translation id="6390842777729054533">Faltan <ph name="NUMBER_ZERO"/> segundos</translation>
<translation id="3909791450649380159">Cor&amp;tar</translation>
+<translation id="2560788951337264832">Faltan <ph name="NUMBER_ZERO"/> minutos.</translation>
<translation id="688711909580084195">Página web sin título</translation>
+<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="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>
<translation id="3234408098842461169">Flecha abajo</translation>
<translation id="3087734570205094154">Inferior</translation>
+<translation id="5935630983280450497">Falta <ph name="NUMBER_ONE"/> minuto</translation>
<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="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="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>
<translation id="8210608804940886430">Avanzar página</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> seg.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543">Hace <ph name="NUMBER_MANY"/> segundos</translation>
+<translation id="7781829728241885113">Ayer</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
+<translation id="50960180632766478">Faltan <ph name="NUMBER_FEW"/> minutos</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>
<translation id="8428213095426709021">Configuración</translation>
<translation id="2497284189126895209">Todos los archivos</translation>
+<translation id="7487278341251176613">Faltan <ph name="NUMBER_TWO"/> minutos.</translation>
+<translation id="5110450810124758964">Hace <ph name="NUMBER_ONE"/> día</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> segundo</translation>
<translation id="7814458197256864873">&amp;Copiar</translation>
<translation id="3889424535448813030">Flecha derecha</translation>
+<translation id="4229495110203539533">Hace <ph name="NUMBER_ONE"/> segundo</translation>
+<translation id="2544782972264605588">Faltan <ph name="NUMBER_DEFAULT"/> segundos</translation>
<translation id="6829324100069873704">Volver a las notificaciones</translation>
<translation id="6528179044667508675">No molestar</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> segundos</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Notificaciones</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Desplazarse hasta aquí</translation>
<translation id="4552416320897244156">AvPág</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> horas</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Hoy</translation>
<translation id="7960078400008666149">No molestar durante una hora</translation>
+<translation id="4373894838514502496">Hace <ph name="NUMBER_FEW"/> minutos</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> días</translation>
<translation id="2190355936436201913">(vacío)</translation>
+<translation id="1164369517022005061">Faltan <ph name="NUMBER_DEFAULT"/> horas</translation>
+<translation id="152482086482215392">Falta <ph name="NUMBER_ONE"/> segundo</translation>
<translation id="8447116497070723931">RePág</translation>
<translation id="4588090240171750605">Desplazar a la derecha</translation>
+<translation id="7414887922320653780">Falta <ph name="NUMBER_ONE"/> hora</translation>
<translation id="2666092431469916601">Superior</translation>
<translation id="8331626408530291785">Desplazar hacia arriba</translation>
<translation id="4773379706300191099">Inhabilitar las notificaciones de <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Abrir archivo</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">Hace <ph name="NUMBER_DEFAULT"/> horas</translation>
<translation id="815598010540052116">Desplazar hacia abajo</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restaurar</translation>
+<translation id="1243314992276662751">Cargar</translation>
+<translation id="50030952220075532">Falta <ph name="NUMBER_ONE"/> día</translation>
<translation id="8179976553408161302">Entrar</translation>
<translation id="945522503751344254">Enviar comentarios</translation>
<translation id="9170848237812810038">&amp;Deshacer</translation>
+<translation id="1285266685456062655">Hace <ph name="NUMBER_FEW"/> horas</translation>
+<translation id="6918245111648057970">Permitir notificaciones para cada usuario de lo siguiente:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> segundo</translation>
+<translation id="3994835489895548312">Faltan <ph name="NUMBER_MANY"/> minutos.</translation>
+<translation id="6358975074282722691">Hace <ph name="NUMBER_TWO"/> segundos</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Configuración...</translation>
<translation id="6845383723252244143">Seleccionar carpeta</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> seconds</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> seg.</translation>
<translation id="5583640892426849032">Tecla de retroceso</translation>
+<translation id="5263972071113911534">Hace <ph name="NUMBER_MANY"/> días</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> días</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> hora</translation>
+<translation id="2679312662830811292">Hace <ph name="NUMBER_ONE"/> minuto</translation>
+<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="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="436869212180315161">Hacer clic</translation>
+<translation id="4860787810836767172">Hace <ph name="NUMBER_FEW"/> segundos</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutes</translation>
+<translation id="1858722859751911017">Faltan <ph name="NUMBER_FEW"/> minutos.</translation>
<translation id="6040143037577758943">Cerrar</translation>
+<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="8226233771743600312">No molestar durante un día</translation>
<translation id="7457942297256758195">Borrar todo</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/>: Notificaciones</translation>
+<translation id="822618367988303761">Hace <ph name="NUMBER_TWO"/> días</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutos</translation>
+<translation id="1963692530539281474">Faltan <ph name="NUMBER_DEFAULT"/> días</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutes</translation>
+<translation id="5906719743126878045">Faltan <ph name="NUMBER_TWO"/> horas</translation>
+<translation id="8959208747503200525">Hace <ph name="NUMBER_TWO"/> horas</translation>
<translation id="8400147561352026160">Mayús+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> seg.</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> seg.</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382">Faltan <ph name="NUMBER_FEW"/> días</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/>: Notificaciones (<ph name="QUANTITY"/> sin leer)</translation>
<translation id="6965382102122355670">Aceptar</translation>
<translation id="7850320739366109486">No molestar</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimizar</translation>
<translation id="6394627529324717982">Coma</translation>
<translation id="4469842253116033348">Inhabilitar las notificaciones desde <ph name="SITE"/></translation>
<translation id="3036649622769666520">Abrir archivos</translation>
<translation id="8328145009876646418">Borde izquierdo</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconds</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_es.xtb b/chromium/ui/base/strings/ui_strings_es.xtb
index 0e0192f2306..5394cc732bc 100644
--- a/chromium/ui/base/strings/ui_strings_es.xtb
+++ b/chromium/ui/base/strings/ui_strings_es.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Insert</translation>
<translation id="6135826906199951471">Supr</translation>
<translation id="528468243742722775">Fin</translation>
+<translation id="5341849548509163798">hace <ph name="NUMBER_MANY"/> horas</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> segundos restantes</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> segundos restantes</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minutos restantes</translation>
<translation id="1801827354178857021">Punto</translation>
<translation id="1190609913194133056">Centro de notificaciones</translation>
+<translation id="7470933019269157899">Quedan <ph name="NUMBER_DEFAULT"/> minutos</translation>
<translation id="5613020302032141669">Flecha izquierda</translation>
<translation id="8602707065186045623">Archivo <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> seg.</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> horas restantes</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Cancelar</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Flecha arriba</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutos</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> días restantes</translation>
<translation id="932327136139879170">Inicio</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minutos restantes</translation>
+<translation id="8666066831007952346">Faltan <ph name="NUMBER_TWO"/> días</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> segundos restantes</translation>
<translation id="3909791450649380159">Cor&amp;tar</translation>
+<translation id="2560788951337264832">Quedan <ph name="NUMBER_ZERO"/> minutos</translation>
<translation id="688711909580084195">Página web sin título</translation>
+<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="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>
<translation id="3234408098842461169">Flecha abajo</translation>
<translation id="3087734570205094154">Inferior</translation>
+<translation id="5935630983280450497">Falta <ph name="NUMBER_ONE"/> minuto</translation>
<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="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="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>
<translation id="8210608804940886430">Avanzar página</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> seg.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutos</translation>
+<translation id="7275974018215686543">hace <ph name="NUMBER_MANY"/> segundos</translation>
+<translation id="7781829728241885113">Ayer</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutos</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutos restantes</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>
<translation id="8428213095426709021">Configuración</translation>
<translation id="2497284189126895209">Todos los archivos</translation>
+<translation id="7487278341251176613">Quedan <ph name="NUMBER_TWO"/> minutos</translation>
+<translation id="5110450810124758964">hace <ph name="NUMBER_ONE"/> día</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> segundo</translation>
<translation id="7814458197256864873">&amp;Copiar</translation>
<translation id="3889424535448813030">Flecha derecha</translation>
+<translation id="4229495110203539533">hace <ph name="NUMBER_ONE"/> segundo</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> segundos restantes</translation>
<translation id="6829324100069873704">Volver a las notificaciones</translation>
<translation id="6528179044667508675">No molestar</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> segundos</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Notificaciones</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Desplazarse hasta aquí</translation>
<translation id="4552416320897244156">AvPág</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> horas</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Hoy</translation>
<translation id="7960078400008666149">No molestar durante una hora</translation>
+<translation id="4373894838514502496">hace <ph name="NUMBER_FEW"/> minutos</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> días</translation>
<translation id="2190355936436201913">(vacío)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> horas restantes</translation>
+<translation id="152482086482215392">Falta <ph name="NUMBER_ONE"/> segundo</translation>
<translation id="8447116497070723931">RePág</translation>
<translation id="4588090240171750605">Desplazar a la derecha</translation>
+<translation id="7414887922320653780">Falta <ph name="NUMBER_ONE"/> hora</translation>
<translation id="2666092431469916601">Superior</translation>
<translation id="8331626408530291785">Desplazar hacia arriba</translation>
<translation id="4773379706300191099">Inhabilitar notificaciones de <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Abrir archivo</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">hace <ph name="NUMBER_DEFAULT"/> horas</translation>
<translation id="815598010540052116">Desplazar hacia abajo</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restaurar</translation>
+<translation id="1243314992276662751">Subir</translation>
+<translation id="50030952220075532">Falta <ph name="NUMBER_ONE"/> día</translation>
<translation id="8179976553408161302">Entrar</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>
+<translation id="6918245111648057970">Permitir que cada usuario reciba notificaciones de:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> segundo</translation>
+<translation id="3994835489895548312">Quedan <ph name="NUMBER_MANY"/> minutos</translation>
+<translation id="6358975074282722691">hace <ph name="NUMBER_TWO"/> segundos</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Configuración...</translation>
<translation id="6845383723252244143">Seleccionar carpeta</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> segundos</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> seg.</translation>
<translation id="5583640892426849032">Tecla de retroceso</translation>
+<translation id="5263972071113911534">hace <ph name="NUMBER_MANY"/> días</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> días</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> hora</translation>
+<translation id="2679312662830811292">hace <ph name="NUMBER_ONE"/> minuto</translation>
+<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="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="436869212180315161">Pulsar</translation>
+<translation id="4860787810836767172">hace <ph name="NUMBER_FEW"/> segundos</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutos</translation>
+<translation id="1858722859751911017">Quedan <ph name="NUMBER_FEW"/> minutos</translation>
<translation id="6040143037577758943">Cerrar</translation>
+<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="8226233771743600312">No molestar durante un día</translation>
<translation id="7457942297256758195">Borrar todo</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/>: notificaciones</translation>
+<translation id="822618367988303761">hace <ph name="NUMBER_TWO"/> días</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutos</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> días restantes</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutos</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> horas restantes</translation>
+<translation id="8959208747503200525">hace <ph name="NUMBER_TWO"/> horas</translation>
<translation id="8400147561352026160">Mayús+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> seg.</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> seg.</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> segundos</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> días restantes</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/>: notificaciones (<ph name="QUANTITY"/> sin leer)</translation>
<translation id="6965382102122355670">Aceptar</translation>
<translation id="7850320739366109486">No molestar</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimizar</translation>
<translation id="6394627529324717982">Coma</translation>
<translation id="4469842253116033348">Inhabilitar notificaciones de <ph name="SITE"/></translation>
<translation id="3036649622769666520">Abrir archivos</translation>
<translation id="8328145009876646418">Borde izquierdo</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> segundos</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_et.xtb b/chromium/ui/base/strings/ui_strings_et.xtb
index 321cce9d448..d5d9b6b63ab 100644
--- a/chromium/ui/base/strings/ui_strings_et.xtb
+++ b/chromium/ui/base/strings/ui_strings_et.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> tundi tagasi</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> sekundit jäänud</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> sekundit jäänud</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minutit jäänud</translation>
<translation id="1801827354178857021">Periood</translation>
<translation id="1190609913194133056">Märguannete keskus</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> minutit on jäänud</translation>
<translation id="5613020302032141669">Vasaknool</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> Fail (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> sekundit</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> tundi jäänud</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Tühista</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Ülesnool</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutit</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/>päeva jäänud</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minutit jäänud</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> päeva jäänud</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> sekundit jäänud</translation>
<translation id="3909791450649380159">Lõ&amp;ika</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutit on jäänud</translation>
<translation id="688711909580084195">Nimeta veebileht</translation>
+<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="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>
<translation id="3234408098842461169">Allanool</translation>
<translation id="3087734570205094154">Alaserv</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minutit jäänud</translation>
<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="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="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>
<translation id="8210608804940886430">Lehekülje lõppu</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> sekundit</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> sekundit tagasi</translation>
+<translation id="7781829728241885113">Eile</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutit jäänud</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>
<translation id="8428213095426709021">Seaded</translation>
<translation id="2497284189126895209">Kõik failid</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutit on jäänud</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> päev tagasi</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sekundit</translation>
<translation id="7814458197256864873">&amp;Kopeeri</translation>
<translation id="3889424535448813030">Paremnool</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> sekund tagasi</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> sekundit jäänud</translation>
<translation id="6829324100069873704">Tagasi märguannete juurde</translation>
<translation id="6528179044667508675">Mitte segada</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> sekundit</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Teatised</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Keri siia</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> tundi</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
+<translation id="2148716181193084225">Täna</translation>
<translation id="7960078400008666149">Mitte segada üks tund</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> minutit tagasi</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> päeva</translation>
<translation id="2190355936436201913">(tühi)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> tundi jäänud</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> sekundit jäänud</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Keri paremale</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> tundi jäänud</translation>
<translation id="2666092431469916601">Üles</translation>
<translation id="8331626408530291785">Keri üles</translation>
<translation id="4773379706300191099">Keela märguanded laiendusest <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Faili avamine</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> tundi tagasi</translation>
<translation id="815598010540052116">Keri alla</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Taasta</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="945522503751344254">Saada tagasisidet</translation>
<translation id="9170848237812810038">&amp;Võta tagasi</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> tundi tagasi</translation>
+<translation id="6918245111648057970">Luba järgmised märguanded iga kasutaja puhul:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> sekund</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutit on jäänud</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> sekundit tagasi</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Seaded...</translation>
<translation id="6845383723252244143">Kausta valimine</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> seconds</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> sekundit</translation>
<translation id="5583640892426849032">Tagasilükkeklahv</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> päeva tagasi</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> päeva</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> tund</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> minut tagasi</translation>
+<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="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="436869212180315161">Vajuta</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> sekundit tagasi</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutes</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minutit on jäänud</translation>
<translation id="6040143037577758943">Sule</translation>
+<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="8226233771743600312">Mitte segada üks päev</translation>
<translation id="7457942297256758195">Kustuta kõik</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – märguanded</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> päeva tagasi</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutit</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> päeva jäänud</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutes</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> tundi jäänud</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> tundi tagasi</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> sekundit</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> sekundit</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> päeva jäänud</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – märguanded (<ph name="QUANTITY"/> lugemata)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Mitte segada</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimeeri</translation>
<translation id="6394627529324717982">Koma</translation>
<translation id="4469842253116033348">Keela teated saidilt <ph name="SITE"/></translation>
<translation id="3036649622769666520">Failide avamine</translation>
<translation id="8328145009876646418">Vasak serv</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconds</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_fa.xtb b/chromium/ui/base/strings/ui_strings_fa.xtb
index 71748be89a5..2cb91114128 100644
--- a/chromium/ui/base/strings/ui_strings_fa.xtb
+++ b/chromium/ui/base/strings/ui_strings_fa.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">حذف</translation>
<translation id="528468243742722775">پایان</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> secs left</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> secs left</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> دقیقه مانده</translation>
<translation id="1801827354178857021">دوره</translation>
<translation id="1190609913194133056">مرکز اعلان</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> دقیقه باقیمانده</translation>
<translation id="5613020302032141669">پیکان چپ</translation>
<translation id="8602707065186045623">فایل <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> secs</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> hours left</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">لغو</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> بایت</translation>
<translation id="3660179305079774227">پیکان بالا</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> مگابایت/ثانیه</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ساعت</translation>
<translation id="3990502903496589789">حاشیه راست</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> دقیقه</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation>
<translation id="932327136139879170">صفحهٔ اصلی</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> mins left</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> days left</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> secs left</translation>
<translation id="3909791450649380159">&amp;برش</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> دقیقه باقیمانده</translation>
<translation id="688711909580084195">صفحهٔ وب بدون عنوان</translation>
+<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;جاگذاری</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> ترابایت</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>
<translation id="3234408098842461169">پیکان پایین</translation>
<translation id="3087734570205094154">پایین</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> دقیقه مانده</translation>
<translation id="1860796786778352021">بستن اعلان</translation>
<translation id="6364916375976753737">پیمایش به چپ</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> ساعت قبل</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> دقیقه باقیمانده</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> دقیقه</translation>
<translation id="8210608804940886430">Page Down</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> کیلوبایت</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> دقیقه</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">دیروز</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> دقیقه</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> mins left</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> مگابایت</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> روز قبل</translation>
<translation id="8428213095426709021">تنظیمات</translation>
<translation id="2497284189126895209">همه فایل‌ها</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> دقیقه باقیمانده</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> روز قبل</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> ثانیه</translation>
<translation id="7814458197256864873">&amp;کپی</translation>
<translation id="3889424535448813030">پیکان راست</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> ثانیه قبل</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> ثانیه مانده</translation>
<translation id="6829324100069873704">بازگشت به اعلان‌ها</translation>
<translation id="6528179044667508675">مزاحم نشوید</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> ثانیه</translation>
+<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="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="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="7634624804467787019"><ph name="NUMBER_ONE"/> دقیقه</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">اینجا خبری نیست، برگردید.</translation>
<translation id="2482878487686419369">اعلام ها</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">پیمایش به اینجا</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hours</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> کیلوبایت/ثانیه</translation>
+<translation id="2148716181193084225">امروز</translation>
<translation id="7960078400008666149">یک ساعت مزاحم نشوید</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> days</translation>
<translation id="2190355936436201913">(خالی)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> ساعت مانده</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> ثانیه مانده</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">پیمایش به راست</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ساعت مانده</translation>
<translation id="2666092431469916601">بالا</translation>
<translation id="8331626408530291785">پیمایش به بالا</translation>
<translation id="4773379706300191099">از کار انداختن اعلان‌های <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">باز کردن فایل</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> ساعت قبل</translation>
<translation id="815598010540052116">پیمایش به پایین</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">بازیابی</translation>
+<translation id="1243314992276662751">آپلود</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> روز مانده</translation>
<translation id="8179976553408161302">ورود</translation>
<translation id="945522503751344254">ارسال بازخورد</translation>
<translation id="9170848237812810038">&amp;واگرد</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">دریافت اعلان از موارد زیر برای هر کاربر مجاز است:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> ثانیه</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> دقیقه باقیمانده</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> پتابایت</translation>
<translation id="2983818520079887040">تنظیمات...</translation>
<translation id="6845383723252244143">انتخاب پوشه</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> ثانیه</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> secs</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> days</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> ساعت</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> min ago</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> ثانیه قبل</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation>
<translation id="4570886800634958009">باز کردن اعلان</translation>
<translation id="436869212180315161">فشار دادن</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> ترابایت/ثانیه</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> دقیقه</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> دقیقه باقیمانده</translation>
<translation id="6040143037577758943">بستن</translation>
+<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> بایت/ثانیه</translation>
<translation id="7649070708921625228">راهنما</translation>
<translation id="8226233771743600312">یک روز مزاحم نشوید</translation>
<translation id="7457942297256758195">پاک کردن همه</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - اعلان‌ها</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mins</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> روز مانده</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> دقیقه</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> hours left</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> ثانیه</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> secs</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> ثانیه</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> days left</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> پتابایت/ثانیه</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - اعلان (<ph name="QUANTITY"/> خوانده نشده)</translation>
<translation id="6965382102122355670">تأیید</translation>
<translation id="7850320739366109486">مزاحم نشوید</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">کوچک کردن</translation>
<translation id="6394627529324717982">کاما</translation>
<translation id="4469842253116033348">غیر فعال کردن اعلام های <ph name="SITE"/></translation>
<translation id="3036649622769666520">باز کردن فایل‌ها</translation>
<translation id="8328145009876646418">حاشیه چپ</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> ثانیه</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_fi.xtb b/chromium/ui/base/strings/ui_strings_fi.xtb
index ebfac8b48be..a6b04bf63eb 100644
--- a/chromium/ui/base/strings/ui_strings_fi.xtb
+++ b/chromium/ui/base/strings/ui_strings_fi.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> sekuntia jäljellä</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> sekuntia jäljellä</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minuuttia jäljellä</translation>
<translation id="1801827354178857021">Piste</translation>
<translation id="1190609913194133056">Ilmoituskeskus</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> minuuttia jäljellä</translation>
<translation id="5613020302032141669">Nuoli vas.</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/>-tiedosto (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> sekuntia</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> tuntia jäljellä</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Peruuta</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> t</translation>
<translation id="3660179305079774227">Nuoli yl.</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minuuttia</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> päivää jäljellä</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minuuttia jäljellä</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> päivää jäljellä</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> sekuntia jäljellä</translation>
<translation id="3909791450649380159">L&amp;eikkaa</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutes left</translation>
<translation id="688711909580084195">Nimetön verkkosivu</translation>
+<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="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>
<translation id="3234408098842461169">Nuoli al.</translation>
<translation id="3087734570205094154">Alaosa</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minuuttia jäljellä</translation>
<translation id="1860796786778352021">Ilmoitus sulje</translation>
<translation id="6364916375976753737">Vieritä vasemmalle</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> tunti sitten</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="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>
<translation id="8210608804940886430">Sivu alas</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> sekuntia</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kt</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Eilen</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minuuttia jäljellä</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>
<translation id="8428213095426709021">Asetukset</translation>
<translation id="2497284189126895209">Kaikki tiedostot</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> päivä sitten</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sekuntia</translation>
<translation id="7814458197256864873">K&amp;opioi</translation>
<translation id="3889424535448813030">Nuoli oik.</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> sekunti sitten</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> sekuntia jäljellä</translation>
<translation id="6829324100069873704">Palaa ilmoituksiin</translation>
<translation id="6528179044667508675">Älä häiritse</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> sekuntia</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Ilmoitukset</translation>
+<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="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> tuntia</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kt/s</translation>
+<translation id="2148716181193084225">Tänään</translation>
<translation id="7960078400008666149">Älä häiritse tuntiin</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> päivää</translation>
<translation id="2190355936436201913">(tyhjä)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> tuntia jäljellä</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> sekuntia jäljellä</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Vieritä oikealle</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> tuntia jäljellä</translation>
<translation id="2666092431469916601">Yleisin</translation>
<translation id="8331626408530291785">Vieritä ylös</translation>
<translation id="4773379706300191099">Poista ilmoitukset käytöstä laajennukselta <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Avaa tiedosto</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> tuntia sitten</translation>
<translation id="815598010540052116">Vieritä alas</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Palauta</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="945522503751344254">Lähetä palautetta</translation>
<translation id="9170848237812810038">K&amp;umoa</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">Salli seuraavat ilmoitukset kaikilta käyttäjiltä:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> sekunti</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> Pt</translation>
<translation id="2983818520079887040">Asetukset...</translation>
<translation id="6845383723252244143">Valitse kansio</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> seconds</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> sekuntia</translation>
<translation id="5583640892426849032">Askelpalautin</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> päivää</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> tuntia</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> minuutti sitten</translation>
+<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="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="436869212180315161">Paina</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> Tt/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minuuttia</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minutes left</translation>
<translation id="6040143037577758943">Sulje</translation>
+<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="8226233771743600312">Älä häiritse päivään</translation>
<translation id="7457942297256758195">Tyhjennä kaikki</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – ilmoitukset</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minuuttia</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> päivää jäljellä</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutes</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> tuntia jäljellä</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> sekuntia</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> sekuntia</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> päivää jäljellä</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> Pt/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – ilmoitukset (lukematta: <ph name="QUANTITY"/>)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Älä häiritse</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Pienennä</translation>
<translation id="6394627529324717982">Pilkku</translation>
<translation id="4469842253116033348">Poista sivuston <ph name="SITE"/> ilmoitukset käytöstä</translation>
<translation id="3036649622769666520">Avaa tiedostot</translation>
<translation id="8328145009876646418">Vasen reuna</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconds</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_fil.xtb b/chromium/ui/base/strings/ui_strings_fil.xtb
index 6bbc088508c..5ef326400c3 100644
--- a/chromium/ui/base/strings/ui_strings_fil.xtb
+++ b/chromium/ui/base/strings/ui_strings_fil.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">Wakas na</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> mga oras ang nakalipas</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/>nalalabing seg</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> mga natitirang segundo</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> nalalabing mga minuto</translation>
<translation id="1801827354178857021">Tuldok</translation>
<translation id="1190609913194133056">Notification Center</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> (na) minuto ang natitira</translation>
<translation id="5613020302032141669">KAliwang Arrow</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> File (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> segundo</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> natitirang oras</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Kanselahin</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> (na) B</translation>
<translation id="3660179305079774227">Up Arrow</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> mga minuto</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> mga nalalabing araw</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> natitirang minuto</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> natitirang mga araw</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> mga natitirang segundo</translation>
<translation id="3909791450649380159">Al&amp;isin</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutes left</translation>
<translation id="688711909580084195">Walang Pamagat na Webpage</translation>
+<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="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>
<translation id="3234408098842461169">Down Arrow</translation>
<translation id="3087734570205094154">Sa ilalim</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> natitirang minuto</translation>
<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="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="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>
<translation id="8210608804940886430">Page Down</translation>
+<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="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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> segundo ang nakalipas</translation>
+<translation id="7781829728241885113">Kahapon</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuto</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> natitirang minuto</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>
<translation id="8428213095426709021">Mga Setting</translation>
<translation id="2497284189126895209">Lahat ng Mga File</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> araw ang nakalipas</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> segundo</translation>
<translation id="7814458197256864873">&amp;Kopyahin</translation>
<translation id="3889424535448813030">Right Arrow</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> segundo ang nakalipas</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> mga natitirang segundo</translation>
<translation id="6829324100069873704">Bumalik sa mga notification</translation>
<translation id="6528179044667508675">Huwag istorbohin</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> (na) segundo</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Mga Abiso</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Mag-scroll dito</translation>
<translation id="4552416320897244156">PgDwn</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>
+<translation id="2148716181193084225">Ngayon</translation>
<translation id="7960078400008666149">Huwag istorbohin sa loob ng isang oras</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> minuto ang nakalipas</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> mga araw</translation>
<translation id="2190355936436201913">(walang laman)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> mga natitirang oras</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> natitirang segundo</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Mag-scroll Pakanan</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> natitirang oras</translation>
<translation id="2666092431469916601">Tuktok</translation>
<translation id="8331626408530291785">Mag-scroll Pataas</translation>
<translation id="4773379706300191099">I-disable ang mga notification mula sa <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Buksan ang File</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> na oras ang nakalipas</translation>
<translation id="815598010540052116">Mag-scroll Pababa</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Ipanumbalik</translation>
+<translation id="1243314992276662751">I-upload</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> natitirang araw</translation>
<translation id="8179976553408161302">Pumasok</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>
+<translation id="6918245111648057970">Payagan ang mga notification mula sa sumusunod para sa bawat user:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> segundo</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> segundo ang nakalipas</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> (na) PB</translation>
<translation id="2983818520079887040">Mga Setting...</translation>
<translation id="6845383723252244143">Piliin ang Folder</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> (na) segundo</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> seg</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> araw ang nakalipas</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> mga araw</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> oras</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> minuto ang nakalipas</translation>
+<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="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="436869212180315161">Pindutin</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> segundo ang nakalipas</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> (na) TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> na minuto</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minutes left</translation>
<translation id="6040143037577758943">Isara</translation>
+<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="8226233771743600312">Huwag istorbohin sa loob ng isang araw</translation>
<translation id="7457942297256758195">I-clear Lahat</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - Mga Notification</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> araw ang nakalipas</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mga minuto</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> mga natitirang araw</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> (na) minuto</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> mga oras na nalalabi</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> oras ang nakalipas</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> seg</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> seg</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> (na) segundo</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> mga natitirang araw</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> (na) PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - Mga Notification (<ph name="QUANTITY"/> ang hindi pa nababasa)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Huwag Istorbohin</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimize</translation>
<translation id="6394627529324717982">Kuwit</translation>
<translation id="4469842253116033348">Huwag paganahin ang mga abiso mula sa <ph name="SITE"/></translation>
<translation id="3036649622769666520">Buksan ang Mga File</translation>
<translation id="8328145009876646418">Kalwang Edge</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> segundo</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_fr.xtb b/chromium/ui/base/strings/ui_strings_fr.xtb
index 3c88329d959..d6d48faca18 100644
--- a/chromium/ui/base/strings/ui_strings_fr.xtb
+++ b/chromium/ui/base/strings/ui_strings_fr.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Insér.</translation>
<translation id="6135826906199951471">Suppr</translation>
<translation id="528468243742722775">Fin</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> secondes restantes</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> secondes restantes</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minutes restantes</translation>
<translation id="1801827354178857021">Point</translation>
<translation id="1190609913194133056">Centre de notification</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> minutes restantes</translation>
<translation id="5613020302032141669">Gauche</translation>
<translation id="8602707065186045623">Fichier <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> secondes</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> heures restantes</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Annuler</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> o</translation>
<translation id="3660179305079774227">Haut</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutes</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> jours restants</translation>
<translation id="932327136139879170">Début</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minutes restantes</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> jours restants</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> secondes restantes</translation>
<translation id="3909791450649380159">Cou&amp;per</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutes left</translation>
<translation id="688711909580084195">Page Web sans titre</translation>
+<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="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>
<translation id="3234408098842461169">Bas</translation>
<translation id="3087734570205094154">Bas</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minute restante</translation>
<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="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="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>
<translation id="8210608804940886430">Page suivante</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> secondes</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> Ko</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Hier</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutes restantes</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>
<translation id="8428213095426709021">Paramètres</translation>
<translation id="2497284189126895209">Tous les fichiers</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964">il y a <ph name="NUMBER_ONE"/> jour</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> seconde</translation>
<translation id="7814458197256864873">&amp;Copier</translation>
<translation id="3889424535448813030">Droite</translation>
+<translation id="4229495110203539533">il y a <ph name="NUMBER_ONE"/> seconde</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> secondes restantes</translation>
<translation id="6829324100069873704">Revenir aux notifications</translation>
<translation id="6528179044667508675">Ne pas déranger</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> secondes</translation>
+<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="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="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="7634624804467787019"><ph name="NUMBER_ONE"/> minute</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Aucune notification</translation>
<translation id="2482878487686419369">Notifications</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Défilement jusqu'ici</translation>
<translation id="4552416320897244156">PgSuiv</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> heures</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> Ko/s</translation>
+<translation id="2148716181193084225">Aujourd'hui</translation>
<translation id="7960078400008666149">Ne pas déranger pendant une heure</translation>
+<translation id="4373894838514502496">il y a <ph name="NUMBER_FEW"/> minutes</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> jours</translation>
<translation id="2190355936436201913">(vide)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> heures restantes</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> seconde restante</translation>
<translation id="8447116497070723931">PgPréc</translation>
<translation id="4588090240171750605">Défilement vers la droite</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> heure restante</translation>
<translation id="2666092431469916601">En haut</translation>
<translation id="8331626408530291785">Défilement vers le haut</translation>
<translation id="4773379706300191099">Désactiver les notifications de l'extension &quot;<ph name="EXTENSION_NAME"/>&quot;</translation>
<translation id="7907591526440419938">Ouvrir le fichier</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Échap</translation>
+<translation id="2797524280730715045">il y a <ph name="NUMBER_DEFAULT"/> heures</translation>
<translation id="815598010540052116">Défilement vers le bas</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restaurer</translation>
+<translation id="1243314992276662751">Importer</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> jour restant</translation>
<translation id="8179976553408161302">Entrer</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>
+<translation id="6918245111648057970">Autoriser les notifications issues des éléments suivants pour chaque utilisateur :</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> seconde</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> Po</translation>
<translation id="2983818520079887040">Paramètres...</translation>
<translation id="6845383723252244143">Sélectionner un dossier</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> seconds</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> secondes</translation>
<translation id="5583640892426849032">Retour</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> jours</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> heure</translation>
+<translation id="2679312662830811292">il y a <ph name="NUMBER_ONE"/> minute</translation>
+<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="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="436869212180315161">Cliquer</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> To/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutes</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minutes left</translation>
<translation id="6040143037577758943">Fermer</translation>
+<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="8226233771743600312">Ne pas déranger pendant un jour</translation>
<translation id="7457942297256758195">Tout effacer</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – Notifications</translation>
+<translation id="822618367988303761">il y a <ph name="NUMBER_TWO"/> jours</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutes</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> jours restants</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutes</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> heures restantes</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Maj+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> secondes</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> secondes</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> jours restants</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> Po/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – Notifications (<ph name="QUANTITY"/> notifications non lues)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Ne pas déranger</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Réduire</translation>
<translation id="6394627529324717982">Virgule</translation>
<translation id="4469842253116033348">Désactiver les notifications de <ph name="SITE"/></translation>
<translation id="3036649622769666520">Ouvrir les fichiers</translation>
<translation id="8328145009876646418">Côté gauche</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconds</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_gu.xtb b/chromium/ui/base/strings/ui_strings_gu.xtb
index 555d252f722..0cf8377e178 100644
--- a/chromium/ui/base/strings/ui_strings_gu.xtb
+++ b/chromium/ui/base/strings/ui_strings_gu.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">સમાપ્ત</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> સેકંડ બાકી</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> સેકન્ડ બાકી</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> મિનિટ બાકી</translation>
<translation id="1801827354178857021">અવધિ</translation>
<translation id="1190609913194133056">સૂચના કેન્દ્ર</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> મિનિટ બાકી</translation>
<translation id="5613020302032141669">ડાબો એરો</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> ફાઇલ (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> મિનિટ પહેલા</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> સેકંડ</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> કલાક બાકી</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">રદ કરો</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> અબજ</translation>
<translation id="3660179305079774227">ઉપર એરો</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> કલાક</translation>
<translation id="3990502903496589789">જમણી કિનારી</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> મિનિટ</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> દિવસ બાકી</translation>
<translation id="932327136139879170">હોમ</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> મિનિટ બાકી</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> દિવસ બાકી</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> સેકન્ડ બાકી</translation>
<translation id="3909791450649380159">કા&amp;પો</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> મિનિટ બાકી</translation>
<translation id="688711909580084195">શીર્ષક વિનાનું વેબપૃષ્ઠ </translation>
+<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">પેસ્ટ કરો</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</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>
<translation id="3234408098842461169">નીચલો એરો</translation>
<translation id="3087734570205094154">તળિયું</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> મિનિટ બાકી</translation>
<translation id="1860796786778352021">સૂચના બંધ છે</translation>
<translation id="6364916375976753737">ડાબે સ્ક્રોલ કરો</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</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="6719684875142564568"><ph name="NUMBER_ZERO"/> કલાક</translation>
+<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> મિનિટ બાકી</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> મિનિટ</translation>
<translation id="8210608804940886430">પૃષ્ઠ નીચે</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> દિવસ</translation>
+<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> કલાક બાકી</translation>
<translation id="5329858601952122676">&amp;કાઢી નાખો</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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">ગઈ કાલે</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> મિનિટ</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> મિનિટ બાકી</translation>
<translation id="6659594942844771486">ટૅબ</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/>MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
<translation id="8428213095426709021">સેટિંગ્સ</translation>
<translation id="2497284189126895209">બધી ફાઇલો</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> મિનિટ બાકી</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> day ago</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> સેકન્ડ</translation>
<translation id="7814458197256864873">&amp;કૉપિ કરો</translation>
<translation id="3889424535448813030">જમણો એરો</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> sec ago</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> સેકંડ બાકી</translation>
<translation id="6829324100069873704">સૂચનાઓ પર પાછા જાઓ</translation>
<translation id="6528179044667508675">ખલેલ પાડશો નહીં</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> સેકંડ</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> મિનિટ</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> કલાક બાકી</translation>
<translation id="7135556860107312402">નીચેના પરથી સૂચનાઓને મંજૂરી આપો:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> મિનિટ</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">અહીં જોવા માટે કંઈ નથી, આગળ વધો.</translation>
<translation id="2482878487686419369">સૂચનાઓ</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> દિવસ</translation>
<translation id="3183922693828471536">અહીં સુધી સ્ક્રોલ કરો</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> કલાક</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">આજે</translation>
<translation id="7960078400008666149">એક કલાક માટે ખલેલ પાડશો નહીં</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> દિવસ</translation>
<translation id="2190355936436201913">(ખાલી)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> કલાક બાકી</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> સેકન્ડ બાકી</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">જમણે સ્ક્રોલ કરો</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> કલાક બાકી</translation>
<translation id="2666092431469916601">ઉપર</translation>
<translation id="8331626408530291785">ઉપર સ્ક્રોલ કરો</translation>
<translation id="4773379706300191099"><ph name="EXTENSION_NAME"/> થી સૂચનાઓને અક્ષમ કરો</translation>
<translation id="7907591526440419938">ફાઇલ ખોલો</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> દિવસ બાકી</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> hours ago</translation>
<translation id="815598010540052116">નીચે સ્ક્રોલ કરો</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> મિનિટ બાકી</translation>
<translation id="3157931365184549694">પુનઃસ્થાપિત કરો</translation>
+<translation id="1243314992276662751">અપલોડ કરો</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> દિવસ બાકી</translation>
<translation id="8179976553408161302">દાખલ કરો</translation>
<translation id="945522503751344254">પ્રતિસાદ મોકલો</translation>
<translation id="9170848237812810038">&amp;પૂર્વવત્ કરો</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">દરેક વપરાશકર્તા માટે નીચેનામાંથી સૂચનાઓની પરવાનગી આપો:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> સેકંડ</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> મિનિટ બાકી</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">સેટિંગ્સ...</translation>
<translation id="6845383723252244143">ફોલ્ડર પસંદ કરો</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> સેકંડ</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> સેકંડ</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> દિવસ</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> કલાક</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> min ago</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> સેકન્ડ બાકી</translation>
<translation id="4570886800634958009">સૂચના વિસ્તૃત છે</translation>
<translation id="436869212180315161">દબાવો</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> મિનિટ</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> મિનિટ બાકી</translation>
<translation id="6040143037577758943">બંધ કરો</translation>
+<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="8226233771743600312">એક દિવસ માટે ખલેલ પાડશો નહીં</translation>
<translation id="7457942297256758195">બધું સાફ કરો</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - સૂચનાઓ</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> મિનિટ</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> દિવસ બાકી</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> મિનિટ</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> કલાક બાકી</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> સેકંડ</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> સેકંડ</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> સેકંડ</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> દિવસ બાકી</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - સૂચનાઓ (<ph name="QUANTITY"/> વાંચ્યા વગરની)</translation>
<translation id="6965382102122355670">ઓકે</translation>
<translation id="7850320739366109486">ખલેલ પાડશો નહીં</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> દિવસ પહેલા</translation>
<translation id="5941711191222866238">નાનું કરો</translation>
<translation id="6394627529324717982">અલ્પવિરામ</translation>
<translation id="4469842253116033348"><ph name="SITE"/> તરફની સૂચનાઓ અક્ષમ કરો </translation>
<translation id="3036649622769666520">ફાઇલો ખોલો</translation>
<translation id="8328145009876646418">ડાબી કિનારી</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> સેકંડ</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_hi.xtb b/chromium/ui/base/strings/ui_strings_hi.xtb
index 7f340c7df2d..3b842bc2126 100644
--- a/chromium/ui/base/strings/ui_strings_hi.xtb
+++ b/chromium/ui/base/strings/ui_strings_hi.xtb
@@ -5,88 +5,183 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">समाप्त</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> घंटे पहले</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> secs left</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> secs left</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> mins left</translation>
<translation id="1801827354178857021">अवधि</translation>
<translation id="1190609913194133056">सूचना केंद्र</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> मिनट शेष</translation>
<translation id="5613020302032141669">बायां तीर</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> फ़ाइल (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> सेकंड</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> hours left</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">रद्द करें</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> बाइट</translation>
<translation id="3660179305079774227">ऊपर तीर</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> घंटे</translation>
<translation id="3990502903496589789">दायां सिरा</translation>
-<translation id="932327136139879170">मुखपृष्ठ</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> मिनट</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation>
+<translation id="932327136139879170">मुख्यपृष्ठ</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> mins left</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> days left</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> secs left</translation>
<translation id="3909791450649380159">&amp;काटें</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> मिनट शेष</translation>
<translation id="688711909580084195">शीर्षक-रहित वेबपृष्ठ</translation>
+<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> दिन पहले</translation>
<translation id="5076340679995252485">&amp;चिपकाएं</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</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>
<translation id="3234408098842461169">नीचे तीर</translation>
<translation id="3087734570205094154">नीचे</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> मिनट शेष</translation>
<translation id="1860796786778352021">सूचना बंद करें</translation>
<translation id="6364916375976753737">बाएं स्क्रॉल करें</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> घंटे पहले</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="6719684875142564568"><ph name="NUMBER_ZERO"/> घंटे</translation>
+<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> मिनट शेष</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> मिनट</translation>
<translation id="8210608804940886430">Page Down</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> सेकंड</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> मिनट</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> सेकंड पहले</translation>
+<translation id="7781829728241885113">बीता कल</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> मिनट</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> mins left</translation>
<translation id="6659594942844771486">टैब</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> दिन पहले</translation>
<translation id="8428213095426709021">सेटिंग</translation>
<translation id="2497284189126895209">सभी फ़ाइलें</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> मिनट शेष</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> दिन पहले</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> सेकंड</translation>
<translation id="7814458197256864873">&amp;प्रतिलिपि बनाएं</translation>
<translation id="3889424535448813030">दायां तीर</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> सेकंड पहले
+</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> सेकंड शेष</translation>
<translation id="6829324100069873704">सूचनाओं पर वापस जाएं</translation>
<translation id="6528179044667508675">परेशान न करें</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> सेकंड</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> मिनट</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">निम्न से आने वाली सूचनाओं की अनुमति दें:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> मिनट</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">यहां देखने के लिए कुछ भी नहीं है, आगे चलें.</translation>
<translation id="2482878487686419369">अधिसूचनाएं</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> दिन</translation>
<translation id="3183922693828471536">यहां तक स्क्रॉल करें</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> घंटे</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">आज</translation>
<translation id="7960078400008666149">एक घंटे तक परेशान न करें</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> दिन</translation>
<translation id="2190355936436201913">(खाली)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> hours left</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> सेकंड शेष</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">दाएं स्क्रॉल करें</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> घंटे शेष</translation>
<translation id="2666092431469916601">शीर्ष</translation>
<translation id="8331626408530291785">ऊपर स्क्रॉल करें</translation>
<translation id="4773379706300191099"><ph name="EXTENSION_NAME"/> की सूचनाएं अक्षम करें</translation>
<translation id="7907591526440419938">फ़ाइल खोलें</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> घंटे पहले</translation>
<translation id="815598010540052116">नीचे स्क्रॉल करें</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">पुनर्स्थापित करें</translation>
+<translation id="1243314992276662751">अपलोड करें</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> दिन शेष</translation>
<translation id="8179976553408161302">प्रविष्ट करें</translation>
<translation id="945522503751344254">फ़ीडबैक भेजें</translation>
<translation id="9170848237812810038">&amp;पूर्ववत् करें</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> घंटे पहले</translation>
+<translation id="6918245111648057970">प्रत्येक उपयोगकर्ता के लिए निम्न में से सूचनाओं की अनुमति दें:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> सेकंड</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> मिनट शेष</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">सेटिंग...</translation>
<translation id="6845383723252244143">फ़ोल्डर को चुनें</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> सेकंड</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> सेकंड</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> दिन पहले</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> दिन</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/>घंटा</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> मिनट पहले
+</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> सेकंड पहले</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation>
<translation id="4570886800634958009">सूचना विस्‍तार</translation>
<translation id="436869212180315161">दबाएं</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> मिनट</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> मिनट शेष</translation>
<translation id="6040143037577758943">बंद करें</translation>
+<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="8226233771743600312">एक दिन तक परेशान न करें</translation>
<translation id="7457942297256758195">सभी साफ़ करें</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - सूचनाएं</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> दिन पहले</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> मिनट</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> days left</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> मिनट</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> hours left</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> घंटे पहले</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> सेकंड</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> सेकंड</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> सेकंड</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> days left</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - सूचनाएं (<ph name="QUANTITY"/> अपठित)</translation>
<translation id="6965382102122355670">ठीक</translation>
<translation id="7850320739366109486">परेशान न करें</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> दिन पहले</translation>
<translation id="5941711191222866238">छोटा करें</translation>
<translation id="6394627529324717982">अल्पविराम</translation>
<translation id="4469842253116033348"><ph name="SITE"/> से सूचनाएं अक्षम करें</translation>
<translation id="3036649622769666520">फ़ाइलें खोलें</translation>
<translation id="8328145009876646418">बायां सिरा</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> सेकंड</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_hr.xtb b/chromium/ui/base/strings/ui_strings_hr.xtb
index 39f9e075a0b..a10b9321851 100644
--- a/chromium/ui/base/strings/ui_strings_hr.xtb
+++ b/chromium/ui/base/strings/ui_strings_hr.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942">Preostalo sekundi: <ph name="NUMBER_FEW"/></translation>
+<translation id="9213479837033539041">Preostalo sekundi: <ph name="NUMBER_MANY"/></translation>
+<translation id="1209866192426315618">Preostalo minuta: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="1801827354178857021">Točka</translation>
<translation id="1190609913194133056">Centar za obavijesti</translation>
+<translation id="7470933019269157899">Preostalo minuta: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="5613020302032141669">Strelica lijevo</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> Datoteka (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252">Broj sekundi: <ph name="NUMBER_TWO"/></translation>
+<translation id="7511635910912978956">Preostali sati: <ph name="NUMBER_FEW"/></translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Odustani</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Strelica prema gore</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="8507996248087185956">Broj minuta: <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="3520476450377425184">Preostalo dana: <ph name="NUMBER_MANY"/></translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868">Preostalo minuta: <ph name="NUMBER_MANY"/></translation>
+<translation id="8666066831007952346">Preostalo dana: <ph name="NUMBER_TWO"/></translation>
+<translation id="6390842777729054533">Preostalo sekundi: <ph name="NUMBER_ZERO"/></translation>
<translation id="3909791450649380159">Iz&amp;reži</translation>
+<translation id="2560788951337264832">Preostalo minuta: <ph name="NUMBER_ZERO"/></translation>
<translation id="688711909580084195">Web-stranica bez naslova</translation>
+<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="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>
<translation id="3234408098842461169">Strelica dolje</translation>
<translation id="3087734570205094154">Donji</translation>
+<translation id="5935630983280450497">Preostalo minuta: <ph name="NUMBER_ONE"/></translation>
<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="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="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>
<translation id="8210608804940886430">Stranica prema dolje</translation>
+<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="8088823334188264070">Sekundi: <ph name="NUMBER_MANY"/></translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Danas</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
+<translation id="50960180632766478">Preostalo minuta: <ph name="NUMBER_FEW"/></translation>
<translation id="6659594942844771486">Kartica</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523">Prije <ph name="NUMBER_DEFAULT"/> dana</translation>
<translation id="8428213095426709021">Postavke</translation>
<translation id="2497284189126895209">Sve datoteke</translation>
+<translation id="7487278341251176613">Preostalo minuta: <ph name="NUMBER_TWO"/></translation>
+<translation id="5110450810124758964">Prije <ph name="NUMBER_ONE"/> dan</translation>
+<translation id="2820806154655529776">Broj sekundi: <ph name="NUMBER_ONE"/></translation>
<translation id="7814458197256864873">&amp;Kopiraj</translation>
<translation id="3889424535448813030">Strelica desno</translation>
+<translation id="4229495110203539533">Prije <ph name="NUMBER_ONE"/> sekundu</translation>
+<translation id="2544782972264605588">Preostalo sekundi: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="6829324100069873704">Natrag na obavijesti</translation>
<translation id="6528179044667508675">Ne ometaj</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> sekundi</translation>
+<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="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="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="7634624804467787019"><ph name="NUMBER_ONE"/> minuta</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Nema nikakvih obavijesti.</translation>
<translation id="2482878487686419369">Obavijesti</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Pomakni ovdje</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401">Sati: <ph name="NUMBER_MANY"/></translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Danas</translation>
<translation id="7960078400008666149">Ne ometaj jedan sat</translation>
+<translation id="4373894838514502496">Prije <ph name="NUMBER_FEW"/> min</translation>
+<translation id="4115153316875436289">Dana: <ph name="NUMBER_TWO"/></translation>
<translation id="2190355936436201913">(prazno)</translation>
+<translation id="1164369517022005061">Preostalo sati: <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="152482086482215392">Preostalo sekundi: <ph name="NUMBER_ONE"/></translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Pomakni se desno</translation>
+<translation id="7414887922320653780">Preostalo sati: <ph name="NUMBER_ONE"/></translation>
<translation id="2666092431469916601">Gornji</translation>
<translation id="8331626408530291785">Pomakni se gore</translation>
<translation id="4773379706300191099">Onemogućivanje obavijesti proširenja <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Otvori datoteku</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">Prije <ph name="NUMBER_DEFAULT"/> sati</translation>
<translation id="815598010540052116">Pomakni se dolje</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Vrati</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="945522503751344254">Slanje povratnih informacija</translation>
<translation id="9170848237812810038">&amp;Poništi</translation>
+<translation id="1285266685456062655">Prije <ph name="NUMBER_FEW"/> sata</translation>
+<translation id="6918245111648057970">Za svakog korisnika dozvoli obavijesti sljedećih usluga:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> sekunda</translation>
+<translation id="3994835489895548312">Preostalo minuta: <ph name="NUMBER_MANY"/></translation>
+<translation id="6358975074282722691">Prije <ph name="NUMBER_TWO"/> sekunde</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Postavke...</translation>
<translation id="6845383723252244143">Odabir mape</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> sekunde</translation>
+<translation id="1095623615273566396">Broj sekundi: <ph name="NUMBER_FEW"/></translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920">Broj dana: <ph name="NUMBER_FEW"/></translation>
+<translation id="5116333507878097773">Broj sati: <ph name="NUMBER_ONE"/></translation>
+<translation id="2679312662830811292">Prije <ph name="NUMBER_ONE"/> minutu</translation>
+<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="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="436869212180315161">Pritisnite</translation>
+<translation id="4860787810836767172">Prije <ph name="NUMBER_FEW"/> sek</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutes</translation>
+<translation id="1858722859751911017">Preostalo minuta: <ph name="NUMBER_FEW"/></translation>
<translation id="6040143037577758943">Zatvori</translation>
+<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="8226233771743600312">Ne ometaj jedan dan</translation>
<translation id="7457942297256758195">Očisti sve</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – obavijesti</translation>
+<translation id="822618367988303761">Prije <ph name="NUMBER_TWO"/> dana</translation>
+<translation id="4745438305783437565">Broj minuta: <ph name="NUMBER_FEW"/></translation>
+<translation id="1963692530539281474">Preostalo dana: <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minute</translation>
+<translation id="5906719743126878045">Preostalo sati: <ph name="NUMBER_TWO"/></translation>
+<translation id="8959208747503200525">Prije <ph name="NUMBER_TWO"/> sata</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940">Sekundi: <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="4197700912384709145">Sekundi: <ph name="NUMBER_ZERO"/></translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382">Preostalo dana: <ph name="NUMBER_FEW"/></translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – obavijesti (nepročitane: <ph name="QUANTITY"/>)</translation>
<translation id="6965382102122355670">U redu</translation>
<translation id="7850320739366109486">Ne ometaj</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimiziraj</translation>
<translation id="6394627529324717982">Zarez</translation>
<translation id="4469842253116033348">Onemogući obavijesti s web-lokacije <ph name="SITE"/></translation>
<translation id="3036649622769666520">Otvori datoteke</translation>
<translation id="8328145009876646418">Lijevi rub</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconds</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_hu.xtb b/chromium/ui/base/strings/ui_strings_hu.xtb
index 1bcaef0aedd..8266d2cede9 100644
--- a/chromium/ui/base/strings/ui_strings_hu.xtb
+++ b/chromium/ui/base/strings/ui_strings_hu.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">Befejezés</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> másodperc van hátra</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> másodperc van hátra</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> perc van hátra</translation>
<translation id="1801827354178857021">Pont</translation>
<translation id="1190609913194133056">Értesítési központ</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> perc van hátra</translation>
<translation id="5613020302032141669">Bal nyíl</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> fájl (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> másodperc</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> óra van hátra</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Mégse</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> bájt</translation>
<translation id="3660179305079774227">Felfelé nyíl</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="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>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> perc van hátra</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> nap van hátra</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> másodperc van hátra</translation>
<translation id="3909791450649380159">Ki&amp;vágás</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> perc van hátra</translation>
<translation id="688711909580084195">Névtelen weboldal</translation>
+<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="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>
<translation id="3234408098842461169">Lefelé nyíl</translation>
<translation id="3087734570205094154">Alja</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> perc van hátra</translation>
<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="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="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>
<translation id="8210608804940886430">Page Down</translation>
+<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="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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Tegnap</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> perc</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> perc van hátra</translation>
<translation id="6659594942844771486">Lap</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> napja</translation>
<translation id="8428213095426709021">Beállítások</translation>
<translation id="2497284189126895209">Minden fájl</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> perc van hátra</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> napja</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> másodperc</translation>
<translation id="7814458197256864873">&amp;Másolás</translation>
<translation id="3889424535448813030">Jobb nyíl</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> másodperce</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> másodperc van hátra</translation>
<translation id="6829324100069873704">Vissza az értesítésekhez</translation>
<translation id="6528179044667508675">Ne zavarj</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> másodperc</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Értesítések</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Görgessen ide</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> óra</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
+<translation id="2148716181193084225">Ma</translation>
<translation id="7960078400008666149">Ne zavarj egy óráig</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> nap</translation>
<translation id="2190355936436201913">(üres)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> óra van hátra</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> másodperc van hátra</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Görgetés jobbra</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> óra van hátra</translation>
<translation id="2666092431469916601">Felülre</translation>
<translation id="8331626408530291785">Görgetés felfelé</translation>
<translation id="4773379706300191099"><ph name="EXTENSION_NAME"/> értesítéseinek kikapcsolása</translation>
<translation id="7907591526440419938">Fájl megnyitása</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> órája</translation>
<translation id="815598010540052116">Görgetés lefelé</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Visszaállítás</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="945522503751344254">Visszajelzés küldése</translation>
<translation id="9170848237812810038">&amp;Visszavonás</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">Értesítések engedélyezése mindegyik felhasználónak a következőtől:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> másodperc</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> perc van hátra</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Beállítások...</translation>
<translation id="6845383723252244143">Mappa választása</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> másodperc</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> másodperc</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> nap</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> óra</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> perce</translation>
+<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="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="436869212180315161">Sajtó</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> perc</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> perc van hátra</translation>
<translation id="6040143037577758943">Bezárás</translation>
+<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="8226233771743600312">Ne zavarj egy napig</translation>
<translation id="7457942297256758195">Összes törlése</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – Értesítések</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> perc</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> nap van hátra</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> perc</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> óra van hátra</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> másodperc</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> másodperc</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> másodperc</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> nap van hátra</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/>– Értesítések (<ph name="QUANTITY"/> olvasatlan)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Ne zavarj</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Kicsinyítés</translation>
<translation id="6394627529324717982">Vessző</translation>
<translation id="4469842253116033348"><ph name="SITE"/> értesítéseinek kikapcsolása</translation>
<translation id="3036649622769666520">Fájlok megnyitása</translation>
<translation id="8328145009876646418">Bal sarok</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> másodperc</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_id.xtb b/chromium/ui/base/strings/ui_strings_id.xtb
index 6aa52b2eccb..3175df4f9eb 100644
--- a/chromium/ui/base/strings/ui_strings_id.xtb
+++ b/chromium/ui/base/strings/ui_strings_id.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">Berakhir</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> jam yang lalu</translation>
+<translation id="6310545596129886942">Tersisa <ph name="NUMBER_FEW"/> detik</translation>
+<translation id="9213479837033539041">Tersisa <ph name="NUMBER_MANY"/> detik</translation>
+<translation id="1209866192426315618">Tersisa <ph name="NUMBER_DEFAULT"/> menit</translation>
<translation id="1801827354178857021">Titik</translation>
<translation id="1190609913194133056">Pusat Pemberitahuan</translation>
+<translation id="7470933019269157899">Tersisa <ph name="NUMBER_DEFAULT"/> menit</translation>
<translation id="5613020302032141669">Panah Kiri</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> File (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> detik</translation>
+<translation id="7511635910912978956">Tersisa <ph name="NUMBER_FEW"/> jam</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Batal</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Panah Atas</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> menit</translation>
+<translation id="3520476450377425184">Tersisa <ph name="NUMBER_MANY"/> hari</translation>
<translation id="932327136139879170">Beranda</translation>
+<translation id="5600907569873192868">Tersisa <ph name="NUMBER_MANY"/> menit</translation>
+<translation id="8666066831007952346">Tersisa <ph name="NUMBER_TWO"/> hari</translation>
+<translation id="6390842777729054533">Tersisa <ph name="NUMBER_ZERO"/> detik</translation>
<translation id="3909791450649380159">Po&amp;tong</translation>
+<translation id="2560788951337264832">Tersisa <ph name="NUMBER_ZERO"/> menit</translation>
<translation id="688711909580084195">Laman Web Tanpa Judul</translation>
+<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="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>
<translation id="3234408098842461169">Panah Bawah</translation>
<translation id="3087734570205094154">Bawah</translation>
+<translation id="5935630983280450497">Tersisa <ph name="NUMBER_ONE"/> menit</translation>
<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="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="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>
<translation id="8210608804940886430">Page Down</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> detik</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> menit</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> dtk. yang lalu</translation>
+<translation id="7781829728241885113">Kemarin</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> menit</translation>
+<translation id="50960180632766478">Tersisa <ph name="NUMBER_FEW"/> menit</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>
<translation id="8428213095426709021">Setelan</translation>
<translation id="2497284189126895209">Semua Jenis File</translation>
+<translation id="7487278341251176613">Tersisa <ph name="NUMBER_TWO"/> menit</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> hari yang lalu</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> detik</translation>
<translation id="7814458197256864873">&amp;Salin</translation>
<translation id="3889424535448813030">Panah Kanan</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> dtk. yang lalu</translation>
+<translation id="2544782972264605588">Tersisa <ph name="NUMBER_DEFAULT"/> detik</translation>
<translation id="6829324100069873704">Kembali ke pemberitahuan</translation>
<translation id="6528179044667508675">Jangan ganggu</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> detik</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Pemberitahuan</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Gulir ke Sini</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> jam</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/dtk</translation>
+<translation id="2148716181193084225">Hari ini</translation>
<translation id="7960078400008666149">Jangan ganggu selama satu jam</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mnt. yang lalu</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> hari</translation>
<translation id="2190355936436201913">(kosong)</translation>
+<translation id="1164369517022005061">Tersisa <ph name="NUMBER_DEFAULT"/> jam</translation>
+<translation id="152482086482215392">Tersisa <ph name="NUMBER_ONE"/> detik</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Gulir ke Kanan</translation>
+<translation id="7414887922320653780">Tersisa <ph name="NUMBER_ONE"/> jam</translation>
<translation id="2666092431469916601">Atas</translation>
<translation id="8331626408530291785">Gulir ke Atas</translation>
<translation id="4773379706300191099">Nonaktifkan pemberitahuan dari <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Buka File</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> jam yang lalu</translation>
<translation id="815598010540052116">Gulir ke Bawah</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Pulihkan</translation>
+<translation id="1243314992276662751">Unggah</translation>
+<translation id="50030952220075532">Tersisa <ph name="NUMBER_ONE"/> hari</translation>
<translation id="8179976553408161302">Masuk</translation>
<translation id="945522503751344254">Kirim masukan</translation>
<translation id="9170848237812810038">&amp;Urung</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> jam yang lalu</translation>
+<translation id="6918245111648057970">Mengizinkan pemberitahuan dari yang berikut untuk tiap pengguna:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> detik</translation>
+<translation id="3994835489895548312">Tersisa <ph name="NUMBER_MANY"/> menit</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> dtk. yang lalu</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Setelan...</translation>
<translation id="6845383723252244143">Pilih Folder</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> detik</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> detik</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> hari yang lalu</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> hari</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> jam</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> mnt. yang lalu</translation>
+<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="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="436869212180315161">Tekan</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> dtk. yang lalu</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/dtk</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> menit</translation>
+<translation id="1858722859751911017">Tersisa <ph name="NUMBER_FEW"/> menit</translation>
<translation id="6040143037577758943">Tutup</translation>
+<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="8226233771743600312">Jangan ganggu selama satu hari</translation>
<translation id="7457942297256758195">Hapus Semua</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - Pemberitahuan</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> hari yang lalu</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> menit</translation>
+<translation id="1963692530539281474">Tersisa <ph name="NUMBER_DEFAULT"/> hari</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> menit</translation>
+<translation id="5906719743126878045">Tersisa <ph name="NUMBER_TWO"/> jam</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> jam yang lalu</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> detik</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> detik</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> detik</translation>
+<translation id="3759876923365568382">Tersisa <ph name="NUMBER_FEW"/> hari</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/dtk</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - Pemberitahuan (<ph name="QUANTITY"/> belum dibaca)</translation>
<translation id="6965382102122355670">Oke</translation>
<translation id="7850320739366109486">Jangan Ganggu</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Perkecil</translation>
<translation id="6394627529324717982">Koma</translation>
<translation id="4469842253116033348">Nonaktifkan pemberitahuan dari <ph name="SITE"/></translation>
<translation id="3036649622769666520">Buka File</translation>
<translation id="8328145009876646418">Tepi Kiri</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> detik</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_it.xtb b/chromium/ui/base/strings/ui_strings_it.xtb
index feb7514caa8..003abcf6928 100644
--- a/chromium/ui/base/strings/ui_strings_it.xtb
+++ b/chromium/ui/base/strings/ui_strings_it.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Canc</translation>
<translation id="528468243742722775">Fine</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> ore fa</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> sec. rimanenti</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> sec. rimanenti</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> min. rimanenti</translation>
<translation id="1801827354178857021">Punto</translation>
<translation id="1190609913194133056">Centro notifiche</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> minuti rimanenti</translation>
<translation id="5613020302032141669">Freccia sinistra</translation>
<translation id="8602707065186045623">File <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> sec.</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> ore rimanenti</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Annulla</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Freccia SU</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min.</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> giorni rimanenti</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> min. rimanenti</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> giorni rimanenti</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> sec. rimanenti</translation>
<translation id="3909791450649380159">T&amp;aglia</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutes left</translation>
<translation id="688711909580084195">Pagina web senza titolo</translation>
+<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="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>
<translation id="3234408098842461169">Freccia GIÙ</translation>
<translation id="3087734570205094154">In basso</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> min. rimanente</translation>
<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="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="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>
<translation id="8210608804940886430">Pagina giù</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> sec.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secondi fa</translation>
+<translation id="7781829728241885113">Ieri</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> min. rimanenti</translation>
<translation id="6659594942844771486">TAB</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> giorni fa</translation>
<translation id="8428213095426709021">Impostazioni</translation>
<translation id="2497284189126895209">Tutti i file</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> giorno fa</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sec.</translation>
<translation id="7814458197256864873">&amp;Copia</translation>
<translation id="3889424535448813030">Freccia destra</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> secondo fa</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> sec. rimanenti</translation>
<translation id="6829324100069873704">Torna alle notifiche</translation>
<translation id="6528179044667508675">Non disturbare</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> secondi</translation>
+<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="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="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="7634624804467787019"><ph name="NUMBER_ONE"/> minuto</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secondi fa</translation>
<translation id="4927753642311223124">Nessuna notifica.</translation>
<translation id="2482878487686419369">Notifiche</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Scorri fino a qui</translation>
<translation id="4552416320897244156">PGGIÙ</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ore</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
+<translation id="2148716181193084225">Oggi</translation>
<translation id="7960078400008666149">Non disturbare per un'ora</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> minuti fa</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> giorni</translation>
<translation id="2190355936436201913">(vuoto)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> ore rimanenti</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> sec. rimanente</translation>
<translation id="8447116497070723931">PGSU</translation>
<translation id="4588090240171750605">Scorri a destra</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ora rimanente</translation>
<translation id="2666092431469916601">In alto</translation>
<translation id="8331626408530291785">Scorri verso l'alto</translation>
<translation id="4773379706300191099">Disattiva notifiche da <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Apri file</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> ore fa</translation>
<translation id="815598010540052116">Scorri verso il basso</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Ripristina</translation>
+<translation id="1243314992276662751">Carica</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> giorno rimanente</translation>
<translation id="8179976553408161302">Invia</translation>
<translation id="945522503751344254">Invia feedback</translation>
<translation id="9170848237812810038">&amp;Annulla</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> ore fa</translation>
+<translation id="6918245111648057970">Consenti a ogni utente di ricevere le notifiche di:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> secondo</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secondi fa</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Impostazioni...</translation>
<translation id="6845383723252244143">Seleziona cartella</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> seconds</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> sec.</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> giorni fa</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> giorni</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> ora</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> minuto fa</translation>
+<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="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="436869212180315161">Premi</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secondi fa</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutes</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minutes left</translation>
<translation id="6040143037577758943">Chiudi</translation>
+<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="8226233771743600312">Non disturbare per un giorno</translation>
<translation id="7457942297256758195">Cancella tutto</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - Notifiche</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> giorni fa</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min.</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> giorni rimanenti</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutes</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> ore rimanenti</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> ore fa</translation>
<translation id="8400147561352026160">Maiusc+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> sec.</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> sec.</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> giorni rimanenti</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - Notifiche (<ph name="QUANTITY"/> da leggere)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Non disturbare</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Riduci a icona</translation>
<translation id="6394627529324717982">Virgola</translation>
<translation id="4469842253116033348">Disabilita notifiche da <ph name="SITE"/></translation>
<translation id="3036649622769666520">Apri file</translation>
<translation id="8328145009876646418">Margine sinistro</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconds</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_iw.xtb b/chromium/ui/base/strings/ui_strings_iw.xtb
index d59940d04d2..80040340423 100644
--- a/chromium/ui/base/strings/ui_strings_iw.xtb
+++ b/chromium/ui/base/strings/ui_strings_iw.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798">לפני <ph name="NUMBER_MANY"/> שעות</translation>
+<translation id="6310545596129886942">נותרו <ph name="NUMBER_FEW"/> שניות</translation>
+<translation id="9213479837033539041">נותרו <ph name="NUMBER_MANY"/> שניות</translation>
+<translation id="1209866192426315618">נותרו <ph name="NUMBER_DEFAULT"/> דקות</translation>
<translation id="1801827354178857021">נקודה</translation>
<translation id="1190609913194133056">מרכז התראות</translation>
+<translation id="7470933019269157899">נותרו <ph name="NUMBER_DEFAULT"/> דקות</translation>
<translation id="5613020302032141669">חץ לשמאל</translation>
<translation id="8602707065186045623">קובץ <ph name="SAVEAS_EXTENSION_TYPE"/> (<ph name="SAVEAS_EXTENSION_NAME"/>.)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> שניות</translation>
+<translation id="7511635910912978956">נותרו <ph name="NUMBER_FEW"/> שעות</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">ביטול</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">חץ למעלה</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> שעות</translation>
<translation id="3990502903496589789">קצה ימני</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> דקות</translation>
+<translation id="3520476450377425184">נותרו <ph name="NUMBER_MANY"/> ימים</translation>
<translation id="932327136139879170">בית</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> דקות נותרו</translation>
+<translation id="8666066831007952346">נותרו <ph name="NUMBER_TWO"/> ימים</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> שניות נותרו</translation>
<translation id="3909791450649380159">גז&amp;ור</translation>
+<translation id="2560788951337264832">נותרו <ph name="NUMBER_ZERO"/> דקות</translation>
<translation id="688711909580084195">דף אינטרנט ללא כותרת</translation>
+<translation id="3353284378027041011">לפני <ph name="NUMBER_FEW"/> ימים</translation>
<translation id="5076340679995252485">&amp;הדבק</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="364720409959344976">בחירת תיקיה להעלאה</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016">לפני <ph name="NUMBER_TWO"/> דקות</translation>
<translation id="3234408098842461169">חץ למטה</translation>
<translation id="3087734570205094154">תחתית</translation>
+<translation id="5935630983280450497">נותרה <ph name="NUMBER_ONE"/> דקה</translation>
<translation id="1860796786778352021">סגירת הודעה</translation>
<translation id="6364916375976753737">גלול שמאלה</translation>
+<translation id="2629089419211541119">לפני <ph name="NUMBER_ONE"/> שעה</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868">נותרה דקה <ph name="NUMBER_ONE"/></translation>
+<translation id="2953767478223974804">דקה <ph name="NUMBER_ONE"/></translation>
<translation id="8210608804940886430">דף למטה</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ימים</translation>
+<translation id="7163503212501929773">נותרו <ph name="NUMBER_MANY"/> שעות</translation>
<translation id="5329858601952122676">&amp;מחק</translation>
-<translation id="8901569739625249689"><ph name="QUANTITY"/> KB‏</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>
+<translation id="7275974018215686543">לפני <ph name="NUMBER_MANY"/> שניות</translation>
+<translation id="7781829728241885113">אתמול</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> דקות</translation>
+<translation id="50960180632766478">נותרו <ph name="NUMBER_FEW"/> דקות</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523">לפני <ph name="NUMBER_DEFAULT"/> ימים</translation>
<translation id="8428213095426709021">הגדרות</translation>
<translation id="2497284189126895209">כל הקבצים</translation>
+<translation id="7487278341251176613">נותרו <ph name="NUMBER_TWO"/> דקות</translation>
+<translation id="5110450810124758964">לפני <ph name="NUMBER_ONE"/> ימים</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> שניה</translation>
<translation id="7814458197256864873">&amp;העתק</translation>
<translation id="3889424535448813030">חץ לימין</translation>
+<translation id="4229495110203539533">לפני <ph name="NUMBER_ONE"/> שניות</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> שניות נותרו</translation>
<translation id="6829324100069873704">חזור להודעות</translation>
<translation id="6528179044667508675">נא לא להפריע</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> שניות</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> דקות</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">אפשר התראות ממקורות אלה:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> דקה</translation>
+<translation id="8448317557906454022">לפני <ph name="NUMBER_ZERO"/> שניות</translation>
<translation id="4927753642311223124">אין התראות להצגה, המשך הלאה.</translation>
<translation id="2482878487686419369">התראות</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">גלול ל'כאן'</translation>
<translation id="4552416320897244156">דף למטה</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> שעות</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s‎</translation>
+<translation id="2148716181193084225">היום</translation>
<translation id="7960078400008666149">נא לא להפריע למשך שעה</translation>
+<translation id="4373894838514502496">לפני <ph name="NUMBER_FEW"/> דקות</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> ימים</translation>
<translation id="2190355936436201913">(ריק)</translation>
+<translation id="1164369517022005061">נותרו <ph name="NUMBER_DEFAULT"/> שעות</translation>
+<translation id="152482086482215392">נותרה שנייה <ph name="NUMBER_ONE"/></translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">גלול ימינה</translation>
+<translation id="7414887922320653780">נותרו <ph name="NUMBER_ONE"/> שעות</translation>
<translation id="2666092431469916601">למעלה</translation>
<translation id="8331626408530291785">גלול למעלה</translation>
<translation id="4773379706300191099">השבת התראות מהתוסף <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">פתח קובץ</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">לפני <ph name="NUMBER_DEFAULT"/> שעות</translation>
<translation id="815598010540052116">גלול למטה</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">שחזר</translation>
+<translation id="1243314992276662751">העלה</translation>
+<translation id="50030952220075532">נותר יום <ph name="NUMBER_ONE"/></translation>
<translation id="8179976553408161302">היכנס</translation>
<translation id="945522503751344254">שלח משוב</translation>
<translation id="9170848237812810038">&amp;ביטול</translation>
+<translation id="1285266685456062655">לפני <ph name="NUMBER_FEW"/> שעות</translation>
+<translation id="6918245111648057970">אפשר קבלת הודעות מהגורמים הבאים עבור כל משתמש:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> שנייה</translation>
+<translation id="3994835489895548312">נותרו <ph name="NUMBER_MANY"/> דקות</translation>
+<translation id="6358975074282722691">לפני <ph name="NUMBER_TWO"/> שניות</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">הגדרות...</translation>
<translation id="6845383723252244143">בחר תיקייה</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> שניות</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> שניות</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534">לפני <ph name="NUMBER_MANY"/> ימים</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> ימים</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> שעה</translation>
+<translation id="2679312662830811292">לפני <ph name="NUMBER_ONE"/> דקות</translation>
+<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="9098468523912235228">לפני <ph name="NUMBER_DEFAULT"/> שניות</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> שניות נותרו</translation>
<translation id="4570886800634958009">הרחבת הודעה</translation>
<translation id="436869212180315161">לחץ</translation>
+<translation id="4860787810836767172">לפני <ph name="NUMBER_FEW"/> שניות</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> דקות</translation>
+<translation id="1858722859751911017">נותרו <ph name="NUMBER_FEW"/> דקות</translation>
<translation id="6040143037577758943">סגור</translation>
+<translation id="1101671447232096497">לפני <ph name="NUMBER_MANY"/> דקות</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">עזרה</translation>
<translation id="8226233771743600312">נא לא להפריע ליום אחד</translation>
<translation id="7457942297256758195">נקה הכל</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - התראות</translation>
+<translation id="822618367988303761">לפני <ph name="NUMBER_TWO"/> ימים</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> דקות</translation>
+<translation id="1963692530539281474">נותרו <ph name="NUMBER_DEFAULT"/> ימים</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> דקות</translation>
+<translation id="5906719743126878045">נותרו <ph name="NUMBER_TWO"/> שעות</translation>
+<translation id="8959208747503200525">לפני <ph name="NUMBER_TWO"/> שעות</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> שניות</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> שניות</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> שניות</translation>
+<translation id="3759876923365568382">נותרו <ph name="NUMBER_FEW"/> ימים</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - התראות (<ph name="QUANTITY"/> לא נקראו)</translation>
<translation id="6965382102122355670">אישור</translation>
<translation id="7850320739366109486">נא לא להפריע</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">מזער</translation>
<translation id="6394627529324717982">פסיק</translation>
<translation id="4469842253116033348">השבת הודעות מ-<ph name="SITE"/></translation>
<translation id="3036649622769666520">פתח קבצים</translation>
<translation id="8328145009876646418">קצה שמאלי</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> שניות</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_ja.xtb b/chromium/ui/base/strings/ui_strings_ja.xtb
index 8ae0b031be2..06b3c8cb05d 100644
--- a/chromium/ui/base/strings/ui_strings_ja.xtb
+++ b/chromium/ui/base/strings/ui_strings_ja.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Insert</translation>
<translation id="6135826906199951471">Delete</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> 時間前</translation>
+<translation id="6310545596129886942">残り <ph name="NUMBER_FEW"/> 秒</translation>
+<translation id="9213479837033539041">残り <ph name="NUMBER_MANY"/> 秒</translation>
+<translation id="1209866192426315618">残り <ph name="NUMBER_DEFAULT"/> 分</translation>
<translation id="1801827354178857021">ピリオド</translation>
<translation id="1190609913194133056">通知センター</translation>
+<translation id="7470933019269157899">残り <ph name="NUMBER_DEFAULT"/> 分</translation>
<translation id="5613020302032141669">左矢印キー</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> ファイル (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> 秒</translation>
+<translation id="7511635910912978956">残り <ph name="NUMBER_FEW"/> 時間</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">キャンセル</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">上矢印キー</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/秒</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> 時間</translation>
<translation id="3990502903496589789">右端</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> 分</translation>
+<translation id="3520476450377425184">残り <ph name="NUMBER_MANY"/> 日</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868">残り <ph name="NUMBER_MANY"/> 分</translation>
+<translation id="8666066831007952346">残り <ph name="NUMBER_TWO"/> 日</translation>
+<translation id="6390842777729054533">残り <ph name="NUMBER_ZERO"/> 秒</translation>
<translation id="3909791450649380159">切り取り(&amp;T)</translation>
+<translation id="2560788951337264832">残り <ph name="NUMBER_ZERO"/> 分</translation>
<translation id="688711909580084195">無題のウェブページ</translation>
+<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> 日前</translation>
<translation id="5076340679995252485">貼り付け(&amp;P)</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="364720409959344976">アップロードするフォルダを選択</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> 分前</translation>
<translation id="3234408098842461169">下矢印キー</translation>
<translation id="3087734570205094154">下</translation>
+<translation id="5935630983280450497">残り <ph name="NUMBER_ONE"/> 分</translation>
<translation id="1860796786778352021">通知を閉じる</translation>
<translation id="6364916375976753737">左にスクロール</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> 時間前</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868">残り <ph name="NUMBER_ONE"/> 分</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> 分</translation>
<translation id="8210608804940886430">次のページへ</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> 日</translation>
+<translation id="7163503212501929773">残り <ph name="NUMBER_MANY"/> 時間</translation>
<translation id="5329858601952122676">削除(&amp;D)</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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> 秒前</translation>
+<translation id="7781829728241885113">昨日</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> 分</translation>
+<translation id="50960180632766478">残り <ph name="NUMBER_FEW"/> 分</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> 日前</translation>
<translation id="8428213095426709021">設定</translation>
<translation id="2497284189126895209">すべてのファイル</translation>
+<translation id="7487278341251176613">残り <ph name="NUMBER_TWO"/> 分</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> 日前</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> 秒</translation>
<translation id="7814458197256864873">コピー(&amp;C)</translation>
<translation id="3889424535448813030">右矢印キー</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> 秒前</translation>
+<translation id="2544782972264605588">残り <ph name="NUMBER_DEFAULT"/> 秒</translation>
<translation id="6829324100069873704">通知に戻る</translation>
<translation id="6528179044667508675">通知を一時的にミュート</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> 秒</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> 分</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">次の通知を許可:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> 分</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> 秒前</translation>
<translation id="4927753642311223124">表示する通知はありません。続行してください。</translation>
<translation id="2482878487686419369">通知</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">ここまでスクロール</translation>
<translation id="4552416320897244156">PageDown</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> 時間</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/秒</translation>
+<translation id="2148716181193084225">今日</translation>
<translation id="7960078400008666149">通知を 1 時間ミュート</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> 分前</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> 日</translation>
<translation id="2190355936436201913">(なし)</translation>
+<translation id="1164369517022005061">残り <ph name="NUMBER_DEFAULT"/> 時間</translation>
+<translation id="152482086482215392">残り <ph name="NUMBER_ONE"/> 秒</translation>
<translation id="8447116497070723931">PageUp</translation>
<translation id="4588090240171750605">右にスクロール</translation>
+<translation id="7414887922320653780">残り <ph name="NUMBER_ONE"/> 時間</translation>
<translation id="2666092431469916601">一番上</translation>
<translation id="8331626408530291785">上にスクロール</translation>
<translation id="4773379706300191099"><ph name="EXTENSION_NAME"/> の通知を無効にする</translation>
<translation id="7907591526440419938">ファイルを開く</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> 時間前</translation>
<translation id="815598010540052116">下にスクロール</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">復元</translation>
+<translation id="1243314992276662751">アップロード</translation>
+<translation id="50030952220075532">残り <ph name="NUMBER_ONE"/> 日</translation>
<translation id="8179976553408161302">Enter</translation>
<translation id="945522503751344254">フィードバックを送信</translation>
<translation id="9170848237812810038">取消(&amp;U)</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> 時間前</translation>
+<translation id="6918245111648057970">ユーザーごとに次の通知を許可:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> 秒</translation>
+<translation id="3994835489895548312">残り <ph name="NUMBER_MANY"/> 分</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> 秒前</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">設定...</translation>
<translation id="6845383723252244143">フォルダを選択</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> 秒</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> 秒</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> 日前</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> 日</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> 時間</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> 分前</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> 秒前</translation>
+<translation id="494645311413743213">残り <ph name="NUMBER_TWO"/> 秒</translation>
<translation id="4570886800634958009">通知を展開</translation>
<translation id="436869212180315161">押す</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> 秒前</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/秒</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> 分</translation>
+<translation id="1858722859751911017">残り <ph name="NUMBER_FEW"/> 分</translation>
<translation id="6040143037577758943">閉じる</translation>
+<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> 分前</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/秒</translation>
<translation id="7649070708921625228">ヘルプ</translation>
<translation id="8226233771743600312">通知を 1 日間ミュート</translation>
<translation id="7457942297256758195">すべて消去</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - 通知</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> 日前</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> 分</translation>
+<translation id="1963692530539281474">残り <ph name="NUMBER_DEFAULT"/> 日</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> 分</translation>
+<translation id="5906719743126878045">残り <ph name="NUMBER_TWO"/> 時間</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> 時間前</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> 秒</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> 秒</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> 秒</translation>
+<translation id="3759876923365568382">残り <ph name="NUMBER_FEW"/> 日</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/秒</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - 通知(未読 <ph name="QUANTITY"/> 件)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">通知を一時的にミュート</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">最小化</translation>
<translation id="6394627529324717982">カンマ</translation>
<translation id="4469842253116033348"><ph name="SITE"/> からの通知を無効にする</translation>
<translation id="3036649622769666520">ファイルを開く</translation>
<translation id="8328145009876646418">左端</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> 秒</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_kn.xtb b/chromium/ui/base/strings/ui_strings_kn.xtb
index 3dd3c27b502..a5cc7982f4c 100644
--- a/chromium/ui/base/strings/ui_strings_kn.xtb
+++ b/chromium/ui/base/strings/ui_strings_kn.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">ಅಂತ್ಯ</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> ಸೆಕೆಂಡುಗಳು ಉಳಿದಿದೆ</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> ಸೆಕೆಂಡುಗಳು ಉಳಿದಿದೆ</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> ನಿಮಿಷಗಳು ಉಳಿದಿವೆ</translation>
<translation id="1801827354178857021">ಅವಧಿ</translation>
<translation id="1190609913194133056">ಅಧಿಸೂಚನೆಯ ಕೇಂದ್ರ</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> ನಿಮಿಷಗಳು ಉಳಿದಿವೆ</translation>
<translation id="5613020302032141669">ಎಡ ಬಾಣದ ಗುರುತು</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> ಫೈಲ್ (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> ಸೆಕೆಂಡುಗಳು</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> ಗಂಟೆಗಳು ಉಳಿದಿವೆ</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">ರದ್ದುಮಾಡು</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">ಮೇಲಿನ ಬಾಣದ ಗುರುತು</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ಗಂಟೆಗಳು</translation>
<translation id="3990502903496589789">ಬಲ ತುದಿ</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> ನಿಮಿಷಗಳು</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> ದಿನಗಳು ಉಳಿದಿವೆ</translation>
<translation id="932327136139879170">ಮುಖಪುಟ</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> ನಿಮಿಷಗಳು ಉಳಿದಿದೆ</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> ದಿನಗಳು ಉಳಿದಿವೆ</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> ಸೆಕೆಂಡುಗಳು ಉಳಿದಿದೆ</translation>
<translation id="3909791450649380159">ಕತ್ತರಿ&amp;ಸು</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> ನಿಮಿಷಗಳು ಉಳಿದಿವೆ</translation>
<translation id="688711909580084195">ಶೀರ್ಷಿಕೆರಹಿತ ವೆಬ್‌ಪುಟ</translation>
+<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="364720409959344976">ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ಫೋಲ್ಡರ್ ಆಯ್ಕೆಮಾಡಿ</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
<translation id="3234408098842461169">ಕೆಳಗಿನ ಬಾಣದ ಗುರುತು</translation>
<translation id="3087734570205094154">ಕೆಳಗೆ</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> ನಿಮಿಷಗಳು ಉಳಿದಿದೆ</translation>
<translation id="1860796786778352021">ಅಧಿಸೂಚನೆ ಮುಚ್ಚು</translation>
<translation id="6364916375976753737">ಎಡಕ್ಕೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> ನಿಮಿಷ ಉಳಿದಿದೆ</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> ನಿಮಿಷ</translation>
<translation id="8210608804940886430">ಪುಟ ಕೆಳಗೆ</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ದಿನಗಳು</translation>
+<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ಗಂಟೆಗಳು ಉಳಿದಿದೆ</translation>
<translation id="5329858601952122676">&amp;ಅಳಿಸು</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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">ನಿನ್ನೆ</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> ನಿಮಿಷಗಳು</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> ನಿಮಿಷಗಳು ಉಳಿದಿದೆ</translation>
<translation id="6659594942844771486">ಟ್ಯಾಬ್</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
<translation id="8428213095426709021">ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
<translation id="2497284189126895209">ಎಲ್ಲ ಫೈಲ್‌ಗಳು</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> ನಿಮಿಷಗಳು ಉಳಿದಿವೆ</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> day ago</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> ಸೆಕೆಂಡು</translation>
<translation id="7814458197256864873">&amp;ನಕಲಿಸಿ</translation>
<translation id="3889424535448813030">ಬಲ ಬಾಣದ ಗುರುತು</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> sec ago</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> ಸೆಕೆಂಡುಗಳು ಉಳಿದಿದೆ</translation>
<translation id="6829324100069873704">ಅಧಿಸೂಚನೆಗಳಿಗೆ ಹಿಂತಿರುಗಿ</translation>
<translation id="6528179044667508675">ಅಡಚಣೆ ಮಾಡಬೇಡಿ</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> ಸೆಕೆಂಡುಗಳು</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> ನಿಮಿಷಗಳು</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">ಕೆಳಗಿನವುಗಳಿಂದ ಅಧಿಸೂಚನೆಗಳನ್ನು ಅನುಮತಿಸಿ:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> ನಿಮಿಷ</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">ಇಲ್ಲಿ ನೋಡಲು ಏನೂ ಇಲ್ಲ, ಮುಂದೆ ಸಾಗಿ.</translation>
<translation id="2482878487686419369">ಸೂಚನೆಗಳು</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">ಇಲ್ಲಿಗೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ಗಂಟೆಗಳು</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s </translation>
+<translation id="2148716181193084225">ಇಂದು</translation>
<translation id="7960078400008666149">ಒಂದು ಗಂಟೆಯ ಕಾಲ ಅಡಚಣೆ ಮಾಡಬೇಡಿ</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> ದಿನಗಳು</translation>
<translation id="2190355936436201913">(ಖಾಲಿ)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> ಗಂಟೆಗಳು ಉಳಿದಿದೆ</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> ಸೆಕೆಂಡುಗಳು ಉಳಿದಿದೆ</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">ಬಲಕ್ಕೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ಗಂಟೆಗಳು ಉಳಿದಿದೆ</translation>
<translation id="2666092431469916601">ಮೇಲೆ</translation>
<translation id="8331626408530291785">ಮೇಲೆ ಸ್ಕ್ರೋಲ್ ಮಾಡು</translation>
<translation id="4773379706300191099"><ph name="EXTENSION_NAME"/> ನಿಂದ ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
<translation id="7907591526440419938">ಫೈಲ್ ತೆರೆಯಿರಿ</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> hours ago</translation>
<translation id="815598010540052116">ಕೆಳಗೆ ಸ್ಕ್ರೋಲ್ ಮಾಡು</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">ಪುನಃಸ್ಥಾಪನೆ</translation>
+<translation id="1243314992276662751">ಅಪ್‌ಲೋಡ್</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> ದಿನಗಳು ಉಳಿದಿವೆ</translation>
<translation id="8179976553408161302">ನಮೂದಿಸಿ</translation>
<translation id="945522503751344254">ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಕಳುಹಿಸಿ</translation>
<translation id="9170848237812810038">&amp;ರದ್ದುಮಾಡು</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">ಪ್ರತಿ ಬಳಕೆದಾರರಿಗಾಗಿ ಈ ಕೆಳಗಿನವುಗಳಿಂದ ಅಧಿಸೂಚನೆಗಳನ್ನು ಅನುಮತಿಸಿ:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> ಸೆಕೆಂಡ್</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> ನಿಮಿಷಗಳು ಉಳಿದಿವೆ</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">ಸೆಟ್ಟಿಂಗ್‌ಗಳು...</translation>
<translation id="6845383723252244143">ಫೋಲ್ಡರ್ ಆಯ್ಕೆಮಾಡಿ</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> ಸೆಕೆಂಡುಗಳು</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> ಸೆಕೆಂಡುಗಳು</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> ದಿನಗಳು</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> ಗಂಟೆ</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> min ago</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> ಸೆಕೆಂಡುಗಳು ಉಳಿದಿದೆ</translation>
<translation id="4570886800634958009">ಅಧಿಸೂಚನೆ ವಿಸ್ತರಿಸು</translation>
<translation id="436869212180315161">ಒತ್ತಿರಿ</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> ನಿಮಿಷಗಳು</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> ನಿಮಿಷಗಳು ಉಳಿದಿವೆ</translation>
<translation id="6040143037577758943">ಮುಚ್ಚು</translation>
+<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="8226233771743600312">ಒಂದು ದಿನದವರೆಗೆ ಅಡಚಣೆ ಮಾಡಬೇಡಿ</translation>
<translation id="7457942297256758195">ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - ಅಧಿಸೂಚನೆಗಳು</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> ನಿಮಿಷಗಳು</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> ದಿನಗಳು ಉಳಿದಿವೆ</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> ನಿಮಿಷಗಳು</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> ಗಂಟೆಗಳು ಉಳಿದಿದೆ</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> ಸೆಕೆಂಡುಗಳು</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> ಸೆಕೆಂಡುಗಳು</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> ಸೆಕೆಂಡುಗಳು</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> ದಿನಗಳು ಉಳಿದಿವೆ</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - ಅಧಿಸೂಚನೆಗಳು (<ph name="QUANTITY"/> ಓದದಿರುವುದು)</translation>
<translation id="6965382102122355670">ಸರಿ</translation>
<translation id="7850320739366109486">ಅಡಚಣೆ ಮಾಡಬೇಡಿ</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">ಕುಗ್ಗಿಸು</translation>
<translation id="6394627529324717982">ಅರ್ಧವಿರಾಮ</translation>
<translation id="4469842253116033348"><ph name="SITE"/> ನಿಂದ ಪ್ರಕಟಣೆ‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
<translation id="3036649622769666520">ಫೈಲ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
<translation id="8328145009876646418">ಎಡ ಬದಿ</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> ಸೆಕೆಂಡುಗಳು</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_ko.xtb b/chromium/ui/base/strings/ui_strings_ko.xtb
index 495153a2617..2403ee083e9 100644
--- a/chromium/ui/base/strings/ui_strings_ko.xtb
+++ b/chromium/ui/base/strings/ui_strings_ko.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Insert</translation>
<translation id="6135826906199951471">삭제</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/>시간 전</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/>초 남음</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/>초 남음</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/>분 남음</translation>
<translation id="1801827354178857021">마침표</translation>
<translation id="1190609913194133056">알림 센터</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/>분 남음</translation>
<translation id="5613020302032141669">왼쪽 화살표</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> 파일(.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/>초</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/>시간 남음</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">취소</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/>B</translation>
<translation id="3660179305079774227">위쪽 화살표</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/>MB/초</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/>시간</translation>
<translation id="3990502903496589789">오른쪽 모서리</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/>분</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/>일 남음</translation>
<translation id="932327136139879170">홈</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/>분</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/>일 남음</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/>초 남음</translation>
<translation id="3909791450649380159">잘라내기(&amp;T)</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutes left</translation>
<translation id="688711909580084195">제목 없는 웹페이지</translation>
+<translation id="3353284378027041011"><ph name="NUMBER_FEW"/>일 전</translation>
<translation id="5076340679995252485">붙여넣기(&amp;P)</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/>TB</translation>
+<translation id="364720409959344976">업로드할 폴더 선택</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016"><ph name="NUMBER_TWO"/>분 전</translation>
<translation id="3234408098842461169">아래 화살표</translation>
<translation id="3087734570205094154">맨 아래</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/>분 남음</translation>
<translation id="1860796786778352021">알림 닫기</translation>
<translation id="6364916375976753737">왼쪽으로 스크롤</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/>시간 전</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="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>
<translation id="8210608804940886430">페이지 아래로</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/>일</translation>
+<translation id="7163503212501929773"><ph name="NUMBER_MANY"/>시간 남음</translation>
<translation id="5329858601952122676">삭제(&amp;D)</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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/>초 전</translation>
+<translation id="7781829728241885113">어제</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/>분</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/>분 남음</translation>
<translation id="6659594942844771486">탭</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/>MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/>일 전</translation>
<translation id="8428213095426709021">설정</translation>
<translation id="2497284189126895209">모든 파일</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/>일 전</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/>초</translation>
<translation id="7814458197256864873">복사(&amp;C)</translation>
<translation id="3889424535448813030">오른쪽 화살표</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/>초 전</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/>초 남음</translation>
<translation id="6829324100069873704">알림으로 돌아가기</translation>
<translation id="6528179044667508675">알림 일시중지</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/>초</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/>분</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">다음 항목에 알림 허용:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/>분</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/>초 전</translation>
<translation id="4927753642311223124">표시할 내용이 없습니다.</translation>
<translation id="2482878487686419369">알림</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">여기로 스크롤</translation>
<translation id="4552416320897244156">PageDown</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/>시간</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/>KB/초</translation>
+<translation id="2148716181193084225">오늘</translation>
<translation id="7960078400008666149">1시간 동안 알림 일시중지</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/>분 전</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/>일</translation>
<translation id="2190355936436201913">(비어있음)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/>시간 남음</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/>초 남음</translation>
<translation id="8447116497070723931">PageUp</translation>
<translation id="4588090240171750605">오른쪽 스크롤</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/>시간 남음</translation>
<translation id="2666092431469916601">맨 위</translation>
<translation id="8331626408530291785">위로 스크롤</translation>
<translation id="4773379706300191099"><ph name="EXTENSION_NAME"/> 알림 사용 안함</translation>
<translation id="7907591526440419938">파일 열기</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/>시간 전</translation>
<translation id="815598010540052116">아래로 스크롤</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">복구</translation>
-<translation id="8179976553408161302">로그인</translation>
+<translation id="1243314992276662751">업로드</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/>일 남음</translation>
+<translation id="8179976553408161302">Enter</translation>
<translation id="945522503751344254">의견 보내기</translation>
<translation id="9170848237812810038">실행 취소(&amp;U)</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/>시간 전</translation>
+<translation id="6918245111648057970">사용자별로 다음 알림 허용:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/>초</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/>초 전</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/>PB</translation>
<translation id="2983818520079887040">설정...</translation>
<translation id="6845383723252244143">폴더 선택</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/>초</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/>초</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/>일 전</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/>일</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/>시간</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/>분 전</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/>초 전</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/>초 남음</translation>
<translation id="4570886800634958009">알림 펼치기</translation>
<translation id="436869212180315161">누르기</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/>초 전</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/>TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/>분</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minutes left</translation>
<translation id="6040143037577758943">닫기</translation>
+<translation id="1101671447232096497"><ph name="NUMBER_MANY"/>분 전</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/>B/s</translation>
<translation id="7649070708921625228">도움말</translation>
<translation id="8226233771743600312">하루 동안 알림 일시중지</translation>
<translation id="7457942297256758195">모두 지우기</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - 알림</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/>일 전</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/>분</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/>일 남음</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/>분</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/>시간 남음</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/>시간 전</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/>초</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/>초</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/>초</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/>일 남음</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/>PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - 알림(읽지 않은 알림 <ph name="QUANTITY"/>개)</translation>
<translation id="6965382102122355670">확인</translation>
<translation id="7850320739366109486">알림 일시중지</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">최소화</translation>
<translation id="6394627529324717982">콤마</translation>
<translation id="4469842253116033348"><ph name="SITE"/>의 알림을 표시 안함</translation>
<translation id="3036649622769666520">파일 열기</translation>
<translation id="8328145009876646418">왼쪽 모서리</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/>초</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_lt.xtb b/chromium/ui/base/strings/ui_strings_lt.xtb
index af905e408cd..afe0ced61dd 100644
--- a/chromium/ui/base/strings/ui_strings_lt.xtb
+++ b/chromium/ui/base/strings/ui_strings_lt.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">Pabaiga</translation>
+<translation id="5341849548509163798">Prieš <ph name="NUMBER_MANY"/> val.</translation>
+<translation id="6310545596129886942">liko <ph name="NUMBER_FEW"/> sek.</translation>
+<translation id="9213479837033539041">liko <ph name="NUMBER_MANY"/> sek.</translation>
+<translation id="1209866192426315618">liko <ph name="NUMBER_DEFAULT"/> min.</translation>
<translation id="1801827354178857021">Taškas</translation>
<translation id="1190609913194133056">Pranešimų centras</translation>
+<translation id="7470933019269157899">Liko <ph name="NUMBER_DEFAULT"/> min.</translation>
<translation id="5613020302032141669">Rodyklė į kairę</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> failas (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> sek.</translation>
+<translation id="7511635910912978956">liko <ph name="NUMBER_FEW"/> valandos (-ų)</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Atšaukti</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Rodyklė „Aukštyn“</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min.</translation>
+<translation id="3520476450377425184">liko <ph name="NUMBER_MANY"/> dienos (-ų)</translation>
<translation id="932327136139879170">Pradžia</translation>
+<translation id="5600907569873192868">liko <ph name="NUMBER_MANY"/> min.</translation>
+<translation id="8666066831007952346">liko <ph name="NUMBER_TWO"/> dienos (-ų)</translation>
+<translation id="6390842777729054533">liko <ph name="NUMBER_ZERO"/> sek.</translation>
<translation id="3909791450649380159">Iškir&amp;pti</translation>
+<translation id="2560788951337264832">Liko <ph name="NUMBER_ZERO"/> min.</translation>
<translation id="688711909580084195">Tinklalapis be pavadinimo</translation>
+<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="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>
<translation id="3234408098842461169">Rodyklė „Žemyn“</translation>
<translation id="3087734570205094154">Apačia</translation>
+<translation id="5935630983280450497">liko <ph name="NUMBER_ONE"/> min.</translation>
<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="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="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>
<translation id="8210608804940886430">Puslapį žemyn</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> sek.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> min.</translation>
+<translation id="7275974018215686543">Prieš <ph name="NUMBER_MANY"/> sek.</translation>
+<translation id="7781829728241885113">Vakar</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> min.</translation>
+<translation id="50960180632766478">liko <ph name="NUMBER_FEW"/> min.</translation>
<translation id="6659594942844771486">Skirtukas</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523">Prieš <ph name="NUMBER_DEFAULT"/> dienas (-ų)</translation>
<translation id="8428213095426709021">Nustatymai</translation>
<translation id="2497284189126895209">Visi failai</translation>
+<translation id="7487278341251176613">Liko <ph name="NUMBER_TWO"/> min.</translation>
+<translation id="5110450810124758964">Prieš <ph name="NUMBER_ONE"/> dieną</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sek.</translation>
<translation id="7814458197256864873">&amp;Kopijuoti</translation>
<translation id="3889424535448813030">Rodyklė į dešinę</translation>
+<translation id="4229495110203539533">Prieš <ph name="NUMBER_ONE"/> sek.</translation>
+<translation id="2544782972264605588">liko <ph name="NUMBER_DEFAULT"/> sek.</translation>
<translation id="6829324100069873704">Atgal į pranešimus</translation>
<translation id="6528179044667508675">Netrukdyti</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> sek.</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Pranešimai</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Slinkti iki čia</translation>
<translation id="4552416320897244156">PgDwn</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>
+<translation id="2148716181193084225">Šiandien</translation>
<translation id="7960078400008666149">Netrukdyti vieną valandą</translation>
+<translation id="4373894838514502496">Prieš <ph name="NUMBER_FEW"/> min.</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> dienos</translation>
<translation id="2190355936436201913">(tuščias)</translation>
+<translation id="1164369517022005061">liko <ph name="NUMBER_DEFAULT"/> valandos (-ų)</translation>
+<translation id="152482086482215392">liko <ph name="NUMBER_ONE"/> sek.</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Slinkti į dešinę</translation>
+<translation id="7414887922320653780">liko <ph name="NUMBER_ONE"/> val.</translation>
<translation id="2666092431469916601">Į viršų</translation>
<translation id="8331626408530291785">Slinkti į viršų</translation>
<translation id="4773379706300191099">Neleisti „<ph name="EXTENSION_NAME"/>“ pranešimų.</translation>
<translation id="7907591526440419938">Atidaryti failą</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">Prieš <ph name="NUMBER_DEFAULT"/> val.</translation>
<translation id="815598010540052116">Slinkti žemyn</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Atkurti</translation>
+<translation id="1243314992276662751">Įkelti</translation>
+<translation id="50030952220075532">liko <ph name="NUMBER_ONE"/> diena</translation>
<translation id="8179976553408161302">Įvesti</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>
+<translation id="6918245111648057970">Kiekvienam naudotojui leisti pranešimus iš nurodyto:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> sek.</translation>
+<translation id="3994835489895548312">Liko <ph name="NUMBER_MANY"/> min.</translation>
+<translation id="6358975074282722691">Prieš <ph name="NUMBER_TWO"/> sek.</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Nustatymai...</translation>
<translation id="6845383723252244143">Pasirinkti aplanką</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> sek.</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> sek.</translation>
<translation id="5583640892426849032">Grįžties klavišas</translation>
+<translation id="5263972071113911534">Prieš <ph name="NUMBER_MANY"/> dienas (-ų)</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> dienos</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> val.</translation>
+<translation id="2679312662830811292">Prieš <ph name="NUMBER_ONE"/> min.</translation>
+<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="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="436869212180315161">Spustelėti</translation>
+<translation id="4860787810836767172">Prieš <ph name="NUMBER_FEW"/> sek.</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> min.</translation>
+<translation id="1858722859751911017">Liko <ph name="NUMBER_FEW"/> min.</translation>
<translation id="6040143037577758943">Uždaryti</translation>
+<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="8226233771743600312">Netrukdyti vieną dieną</translation>
<translation id="7457942297256758195">Išvalyti viską</translation>
-<translation id="7509316384504965641">„<ph name="PRODUCT"/>“ – pranešimai</translation>
+<translation id="822618367988303761">Prieš <ph name="NUMBER_TWO"/> dienas</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min.</translation>
+<translation id="1963692530539281474">liko <ph name="NUMBER_DEFAULT"/> dienos (-ų)</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> min.</translation>
+<translation id="5906719743126878045">liko <ph name="NUMBER_TWO"/> valandos (-ų)</translation>
+<translation id="8959208747503200525">Prieš <ph name="NUMBER_TWO"/> val.</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> sek.</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> sek.</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> sek.</translation>
+<translation id="3759876923365568382">liko <ph name="NUMBER_FEW"/> dienos (-ų)</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002">„<ph name="PRODUCT"/>“ – pranešimai (neperskaitytų: <ph name="QUANTITY"/>)</translation>
<translation id="6965382102122355670">Gerai</translation>
<translation id="7850320739366109486">Netrukdyti</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Sumažinti</translation>
<translation id="6394627529324717982">Kablelis</translation>
<translation id="4469842253116033348">Neleisti <ph name="SITE"/> plėtinių</translation>
<translation id="3036649622769666520">Atidaryti failus</translation>
<translation id="8328145009876646418">Kairysis kraštas</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> sek.</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_lv.xtb b/chromium/ui/base/strings/ui_strings_lv.xtb
index bd5a4153422..65622f1a695 100644
--- a/chromium/ui/base/strings/ui_strings_lv.xtb
+++ b/chromium/ui/base/strings/ui_strings_lv.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Iespraušana</translation>
<translation id="6135826906199951471">Dzēst</translation>
<translation id="528468243742722775">Beigas</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> sekundes atlikušas</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> sekundes atlikušas</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minūtes atlikušas</translation>
<translation id="1801827354178857021">Punkts</translation>
<translation id="1190609913194133056">Paziņojumu centrs</translation>
+<translation id="7470933019269157899">Atlikušas <ph name="NUMBER_DEFAULT"/> minūtes</translation>
<translation id="5613020302032141669">Kreisā bulta</translation>
<translation id="8602707065186045623">Fails <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> sekundes</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> stundas atlikušas</translation>
<translation id="5948410903763073882">Alt +<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Atcelt</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Bulta augšup</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="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>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minūtes atlikušas</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> dienas atlikušas</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> sekundes atlikušas</translation>
<translation id="3909791450649380159">Izgrie&amp;zt</translation>
+<translation id="2560788951337264832">Atlikusi <ph name="NUMBER_ZERO"/> minūšu</translation>
<translation id="688711909580084195">Tīmekļa lapa bez nosaukuma</translation>
+<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="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>
<translation id="3234408098842461169">Bulta Lejup</translation>
<translation id="3087734570205094154">Apakša</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minūtes atlikušas</translation>
<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="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="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>
<translation id="8210608804940886430">Lejup</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> sekundes</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Vakar</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minūtes atlikušas</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>
<translation id="8428213095426709021">Iestatījumi</translation>
<translation id="2497284189126895209">Visi faili</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964">Pirms <ph name="NUMBER_ONE"/> dienas</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sekundes</translation>
<translation id="7814458197256864873">Ko&amp;pēt</translation>
<translation id="3889424535448813030">Labā bulta</translation>
+<translation id="4229495110203539533">Pirms <ph name="NUMBER_ONE"/> sekundes</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> sekundes atlikušas</translation>
<translation id="6829324100069873704">Atgriezties paziņojumos</translation>
<translation id="6528179044667508675">Netraucēt</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> sekundes</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Paziņojumi</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Ritināt šeit</translation>
<translation id="4552416320897244156">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>
+<translation id="2148716181193084225">Šodien</translation>
<translation id="7960078400008666149">Netraucēt stundu</translation>
+<translation id="4373894838514502496">Pirms <ph name="NUMBER_FEW"/> minūtēm</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> dienas</translation>
<translation id="2190355936436201913">(tukšs)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> stundas atlikušas</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> sekundes atlikušas</translation>
<translation id="8447116497070723931">Augšup</translation>
<translation id="4588090240171750605">Ritināt pa labi</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> stundas atlikušas</translation>
<translation id="2666092431469916601">Augša</translation>
<translation id="8331626408530291785">Ritināt augšup</translation>
<translation id="4773379706300191099">Atspējot paziņojumu saņemšanu no: <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Atvērt failu</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Atsolis</translation>
+<translation id="2797524280730715045">Pirms <ph name="NUMBER_DEFAULT"/> stundām</translation>
<translation id="815598010540052116">Ritināt lejup</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Atjaunot</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="945522503751344254">Sūtīt atsauksmi</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>
+<translation id="6918245111648057970">Atļaut paziņojumus visiem lietotājiem no:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> sekunde</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Iestatījumi...</translation>
<translation id="6845383723252244143">Atlasīt mapi</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> sekundes</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> sekundes</translation>
<translation id="5583640892426849032">Atkāpšanās taustiņš</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> dienas</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> stunda</translation>
+<translation id="2679312662830811292">Pirms <ph name="NUMBER_ONE"/> minūtes</translation>
+<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="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="436869212180315161">Nospiediet</translation>
+<translation id="4860787810836767172">Pirms <ph name="NUMBER_FEW"/> sekundēm</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minūšu</translation>
+<translation id="1858722859751911017">Atlikušas <ph name="NUMBER_FEW"/> minūtes</translation>
<translation id="6040143037577758943">Aizvērt</translation>
+<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="8226233771743600312">Netraucēt dienu</translation>
<translation id="7457942297256758195">Notīrīt visu</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> — paziņojumi</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minūtes</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> dienas atlikušas</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minūtes</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/>stundas atlikušas</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> sekundes</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> sekundes</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> dienas atlikušas</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> — paziņojumi (nelasīti: <ph name="QUANTITY"/>)</translation>
<translation id="6965382102122355670">Labi</translation>
<translation id="7850320739366109486">Netraucēt</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimizēt</translation>
<translation id="6394627529324717982">Komats</translation>
<translation id="4469842253116033348">Atspējot vietnes <ph name="SITE"/> paziņojumus</translation>
<translation id="3036649622769666520">Atvērt failus</translation>
<translation id="8328145009876646418">Kreisā mala</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconds</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_ml.xtb b/chromium/ui/base/strings/ui_strings_ml.xtb
index 897419d623d..13bb6e29370 100644
--- a/chromium/ui/base/strings/ui_strings_ml.xtb
+++ b/chromium/ui/base/strings/ui_strings_ml.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">അവസാനം</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> സെക്കന്റ്‍ ശേഷിക്കുന്നു</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> സെക്കന്റ്‍ അവശേഷിക്കുന്നു</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> മിനിറ്റ് അവശേഷിക്കുന്നു</translation>
<translation id="1801827354178857021">കാലയളവ്</translation>
<translation id="1190609913194133056">അറിയിപ്പ് കേന്ദ്രം</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> മിനിറ്റ് ശേഷിക്കുന്നു</translation>
<translation id="5613020302032141669">ഇടത് ആരോ അടയാളം</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> ഫയല്‍ (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> സെക്കന്റ്</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> മണിക്കൂര്‍‍ അവശേഷിക്കുന്നു</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">റദ്ദാക്കുക</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">മുകളിലേക്കുള്ള അമ്പടയാളം</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> മണിക്കൂര്‍</translation>
<translation id="3990502903496589789">വലത് അഗ്രം</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> മിനിറ്റ്</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> ദിവസം‍ ശേഷിക്കുന്നു</translation>
<translation id="932327136139879170">ഹോം</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> മിനിറ്റ് അവശേഷിക്കുന്നു</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> ദിവസം അവശേഷിക്കുന്നു</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> സെക്കന്റ് അവശേഷിക്കുന്നു</translation>
<translation id="3909791450649380159">&amp;മുറിക്കുക</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> മിനിറ്റ് ശേഷിക്കുന്നു</translation>
<translation id="688711909580084195">ശീർഷകമില്ലാത്ത വെബ്‌പേജ്</translation>
+<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="364720409959344976">അപ്‌ലോഡുചെയ്യുന്നതിന് ഫോൾഡർ തിരഞ്ഞെടുക്കുക</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
<translation id="3234408098842461169">താഴേക്കുള്ള ആരോ അടയാളം</translation>
<translation id="3087734570205094154">താഴെ</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> മിനിറ്റ് ശേഷിക്കുന്നു</translation>
<translation id="1860796786778352021">അറിയിപ്പ് അടയ്‌ക്കൽ</translation>
<translation id="6364916375976753737">ഇടത്തേക്ക് സ്ക്രോള്‍ ചെയ്യുക</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> മിനിറ്റ് ശേഷിക്കുന്നു</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> മിനിറ്റ്</translation>
<translation id="8210608804940886430">താഴെയുള്ള പേജുകള്‍</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> ദിവസം</translation>
+<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> മണിക്കൂര്‍ ശേഷിക്കുന്നു</translation>
<translation id="5329858601952122676">&amp;ഇല്ലാതാക്കൂ</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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">ഇന്നലെ</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> മിനിറ്റ്</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> മിനിറ്റ്‍ അവശേഷിക്കുന്നു</translation>
<translation id="6659594942844771486">ടാബ്</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
<translation id="8428213095426709021">ക്രമീകരണം</translation>
<translation id="2497284189126895209">എല്ലാ ഫയലുകളും</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> മിനിറ്റ് ശേഷിക്കുന്നു</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> day ago</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> സെക്കന്റ്</translation>
<translation id="7814458197256864873">&amp;പകര്‍ത്തൂ</translation>
<translation id="3889424535448813030">വലതുഭാഗത്തെ അമ്പടയാളം</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> sec ago</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> സെക്കന്റ് അവശേഷിക്കുന്നു</translation>
<translation id="6829324100069873704">അറിയിപ്പുകളിലേക്ക് തിരിച്ചുപോവുക</translation>
<translation id="6528179044667508675">ശല്യപ്പെടുത്തരുത്</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> സെക്കൻഡ്</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> മിനിറ്റ്</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">ഇനിപ്പറയുന്നതിൽ നിന്നുള്ള അറിയിപ്പുകൾ അനുവദിക്കുക:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> മിനിറ്റ്</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">ഇവിടെ കാണുന്നതിനായി ഒന്നുമില്ല, തുടരുക.</translation>
<translation id="2482878487686419369">വിജ്ഞാപനങ്ങള്‍‌</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">ഇവിടെ സ്ക്രോള്‍ ചെയ്യുക</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> മണിക്കൂര്‍</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">ഇന്ന്</translation>
<translation id="7960078400008666149">ഒരു മണിക്കൂർ നേരത്തേക്ക് ശല്യപ്പെടുത്തരുത്</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> ദിവസം</translation>
<translation id="2190355936436201913">(ശൂന്യം)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> മണിക്കൂര്‍ അവശേഷിക്കുന്നു</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> സെക്കന്റ് അവശേഷിക്കുന്നു</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">വലത്തോട്ട് സ്ക്രോള്‍ ചെയ്യുക</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> മണിക്കൂര്‍ ശേഷിക്കുന്നു</translation>
<translation id="2666092431469916601">മുകളിലേക്ക്</translation>
<translation id="8331626408530291785">മുകളിലേക്ക് സ്ക്രോള്‍ ചെയ്യൂ</translation>
<translation id="4773379706300191099"><ph name="EXTENSION_NAME"/> എന്നതിൽ നിന്നുള്ള അറിയിപ്പുകൾ പ്രവർത്തനരഹിതമാക്കുക</translation>
<translation id="7907591526440419938">ഫയല്‍ തുറക്കുക</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> hours ago</translation>
<translation id="815598010540052116">താഴേക്ക് സ്ക്രോള്‍ചെയ്യൂ</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">പുനഃസ്ഥാപിക്കുക</translation>
+<translation id="1243314992276662751">അപ്‌ലോഡുചെയ്യുക</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> ദിവസം അവശേഷിക്കുന്നു</translation>
<translation id="8179976553408161302">നൽകുക</translation>
<translation id="945522503751344254">ഫീഡ്ബാക്ക് അയയ്ക്കുക</translation>
<translation id="9170848237812810038">‍&amp;പൂര്‍വാവസ്ഥയിലാക്കുക</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">ഇനിപ്പറയുന്നതിൽ നിന്ന് ഓരോ ഉപയോക്താവിനും അറിയിപ്പുകൾ അനുവദിക്കുക:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> സെക്കൻഡ്</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> മിനിറ്റ് ശേഷിക്കുന്നു</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">ക്രമീകരണങ്ങള്‍...</translation>
<translation id="6845383723252244143">ഫോള്‍ഡര്‍ തിരഞ്ഞെടുക്കുക</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> സെക്കൻഡ്</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> സെക്കന്റ്</translation>
<translation id="5583640892426849032">ബാക്ക്‌സ്പെയ്‌സ്</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> ദിവസം</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> മണിക്കൂര്‍</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> min ago</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> സെക്കന്റ് മുമ്പ്</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> സെക്കന്റ് അവശേഷിക്കുന്നു</translation>
<translation id="4570886800634958009">അറിയിപ്പ് വിപുലീകരണം</translation>
<translation id="436869212180315161">അമര്‍ത്തുക</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> മിനിറ്റ്</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> മിനിറ്റ് ശേഷിക്കുന്നു</translation>
<translation id="6040143037577758943">അടയ്ക്കുക</translation>
+<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="8226233771743600312">ഒരു ദിവസത്തേക്ക് ശല്യപ്പെടുത്തരുത്</translation>
<translation id="7457942297256758195">എല്ലാം മായ്‌ക്കുക</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - അറിയിപ്പുകൾ</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> മിനിറ്റ്</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> ദിവസം അവശേഷിക്കുന്നു</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> മിനിറ്റ്</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> മണിക്കൂര്‍ ശേഷിക്കുന്നു</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> സെക്കന്റ്</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> സെക്കന്റ്</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> സെക്കൻഡ്</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> ദിവസം‍ അവശേഷിക്കുന്നു</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - അറിയിപ്പുകൾ (<ph name="QUANTITY"/> വായിക്കാത്തവ)</translation>
<translation id="6965382102122355670">ശരി</translation>
<translation id="7850320739366109486">ശല്യം ചെയ്യരുത്</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">ചെറുതാക്കുക‍</translation>
<translation id="6394627529324717982">കോമ</translation>
<translation id="4469842253116033348"><ph name="SITE"/> ല്‍‌ നിന്നുള്ള വിജ്ഞാപനങ്ങള്‍‌ അപ്രാപ്‌തമാക്കുക</translation>
<translation id="3036649622769666520">ഫയലുകള്‍‌ തുറക്കുക</translation>
<translation id="8328145009876646418">ഇടത് അഗ്രം</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> സെക്കൻഡ്</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_mr.xtb b/chromium/ui/base/strings/ui_strings_mr.xtb
index dd5af517352..a21baf7ae77 100644
--- a/chromium/ui/base/strings/ui_strings_mr.xtb
+++ b/chromium/ui/base/strings/ui_strings_mr.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">समाप्त</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> से बाकी</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> से बाकी</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> मिनिटे बाकी</translation>
<translation id="1801827354178857021">अवधी</translation>
<translation id="1190609913194133056">सूचना केंद्र</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> मिनिटे शिल्लक</translation>
<translation id="5613020302032141669">Left Arrow</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> फाइल (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> से</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> तास बाकी</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">रद्द करा</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Up Arrow</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> तास</translation>
<translation id="3990502903496589789">उजवा काठ</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> मि</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> दिवस बाकी</translation>
<translation id="932327136139879170">मुख्यपृष्ठ</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> मि बाकी</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> दिवस बाकी</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> से बाकी</translation>
<translation id="3909791450649380159">क&amp;ट करा</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> मिनिटे शिल्लक</translation>
<translation id="688711909580084195">अशीर्षकांकीत वेबपृष्‍ठ</translation>
+<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="364720409959344976">अपलोड करण्यासाठी फोल्डर निवडा</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
<translation id="3234408098842461169">Down Arrow</translation>
<translation id="3087734570205094154">तळाकडील</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> मि बाकी</translation>
<translation id="1860796786778352021">सूचना बंद</translation>
<translation id="6364916375976753737">डावीकडे स्क्रोल करा</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> मिनिट शिल्लक</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> मि</translation>
<translation id="8210608804940886430">पृष्ठ खाली</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> दिवस</translation>
+<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> तास बाकी</translation>
<translation id="5329858601952122676">&amp;हटवा</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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">काल</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> मिनिटे</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> मि बाकी</translation>
<translation id="6659594942844771486">टॅब</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
<translation id="8428213095426709021">सेटिंग्ज</translation>
<translation id="2497284189126895209">सर्व फाइल</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> मिनिटे शिल्लक</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> day ago</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> से</translation>
<translation id="7814458197256864873">&amp;कॉपी करा</translation>
<translation id="3889424535448813030">Right Arrow</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> sec ago</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> से बाकी</translation>
<translation id="6829324100069873704">सूचनांवर परत जा</translation>
<translation id="6528179044667508675">व्यत्यय आणू नका</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> सेकंद</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> मि</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">खालील लोकांकडील सूचनांना अनुमत करा:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> मिनिट</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">येथे पाहण्यासाठी काही नाही, पुढे चला.</translation>
<translation id="2482878487686419369">सूचना</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">येथे स्क्रोल करा</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> तास</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">आज</translation>
<translation id="7960078400008666149">एक तास व्यत्यय आणू नका</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> दिवस</translation>
<translation id="2190355936436201913">(रिक्त)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> तास बाकी</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> से बाकी</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">उजवे स्क्रोल करा</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> तास बाकी</translation>
<translation id="2666092431469916601">शीर्ष</translation>
<translation id="8331626408530291785">वर स्क्रोल करा</translation>
<translation id="4773379706300191099"><ph name="EXTENSION_NAME"/> वरील सूचना अक्षम करा</translation>
<translation id="7907591526440419938">फाइल उघडा</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> hours ago</translation>
<translation id="815598010540052116">खाली स्क्रोल करा</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">पुनर्संचयित करा</translation>
+<translation id="1243314992276662751">अपलोड करा</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> दिवस बाकी</translation>
<translation id="8179976553408161302">प्रवेश करा</translation>
<translation id="945522503751344254">अभिप्राय पाठवा</translation>
<translation id="9170848237812810038">&amp;पूर्ववत करा</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">प्रत्येक वापरकर्त्यासाठी खालील मधून सूचनांना अनुमती द्या:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> सेकंद</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> मिनिटे शिल्लक</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">सेटिंग्ज...</translation>
<translation id="6845383723252244143">फोल्डर निवडा</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> सेकंद</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> से</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> दिवस</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> तास</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> min ago</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> से बाकी</translation>
<translation id="4570886800634958009">सूचना विस्तार</translation>
<translation id="436869212180315161">दाबा</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> मिनिटे</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> मिनिटे शिल्लक</translation>
<translation id="6040143037577758943">बंद करा</translation>
+<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="8226233771743600312">एक दिवस व्यत्यय आणू नका</translation>
<translation id="7457942297256758195">सर्व साफ करा</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - सूचना</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> मि</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> दिवस बाकी</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> मिनिटे</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> तास बाकी</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> से</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> से</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> सेकंद</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> दिवस बाकी</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - सूचना (<ph name="QUANTITY"/> न वाचलेल्या)</translation>
<translation id="6965382102122355670">ठिक आहे</translation>
<translation id="7850320739366109486">व्यत्यय आणू नका</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">लहान करा</translation>
<translation id="6394627529324717982">स्वल्पविराम</translation>
<translation id="4469842253116033348"><ph name="SITE"/> कडील सूचना अक्षम करा</translation>
<translation id="3036649622769666520">फायली उघडा</translation>
<translation id="8328145009876646418">डावे काठ</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> सेकंद</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_ms.xtb b/chromium/ui/base/strings/ui_strings_ms.xtb
index fddb00bed62..51fbc90f5bd 100644
--- a/chromium/ui/base/strings/ui_strings_ms.xtb
+++ b/chromium/ui/base/strings/ui_strings_ms.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> jam yang lalu</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> saat lagi</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> saat lagi</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minit lagi</translation>
<translation id="1801827354178857021">Tempoh</translation>
<translation id="1190609913194133056">Pusat Pemberitahuan</translation>
+<translation id="7470933019269157899">Tinggal <ph name="NUMBER_DEFAULT"/> minit</translation>
<translation id="5613020302032141669">Anak Panah Kiri</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> Fail (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> minit yang lalu</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> saat</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> jam lagi</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Batal</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Anak Panah Atas</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> mins</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> hari lagi</translation>
<translation id="932327136139879170">Halaman Utama</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minit lagi</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> hari lagi</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> saat lagi</translation>
<translation id="3909791450649380159">Po&amp;tong</translation>
+<translation id="2560788951337264832">Tinggal <ph name="NUMBER_ZERO"/> minit</translation>
<translation id="688711909580084195">Laman Web Tidak Bertajuk</translation>
+<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="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>
<translation id="3234408098842461169">Anak Panah Bawah</translation>
<translation id="3087734570205094154">Bawah</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minit lagi</translation>
<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="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="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>
<translation id="8210608804940886430">Ke Bawah Halaman</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> saat</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minit</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> saat yang lalu</translation>
+<translation id="7781829728241885113">Semalam</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minit</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minit lagi</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>
<translation id="8428213095426709021">Tetapan</translation>
<translation id="2497284189126895209">Semua Fail</translation>
+<translation id="7487278341251176613">Tinggal <ph name="NUMBER_TWO"/> minit</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> hari yang lalu</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> saat</translation>
<translation id="7814458197256864873">&amp;Salin</translation>
<translation id="3889424535448813030">Anak Panah Kanan</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> saat yang lalu</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> saat lagi</translation>
<translation id="6829324100069873704">Kembali ke pemberitahuan</translation>
<translation id="6528179044667508675">Jangan ganggu</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> saat</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Pemberitahuan</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> hari</translation>
<translation id="3183922693828471536">Tatal ke Sini</translation>
<translation id="4552416320897244156">BwhHlmn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> jam</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Hari ini</translation>
<translation id="7960078400008666149">Jangan ganggu selama sejam</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> minit yang lalu</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> hari</translation>
<translation id="2190355936436201913">(kosong)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> jam lagi</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> saat lagi</translation>
<translation id="8447116497070723931">AtsHlmn</translation>
<translation id="4588090240171750605">Tatal ke Kanan</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> jam lagi</translation>
<translation id="2666092431469916601">Atas</translation>
<translation id="8331626408530291785">Tatal Ke Atas</translation>
<translation id="4773379706300191099">Lumpuhkan pemberitahuan daripada <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Buka Fail</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> hari lagi</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> jam lalu</translation>
<translation id="815598010540052116">Tatal Ke Bawah</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> minit lagi</translation>
<translation id="3157931365184549694">Pulihkan</translation>
+<translation id="1243314992276662751">Muat naik</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> hari lagi</translation>
<translation id="8179976553408161302">Masuk</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>
+<translation id="6918245111648057970">Benarkan pemberitahuan daripada yang berikut untuk setiap pengguna:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> saat</translation>
+<translation id="3994835489895548312">Tinggal <ph name="NUMBER_MANY"/> minit</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> saat yang lalu</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Tetapan...</translation>
<translation id="6845383723252244143">Pilih Folder</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> saat</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> saat</translation>
<translation id="5583640892426849032">Undur ruang</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> hari yang lalu</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> hari</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> jam</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> minit yang lalu</translation>
+<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="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="436869212180315161">Tekan</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> saat yang lalu</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minit</translation>
+<translation id="1858722859751911017">Tinggal <ph name="NUMBER_FEW"/> minit</translation>
<translation id="6040143037577758943">Tutup</translation>
+<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="8226233771743600312">Jangan ganggu selama sehari</translation>
<translation id="7457942297256758195">Kosongkan Semua</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - Pemberitahuan</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> hari yang lalu</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mins</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> hari lagi</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minit</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> jam lagi</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> jam yang lalu</translation>
<translation id="8400147561352026160">Anjak+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> saat</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> saat</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> saat</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> hari lagi</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - Pemberitahuan (<ph name="QUANTITY"/> belum dibaca)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Jangan Ganggu</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> hari yang lalu</translation>
<translation id="5941711191222866238">Minimumkan</translation>
<translation id="6394627529324717982">Koma</translation>
<translation id="4469842253116033348">Lumpuhkan pemberitahuan daripada <ph name="SITE"/></translation>
<translation id="3036649622769666520">Buka Fail</translation>
<translation id="8328145009876646418">Tepi Kiri</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> saat</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_nl.xtb b/chromium/ui/base/strings/ui_strings_nl.xtb
index 72cb5bf309e..bced1229f7e 100644
--- a/chromium/ui/base/strings/ui_strings_nl.xtb
+++ b/chromium/ui/base/strings/ui_strings_nl.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> uur geleden</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> seconden resterend</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> seconden resterend</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minuten resterend</translation>
<translation id="1801827354178857021">Punt</translation>
<translation id="1190609913194133056">Meldingscentrum</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> minuten resterend</translation>
<translation id="5613020302032141669">Pijl-links</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/>-bestand (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> seconden</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> uur resterend</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Annuleren</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Pijl-omhoog</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minuten</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dagen resterend</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minuten resterend</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> dagen resterend</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> seconden resterend</translation>
<translation id="3909791450649380159">&amp;Knippen</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minuten resterend</translation>
<translation id="688711909580084195">Naamloze webpagina</translation>
+<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="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>
<translation id="3234408098842461169">Pijl-omlaag</translation>
<translation id="3087734570205094154">Onderaan</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minuut resterend</translation>
<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="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="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>
<translation id="8210608804940886430">Pagina omlaag</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> seconden</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> seconden geleden</translation>
+<translation id="7781829728241885113">Gisteren</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuten</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minuten resterend</translation>
<translation id="6659594942844771486">Tabblad</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> dagen geleden</translation>
<translation id="8428213095426709021">Instellingen</translation>
<translation id="2497284189126895209">Alle bestanden</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minuten resterend</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> dag geleden</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sec</translation>
<translation id="7814458197256864873">&amp;Kopiëren</translation>
<translation id="3889424535448813030">Pijl-rechts</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> seconde geleden</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> seconden resterend</translation>
<translation id="6829324100069873704">Terug naar meldingen</translation>
<translation id="6528179044667508675">Niet storen</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> seconden</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Meldingen</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Hiernaartoe bladeren</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> uur</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
+<translation id="2148716181193084225">Vandaag</translation>
<translation id="7960078400008666149">Een uur niet storen</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> minuten geleden</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> dagen</translation>
<translation id="2190355936436201913">(leeg)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> uur resterend</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> seconde resterend</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Naar rechts bladeren</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> uur resterend</translation>
<translation id="2666092431469916601">Boven</translation>
<translation id="8331626408530291785">Omhoog bladeren</translation>
<translation id="4773379706300191099">Meldingen van <ph name="EXTENSION_NAME"/> uitschakelen</translation>
<translation id="7907591526440419938">Bestand openen</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> uur geleden</translation>
<translation id="815598010540052116">Omlaag bladeren</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Herstellen</translation>
+<translation id="1243314992276662751">Uploaden</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dag resterend</translation>
<translation id="8179976553408161302">Beginnen</translation>
<translation id="945522503751344254">Feedback verzenden</translation>
<translation id="9170848237812810038">&amp;Ongedaan maken</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> uur geleden</translation>
+<translation id="6918245111648057970">Melden van het volgende toestaan voor elke gebruiker:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> seconde</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minuten resterend</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> seconden geleden</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Instellingen...</translation>
<translation id="6845383723252244143">Map selecteren</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> seconds</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> seconden</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> dagen geleden</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> dagen</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> uur</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> minuut geleden</translation>
+<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="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="436869212180315161">Drukken</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> seconden geleden</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minuten</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minuten resterend</translation>
<translation id="6040143037577758943">Sluiten</translation>
+<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="8226233771743600312">Een dag niet storen</translation>
<translation id="7457942297256758195">Alles wissen</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - Meldingen</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> dagen geleden</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minuten</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> dagen resterend</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutes</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> uur resterend</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> uur geleden</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> seconden</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> seconden</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> dagen resterend</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - Meldingen (<ph name="QUANTITY"/> ongelezen)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Niet storen</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimaliseren</translation>
<translation id="6394627529324717982">Komma</translation>
<translation id="4469842253116033348">Meldingen van <ph name="SITE"/> uitschakelen</translation>
<translation id="3036649622769666520">Bestanden openen</translation>
<translation id="8328145009876646418">Linkerzijde</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconden</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_no.xtb b/chromium/ui/base/strings/ui_strings_no.xtb
index 1e44c4cf131..5f2cac11a18 100644
--- a/chromium/ui/base/strings/ui_strings_no.xtb
+++ b/chromium/ui/base/strings/ui_strings_no.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> sekunder igjen</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> sekunder igjen</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minutter igjen</translation>
<translation id="1801827354178857021">Punktum</translation>
<translation id="1190609913194133056">Varselsenter</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> minutter igjen</translation>
<translation id="5613020302032141669">Pil venstre</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> Fil (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> sekunder</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> timer igjen</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Avbryt</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Pil opp</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutter</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dager igjen</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minutter igjen</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> dager igjen</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> sekunder igjen</translation>
<translation id="3909791450649380159">Klipp u&amp;t</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutter igjen</translation>
<translation id="688711909580084195">Nettside uten tittel</translation>
+<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="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>
<translation id="3234408098842461169">Pil ned</translation>
<translation id="3087734570205094154">Bunn</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minutt igjen</translation>
<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="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="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>
<translation id="8210608804940886430">Ned 1 s.</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> sekunder</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutter</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">I går</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutter</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutter igjen</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>
<translation id="8428213095426709021">Innstillinger</translation>
<translation id="2497284189126895209">Alle filer</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutter igjen</translation>
+<translation id="5110450810124758964">For <ph name="NUMBER_ONE"/> dag siden</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sekund</translation>
<translation id="7814458197256864873">&amp;Kopier</translation>
<translation id="3889424535448813030">Pil høyre</translation>
+<translation id="4229495110203539533">For <ph name="NUMBER_ONE"/> sekund siden</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> sekunder igjen</translation>
<translation id="6829324100069873704">Gå tilbake til varsler</translation>
<translation id="6528179044667508675">Ikke forstyrr</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> sekunder</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Varslinger</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Rull hit</translation>
<translation id="4552416320897244156">PgDwn</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>
+<translation id="2148716181193084225">I dag</translation>
<translation id="7960078400008666149">Ikke forstyrr i én time</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> dager</translation>
<translation id="2190355936436201913">(tom)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> timer igjen</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> sekund igjen</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Rull mot høyre</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> time igjen</translation>
<translation id="2666092431469916601">Topp</translation>
<translation id="8331626408530291785">Rull opp</translation>
<translation id="4773379706300191099">Deaktiver varsler fra <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Åpne filen</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">For <ph name="NUMBER_DEFAULT"/> timer siden</translation>
<translation id="815598010540052116">Rull ned</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Gjenopprett</translation>
+<translation id="1243314992276662751">Last opp</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dag igjen</translation>
<translation id="8179976553408161302">Start</translation>
<translation id="945522503751344254">Gi tilbakemelding</translation>
<translation id="9170848237812810038">&amp;Angre</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">Tillat varsler fra følgende for hver bruker:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> sekund</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutter igjen</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Innstillinger</translation>
<translation id="6845383723252244143">Velg mappe</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> sekunder</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> sekunder</translation>
<translation id="5583640892426849032">Tilbake-tasten</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> dager</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> time</translation>
+<translation id="2679312662830811292">For <ph name="NUMBER_ONE"/> minutt siden</translation>
+<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="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="436869212180315161">Trykk</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB per sek</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutter</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minutter igjen</translation>
<translation id="6040143037577758943">Lukk</translation>
+<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="8226233771743600312">Ikke forstyrr i en dag</translation>
<translation id="7457942297256758195">Fjern alle</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – varsler</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutter</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> dager igjen</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutter</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> timer igjen</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Skift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> sekunder</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> sekunder</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> sekunder</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> dager igjen</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB per sek</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – varsler (<ph name="QUANTITY"/> uleste)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Ikke forstyrr</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimer</translation>
<translation id="6394627529324717982">Komma</translation>
<translation id="4469842253116033348">Deaktiver varslinger fra <ph name="SITE"/></translation>
<translation id="3036649622769666520">Åpne filer</translation>
<translation id="8328145009876646418">Venstre kant</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> sekunder</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_pl.xtb b/chromium/ui/base/strings/ui_strings_pl.xtb
index 7ae3f1efab0..43aa6a4bd6b 100644
--- a/chromium/ui/base/strings/ui_strings_pl.xtb
+++ b/chromium/ui/base/strings/ui_strings_pl.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> sek</translation>
+<translation id="9213479837033539041">Pozostało: <ph name="NUMBER_MANY"/> sek</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> min</translation>
<translation id="1801827354178857021">Okres</translation>
<translation id="1190609913194133056">Centrum powiadomień</translation>
+<translation id="7470933019269157899">Pozostało <ph name="NUMBER_DEFAULT"/> minut</translation>
<translation id="5613020302032141669">Strzałka w lewo</translation>
<translation id="8602707065186045623">Plik <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> s</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> godz</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Anuluj</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Strzałka w górę</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dni</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> min</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> dni</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> sek</translation>
<translation id="3909791450649380159">Wy&amp;tnij</translation>
+<translation id="2560788951337264832">Pozostało <ph name="NUMBER_ZERO"/> minut</translation>
<translation id="688711909580084195">Strona internetowa bez tytułu</translation>
+<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="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>
<translation id="3234408098842461169">Strzałka w dół</translation>
<translation id="3087734570205094154">Na dół</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> min do końca</translation>
<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="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="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>
<translation id="8210608804940886430">Strona w dół</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> s</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Wczoraj</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> min</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> dni temu</translation>
<translation id="8428213095426709021">Ustawienia</translation>
<translation id="2497284189126895209">Wszystkie pliki</translation>
+<translation id="7487278341251176613">Pozostały <ph name="NUMBER_TWO"/> minuty</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> dzień temu</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> s</translation>
<translation id="7814458197256864873">&amp;Kopiuj</translation>
<translation id="3889424535448813030">Strzałka w prawo</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> s temu</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> sek</translation>
<translation id="6829324100069873704">Wróć do powiadomień</translation>
<translation id="6528179044667508675">Nie przeszkadzać</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> sekundy</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Powiadomienia</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Przewiń tutaj</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> godz.</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/s</translation>
+<translation id="2148716181193084225">Dzisiaj</translation>
<translation id="7960078400008666149">Nie przeszkadzać przez godzinę</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> min temu</translation>
+<translation id="4115153316875436289">Liczba dni: <ph name="NUMBER_TWO"/></translation>
<translation id="2190355936436201913">(puste)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> godz</translation>
+<translation id="152482086482215392">Pozostała <ph name="NUMBER_ONE"/> sekunda</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Przewiń w prawo</translation>
+<translation id="7414887922320653780">Pozostała <ph name="NUMBER_ONE"/> godzina</translation>
<translation id="2666092431469916601">Do góry</translation>
<translation id="8331626408530291785">Przewiń w górę</translation>
<translation id="4773379706300191099">Wyłącz powiadomienia z <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Otwórz plik</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> godz. temu</translation>
<translation id="815598010540052116">Przewiń w dół</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Przywróć</translation>
+<translation id="1243314992276662751">Prześlij</translation>
+<translation id="50030952220075532">Pozostał <ph name="NUMBER_ONE"/> dzień</translation>
<translation id="8179976553408161302">Start</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>
+<translation id="6918245111648057970">Zezwól na powiadomienia dla każdego użytkownika z:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> sekunda</translation>
+<translation id="3994835489895548312">Pozostało <ph name="NUMBER_MANY"/> minut</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Ustawienia</translation>
<translation id="6845383723252244143">Wybierz folder</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> sekundy</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> s</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920">Liczba dni: <ph name="NUMBER_FEW"/></translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> godz.</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> min temu</translation>
+<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="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="436869212180315161">Kliknij</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> s temu</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutes</translation>
+<translation id="1858722859751911017">Pozostały <ph name="NUMBER_FEW"/> minuty</translation>
<translation id="6040143037577758943">Zamknij</translation>
+<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="8226233771743600312">Nie przeszkadzać przez jeden dzień</translation>
<translation id="7457942297256758195">Wyczyść wszystkie</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – powiadomienia</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> dni temu</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> dni</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minuty</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> godz</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> s</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> s</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> dni</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – powiadomienia (nieprzeczytane: <ph name="QUANTITY"/>)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Nie przeszkadzać</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimalizuj</translation>
<translation id="6394627529324717982">Przecinek</translation>
<translation id="4469842253116033348">Wyłącz powiadomienia z witryny <ph name="SITE"/></translation>
<translation id="3036649622769666520">Otwórz pliki</translation>
<translation id="8328145009876646418">Krawędź po lewej</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconds</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_pt-BR.xtb b/chromium/ui/base/strings/ui_strings_pt-BR.xtb
index 235e721a252..90d7f8a3951 100644
--- a/chromium/ui/base/strings/ui_strings_pt-BR.xtb
+++ b/chromium/ui/base/strings/ui_strings_pt-BR.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> segundos restantes</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> segundos restantes</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minutos restantes</translation>
<translation id="1801827354178857021">Ponto final</translation>
<translation id="1190609913194133056">Central de Notificações</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> minutos restantes</translation>
<translation id="5613020302032141669">Seta para a esquerda</translation>
<translation id="8602707065186045623">Arquivo <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> s</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> horas restantes</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Cancelar</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> bytes</translation>
<translation id="3660179305079774227">Seta para cima</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minutos</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dias restantes</translation>
<translation id="932327136139879170">Página inicial</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minutos restantes</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> dias restantes</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> segundos restantes</translation>
<translation id="3909791450649380159">&amp;Recortar</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutes left</translation>
<translation id="688711909580084195">Página da web sem título</translation>
+<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="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>
<translation id="3234408098842461169">Seta para baixo</translation>
<translation id="3087734570205094154">Parte inferior</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minutos restantes</translation>
<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="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="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>
<translation id="8210608804940886430">Página para baixo</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> s</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutos</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Ontem</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutos</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minutos restantes</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>
<translation id="8428213095426709021">Configurações</translation>
<translation id="2497284189126895209">Todos os arquivos</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> dia atrás</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> s</translation>
<translation id="7814458197256864873">Co&amp;piar</translation>
<translation id="3889424535448813030">Seta para a direita</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> segundo atrás</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> segundos restantes</translation>
<translation id="6829324100069873704">Voltar para notificações</translation>
<translation id="6528179044667508675">Não perturbe</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> segundos</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Notificações</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Percorrer até aqui</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> horas</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Hoje</translation>
<translation id="7960078400008666149">Não perturbe por uma hora</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> dias</translation>
<translation id="2190355936436201913">(vazio)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> horas restantes</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> segundo restante</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Percorrer à direita</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hora restante</translation>
<translation id="2666092431469916601">Parte superior</translation>
<translation id="8331626408530291785">Percorrer para cima</translation>
<translation id="4773379706300191099">Desativar notificações de <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Abrir arquivo</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> horas atrás</translation>
<translation id="815598010540052116">Percorrer para baixo</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restaurar</translation>
+<translation id="1243314992276662751">Fazer upload</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dia restante</translation>
<translation id="8179976553408161302">Entrar</translation>
<translation id="945522503751344254">Enviar comentários</translation>
<translation id="9170848237812810038">&amp;Desfazer</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">Permitir as seguintes notificações para cada usuário:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> segundo</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Configurações...</translation>
<translation id="6845383723252244143">Selecionar pasta</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> segundos</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> s</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> dias</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> hora</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> minuto atrás</translation>
+<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="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="436869212180315161">Apertar</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutos</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minutes left</translation>
<translation id="6040143037577758943">Fechar</translation>
+<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="8226233771743600312">Não perturbe por um dia</translation>
<translation id="7457942297256758195">Limpar tudo</translation>
-<translation id="7509316384504965641">Notificações do <ph name="PRODUCT"/></translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minutos</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> dias restantes</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutos</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> horas restantes</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> s</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> s</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> segundos</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> dias restantes</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002">Notificações do <ph name="PRODUCT"/> (<ph name="QUANTITY"/> não lidas)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Não Perturbe</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimizar</translation>
<translation id="6394627529324717982">Vírgula</translation>
<translation id="4469842253116033348">Desativar notificações de <ph name="SITE"/></translation>
<translation id="3036649622769666520">Abrir arquivos</translation>
<translation id="8328145009876646418">Borda esquerda</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> segundos</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_pt-PT.xtb b/chromium/ui/base/strings/ui_strings_pt-PT.xtb
index d52ae6c5d33..76369e75a2e 100644
--- a/chromium/ui/base/strings/ui_strings_pt-PT.xtb
+++ b/chromium/ui/base/strings/ui_strings_pt-PT.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798">Há <ph name="NUMBER_MANY"/> horas</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> seg. restantes</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> seg. restantes</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> min. restantes</translation>
<translation id="1801827354178857021">Ponto final</translation>
<translation id="1190609913194133056">Centro de Notificações</translation>
+<translation id="7470933019269157899">Faltam <ph name="NUMBER_DEFAULT"/> minutos</translation>
<translation id="5613020302032141669">Seta para a esquerda</translation>
<translation id="8602707065186045623">Ficheiro <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> seg.</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> horas restantes</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Cancelar</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Seta para cima</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min.</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dias restantes</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> min. restantes</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> dias restantes</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> seg. restantes</translation>
<translation id="3909791450649380159">Cor&amp;tar</translation>
+<translation id="2560788951337264832">Faltam <ph name="NUMBER_ZERO"/> minutos</translation>
<translation id="688711909580084195">Página Web Sem Nome</translation>
+<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="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>
<translation id="3234408098842461169">Seta para baixo</translation>
<translation id="3087734570205094154">Parte inferior</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> min. restante</translation>
<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="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="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>
<translation id="8210608804940886430">Página para baixo</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> seg.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutos</translation>
+<translation id="7275974018215686543">Há <ph name="NUMBER_MANY"/> seg.</translation>
+<translation id="7781829728241885113">Ontem</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutos</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> min. restantes</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523">Há <ph name="NUMBER_DEFAULT"/> dias</translation>
<translation id="8428213095426709021">Definições</translation>
<translation id="2497284189126895209">Todos os ficheiros</translation>
+<translation id="7487278341251176613">Faltam <ph name="NUMBER_TWO"/> minutos</translation>
+<translation id="5110450810124758964">Há <ph name="NUMBER_ONE"/> dia</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> seg.</translation>
<translation id="7814458197256864873">&amp;Copiar</translation>
<translation id="3889424535448813030">Seta para a direita</translation>
+<translation id="4229495110203539533">Há <ph name="NUMBER_ONE"/> seg.</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> seg. restantes</translation>
<translation id="6829324100069873704">Voltar às notificações</translation>
<translation id="6528179044667508675">Não incomodar</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> segundos</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Notificações</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Deslocar-se para aqui</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> horas</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Hoje</translation>
<translation id="7960078400008666149">Não incomodar durante uma hora</translation>
+<translation id="4373894838514502496">Há <ph name="NUMBER_FEW"/> min.</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> dias</translation>
<translation id="2190355936436201913">(vazio)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> horas restantes</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> seg. restante</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Deslocar-se para a direita</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hora restante</translation>
<translation id="2666092431469916601">Parte superior</translation>
<translation id="8331626408530291785">Deslocar-se para cima</translation>
<translation id="4773379706300191099">Desativar notificações de <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Abrir ficheiro</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">Há <ph name="NUMBER_DEFAULT"/> horas</translation>
<translation id="815598010540052116">Deslocar-se para baixo</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Restaurar</translation>
+<translation id="1243314992276662751">Carregar</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dia restante</translation>
<translation id="8179976553408161302">Entrar</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>
+<translation id="6918245111648057970">Permitir as seguintes notificações para cada utilizador:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> segundo</translation>
+<translation id="3994835489895548312">Faltam <ph name="NUMBER_MANY"/> minutos</translation>
+<translation id="6358975074282722691">Há <ph name="NUMBER_TWO"/> seg.</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Definições...</translation>
<translation id="6845383723252244143">Seleccionar pasta</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> segundos</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> seg.</translation>
<translation id="5583640892426849032">Retrocesso</translation>
+<translation id="5263972071113911534">Há <ph name="NUMBER_MANY"/> dias</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> dias</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> hora</translation>
+<translation id="2679312662830811292">Há <ph name="NUMBER_ONE"/> min.</translation>
+<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="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="436869212180315161">Premir</translation>
+<translation id="4860787810836767172">Há <ph name="NUMBER_FEW"/> seg.</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutos</translation>
+<translation id="1858722859751911017">Faltam <ph name="NUMBER_FEW"/> minutos</translation>
<translation id="6040143037577758943">Fechar</translation>
+<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="8226233771743600312">Não incomodar durante um dia</translation>
<translation id="7457942297256758195">Limpar Tudo</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – Notificações</translation>
+<translation id="822618367988303761">Há <ph name="NUMBER_TWO"/> dias</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min.</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> dias restantes</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutos</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> horas restantes</translation>
+<translation id="8959208747503200525">Há <ph name="NUMBER_TWO"/> horas</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> seg.</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> seg.</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> segundos</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> dias restantes</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – Notificações (<ph name="QUANTITY"/> não lidas)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Não incomodar</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimizar</translation>
<translation id="6394627529324717982">Vírgula</translation>
<translation id="4469842253116033348">Desactivar notificações de <ph name="SITE"/></translation>
<translation id="3036649622769666520">Abrir ficheiros</translation>
<translation id="8328145009876646418">Margem esquerda</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> segundos</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_ro.xtb b/chromium/ui/base/strings/ui_strings_ro.xtb
index 5c7d98489ae..4f1ed1ae442 100644
--- a/chromium/ui/base/strings/ui_strings_ro.xtb
+++ b/chromium/ui/base/strings/ui_strings_ro.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins (Inserați)</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End (La sfârșit)</translation>
+<translation id="5341849548509163798">Cu <ph name="NUMBER_MANY"/> (de) ore în urmă</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> secunde rămase</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> secunde rămase</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minute rămase</translation>
<translation id="1801827354178857021">Punct</translation>
<translation id="1190609913194133056">Centrul pentru notificări</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> minute rămase</translation>
<translation id="5613020302032141669">Săgeata spre stânga</translation>
<translation id="8602707065186045623">Fișier <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918">Cu <ph name="NUMBER_ZERO"/> minute în urmă</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> secunde</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> ore rămase</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Anulaţi</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> O</translation>
<translation id="3660179305079774227">Săgeata în sus</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="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>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minute rămase</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> zile rămase</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> secunde rămase</translation>
<translation id="3909791450649380159">&amp;Decupați</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minute rămase</translation>
<translation id="688711909580084195">Pagină web fără titlu</translation>
+<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="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>
<translation id="3234408098842461169">Săgeata în jos</translation>
<translation id="3087734570205094154">Jos</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minut rămas</translation>
<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="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="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>
<translation id="8210608804940886430">Page Down (o pagină mai jos)</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> secunde</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KO</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543">Cu <ph name="NUMBER_MANY"/> (de) secunde în urmă</translation>
+<translation id="7781829728241885113">Ieri</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minute</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minute rămase</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>
<translation id="8428213095426709021">Setări</translation>
<translation id="2497284189126895209">Toate fișierele</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minute rămase</translation>
+<translation id="5110450810124758964">Cu <ph name="NUMBER_ONE"/> zi în urmă</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> secundă</translation>
<translation id="7814458197256864873">&amp;Copiați</translation>
<translation id="3889424535448813030">Săgeata spre dreapta</translation>
+<translation id="4229495110203539533">Cu <ph name="NUMBER_ONE"/> secundă în urmă</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> secunde rămase</translation>
<translation id="6829324100069873704">Reveniți la notificări</translation>
<translation id="6528179044667508675">Nu deranja</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> secunde</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Notificări</translation>
+<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="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ore</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KO/s</translation>
+<translation id="2148716181193084225">Astăzi</translation>
<translation id="7960078400008666149">Nu deranja o oră</translation>
+<translation id="4373894838514502496">Cu <ph name="NUMBER_FEW"/> minute în urmă</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> zile</translation>
<translation id="2190355936436201913">(gol)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> ore rămase</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> secundă rămasă</translation>
<translation id="8447116497070723931">PgUp (o pagină mai sus)</translation>
<translation id="4588090240171750605">Derulați spre dreapta</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> oră rămasă</translation>
<translation id="2666092431469916601">Sus</translation>
<translation id="8331626408530291785">Derulați în sus</translation>
<translation id="4773379706300191099">Dezactivați notificările de la <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Deschideți fișierul</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> zile rămase</translation>
<translation id="1293699935367580298">Esc (Ieșiți)</translation>
+<translation id="2797524280730715045">Cu <ph name="NUMBER_DEFAULT"/> (de) ore în urmă</translation>
<translation id="815598010540052116">Derulați în jos</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> minute rămase</translation>
<translation id="3157931365184549694">Restabiliți</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="945522503751344254">Trimiteți feedback</translation>
<translation id="9170848237812810038">&amp;Anulați</translation>
+<translation id="1285266685456062655">Cu <ph name="NUMBER_FEW"/> ore în urmă</translation>
+<translation id="6918245111648057970">Permiteți notificări de la următoarele servicii pentru fiecare utilizator:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> secundă</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> de minute rămase</translation>
+<translation id="6358975074282722691">Cu <ph name="NUMBER_TWO"/> secunde în urmă</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PO</translation>
<translation id="2983818520079887040">Setări...</translation>
<translation id="6845383723252244143">Selectați dosarul</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> secunde</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> secunde</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534">Cu <ph name="NUMBER_MANY"/> (de) zile în urmă</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> zile</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> oră</translation>
+<translation id="2679312662830811292">Cu <ph name="NUMBER_ONE"/> minut în urmă</translation>
+<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="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="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>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minute</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minute rămase</translation>
<translation id="6040143037577758943">Închideți</translation>
+<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="8226233771743600312">Nu deranja o zi</translation>
<translation id="7457942297256758195">Ștergeți-le pe toate</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – Notificări</translation>
+<translation id="822618367988303761">Cu <ph name="NUMBER_TWO"/> zile în urmă</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minute</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> zile rămase</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minute</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> ore rămase</translation>
+<translation id="8959208747503200525">Cu <ph name="NUMBER_TWO"/> ore în urmă</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> secunde</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> secunde</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> zile rămase</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PO/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – Notificări (<ph name="QUANTITY"/> necitite)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Nu deranja</translation>
+<translation id="6978839998405419496">Cu <ph name="NUMBER_ZERO"/> zile în urmă</translation>
<translation id="5941711191222866238">Minimizați</translation>
<translation id="6394627529324717982">Virgulă</translation>
<translation id="4469842253116033348">Dezactivați notificările de la <ph name="SITE"/></translation>
<translation id="3036649622769666520">Deschideți fișierele</translation>
<translation id="8328145009876646418">Marginea stângă</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> secunde</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_ru.xtb b/chromium/ui/base/strings/ui_strings_ru.xtb
index 82a444e7f0e..32dfd2c2fd1 100644
--- a/chromium/ui/base/strings/ui_strings_ru.xtb
+++ b/chromium/ui/base/strings/ui_strings_ru.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">Завершить</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> сек.</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> сек.</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> мин.</translation>
<translation id="1801827354178857021">Точка</translation>
<translation id="1190609913194133056">Центр оповещений</translation>
+<translation id="7470933019269157899">Осталось <ph name="NUMBER_DEFAULT"/> минут</translation>
<translation id="5613020302032141669">Стрелка влево</translation>
<translation id="8602707065186045623">Файл <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> сек.</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> ч.</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Отмена</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> Б</translation>
<translation id="3660179305079774227">Стрелка вверх</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> МБ/с</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ч.</translation>
<translation id="3990502903496589789">Правый край</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> мин.</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> дн.</translation>
<translation id="932327136139879170">На главную</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> мин.</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> дн.</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> сек.</translation>
<translation id="3909791450649380159">Выре&amp;зать</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutes left</translation>
<translation id="688711909580084195">Страница без названия</translation>
+<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> дн. назад</translation>
<translation id="5076340679995252485">&amp;Вставить</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> ТБ</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>
<translation id="3234408098842461169">Стрелка вниз</translation>
<translation id="3087734570205094154">Низ</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> мин.</translation>
<translation id="1860796786778352021">Закрыть оповещение</translation>
<translation id="6364916375976753737">Прокрутка влево</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> ч. назад</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868">Осталась <ph name="NUMBER_ONE"/> минута</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> мин.</translation>
<translation id="8210608804940886430">Прокрутка вниз</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> дн.</translation>
+<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> ч.</translation>
<translation id="5329858601952122676">&amp;Удалить</translation>
+<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> сек.</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> КБ</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> мин.</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Вчера</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> мин.</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> мин.</translation>
<translation id="6659594942844771486">Вкладка</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> МБ</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> дн. назад</translation>
<translation id="8428213095426709021">Настройки</translation>
<translation id="2497284189126895209">Все файлы</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> дн. назад</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> сек.</translation>
<translation id="7814458197256864873">&amp;Копировать</translation>
<translation id="3889424535448813030">Стрелка вправо</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> с. назад</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> сек.</translation>
<translation id="6829324100069873704">Назад к оповещениям</translation>
<translation id="6528179044667508675">Не беспокоить</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> сек.</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> мин.</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Разрешить оповещения от:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> мин.</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Оповещений нет.</translation>
<translation id="2482878487686419369">Оповещения</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Прокрутить до этого места</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ч.</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> КБ/с</translation>
+<translation id="2148716181193084225">Сегодня</translation>
<translation id="7960078400008666149">Не беспокоить (1 час)</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> мин. назад</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> дня</translation>
<translation id="2190355936436201913">(пусто)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> ч.</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> сек.</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Прокрутка вправо</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> ч.</translation>
<translation id="2666092431469916601">Наверх</translation>
<translation id="8331626408530291785">Прокрутка вверх</translation>
<translation id="4773379706300191099">Отключить оповещения от <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Открытие файла</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> ч. назад</translation>
<translation id="815598010540052116">Прокрутка вниз</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Восстановить</translation>
+<translation id="1243314992276662751">Загрузить</translation>
+<translation id="50030952220075532">Остался <ph name="NUMBER_ONE"/> день</translation>
<translation id="8179976553408161302">Войти</translation>
<translation id="945522503751344254">Отправить отзыв</translation>
<translation id="9170848237812810038">&amp;Отменить</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> ч. назад</translation>
+<translation id="6918245111648057970">Разрешить оповещения для каждого пользователя:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> сек.</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> ПБ</translation>
<translation id="2983818520079887040">Настройки...</translation>
<translation id="6845383723252244143">Выбор папки</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> сек.</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> сек.</translation>
<translation id="5583640892426849032">Клавиша возврата (Backspace)</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> дн.</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> час</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> мин. назад</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> с. назад</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> сек.</translation>
<translation id="4570886800634958009">Раскрыть оповещение</translation>
<translation id="436869212180315161">Нажать</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> с. назад</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> ТБ/с</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> мин.</translation>
+<translation id="1858722859751911017">Осталось <ph name="NUMBER_FEW"/> мин.</translation>
<translation id="6040143037577758943">Закрыть</translation>
+<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> Б/с</translation>
<translation id="7649070708921625228">Справка</translation>
<translation id="8226233771743600312">Не беспокоить (1 день)</translation>
<translation id="7457942297256758195">Очистить все</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – Оповещения</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> мин.</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> дн.</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> мин.</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> ч.</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> сек.</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> сек.</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> сек.</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> дн.</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> ПБ/с</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – Оповещения (непрочитанных: <ph name="QUANTITY"/>)</translation>
<translation id="6965382102122355670">ОК</translation>
<translation id="7850320739366109486">Не беспокоить</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Свернуть</translation>
<translation id="6394627529324717982">Запятая</translation>
<translation id="4469842253116033348">Отключить уведомления с этого адреса: <ph name="SITE"/></translation>
<translation id="3036649622769666520">Открытие файлов</translation>
<translation id="8328145009876646418">Левый край</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> сек.</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_sk.xtb b/chromium/ui/base/strings/ui_strings_sk.xtb
index 544901880b3..00fc533fcfb 100644
--- a/chromium/ui/base/strings/ui_strings_sk.xtb
+++ b/chromium/ui/base/strings/ui_strings_sk.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942">Počet zvyšných sekúnd: <ph name="NUMBER_FEW"/></translation>
+<translation id="9213479837033539041">Počet zvyšných sekúnd: <ph name="NUMBER_MANY"/></translation>
+<translation id="1209866192426315618">Počet zvyšných minút: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="1801827354178857021">Bodka</translation>
<translation id="1190609913194133056">Centrum upozornení</translation>
+<translation id="7470933019269157899">Zostáva <ph name="NUMBER_DEFAULT"/> minút</translation>
<translation id="5613020302032141669">Šípka doľava</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> Súbor (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252">Počet sekúnd: <ph name="NUMBER_TWO"/></translation>
+<translation id="7511635910912978956">Počet zvyšných hodín: <ph name="NUMBER_FEW"/></translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Zrušiť</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Šípka nahor</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="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>
+<translation id="5600907569873192868">Počet zvyšných minút: <ph name="NUMBER_MANY"/></translation>
+<translation id="8666066831007952346">Počet zvyšných dní: <ph name="NUMBER_TWO"/></translation>
+<translation id="6390842777729054533">Počet zvyšných sekúnd: <ph name="NUMBER_ZERO"/></translation>
<translation id="3909791450649380159">&amp;Vystrihnúť</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutes left</translation>
<translation id="688711909580084195">Nepomenovaná webová stránka</translation>
+<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="364720409959344976">Výber priečinka na odovzdanie</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
<translation id="3234408098842461169">Šípka nadol</translation>
<translation id="3087734570205094154">Spodok</translation>
+<translation id="5935630983280450497">Počet zvyšných minút: <ph name="NUMBER_ONE"/></translation>
<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="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="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>
<translation id="8210608804940886430">Stránkovať nadol</translation>
+<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="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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Včera</translation>
+<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="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523">Pred <ph name="NUMBER_DEFAULT"/> dňami</translation>
<translation id="8428213095426709021">Nastavenia</translation>
<translation id="2497284189126895209">Všetky súbory</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964">Pred <ph name="NUMBER_ONE"/> dňom</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sekunda</translation>
<translation id="7814458197256864873">&amp;Kopírovať</translation>
<translation id="3889424535448813030">Šípka doprava</translation>
+<translation id="4229495110203539533">Pred <ph name="NUMBER_ONE"/> s</translation>
+<translation id="2544782972264605588">Počet zvyšných sekúnd: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="6829324100069873704">Prejsť späť na upozornenia</translation>
<translation id="6528179044667508675">Nerušiť</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> s</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Upozornenia</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Rolovať na toto miesto</translation>
<translation id="4552416320897244156">PgDwn</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>
+<translation id="2148716181193084225">Dnes</translation>
<translation id="7960078400008666149">Nerušiť jednu hodinu</translation>
+<translation id="4373894838514502496">Pred <ph name="NUMBER_FEW"/> min</translation>
+<translation id="4115153316875436289">Počet dní: <ph name="NUMBER_TWO"/></translation>
<translation id="2190355936436201913">(prázdne)</translation>
+<translation id="1164369517022005061">Počet zvyšných hodín: <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="152482086482215392">Zostáva <ph name="NUMBER_ONE"/> sekunda</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Rolovať doprava</translation>
+<translation id="7414887922320653780">Zostáva <ph name="NUMBER_ONE"/> hodina</translation>
<translation id="2666092431469916601">Vrch</translation>
<translation id="8331626408530291785">Rolovať nahor</translation>
<translation id="4773379706300191099">Vypnúť prijímanie upozornení od rozšírenia <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Otvoriť súbor</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">Pred <ph name="NUMBER_DEFAULT"/> hodinami</translation>
<translation id="815598010540052116">Rolovať nadol</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Obnoviť</translation>
+<translation id="1243314992276662751">Odovzdať</translation>
+<translation id="50030952220075532">Zostáva <ph name="NUMBER_ONE"/> deň</translation>
<translation id="8179976553408161302">Začať</translation>
<translation id="945522503751344254">Poslať pripomienky</translation>
<translation id="9170848237812810038">&amp;Naspäť</translation>
+<translation id="1285266685456062655">Pred <ph name="NUMBER_FEW"/> hodinami</translation>
+<translation id="6918245111648057970">Povoliť upozornenia na nasledujúce položky pre každého používateľa:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> sekunda</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Nastavenia...</translation>
<translation id="6845383723252244143">Vybrať priečinok</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> sekundy</translation>
+<translation id="1095623615273566396">Počet sekúnd: <ph name="NUMBER_FEW"/></translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920">Počet dní: <ph name="NUMBER_FEW"/></translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> hodina</translation>
+<translation id="2679312662830811292">Pred <ph name="NUMBER_ONE"/> min</translation>
+<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="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="436869212180315161">Stlačiť</translation>
+<translation id="4860787810836767172">Pred <ph name="NUMBER_FEW"/> s</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minút</translation>
+<translation id="1858722859751911017">Zostávajú <ph name="NUMBER_FEW"/> minúty</translation>
<translation id="6040143037577758943">Zatvoriť</translation>
+<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="8226233771743600312">Nerušiť jeden deň</translation>
<translation id="7457942297256758195">Vymazať všetky</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – upozornenia</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565">Počet minút: <ph name="NUMBER_FEW"/></translation>
+<translation id="1963692530539281474">Počet zvyšných dní: <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minúty</translation>
+<translation id="5906719743126878045">Počet zvyšných hodín: <ph name="NUMBER_TWO"/></translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940">Počet sekúnd: <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="4197700912384709145">Počet sekúnd: <ph name="NUMBER_ZERO"/></translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382">Počet zvyšných dní: <ph name="NUMBER_FEW"/></translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – upozornenia (počet neprečítaných: <ph name="QUANTITY"/>)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Nerušiť</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimalizovať</translation>
<translation id="6394627529324717982">Čiarka</translation>
<translation id="4469842253116033348">Zakázať upozornenia z webových stránok <ph name="SITE"/></translation>
<translation id="3036649622769666520">Otvoriť súbory</translation>
<translation id="8328145009876646418">Ľavý okraj</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> sekundy</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_sl.xtb b/chromium/ui/base/strings/ui_strings_sl.xtb
index 9b7d3c8c45d..6f811ed4d2b 100644
--- a/chromium/ui/base/strings/ui_strings_sl.xtb
+++ b/chromium/ui/base/strings/ui_strings_sl.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798">Pred <ph name="NUMBER_MANY"/> h</translation>
+<translation id="6310545596129886942">še <ph name="NUMBER_FEW"/> sek</translation>
+<translation id="9213479837033539041">še <ph name="NUMBER_MANY"/> sekund</translation>
+<translation id="1209866192426315618">še <ph name="NUMBER_DEFAULT"/> min</translation>
<translation id="1801827354178857021">Pika</translation>
<translation id="1190609913194133056">Središče za obvestila</translation>
+<translation id="7470933019269157899">še <ph name="NUMBER_DEFAULT"/> min</translation>
<translation id="5613020302032141669">Puščica levo</translation>
<translation id="8602707065186045623">Datoteka <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> sek</translation>
+<translation id="7511635910912978956">še <ph name="NUMBER_FEW"/> h</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Prekliči</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Puščica gor</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> min</translation>
+<translation id="3520476450377425184">še <ph name="NUMBER_MANY"/> dni</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868">še <ph name="NUMBER_MANY"/> minut</translation>
+<translation id="8666066831007952346">še <ph name="NUMBER_TWO"/> dni</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> secs left</translation>
<translation id="3909791450649380159">Izrež&amp;i</translation>
+<translation id="2560788951337264832">še <ph name="NUMBER_ZERO"/> min</translation>
<translation id="688711909580084195">Spletna stran brez naslova</translation>
+<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="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>
<translation id="3234408098842461169">Puščica dol</translation>
<translation id="3087734570205094154">Na dno</translation>
+<translation id="5935630983280450497">še <ph name="NUMBER_ONE"/> min</translation>
<translation id="1860796786778352021">Zapri obvestilo</translation>
<translation id="6364916375976753737">Pomik levo</translation>
+<translation id="2629089419211541119">Pred <ph name="NUMBER_ONE"/> h</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="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>
<translation id="8210608804940886430">Stran dol</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543">Pred <ph name="NUMBER_MANY"/> s</translation>
+<translation id="7781829728241885113">Včeraj</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuti</translation>
+<translation id="50960180632766478">še <ph name="NUMBER_FEW"/> min</translation>
<translation id="6659594942844771486">Tabulator</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523">Pred <ph name="NUMBER_DEFAULT"/> dnevi</translation>
<translation id="8428213095426709021">Nastavitve</translation>
<translation id="2497284189126895209">Vse datoteke</translation>
+<translation id="7487278341251176613">še <ph name="NUMBER_TWO"/> min</translation>
+<translation id="5110450810124758964">Pred <ph name="NUMBER_ONE"/> dnevom</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sek</translation>
<translation id="7814458197256864873">&amp;Kopiraj</translation>
<translation id="3889424535448813030">Puščica desno</translation>
+<translation id="4229495110203539533">Pred <ph name="NUMBER_ONE"/> s</translation>
+<translation id="2544782972264605588">še <ph name="NUMBER_DEFAULT"/> sek</translation>
<translation id="6829324100069873704">Nazaj na obvestila</translation>
<translation id="6528179044667508675">Ne moti</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> s</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Obvestila</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Pomik do sem</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ur</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Danes</translation>
<translation id="7960078400008666149">Ne moti eno uro</translation>
+<translation id="4373894838514502496">Pred <ph name="NUMBER_FEW"/> min</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> dni</translation>
<translation id="2190355936436201913">(prazno)</translation>
+<translation id="1164369517022005061">še <ph name="NUMBER_DEFAULT"/> h</translation>
+<translation id="152482086482215392">še <ph name="NUMBER_ONE"/> sek</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Pomik desno</translation>
+<translation id="7414887922320653780">še <ph name="NUMBER_ONE"/> ura</translation>
<translation id="2666092431469916601">Na vrh</translation>
<translation id="8331626408530291785">Pomik gor</translation>
<translation id="4773379706300191099">Onemogoči obvestila aplikacije <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Odpri datoteko</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">Pred <ph name="NUMBER_DEFAULT"/> h</translation>
<translation id="815598010540052116">Pomik dol</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Obnovi</translation>
+<translation id="1243314992276662751">Prenesi</translation>
+<translation id="50030952220075532">še <ph name="NUMBER_ONE"/> dan</translation>
<translation id="8179976553408161302">Potrdi</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>
+<translation id="6918245111648057970">Za vsakega uporabnika dovoli obvestila naslednjih storitev:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> sekunda</translation>
+<translation id="3994835489895548312">še <ph name="NUMBER_MANY"/> min</translation>
+<translation id="6358975074282722691">Pred <ph name="NUMBER_TWO"/> s</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Nastavitve ...</translation>
<translation id="6845383723252244143">Izberite mapo</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> sekunde</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> sek</translation>
<translation id="5583640892426849032">Vračalka</translation>
+<translation id="5263972071113911534">Pred <ph name="NUMBER_MANY"/> dnevi</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> dni</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> h</translation>
+<translation id="2679312662830811292">Pred <ph name="NUMBER_ONE"/> min</translation>
+<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="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="436869212180315161">Pritisnite</translation>
+<translation id="4860787810836767172">Pred <ph name="NUMBER_FEW"/> s</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutes</translation>
+<translation id="1858722859751911017">še <ph name="NUMBER_FEW"/> min</translation>
<translation id="6040143037577758943">Zapri</translation>
+<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="8226233771743600312">Ne moti en dan</translation>
<translation id="7457942297256758195">Izbriši vse</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – obvestila</translation>
+<translation id="822618367988303761">Pred <ph name="NUMBER_TWO"/> dnevoma</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> min</translation>
+<translation id="1963692530539281474">še <ph name="NUMBER_DEFAULT"/> dni</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minute</translation>
+<translation id="5906719743126878045">še <ph name="NUMBER_TWO"/> uri</translation>
+<translation id="8959208747503200525">Pred <ph name="NUMBER_TWO"/> h</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> sek</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> sekund</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382">še <ph name="NUMBER_FEW"/> dni</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – obvestila (št. neprebranih: <ph name="QUANTITY"/>)</translation>
<translation id="6965382102122355670">V redu</translation>
<translation id="7850320739366109486">Ne moti</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Pomanjšaj</translation>
<translation id="6394627529324717982">Vejica</translation>
<translation id="4469842253116033348">Onemogoči obvestila spletnega mesta <ph name="SITE"/></translation>
<translation id="3036649622769666520">Odpri datoteke</translation>
<translation id="8328145009876646418">Levi rob</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> sekundi</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_sr.xtb b/chromium/ui/base/strings/ui_strings_sr.xtb
index 16bfb81bd8e..e036fd1c3d6 100644
--- a/chromium/ui/base/strings/ui_strings_sr.xtb
+++ b/chromium/ui/base/strings/ui_strings_sr.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942">Преостало <ph name="NUMBER_FEW"/> сек.</translation>
+<translation id="9213479837033539041">Преостало <ph name="NUMBER_MANY"/> сек.</translation>
+<translation id="1209866192426315618">Преостало <ph name="NUMBER_DEFAULT"/> мин.</translation>
<translation id="1801827354178857021">Тачка</translation>
<translation id="1190609913194133056">Центар за обавештења</translation>
+<translation id="7470933019269157899">Преостало је <ph name="NUMBER_DEFAULT"/> минута</translation>
<translation id="5613020302032141669">Стрелица налево</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> датотека (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> сек.</translation>
+<translation id="7511635910912978956">Преостало сати: <ph name="NUMBER_FEW"/></translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Откажи</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Стрелица нагоре</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
+<translation id="5608669887400696928">Сати: <ph name="NUMBER_DEFAULT"/></translation>
<translation id="3990502903496589789">Десна ивица</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> мин.</translation>
+<translation id="3520476450377425184">Преостало <ph name="NUMBER_MANY"/> дана</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868">Преостало <ph name="NUMBER_MANY"/> мин.</translation>
+<translation id="8666066831007952346">Преостало <ph name="NUMBER_TWO"/> дана</translation>
+<translation id="6390842777729054533">Преостало <ph name="NUMBER_ZERO"/> сек.</translation>
<translation id="3909791450649380159">Ис&amp;еци</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutes left</translation>
<translation id="688711909580084195">Веб-страница без наслова</translation>
+<translation id="3353284378027041011">Пре <ph name="NUMBER_FEW"/> дана</translation>
<translation id="5076340679995252485">&amp;Налепи</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="364720409959344976">Избор директоријума за отпремање</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016">Пре <ph name="NUMBER_TWO"/> минута</translation>
<translation id="3234408098842461169">Стрелица надоле</translation>
<translation id="3087734570205094154">Дно</translation>
+<translation id="5935630983280450497">Преостао <ph name="NUMBER_ONE"/> мин.</translation>
<translation id="1860796786778352021">Затвори обавештење</translation>
<translation id="6364916375976753737">Помери налево</translation>
+<translation id="2629089419211541119">Пре <ph name="NUMBER_ONE"/> сат</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868">Преостао је <ph name="NUMBER_ONE"/> минут</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> мин.</translation>
<translation id="8210608804940886430">Страница надоле</translation>
+<translation id="1572103024875503863">Дана: <ph name="NUMBER_MANY"/></translation>
+<translation id="7163503212501929773">Преостало сати: <ph name="NUMBER_MANY"/></translation>
<translation id="5329858601952122676">&amp;Избриши</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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Јуче</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> минута</translation>
+<translation id="50960180632766478">Преостало <ph name="NUMBER_FEW"/> мин.</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523">Пре <ph name="NUMBER_DEFAULT"/> дана</translation>
<translation id="8428213095426709021">Подешавања</translation>
<translation id="2497284189126895209">Све датотеке</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964">Пре <ph name="NUMBER_ONE"/> дан</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> сек.</translation>
<translation id="7814458197256864873">&amp;Копирај</translation>
<translation id="3889424535448813030">Стрелица надесно</translation>
+<translation id="4229495110203539533">Пре <ph name="NUMBER_ONE"/> секунду</translation>
+<translation id="2544782972264605588">Преостало <ph name="NUMBER_DEFAULT"/> сек.</translation>
<translation id="6829324100069873704">Вратите се на обавештења</translation>
<translation id="6528179044667508675">Не узнемиравај</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> сек</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> мин.</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">Дозволи обавештења из следећих извора:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> минут</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Нема шта да се види овде. Наставите даље.</translation>
<translation id="2482878487686419369">Обавештења</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Помери се овде</translation>
<translation id="4552416320897244156">Page Down</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401">Сати: <ph name="NUMBER_MANY"/></translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Данас</translation>
<translation id="7960078400008666149">Не узнемиравај у периоду од сат времена</translation>
+<translation id="4373894838514502496">Пре <ph name="NUMBER_FEW"/> минута</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> дана</translation>
<translation id="2190355936436201913">(празно)</translation>
+<translation id="1164369517022005061">Преостало сати: <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="152482086482215392">Преостала <ph name="NUMBER_ONE"/> сек.</translation>
<translation id="8447116497070723931">Page Up</translation>
<translation id="4588090240171750605">Помери надесно</translation>
+<translation id="7414887922320653780">Преостао <ph name="NUMBER_ONE"/> сат</translation>
<translation id="2666092431469916601">Врх</translation>
<translation id="8331626408530291785">Помери нагоре</translation>
<translation id="4773379706300191099">Онемогући обавештења из додатка <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Отварање датотеке</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">Пре <ph name="NUMBER_DEFAULT"/> сата</translation>
<translation id="815598010540052116">Помери надоле</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Поново отвори</translation>
+<translation id="1243314992276662751">Отпреми</translation>
+<translation id="50030952220075532">Преостао <ph name="NUMBER_ONE"/> дан</translation>
<translation id="8179976553408161302">Унеси</translation>
<translation id="945522503751344254">Пошаљи повратне информације</translation>
<translation id="9170848237812810038">&amp;Опозови</translation>
+<translation id="1285266685456062655">Пре <ph name="NUMBER_FEW"/> сата</translation>
+<translation id="6918245111648057970">Омогући обавештења следећих производа за сваког корисника:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> секунда</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691">Пре <ph name="NUMBER_TWO"/> секунде</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Подешавања...</translation>
<translation id="6845383723252244143">Избор директоријума</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> секунде</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> сек.</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920">Дана: <ph name="NUMBER_FEW"/></translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> сат</translation>
+<translation id="2679312662830811292">Пре <ph name="NUMBER_ONE"/> минут</translation>
+<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="9098468523912235228">Пре <ph name="NUMBER_DEFAULT"/> секунди</translation>
+<translation id="494645311413743213">Преостало <ph name="NUMBER_TWO"/> сек.</translation>
<translation id="4570886800634958009">Прошири обавештење</translation>
<translation id="436869212180315161">Притисните</translation>
+<translation id="4860787810836767172">Пре <ph name="NUMBER_FEW"/> секунде</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> минута</translation>
+<translation id="1858722859751911017">Преостала су <ph name="NUMBER_FEW"/> минута</translation>
<translation id="6040143037577758943">Затвори</translation>
+<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="8226233771743600312">Не узнемиравај у периоду од једног дана</translation>
<translation id="7457942297256758195">Обриши све</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – Обавештења</translation>
+<translation id="822618367988303761">Пре <ph name="NUMBER_TWO"/> дана</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> мин.</translation>
+<translation id="1963692530539281474">Преостало <ph name="NUMBER_DEFAULT"/> дана</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> минута</translation>
+<translation id="5906719743126878045">Преостало сати: <ph name="NUMBER_TWO"/></translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> сек.</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> сек.</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> секунди</translation>
+<translation id="3759876923365568382">Преостало <ph name="NUMBER_FEW"/> дана</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – Обавештења (непрочитаних: <ph name="QUANTITY"/>)</translation>
<translation id="6965382102122355670">Потврди</translation>
<translation id="7850320739366109486">Не узнемиравај</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Смањи</translation>
<translation id="6394627529324717982">Зарез</translation>
<translation id="4469842253116033348">Онемогући обавештења са <ph name="SITE"/></translation>
<translation id="3036649622769666520">Отварање датотека</translation>
<translation id="8328145009876646418">Лева ивица</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> секунде</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_sv.xtb b/chromium/ui/base/strings/ui_strings_sv.xtb
index 93273cf1dcb..d8de713c599 100644
--- a/chromium/ui/base/strings/ui_strings_sv.xtb
+++ b/chromium/ui/base/strings/ui_strings_sv.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> sekunder kvar</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> sekunder kvar</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> minuter kvar</translation>
<translation id="1801827354178857021">Punkt</translation>
<translation id="1190609913194133056">Meddelandecenter</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> minuter kvar</translation>
<translation id="5613020302032141669">Vänsterpil</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/>-fil (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> sekunder</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> timmar kvar</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Avbryt</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Uppil</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> minuter</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> dagar kvar</translation>
<translation id="932327136139879170">Startsida</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> minuter kvar</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> dagar kvar</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> sekunder kvar</translation>
<translation id="3909791450649380159">&amp;Klipp ut</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minuter kvar</translation>
<translation id="688711909580084195">Namnlös webbsida</translation>
+<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="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>
<translation id="3234408098842461169">Nedpil</translation>
<translation id="3087734570205094154">Nederst</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> minut kvar</translation>
<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="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="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>
<translation id="8210608804940886430">Page Down</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> sekunder</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> kB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minuter</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Igår</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minuter</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> minuter kvar</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>
<translation id="8428213095426709021">Inställningar</translation>
<translation id="2497284189126895209">Alla filer</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minuter kvar</translation>
+<translation id="5110450810124758964">För <ph name="NUMBER_ONE"/> dag sedan</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sekund</translation>
<translation id="7814458197256864873">&amp;Kopiera</translation>
<translation id="3889424535448813030">Högerpil</translation>
+<translation id="4229495110203539533">För <ph name="NUMBER_ONE"/> sekund sedan</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> sekunder kvar</translation>
<translation id="6829324100069873704">Gå tillbaka till meddelanden</translation>
<translation id="6528179044667508675">Stör inte</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> sekunder</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Aviseringar</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Rulla hit</translation>
<translation id="4552416320897244156">Page Down</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> timmar</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> kB/sek</translation>
+<translation id="2148716181193084225">Idag</translation>
<translation id="7960078400008666149">Stör inte i en timme</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> dagar</translation>
<translation id="2190355936436201913">(tom)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> timmar kvar</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> sekund kvar</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Rulla åt höger</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> timmar kvar</translation>
<translation id="2666092431469916601">Överst</translation>
<translation id="8331626408530291785">Rulla uppåt</translation>
<translation id="4773379706300191099">Inaktivera meddelanden från <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Öppna fil</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">För <ph name="NUMBER_DEFAULT"/> timmar sedan</translation>
<translation id="815598010540052116">Rulla nedåt</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Återställ</translation>
+<translation id="1243314992276662751">Överför</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> dag kvar</translation>
<translation id="8179976553408161302">Start</translation>
<translation id="945522503751344254">Skicka synpunkter</translation>
<translation id="9170848237812810038">&amp;Ångra</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">Tillåt meddelanden från följande personer för alla användare:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> sekund</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minuter kvar</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Inställningar...</translation>
<translation id="6845383723252244143">Välj mapp</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> sekunder</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> sekunder</translation>
<translation id="5583640892426849032">Backsteg</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> dagar</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> timme</translation>
+<translation id="2679312662830811292">För <ph name="NUMBER_ONE"/> minut sedan</translation>
+<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="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="436869212180315161">Pressen</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/sek</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minuter</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> minuter kvar</translation>
<translation id="6040143037577758943">Stäng</translation>
+<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="8226233771743600312">Stör inte i en dag</translation>
<translation id="7457942297256758195">Ta bort alla</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – meddelanden</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> minuter</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> dagar kvar</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minuter</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> timmar kvar</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Skift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> sekunder</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> sekunder</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> sekunder</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> dagar kvar</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/sek</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – meddelanden (<ph name="QUANTITY"/> olästa)</translation>
<translation id="6965382102122355670">OK</translation>
<translation id="7850320739366109486">Stör inte</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Minimera</translation>
<translation id="6394627529324717982">Komma</translation>
<translation id="4469842253116033348">Inaktivera meddelanden från <ph name="SITE"/></translation>
<translation id="3036649622769666520">Öppna filer</translation>
<translation id="8328145009876646418">Vänsterkant</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> sekunder</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_sw.xtb b/chromium/ui/base/strings/ui_strings_sw.xtb
index 299f3c23271..95cdd9bf1f6 100644
--- a/chromium/ui/base/strings/ui_strings_sw.xtb
+++ b/chromium/ui/base/strings/ui_strings_sw.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Futa</translation>
<translation id="528468243742722775">Mwisho</translation>
+<translation id="5341849548509163798">Saa <ph name="NUMBER_MANY"/> zilizopita</translation>
+<translation id="6310545596129886942">zimesalia sekunde <ph name="NUMBER_FEW"/></translation>
+<translation id="9213479837033539041">zimesalia sekunde <ph name="NUMBER_MANY"/></translation>
+<translation id="1209866192426315618">zimesalia dakika <ph name="NUMBER_DEFAULT"/></translation>
<translation id="1801827354178857021">Kikomo</translation>
<translation id="1190609913194133056">Kituo cha Arifa</translation>
+<translation id="7470933019269157899">Dakika <ph name="NUMBER_DEFAULT"/> zinasalia</translation>
<translation id="5613020302032141669">Mshale Kushoto</translation>
<translation id="8602707065186045623">Faili ya <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918">dakika <ph name="NUMBER_ZERO"/> zilizopita</translation>
+<translation id="7121570032414343252">zimesalia sekunde <ph name="NUMBER_TWO"/></translation>
+<translation id="7511635910912978956">zimesalia saa <ph name="NUMBER_FEW"/></translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Ghairi</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658">B <ph name="QUANTITY"/></translation>
<translation id="3660179305079774227">Mshale Juu</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="8507996248087185956">dakika <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="3520476450377425184">zimesalia siku <ph name="NUMBER_MANY"/></translation>
<translation id="932327136139879170">Nyumbani</translation>
+<translation id="5600907569873192868">zimesalia dakika <ph name="NUMBER_MANY"/></translation>
+<translation id="8666066831007952346">zimesalia siku <ph name="NUMBER_TWO"/></translation>
+<translation id="6390842777729054533">zimesalia sekunde <ph name="NUMBER_ZERO"/></translation>
<translation id="3909791450649380159">&amp;Kata</translation>
+<translation id="2560788951337264832">Dakika <ph name="NUMBER_ZERO"/> zinasalia</translation>
<translation id="688711909580084195">Ukurasa wa Wavuti usio na Kichwa</translation>
+<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="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>
<translation id="3234408098842461169">Mshale Chini</translation>
<translation id="3087734570205094154">Chini</translation>
+<translation id="5935630983280450497">imesalia dakika <ph name="NUMBER_ONE"/></translation>
<translation id="1860796786778352021">Funga arifa</translation>
<translation id="6364916375976753737">Sogeza Kushoto</translation>
+<translation id="2629089419211541119">saa <ph name="NUMBER_ONE"/> lililopita</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="6719684875142564568">saa <ph name="NUMBER_ZERO"/></translation>
+<translation id="7836361698254323868">Dakika <ph name="NUMBER_ONE"/> inasalia</translation>
+<translation id="2953767478223974804">dakika <ph name="NUMBER_ONE"/></translation>
<translation id="8210608804940886430">Ukurasa mmoja chini</translation>
+<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="8088823334188264070">sekunde <ph name="NUMBER_MANY"/></translation>
<translation id="8901569739625249689">KB <ph name="QUANTITY"/></translation>
+<translation id="7712011264267466734">Dakika <ph name="NUMBER_MANY"/></translation>
+<translation id="7275974018215686543">sekunde <ph name="NUMBER_MANY"/> zilizopita</translation>
+<translation id="7781829728241885113">Jana</translation>
+<translation id="3424538384153559412">Dakika <ph name="NUMBER_TWO"/></translation>
+<translation id="50960180632766478">zimesalia dakika <ph name="NUMBER_FEW"/></translation>
<translation id="6659594942844771486">Kichupo</translation>
<translation id="3049748772180311791">MB <ph name="QUANTITY"/></translation>
+<translation id="4988273303304146523">siku <ph name="NUMBER_DEFAULT"/> zilizopita</translation>
<translation id="8428213095426709021">Mipangilio</translation>
<translation id="2497284189126895209">Faili zote</translation>
+<translation id="7487278341251176613">Dakika <ph name="NUMBER_TWO"/> zinasalia</translation>
+<translation id="5110450810124758964">siku <ph name="NUMBER_ONE"/> iliyopita</translation>
+<translation id="2820806154655529776">sekunde <ph name="NUMBER_ONE"/></translation>
<translation id="7814458197256864873">&amp;Nakili</translation>
<translation id="3889424535448813030">Mshale Kulia</translation>
+<translation id="4229495110203539533">sekunde <ph name="NUMBER_ONE"/> iliyopita</translation>
+<translation id="2544782972264605588">zimesalia sekunde <ph name="NUMBER_DEFAULT"/></translation>
<translation id="6829324100069873704">Rudi kwenye arifa</translation>
<translation id="6528179044667508675">Usinisumbue</translation>
+<translation id="5066177358602611309">Sekunde <ph name="NUMBER_DEFAULT"/></translation>
+<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="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="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="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>
<translation id="2482878487686419369">Arifa</translation>
+<translation id="6357135709975569075">siku <ph name="NUMBER_ZERO"/></translation>
<translation id="3183922693828471536">Sogeza Hadi Hapa</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401">saa <ph name="NUMBER_MANY"/></translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Leo</translation>
<translation id="7960078400008666149">Usinisumbue kwa saa moja</translation>
+<translation id="4373894838514502496">dakika <ph name="NUMBER_FEW"/> zilizopita</translation>
+<translation id="4115153316875436289">siku <ph name="NUMBER_TWO"/></translation>
<translation id="2190355936436201913">(tupu)</translation>
+<translation id="1164369517022005061">Zimesalia saa <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="152482086482215392">imesalia sekunde <ph name="NUMBER_ONE"/></translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Sogeza Kulia</translation>
+<translation id="7414887922320653780">limesalia saa <ph name="NUMBER_ONE"/></translation>
<translation id="2666092431469916601">Ya Juu</translation>
<translation id="8331626408530291785">Sogeza Juu</translation>
<translation id="4773379706300191099">Zima arifa kutoka <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Fungua Faili</translation>
+<translation id="2864069933652346933">zimesalia siku <ph name="NUMBER_ZERO"/></translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045">Saa <ph name="NUMBER_DEFAULT"/> zilizopita</translation>
<translation id="815598010540052116">Sogeza Chini</translation>
+<translation id="1308727876662951186">zimesalia dakika <ph name="NUMBER_ZERO"/></translation>
<translation id="3157931365184549694">Rejesha</translation>
+<translation id="1243314992276662751">Pakia</translation>
+<translation id="50030952220075532">imesalia siku <ph name="NUMBER_ONE"/></translation>
<translation id="8179976553408161302">Enter</translation>
<translation id="945522503751344254">Tuma maoni</translation>
<translation id="9170848237812810038">&amp;Tendua</translation>
+<translation id="1285266685456062655">Saa <ph name="NUMBER_FEW"/> zilizopita</translation>
+<translation id="6918245111648057970">Ruhusu arifa kutoka kwa wafuatao kwa kila mtumiaji:</translation>
+<translation id="5489830104927132166">Sekunde <ph name="NUMBER_ONE"/></translation>
+<translation id="3994835489895548312">Dakika <ph name="NUMBER_MANY"/> zinasalia</translation>
+<translation id="6358975074282722691">sekunde <ph name="NUMBER_TWO"/> zilizopita</translation>
<translation id="520299402983819650">PB <ph name="QUANTITY"/></translation>
<translation id="2983818520079887040">Mipangilio...</translation>
<translation id="6845383723252244143">Chagua Folda</translation>
+<translation id="7600770490873519066">Sekunde <ph name="NUMBER_FEW"/></translation>
+<translation id="1095623615273566396">sekunde <ph name="NUMBER_FEW"/></translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534">siku <ph name="NUMBER_MANY"/> zilizopita</translation>
+<translation id="8355915647418390920">siku <ph name="NUMBER_FEW"/></translation>
+<translation id="5116333507878097773">saa <ph name="NUMBER_ONE"/></translation>
+<translation id="2679312662830811292">dakika <ph name="NUMBER_ONE"/> iliyopita</translation>
+<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="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="436869212180315161">Bofya</translation>
+<translation id="4860787810836767172">sekunde <ph name="NUMBER_FEW"/> zilizopita</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074">Dakika <ph name="NUMBER_ZERO"/></translation>
+<translation id="1858722859751911017">Dakika <ph name="NUMBER_FEW"/> zinasalia</translation>
<translation id="6040143037577758943">Funga</translation>
+<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="8226233771743600312">Usinisumbue kwa siku moja</translation>
<translation id="7457942297256758195">Futa Zote</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - Arifa</translation>
+<translation id="822618367988303761">siku <ph name="NUMBER_TWO"/> zilizopita</translation>
+<translation id="4745438305783437565">dakika <ph name="NUMBER_FEW"/></translation>
+<translation id="1963692530539281474">Zimesalia siku <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="7509440305564869263">Dakika <ph name="NUMBER_FEW"/></translation>
+<translation id="5906719743126878045">zimesalia saa <ph name="NUMBER_TWO"/></translation>
+<translation id="8959208747503200525">Saa <ph name="NUMBER_TWO"/> zilizopita</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940">sekunde <ph name="NUMBER_DEFAULT"/></translation>
+<translation id="4197700912384709145">sekunde <ph name="NUMBER_ZERO"/></translation>
+<translation id="27199337101878275">Sekunde <ph name="NUMBER_MANY"/></translation>
+<translation id="3759876923365568382">zimesalia siku <ph name="NUMBER_FEW"/></translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - Arifa (<ph name="QUANTITY"/> zisizosomwa)</translation>
<translation id="6965382102122355670">Sawa</translation>
<translation id="7850320739366109486">Usinisumbue</translation>
+<translation id="6978839998405419496">siku <ph name="NUMBER_ZERO"/> zilizopita</translation>
<translation id="5941711191222866238">Punguza</translation>
<translation id="6394627529324717982">Koma</translation>
<translation id="4469842253116033348">Lemaza arifa kutoka <ph name="SITE"/></translation>
<translation id="3036649622769666520">Fungua Mafaili</translation>
<translation id="8328145009876646418">Ncha ya Kushoto</translation>
+<translation id="7372005818821648611">Sekunde <ph name="NUMBER_TWO"/></translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_ta.xtb b/chromium/ui/base/strings/ui_strings_ta.xtb
index 1159461229d..008279fb712 100644
--- a/chromium/ui/base/strings/ui_strings_ta.xtb
+++ b/chromium/ui/base/strings/ui_strings_ta.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942">இன்னும் <ph name="NUMBER_FEW"/> வினாடிகள் உள்ளன</translation>
+<translation id="9213479837033539041">இன்னும் <ph name="NUMBER_MANY"/> நொடிகள் உள்ளன</translation>
+<translation id="1209866192426315618">இன்னும் <ph name="NUMBER_DEFAULT"/> நிமிடங்கள் உள்ளன</translation>
<translation id="1801827354178857021">முற்றுப்புள்ளி</translation>
<translation id="1190609913194133056">அறிவிப்பு மையம்</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> நிமிடங்கள் உள்ளன</translation>
<translation id="5613020302032141669">இடது அம்பு</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/>கோப்பு(.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> வினாடிகள்</translation>
+<translation id="7511635910912978956">இன்னும் <ph name="NUMBER_FEW"/> மணிநேரம் உள்ளது</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">ரத்துசெய்</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> பை</translation>
<translation id="3660179305079774227">மேல்நோக்கிய அம்பு</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> மெ.பை/வி</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> மணி நேரம்</translation>
<translation id="3990502903496589789">வலது விளிம்பு</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> நிமிடங்கள்</translation>
+<translation id="3520476450377425184">இன்னும் <ph name="NUMBER_MANY"/> நாட்கள் உள்ளன</translation>
<translation id="932327136139879170">முகப்பு</translation>
+<translation id="5600907569873192868">இன்னும் <ph name="NUMBER_MANY"/> நிமிடங்கள் உள்ளன</translation>
+<translation id="8666066831007952346">இன்னும் <ph name="NUMBER_TWO"/> நாட்கள் உள்ளன</translation>
+<translation id="6390842777729054533">இன்னும் <ph name="NUMBER_ZERO"/> வினாடிகள் உள்ளன</translation>
<translation id="3909791450649380159">வெட்&amp;டு</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> நிமிடங்கள் உள்ளன</translation>
<translation id="688711909580084195">தலைப்பிடாத வலைப்பக்கம்</translation>
+<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> days ago</translation>
<translation id="5076340679995252485">&amp;ஒட்டு</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> டெ.பை</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>
<translation id="3234408098842461169">கீழ்நோக்கிய அம்பு</translation>
<translation id="3087734570205094154">கீழே</translation>
+<translation id="5935630983280450497">இன்னும் <ph name="NUMBER_ONE"/> நிமிடம் உள்ளது</translation>
<translation id="1860796786778352021">அறிவிப்பை மூடு</translation>
<translation id="6364916375976753737">இடப்புறம் உருட்டு</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> நிமிடம் உள்ளது</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> நிமிடம்</translation>
<translation id="8210608804940886430">பக்கத்தின் கீழே</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> நாட்கள்</translation>
+<translation id="7163503212501929773">இன்னும் <ph name="NUMBER_MANY"/> மணிநேரம் உள்ளது</translation>
<translation id="5329858601952122676">&amp;நீக்கு</translation>
+<translation id="8088823334188264070"><ph name="NUMBER_MANY"/> நொடிகள்</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> கி.பை.</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> நிமிடங்கள்</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">நேற்று</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> நிமிடங்கள்</translation>
+<translation id="50960180632766478">இன்னும் <ph name="NUMBER_FEW"/> நிமிடங்கள் உள்ளன</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> மெ.பை</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
<translation id="8428213095426709021">அமைப்புகள்</translation>
<translation id="2497284189126895209">அனைத்து கோப்புகளும்</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> நிமிடங்கள் உள்ளன</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> day ago</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> நொடி</translation>
<translation id="7814458197256864873">&amp;நகலெடு</translation>
<translation id="3889424535448813030">வலது அம்பு</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> sec ago</translation>
+<translation id="2544782972264605588">இன்னும் <ph name="NUMBER_DEFAULT"/> வினாடிகள் உள்ளன</translation>
<translation id="6829324100069873704">அறிவிப்புகளுக்குச் செல்</translation>
<translation id="6528179044667508675">தொந்தரவு செய்ய வேண்டாம்</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> வினாடிகள்</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> நிமிடங்கள்</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">பின்வருபவற்றிலிருந்து வரும் அறிவிப்புகளை அனுமதி:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> நிமிடம்</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">பார்க்க இங்கு எதுவுமில்லை, தொடரவும்.</translation>
<translation id="2482878487686419369">அறிவிக்கைகள்</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">இங்கே உருட்டு</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> மணிநேரம்</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> கி.பை./வி</translation>
+<translation id="2148716181193084225">இன்று</translation>
<translation id="7960078400008666149">ஒரு மணிநேரத்திற்குத் தொந்தரவு செய்ய வேண்டாம்</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> நாட்கள்</translation>
<translation id="2190355936436201913">(காலி)</translation>
+<translation id="1164369517022005061">இன்னும் <ph name="NUMBER_DEFAULT"/> மணிநேரம் உள்ளது</translation>
+<translation id="152482086482215392">இன்னும் <ph name="NUMBER_ONE"/> நொடிகள் உள்ளன</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">வலப்புறம் உருட்டு</translation>
+<translation id="7414887922320653780">இன்னும் <ph name="NUMBER_ONE"/> மணிநேரம் உள்ளது</translation>
<translation id="2666092431469916601">மேலே</translation>
<translation id="8331626408530291785">மேலே உருட்டு</translation>
<translation id="4773379706300191099"><ph name="EXTENSION_NAME"/> இலிருந்து வரும் அறிவிப்புகளை முடக்கு</translation>
<translation id="7907591526440419938">கோப்பைத் திற</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> hours ago</translation>
<translation id="815598010540052116">கீழே உருட்டு</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">மீட்டமை</translation>
+<translation id="1243314992276662751">பதிவேற்று</translation>
+<translation id="50030952220075532">இன்னும் <ph name="NUMBER_ONE"/> நாட்கள் உள்ளன</translation>
<translation id="8179976553408161302">உள்ளிடு</translation>
<translation id="945522503751344254">பின்னூட்டம் அனுப்புக</translation>
<translation id="9170848237812810038">&amp;செயல்தவிர்</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">ஒவ்வொரு பயனருக்கும் பின்வருபவையிலிருந்து அறிவிப்புகளை அனுமதி:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> வினாடி</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> நிமிடங்கள் உள்ளன</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> பெ.பை</translation>
<translation id="2983818520079887040">அமைப்புகள்...</translation>
<translation id="6845383723252244143">கோப்புறையைத் தேர்ந்தெடு</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> வினாடிகள்</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> நொடிகள்</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> நாட்கள்</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> மணி நேரம்</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> min ago</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> வினாடிகள் உள்ளன</translation>
<translation id="4570886800634958009">அறிவிப்பை விரிவாக்கு</translation>
<translation id="436869212180315161">அழுத்து</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> டெ.பை/வி</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> நிமிடங்கள்</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> நிமிடங்கள் உள்ளன</translation>
<translation id="6040143037577758943">மூடு</translation>
+<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> பை/வி</translation>
<translation id="7649070708921625228">உதவி</translation>
<translation id="8226233771743600312">ஒரு நாள் தொந்தரவு செய்ய வேண்டாம்</translation>
<translation id="7457942297256758195">அனைத்தையும் அழி</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - அறிவிப்புகள்</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> நிமிடங்கள்</translation>
+<translation id="1963692530539281474">இன்னும் <ph name="NUMBER_DEFAULT"/> நாட்கள் உள்ளன</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> நிமிடங்கள்</translation>
+<translation id="5906719743126878045">இன்னும் <ph name="NUMBER_TWO"/> மணிநேரம் உள்ளது</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> நொடிகள்</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> நொடிகள்</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> வினாடிகள்</translation>
+<translation id="3759876923365568382">இன்னும் <ph name="NUMBER_FEW"/> நாட்கள் உள்ளன</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> பெ.பை/வி</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - அறிவிப்புகள் (<ph name="QUANTITY"/> படிக்காதவை)</translation>
<translation id="6965382102122355670">சரி</translation>
<translation id="7850320739366109486">தொந்தரவு செய்ய வேண்டாம்</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">சிறிதாக்கு</translation>
<translation id="6394627529324717982">கமா</translation>
<translation id="4469842253116033348"><ph name="SITE"/> இலிருந்து வரும் அறிவிப்புகளை முடக்கு</translation>
<translation id="3036649622769666520">கோப்புகளைத் திற</translation>
<translation id="8328145009876646418">இடதுபுற முனை</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> வினாடிகள்</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_te.xtb b/chromium/ui/base/strings/ui_strings_te.xtb
index 500f8657619..e94d3eba4b1 100644
--- a/chromium/ui/base/strings/ui_strings_te.xtb
+++ b/chromium/ui/base/strings/ui_strings_te.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">ముగింపు</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> సెకన్లు మిగిలి ఉన్నాయి</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> సెకన్లు మిగిలి ఉన్నాయి</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> నిమిషాలు మిగిలి ఉన్నాయి</translation>
<translation id="1801827354178857021">సమయం</translation>
<translation id="1190609913194133056">నోటిఫికేషన్ కేంద్రం</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> నిమిషాలు మిగిలి ఉన్నాయి</translation>
<translation id="5613020302032141669">ఎడమ బాణం</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> ఫైల్ (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> సెకన్లు</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> గంటలు మిగిలి ఉన్నాయి</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">రద్దు చెయ్యి</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">ఎగువ బాణం</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> గంటలు</translation>
<translation id="3990502903496589789">కుడి సరిహద్దు</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> నిమిషాలు</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> రోజులు మిగిలి ఉన్నాయి</translation>
<translation id="932327136139879170">హోమ్</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> నిమిషాలు మిగిలాయి</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> రోజులు మిగిలి ఉన్నాయి</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> సెకన్లు మిగిలి ఉన్నాయి</translation>
<translation id="3909791450649380159">క&amp;త్తిరించు</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> నిమిషాలు మిగిలి ఉన్నాయి</translation>
<translation id="688711909580084195">శీర్షికలేని వెబ్‌పేజీ</translation>
+<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="364720409959344976">అప్‌లోడ్ చేయడానికి ఫోల్డర్‌ని ఎంచుకోండి</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> mins ago</translation>
<translation id="3234408098842461169">క్రింది బాణం</translation>
<translation id="3087734570205094154">దిగువ</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> నిమిషాలు మిగిలి ఉన్నాయి</translation>
<translation id="1860796786778352021">నోటిఫికేషన్‌ను మూసివేయి</translation>
<translation id="6364916375976753737">ఎడమకి స్క్రోల్ చేయి</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> hour ago</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868"><ph name="NUMBER_ONE"/> నిమిషం మిగిలి ఉంది</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> నిమిషం</translation>
<translation id="8210608804940886430">పేజీ క్రిందికి</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> రోజులు</translation>
+<translation id="7163503212501929773"><ph name="NUMBER_MANY"/> గంటలు మిగిలి ఉన్నాయి</translation>
<translation id="5329858601952122676">&amp;తొలగించు</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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">నిన్న</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> నిమిషాలు</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> నిమిషాలు మిగిలిలాయి</translation>
<translation id="6659594942844771486">టాబ్</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> days ago</translation>
<translation id="8428213095426709021">సెట్టింగ్‌లు</translation>
<translation id="2497284189126895209">మొత్తం ఫైళ్లు</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> నిమిషాలు మిగిలి ఉన్నాయి</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> day ago</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> సెకను</translation>
<translation id="7814458197256864873">&amp;కాపీ</translation>
<translation id="3889424535448813030">కుడి బాణం</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> sec ago</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> సెకన్లు మిగిలాయి</translation>
<translation id="6829324100069873704">నోటిఫికేషన్‌లకు తిరిగి వెళ్లు</translation>
<translation id="6528179044667508675">అంతరాయం కలిగించవద్దు</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> సెకన్లు</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> నిమిషాలు</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">వీటి నుండి నోటిఫికేషన్‌లను అనుమతించు:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> నిమిషం</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">ఇక్కడ చూడటానికి ఏమీ లేదు, కొనసాగండి.</translation>
<translation id="2482878487686419369">ప్రకటనలు</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">ఇక్కడ స్క్రోల్ చెయ్యండి</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> గంటలు</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/సె</translation>
+<translation id="2148716181193084225">ఈ రోజు</translation>
<translation id="7960078400008666149">ఒక గంటపాటు అంతరాయం కలిగించవద్దు</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> రోజులు</translation>
<translation id="2190355936436201913">(ఖాళీ)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> గంటలు మిగిలాయి</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> సెకన్లు మిగిలి ఉన్నాయి</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">కుడికి స్క్రోల్ చెయ్యి</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> గంటలు మిగిలా యి</translation>
<translation id="2666092431469916601">పైన</translation>
<translation id="8331626408530291785">పైకి స్క్రోల్ చెయ్యి</translation>
<translation id="4773379706300191099"><ph name="EXTENSION_NAME"/> నుండి నోటిఫికేషన్‌లను నిలిపివేయి</translation>
<translation id="7907591526440419938">ఫైల్‌ను తెరువు</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> hours ago</translation>
<translation id="815598010540052116">క్రిందికి స్క్రోల్ చేయి</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">పునరుద్ధరించు</translation>
+<translation id="1243314992276662751">అప్‌లోడ్ చేయి</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> రోజులు మిగిలి ఉన్నాయి</translation>
<translation id="8179976553408161302">నమోదు చేయండి</translation>
<translation id="945522503751344254">అభిప్రాయాన్ని పంపండి</translation>
<translation id="9170848237812810038">&amp;అన్డు</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> hours ago</translation>
+<translation id="6918245111648057970">ప్రతి వినియోగదారు కోసం కింది వారి నుండి నోటిఫికేషన్‌లను అనుమతించు:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> సెకను</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> నిమిషాలు మిగిలి ఉన్నాయి</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">సెట్టింగ్‌లు...</translation>
<translation id="6845383723252244143">ఫోల్డర్‌ను ఎంచుకో</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> సెకన్లు</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> సెకన్లు</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> రోజులు</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> గంట</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> min ago</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> secs ago</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> సెకన్లు మిగిలి ఉన్నాయి</translation>
<translation id="4570886800634958009">నోటిఫికేషన్‌ను విస్తరించు</translation>
<translation id="436869212180315161">నొక్కు</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> secs ago</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> నిమిషాలు</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> నిమిషాలు మిగిలి ఉన్నాయి</translation>
<translation id="6040143037577758943">మూసివేయి</translation>
+<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="8226233771743600312">ఒక రోజుపాటు అంతరాయం కలిగించవద్దు</translation>
<translation id="7457942297256758195">అన్నీ క్లియర్ చేయి</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - నోటిఫికేషన్‌లు</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> నిమిషాలు</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> రోజులు మిగిలాయి</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> నిమిషాలు</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> గంటలు మిగిలి ఉన్నాయి</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> సెకన్లు</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> సెకన్లు</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> సెకన్లు</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> రోజులు మిగిలాయి</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - నోటిఫికేషన్‌లు (<ph name="QUANTITY"/> చదవనివి)</translation>
<translation id="6965382102122355670">సరే</translation>
<translation id="7850320739366109486">అంతరాయం కలిగించవద్దు</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">కనిష్టీకరించు</translation>
<translation id="6394627529324717982">కామా</translation>
<translation id="4469842253116033348"><ph name="SITE"/> నుండి ప్రకటనలను ఆపివెయ్యి</translation>
<translation id="3036649622769666520">ఫైళ్ళను తెరువు</translation>
<translation id="8328145009876646418">ఎడమ హద్దు</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> సెకన్లు</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_th.xtb b/chromium/ui/base/strings/ui_strings_th.xtb
index 9429be66bbc..4ebb6112e4e 100644
--- a/chromium/ui/base/strings/ui_strings_th.xtb
+++ b/chromium/ui/base/strings/ui_strings_th.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> ชั่วโมงที่ผ่านมา</translation>
+<translation id="6310545596129886942">เหลือ <ph name="NUMBER_FEW"/> วินาที</translation>
+<translation id="9213479837033539041">เหลือ <ph name="NUMBER_MANY"/> วินาที</translation>
+<translation id="1209866192426315618">เหลือ <ph name="NUMBER_DEFAULT"/> นาที</translation>
<translation id="1801827354178857021">มหัพภาค</translation>
<translation id="1190609913194133056">ศูนย์การแจ้งเตือน</translation>
+<translation id="7470933019269157899">เหลือ <ph name="NUMBER_DEFAULT"/> นาที</translation>
<translation id="5613020302032141669">ลูกศรซ้าย</translation>
<translation id="8602707065186045623">ไฟล์ <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> วินาที</translation>
+<translation id="7511635910912978956">เหลือ <ph name="NUMBER_FEW"/> ชั่วโมง</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">ยกเลิก</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">ลูกศรขึ้น</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/วินาที</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> ชั่วโมง</translation>
<translation id="3990502903496589789">ขอบขวา</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> นาที</translation>
+<translation id="3520476450377425184">เหลือ <ph name="NUMBER_MANY"/> วัน</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868">เหลือ <ph name="NUMBER_MANY"/> นาที</translation>
+<translation id="8666066831007952346">เหลือ <ph name="NUMBER_TWO"/> วัน</translation>
+<translation id="6390842777729054533">เหลือ <ph name="NUMBER_ZERO"/> วินาที</translation>
<translation id="3909791450649380159">&amp;ตัด</translation>
+<translation id="2560788951337264832">เหลือ <ph name="NUMBER_ZERO"/> นาที</translation>
<translation id="688711909580084195">หน้าเว็บที่ไม่มีชื่อ</translation>
+<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> วันที่ผ่านมา</translation>
<translation id="5076340679995252485">&amp;วาง</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="364720409959344976">เลือกโฟลเดอร์เพื่ออัปโหลด</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> นาทีที่ผ่านมา</translation>
<translation id="3234408098842461169">ลูกศรลง</translation>
<translation id="3087734570205094154">ด้านล่าง</translation>
+<translation id="5935630983280450497">เหลือ <ph name="NUMBER_ONE"/> นาที</translation>
<translation id="1860796786778352021">ปิดการแจ้งเตือน</translation>
<translation id="6364916375976753737">เลื่อนทางซ้าย</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> ชั่วโมงที่ผ่านมา</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868">เหลือ <ph name="NUMBER_ONE"/> นาที</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> นาที</translation>
<translation id="8210608804940886430">เลื่อนหน้าลง</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> วัน</translation>
+<translation id="7163503212501929773">เหลือ <ph name="NUMBER_MANY"/> ชั่วโมง</translation>
<translation id="5329858601952122676">&amp;ลบ</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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> วินาทีที่ผ่านมา</translation>
+<translation id="7781829728241885113">เมื่อวานนี้</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
+<translation id="50960180632766478">เหลือ <ph name="NUMBER_FEW"/> นาที</translation>
<translation id="6659594942844771486">แท็บ</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> วันที่ผ่านมา</translation>
<translation id="8428213095426709021">การตั้งค่า</translation>
<translation id="2497284189126895209">ไฟล์ทั้งหมด</translation>
+<translation id="7487278341251176613">เหลือ <ph name="NUMBER_TWO"/> นาที</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> วันที่ผ่านมา</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> วินาที</translation>
<translation id="7814458197256864873">&amp;คัดลอก</translation>
<translation id="3889424535448813030">ลูกศรขวา</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> วินาทีที่ผ่านมา</translation>
+<translation id="2544782972264605588">เหลือ <ph name="NUMBER_DEFAULT"/> วินาที</translation>
<translation id="6829324100069873704">กลับไปที่การแจ้งเตือน</translation>
<translation id="6528179044667508675">ห้ามรบกวน</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> วินาที</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> นาที</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">อนุญาตให้มีการแจ้งเตือนจากรายการต่อไปนี้</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> นาที</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> วินาทีที่ผ่านมา</translation>
<translation id="4927753642311223124">ที่นี่ไม่มีอะไรต้องดู ไปต่อได้</translation>
<translation id="2482878487686419369">การแจ้งเตือน</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">เลื่อนมาที่นี่</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> ชั่วโมง</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/วินาที</translation>
+<translation id="2148716181193084225">วันนี้</translation>
<translation id="7960078400008666149">ห้ามรบกวนเป็นเวลาหนึ่งชั่วโมง</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> นาทีที่ผ่านมา</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> วัน</translation>
<translation id="2190355936436201913">(ว่างเปล่า)</translation>
+<translation id="1164369517022005061">เหลือ <ph name="NUMBER_DEFAULT"/> ชั่วโมง</translation>
+<translation id="152482086482215392">เหลือ <ph name="NUMBER_ONE"/> วินาที</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">เลื่อนทางขวา</translation>
+<translation id="7414887922320653780">เหลือ <ph name="NUMBER_ONE"/> ชั่วโมง</translation>
<translation id="2666092431469916601">ด้านบน</translation>
<translation id="8331626408530291785">เลื่อนขึ้น</translation>
<translation id="4773379706300191099">ปิดการแจ้งเตือนจาก <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">เปิดไฟล์</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> ชั่วโมงที่ผ่านมา</translation>
<translation id="815598010540052116">เลื่อนลง</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">คืนค่า</translation>
+<translation id="1243314992276662751">อัปโหลด</translation>
+<translation id="50030952220075532">เหลือ <ph name="NUMBER_ONE"/> วัน</translation>
<translation id="8179976553408161302">เข้าใช้</translation>
<translation id="945522503751344254">ส่งความคิดเห็น</translation>
<translation id="9170848237812810038">เ&amp;ลิกทำ</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> ชั่วโมงที่ผ่านมา</translation>
+<translation id="6918245111648057970">อนุญาตให้มีการแจ้งเตือนจากรายการต่อไปนี้สำหรับผู้ใช้แต่ละคน:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> วินาที</translation>
+<translation id="3994835489895548312">เหลือ <ph name="NUMBER_MANY"/> นาที</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> วินาทีที่ผ่านมา</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">การตั้งค่า...</translation>
<translation id="6845383723252244143">เลือกโฟลเดอร์</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> seconds</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> วินาที</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> วันที่ผ่านมา</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> วัน</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> ชั่วโมง</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> นาทีที่ผ่านมา</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> วินาทีที่ผ่านมา</translation>
+<translation id="494645311413743213">เหลือ <ph name="NUMBER_TWO"/> วินาที</translation>
<translation id="4570886800634958009">ขยายการแจ้งเตือน</translation>
<translation id="436869212180315161">กด</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> วินาทีที่ผ่านมา</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/วินาที</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutes</translation>
+<translation id="1858722859751911017">เหลือ <ph name="NUMBER_FEW"/> นาที</translation>
<translation id="6040143037577758943">ปิด</translation>
+<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> นาทีที่ผ่านมา</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/วินาที</translation>
<translation id="7649070708921625228">ช่วยเหลือ</translation>
<translation id="8226233771743600312">ห้ามรบกวนเป็นเวลาหนึ่งวัน</translation>
<translation id="7457942297256758195">ล้างทั้งหมด</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> การแจ้งเตือน</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> วันที่ผ่านมา</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> นาที</translation>
+<translation id="1963692530539281474">เหลือ <ph name="NUMBER_DEFAULT"/> วัน</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutes</translation>
+<translation id="5906719743126878045">เหลือ <ph name="NUMBER_TWO"/> ชั่วโมง</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> ชั่วโมงที่ผ่านมา</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> วินาที</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> วินาที</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382">เหลือ <ph name="NUMBER_FEW"/> วัน</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/วินาที</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> การแจ้งเตือน (ยังไม่ได้อ่าน <ph name="QUANTITY"/>)</translation>
<translation id="6965382102122355670">ตกลง</translation>
<translation id="7850320739366109486">ห้ามรบกวน</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">ย่อ</translation>
<translation id="6394627529324717982">จุลภาค</translation>
<translation id="4469842253116033348">ปิดการใช้งานการแจ้งเตือนจาก <ph name="SITE"/></translation>
<translation id="3036649622769666520">เปิดไฟล์</translation>
<translation id="8328145009876646418">ขอบซ้าย</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconds</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_tr.xtb b/chromium/ui/base/strings/ui_strings_tr.xtb
index 66b93d6832d..b3b02cb551c 100644
--- a/chromium/ui/base/strings/ui_strings_tr.xtb
+++ b/chromium/ui/base/strings/ui_strings_tr.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> saat önce</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> saniye kaldı</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> saniye kaldı</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> dakika kaldı</translation>
<translation id="1801827354178857021">Nokta</translation>
<translation id="1190609913194133056">Bildirim Merkezi</translation>
+<translation id="7470933019269157899"><ph name="NUMBER_DEFAULT"/> dakika kaldı</translation>
<translation id="5613020302032141669">Sol Ok</translation>
<translation id="8602707065186045623">Dosyayı <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> saniye</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> saat kaldı</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">İptal</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">Yukarı Ok</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="8507996248087185956"><ph name="NUMBER_DEFAULT"/> dakika</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> gün kaldı</translation>
<translation id="932327136139879170">Ana Sayfa</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> dakika kaldı</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> gün kaldı</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> saniye kaldı</translation>
<translation id="3909791450649380159">&amp;Kes</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> dakika kaldı</translation>
<translation id="688711909580084195">Başlıksız Web Sayfası</translation>
+<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="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>
<translation id="3234408098842461169">Aşağı Ok</translation>
<translation id="3087734570205094154">Alt</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> dakika kaldı</translation>
<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="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="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>
<translation id="8210608804940886430">Page Down</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> saniye</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> saniye önce</translation>
+<translation id="7781829728241885113">Dün</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> dakika kaldı</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>
<translation id="8428213095426709021">Ayarlar</translation>
<translation id="2497284189126895209">Tüm Dosyalar</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> dakika kaldı</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> gün önce</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> saniye</translation>
<translation id="7814458197256864873">K&amp;opyala</translation>
<translation id="3889424535448813030">Sağ Ok</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> saniye önce</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> saniye kaldı</translation>
<translation id="6829324100069873704">Bildirimlere geri dön</translation>
<translation id="6528179044667508675">Rahatsız etmeyin</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> saniye</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Bildirimler</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Buraya Kaydır</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> saat</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/sn</translation>
+<translation id="2148716181193084225">Bugün</translation>
<translation id="7960078400008666149">Bir saat süreyle rahatsız etmeyin</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> dakika önce</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> gün</translation>
<translation id="2190355936436201913">(boş)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> saat kaldı</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> saniye kaldı</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Sağa Kaydır</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> saat kaldı</translation>
<translation id="2666092431469916601">Üst</translation>
<translation id="8331626408530291785">Yukarı Kaydır</translation>
<translation id="4773379706300191099"><ph name="EXTENSION_NAME"/> bildirimlerini devre dışı bırak</translation>
<translation id="7907591526440419938">Dosya Aç</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> saat önce</translation>
<translation id="815598010540052116">Aşağı Kaydır</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Geri yükle</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="945522503751344254">Geri bildirim gönder</translation>
<translation id="9170848237812810038">&amp;Geri al</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> saat önce</translation>
+<translation id="6918245111648057970">Her bir kullanıcı için şunlardan gelen bildirimlere izin ver:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> second</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> dakika kaldı</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> saniye önce</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Ayarlar...</translation>
<translation id="6845383723252244143">Klasörü Seçin</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> seconds</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> saniye</translation>
<translation id="5583640892426849032">Geri al tuşu</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> gün önce</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> gün</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> saat</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> dakika önce</translation>
+<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="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="436869212180315161">Basın</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> saniye önce</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/sn</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutes</translation>
+<translation id="1858722859751911017"><ph name="NUMBER_FEW"/> dakika kaldı</translation>
<translation id="6040143037577758943">Kapat</translation>
+<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="8226233771743600312">Bir gün süreyle rahatsız etmeyin</translation>
<translation id="7457942297256758195">Tümünü Temizle</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - Bildirimler</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> gün önce</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> dakika</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> gün kaldı</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> minutes</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> saat kaldı</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> saat önce</translation>
<translation id="8400147561352026160">ÜstKrkt+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> saniye</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> saniye</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> gün kaldı</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/sn</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - Bildirimler (<ph name="QUANTITY"/> okunmamış)</translation>
<translation id="6965382102122355670">Tamam</translation>
<translation id="7850320739366109486">Rahatsız Etmeyin</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Simge durumuna küçült</translation>
<translation id="6394627529324717982">Virgül</translation>
<translation id="4469842253116033348"><ph name="SITE"/> bildirimlerini devre dışı bırak</translation>
<translation id="3036649622769666520">Dosya Aç</translation>
<translation id="8328145009876646418">Sol Kenar</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconds</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_uk.xtb b/chromium/ui/base/strings/ui_strings_uk.xtb
index 6c6418cec2b..1287a629908 100644
--- a/chromium/ui/base/strings/ui_strings_uk.xtb
+++ b/chromium/ui/base/strings/ui_strings_uk.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> сек. залишилось</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> secs left</translation>
+<translation id="1209866192426315618">Залишилось <ph name="NUMBER_DEFAULT"/> хв.</translation>
<translation id="1801827354178857021">Крапка</translation>
<translation id="1190609913194133056">Центр сповіщень</translation>
+<translation id="7470933019269157899">Залишилося <ph name="NUMBER_DEFAULT"/> хвилини</translation>
<translation id="5613020302032141669">Курсор ліворуч</translation>
<translation id="8602707065186045623">файл <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> secs</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> годин залишилось</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Скасувати</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> б</translation>
<translation id="3660179305079774227">Курсор угору</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> Мб/сек.</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> годин</translation>
<translation id="3990502903496589789">Правий край</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> хв.</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation>
<translation id="932327136139879170">Home</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> mins left</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> days left</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> secs left</translation>
<translation id="3909791450649380159">Вирізат&amp;и</translation>
+<translation id="2560788951337264832"><ph name="NUMBER_ZERO"/> minutes left</translation>
<translation id="688711909580084195">Веб-сторінка без назви</translation>
+<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> дн. тому</translation>
<translation id="5076340679995252485">&amp;Вставити</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> Тб</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>
<translation id="3234408098842461169">Курсор униз</translation>
<translation id="3087734570205094154">Низ</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> хв. залишилась</translation>
<translation id="1860796786778352021">Закрити сповіщення</translation>
<translation id="6364916375976753737">Прокрутка вліво</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> год. тому</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868">Залишилася <ph name="NUMBER_ONE"/> хвилина</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> хв.</translation>
<translation id="8210608804940886430">Сторінка вниз</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> Кб</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> minutes</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Учора</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> minutes</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> хв. залишилось</translation>
<translation id="6659594942844771486">Вкладка</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> Мб</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> дн. тому</translation>
<translation id="8428213095426709021">Налаштування</translation>
<translation id="2497284189126895209">Усі файли</translation>
+<translation id="7487278341251176613"><ph name="NUMBER_TWO"/> minutes left</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> день тому</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> сек.</translation>
<translation id="7814458197256864873">&amp;Копіювати</translation>
<translation id="3889424535448813030">Курсор праворуч</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> сек. тому</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> сек. залишилось</translation>
<translation id="6829324100069873704">Повернутися до сповіщень</translation>
<translation id="6528179044667508675">Не турбувати</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> с</translation>
+<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="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="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="7634624804467787019"><ph name="NUMBER_ONE"/> хвилина</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> secs ago</translation>
<translation id="4927753642311223124">Сповіщень немає.</translation>
<translation id="2482878487686419369">Сповіщення</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">Прокрутка до цього місця</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> годин</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> Кб/сек.</translation>
+<translation id="2148716181193084225">Сьогодні</translation>
<translation id="7960078400008666149">Не турбувати впродовж однієї години</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> хв. тому</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> days</translation>
<translation id="2190355936436201913">(пусто)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> годин залишилось</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> сек. залишилась</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">Прокрутка вправо</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> година залишилась</translation>
<translation id="2666092431469916601">Верх</translation>
<translation id="8331626408530291785">Прокрутка вгору</translation>
<translation id="4773379706300191099">Вимкнути сповіщення з розширення <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Відкрити файл</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> год. тому</translation>
<translation id="815598010540052116">Прокрутка вниз</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Відновити</translation>
+<translation id="1243314992276662751">Завантажити</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> день залишився</translation>
<translation id="8179976553408161302">Увійти</translation>
<translation id="945522503751344254">Надіслати відгук</translation>
<translation id="9170848237812810038">&amp;Скасувати</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> год. тому</translation>
+<translation id="6918245111648057970">Дозволити сповіщення для кожного користувача:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> секунда</translation>
+<translation id="3994835489895548312"><ph name="NUMBER_MANY"/> minutes left</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> Пб</translation>
<translation id="2983818520079887040">Налаштування...</translation>
<translation id="6845383723252244143">Вибір папки</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> секунди</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> сек.</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> днів</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> година</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> хв. тому</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> сек. тому</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation>
<translation id="4570886800634958009">Розгорнути сповіщення</translation>
<translation id="436869212180315161">Натиснути</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> сек. тому</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> Тб/сек.</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> minutes</translation>
+<translation id="1858722859751911017">Залишилося <ph name="NUMBER_FEW"/> хвилини</translation>
<translation id="6040143037577758943">Закрити</translation>
+<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> mins ago</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> б/сек.</translation>
<translation id="7649070708921625228">Довідка</translation>
<translation id="8226233771743600312">Не турбувати впродовж одного дня</translation>
<translation id="7457942297256758195">Очистити все</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> – Сповіщення</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> хв.</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> днів залишилось</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> хвилини</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> hours left</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> сек.</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> secs</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> seconds</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> днів залишилось</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> Пб/сек.</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> – Сповіщення (непрочитаних: <ph name="QUANTITY"/>)</translation>
<translation id="6965382102122355670">ОК</translation>
<translation id="7850320739366109486">Не турбувати</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">Зменшити</translation>
<translation id="6394627529324717982">Кома</translation>
<translation id="4469842253116033348">Вимкнути сповіщення від <ph name="SITE"/></translation>
<translation id="3036649622769666520">Відкрити файли</translation>
<translation id="8328145009876646418">Лівий край</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> seconds</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_vi.xtb b/chromium/ui/base/strings/ui_strings_vi.xtb
index 66d2abeaa7a..b5ef2dff826 100644
--- a/chromium/ui/base/strings/ui_strings_vi.xtb
+++ b/chromium/ui/base/strings/ui_strings_vi.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> hours ago</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> giây còn lại</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> giây còn lại</translation>
+<translation id="1209866192426315618"><ph name="NUMBER_DEFAULT"/> phút còn lại</translation>
<translation id="1801827354178857021">Dấu chấm</translation>
<translation id="1190609913194133056">Trung tâm thông báo</translation>
+<translation id="7470933019269157899">Còn lại <ph name="NUMBER_DEFAULT"/> phút</translation>
<translation id="5613020302032141669">Mũi tên Trái</translation>
<translation id="8602707065186045623">Tệp <ph name="SAVEAS_EXTENSION_TYPE"/> (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> giây</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> giờ còn lại</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">Hủy</translation>
<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="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="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>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> phút còn lại</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> ngày còn lại</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> giây còn lại</translation>
<translation id="3909791450649380159">Cắ&amp;t</translation>
+<translation id="2560788951337264832">Còn lại <ph name="NUMBER_ZERO"/> phút</translation>
<translation id="688711909580084195">Trang web không có tiêu đề</translation>
+<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="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>
<translation id="3234408098842461169">Phím mũi tên Xuống</translation>
<translation id="3087734570205094154">Bên dưới</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> phút còn lại</translation>
<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="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="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>
<translation id="8210608804940886430">Trang Dưới</translation>
+<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="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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> secs ago</translation>
+<translation id="7781829728241885113">Hôm qua</translation>
+<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="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> ngày trước</translation>
<translation id="8428213095426709021">Cài đặt</translation>
<translation id="2497284189126895209">Tất cả Tệp tin</translation>
+<translation id="7487278341251176613">Còn lại <ph name="NUMBER_TWO"/> phút</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> day ago</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> giây</translation>
<translation id="7814458197256864873">Sao &amp;chép</translation>
<translation id="3889424535448813030">Phím mũi tên Phải</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> sec ago</translation>
+<translation id="2544782972264605588"><ph name="NUMBER_DEFAULT"/> giây còn lại</translation>
<translation id="6829324100069873704">Quay lại thông báo</translation>
<translation id="6528179044667508675">Không làm phiền</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> giây</translation>
+<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="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="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="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>
<translation id="2482878487686419369">Thông báo</translation>
+<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="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> giờ</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">Hôm nay</translation>
<translation id="7960078400008666149">Không làm phiền trong một giờ</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> mins ago</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> ngày</translation>
<translation id="2190355936436201913">(trống)</translation>
+<translation id="1164369517022005061"><ph name="NUMBER_DEFAULT"/> giờ còn lại</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> giây còn lại</translation>
<translation id="8447116497070723931">Trang Trên</translation>
<translation id="4588090240171750605">Cuộn qua Phải</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> giờ còn lại</translation>
<translation id="2666092431469916601">Hàng đầu</translation>
<translation id="8331626408530291785">Cuộn Lên</translation>
<translation id="4773379706300191099">Tắt thông báo từ <ph name="EXTENSION_NAME"/></translation>
<translation id="7907591526440419938">Mở Tệp</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Thoát</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> giờ trước</translation>
<translation id="815598010540052116">Cuộn Xuống</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">Khôi phục</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="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>
+<translation id="6918245111648057970">Cho phép thông báo từ mục sau đối với mỗi người dùng:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> giây</translation>
+<translation id="3994835489895548312">Còn lại <ph name="NUMBER_MANY"/> phút</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> secs ago</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">Cài đặt...</translation>
<translation id="6845383723252244143">Chọn Thư mục</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> giây</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> giây</translation>
<translation id="5583640892426849032">Backspace</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> days ago</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> ngày</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> giờ</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> min ago</translation>
+<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="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="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>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> phút</translation>
+<translation id="1858722859751911017">Còn lại <ph name="NUMBER_FEW"/> phút</translation>
<translation id="6040143037577758943">Đóng</translation>
+<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="8226233771743600312">Không làm phiền trong một ngày</translation>
<translation id="7457942297256758195">Xóa tất cả</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - Thông báo</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> days ago</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> phút</translation>
+<translation id="1963692530539281474"><ph name="NUMBER_DEFAULT"/> ngày còn lại</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> phút</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> giờ còn lại</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> hours ago</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> giây</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> giây</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> giây</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> ngày còn lại</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/giây</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - Thông báo (<ph name="QUANTITY"/> thông báo chưa đọc)</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>
<translation id="5941711191222866238">Thu nhỏ</translation>
<translation id="6394627529324717982">Dấu phẩy</translation>
<translation id="4469842253116033348">Vô hiệu hóa thông báo từ <ph name="SITE"/></translation>
<translation id="3036649622769666520">Mở Tệp</translation>
<translation id="8328145009876646418">Cạnh Bên trái</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> giây</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_zh-CN.xtb b/chromium/ui/base/strings/ui_strings_zh-CN.xtb
index b0d266c4090..e38ba7895ad 100644
--- a/chromium/ui/base/strings/ui_strings_zh-CN.xtb
+++ b/chromium/ui/base/strings/ui_strings_zh-CN.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">End</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> 小时前</translation>
+<translation id="6310545596129886942"><ph name="NUMBER_FEW"/> secs left</translation>
+<translation id="9213479837033539041"><ph name="NUMBER_MANY"/> secs left</translation>
+<translation id="1209866192426315618">还有 <ph name="NUMBER_DEFAULT"/> 分钟</translation>
<translation id="1801827354178857021">句号</translation>
<translation id="1190609913194133056">通知中心</translation>
+<translation id="7470933019269157899">还剩 <ph name="NUMBER_DEFAULT"/> 分钟</translation>
<translation id="5613020302032141669">向左箭头</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> 文件 (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> secs</translation>
+<translation id="7511635910912978956"><ph name="NUMBER_FEW"/> hours left</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">取消</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">向上箭头</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/s</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> 小时</translation>
<translation id="3990502903496589789">右边缘</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> 分钟</translation>
+<translation id="3520476450377425184"><ph name="NUMBER_MANY"/> days left</translation>
<translation id="932327136139879170">主页</translation>
+<translation id="5600907569873192868"><ph name="NUMBER_MANY"/> mins left</translation>
+<translation id="8666066831007952346"><ph name="NUMBER_TWO"/> days left</translation>
+<translation id="6390842777729054533"><ph name="NUMBER_ZERO"/> secs left</translation>
<translation id="3909791450649380159">剪切(&amp;T)</translation>
+<translation id="2560788951337264832">还剩 <ph name="NUMBER_ZERO"/> 分钟</translation>
<translation id="688711909580084195">无标题网页</translation>
+<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> 天前</translation>
<translation id="5076340679995252485">粘贴(&amp;P)</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="364720409959344976">选择要上传的文件夹</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> 分钟前</translation>
<translation id="3234408098842461169">向下箭头</translation>
<translation id="3087734570205094154">底部</translation>
+<translation id="5935630983280450497"><ph name="NUMBER_ONE"/> min left</translation>
<translation id="1860796786778352021">关闭通知</translation>
<translation id="6364916375976753737">向左滚动</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> 小时前</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868">还剩 <ph name="NUMBER_ONE"/> 分钟</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> min</translation>
<translation id="8210608804940886430">向下翻页</translation>
+<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="8088823334188264070"><ph name="NUMBER_MANY"/> secs</translation>
<translation id="8901569739625249689"><ph name="QUANTITY"/> KB</translation>
+<translation id="7712011264267466734"><ph name="NUMBER_MANY"/> 分钟</translation>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> 秒前</translation>
+<translation id="7781829728241885113">昨天</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> 分钟</translation>
+<translation id="50960180632766478"><ph name="NUMBER_FEW"/> mins left</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> 天前</translation>
<translation id="8428213095426709021">设置</translation>
<translation id="2497284189126895209">所有文件</translation>
+<translation id="7487278341251176613">还剩 <ph name="NUMBER_TWO"/> 分钟</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> 天前</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> sec</translation>
<translation id="7814458197256864873">复制(&amp;C)</translation>
<translation id="3889424535448813030">向右箭头</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> 秒前</translation>
+<translation id="2544782972264605588">还有 <ph name="NUMBER_DEFAULT"/> 秒</translation>
<translation id="6829324100069873704">返回通知</translation>
<translation id="6528179044667508675">请勿打扰</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> 秒</translation>
+<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="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="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="7634624804467787019"><ph name="NUMBER_ONE"/> 分钟</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> 秒前</translation>
<translation id="4927753642311223124">这里没有任何通知,往前走吧。</translation>
<translation id="2482878487686419369">通知</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">滚动到此处</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> hours</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/s</translation>
+<translation id="2148716181193084225">今天</translation>
<translation id="7960078400008666149">1 小时内请勿打扰</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> 分钟前</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> days</translation>
<translation id="2190355936436201913">(空)</translation>
+<translation id="1164369517022005061">还有 <ph name="NUMBER_DEFAULT"/> 小时</translation>
+<translation id="152482086482215392"><ph name="NUMBER_ONE"/> sec left</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">向右滚动</translation>
+<translation id="7414887922320653780"><ph name="NUMBER_ONE"/> hour left</translation>
<translation id="2666092431469916601">顶部</translation>
<translation id="8331626408530291785">向上滚动</translation>
<translation id="4773379706300191099">停用来自“<ph name="EXTENSION_NAME"/>”的通知</translation>
<translation id="7907591526440419938">打开文件</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> 小时前</translation>
<translation id="815598010540052116">向下滚动</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">恢复</translation>
+<translation id="1243314992276662751">上传</translation>
+<translation id="50030952220075532"><ph name="NUMBER_ONE"/> day left</translation>
<translation id="8179976553408161302">进入</translation>
<translation id="945522503751344254">发送反馈</translation>
<translation id="9170848237812810038">撤消(&amp;U)</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> 小时前</translation>
+<translation id="6918245111648057970">对于每位用户,允许接收下列源发出的通知:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> 秒</translation>
+<translation id="3994835489895548312">还剩 <ph name="NUMBER_MANY"/> 分钟</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> 秒前</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">设置...</translation>
<translation id="6845383723252244143">选择文件夹</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> 秒</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> secs</translation>
<translation id="5583640892426849032">退格</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> 天前</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> days</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> hour</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> 分钟前</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> 秒前</translation>
+<translation id="494645311413743213"><ph name="NUMBER_TWO"/> secs left</translation>
<translation id="4570886800634958009">展开通知</translation>
<translation id="436869212180315161">按</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> 秒前</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/s</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> 分钟</translation>
+<translation id="1858722859751911017">还剩 <ph name="NUMBER_FEW"/> 分钟</translation>
<translation id="6040143037577758943">关闭</translation>
+<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> 分钟前</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/s</translation>
<translation id="7649070708921625228">帮助</translation>
<translation id="8226233771743600312">1 天内请勿打扰</translation>
<translation id="7457942297256758195">全部清除</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - 通知</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> 天前</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> mins</translation>
+<translation id="1963692530539281474">还有 <ph name="NUMBER_DEFAULT"/> 天</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> 分钟</translation>
+<translation id="5906719743126878045"><ph name="NUMBER_TWO"/> hours left</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> 小时前</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> secs</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> secs</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> 秒</translation>
+<translation id="3759876923365568382"><ph name="NUMBER_FEW"/> days left</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/s</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - 通知(<ph name="QUANTITY"/> 条未读)</translation>
<translation id="6965382102122355670">确定</translation>
<translation id="7850320739366109486">请勿打扰</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">最小化</translation>
<translation id="6394627529324717982">逗号</translation>
<translation id="4469842253116033348">停用 <ph name="SITE"/> 的通知</translation>
<translation id="3036649622769666520">打开文件</translation>
<translation id="8328145009876646418">左边缘</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> 秒</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/strings/ui_strings_zh-TW.xtb b/chromium/ui/base/strings/ui_strings_zh-TW.xtb
index 00e6a74450b..9a1074542a3 100644
--- a/chromium/ui/base/strings/ui_strings_zh-TW.xtb
+++ b/chromium/ui/base/strings/ui_strings_zh-TW.xtb
@@ -5,88 +5,181 @@
<translation id="1871244248791675517">Ins</translation>
<translation id="6135826906199951471">Del</translation>
<translation id="528468243742722775">結束</translation>
+<translation id="5341849548509163798"><ph name="NUMBER_MANY"/> 小時前</translation>
+<translation id="6310545596129886942">剩下 <ph name="NUMBER_FEW"/> 秒</translation>
+<translation id="9213479837033539041">剩下 <ph name="NUMBER_MANY"/> 秒</translation>
+<translation id="1209866192426315618">剩下 <ph name="NUMBER_DEFAULT"/> 分鐘</translation>
<translation id="1801827354178857021">句號</translation>
<translation id="1190609913194133056">通知中心</translation>
+<translation id="7470933019269157899">剩下 <ph name="NUMBER_DEFAULT"/> 分鐘</translation>
<translation id="5613020302032141669">向左鍵</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE"/> 檔案 (.<ph name="SAVEAS_EXTENSION_NAME"/>)</translation>
+<translation id="542155483965056918"><ph name="NUMBER_ZERO"/> mins ago</translation>
+<translation id="7121570032414343252"><ph name="NUMBER_TWO"/> 秒</translation>
+<translation id="7511635910912978956">剩下 <ph name="NUMBER_FEW"/> 小時</translation>
<translation id="5948410903763073882">Alt+<ph name="KEY_COMBO_NAME"/></translation>
<translation id="7658239707568436148">取消</translation>
<translation id="7222373446505536781">F11</translation>
<translation id="1761785978543082658"><ph name="QUANTITY"/> B</translation>
<translation id="3660179305079774227">向上鍵</translation>
<translation id="1809410197924942083"><ph name="QUANTITY"/> MB/秒</translation>
+<translation id="5608669887400696928"><ph name="NUMBER_DEFAULT"/> 小時</translation>
<translation id="3990502903496589789">右邊緣</translation>
+<translation id="8507996248087185956"><ph name="NUMBER_DEFAULT"/> 分鐘</translation>
+<translation id="3520476450377425184">剩下 <ph name="NUMBER_MANY"/> 天</translation>
<translation id="932327136139879170">首頁</translation>
+<translation id="5600907569873192868">剩下 <ph name="NUMBER_MANY"/> 分鐘</translation>
+<translation id="8666066831007952346">剩下 <ph name="NUMBER_TWO"/> 天</translation>
+<translation id="6390842777729054533">剩下 <ph name="NUMBER_ZERO"/> 秒</translation>
<translation id="3909791450649380159">剪下(&amp;T)</translation>
+<translation id="2560788951337264832">剩下 <ph name="NUMBER_ZERO"/> 分鐘</translation>
<translation id="688711909580084195">無標題網頁</translation>
+<translation id="3353284378027041011"><ph name="NUMBER_FEW"/> 天前</translation>
<translation id="5076340679995252485">貼上(&amp;P)</translation>
<translation id="7460907917090416791"><ph name="QUANTITY"/> TB</translation>
+<translation id="364720409959344976">選取要上傳的資料夾</translation>
<translation id="4999762576397546063">Ctrl+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="7770995925463083016"><ph name="NUMBER_TWO"/> 分鐘前</translation>
<translation id="3234408098842461169">向下鍵</translation>
<translation id="3087734570205094154">置底</translation>
+<translation id="5935630983280450497">剩下 <ph name="NUMBER_ONE"/> 分鐘</translation>
<translation id="1860796786778352021">通知關閉</translation>
<translation id="6364916375976753737">向左捲動</translation>
+<translation id="2629089419211541119"><ph name="NUMBER_ONE"/> 小時前</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="6719684875142564568"><ph name="NUMBER_ZERO"/> hours</translation>
+<translation id="7836361698254323868">剩下 <ph name="NUMBER_ONE"/> 分鐘</translation>
+<translation id="2953767478223974804"><ph name="NUMBER_ONE"/> 分鐘</translation>
<translation id="8210608804940886430">向下翻頁</translation>
+<translation id="1572103024875503863"><ph name="NUMBER_MANY"/> 天</translation>
+<translation id="7163503212501929773">剩下 <ph name="NUMBER_MANY"/> 小時</translation>
<translation id="5329858601952122676">刪除(&amp;D)</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>
+<translation id="7275974018215686543"><ph name="NUMBER_MANY"/> 秒前</translation>
+<translation id="7781829728241885113">昨天</translation>
+<translation id="3424538384153559412"><ph name="NUMBER_TWO"/> 分鐘</translation>
+<translation id="50960180632766478">剩下 <ph name="NUMBER_FEW"/> 分鐘</translation>
<translation id="6659594942844771486">Tab</translation>
<translation id="3049748772180311791"><ph name="QUANTITY"/> MB</translation>
+<translation id="4988273303304146523"><ph name="NUMBER_DEFAULT"/> 天前</translation>
<translation id="8428213095426709021">設定</translation>
<translation id="2497284189126895209">所有檔案</translation>
+<translation id="7487278341251176613">剩下 <ph name="NUMBER_TWO"/> 分鐘</translation>
+<translation id="5110450810124758964"><ph name="NUMBER_ONE"/> 天前</translation>
+<translation id="2820806154655529776"><ph name="NUMBER_ONE"/> 秒</translation>
<translation id="7814458197256864873">複製(&amp;C)</translation>
<translation id="3889424535448813030">向右鍵</translation>
+<translation id="4229495110203539533"><ph name="NUMBER_ONE"/> 秒前</translation>
+<translation id="2544782972264605588">剩下 <ph name="NUMBER_DEFAULT"/> 秒</translation>
<translation id="6829324100069873704">返回通知</translation>
<translation id="6528179044667508675">請勿打擾</translation>
+<translation id="5066177358602611309"><ph name="NUMBER_DEFAULT"/> 秒</translation>
+<translation id="290555789621781773"><ph name="NUMBER_TWO"/> 分鐘</translation>
+<translation id="5149131957118398098"><ph name="NUMBER_ZERO"/> hours left</translation>
<translation id="7135556860107312402">允許接收下列來源發出的通知:</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="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="7634624804467787019"><ph name="NUMBER_ONE"/> 分鐘</translation>
+<translation id="8448317557906454022"><ph name="NUMBER_ZERO"/> 秒前</translation>
<translation id="4927753642311223124">這裡沒有任何通知訊息,以後再來看看吧!</translation>
<translation id="2482878487686419369">通知</translation>
+<translation id="6357135709975569075"><ph name="NUMBER_ZERO"/> days</translation>
<translation id="3183922693828471536">捲動至此</translation>
<translation id="4552416320897244156">PgDwn</translation>
<translation id="7052633198403197513">F1 鍵</translation>
+<translation id="2052389551707911401"><ph name="NUMBER_MANY"/> 小時</translation>
<translation id="8677655579646609597"><ph name="QUANTITY"/> KB/秒</translation>
+<translation id="2148716181193084225">今天</translation>
<translation id="7960078400008666149">1 小時內請勿打擾</translation>
+<translation id="4373894838514502496"><ph name="NUMBER_FEW"/> 分鐘前</translation>
+<translation id="4115153316875436289"><ph name="NUMBER_TWO"/> 天</translation>
<translation id="2190355936436201913">(空白)</translation>
+<translation id="1164369517022005061">剩下 <ph name="NUMBER_DEFAULT"/> 小時</translation>
+<translation id="152482086482215392">剩下 <ph name="NUMBER_ONE"/> 秒</translation>
<translation id="8447116497070723931">PgUp</translation>
<translation id="4588090240171750605">向右捲動</translation>
+<translation id="7414887922320653780">剩下 <ph name="NUMBER_ONE"/> 小時</translation>
<translation id="2666092431469916601">置頂</translation>
<translation id="8331626408530291785">向上捲動</translation>
<translation id="4773379706300191099">停用 <ph name="EXTENSION_NAME"/> 的通知</translation>
<translation id="7907591526440419938">開啟檔案</translation>
+<translation id="2864069933652346933"><ph name="NUMBER_ZERO"/> days left</translation>
<translation id="1293699935367580298">Esc</translation>
+<translation id="2797524280730715045"><ph name="NUMBER_DEFAULT"/> 小時前</translation>
<translation id="815598010540052116">向下捲動</translation>
+<translation id="1308727876662951186"><ph name="NUMBER_ZERO"/> mins left</translation>
<translation id="3157931365184549694">還原</translation>
+<translation id="1243314992276662751">上傳</translation>
+<translation id="50030952220075532">剩下 <ph name="NUMBER_ONE"/> 天</translation>
<translation id="8179976553408161302">進入</translation>
<translation id="945522503751344254">提供意見</translation>
<translation id="9170848237812810038">取消(&amp;U)</translation>
+<translation id="1285266685456062655"><ph name="NUMBER_FEW"/> 小時前</translation>
+<translation id="6918245111648057970">允許接收下列使用者發出的通知:</translation>
+<translation id="5489830104927132166"><ph name="NUMBER_ONE"/> 秒</translation>
+<translation id="3994835489895548312">剩下 <ph name="NUMBER_MANY"/> 分鐘</translation>
+<translation id="6358975074282722691"><ph name="NUMBER_TWO"/> 秒前</translation>
<translation id="520299402983819650"><ph name="QUANTITY"/> PB</translation>
<translation id="2983818520079887040">設定...</translation>
<translation id="6845383723252244143">選取資料夾</translation>
+<translation id="7600770490873519066"><ph name="NUMBER_FEW"/> 秒</translation>
+<translation id="1095623615273566396"><ph name="NUMBER_FEW"/> 秒</translation>
<translation id="5583640892426849032">Backspace 鍵</translation>
+<translation id="5263972071113911534"><ph name="NUMBER_MANY"/> 天前</translation>
+<translation id="8355915647418390920"><ph name="NUMBER_FEW"/> 天</translation>
+<translation id="5116333507878097773"><ph name="NUMBER_ONE"/> 小時</translation>
+<translation id="2679312662830811292"><ph name="NUMBER_ONE"/> 分鐘前</translation>
+<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="9098468523912235228"><ph name="NUMBER_DEFAULT"/> 秒前</translation>
+<translation id="494645311413743213">剩下 <ph name="NUMBER_TWO"/> 秒</translation>
<translation id="4570886800634958009">通知展開</translation>
<translation id="436869212180315161">按下</translation>
+<translation id="4860787810836767172"><ph name="NUMBER_FEW"/> 秒前</translation>
<translation id="2297836609126180313"><ph name="QUANTITY"/> TB/秒</translation>
+<translation id="6956540737482608074"><ph name="NUMBER_ZERO"/> 分鐘</translation>
+<translation id="1858722859751911017">剩下 <ph name="NUMBER_FEW"/> 分鐘</translation>
<translation id="6040143037577758943">關閉</translation>
+<translation id="1101671447232096497"><ph name="NUMBER_MANY"/> 分鐘前</translation>
<translation id="6142413573757616983"><ph name="QUANTITY"/> B/秒</translation>
<translation id="7649070708921625228">說明</translation>
<translation id="8226233771743600312">1 天內請勿打擾</translation>
<translation id="7457942297256758195">全部清除</translation>
-<translation id="7509316384504965641"><ph name="PRODUCT"/> - 通知</translation>
+<translation id="822618367988303761"><ph name="NUMBER_TWO"/> 天前</translation>
+<translation id="4745438305783437565"><ph name="NUMBER_FEW"/> 分鐘</translation>
+<translation id="1963692530539281474">剩下 <ph name="NUMBER_DEFAULT"/> 天</translation>
+<translation id="7509440305564869263"><ph name="NUMBER_FEW"/> 分鐘</translation>
+<translation id="5906719743126878045">剩下 <ph name="NUMBER_TWO"/> 小時</translation>
+<translation id="8959208747503200525"><ph name="NUMBER_TWO"/> 小時前</translation>
<translation id="8400147561352026160">Shift+<ph name="KEY_COMBO_NAME"/></translation>
+<translation id="8421864404045570940"><ph name="NUMBER_DEFAULT"/> 秒</translation>
+<translation id="4197700912384709145"><ph name="NUMBER_ZERO"/> 秒</translation>
+<translation id="27199337101878275"><ph name="NUMBER_MANY"/> 秒</translation>
+<translation id="3759876923365568382">剩下 <ph name="NUMBER_FEW"/> 天</translation>
<translation id="6907759265145635167"><ph name="QUANTITY"/> PB/秒</translation>
-<translation id="4481522213790366002"><ph name="PRODUCT"/> - 通知 (<ph name="QUANTITY"/> 則未讀)</translation>
<translation id="6965382102122355670">確定</translation>
<translation id="7850320739366109486">請勿打擾</translation>
+<translation id="6978839998405419496"><ph name="NUMBER_ZERO"/> days ago</translation>
<translation id="5941711191222866238">縮到最小</translation>
<translation id="6394627529324717982">逗號</translation>
<translation id="4469842253116033348">停用 <ph name="SITE"/> 的通知</translation>
<translation id="3036649622769666520">開啟檔案</translation>
<translation id="8328145009876646418">左邊緣</translation>
+<translation id="7372005818821648611"><ph name="NUMBER_TWO"/> 秒</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/ui/base/x/x11_util.cc b/chromium/ui/base/x/x11_util.cc
index 3a1ced1533f..836feae8e50 100644
--- a/chromium/ui/base/x/x11_util.cc
+++ b/chromium/ui/base/x/x11_util.cc
@@ -32,17 +32,11 @@
#include "base/strings/stringprintf.h"
#include "base/sys_byteorder.h"
#include "base/threading/thread.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "third_party/skia/include/core/SkPostConfig.h"
#include "ui/base/events/event_utils.h"
#include "ui/base/keycodes/keyboard_code_conversion_x.h"
#include "ui/base/touch/touch_factory_x11.h"
#include "ui/base/x/device_data_manager.h"
#include "ui/base/x/x11_util_internal.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/image/image_skia.h"
-#include "ui/gfx/image/image_skia_rep.h"
-#include "ui/gfx/point.h"
#include "ui/gfx/point_conversions.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/size.h"
@@ -55,6 +49,7 @@
#if defined(USE_AURA)
#include <X11/Xcursor/Xcursor.h>
#include "skia/ext/image_operations.h"
+#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/skia_util.h"
#endif
@@ -1188,55 +1183,6 @@ void DetachSharedMemory(Display* display, XSharedMemoryId shmseg) {
NOTREACHED();
}
-bool CopyAreaToCanvas(XID drawable,
- gfx::Rect source_bounds,
- gfx::Point dest_offset,
- gfx::Canvas* canvas) {
- ui::XScopedImage scoped_image(
- XGetImage(GetXDisplay(), drawable,
- source_bounds.x(), source_bounds.y(),
- source_bounds.width(), source_bounds.height(),
- AllPlanes, ZPixmap));
- XImage* image = scoped_image.get();
- if (!image) {
- LOG(ERROR) << "XGetImage failed";
- return false;
- }
-
- if (image->bits_per_pixel == 32) {
- if ((0xff << SK_R32_SHIFT) != image->red_mask ||
- (0xff << SK_G32_SHIFT) != image->green_mask ||
- (0xff << SK_B32_SHIFT) != image->blue_mask) {
- LOG(WARNING) << "XImage and Skia byte orders differ";
- return false;
- }
-
- // Set the alpha channel before copying to the canvas. Otherwise, areas of
- // the framebuffer that were cleared by ply-image rather than being obscured
- // by an image during boot may end up transparent.
- // TODO(derat|marcheu): Remove this if/when ply-image has been updated to
- // set the framebuffer's alpha channel regardless of whether the device
- // claims to support alpha or not.
- for (int i = 0; i < image->width * image->height * 4; i += 4)
- image->data[i + 3] = 0xff;
-
- SkBitmap bitmap;
- bitmap.setConfig(SkBitmap::kARGB_8888_Config,
- image->width, image->height,
- image->bytes_per_line);
- bitmap.setPixels(image->data);
- gfx::ImageSkia image_skia;
- gfx::ImageSkiaRep image_rep(bitmap, canvas->scale_factor());
- image_skia.AddRepresentation(image_rep);
- canvas->DrawImageInt(image_skia, dest_offset.x(), dest_offset.y());
- } else {
- NOTIMPLEMENTED() << "Unsupported bits-per-pixel " << image->bits_per_pixel;
- return false;
- }
-
- return true;
-}
-
XID CreatePictureFromSkiaPixmap(Display* display, XID pixmap) {
XID picture = XRenderCreatePicture(
display, pixmap, GetRenderARGB32Format(display), 0, NULL);
diff --git a/chromium/ui/base/x/x11_util.h b/chromium/ui/base/x/x11_util.h
index f0cf1b7ef64..c1c72ba0191 100644
--- a/chromium/ui/base/x/x11_util.h
+++ b/chromium/ui/base/x/x11_util.h
@@ -39,15 +39,13 @@ typedef struct _GtkWindow GtkWindow;
#endif
namespace gfx {
-class Canvas;
-class Point;
class Rect;
}
class SkBitmap;
namespace ui {
-// These functions use the default display and this /must/ be called from
+// These functions use the GDK default display and this /must/ be called from
// the UI thread. Thus, they don't support multiple displays.
// These functions cache their results ---------------------------------
@@ -261,16 +259,6 @@ UI_EXPORT XSharedMemoryId AttachSharedMemory(Display* display,
int shared_memory_support);
UI_EXPORT void DetachSharedMemory(Display* display, XSharedMemoryId shmseg);
-// Copies |source_bounds| from |drawable| to |canvas| at offset |dest_offset|.
-// |source_bounds| is in physical pixels, while |dest_offset| is relative to
-// the canvas's scale. Note that this function is slow since it uses
-// XGetImage() to copy the data from the X server to this process before
-// copying it to |canvas|.
-UI_EXPORT bool CopyAreaToCanvas(XID drawable,
- gfx::Rect source_bounds,
- gfx::Point dest_offset,
- gfx::Canvas* canvas);
-
// Return a handle to an XRender picture where |pixmap| is a handle to a
// pixmap containing Skia ARGB data.
UI_EXPORT XID CreatePictureFromSkiaPixmap(Display* display, XID pixmap);
diff --git a/chromium/ui/compositor/compositor.cc b/chromium/ui/compositor/compositor.cc
index 88cfc563717..f16e56bf827 100644
--- a/chromium/ui/compositor/compositor.cc
+++ b/chromium/ui/compositor/compositor.cc
@@ -16,8 +16,6 @@
#include "base/threading/thread.h"
#include "base/threading/thread_restrictions.h"
#include "cc/base/switches.h"
-#include "cc/debug/test_context_provider.h"
-#include "cc/debug/test_web_graphics_context_3d.h"
#include "cc/input/input_handler.h"
#include "cc/layers/layer.h"
#include "cc/output/context_provider.h"
@@ -26,14 +24,15 @@
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/compositor/compositor_observer.h"
#include "ui/compositor/compositor_switches.h"
+#include "ui/compositor/context_provider_from_context_factory.h"
#include "ui/compositor/dip_util.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/reflector.h"
+#include "ui/compositor/test_web_graphics_context_3d.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_surface.h"
#include "ui/gl/gl_switches.h"
-#include "webkit/common/gpu/context_provider_in_process.h"
#include "webkit/common/gpu/grcontext_for_webgraphicscontext3d.h"
#include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
@@ -109,17 +108,13 @@ bool DefaultContextFactory::Initialize() {
scoped_ptr<cc::OutputSurface> DefaultContextFactory::CreateOutputSurface(
Compositor* compositor) {
- WebKit::WebGraphicsContext3D::Attributes attrs;
- attrs.depth = false;
- attrs.stencil = false;
- attrs.antialias = false;
- attrs.shareResources = true;
+ return make_scoped_ptr(new cc::OutputSurface(
+ CreateContextCommon(compositor, false)));
+}
- using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
- scoped_ptr<WebKit::WebGraphicsContext3D> context(
- WebGraphicsContext3DInProcessCommandBufferImpl::CreateViewContext(
- attrs, compositor->widget()));
- return make_scoped_ptr(new cc::OutputSurface(context.Pass()));
+scoped_ptr<WebKit::WebGraphicsContext3D>
+DefaultContextFactory::CreateOffscreenContext() {
+ return CreateContextCommon(NULL, true);
}
scoped_refptr<Reflector> DefaultContextFactory::CreateReflector(
@@ -137,7 +132,7 @@ DefaultContextFactory::OffscreenContextProviderForMainThread() {
if (!offscreen_contexts_main_thread_.get() ||
!offscreen_contexts_main_thread_->DestroyedOnMainThread()) {
offscreen_contexts_main_thread_ =
- webkit::gpu::ContextProviderInProcess::CreateOffscreen();
+ ContextProviderFromContextFactory::CreateForOffscreen(this);
if (offscreen_contexts_main_thread_.get() &&
!offscreen_contexts_main_thread_->BindToCurrentThread())
offscreen_contexts_main_thread_ = NULL;
@@ -150,7 +145,7 @@ DefaultContextFactory::OffscreenContextProviderForCompositorThread() {
if (!offscreen_contexts_compositor_thread_.get() ||
!offscreen_contexts_compositor_thread_->DestroyedOnMainThread()) {
offscreen_contexts_compositor_thread_ =
- webkit::gpu::ContextProviderInProcess::CreateOffscreen();
+ ContextProviderFromContextFactory::CreateForOffscreen(this);
}
return offscreen_contexts_compositor_thread_;
}
@@ -160,15 +155,39 @@ void DefaultContextFactory::RemoveCompositor(Compositor* compositor) {
bool DefaultContextFactory::DoesCreateTestContexts() { return false; }
+scoped_ptr<WebKit::WebGraphicsContext3D>
+DefaultContextFactory::CreateContextCommon(Compositor* compositor,
+ bool offscreen) {
+ DCHECK(offscreen || compositor);
+ WebKit::WebGraphicsContext3D::Attributes attrs;
+ attrs.depth = false;
+ attrs.stencil = false;
+ attrs.antialias = false;
+ attrs.shareResources = true;
+ using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
+ if (offscreen) {
+ return WebGraphicsContext3DInProcessCommandBufferImpl::
+ CreateOffscreenContext(attrs);
+ }
+ return WebGraphicsContext3DInProcessCommandBufferImpl::CreateViewContext(
+ attrs, compositor->widget());
+}
+
TestContextFactory::TestContextFactory() {}
TestContextFactory::~TestContextFactory() {}
scoped_ptr<cc::OutputSurface> TestContextFactory::CreateOutputSurface(
Compositor* compositor) {
- scoped_ptr<WebKit::WebGraphicsContext3D> context(
- cc::TestWebGraphicsContext3D::Create());
- return make_scoped_ptr(new cc::OutputSurface(context.Pass()));
+ return make_scoped_ptr(new cc::OutputSurface(CreateOffscreenContext()));
+}
+
+scoped_ptr<WebKit::WebGraphicsContext3D>
+TestContextFactory::CreateOffscreenContext() {
+ scoped_ptr<ui::TestWebGraphicsContext3D> context(
+ new ui::TestWebGraphicsContext3D);
+ context->Initialize();
+ return context.PassAs<WebKit::WebGraphicsContext3D>();
}
scoped_refptr<Reflector> TestContextFactory::CreateReflector(
@@ -184,7 +203,8 @@ scoped_refptr<cc::ContextProvider>
TestContextFactory::OffscreenContextProviderForMainThread() {
if (!offscreen_contexts_main_thread_.get() ||
offscreen_contexts_main_thread_->DestroyedOnMainThread()) {
- offscreen_contexts_main_thread_ = cc::TestContextProvider::Create();
+ offscreen_contexts_main_thread_ =
+ ContextProviderFromContextFactory::CreateForOffscreen(this);
CHECK(offscreen_contexts_main_thread_->BindToCurrentThread());
}
return offscreen_contexts_main_thread_;
@@ -194,7 +214,8 @@ scoped_refptr<cc::ContextProvider>
TestContextFactory::OffscreenContextProviderForCompositorThread() {
if (!offscreen_contexts_compositor_thread_.get() ||
offscreen_contexts_compositor_thread_->DestroyedOnMainThread()) {
- offscreen_contexts_compositor_thread_ = cc::TestContextProvider::Create();
+ offscreen_contexts_compositor_thread_ =
+ ContextProviderFromContextFactory::CreateForOffscreen(this);
}
return offscreen_contexts_compositor_thread_;
}
@@ -479,7 +500,18 @@ void Compositor::Initialize() {
#endif
if (use_thread) {
g_compositor_thread = new base::Thread("Browser Compositor");
+#if defined(OS_POSIX)
+ // Workaround for crbug.com/293736
+ // On Posix, MessagePumpDefault uses system time, so delayed tasks (for
+ // compositor scheduling) work incorrectly across system time changes (e.g.
+ // tlsdate). So instead, use an IO loop, which uses libevent, that uses
+ // monotonic time (immune to these problems).
+ base::Thread::Options options;
+ options.message_loop_type = base::MessageLoop::TYPE_IO;
+ g_compositor_thread->StartWithOptions(options);
+#else
g_compositor_thread->Start();
+#endif
}
DCHECK(!g_compositor_initialized) << "Compositor initialized twice.";
diff --git a/chromium/ui/compositor/compositor.gyp b/chromium/ui/compositor/compositor.gyp
index 83d197131fa..57a4aafae21 100644
--- a/chromium/ui/compositor/compositor.gyp
+++ b/chromium/ui/compositor/compositor.gyp
@@ -30,6 +30,8 @@
'compositor_observer.h',
'compositor_switches.cc',
'compositor_switches.h',
+ 'context_provider_from_context_factory.cc',
+ 'context_provider_from_context_factory.h',
'debug_utils.cc',
'debug_utils.h',
'dip_util.cc',
@@ -56,6 +58,9 @@
'scoped_animation_duration_scale_mode.h',
'scoped_layer_animation_settings.cc',
'scoped_layer_animation_settings.h',
+ # UI tests need TestWebGraphicsContext3D, so we always build it.
+ 'test_web_graphics_context_3d.cc',
+ 'test_web_graphics_context_3d.h',
'transform_animation_curve_adapter.cc',
'transform_animation_curve_adapter.h',
],
diff --git a/chromium/ui/compositor/compositor.h b/chromium/ui/compositor/compositor.h
index bc97dbafd6a..92cdd7194f8 100644
--- a/chromium/ui/compositor/compositor.h
+++ b/chromium/ui/compositor/compositor.h
@@ -34,7 +34,6 @@ class ContextProvider;
class Layer;
class LayerTreeDebugState;
class LayerTreeHost;
-class TestContextProvider;
}
namespace gfx {
@@ -50,12 +49,6 @@ namespace WebKit {
class WebGraphicsContext3D;
}
-namespace webkit {
-namespace gpu {
-class ContextProviderInProcess;
-}
-}
-
namespace ui {
class Compositor;
@@ -87,6 +80,10 @@ class COMPOSITOR_EXPORT ContextFactory {
virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface(
Compositor* compositor) = 0;
+ // Creates a context used for offscreen rendering. This context can be shared
+ // with all compositors.
+ virtual scoped_ptr<WebKit::WebGraphicsContext3D> CreateOffscreenContext() = 0;
+
// Creates a reflector that copies the content of the |mirrored_compositor|
// onto |mirroing_layer|.
virtual scoped_refptr<Reflector> CreateReflector(
@@ -117,6 +114,8 @@ class COMPOSITOR_EXPORT DefaultContextFactory : public ContextFactory {
// ContextFactory implementation
virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface(
Compositor* compositor) OVERRIDE;
+ virtual scoped_ptr<WebKit::WebGraphicsContext3D> CreateOffscreenContext()
+ OVERRIDE;
virtual scoped_refptr<Reflector> CreateReflector(
Compositor* compositor,
@@ -133,9 +132,13 @@ class COMPOSITOR_EXPORT DefaultContextFactory : public ContextFactory {
bool Initialize();
private:
- scoped_refptr<webkit::gpu::ContextProviderInProcess>
+ scoped_ptr<WebKit::WebGraphicsContext3D> CreateContextCommon(
+ Compositor* compositor,
+ bool offscreen);
+
+ scoped_refptr<ContextProviderFromContextFactory>
offscreen_contexts_main_thread_;
- scoped_refptr<webkit::gpu::ContextProviderInProcess>
+ scoped_refptr<ContextProviderFromContextFactory>
offscreen_contexts_compositor_thread_;
DISALLOW_COPY_AND_ASSIGN(DefaultContextFactory);
@@ -150,6 +153,8 @@ class COMPOSITOR_EXPORT TestContextFactory : public ContextFactory {
// ContextFactory implementation
virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface(
Compositor* compositor) OVERRIDE;
+ virtual scoped_ptr<WebKit::WebGraphicsContext3D> CreateOffscreenContext()
+ OVERRIDE;
virtual scoped_refptr<Reflector> CreateReflector(
Compositor* mirrored_compositor,
@@ -164,8 +169,10 @@ class COMPOSITOR_EXPORT TestContextFactory : public ContextFactory {
virtual bool DoesCreateTestContexts() OVERRIDE;
private:
- scoped_refptr<cc::TestContextProvider> offscreen_contexts_main_thread_;
- scoped_refptr<cc::TestContextProvider> offscreen_contexts_compositor_thread_;
+ scoped_refptr<ContextProviderFromContextFactory>
+ offscreen_contexts_main_thread_;
+ scoped_refptr<ContextProviderFromContextFactory>
+ offscreen_contexts_compositor_thread_;
DISALLOW_COPY_AND_ASSIGN(TestContextFactory);
};
diff --git a/chromium/ui/compositor/context_provider_from_context_factory.cc b/chromium/ui/compositor/context_provider_from_context_factory.cc
new file mode 100644
index 00000000000..262998a886a
--- /dev/null
+++ b/chromium/ui/compositor/context_provider_from_context_factory.cc
@@ -0,0 +1,76 @@
+// Copyright (c) 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 "context_provider_from_context_factory.h"
+
+#include "base/logging.h"
+
+namespace ui {
+
+// static
+scoped_refptr<ContextProviderFromContextFactory>
+ContextProviderFromContextFactory::CreateForOffscreen(ContextFactory* factory) {
+ scoped_refptr<ContextProviderFromContextFactory> provider =
+ new ContextProviderFromContextFactory(factory);
+ if (!provider->InitializeOnMainThread())
+ return NULL;
+ return provider;
+}
+
+ContextProviderFromContextFactory::ContextProviderFromContextFactory(
+ ContextFactory* factory)
+ : factory_(factory),
+ destroyed_(false) {
+}
+
+ContextProviderFromContextFactory::~ContextProviderFromContextFactory() {
+}
+
+bool ContextProviderFromContextFactory::BindToCurrentThread() {
+ DCHECK(context3d_);
+ return context3d_->makeContextCurrent();
+}
+
+WebKit::WebGraphicsContext3D* ContextProviderFromContextFactory::Context3d() {
+ DCHECK(context3d_);
+ return context3d_.get();
+}
+
+class GrContext* ContextProviderFromContextFactory::GrContext() {
+ DCHECK(context3d_);
+
+ if (!gr_context_) {
+ gr_context_.reset(
+ new webkit::gpu::GrContextForWebGraphicsContext3D(context3d_.get()));
+ }
+ return gr_context_->get();
+}
+
+void ContextProviderFromContextFactory::VerifyContexts() {
+ DCHECK(context3d_);
+
+ if (context3d_->isContextLost()) {
+ base::AutoLock lock(destroyed_lock_);
+ destroyed_ = true;
+ }
+}
+
+bool ContextProviderFromContextFactory::DestroyedOnMainThread() {
+ base::AutoLock lock(destroyed_lock_);
+ return destroyed_;
+}
+
+void ContextProviderFromContextFactory::SetLostContextCallback(
+ const LostContextCallback& cb) {
+ NOTIMPLEMENTED();
+}
+
+bool ContextProviderFromContextFactory::InitializeOnMainThread() {
+ if (context3d_)
+ return true;
+ context3d_ = factory_->CreateOffscreenContext();
+ return !!context3d_;
+}
+
+} // namespace ui
diff --git a/chromium/ui/compositor/context_provider_from_context_factory.h b/chromium/ui/compositor/context_provider_from_context_factory.h
new file mode 100644
index 00000000000..57be7f47efd
--- /dev/null
+++ b/chromium/ui/compositor/context_provider_from_context_factory.h
@@ -0,0 +1,45 @@
+// Copyright (c) 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_COMPOSITOR_CONTEXT_PROVIDER_FROM_CONTEXT_FACTORY_H_
+#define UI_COMPOSITOR_CONTEXT_PROVIDER_FROM_CONTEXT_FACTORY_H_
+
+#include "base/synchronization/lock.h"
+#include "cc/output/context_provider.h"
+#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
+#include "ui/compositor/compositor.h"
+#include "webkit/common/gpu/grcontext_for_webgraphicscontext3d.h"
+
+namespace ui {
+
+class ContextProviderFromContextFactory
+ : public cc::ContextProvider {
+ public:
+ static scoped_refptr<ContextProviderFromContextFactory> CreateForOffscreen(
+ ContextFactory* factory);
+
+ virtual bool BindToCurrentThread() OVERRIDE;
+ virtual WebKit::WebGraphicsContext3D* Context3d() OVERRIDE;
+ virtual class GrContext* GrContext() OVERRIDE;
+ virtual void VerifyContexts() OVERRIDE;
+ virtual bool DestroyedOnMainThread() OVERRIDE;
+ virtual void SetLostContextCallback(const LostContextCallback& cb) OVERRIDE;
+
+ protected:
+ ContextProviderFromContextFactory(ContextFactory* factory);
+ virtual ~ContextProviderFromContextFactory();
+
+ bool InitializeOnMainThread();
+
+ private:
+ ContextFactory* factory_;
+ base::Lock destroyed_lock_;
+ bool destroyed_;
+ scoped_ptr<WebKit::WebGraphicsContext3D> context3d_;
+ scoped_ptr<webkit::gpu::GrContextForWebGraphicsContext3D> gr_context_;
+};
+
+} // namespace ui
+
+#endif // UI_COMPOSITOR_CONTEXT_PROVIDER_FROM_CONTEXT_FACTORY_H_
diff --git a/chromium/ui/compositor/layer_animation_sequence.cc b/chromium/ui/compositor/layer_animation_sequence.cc
index f1c7eba6932..371e5409219 100644
--- a/chromium/ui/compositor/layer_animation_sequence.cc
+++ b/chromium/ui/compositor/layer_animation_sequence.cc
@@ -8,7 +8,6 @@
#include <iterator>
#include "base/debug/trace_event.h"
-#include "cc/animation/animation_id_provider.h"
#include "ui/compositor/layer_animation_delegate.h"
#include "ui/compositor/layer_animation_element.h"
#include "ui/compositor/layer_animation_observer.h"
@@ -77,10 +76,8 @@ void LayerAnimationSequence::Progress(base::TimeTicks now,
}
if (is_cyclic_ || last_element_ < elements_.size()) {
- if (!elements_[current_index]->Started()) {
- animation_group_id_ = cc::AnimationIdProvider::NextGroupId();
+ if (!elements_[current_index]->Started())
elements_[current_index]->Start(delegate, animation_group_id_);
- }
if (elements_[current_index]->Progress(now, delegate))
redraw_required = true;
last_progressed_fraction_ =
diff --git a/chromium/ui/compositor/layer_animation_sequence.h b/chromium/ui/compositor/layer_animation_sequence.h
index a2972f72be8..838c6b98841 100644
--- a/chromium/ui/compositor/layer_animation_sequence.h
+++ b/chromium/ui/compositor/layer_animation_sequence.h
@@ -102,8 +102,6 @@ class COMPOSITOR_EXPORT LayerAnimationSequence
bool IsFirstElementThreaded() const;
// Used to identify groups of sequences that are supposed to start together.
- // Once started, used to identify the sequence that owns a particular
- // threaded animation.
int animation_group_id() const { return animation_group_id_; }
void set_animation_group_id(int id) { animation_group_id_ = id; }
@@ -166,9 +164,6 @@ class COMPOSITOR_EXPORT LayerAnimationSequence
bool waiting_for_group_start_;
// Identifies groups of sequences that are supposed to start together.
- // Also used to identify the owner of a particular threaded animation; any
- // in-progress threaded animation owned by this sequence will have this
- // group id.
int animation_group_id_;
// These parties are notified when layer animations end.
diff --git a/chromium/ui/compositor/layer_animation_sequence_unittest.cc b/chromium/ui/compositor/layer_animation_sequence_unittest.cc
index 3b4591762b0..fe70601f15d 100644
--- a/chromium/ui/compositor/layer_animation_sequence_unittest.cc
+++ b/chromium/ui/compositor/layer_animation_sequence_unittest.cc
@@ -82,8 +82,8 @@ TEST(LayerAnimationSequenceTest, SingleThreadedElement) {
LayerAnimationElement::CreateOpacityElement(target, delta));
for (int i = 0; i < 2; ++i) {
- int starting_group_id = 1;
- sequence.set_animation_group_id(starting_group_id);
+ int group_id = 1;
+ sequence.set_animation_group_id(group_id);
start_time = effective_start + delta;
sequence.set_start_time(start_time);
delegate.SetOpacityFromAnimation(start);
@@ -94,7 +94,7 @@ TEST(LayerAnimationSequenceTest, SingleThreadedElement) {
sequence.OnThreadedAnimationStarted(cc::AnimationEvent(
cc::AnimationEvent::Started,
0,
- sequence.animation_group_id(),
+ group_id,
cc::Animation::Opacity,
(effective_start - base::TimeTicks()).InSecondsF()));
sequence.Progress(effective_start + delta/2, &delegate);
@@ -139,8 +139,8 @@ TEST(LayerAnimationSequenceTest, MultipleElement) {
LayerAnimationElement::CreateTransformElement(target_transform, delta));
for (int i = 0; i < 2; ++i) {
- int starting_group_id = 1;
- sequence.set_animation_group_id(starting_group_id);
+ int group_id = 1;
+ sequence.set_animation_group_id(group_id);
start_time = opacity_effective_start + 4 * delta;
sequence.set_start_time(start_time);
delegate.SetOpacityFromAnimation(start_opacity);
@@ -150,11 +150,10 @@ TEST(LayerAnimationSequenceTest, MultipleElement) {
sequence.Progress(start_time, &delegate);
EXPECT_FLOAT_EQ(0.0, sequence.last_progressed_fraction());
opacity_effective_start = start_time + delta;
- EXPECT_EQ(starting_group_id, sequence.animation_group_id());
sequence.OnThreadedAnimationStarted(cc::AnimationEvent(
cc::AnimationEvent::Started,
0,
- sequence.animation_group_id(),
+ group_id,
cc::Animation::Opacity,
(opacity_effective_start - base::TimeTicks()).InSecondsF()));
sequence.Progress(opacity_effective_start + delta/2, &delegate);
@@ -181,11 +180,10 @@ TEST(LayerAnimationSequenceTest, MultipleElement) {
delegate.GetTransformForAnimation());
EXPECT_FLOAT_EQ(0.0, sequence.last_progressed_fraction());
transform_effective_start = opacity_effective_start + 3 * delta;
- EXPECT_NE(starting_group_id, sequence.animation_group_id());
sequence.OnThreadedAnimationStarted(cc::AnimationEvent(
cc::AnimationEvent::Started,
0,
- sequence.animation_group_id(),
+ group_id,
cc::Animation::Transform,
(transform_effective_start - base::TimeTicks()).InSecondsF()));
sequence.Progress(transform_effective_start + delta/2, &delegate);
diff --git a/chromium/ui/compositor/test_web_graphics_context_3d.cc b/chromium/ui/compositor/test_web_graphics_context_3d.cc
new file mode 100644
index 00000000000..d8febc9ca08
--- /dev/null
+++ b/chromium/ui/compositor/test_web_graphics_context_3d.cc
@@ -0,0 +1,220 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/compositor/test_web_graphics_context_3d.h"
+
+#include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_context_stub.h"
+#include "ui/gl/gl_surface_stub.h"
+
+namespace ui {
+
+TestWebGraphicsContext3D::TestWebGraphicsContext3D()
+ : next_texture_id_(1) {}
+
+TestWebGraphicsContext3D::~TestWebGraphicsContext3D() {}
+
+void TestWebGraphicsContext3D::Initialize() {
+ gl_surface_ = new gfx::GLSurfaceStub;
+ gl_context_ = new gfx::GLContextStub;
+ gl_context_->MakeCurrent(gl_surface_.get());
+}
+
+bool TestWebGraphicsContext3D::makeContextCurrent() {
+ return true;
+}
+
+int TestWebGraphicsContext3D::width() {
+ return 0;
+}
+
+int TestWebGraphicsContext3D::height() {
+ return 0;
+}
+
+bool TestWebGraphicsContext3D::isContextLost() {
+ return false;
+}
+
+void* TestWebGraphicsContext3D::mapBufferSubDataCHROMIUM(
+ WebKit::WGC3Denum target,
+ WebKit::WGC3Dintptr offset,
+ WebKit::WGC3Dsizeiptr size,
+ WebKit::WGC3Denum access) {
+ return 0;
+}
+
+void* TestWebGraphicsContext3D::mapTexSubImage2DCHROMIUM(
+ WebKit::WGC3Denum target,
+ WebKit::WGC3Dint level,
+ WebKit::WGC3Dint xoffset,
+ WebKit::WGC3Dint yoffset,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height,
+ WebKit::WGC3Denum format,
+ WebKit::WGC3Denum type,
+ WebKit::WGC3Denum access) {
+ return 0;
+}
+
+WebKit::WebString TestWebGraphicsContext3D::getRequestableExtensionsCHROMIUM() {
+ return WebKit::WebString();
+}
+
+WebKit::WGC3Denum TestWebGraphicsContext3D::checkFramebufferStatus(
+ WebKit::WGC3Denum target) {
+ return GL_FRAMEBUFFER_COMPLETE;
+}
+
+bool TestWebGraphicsContext3D::getActiveAttrib(WebKit::WebGLId program,
+ WebKit::WGC3Duint index,
+ ActiveInfo& info) {
+ return false;
+}
+
+bool TestWebGraphicsContext3D::getActiveUniform(WebKit::WebGLId program,
+ WebKit::WGC3Duint index,
+ ActiveInfo& info) {
+ return false;
+}
+
+WebKit::WGC3Dint TestWebGraphicsContext3D::getAttribLocation(
+ WebKit::WebGLId program,
+ const WebKit::WGC3Dchar* name) {
+ return 0;
+}
+
+TestWebGraphicsContext3D::Attributes
+TestWebGraphicsContext3D::getContextAttributes() {
+ return Attributes();
+}
+
+WebKit::WGC3Denum TestWebGraphicsContext3D::getError() {
+ return 0;
+}
+
+void TestWebGraphicsContext3D::getIntegerv(WebKit::WGC3Denum pname,
+ WebKit::WGC3Dint* value) {
+ if (pname == GL_MAX_TEXTURE_SIZE)
+ *value = 1024;
+ else if (pname == GL_ACTIVE_TEXTURE)
+ *value = GL_TEXTURE0;
+}
+
+void TestWebGraphicsContext3D::getProgramiv(WebKit::WebGLId program,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dint* value) {
+ if (pname == GL_LINK_STATUS)
+ *value = 1;
+}
+
+WebKit::WebString TestWebGraphicsContext3D::getProgramInfoLog(
+ WebKit::WebGLId program) {
+ return WebKit::WebString();
+}
+
+void TestWebGraphicsContext3D::getShaderiv(WebKit::WebGLId shader,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dint* value) {
+ if (pname == GL_COMPILE_STATUS)
+ *value = 1;
+}
+
+WebKit::WebString TestWebGraphicsContext3D::getShaderInfoLog(
+ WebKit::WebGLId shader) {
+ return WebKit::WebString();
+}
+
+WebKit::WebString TestWebGraphicsContext3D::getShaderSource(
+ WebKit::WebGLId shader) {
+ return WebKit::WebString();
+}
+
+WebKit::WebString TestWebGraphicsContext3D::getString(WebKit::WGC3Denum name) {
+ return WebKit::WebString();
+}
+
+WebKit::WGC3Dint TestWebGraphicsContext3D::getUniformLocation(
+ WebKit::WebGLId program,
+ const WebKit::WGC3Dchar* name) {
+ return 0;
+}
+
+WebKit::WGC3Dsizeiptr TestWebGraphicsContext3D::getVertexAttribOffset(
+ WebKit::WGC3Duint index,
+ WebKit::WGC3Denum pname) {
+ return 0;
+}
+
+WebKit::WGC3Dboolean TestWebGraphicsContext3D::isBuffer(
+ WebKit::WebGLId buffer) {
+ return false;
+}
+
+WebKit::WGC3Dboolean TestWebGraphicsContext3D::isEnabled(
+ WebKit::WGC3Denum cap) {
+ return false;
+}
+
+WebKit::WGC3Dboolean TestWebGraphicsContext3D::isFramebuffer(
+ WebKit::WebGLId framebuffer) {
+ return false;
+}
+
+WebKit::WGC3Dboolean TestWebGraphicsContext3D::isProgram(
+ WebKit::WebGLId program) {
+ return false;
+}
+
+WebKit::WGC3Dboolean TestWebGraphicsContext3D::isRenderbuffer(
+ WebKit::WebGLId renderbuffer) {
+ return false;
+}
+
+WebKit::WGC3Dboolean TestWebGraphicsContext3D::isShader(
+ WebKit::WebGLId shader) {
+ return false;
+}
+
+WebKit::WGC3Dboolean TestWebGraphicsContext3D::isTexture(
+ WebKit::WebGLId texture) {
+ return false;
+}
+
+WebKit::WebGLId TestWebGraphicsContext3D::createBuffer() {
+ return 1;
+}
+
+WebKit::WebGLId TestWebGraphicsContext3D::createFramebuffer() {
+ return 1;
+}
+
+WebKit::WebGLId TestWebGraphicsContext3D::createProgram() {
+ return 1;
+}
+
+WebKit::WebGLId TestWebGraphicsContext3D::createRenderbuffer() {
+ return 1;
+}
+
+WebKit::WebGLId TestWebGraphicsContext3D::createShader(
+ WebKit::WGC3Denum value) {
+ return 1;
+}
+
+WebKit::WebGLId TestWebGraphicsContext3D::createTexture() {
+ return next_texture_id_++;
+}
+
+WebKit::WebGLId TestWebGraphicsContext3D::createQueryEXT()
+{
+ return 1;
+}
+
+WebKit::WGC3Dboolean TestWebGraphicsContext3D::isQueryEXT(WebKit::WebGLId)
+{
+ return true;
+}
+
+} // namespace ui
diff --git a/chromium/ui/compositor/test_web_graphics_context_3d.h b/chromium/ui/compositor/test_web_graphics_context_3d.h
new file mode 100644
index 00000000000..f7a96220a47
--- /dev/null
+++ b/chromium/ui/compositor/test_web_graphics_context_3d.h
@@ -0,0 +1,450 @@
+// 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_COMPOSITOR_TEST_WEB_GRAPHICS_CONTEXT_3D_H_
+#define UI_COMPOSITOR_TEST_WEB_GRAPHICS_CONTEXT_3D_H_
+
+#include "base/logging.h"
+#include "base/memory/ref_counted.h"
+#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
+#include "third_party/WebKit/public/platform/WebString.h"
+#include "ui/compositor/compositor_export.h"
+
+namespace gfx {
+class GLContext;
+class GLSurface;
+}
+
+namespace ui {
+
+// WebGraphicsContext3D that does nothing. Suitable for testing.
+class COMPOSITOR_EXPORT TestWebGraphicsContext3D :
+ public NON_EXPORTED_BASE(WebKit::WebGraphicsContext3D) {
+ public:
+ TestWebGraphicsContext3D();
+ virtual ~TestWebGraphicsContext3D();
+
+ void Initialize();
+ virtual bool makeContextCurrent();
+ virtual int width();
+ virtual int height();
+ virtual void reshape(int width, int height) {}
+ virtual void prepareTexture() {}
+ virtual void postSubBufferCHROMIUM(int x, int y, int width, int height) {}
+ virtual void synthesizeGLError(WebKit::WGC3Denum value) {}
+ virtual bool isContextLost();
+ virtual void* mapBufferSubDataCHROMIUM(WebKit::WGC3Denum target,
+ WebKit::WGC3Dintptr offset,
+ WebKit::WGC3Dsizeiptr size,
+ WebKit::WGC3Denum access);
+ virtual void unmapBufferSubDataCHROMIUM(const void* data) {}
+ virtual void* mapTexSubImage2DCHROMIUM(WebKit::WGC3Denum target,
+ WebKit::WGC3Dint level,
+ WebKit::WGC3Dint xoffset,
+ WebKit::WGC3Dint yoffset,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height,
+ WebKit::WGC3Denum format,
+ WebKit::WGC3Denum type,
+ WebKit::WGC3Denum access);
+ virtual void unmapTexSubImage2DCHROMIUM(const void* data) {}
+ virtual void setVisibilityCHROMIUM(bool visible) {}
+ virtual void discardFramebufferEXT(WebKit::WGC3Denum target,
+ WebKit::WGC3Dsizei numAttachments,
+ const WebKit::WGC3Denum* attachments) {}
+ virtual void setMemoryAllocationChangedCallbackCHROMIUM(
+ WebGraphicsMemoryAllocationChangedCallbackCHROMIUM*) { }
+ virtual WebKit::WebString getRequestableExtensionsCHROMIUM();
+ virtual void requestExtensionCHROMIUM(const char*) {}
+ virtual void blitFramebufferCHROMIUM(WebKit::WGC3Dint src_x0,
+ WebKit::WGC3Dint src_y0,
+ WebKit::WGC3Dint src_x1,
+ WebKit::WGC3Dint src_y1,
+ WebKit::WGC3Dint dst_x0,
+ WebKit::WGC3Dint dst_y0,
+ WebKit::WGC3Dint dst_x1,
+ WebKit::WGC3Dint dst_y1,
+ WebKit::WGC3Dbitfield mask,
+ WebKit::WGC3Denum filter) {}
+ virtual void renderbufferStorageMultisampleCHROMIUM(
+ WebKit::WGC3Denum target,
+ WebKit::WGC3Dsizei samples,
+ WebKit::WGC3Denum internalformat,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height) {}
+ virtual void activeTexture(WebKit::WGC3Denum texture) {}
+ virtual void attachShader(WebKit::WebGLId program, WebKit::WebGLId shader) {}
+ virtual void bindAttribLocation(WebKit::WebGLId program,
+ WebKit::WGC3Duint index,
+ const WebKit::WGC3Dchar* name) {}
+ virtual void bindBuffer(WebKit::WGC3Denum target, WebKit::WebGLId buffer) {}
+ virtual void bindFramebuffer(WebKit::WGC3Denum target,
+ WebKit::WebGLId framebuffer) {}
+ virtual void bindRenderbuffer(WebKit::WGC3Denum target,
+ WebKit::WebGLId renderbuffer) {}
+ virtual void bindTexture(WebKit::WGC3Denum target, WebKit::WebGLId texture) {}
+ virtual void blendColor(WebKit::WGC3Dclampf red,
+ WebKit::WGC3Dclampf green,
+ WebKit::WGC3Dclampf blue,
+ WebKit::WGC3Dclampf alpha) {}
+ virtual void blendEquation(WebKit::WGC3Denum mode) {}
+ virtual void blendEquationSeparate(WebKit::WGC3Denum modeRGB,
+ WebKit::WGC3Denum modeAlpha) {}
+ virtual void blendFunc(WebKit::WGC3Denum sfactor,
+ WebKit::WGC3Denum dfactor) {}
+ virtual void blendFuncSeparate(WebKit::WGC3Denum src_rgb,
+ WebKit::WGC3Denum dst_rgb,
+ WebKit::WGC3Denum src_alpha,
+ WebKit::WGC3Denum dst_alpha) {}
+ virtual void bufferData(WebKit::WGC3Denum target,
+ WebKit::WGC3Dsizeiptr size,
+ const void* data,
+ WebKit::WGC3Denum usage) {}
+ virtual void bufferSubData(WebKit::WGC3Denum target,
+ WebKit::WGC3Dintptr offset,
+ WebKit::WGC3Dsizeiptr size,
+ const void* data) {}
+ virtual WebKit::WGC3Denum checkFramebufferStatus(WebKit::WGC3Denum target);
+ virtual void clear(WebKit::WGC3Dbitfield mask) {}
+ virtual void clearColor(WebKit::WGC3Dclampf red,
+ WebKit::WGC3Dclampf green,
+ WebKit::WGC3Dclampf blue,
+ WebKit::WGC3Dclampf alpha) {}
+ virtual void clearDepth(WebKit::WGC3Dclampf depth) {}
+ virtual void clearStencil(WebKit::WGC3Dint s) {}
+ virtual void colorMask(WebKit::WGC3Dboolean red,
+ WebKit::WGC3Dboolean green,
+ WebKit::WGC3Dboolean blue,
+ WebKit::WGC3Dboolean alpha) {}
+ virtual void compileShader(WebKit::WebGLId shader) {}
+ virtual void compressedTexImage2D(WebKit::WGC3Denum target,
+ WebKit::WGC3Dint level,
+ WebKit::WGC3Denum internalformat,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height,
+ WebKit::WGC3Dint border,
+ WebKit::WGC3Dsizei imageSize,
+ const void* data) {}
+ virtual void compressedTexSubImage2D(WebKit::WGC3Denum target,
+ WebKit::WGC3Dint level,
+ WebKit::WGC3Dint xoffset,
+ WebKit::WGC3Dint yoffset,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height,
+ WebKit::WGC3Denum format,
+ WebKit::WGC3Dsizei imageSize,
+ const void* data) {}
+ virtual void copyTexImage2D(WebKit::WGC3Denum target,
+ WebKit::WGC3Dint level,
+ WebKit::WGC3Denum internal_format,
+ WebKit::WGC3Dint x,
+ WebKit::WGC3Dint y,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height,
+ WebKit::WGC3Dint border) {}
+ virtual void copyTexSubImage2D(WebKit::WGC3Denum target,
+ WebKit::WGC3Dint level,
+ WebKit::WGC3Dint xoffset,
+ WebKit::WGC3Dint yoffset,
+ WebKit::WGC3Dint x,
+ WebKit::WGC3Dint y,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height) {}
+ virtual void cullFace(WebKit::WGC3Denum mode) {}
+ virtual void depthFunc(WebKit::WGC3Denum func) {}
+ virtual void depthMask(WebKit::WGC3Dboolean flag) {}
+ virtual void depthRange(WebKit::WGC3Dclampf z_near,
+ WebKit::WGC3Dclampf z_far) {}
+ virtual void detachShader(WebKit::WebGLId program, WebKit::WebGLId shader) {}
+ virtual void disable(WebKit::WGC3Denum cap) {}
+ virtual void disableVertexAttribArray(WebKit::WGC3Duint index) {}
+ virtual void drawArrays(WebKit::WGC3Denum mode, WebKit::WGC3Dint first,
+ WebKit::WGC3Dsizei count) {}
+ virtual void drawElements(WebKit::WGC3Denum mode,
+ WebKit::WGC3Dsizei count,
+ WebKit::WGC3Denum type,
+ WebKit::WGC3Dintptr offset) {}
+ virtual void enable(WebKit::WGC3Denum cap) {}
+ virtual void enableVertexAttribArray(WebKit::WGC3Duint index) {}
+ virtual void finish() {}
+ virtual void flush() {}
+ virtual void framebufferRenderbuffer(WebKit::WGC3Denum target,
+ WebKit::WGC3Denum attachment,
+ WebKit::WGC3Denum renderbuffertarget,
+ WebKit::WebGLId renderbuffer) {}
+ virtual void framebufferTexture2D(WebKit::WGC3Denum target,
+ WebKit::WGC3Denum attachment,
+ WebKit::WGC3Denum textarget,
+ WebKit::WebGLId texture,
+ WebKit::WGC3Dint level) {}
+ virtual void frontFace(WebKit::WGC3Denum mode) {}
+ virtual void generateMipmap(WebKit::WGC3Denum target) {}
+ virtual bool getActiveAttrib(WebKit::WebGLId program,
+ WebKit::WGC3Duint index,
+ ActiveInfo& info);
+ virtual bool getActiveUniform(WebKit::WebGLId program,
+ WebKit::WGC3Duint index,
+ ActiveInfo& info);
+ virtual void getAttachedShaders(WebKit::WebGLId program,
+ WebKit::WGC3Dsizei maxCount,
+ WebKit::WGC3Dsizei* count,
+ WebKit::WebGLId* shaders) {}
+ virtual WebKit::WGC3Dint getAttribLocation(WebKit::WebGLId program,
+ const WebKit::WGC3Dchar* name);
+ virtual void getBooleanv(WebKit::WGC3Denum pname,
+ WebKit::WGC3Dboolean* value) {}
+ virtual void getBufferParameteriv(WebKit::WGC3Denum target,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dint* value) {}
+ virtual Attributes getContextAttributes();
+ virtual WebKit::WGC3Denum getError();
+ virtual void getFloatv(WebKit::WGC3Denum pname, WebKit::WGC3Dfloat* value) {}
+ virtual void getFramebufferAttachmentParameteriv(WebKit::WGC3Denum target,
+ WebKit::WGC3Denum attachment,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dint* value) {}
+ virtual void getIntegerv(WebKit::WGC3Denum pname, WebKit::WGC3Dint* value);
+ virtual void getProgramiv(WebKit::WebGLId program,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dint* value);
+ virtual WebKit::WebString getProgramInfoLog(WebKit::WebGLId program);
+ virtual void getRenderbufferParameteriv(WebKit::WGC3Denum target,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dint* value) {}
+ virtual void getShaderiv(WebKit::WebGLId shader,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dint* value);
+ virtual WebKit::WebString getShaderInfoLog(WebKit::WebGLId shader);
+ virtual void getShaderPrecisionFormat(WebKit::WGC3Denum shaderType,
+ WebKit::WGC3Denum precisionType,
+ WebKit::WGC3Dint* range,
+ WebKit::WGC3Dint* precision) {}
+ virtual WebKit::WebString getShaderSource(WebKit::WebGLId shader);
+ virtual WebKit::WebString getString(WebKit::WGC3Denum name);
+ virtual void getTexParameterfv(WebKit::WGC3Denum target,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dfloat* value) {}
+ virtual void getTexParameteriv(WebKit::WGC3Denum target,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dint* value) {}
+ virtual void getUniformfv(WebKit::WebGLId program,
+ WebKit::WGC3Dint location,
+ WebKit::WGC3Dfloat* value) {}
+ virtual void getUniformiv(WebKit::WebGLId program,
+ WebKit::WGC3Dint location,
+ WebKit::WGC3Dint* value) {}
+ virtual WebKit::WGC3Dint getUniformLocation(WebKit::WebGLId program,
+ const WebKit::WGC3Dchar* name);
+ virtual void getVertexAttribfv(WebKit::WGC3Duint index,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dfloat* value) {}
+ virtual void getVertexAttribiv(WebKit::WGC3Duint index,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dint* value) {}
+ virtual WebKit::WGC3Dsizeiptr getVertexAttribOffset(WebKit::WGC3Duint index,
+ WebKit::WGC3Denum pname);
+ virtual void hint(WebKit::WGC3Denum target, WebKit::WGC3Denum mode) {}
+ virtual WebKit::WGC3Dboolean isBuffer(WebKit::WebGLId buffer);
+ virtual WebKit::WGC3Dboolean isEnabled(WebKit::WGC3Denum cap);
+ virtual WebKit::WGC3Dboolean isFramebuffer(WebKit::WebGLId framebuffer);
+ virtual WebKit::WGC3Dboolean isProgram(WebKit::WebGLId program);
+ virtual WebKit::WGC3Dboolean isRenderbuffer(WebKit::WebGLId renderbuffer);
+ virtual WebKit::WGC3Dboolean isShader(WebKit::WebGLId shader);
+ virtual WebKit::WGC3Dboolean isTexture(WebKit::WebGLId texture);
+ virtual void lineWidth(WebKit::WGC3Dfloat) {}
+ virtual void linkProgram(WebKit::WebGLId program) {}
+ virtual void pixelStorei(WebKit::WGC3Denum pname, WebKit::WGC3Dint param) {}
+ virtual void polygonOffset(WebKit::WGC3Dfloat factor,
+ WebKit::WGC3Dfloat units) {}
+ virtual void readPixels(WebKit::WGC3Dint x,
+ WebKit::WGC3Dint y,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height,
+ WebKit::WGC3Denum format,
+ WebKit::WGC3Denum type,
+ void* pixels) {}
+ virtual void releaseShaderCompiler() {}
+ virtual void renderbufferStorage(WebKit::WGC3Denum target,
+ WebKit::WGC3Denum internalformat,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height) {}
+ virtual void sampleCoverage(WebKit::WGC3Dclampf value,
+ WebKit::WGC3Dboolean invert) {}
+ virtual void scissor(WebKit::WGC3Dint x,
+ WebKit::WGC3Dint y,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height) {}
+ virtual void shaderSource(WebKit::WebGLId shader,
+ const WebKit::WGC3Dchar* string) {}
+ virtual void stencilFunc(WebKit::WGC3Denum func,
+ WebKit::WGC3Dint ref,
+ WebKit::WGC3Duint mask) {}
+ virtual void stencilFuncSeparate(WebKit::WGC3Denum face,
+ WebKit::WGC3Denum func,
+ WebKit::WGC3Dint ref,
+ WebKit::WGC3Duint mask) {}
+ virtual void stencilMask(WebKit::WGC3Duint mask) {}
+ virtual void stencilMaskSeparate(WebKit::WGC3Denum face,
+ WebKit::WGC3Duint mask) {}
+ virtual void stencilOp(WebKit::WGC3Denum fail,
+ WebKit::WGC3Denum zfail,
+ WebKit::WGC3Denum zpass) {}
+ virtual void stencilOpSeparate(WebKit::WGC3Denum face,
+ WebKit::WGC3Denum fail,
+ WebKit::WGC3Denum zfail,
+ WebKit::WGC3Denum zpass) {}
+ virtual void texImage2D(WebKit::WGC3Denum target,
+ WebKit::WGC3Dint level,
+ WebKit::WGC3Denum internal_format,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height,
+ WebKit::WGC3Dint border,
+ WebKit::WGC3Denum format,
+ WebKit::WGC3Denum type,
+ const void* pixels) {}
+ virtual void texParameterf(WebKit::WGC3Denum target,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dfloat param) {}
+ virtual void texParameteri(WebKit::WGC3Denum target,
+ WebKit::WGC3Denum pname,
+ WebKit::WGC3Dint param) {}
+ virtual void texSubImage2D(WebKit::WGC3Denum target,
+ WebKit::WGC3Dint level,
+ WebKit::WGC3Dint xoffset,
+ WebKit::WGC3Dint yoffset,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height,
+ WebKit::WGC3Denum format,
+ WebKit::WGC3Denum type,
+ const void* pixels) {}
+ virtual void uniform1f(WebKit::WGC3Dint location, WebKit::WGC3Dfloat x) {}
+ virtual void uniform1fv(WebKit::WGC3Dint location,
+ WebKit::WGC3Dsizei count,
+ const WebKit::WGC3Dfloat* v) {}
+ virtual void uniform1i(WebKit::WGC3Dint location, WebKit::WGC3Dint x) {}
+ virtual void uniform1iv(WebKit::WGC3Dint location,
+ WebKit::WGC3Dsizei count,
+ const WebKit::WGC3Dint* v) {}
+ virtual void uniform2f(WebKit::WGC3Dint location,
+ WebKit::WGC3Dfloat x,
+ WebKit::WGC3Dfloat y) {}
+ virtual void uniform2fv(WebKit::WGC3Dint location,
+ WebKit::WGC3Dsizei count,
+ const WebKit::WGC3Dfloat* v) {}
+ virtual void uniform2i(WebKit::WGC3Dint location,
+ WebKit::WGC3Dint x,
+ WebKit::WGC3Dint y) {}
+ virtual void uniform2iv(WebKit::WGC3Dint location,
+ WebKit::WGC3Dsizei count,
+ const WebKit::WGC3Dint* v) {}
+ virtual void uniform3f(WebKit::WGC3Dint location,
+ WebKit::WGC3Dfloat x,
+ WebKit::WGC3Dfloat y,
+ WebKit::WGC3Dfloat z) {}
+ virtual void uniform3fv(WebKit::WGC3Dint location,
+ WebKit::WGC3Dsizei count,
+ const WebKit::WGC3Dfloat* v) {}
+ virtual void uniform3i(WebKit::WGC3Dint location,
+ WebKit::WGC3Dint x,
+ WebKit::WGC3Dint y,
+ WebKit::WGC3Dint z) {}
+ virtual void uniform3iv(WebKit::WGC3Dint location,
+ WebKit::WGC3Dsizei count,
+ const WebKit::WGC3Dint* v) {}
+ virtual void uniform4f(WebKit::WGC3Dint location,
+ WebKit::WGC3Dfloat x,
+ WebKit::WGC3Dfloat y,
+ WebKit::WGC3Dfloat z,
+ WebKit::WGC3Dfloat w) {}
+ virtual void uniform4fv(WebKit::WGC3Dint location,
+ WebKit::WGC3Dsizei count,
+ const WebKit::WGC3Dfloat* v) {}
+ virtual void uniform4i(WebKit::WGC3Dint location,
+ WebKit::WGC3Dint x,
+ WebKit::WGC3Dint y,
+ WebKit::WGC3Dint z,
+ WebKit::WGC3Dint w) {}
+ virtual void uniform4iv(WebKit::WGC3Dint location,
+ WebKit::WGC3Dsizei count,
+ const WebKit::WGC3Dint* v) {}
+ virtual void uniformMatrix2fv(WebKit::WGC3Dint location,
+ WebKit::WGC3Dsizei count,
+ WebKit::WGC3Dboolean transpose,
+ const WebKit::WGC3Dfloat* value) {}
+ virtual void uniformMatrix3fv(WebKit::WGC3Dint location,
+ WebKit::WGC3Dsizei count,
+ WebKit::WGC3Dboolean transpose,
+ const WebKit::WGC3Dfloat* value) {}
+ virtual void uniformMatrix4fv(WebKit::WGC3Dint location,
+ WebKit::WGC3Dsizei count,
+ WebKit::WGC3Dboolean transpose,
+ const WebKit::WGC3Dfloat* value) {}
+ virtual void useProgram(WebKit::WebGLId program) {}
+ virtual void validateProgram(WebKit::WebGLId program) {}
+ virtual void vertexAttrib1f(WebKit::WGC3Duint index, WebKit::WGC3Dfloat x) {}
+ virtual void vertexAttrib1fv(WebKit::WGC3Duint index,
+ const WebKit::WGC3Dfloat* values) {}
+ virtual void vertexAttrib2f(WebKit::WGC3Duint index,
+ WebKit::WGC3Dfloat x,
+ WebKit::WGC3Dfloat y) {}
+ virtual void vertexAttrib2fv(WebKit::WGC3Duint index,
+ const WebKit::WGC3Dfloat* values) {}
+ virtual void vertexAttrib3f(WebKit::WGC3Duint index,
+ WebKit::WGC3Dfloat x,
+ WebKit::WGC3Dfloat y,
+ WebKit::WGC3Dfloat z) {}
+ virtual void vertexAttrib3fv(WebKit::WGC3Duint index,
+ const WebKit::WGC3Dfloat* values) {}
+ virtual void vertexAttrib4f(WebKit::WGC3Duint index,
+ WebKit::WGC3Dfloat x,
+ WebKit::WGC3Dfloat y,
+ WebKit::WGC3Dfloat z,
+ WebKit::WGC3Dfloat w) {}
+ virtual void vertexAttrib4fv(WebKit::WGC3Duint index,
+ const WebKit::WGC3Dfloat* values) {}
+ virtual void vertexAttribPointer(WebKit::WGC3Duint index,
+ WebKit::WGC3Dint size,
+ WebKit::WGC3Denum type,
+ WebKit::WGC3Dboolean normalized,
+ WebKit::WGC3Dsizei stride,
+ WebKit::WGC3Dintptr offset) {}
+ virtual void viewport(WebKit::WGC3Dint x,
+ WebKit::WGC3Dint y,
+ WebKit::WGC3Dsizei width,
+ WebKit::WGC3Dsizei height) {}
+ virtual WebKit::WebGLId createBuffer();
+ virtual WebKit::WebGLId createFramebuffer();
+ virtual WebKit::WebGLId createProgram();
+ virtual WebKit::WebGLId createRenderbuffer();
+ virtual WebKit::WebGLId createShader(WebKit::WGC3Denum value);
+ virtual WebKit::WebGLId createTexture();
+ virtual void deleteBuffer(WebKit::WebGLId) {}
+ virtual void deleteFramebuffer(WebKit::WebGLId) {}
+ virtual void deleteProgram(WebKit::WebGLId) {}
+ virtual void deleteRenderbuffer(WebKit::WebGLId) {}
+ virtual void deleteShader(WebKit::WebGLId) {}
+ virtual void deleteTexture(WebKit::WebGLId) {}
+ virtual WebKit::WebGLId createQueryEXT();
+ virtual void deleteQueryEXT(WebKit::WebGLId) {};
+ virtual WebKit::WGC3Dboolean isQueryEXT(WebKit::WebGLId query);
+ virtual void beginQueryEXT(WebKit::WGC3Denum, WebKit::WebGLId) {}
+ virtual void endQueryEXT(WebKit::WGC3Denum) {}
+ virtual void getQueryivEXT(WebKit::WGC3Denum,
+ WebKit::WGC3Denum,
+ WebKit::WGC3Dint*) {}
+ virtual void getQueryObjectuivEXT(WebKit::WebGLId,
+ WebKit::WGC3Denum,
+ WebKit::WGC3Duint*) {}
+
+ private:
+ scoped_refptr<gfx::GLContext> gl_context_;
+ scoped_refptr<gfx::GLSurface> gl_surface_;
+ unsigned next_texture_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestWebGraphicsContext3D);
+};
+
+} // namespace ui
+
+#endif // UI_COMPOSITOR_TEST_WEB_GRAPHICS_CONTEXT_3D_H_
diff --git a/chromium/ui/gfx/transform.cc b/chromium/ui/gfx/transform.cc
index 3e94f44e21c..c7bf91af411 100644
--- a/chromium/ui/gfx/transform.cc
+++ b/chromium/ui/gfx/transform.cc
@@ -9,7 +9,6 @@
#include <cmath>
-#include "base/logging.h"
#include "base/strings/stringprintf.h"
#include "ui/gfx/point.h"
#include "ui/gfx/point3_f.h"
@@ -367,14 +366,6 @@ void Transform::FlattenTo2d() {
matrix_.setDouble(2, 3, 0.0);
}
-Vector2dF Transform::To2dTranslation() const {
- DCHECK(IsIdentityOrTranslation());
- // Ensure that this translation is truly 2d.
- const double translate_z = matrix_.getDouble(2, 3);
- DCHECK_EQ(0.0, translate_z);
- return gfx::Vector2dF(matrix_.getDouble(0, 3), matrix_.getDouble(1, 3));
-}
-
void Transform::TransformPoint(Point& point) const {
TransformPointInternal(matrix_, point);
}
diff --git a/chromium/ui/gfx/transform.h b/chromium/ui/gfx/transform.h
index 7a7543a3a51..66e76ea0514 100644
--- a/chromium/ui/gfx/transform.h
+++ b/chromium/ui/gfx/transform.h
@@ -10,7 +10,6 @@
#include "base/compiler_specific.h"
#include "third_party/skia/include/utils/SkMatrix44.h"
#include "ui/base/ui_export.h"
-#include "ui/gfx/vector2d_f.h"
namespace gfx {
@@ -162,10 +161,6 @@ class UI_EXPORT Transform {
//
void FlattenTo2d();
- // Returns the translation components of the matrix. It is an error to call
- // this function if the transform does not represent only a 2d translation.
- Vector2dF To2dTranslation() const;
-
// Applies the transformation on the point. Returns true if the point is
// transformed successfully.
void TransformPoint(Point3F& point) const;
diff --git a/chromium/ui/gfx/transform_unittest.cc b/chromium/ui/gfx/transform_unittest.cc
index 95ffa1fe3d7..f56ca6dc887 100644
--- a/chromium/ui/gfx/transform_unittest.cc
+++ b/chromium/ui/gfx/transform_unittest.cc
@@ -2494,16 +2494,6 @@ TEST(XFormTest, Preserves2dAxisAlignment) {
EXPECT_TRUE(transform.Preserves2dAxisAlignment());
}
-TEST(XFormTest, To2dTranslation) {
- Vector2dF translation(3.f, 7.f);
- Transform transform;
- transform.Translate(translation.x(), translation.y() + 1);
- EXPECT_NE(translation.ToString(), transform.To2dTranslation().ToString());
- transform.MakeIdentity();
- transform.Translate(translation.x(), translation.y());
- EXPECT_EQ(translation.ToString(), transform.To2dTranslation().ToString());
-}
-
} // namespace
} // namespace gfx
diff --git a/chromium/ui/gl/android/gl_jni_registrar.cc b/chromium/ui/gl/android/gl_jni_registrar.cc
index 997268cc540..cba90cef77d 100644
--- a/chromium/ui/gl/android/gl_jni_registrar.cc
+++ b/chromium/ui/gl/android/gl_jni_registrar.cc
@@ -6,6 +6,7 @@
#include "base/android/jni_android.h"
#include "base/android/jni_registrar.h"
+#include "ui/gl/android/surface_texture_bridge.h"
#include "ui/gl/android/surface_texture_listener.h"
namespace ui {
@@ -13,6 +14,8 @@ namespace gl {
namespace android {
static base::android::RegistrationMethod kGLRegisteredMethods[] = {
+ { "SurfaceTextureBridge",
+ gfx::SurfaceTextureBridge::RegisterSurfaceTextureBridge },
{ "SurfaceTextureListener",
gfx::SurfaceTextureListener::RegisterSurfaceTextureListener },
};
diff --git a/chromium/ui/gl/android/surface_texture_bridge.cc b/chromium/ui/gl/android/surface_texture_bridge.cc
index c4206a983e6..9f2a3372e84 100644
--- a/chromium/ui/gl/android/surface_texture_bridge.cc
+++ b/chromium/ui/gl/android/surface_texture_bridge.cc
@@ -10,26 +10,11 @@
#include "base/android/build_info.h"
#include "base/android/jni_android.h"
#include "base/logging.h"
-#include "jni/SurfaceTexture_jni.h"
+#include "jni/SurfaceTextureBridge_jni.h"
#include "ui/gl/android/scoped_java_surface.h"
#include "ui/gl/android/surface_texture_listener.h"
#include "ui/gl/gl_bindings.h"
-using base::android::AttachCurrentThread;
-using base::android::CheckException;
-using base::android::GetClass;
-using base::android::ScopedJavaLocalRef;
-
-namespace {
-bool g_jni_initialized = false;
-
-void RegisterNativesIfNeeded(JNIEnv* env) {
- if (!g_jni_initialized) {
- JNI_SurfaceTexture::RegisterNativesImpl(env);
- g_jni_initialized = true;
- }
-}
-
// TODO(boliu): Remove this method when when we move off ICS. See
// http://crbug.com/161864.
bool GlContextMethodsAvailable() {
@@ -39,66 +24,38 @@ bool GlContextMethodsAvailable() {
return available;
}
-} // namespace
-
namespace gfx {
SurfaceTextureBridge::SurfaceTextureBridge(int texture_id) {
- JNIEnv* env = AttachCurrentThread();
- CHECK(env);
- RegisterNativesIfNeeded(env);
-
- ScopedJavaLocalRef<jobject> tmp(
- JNI_SurfaceTexture::Java_SurfaceTexture_Constructor(
- env, texture_id));
- DCHECK(!tmp.is_null());
- j_surface_texture_.Reset(tmp);
+ JNIEnv* env = base::android::AttachCurrentThread();
+ j_surface_texture_.Reset(Java_SurfaceTextureBridge_create(env, texture_id));
}
SurfaceTextureBridge::~SurfaceTextureBridge() {
- JNIEnv* env = AttachCurrentThread();
- CHECK(env);
-
- // Release the listener.
- JNI_SurfaceTexture::Java_SurfaceTexture_setOnFrameAvailableListener(
- env, j_surface_texture_.obj(), NULL);
-
- // Release graphics memory.
- JNI_SurfaceTexture::Java_SurfaceTexture_release(
- env, j_surface_texture_.obj());
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_SurfaceTextureBridge_destroy(env, j_surface_texture_.obj());
}
void SurfaceTextureBridge::SetFrameAvailableCallback(
const base::Closure& callback) {
- JNIEnv* env = AttachCurrentThread();
- CHECK(env);
-
- // Since the listener is owned by the Java SurfaceTexture object, setting
- // a new listener here will release an existing one at the same time.
- ScopedJavaLocalRef<jobject> j_listener(
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_SurfaceTextureBridge_setFrameAvailableCallback(
env,
- SurfaceTextureListener::CreateSurfaceTextureListener(env, callback));
- DCHECK(!j_listener.is_null());
-
- // Set it as the onFrameAvailableListener for our SurfaceTexture instance.
- JNI_SurfaceTexture::Java_SurfaceTexture_setOnFrameAvailableListener(
- env, j_surface_texture_.obj(), j_listener.obj());
+ j_surface_texture_.obj(),
+ reinterpret_cast<int>(new SurfaceTextureListener(callback)));
}
void SurfaceTextureBridge::UpdateTexImage() {
- JNIEnv* env = AttachCurrentThread();
- CHECK(env);
-
- JNI_SurfaceTexture::Java_SurfaceTexture_updateTexImage(
- env, j_surface_texture_.obj());
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_SurfaceTextureBridge_updateTexImage(env, j_surface_texture_.obj());
}
void SurfaceTextureBridge::GetTransformMatrix(float mtx[16]) {
- JNIEnv* env = AttachCurrentThread();
- CHECK(env);
+ JNIEnv* env = base::android::AttachCurrentThread();
- ScopedJavaLocalRef<jfloatArray> jmatrix(env, env->NewFloatArray(16));
- JNI_SurfaceTexture::Java_SurfaceTexture_getTransformMatrix(
+ base::android::ScopedJavaLocalRef<jfloatArray> jmatrix(
+ env, env->NewFloatArray(16));
+ Java_SurfaceTextureBridge_getTransformMatrix(
env, j_surface_texture_.obj(), jmatrix.obj());
jboolean is_copy;
@@ -110,11 +67,10 @@ void SurfaceTextureBridge::GetTransformMatrix(float mtx[16]) {
}
void SurfaceTextureBridge::SetDefaultBufferSize(int width, int height) {
- JNIEnv* env = AttachCurrentThread();
- CHECK(env);
+ JNIEnv* env = base::android::AttachCurrentThread();
if (width > 0 && height > 0) {
- JNI_SurfaceTexture::Java_SurfaceTexture_setDefaultBufferSize(
+ Java_SurfaceTextureBridge_setDefaultBufferSize(
env, j_surface_texture_.obj(), static_cast<jint>(width),
static_cast<jint>(height));
} else {
@@ -128,28 +84,31 @@ void SurfaceTextureBridge::AttachToGLContext() {
int texture_id;
glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texture_id);
DCHECK(texture_id);
- JNIEnv* env = AttachCurrentThread();
- // Note: This method is only available on JB and greater.
- JNI_SurfaceTexture::Java_SurfaceTexture_attachToGLContext(
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_SurfaceTextureBridge_attachToGLContext(
env, j_surface_texture_.obj(), texture_id);
}
}
void SurfaceTextureBridge::DetachFromGLContext() {
if (GlContextMethodsAvailable()) {
- JNIEnv* env = AttachCurrentThread();
- // Note: This method is only available on JB and greater.
- JNI_SurfaceTexture::Java_SurfaceTexture_detachFromGLContext(
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_SurfaceTextureBridge_detachFromGLContext(
env, j_surface_texture_.obj());
}
}
ANativeWindow* SurfaceTextureBridge::CreateSurface() {
- JNIEnv* env = AttachCurrentThread();
+ JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaSurface surface(this);
- ANativeWindow* native_window =
- ANativeWindow_fromSurface(env, surface.j_surface().obj());
+ ANativeWindow* native_window = ANativeWindow_fromSurface(
+ env, surface.j_surface().obj());
return native_window;
}
+// static
+bool SurfaceTextureBridge::RegisterSurfaceTextureBridge(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
} // namespace gfx
diff --git a/chromium/ui/gl/android/surface_texture_bridge.h b/chromium/ui/gl/android/surface_texture_bridge.h
index fc7fb5416ac..474f0c22d39 100644
--- a/chromium/ui/gl/android/surface_texture_bridge.h
+++ b/chromium/ui/gl/android/surface_texture_bridge.h
@@ -57,6 +57,8 @@ class GL_EXPORT SurfaceTextureBridge
return j_surface_texture_;
}
+ static bool RegisterSurfaceTextureBridge(JNIEnv* env);
+
private:
friend class base::RefCountedThreadSafe<SurfaceTextureBridge>;
~SurfaceTextureBridge();
diff --git a/chromium/ui/gl/android/surface_texture_listener.cc b/chromium/ui/gl/android/surface_texture_listener.cc
index 0547720202c..39d8468dd4a 100644
--- a/chromium/ui/gl/android/surface_texture_listener.cc
+++ b/chromium/ui/gl/android/surface_texture_listener.cc
@@ -12,19 +12,6 @@
namespace gfx {
-// static
-jobject SurfaceTextureListener::CreateSurfaceTextureListener(
- JNIEnv* env,
- const base::Closure& callback) {
- // The java listener object owns and releases the native instance.
- // This is necessary to avoid races with incoming notifications.
- ScopedJavaLocalRef<jobject> listener(Java_SurfaceTextureListener_create(env,
- reinterpret_cast<int>(new SurfaceTextureListener(callback))));
-
- DCHECK(!listener.is_null());
- return listener.Release();
-}
-
SurfaceTextureListener::SurfaceTextureListener(const base::Closure& callback)
: callback_(callback),
browser_loop_(base::MessageLoopProxy::current()) {
diff --git a/chromium/ui/gl/android/surface_texture_listener.h b/chromium/ui/gl/android/surface_texture_listener.h
index faab6be1eb1..60103aad97d 100644
--- a/chromium/ui/gl/android/surface_texture_listener.h
+++ b/chromium/ui/gl/android/surface_texture_listener.h
@@ -18,7 +18,7 @@ namespace gfx {
// Listener class for all the callbacks from android SurfaceTexture.
class GL_EXPORT SurfaceTextureListener {
-public:
+ public:
// Destroy this listener.
void Destroy(JNIEnv* env, jobject obj);
@@ -27,19 +27,14 @@ public:
static bool RegisterSurfaceTextureListener(JNIEnv* env);
-private:
+ private:
+ // Native code should not hold any reference to this object, and instead pass
+ // it up to Java for being referenced by a SurfaceTexture instance.
SurfaceTextureListener(const base::Closure& callback);
~SurfaceTextureListener();
friend class SurfaceTextureBridge;
- // Static factory method for the creation of a SurfaceTextureListener.
- // The native code should not hold any reference to the returned object,
- // but only use it to pass it up to Java for being referenced by a
- // SurfaceTexture instance.
- static jobject CreateSurfaceTextureListener(JNIEnv* env,
- const base::Closure& callback);
-
base::Closure callback_;
scoped_refptr<base::MessageLoopProxy> browser_loop_;
diff --git a/chromium/ui/gl/gl.gyp b/chromium/ui/gl/gl.gyp
index 940578beeb7..139a88f2626 100644
--- a/chromium/ui/gl/gl.gyp
+++ b/chromium/ui/gl/gl.gyp
@@ -313,15 +313,6 @@
['OS=="android"' , {
'targets': [
{
- 'target_name': 'surface_texture_jni_headers',
- 'type': 'none',
- 'variables': {
- 'jni_gen_package': 'ui/gl',
- 'input_java_class': 'android/graphics/SurfaceTexture.class',
- },
- 'includes': [ '../../build/jar_file_jni_generator.gypi' ],
- },
- {
'target_name': 'surface_jni_headers',
'type': 'none',
'variables': {
@@ -334,10 +325,10 @@
'target_name': 'gl_jni_headers',
'type': 'none',
'dependencies': [
- 'surface_texture_jni_headers',
'surface_jni_headers',
],
'sources': [
+ '../android/java/src/org/chromium/ui/gfx/SurfaceTextureBridge.java',
'../android/java/src/org/chromium/ui/gfx/SurfaceTextureListener.java',
],
'variables': {
diff --git a/chromium/ui/gl/gl_implementation_win.cc b/chromium/ui/gl/gl_implementation_win.cc
index 87328a306f8..c98c3c01314 100644
--- a/chromium/ui/gl/gl_implementation_win.cc
+++ b/chromium/ui/gl/gl_implementation_win.cc
@@ -8,7 +8,6 @@
#include "base/base_paths.h"
#include "base/bind.h"
#include "base/command_line.h"
-#include "base/debug/trace_event.h"
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/native_library.h"
@@ -59,45 +58,6 @@ bool LoadD3DXLibrary(const base::FilePath& module_path,
return true;
}
-const unsigned char* AngleGetTraceCategoryEnabledFlag(const char* name) {
- return TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(name);
-}
-
-void AngleAddTraceEvent(char phase,
- const unsigned char* category_group_enabled,
- const char* name,
- unsigned long long id,
- int num_args,
- const char** arg_names,
- const unsigned char* arg_types,
- const unsigned long long* arg_values,
- unsigned char flags) {
- TRACE_EVENT_API_ADD_TRACE_EVENT(phase,
- category_group_enabled,
- name,
- id,
- num_args,
- arg_names,
- arg_types,
- arg_values,
- NULL,
- flags);
-}
-
-typedef const unsigned char* (*GetCategoryEnabledFlagFunc)(const char* name);
-typedef void (*AddTraceEventFunc)(char phase,
- const unsigned char* categoryGroupEnabled,
- const char* name,
- unsigned long long id,
- int numArgs,
- const char** argNames,
- const unsigned char* argTypes,
- const unsigned long long* argValues,
- unsigned char flags);
-typedef void (__stdcall *SetTraceFunctionPointersFunc)(
- GetCategoryEnabledFlagFunc get_category_enabled_flag,
- AddTraceEventFunc add_trace_event_func);
-
} // namespace
void GetAllowedGLImplementations(std::vector<GLImplementation>* impls) {
@@ -207,17 +167,6 @@ bool InitializeGLBindings(GLImplementation implementation) {
}
#endif
- if (!using_swift_shader) {
- SetTraceFunctionPointersFunc set_trace_function_pointers =
- reinterpret_cast<SetTraceFunctionPointersFunc>(
- base::GetFunctionPointerFromNativeLibrary(
- gles_library, "SetTraceFunctionPointers"));
- if (set_trace_function_pointers) {
- set_trace_function_pointers(&AngleGetTraceCategoryEnabledFlag,
- &AngleAddTraceEvent);
- }
- }
-
GLGetProcAddressProc get_proc_address =
reinterpret_cast<GLGetProcAddressProc>(
base::GetFunctionPointerFromNativeLibrary(
diff --git a/chromium/ui/keyboard/keyboard.gyp b/chromium/ui/keyboard/keyboard.gyp
index 7ec43f36edb..d4d7ea17298 100644
--- a/chromium/ui/keyboard/keyboard.gyp
+++ b/chromium/ui/keyboard/keyboard.gyp
@@ -92,13 +92,14 @@
'keyboard_test_suite.cc',
],
'conditions': [
- ['OS=="linux" and linux_use_tcmalloc==1', {
- 'dependencies': [
- '<(DEPTH)/base/allocator/allocator.gyp:allocator',
+ [ 'os_posix == 1 and OS != "mac" and OS != "android" and OS != "ios"', {
+ 'conditions': [
+ ['linux_use_tcmalloc==1', {
+ 'dependencies': [
+ '../../base/allocator/allocator.gyp:allocator',
+ ],
+ }],
],
- 'link_settings': {
- 'ldflags': ['-rdynamic'],
- },
}],
],
},
diff --git a/chromium/ui/keyboard/keyboard_resources.grd b/chromium/ui/keyboard/keyboard_resources.grd
index b0997923f35..2509d68dc64 100644
--- a/chromium/ui/keyboard/keyboard_resources.grd
+++ b/chromium/ui/keyboard/keyboard_resources.grd
@@ -23,7 +23,6 @@
<include name="IDR_KEYBOARD_ELEMENTS_ALTKEY_SET" file="resources/elements/kb-altkey-set.html" type="BINDATA" />
<include name="IDR_KEYBOARD_ELEMENTS_KEY" file="resources/elements/kb-key.html" type="BINDATA" />
<include name="IDR_KEYBOARD_ELEMENTS_KEY_BASE" file="resources/elements/kb-key-base.html" type="BINDATA" />
- <include name="IDR_KEYBOARD_ELEMENTS_KEY_CODES" file="resources/elements/kb-key-codes.html" type="BINDATA" />
<include name="IDR_KEYBOARD_ELEMENTS_KEY_IMPORT" file="resources/elements/kb-key-import.html" type="BINDATA" />
<include name="IDR_KEYBOARD_ELEMENTS_KEY_SEQUENCE" file="resources/elements/kb-key-sequence.html" type="BINDATA" />
<include name="IDR_KEYBOARD_ELEMENTS_KEYBOARD" file="resources/elements/kb-keyboard.html" type="BINDATA" />
diff --git a/chromium/ui/keyboard/keyboard_ui_controller.cc b/chromium/ui/keyboard/keyboard_ui_controller.cc
index f2824cfb65c..1ee8d40a43b 100644
--- a/chromium/ui/keyboard/keyboard_ui_controller.cc
+++ b/chromium/ui/keyboard/keyboard_ui_controller.cc
@@ -30,8 +30,6 @@ content::WebUIDataSource* CreateKeyboardUIDataSource() {
source->AddResourcePath("elements/kb-key.html", IDR_KEYBOARD_ELEMENTS_KEY);
source->AddResourcePath("elements/kb-key-base.html",
IDR_KEYBOARD_ELEMENTS_KEY_BASE);
- source->AddResourcePath("elements/kb-key-codes.html",
- IDR_KEYBOARD_ELEMENTS_KEY_CODES);
source->AddResourcePath("elements/kb-keyboard.html",
IDR_KEYBOARD_ELEMENTS_KEYBOARD);
source->AddResourcePath("elements/kb-keyset.html",
diff --git a/chromium/ui/keyboard/keyboard_util.cc b/chromium/ui/keyboard/keyboard_util.cc
index 2054e6736ad..1579068f884 100644
--- a/chromium/ui/keyboard/keyboard_util.cc
+++ b/chromium/ui/keyboard/keyboard_util.cc
@@ -118,7 +118,6 @@ const GritResourceMap* GetKeyboardExtensionResources(size_t* size) {
{"keyboard/elements/kb-altkey-set.html", IDR_KEYBOARD_ELEMENTS_ALTKEY_SET},
{"keyboard/elements/kb-key.html", IDR_KEYBOARD_ELEMENTS_KEY},
{"keyboard/elements/kb-key-base.html", IDR_KEYBOARD_ELEMENTS_KEY_BASE},
- {"keyboard/elements/kb-key-codes.html", IDR_KEYBOARD_ELEMENTS_KEY_CODES},
{"keyboard/elements/kb-key-import.html",
IDR_KEYBOARD_ELEMENTS_KEY_IMPORT},
{"keyboard/elements/kb-key-sequence.html",
diff --git a/chromium/ui/keyboard/resources/elements/kb-key-base.html b/chromium/ui/keyboard/resources/elements/kb-key-base.html
index 0b017ff3d45..497da30f6c4 100644
--- a/chromium/ui/keyboard/resources/elements/kb-key-base.html
+++ b/chromium/ui/keyboard/resources/elements/kb-key-base.html
@@ -110,7 +110,7 @@
},
down: function(event) {
var detail = {
- char: this.charValue,
+ char: this.char || this.textContent,
toLayout: this.toLayout,
repeat: this.repeat
};
@@ -121,7 +121,7 @@
this.fire('key-down', detail);
this.longPressTimer = this.asyncMethod(function() {
var detail = {
- char: this.charValue,
+ char: this.char || this.textContent,
superscript: this.superscript
};
if (this.keysetRules && this.keysetRules.long != undefined) {
@@ -137,7 +137,7 @@
up: function(event) {
clearTimeout(this.longPressTimer);
var detail = {
- char: this.charValue,
+ char: this.char || this.textContent,
toLayout: this.toLayout
};
if (this.keysetRules && this.keysetRules.up != undefined) {
@@ -145,17 +145,7 @@
detail.nextKeyset = this.keysetRules.up[NEXT_KEYSET - OFFSET];
}
this.fire('key-up', detail);
- },
-
- /**
- * Character value associated with the key. Typically, the value is a
- * single charcater, but may be multi-character in cases like a ".com"
- * button.
- * @type {string}
- */
- get charValue() {
- return this.char || this.textContent;
- },
+ }
});
</script>
</polymer-element>
diff --git a/chromium/ui/keyboard/resources/elements/kb-key-codes.html b/chromium/ui/keyboard/resources/elements/kb-key-codes.html
deleted file mode 100644
index cf1a7c23fa3..00000000000
--- a/chromium/ui/keyboard/resources/elements/kb-key-codes.html
+++ /dev/null
@@ -1,172 +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.
- -->
-
-<polymer-element name="kb-key-codes">
-<script>
- (function() {
- // Keycodes have been deprecated in the KeyEvent specification, but are
- // nonetheless required to support legacy web content. The Keycodes in the
- // following table are based on subset of US-EN 101-key keyboard. These
- // codes are used in the absence of explicit keycodes for kb-key and
- // kb-keysequence elements. Keyboard layout authors may explicitly set the
- // keyCode attribute for kb-key or kb-keysequence elements to refer to
- // indices in this table in order to emulate a physical keyboard with an
- // alternate layout. Not all keys on a virtual keyboard are required to
- // have keyCodes.
- var keyCodes = {
- '\b': {keyCode: 0x08, shiftModifier: false},
- '\t': {keyCode: 0x09, shiftModifier: false},
- '\n': {keyCode: 0x0D, shiftModifier: false},
- ' ': {keyCode: 0x20, shiftModifier: false},
- '0': {keyCode: 0x30, shiftModifier: false},
- ')': {keyCode: 0x30, shiftModifier: true},
- '1': {keyCode: 0x31, shiftModifier: false},
- '!': {keyCode: 0x31, shiftModifier: true},
- '2': {keyCode: 0x32, shiftModifier: false},
- '@': {keyCode: 0x32, shiftModifier: true},
- '3': {keyCode: 0x33, shiftModifier: false},
- '#': {keyCode: 0x33, shiftModifier: true},
- '4': {keyCode: 0x34, shiftModifier: false},
- '$': {keyCode: 0x34, shiftModifier: true},
- '5': {keyCode: 0x35, shiftModifier: false},
- '%': {keyCode: 0x35, shiftModifier: true},
- '6': {keyCode: 0x36, shiftModifier: false},
- '^': {keyCode: 0x36, shiftModifier: true},
- '7': {keyCode: 0x37, shiftModifier: false},
- '&': {keyCode: 0x37, shiftModifier: true},
- '8': {keyCode: 0x38, shiftModifier: false},
- '*': {keyCode: 0x38, shiftModifier: true},
- '9': {keyCode: 0x39, shiftModifier: false},
- '(': {keyCode: 0x39, shiftModifier: true},
- 'a': {keyCode: 0x41, shiftModifier: false},
- 'A': {keyCode: 0x41, shiftModifier: true},
- 'b': {keyCode: 0x42, shiftModifier: false},
- 'B': {keyCode: 0x42, shiftModifier: true},
- 'c': {keyCode: 0x43, shiftModifier: false},
- 'C': {keyCode: 0x43, shiftModifier: true},
- 'd': {keyCode: 0x44, shiftModifier: false},
- 'D': {keyCode: 0x44, shiftModifier: true},
- 'e': {keyCode: 0x45, shiftModifier: false},
- 'E': {keyCode: 0x45, shiftModifier: true},
- 'f': {keyCode: 0x46, shiftModifier: false},
- 'F': {keyCode: 0x46, shiftModifier: true},
- 'g': {keyCode: 0x47, shiftModifier: false},
- 'G': {keyCode: 0x47, shiftModifier: true},
- 'h': {keyCode: 0x48, shiftModifier: false},
- 'H': {keyCode: 0x48, shiftModifier: true},
- 'i': {keyCode: 0x49, shiftModifier: false},
- 'I': {keyCode: 0x49, shiftModifier: true},
- 'j': {keyCode: 0x4A, shiftModifier: false},
- 'J': {keyCode: 0x4A, shiftModifier: true},
- 'k': {keyCode: 0x4B, shiftModifier: false},
- 'K': {keyCode: 0x4B, shiftModifier: true},
- 'l': {keyCode: 0x4C, shiftModifier: false},
- 'L': {keyCode: 0x4C, shiftModifier: true},
- 'm': {keyCode: 0x4D, shiftModifier: false},
- 'M': {keyCode: 0x4D, shiftModifier: true},
- 'n': {keyCode: 0x4E, shiftModifier: false},
- 'N': {keyCode: 0x4E, shiftModifier: true},
- 'o': {keyCode: 0x4F, shiftModifier: false},
- 'O': {keyCode: 0x4F, shiftModifier: true},
- 'p': {keyCode: 0x50, shiftModifier: false},
- 'P': {keyCode: 0x50, shiftModifier: true},
- 'q': {keyCode: 0x51, shiftModifier: false},
- 'Q': {keyCode: 0x51, shiftModifier: true},
- 'r': {keyCode: 0x52, shiftModifier: false},
- 'R': {keyCode: 0x52, shiftModifier: true},
- 's': {keyCode: 0x53, shiftModifier: false},
- 'S': {keyCode: 0x53, shiftModifier: true},
- 't': {keyCode: 0x54, shiftModifier: false},
- 'T': {keyCode: 0x54, shiftModifier: true},
- 'u': {keyCode: 0x55, shiftModifier: false},
- 'U': {keyCode: 0x55, shiftModifier: true},
- 'v': {keyCode: 0x56, shiftModifier: false},
- 'V': {keyCode: 0x56, shiftModifier: true},
- 'w': {keyCode: 0x57, shiftModifier: false},
- 'W': {keyCode: 0x57, shiftModifier: true},
- 'x': {keyCode: 0x58, shiftModifier: false},
- 'X': {keyCode: 0x58, shiftModifier: true},
- 'y': {keyCode: 0x59, shiftModifier: false},
- 'Y': {keyCode: 0x59, shiftModifier: true},
- 'z': {keyCode: 0x5A, shiftModifier: false},
- 'Z': {keyCode: 0x5A, shiftModifier: true},
- ';': {keyCode: 0xBA, shiftModifier: false},
- ':': {keyCode: 0xBA, shiftModifier: true},
- '=': {keyCode: 0xBB, shiftModifier: false},
- '+': {keyCode: 0xBB, shiftModifier: true},
- ',': {keyCode: 0xBC, shiftModifier: false},
- '<': {keyCode: 0xBC, shiftModifier: true},
- '-': {keyCode: 0xBD, shiftModifier: false},
- '_': {keyCode: 0xBD, shiftModifier: true},
- '.': {keyCode: 0xBE, shiftModifier: false},
- '>': {keyCode: 0xBE, shiftModifier: true},
- '/': {keyCode: 0xBF, shiftModifier: false},
- '?': {keyCode: 0xBF, shiftModifier: true},
- '`': {keyCode: 0xC0, shiftModifier: false},
- '~': {keyCode: 0xC0, shiftModifier: true},
- '[': {keyCode: 0xDB, shiftModifier: false},
- '{': {keyCode: 0xDB, shiftModifier: true},
- '\\': {keyCode: 0xDC, shiftModifier: false},
- '|': {keyCode: 0xDC, shiftModifier: true},
- ']': {keyCode: 0xDD, shiftModifier: false},
- '}': {keyCode: 0xDD, shiftModifier: true},
- '\'': {keyCode: 0xDE, shiftModifier: false},
- '"': {keyCode: 0xDE, shiftModifier: true},
- };
-
- Polymer('kb-key-codes', {
- /**
- * Retrieves the keyCode and status of the shift modifier.
- * @param {string} id ID of an entry in the code table.
- * @return {keyCode: numeric, shiftModifier: boolean}
- */
- GetKeyCodeAndModifiers: function(id) {
- var entry = keyCodes[id];
- if (entry) {
- return {
- keyCode: entry.keyCode,
- shiftModifier: entry.shiftModifier
- };
- }
- return {
- keyCode: 0,
- shiftModifier: false
- };
- },
-
- /**
- * Creates a virtual key event for use with the keyboard extension API.
- * @param {kb-key} key Instance of the kb-key element being pressed or
- * released.
- * @param {string} type The type of key event, which may be keydown
- * or keyreleased.
- * @return {keyCode: numeric,
- * modifiers: Array.<string>,
- * type: string,
- * value: string}
- */
- CreateVirtualKeyEvent: function(key, type) {
- var keyCode = key.keyCode;
- var shiftModifier = key.shiftModifier;
- if (keyCode == undefined) {
- var state = this.GetKeyCodeAndModifiers(key.charValue);
- keyCode = state.keyCode;
- shiftModifier = state.shiftModifier;
- }
- var modifiers = [];
- if (shiftModifier)
- modifiers.push('shiftKey');
- return {
- keyCode: keyCode,
- modifiers: modifiers,
- type: type,
- value: key.charValue,
- };
- },
- });
- })();
-</script>
-</polymer-element>
diff --git a/chromium/ui/keyboard/resources/elements/kb-key-sequence.html b/chromium/ui/keyboard/resources/elements/kb-key-sequence.html
index e57521280e9..dee295bec3b 100644
--- a/chromium/ui/keyboard/resources/elements/kb-key-sequence.html
+++ b/chromium/ui/keyboard/resources/elements/kb-key-sequence.html
@@ -4,7 +4,7 @@
-- found in the LICENSE file.
-->
-<polymer-element name="kb-key-sequence" attributes="keys superscripts keyCodes">
+<polymer-element name="kb-key-sequence" attributes="keys superscripts">
<template>
<style>
@host {
@@ -13,7 +13,6 @@
}
}
</style>
- <kb-key-codes id="keyCodeMetadata"></kb-key-codes>
</template>
<script>
Polymer('kb-key-sequence', {
@@ -29,11 +28,6 @@
console.error('keys and superscripts do not match');
return;
}
- var keyCodes = this.keyCodes || newKeys;
- if (keyCodes && newKeys.length != keyCodes.length) {
- console.error('keys and keyCodes do not match');
- return;
- }
var replacement = document.createDocumentFragment();
for (var i = 0; i < newKeys.length; i++) {
var key = document.createElement('kb-key');
@@ -41,12 +35,6 @@
key.accents = newKeys[i];
if (newSuperScripts)
key.superscript = newSuperScripts[i];
- var state = this.$.keyCodeMetadata.GetKeyCodeAndModifiers(
- keyCodes[i]);
- if (state) {
- key.keyCode = state.keyCode;
- key.shiftModifier = state.shiftModifier;
- }
replacement.appendChild(key);
}
result = replacement;
diff --git a/chromium/ui/keyboard/resources/elements/kb-key.html b/chromium/ui/keyboard/resources/elements/kb-key.html
index c37d7071666..fc366bbee92 100644
--- a/chromium/ui/keyboard/resources/elements/kb-key.html
+++ b/chromium/ui/keyboard/resources/elements/kb-key.html
@@ -4,8 +4,7 @@
-- found in the LICENSE file.
-->
-<polymer-element name="kb-key" extends="kb-key-base"
- attributes="keyCode shiftModifier weight">
+<polymer-element name="kb-key" extends="kb-key-base" attributes="weight">
<template>
<style>
@host {
@@ -21,24 +20,6 @@
</template>
<script>
Polymer('kb-key', {
- /**
- * Key codes have been deprecated in DOM3 key events, but are required
- * for legacy web content. The key codes depend on the position of the
- * key on the keyboard and is independent of which modifier keys (shift,
- * alt, ...) are active.
- * @type {number|undefined}
- */
- keyCode: undefined,
- /**
- * Whether the shift key is pressed when producing the key value.
- * @type {boolean}
- */
- shiftModifier: false,
- /**
- * Weighting to use for layout in order to properly size the key.
- * Keys with a high weighting are wider than normal keys.
- * @type {number}
- */
weight: 1
});
</script>
diff --git a/chromium/ui/keyboard/resources/index.html b/chromium/ui/keyboard/resources/index.html
index 3812f9f72f2..ac2982b4bc0 100644
--- a/chromium/ui/keyboard/resources/index.html
+++ b/chromium/ui/keyboard/resources/index.html
@@ -23,7 +23,7 @@
<link rel="import" href="elements/kb-altkey.html">
<link rel="import" href="elements/kb-altkey-data.html">
<link rel="import" href="elements/kb-altkey-set.html">
- <link rel="import" href="elements/kb-key-codes.html">
+
<link rel="import" href="elements/kb-key-base.html">
<link rel="import" href="elements/kb-key.html">
<link rel="import" href="elements/kb-keyboard.html">
diff --git a/chromium/ui/keyboard/resources/webui_index.html b/chromium/ui/keyboard/resources/webui_index.html
index ed6329c3dcf..48b1637571f 100644
--- a/chromium/ui/keyboard/resources/webui_index.html
+++ b/chromium/ui/keyboard/resources/webui_index.html
@@ -25,7 +25,6 @@
<link rel="import" href="elements/kb-altkey-container.html">
<link rel="import" href="elements/kb-altkey-data.html">
<link rel="import" href="elements/kb-altkey-set.html">
- <link rel="import" href="elements/kb-key-codes.html">
<link rel="import" href="elements/kb-key-base.html">
<link rel="import" href="elements/kb-key.html">
<link rel="import" href="elements/kb-keyboard.html">
diff --git a/chromium/ui/message_center/views/message_center_button_bar.cc b/chromium/ui/message_center/views/message_center_button_bar.cc
index b6ebd812cd2..149c3ed5555 100644
--- a/chromium/ui/message_center/views/message_center_button_bar.cc
+++ b/chromium/ui/message_center/views/message_center_button_bar.cc
@@ -158,7 +158,11 @@ MessageCenterButtonBar::MessageCenterButtonBar(
IDR_NOTIFICATION_CLEAR_ALL_HOVER,
IDR_NOTIFICATION_CLEAR_ALL_PRESSED,
IDS_MESSAGE_CENTER_CLEAR_ALL);
+ close_all_button_->SetImage(
+ views::Button::STATE_DISABLED,
+ resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_CLEAR_ALL_DISABLED));
button_container_->AddChildView(close_all_button_);
+
settings_button_ =
new NotificationCenterButton(this,
IDR_NOTIFICATION_SETTINGS,
diff --git a/chromium/ui/message_center/views/message_center_button_bar.h b/chromium/ui/message_center/views/message_center_button_bar.h
index 950e25e6c0b..8190e3e2cc2 100644
--- a/chromium/ui/message_center/views/message_center_button_bar.h
+++ b/chromium/ui/message_center/views/message_center_button_bar.h
@@ -67,7 +67,7 @@ class MessageCenterButtonBar : public views::View,
NotificationCenterButton* title_arrow_;
views::Label* notification_label_;
views::View* button_container_;
- views::Button* close_all_button_;
+ NotificationCenterButton* close_all_button_;
NotificationCenterButton* settings_button_;
NotificationCenterButton* quiet_mode_button_;
diff --git a/chromium/ui/message_center/views/message_popup_collection.cc b/chromium/ui/message_center/views/message_popup_collection.cc
index f08c986894b..130a8650f6a 100644
--- a/chromium/ui/message_center/views/message_popup_collection.cc
+++ b/chromium/ui/message_center/views/message_popup_collection.cc
@@ -100,6 +100,8 @@ MessagePopupCollection::~MessagePopupCollection() {
}
void MessagePopupCollection::RemoveToast(ToastContentsView* toast) {
+ OnMouseExited(toast);
+
for (Toasts::iterator iter = toasts_.begin(); iter != toasts_.end(); ++iter) {
if ((*iter) == toast) {
toasts_.erase(iter);
diff --git a/chromium/ui/message_center/views/message_popup_collection.h b/chromium/ui/message_center/views/message_popup_collection.h
index 8fa06f88c36..f747fa188d4 100644
--- a/chromium/ui/message_center/views/message_popup_collection.h
+++ b/chromium/ui/message_center/views/message_popup_collection.h
@@ -36,7 +36,6 @@ FORWARD_DECLARE_TEST(WebNotificationTrayTest, ManyPopupNotifications);
namespace message_center {
namespace test {
class MessagePopupCollectionTest;
-class MessagePopupCollectionWidgetsTest;
}
class MessageCenter;
@@ -109,7 +108,6 @@ class MESSAGE_CENTER_EXPORT MessagePopupCollection
FRIEND_TEST_ALL_PREFIXES(ash::WebNotificationTrayTest,
ManyPopupNotifications);
friend class test::MessagePopupCollectionTest;
- friend class test::MessagePopupCollectionWidgetsTest;
friend class ash::WebNotificationTrayTest;
typedef std::list<ToastContentsView*> Toasts;
diff --git a/chromium/ui/message_center/views/message_popup_collection_unittest.cc b/chromium/ui/message_center/views/message_popup_collection_unittest.cc
index 942c09daa1f..52299edd6d9 100644
--- a/chromium/ui/message_center/views/message_popup_collection_unittest.cc
+++ b/chromium/ui/message_center/views/message_popup_collection_unittest.cc
@@ -10,12 +10,15 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/events/event.h"
+#include "ui/base/events/event_constants.h"
#include "ui/gfx/display.h"
#include "ui/gfx/rect.h"
#include "ui/message_center/fake_message_center.h"
#include "ui/message_center/views/toast_contents_view.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_delegate.h"
namespace message_center {
namespace test {
@@ -51,6 +54,10 @@ class MessagePopupCollectionTest : public views::ViewsTestBase {
return collection_->toasts_.size();
}
+ bool MouseInCollection() {
+ return collection_->latest_toast_entered_ != NULL;
+ }
+
bool IsToastShown(const std::string& id) {
views::Widget* widget = collection_->GetWidgetForTest(id);
return widget && widget->IsVisible();
@@ -335,6 +342,39 @@ TEST_F(MessagePopupCollectionTest, LeftPositioningWithLeftTaskbar) {
gfx::Rect(0, 0, 600, 400)); // Display-bounds.
}
+TEST_F(MessagePopupCollectionTest, DetectMouseHover) {
+ std::string id0 = AddNotification();
+ std::string id1 = AddNotification();
+ WaitForTransitionsDone();
+
+ views::WidgetDelegateView* toast0 = GetToast(id0);
+ EXPECT_TRUE(toast0 != NULL);
+ views::WidgetDelegateView* toast1 = GetToast(id1);
+ EXPECT_TRUE(toast1 != NULL);
+
+ ui::MouseEvent event(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), 0);
+
+ // Test that mouse detection logic works in presence of out-of-order events.
+ toast0->OnMouseEntered(event);
+ EXPECT_TRUE(MouseInCollection());
+ toast1->OnMouseEntered(event);
+ EXPECT_TRUE(MouseInCollection());
+ toast0->OnMouseExited(event);
+ EXPECT_TRUE(MouseInCollection());
+ toast1->OnMouseExited(event);
+ EXPECT_FALSE(MouseInCollection());
+
+ // Test that mouse detection logic works in presence of WindowClosing events.
+ toast0->OnMouseEntered(event);
+ EXPECT_TRUE(MouseInCollection());
+ toast1->OnMouseEntered(event);
+ EXPECT_TRUE(MouseInCollection());
+ toast0->WindowClosing();
+ EXPECT_TRUE(MouseInCollection());
+ toast1->WindowClosing();
+ EXPECT_FALSE(MouseInCollection());
+}
+
// TODO(dimich): Test repositioning - both normal one and when user is closing
// the toasts.
diff --git a/chromium/ui/resources/default_100_percent/common/drag_tip_copy.png b/chromium/ui/resources/default_100_percent/common/drag_tip_copy.png
deleted file mode 100644
index f642042a887..00000000000
--- a/chromium/ui/resources/default_100_percent/common/drag_tip_copy.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/resources/default_100_percent/common/drag_tip_link.png b/chromium/ui/resources/default_100_percent/common/drag_tip_link.png
deleted file mode 100644
index 8f61a39dd20..00000000000
--- a/chromium/ui/resources/default_100_percent/common/drag_tip_link.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/resources/default_100_percent/common/drag_tip_move.png b/chromium/ui/resources/default_100_percent/common/drag_tip_move.png
deleted file mode 100644
index a897ef4799a..00000000000
--- a/chromium/ui/resources/default_100_percent/common/drag_tip_move.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/resources/default_100_percent/common/drag_tip_nodrop.png b/chromium/ui/resources/default_100_percent/common/drag_tip_nodrop.png
deleted file mode 100644
index 0ee96bf3e46..00000000000
--- a/chromium/ui/resources/default_100_percent/common/drag_tip_nodrop.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/resources/default_100_percent/common/notification_clear_all_disabled.png b/chromium/ui/resources/default_100_percent/common/notification_clear_all_disabled.png
new file mode 100644
index 00000000000..a15a261e027
--- /dev/null
+++ b/chromium/ui/resources/default_100_percent/common/notification_clear_all_disabled.png
Binary files differ
diff --git a/chromium/ui/resources/default_100_percent/mac/notification_tray_attention.png b/chromium/ui/resources/default_100_percent/mac/notification_tray_attention.png
index f6fe8298b61..6e4910943cb 100644
--- a/chromium/ui/resources/default_100_percent/mac/notification_tray_attention.png
+++ b/chromium/ui/resources/default_100_percent/mac/notification_tray_attention.png
Binary files differ
diff --git a/chromium/ui/resources/default_100_percent/mac/notification_tray_attention_pressed.png b/chromium/ui/resources/default_100_percent/mac/notification_tray_attention_pressed.png
index e4f8cdb5dd9..931a4abcaf2 100644
--- a/chromium/ui/resources/default_100_percent/mac/notification_tray_attention_pressed.png
+++ b/chromium/ui/resources/default_100_percent/mac/notification_tray_attention_pressed.png
Binary files differ
diff --git a/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_attention.png b/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_attention.png
index 042673f535c..335a302712c 100644
--- a/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_attention.png
+++ b/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_attention.png
Binary files differ
diff --git a/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_attention_pressed.png b/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_attention_pressed.png
index 324e373cda1..7ab9ee0b751 100644
--- a/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_attention_pressed.png
+++ b/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_attention_pressed.png
Binary files differ
diff --git a/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_empty.png b/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_empty.png
index 57474d5acc9..3c9149e6f12 100644
--- a/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_empty.png
+++ b/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_empty.png
Binary files differ
diff --git a/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_empty_pressed.png b/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_empty_pressed.png
index bd40cfdfa23..87acf99e3d5 100644
--- a/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_empty_pressed.png
+++ b/chromium/ui/resources/default_100_percent/mac/notification_tray_do_not_disturb_empty_pressed.png
Binary files differ
diff --git a/chromium/ui/resources/default_100_percent/mac/notification_tray_empty.png b/chromium/ui/resources/default_100_percent/mac/notification_tray_empty.png
index 7a929986074..db17be92556 100644
--- a/chromium/ui/resources/default_100_percent/mac/notification_tray_empty.png
+++ b/chromium/ui/resources/default_100_percent/mac/notification_tray_empty.png
Binary files differ
diff --git a/chromium/ui/resources/default_100_percent/mac/notification_tray_empty_pressed.png b/chromium/ui/resources/default_100_percent/mac/notification_tray_empty_pressed.png
index 15d30bf68f6..2f3d8fca7c1 100644
--- a/chromium/ui/resources/default_100_percent/mac/notification_tray_empty_pressed.png
+++ b/chromium/ui/resources/default_100_percent/mac/notification_tray_empty_pressed.png
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/common/drag_tip_copy.png b/chromium/ui/resources/default_200_percent/common/drag_tip_copy.png
deleted file mode 100644
index 53dafb5d24d..00000000000
--- a/chromium/ui/resources/default_200_percent/common/drag_tip_copy.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/common/drag_tip_link.png b/chromium/ui/resources/default_200_percent/common/drag_tip_link.png
deleted file mode 100644
index fe0fd25d144..00000000000
--- a/chromium/ui/resources/default_200_percent/common/drag_tip_link.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/common/drag_tip_move.png b/chromium/ui/resources/default_200_percent/common/drag_tip_move.png
deleted file mode 100644
index e2374ece106..00000000000
--- a/chromium/ui/resources/default_200_percent/common/drag_tip_move.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/common/drag_tip_nodrop.png b/chromium/ui/resources/default_200_percent/common/drag_tip_nodrop.png
deleted file mode 100644
index f96948fd39b..00000000000
--- a/chromium/ui/resources/default_200_percent/common/drag_tip_nodrop.png
+++ /dev/null
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/common/notification_clear_all_disabled.png b/chromium/ui/resources/default_200_percent/common/notification_clear_all_disabled.png
new file mode 100644
index 00000000000..30578aaee20
--- /dev/null
+++ b/chromium/ui/resources/default_200_percent/common/notification_clear_all_disabled.png
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/mac/notification_tray_attention.png b/chromium/ui/resources/default_200_percent/mac/notification_tray_attention.png
index c0b374bd17a..6587f34bb8e 100644
--- a/chromium/ui/resources/default_200_percent/mac/notification_tray_attention.png
+++ b/chromium/ui/resources/default_200_percent/mac/notification_tray_attention.png
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/mac/notification_tray_attention_pressed.png b/chromium/ui/resources/default_200_percent/mac/notification_tray_attention_pressed.png
index 43c496ff8cb..7d2521c790b 100644
--- a/chromium/ui/resources/default_200_percent/mac/notification_tray_attention_pressed.png
+++ b/chromium/ui/resources/default_200_percent/mac/notification_tray_attention_pressed.png
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_attention.png b/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_attention.png
index 27dc58ad12c..f0584e43351 100644
--- a/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_attention.png
+++ b/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_attention.png
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_attention_pressed.png b/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_attention_pressed.png
index e8e1e2454e9..8f922347de3 100644
--- a/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_attention_pressed.png
+++ b/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_attention_pressed.png
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_empty.png b/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_empty.png
index b0b799a2773..2370e7acdec 100644
--- a/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_empty.png
+++ b/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_empty.png
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_empty_pressed.png b/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_empty_pressed.png
index 74e09582063..1c6a7af60e7 100644
--- a/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_empty_pressed.png
+++ b/chromium/ui/resources/default_200_percent/mac/notification_tray_do_not_disturb_empty_pressed.png
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/mac/notification_tray_empty.png b/chromium/ui/resources/default_200_percent/mac/notification_tray_empty.png
index 32f817e2087..e3fc1f3bfbe 100644
--- a/chromium/ui/resources/default_200_percent/mac/notification_tray_empty.png
+++ b/chromium/ui/resources/default_200_percent/mac/notification_tray_empty.png
Binary files differ
diff --git a/chromium/ui/resources/default_200_percent/mac/notification_tray_empty_pressed.png b/chromium/ui/resources/default_200_percent/mac/notification_tray_empty_pressed.png
index e44934c02ad..21492e85dcf 100644
--- a/chromium/ui/resources/default_200_percent/mac/notification_tray_empty_pressed.png
+++ b/chromium/ui/resources/default_200_percent/mac/notification_tray_empty_pressed.png
Binary files differ
diff --git a/chromium/ui/resources/resource_check/resource_scale_factors.py b/chromium/ui/resources/resource_check/resource_scale_factors.py
index 9ddc70fda60..f974447ccf2 100644
--- a/chromium/ui/resources/resource_check/resource_scale_factors.py
+++ b/chromium/ui/resources/resource_check/resource_scale_factors.py
@@ -15,10 +15,6 @@ import os
import struct
-class InvalidPNGException(Exception):
- pass
-
-
class ResourceScaleFactors(object):
"""Verifier of image dimensions for Chromium resources.
@@ -48,8 +44,7 @@ class ResourceScaleFactors(object):
def ImageSize(filename):
with open(filename, 'rb', buffering=0) as f:
data = f.read(24)
- if data[:8] != '\x89PNG\r\n\x1A\n' or data[12:16] != 'IHDR':
- raise InvalidPNGException
+ assert data[:8] == '\x89PNG\r\n\x1A\n' and data[12:16] == 'IHDR'
return struct.unpack('>ii', data[16:24])
# Returns a list of valid scaled image sizes. The valid sizes are the
@@ -80,9 +75,6 @@ class ResourceScaleFactors(object):
if relative_path not in files:
files.append(relative_path)
- corrupt_png_error = ('Corrupt PNG in file %s. Note that binaries are not '
- 'correctly uploaded to the code review tool and must be directly '
- 'submitted using the dcommit command.')
for f in files:
base_image = self.input_api.os_path.join(self.paths[0][1], f)
if not os.path.exists(base_image):
@@ -90,12 +82,7 @@ class ResourceScaleFactors(object):
'Base image %s does not exist' % self.input_api.os_path.join(
repository_path, base_image)))
continue
- try:
- base_dimensions = ImageSize(base_image)
- except InvalidPNGException:
- results.append(self.output_api.PresubmitError(corrupt_png_error %
- self.input_api.os_path.join(repository_path, base_image)))
- continue
+ base_dimensions = ImageSize(base_image)
# Find all scaled versions of the base image and verify their sizes.
for i in range(1, len(self.paths)):
image_path = self.input_api.os_path.join(self.paths[i][1], f)
@@ -103,12 +90,7 @@ class ResourceScaleFactors(object):
continue
# Ensure that each image for a particular scale factor is the
# correct scale of the base image.
- try:
- scaled_dimensions = ImageSize(image_path)
- except InvalidPNGException:
- results.append(self.output_api.PresubmitError(corrupt_png_error %
- self.input_api.os_path.join(repository_path, image_path)))
- continue
+ scaled_dimensions = ImageSize(image_path)
for dimension_name, base_size, scaled_size in zip(
('width', 'height'), base_dimensions, scaled_dimensions):
valid_sizes = ValidSizes(base_size, self.paths[i][0])
diff --git a/chromium/ui/resources/ui_resources.grd b/chromium/ui/resources/ui_resources.grd
index 1aeb4d1ed98..067e2eaa925 100644
--- a/chromium/ui/resources/ui_resources.grd
+++ b/chromium/ui/resources/ui_resources.grd
@@ -240,6 +240,7 @@
<structure type="chrome_scaled_image" name="IDR_NOTIFICATION_ARROW_HOVER" file="common/notification_arrow_hover.png"/>
<structure type="chrome_scaled_image" name="IDR_NOTIFICATION_ARROW_PRESSED" file="common/notification_arrow_pressed.png"/>
<structure type="chrome_scaled_image" name="IDR_NOTIFICATION_CLEAR_ALL" file="common/notification_clear_all.png"/>
+ <structure type="chrome_scaled_image" name="IDR_NOTIFICATION_CLEAR_ALL_DISABLED" file="common/notification_clear_all_disabled.png"/>
<structure type="chrome_scaled_image" name="IDR_NOTIFICATION_CLEAR_ALL_HOVER" file="common/notification_clear_all_hover.png"/>
<structure type="chrome_scaled_image" name="IDR_NOTIFICATION_CLEAR_ALL_PRESSED" file="common/notification_clear_all_pressed.png"/>
<if expr="is_win">
diff --git a/chromium/ui/surface/accelerated_surface_win.cc b/chromium/ui/surface/accelerated_surface_win.cc
index 74ebdac6b1f..3b86db01ad4 100644
--- a/chromium/ui/surface/accelerated_surface_win.cc
+++ b/chromium/ui/surface/accelerated_surface_win.cc
@@ -728,7 +728,6 @@ void AcceleratedPresenter::DoPresentAndAcknowledge(
return;
}
-#if !defined(USE_AURA)
// If the window is a different size than the swap chain that is being
// presented then drop the frame.
gfx::Size window_size = GetWindowSize();
@@ -751,7 +750,7 @@ void AcceleratedPresenter::DoPresentAndAcknowledge(
"windowheight", window_size.height());
return;
}
-#endif
+
// Round up size so the swap chain is not continuously resized with the
// surface, which could lead to memory fragmentation.
const int kRound = 64;
diff --git a/chromium/ui/views/accessibility/native_view_accessibility_win.cc b/chromium/ui/views/accessibility/native_view_accessibility_win.cc
index a0367fe1f1e..279c99d3d29 100644
--- a/chromium/ui/views/accessibility/native_view_accessibility_win.cc
+++ b/chromium/ui/views/accessibility/native_view_accessibility_win.cc
@@ -582,8 +582,8 @@ STDMETHODIMP NativeViewAccessibilityWin::get_accState(
return S_OK;
}
-STDMETHODIMP NativeViewAccessibilityWin::get_accValue(
- VARIANT var_id, BSTR* value) {
+STDMETHODIMP NativeViewAccessibilityWin::get_accValue(VARIANT var_id,
+ BSTR* value) {
if (!IsValidId(var_id) || !value)
return E_INVALIDARG;
@@ -607,6 +607,24 @@ STDMETHODIMP NativeViewAccessibilityWin::get_accValue(
return S_OK;
}
+STDMETHODIMP NativeViewAccessibilityWin::put_accValue(VARIANT var_id,
+ BSTR new_value) {
+ if (!IsValidId(var_id) || !new_value)
+ return E_INVALIDARG;
+
+ if (!view_)
+ return E_FAIL;
+
+ // Return an error if the view can't set the value.
+ ui::AccessibleViewState state;
+ view_->GetAccessibleState(&state);
+ if (state.set_value_callback.is_null())
+ return E_FAIL;
+
+ state.set_value_callback.Run(new_value);
+ return S_OK;
+}
+
// IAccessible functions not supported.
STDMETHODIMP NativeViewAccessibilityWin::get_accSelection(VARIANT* selected) {
@@ -644,12 +662,6 @@ STDMETHODIMP NativeViewAccessibilityWin::put_accName(
return E_NOTIMPL;
}
-STDMETHODIMP NativeViewAccessibilityWin::put_accValue(
- VARIANT var_id, BSTR put_val) {
- // Deprecated.
- return E_NOTIMPL;
-}
-
//
// IAccessible2
//
diff --git a/chromium/ui/views/accessibility/native_view_accessibility_win.h b/chromium/ui/views/accessibility/native_view_accessibility_win.h
index aff2a6f6e87..e616551b968 100644
--- a/chromium/ui/views/accessibility/native_view_accessibility_win.h
+++ b/chromium/ui/views/accessibility/native_view_accessibility_win.h
@@ -114,10 +114,11 @@ NativeViewAccessibilityWin
// Retrieves the current state of the specified object.
STDMETHODIMP get_accState(VARIANT var_id, VARIANT* state);
- // Retrieves the current value associated with the specified object.
+ // Retrieve or set the string value associated with the specified object.
+ // Setting the value is not typically used by screen readers, but it's
+ // used frequently by automation software.
STDMETHODIMP get_accValue(VARIANT var_id, BSTR* value);
-
- // Non-supported IAccessible methods.
+ STDMETHODIMP put_accValue(VARIANT var_id, BSTR new_value);
// Selections not applicable to views.
STDMETHODIMP get_accSelection(VARIANT* selected);
@@ -131,7 +132,6 @@ NativeViewAccessibilityWin
// Deprecated functions, not implemented here.
STDMETHODIMP put_accName(VARIANT var_id, BSTR put_name);
- STDMETHODIMP put_accValue(VARIANT var_id, BSTR put_val);
//
// IAccessible2
diff --git a/chromium/ui/views/accessibility/native_view_accessibility_win_unittest.cc b/chromium/ui/views/accessibility/native_view_accessibility_win_unittest.cc
new file mode 100644
index 00000000000..7dcbac22145
--- /dev/null
+++ b/chromium/ui/views/accessibility/native_view_accessibility_win_unittest.cc
@@ -0,0 +1,65 @@
+// 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 <oleacc.h>
+
+#include "base/win/scoped_bstr.h"
+#include "base/win/scoped_comptr.h"
+#include "base/win/scoped_variant.h"
+#include "ui/views/controls/textfield/textfield.h"
+#include "ui/views/test/views_test_base.h"
+
+namespace views {
+namespace test {
+
+typedef ViewsTestBase NativeViewAcccessibilityWinTest;
+
+TEST_F(NativeViewAcccessibilityWinTest, TextfieldAccessibility) {
+ Widget widget;
+ Widget::InitParams init_params =
+ CreateParams(Widget::InitParams::TYPE_POPUP);
+ init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+ widget.Init(init_params);
+
+ View* content = new View;
+ widget.SetContentsView(content);
+
+ Textfield* textfield = new Textfield;
+ textfield->SetAccessibleName(L"Name");
+ textfield->SetText(L"Value");
+ content->AddChildView(textfield);
+
+ base::win::ScopedComPtr<IAccessible> content_accessible(
+ content->GetNativeViewAccessible());
+ LONG child_count = 0;
+ ASSERT_EQ(S_OK, content_accessible->get_accChildCount(&child_count));
+ ASSERT_EQ(1L, child_count);
+
+ base::win::ScopedComPtr<IDispatch> textfield_dispatch;
+ base::win::ScopedComPtr<IAccessible> textfield_accessible;
+ base::win::ScopedVariant child_index(1);
+ ASSERT_EQ(S_OK, content_accessible->get_accChild(
+ child_index, textfield_dispatch.Receive()));
+ ASSERT_EQ(S_OK, textfield_dispatch.QueryInterface(
+ textfield_accessible.Receive()));
+
+ base::win::ScopedBstr name;
+ base::win::ScopedVariant childid_self(CHILDID_SELF);
+ ASSERT_EQ(S_OK, textfield_accessible->get_accName(
+ childid_self, name.Receive()));
+ ASSERT_STREQ(L"Name", name);
+
+ base::win::ScopedBstr value;
+ ASSERT_EQ(S_OK, textfield_accessible->get_accValue(
+ childid_self, value.Receive()));
+ ASSERT_STREQ(L"Value", value);
+
+ base::win::ScopedBstr new_value(L"New value");
+ ASSERT_EQ(S_OK, textfield_accessible->put_accValue(childid_self, new_value));
+
+ ASSERT_STREQ(L"New value", textfield->text().c_str());
+}
+
+} // namespace test
+} // namespace views
diff --git a/chromium/ui/views/controls/button/blue_button.cc b/chromium/ui/views/controls/button/blue_button.cc
index 516363018f4..a17441e1cbe 100644
--- a/chromium/ui/views/controls/button/blue_button.cc
+++ b/chromium/ui/views/controls/button/blue_button.cc
@@ -78,4 +78,9 @@ const char* BlueButton::GetClassName() const {
return BlueButton::kViewClassName;
}
+// TODO(msw): Re-enable animations for blue buttons. See crbug.com/239121.
+const ui::Animation* BlueButton::GetThemeAnimation() const {
+ return NULL;
+}
+
} // namespace views
diff --git a/chromium/ui/views/controls/button/blue_button.h b/chromium/ui/views/controls/button/blue_button.h
index c939e00cd31..0415bf429c7 100644
--- a/chromium/ui/views/controls/button/blue_button.h
+++ b/chromium/ui/views/controls/button/blue_button.h
@@ -6,6 +6,7 @@
#define UI_VIEWS_CONTROLS_BUTTON_BLUE_BUTTON_H_
#include "base/compiler_specific.h"
+#include "base/strings/string16.h"
#include "ui/views/controls/button/label_button.h"
namespace views {
@@ -21,6 +22,7 @@ class VIEWS_EXPORT BlueButton : public LabelButton {
private:
// Overridden from LabelButton:
virtual const char* GetClassName() const OVERRIDE;
+ virtual const ui::Animation* GetThemeAnimation() const OVERRIDE;
DISALLOW_COPY_AND_ASSIGN(BlueButton);
};
diff --git a/chromium/ui/views/controls/button/label_button.cc b/chromium/ui/views/controls/button/label_button.cc
index 7abdc3b3ae8..9fab63b0086 100644
--- a/chromium/ui/views/controls/button/label_button.cc
+++ b/chromium/ui/views/controls/button/label_button.cc
@@ -128,7 +128,7 @@ void LabelButton::SetIsDefault(bool is_default) {
// STYLE_BUTTON uses bold text to indicate default buttons.
if (style_ == STYLE_BUTTON) {
int style = label_->font().GetStyle();
- style = is_default ? style | gfx::Font::BOLD : style & ~gfx::Font::BOLD;
+ style = is_default ? style | gfx::Font::BOLD : style & !gfx::Font::BOLD;
label_->SetFont(label_->font().DeriveFont(0, style));
}
}
diff --git a/chromium/ui/views/controls/button/label_button_border.cc b/chromium/ui/views/controls/button/label_button_border.cc
index 34ea502ebe9..efb80df3a1b 100644
--- a/chromium/ui/views/controls/button/label_button_border.cc
+++ b/chromium/ui/views/controls/button/label_button_border.cc
@@ -6,13 +6,10 @@
#include "base/logging.h"
#include "grit/ui_resources.h"
-#include "third_party/skia/include/core/SkPaint.h"
-#include "third_party/skia/include/effects/SkLerpXfermode.h"
#include "ui/base/animation/animation.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/rect.h"
-#include "ui/gfx/skia_util.h"
#include "ui/gfx/sys_color_change_listener.h"
#include "ui/native_theme/native_theme.h"
#include "ui/views/controls/button/label_button.h"
@@ -122,22 +119,17 @@ void LabelButtonBorder::Paint(const View& view, gfx::Canvas* canvas) {
ui::NativeTheme::State state = native_theme_delegate->GetThemeState(&extra);
if (animation && animation->is_animating()) {
- // Linearly interpolate background and foreground painters during animation.
- const SkRect sk_rect = gfx::RectToSkRect(rect);
- canvas->sk_canvas()->saveLayer(&sk_rect, NULL);
+ // Composite the background and foreground painters during state animations.
+ int alpha = animation->CurrentValueBetween(0, 0xff);
state = native_theme_delegate->GetBackgroundThemeState(&extra);
+ canvas->SaveLayerAlpha(static_cast<uint8>(0xff - alpha));
PaintHelper(this, canvas, theme, part, state, rect, extra);
+ canvas->Restore();
- SkPaint paint;
- skia::RefPtr<SkXfermode> sk_lerp_xfer =
- skia::AdoptRef(SkLerpXfermode::Create(animation->GetCurrentValue()));
- paint.setXfermode(sk_lerp_xfer.get());
- canvas->sk_canvas()->saveLayer(&sk_rect, &paint);
state = native_theme_delegate->GetForegroundThemeState(&extra);
+ canvas->SaveLayerAlpha(static_cast<uint8>(alpha));
PaintHelper(this, canvas, theme, part, state, rect, extra);
- canvas->sk_canvas()->restore();
-
- canvas->sk_canvas()->restore();
+ canvas->Restore();
} else {
PaintHelper(this, canvas, theme, part, state, rect, extra);
}
diff --git a/chromium/ui/views/controls/combobox/combobox.cc b/chromium/ui/views/controls/combobox/combobox.cc
index 4c107886234..34f48484755 100644
--- a/chromium/ui/views/controls/combobox/combobox.cc
+++ b/chromium/ui/views/controls/combobox/combobox.cc
@@ -14,6 +14,7 @@
#include "ui/views/controls/combobox/combobox_listener.h"
#include "ui/views/controls/native/native_view_host.h"
#include "ui/views/controls/prefix_selector.h"
+#include "ui/views/ime/input_method.h"
#include "ui/views/widget/widget.h"
namespace views {
@@ -140,6 +141,7 @@ bool Combobox::OnKeyReleased(const ui::KeyEvent& e) {
}
void Combobox::OnFocus() {
+ GetInputMethod()->OnFocus();
// Forward the focus to the wrapper.
if (native_wrapper_) {
native_wrapper_->SetFocus();
@@ -151,6 +153,7 @@ void Combobox::OnFocus() {
}
void Combobox::OnBlur() {
+ GetInputMethod()->OnBlur();
if (selector_)
selector_->OnViewBlur();
if (native_wrapper_)
diff --git a/chromium/ui/views/controls/textfield/native_textfield_views.cc b/chromium/ui/views/controls/textfield/native_textfield_views.cc
index bf514d6f48d..822bbdf5fb0 100644
--- a/chromium/ui/views/controls/textfield/native_textfield_views.cc
+++ b/chromium/ui/views/controls/textfield/native_textfield_views.cc
@@ -84,6 +84,7 @@ NativeTextfieldViews::NativeTextfieldViews(Textfield* parent)
GetRenderText()->SetFontList(textfield_->font_list());
UpdateColorsFromTheme(GetNativeTheme());
set_context_menu_controller(this);
+ parent->set_context_menu_controller(this);
set_drag_controller(this);
}
diff --git a/chromium/ui/views/controls/textfield/native_textfield_views_unittest.cc b/chromium/ui/views/controls/textfield/native_textfield_views_unittest.cc
index a54144d8922..c2e32c998a4 100644
--- a/chromium/ui/views/controls/textfield/native_textfield_views_unittest.cc
+++ b/chromium/ui/views/controls/textfield/native_textfield_views_unittest.cc
@@ -179,7 +179,6 @@ class NativeTextfieldViewsTest : public ViewsTestBase,
textfield_view_ = static_cast<NativeTextfieldViews*>(
textfield_->GetNativeWrapperForTesting());
- DCHECK(textfield_view_);
textfield_view_->SetBoundsRect(params.bounds);
textfield_->set_id(1);
@@ -189,6 +188,7 @@ class NativeTextfieldViewsTest : public ViewsTestBase,
textfield->set_id(i + 1);
}
+ DCHECK(textfield_view_);
model_ = textfield_view_->model_.get();
model_->ClearEditHistory();
@@ -784,6 +784,7 @@ TEST_F(NativeTextfieldViewsTest, FocusTraversalTest) {
TEST_F(NativeTextfieldViewsTest, ContextMenuDisplayTest) {
InitTextfield(Textfield::STYLE_DEFAULT);
+ EXPECT_TRUE(textfield_->context_menu_controller());
textfield_->SetText(ASCIIToUTF16("hello world"));
EXPECT_TRUE(GetContextMenuModel());
VerifyTextfieldContextMenuContents(false, GetContextMenuModel());
diff --git a/chromium/ui/views/controls/textfield/textfield.cc b/chromium/ui/views/controls/textfield/textfield.cc
index 4787e4e4af6..b76c20c8ac8 100644
--- a/chromium/ui/views/controls/textfield/textfield.cc
+++ b/chromium/ui/views/controls/textfield/textfield.cc
@@ -89,7 +89,8 @@ Textfield::Textfield()
vertical_margins_were_set_(false),
vertical_alignment_(gfx::ALIGN_VCENTER),
placeholder_text_color_(kDefaultPlaceholderTextColor),
- text_input_type_(ui::TEXT_INPUT_TYPE_TEXT) {
+ text_input_type_(ui::TEXT_INPUT_TYPE_TEXT),
+ weak_ptr_factory_(this) {
set_focusable(true);
if (ViewsDelegate::views_delegate) {
@@ -114,7 +115,8 @@ Textfield::Textfield(StyleFlags style)
vertical_margins_were_set_(false),
vertical_alignment_(gfx::ALIGN_VCENTER),
placeholder_text_color_(kDefaultPlaceholderTextColor),
- text_input_type_(ui::TEXT_INPUT_TYPE_TEXT) {
+ text_input_type_(ui::TEXT_INPUT_TYPE_TEXT),
+ weak_ptr_factory_(this) {
set_focusable(true);
if (IsObscured())
SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD);
@@ -506,6 +508,12 @@ void Textfield::GetAccessibleState(ui::AccessibleViewState* state) {
const ui::Range range = native_wrapper_->GetSelectedRange();
state->selection_start = range.start();
state->selection_end = range.end();
+
+ if (!read_only()) {
+ state->set_value_callback =
+ base::Bind(&Textfield::AccessibilitySetValue,
+ weak_ptr_factory_.GetWeakPtr());
+ }
}
ui::TextInputClient* Textfield::GetTextInputClient() {
@@ -547,6 +555,9 @@ const char* Textfield::GetClassName() const {
return kViewClassName;
}
+////////////////////////////////////////////////////////////////////////////////
+// Textfield, private:
+
gfx::Insets Textfield::GetTextInsets() const {
gfx::Insets insets = GetInsets();
if (draw_border_ && native_wrapper_)
@@ -554,6 +565,13 @@ gfx::Insets Textfield::GetTextInsets() const {
return insets;
}
+void Textfield::AccessibilitySetValue(const string16& new_value) {
+ if (!read_only()) {
+ SetText(new_value);
+ ClearSelection();
+ }
+}
+
////////////////////////////////////////////////////////////////////////////////
// NativeTextfieldWrapper, public:
diff --git a/chromium/ui/views/controls/textfield/textfield.h b/chromium/ui/views/controls/textfield/textfield.h
index 2004a0a8b71..71b663bd2e5 100644
--- a/chromium/ui/views/controls/textfield/textfield.h
+++ b/chromium/ui/views/controls/textfield/textfield.h
@@ -9,6 +9,7 @@
#include "base/basictypes.h"
#include "base/compiler_specific.h"
+#include "base/memory/weak_ptr.h"
#include "base/strings/string16.h"
#include "base/time/time.h"
#include "build/build_config.h"
@@ -288,6 +289,11 @@ class VIEWS_EXPORT Textfield : public View {
// Returns the insets to the rectangle where text is actually painted.
gfx::Insets GetTextInsets() const;
+ // Handles a request to change the value of this text field from software
+ // using an accessibility API (typically automation software, screen readers
+ // don't normally use this). Sets the value and clears the selection.
+ void AccessibilitySetValue(const string16& new_value);
+
// This is the current listener for events from this Textfield.
TextfieldController* controller_;
@@ -347,6 +353,9 @@ class VIEWS_EXPORT Textfield : public View {
// The duration to reveal the last typed char for obscured textfields.
base::TimeDelta obscured_reveal_duration_;
+ // Used to bind callback functions to this object.
+ base::WeakPtrFactory<Textfield> weak_ptr_factory_;
+
DISALLOW_COPY_AND_ASSIGN(Textfield);
};
diff --git a/chromium/ui/views/controls/tree/tree_view.cc b/chromium/ui/views/controls/tree/tree_view.cc
index 1d550a2ff75..0157902fad4 100644
--- a/chromium/ui/views/controls/tree/tree_view.cc
+++ b/chromium/ui/views/controls/tree/tree_view.cc
@@ -598,6 +598,7 @@ void TreeView::OnPaint(gfx::Canvas* canvas) {
}
void TreeView::OnFocus() {
+ GetInputMethod()->OnFocus();
View::OnFocus();
SchedulePaintForNode(selected_node_);
@@ -607,6 +608,7 @@ void TreeView::OnFocus() {
}
void TreeView::OnBlur() {
+ GetInputMethod()->OnBlur();
SchedulePaintForNode(selected_node_);
if (selector_)
selector_->OnViewBlur();
diff --git a/chromium/ui/views/views.gyp b/chromium/ui/views/views.gyp
index ff3ab0aaa61..de8cdef4e19 100644
--- a/chromium/ui/views/views.gyp
+++ b/chromium/ui/views/views.gyp
@@ -684,6 +684,7 @@
'..',
],
'sources': [
+ 'accessibility/native_view_accessibility_win_unittest.cc',
'accessible_pane_view_unittest.cc',
'animation/bounds_animator_unittest.cc',
'bubble/bubble_border_unittest.cc',
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc b/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc
index 6b0de6a4628..159ffc1080e 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc
@@ -506,6 +506,14 @@ void DesktopRootWindowHostWin::MoveCursorTo(const gfx::Point& location) {
void DesktopRootWindowHostWin::SetFocusWhenShown(bool focus_when_shown) {
}
+bool DesktopRootWindowHostWin::CopyAreaToSkCanvas(
+ const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) {
+ NOTIMPLEMENTED();
+ return false;
+}
+
void DesktopRootWindowHostWin::PostNativeEvent(
const base::NativeEvent& native_event) {
}
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.h b/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.h
index 13f043d81c2..9ad6b6998c9 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_win.h
@@ -119,6 +119,9 @@ class VIEWS_EXPORT DesktopRootWindowHostWin
virtual void OnCursorVisibilityChanged(bool show) OVERRIDE;
virtual void MoveCursorTo(const gfx::Point& location) OVERRIDE;
virtual void SetFocusWhenShown(bool focus_when_shown) OVERRIDE;
+ virtual bool CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) OVERRIDE;
virtual void PostNativeEvent(const base::NativeEvent& native_event) OVERRIDE;
virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE;
virtual void PrepareForShutdown() OVERRIDE;
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_x11.cc b/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_x11.cc
index 67610684875..8c4ba7c8da5 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_x11.cc
+++ b/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_x11.cc
@@ -731,6 +731,14 @@ void DesktopRootWindowHostX11::SetFocusWhenShown(bool focus_when_shown) {
}
}
+bool DesktopRootWindowHostX11::CopyAreaToSkCanvas(
+ const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) {
+ NOTIMPLEMENTED();
+ return false;
+}
+
void DesktopRootWindowHostX11::PostNativeEvent(
const base::NativeEvent& native_event) {
DCHECK(xwindow_);
diff --git a/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_x11.h b/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_x11.h
index c3630293dc8..e1dcc766930 100644
--- a/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_x11.h
+++ b/chromium/ui/views/widget/desktop_aura/desktop_root_window_host_x11.h
@@ -146,6 +146,9 @@ class VIEWS_EXPORT DesktopRootWindowHostX11 :
virtual void OnCursorVisibilityChanged(bool show) OVERRIDE;
virtual void MoveCursorTo(const gfx::Point& location) OVERRIDE;
virtual void SetFocusWhenShown(bool focus_when_shown) OVERRIDE;
+ virtual bool CopyAreaToSkCanvas(const gfx::Rect& source_bounds,
+ const gfx::Point& dest_offset,
+ SkCanvas* canvas) OVERRIDE;
virtual void PostNativeEvent(const base::NativeEvent& native_event) OVERRIDE;
virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE;
virtual void PrepareForShutdown() OVERRIDE;
diff --git a/chromium/ui/views/win/appbar.cc b/chromium/ui/views/win/appbar.cc
index 062eb34c038..92151d47756 100644
--- a/chromium/ui/views/win/appbar.cc
+++ b/chromium/ui/views/win/appbar.cc
@@ -41,6 +41,14 @@ Appbar* Appbar::instance() {
}
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(
diff --git a/chromium/ui/webui/resources/css/menu.css b/chromium/ui/webui/resources/css/menu.css
index d22bcccf196..625ca1513fd 100644
--- a/chromium/ui/webui/resources/css/menu.css
+++ b/chromium/ui/webui/resources/css/menu.css
@@ -72,7 +72,6 @@ menu > [checked]::before {
display: inline-block;
height: 9px;
margin: 0 5px;
- vertical-align: 50%;
width: 9px;
}
diff --git a/chromium/ui/webui/resources/js/cr/ui/list.js b/chromium/ui/webui/resources/js/cr/ui/list.js
index 52f2896c27d..080aa9c23b8 100644
--- a/chromium/ui/webui/resources/js/cr/ui/list.js
+++ b/chromium/ui/webui/resources/js/cr/ui/list.js
@@ -1105,10 +1105,15 @@ cr.define('cr.ui', function() {
var sm = this.selectionModel;
var leadIndex = sm.leadIndex;
+ // If the pinned item is hidden and it is not the lead item, then remove
+ // it from cache. Note, that we restore the hidden status to false, since
+ // the item is still in cache, and may be reused.
if (this.pinnedItem_ &&
this.pinnedItem_ != this.cachedItems_[leadIndex]) {
- if (this.pinnedItem_.hidden)
+ if (this.pinnedItem_.hidden) {
this.removeChild(this.pinnedItem_);
+ this.pinnedItem_.hidden = false;
+ }
this.pinnedItem_ = undefined;
}
diff --git a/chromium/update_verification.py b/chromium/update_verification.py
deleted file mode 100755
index 0c349c31bea..00000000000
--- a/chromium/update_verification.py
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-"""Runs semi-automated update testing on a non-rooted device."""
-import logging
-import optparse
-import os
-import shutil
-import sys
-import time
-
-from pylib import android_commands
-
-
-def _SaveAppData(adb, package_name, from_apk=None, data_dir=None):
- def _BackupAppData(data_dir=None):
- adb.Adb().SendCommand('backup %s' % package_name)
- backup_file = os.path.join(os.getcwd(), 'backup.ab')
- assert os.path.exists(backup_file), 'Backup failed.'
- if data_dir:
- if not os.path.isdir(data_dir):
- os.makedirs(data_dir)
- shutil.move(backup_file, data_dir)
- backup_file = os.path.join(data_dir, 'backup.ab')
- print 'Application data saved to %s' % backup_file
-
- if from_apk:
- logging.info('Installing %s...', from_apk)
- output = adb.Install(from_apk, reinstall=True)
- if 'Success' not in output:
- raise Exception('Unable to install %s. output: %s' % (from_apk, output))
-
- raw_input('Set the application state. Once ready, press enter and '
- 'select "Backup my data" on the device.')
- _BackupAppData(data_dir)
-
-
-def _VerifyAppUpdate(adb, to_apk, app_data, from_apk=None):
- def _RestoreAppData():
- assert os.path.exists(app_data), 'Backup file does not exist!'
- adb.Adb().SendCommand('restore %s' % app_data)
- # It seems restore command is not synchronous.
- time.sleep(15)
-
- if from_apk:
- logging.info('Installing %s...', from_apk)
- output = adb.Install(from_apk, reinstall=True)
- if 'Success' not in output:
- raise Exception('Unable to install %s. output: %s' % (from_apk, output))
-
- logging.info('Restoring the application data...')
- raw_input('Press enter and select "Restore my data" on the device.')
- _RestoreAppData()
-
- logging.info('Verifying that %s cannot be installed side-by-side...',
- to_apk)
- output = adb.Install(to_apk)
- if 'INSTALL_FAILED_ALREADY_EXISTS' not in output:
- if 'Success' in output:
- raise Exception('Package name has changed! output: %s' % output)
- else:
- raise Exception(output)
-
- logging.info('Verifying that %s can be overinstalled...', to_apk)
- output = adb.Install(to_apk, reinstall=True)
- if 'Success' not in output:
- raise Exception('Unable to install %s.\n output: %s' % (to_apk, output))
- logging.info('Successfully updated to the new apk. Please verify that the '
- 'the application data is preserved.')
-
-
-def main():
- logger = logging.getLogger()
- logger.setLevel(logging.DEBUG)
- desc = (
- 'Performs semi-automated application update verification testing. '
- 'When given --save, it takes a snapshot of the application data '
- 'on the device. (A dialog on the device will prompt the user to grant '
- 'permission to backup the data.) Otherwise, it performs the update '
- 'testing as follows: '
- '1. Installs the |from-apk| (optional). '
- '2. Restores the previously stored snapshot of application data '
- 'given by |app-data| '
- '(A dialog on the device will prompt the user to grant permission to '
- 'restore the data.) '
- '3. Verifies that |to-apk| cannot be installed side-by-side. '
- '4. Verifies that |to-apk| can replace |from-apk|.')
- parser = optparse.OptionParser(description=desc)
- parser.add_option('--package-name', help='Package name for the application.')
- parser.add_option('--save', action='store_true',
- help=('Save a snapshot of application data. '
- 'This will be saved as backup.db in the '
- 'current directory if |app-data| directory '
- 'is not specifid.'))
- parser.add_option('--from-apk',
- help=('APK to update from. This is optional if you already '
- 'have the app installed.'))
- parser.add_option('--to-apk', help='APK to update to.')
- parser.add_option('--app-data',
- help=('Path to the application data to be restored or the '
- 'directory where the data should be saved.'))
- (options, args) = parser.parse_args()
-
- if args:
- parser.print_help(sys.stderr)
- parser.error('Unknown arguments: %s.' % args)
-
- if len(android_commands.GetAttachedDevices()) != 1:
- parser.error('Exactly 1 device must be attached.')
- adb = android_commands.AndroidCommands()
-
- if options.from_apk:
- assert os.path.isfile(options.from_apk)
-
- if options.save:
- if not options.package_name:
- parser.print_help(sys.stderr)
- parser.error('Missing --package-name.')
- _SaveAppData(adb, options.package_name, from_apk=options.from_apk,
- data_dir=options.app_data)
- else:
- if not options.to_apk or not options.app_data:
- parser.print_help(sys.stderr)
- parser.error('Missing --to-apk or --app-data.')
- assert os.path.isfile(options.to_apk)
- assert os.path.isfile(options.app_data)
- _VerifyAppUpdate(adb, options.to_apk, options.app_data,
- from_apk=options.from_apk)
-
-
-if __name__ == '__main__':
- main()
diff --git a/chromium/url/url_canon_icu.h b/chromium/url/url_canon_icu.h
index 11597685876..9bfd643eb21 100644
--- a/chromium/url/url_canon_icu.h
+++ b/chromium/url/url_canon_icu.h
@@ -7,7 +7,6 @@
// ICU integration functions.
-#include "base/compiler_specific.h"
#include "url/url_canon.h"
#include "url/url_export.h"
@@ -28,7 +27,7 @@ class URL_EXPORT ICUCharsetConverter : public CharsetConverter {
virtual void ConvertFromUTF16(const base::char16* input,
int input_len,
- CanonOutput* output) OVERRIDE;
+ CanonOutput* output);
private:
// The ICU converter, not owned by this class.
diff --git a/chromium/url/url_canon_relative.cc b/chromium/url/url_canon_relative.cc
index 30956a633f7..84317f80094 100644
--- a/chromium/url/url_canon_relative.cc
+++ b/chromium/url/url_canon_relative.cc
@@ -372,9 +372,8 @@ bool DoResolveRelativeHost(const char* base_url,
// Parse the relative URL, just like we would for anything following a
// scheme.
url_parse::Parsed relative_parsed; // Everything but the scheme is valid.
- url_parse::ParseAfterScheme(&relative_url[relative_component.begin],
- relative_component.len, relative_component.begin,
- &relative_parsed);
+ url_parse::ParseAfterScheme(relative_url, relative_component.end(),
+ relative_component.begin, &relative_parsed);
// Now we can just use the replacement function to replace all the necessary
// parts of the old URL with the new one.
diff --git a/chromium/url/url_canon_stdstring.h b/chromium/url/url_canon_stdstring.h
index 9b4a6c2a3b5..7450f156ac7 100644
--- a/chromium/url/url_canon_stdstring.h
+++ b/chromium/url/url_canon_stdstring.h
@@ -11,7 +11,6 @@
#include <string>
-#include "base/compiler_specific.h"
#include "url/url_canon.h"
namespace url_canon {
@@ -52,7 +51,7 @@ class StdStringCanonOutput : public CanonOutput {
buffer_len_ = cur_len_;
}
- virtual void Resize(int sz) OVERRIDE {
+ virtual void Resize(int sz) {
str_->resize(sz);
buffer_ = str_->empty() ? NULL : &(*str_)[0];
buffer_len_ = sz;
diff --git a/chromium/v8/ChangeLog b/chromium/v8/ChangeLog
index d824cec0d63..b0ab892073e 100644
--- a/chromium/v8/ChangeLog
+++ b/chromium/v8/ChangeLog
@@ -1,60 +1,3 @@
-2013-08-14: Version 3.20.17
-
- Fixed Math.round/floor that had bogus Smi representation
- (Chromium issue 272564)
-
- Performance and stability improvements on all platforms.
-
-
-2013-08-13: Version 3.20.16
-
- Fixed bug in HPhi::SimplifyConstantInput (Chromium issue 269679)
-
- Fixed gcmole bugs in i18n code (issue 2745)
-
- ia32: Calls to the TranscendentalCacheStub must ensure that esi is
- set (issue 2827)
-
- Made sure polymorphic element access creates non-replaying
- phis. (issue 2815)
-
- Allowed HPhis to have an invalid merge index. (issue 2815)
-
- Fixed smi-based math floor. (Chromium issue 270268)
-
- Deprecated self and total time getters and total sample count
- getter on CpuProfileNode. (Chromium issue 267595)
-
- Fixed Object.freeze, Object.observe wrt CountOperation and
- CompoundAssignment. (issue 2774,2779)
-
- Performance and stability improvements on all platforms.
-
-
-2013-08-07: Version 3.20.14
-
- Exposed eternal handle api.
-
- Bugfix to solve issues with enabling V8 typed arrays in Blink.
-
- Fixed Array index dehoisting. (Chromium issue 264203)
-
- Updated Array Iterator to use numeric indexes (issue 2818)
-
- Return start/end profiling time in microseconds instead of milliseconds
- (issue 2824)
-
- Performance and stability improvements on all platforms.
-
-
-2013-08-06: Version 3.20.14
-
- Added new Harmony methods to Array.prototype object.
- (issue 2776,v8:2777)
-
- Performance and stability improvements on all platforms.
-
-
2013-08-01: Version 3.20.12
Removed buggy ToNumber truncation (partial fix for issue 2813)
diff --git a/chromium/v8/Makefile b/chromium/v8/Makefile
index 288c257396d..499f6cb08e0 100644
--- a/chromium/v8/Makefile
+++ b/chromium/v8/Makefile
@@ -192,7 +192,6 @@ endif
# ----------------- available targets: --------------------
# - "dependencies": pulls in external dependencies (currently: GYP)
-# - "grokdump": rebuilds heap constants lists used by grokdump
# - any arch listed in ARCHES (see below)
# - any mode listed in MODES
# - every combination <arch>.<mode>, e.g. "ia32.release"
@@ -393,7 +392,7 @@ endif
# Replaces the old with the new environment file if they're different, which
# will trigger GYP to regenerate Makefiles.
$(ENVFILE): $(ENVFILE).new
- @if test -r $(ENVFILE) && cmp $(ENVFILE).new $(ENVFILE) > /dev/null; \
+ @if test -r $(ENVFILE) && cmp $(ENVFILE).new $(ENVFILE) >/dev/null; \
then rm $(ENVFILE).new; \
else mv $(ENVFILE).new $(ENVFILE); fi
@@ -402,12 +401,6 @@ $(ENVFILE).new:
@mkdir -p $(OUTDIR); echo "GYPFLAGS=$(GYPFLAGS)" > $(ENVFILE).new; \
echo "CXX=$(CXX)" >> $(ENVFILE).new
-# Heap constants for grokdump.
-DUMP_FILE = tools/v8heapconst.py
-grokdump: ia32.release
- @cat $(DUMP_FILE).tmpl > $(DUMP_FILE)
- @$(OUTDIR)/ia32.release/d8 --dump-heap-constants >> $(DUMP_FILE)
-
# Dependencies.
# Remember to keep these in sync with the DEPS file.
dependencies:
diff --git a/chromium/v8/include/v8-debug.h b/chromium/v8/include/v8-debug.h
index bacccb61ddf..e488aaa8891 100755
--- a/chromium/v8/include/v8-debug.h
+++ b/chromium/v8/include/v8-debug.h
@@ -30,6 +30,40 @@
#include "v8.h"
+#ifdef _WIN32
+typedef int int32_t;
+typedef unsigned int uint32_t;
+typedef unsigned short uint16_t; // NOLINT
+typedef long long int64_t; // NOLINT
+
+// Setup for Windows DLL export/import. See v8.h in this directory for
+// information on how to build/use V8 as a DLL.
+#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
+#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\
+ build configuration to ensure that at most one of these is set
+#endif
+
+#ifdef BUILDING_V8_SHARED
+#define EXPORT __declspec(dllexport)
+#elif USING_V8_SHARED
+#define EXPORT __declspec(dllimport)
+#else
+#define EXPORT
+#endif
+
+#else // _WIN32
+
+// Setup for Linux shared library export. See v8.h in this directory for
+// information on how to build/use V8 as shared library.
+#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(V8_SHARED)
+#define EXPORT __attribute__ ((visibility("default")))
+#else // defined(__GNUC__) && (__GNUC__ >= 4)
+#define EXPORT
+#endif // defined(__GNUC__) && (__GNUC__ >= 4)
+
+#endif // _WIN32
+
+
/**
* Debugger support for the V8 JavaScript engine.
*/
@@ -47,7 +81,7 @@ enum DebugEvent {
};
-class V8_EXPORT Debug {
+class EXPORT Debug {
public:
/**
* A client object passed to the v8 debugger whose ownership will be taken by
diff --git a/chromium/v8/include/v8-preparser.h b/chromium/v8/include/v8-preparser.h
index 1da77185af8..3e39823d65c 100644
--- a/chromium/v8/include/v8-preparser.h
+++ b/chromium/v8/include/v8-preparser.h
@@ -28,14 +28,48 @@
#ifndef PREPARSER_H
#define PREPARSER_H
-#include "v8.h"
#include "v8stdint.h"
+#ifdef _WIN32
+
+// Setup for Windows DLL export/import. When building the V8 DLL the
+// BUILDING_V8_SHARED needs to be defined. When building a program which uses
+// the V8 DLL USING_V8_SHARED needs to be defined. When either building the V8
+// static library or building a program which uses the V8 static library neither
+// BUILDING_V8_SHARED nor USING_V8_SHARED should be defined.
+#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
+#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\
+ build configuration to ensure that at most one of these is set
+#endif
+
+#ifdef BUILDING_V8_SHARED
+#define V8EXPORT __declspec(dllexport)
+#elif USING_V8_SHARED
+#define V8EXPORT __declspec(dllimport)
+#else
+#define V8EXPORT
+#endif // BUILDING_V8_SHARED
+
+#else // _WIN32
+
+// Setup for Linux shared library export. There is no need to distinguish
+// between building or using the V8 shared library, but we should not
+// export symbols when we are building a static library.
+#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
+ (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED)
+#define V8EXPORT __attribute__ ((visibility("default")))
+#else
+#define V8EXPORT
+#endif
+
+#endif // _WIN32
+
+
namespace v8 {
// The result of preparsing is either a stack overflow error, or an opaque
// blob of data that can be passed back into the parser.
-class V8_EXPORT PreParserData {
+class V8EXPORT PreParserData {
public:
PreParserData(size_t size, const uint8_t* data)
: data_(data), size_(size) { }
@@ -60,7 +94,7 @@ class V8_EXPORT PreParserData {
// Interface for a stream of Unicode characters.
-class V8_EXPORT UnicodeInputStream { // NOLINT - V8_EXPORT is not a class name.
+class V8EXPORT UnicodeInputStream { // NOLINT - Thinks V8EXPORT is class name.
public:
virtual ~UnicodeInputStream();
@@ -76,9 +110,11 @@ class V8_EXPORT UnicodeInputStream { // NOLINT - V8_EXPORT is not a class name.
// more stack space than the limit provided, the result's stack_overflow()
// method will return true. Otherwise the result contains preparser
// data that can be used by the V8 parser to speed up parsing.
-PreParserData V8_EXPORT Preparse(UnicodeInputStream* input,
+PreParserData V8EXPORT Preparse(UnicodeInputStream* input,
size_t max_stack_size);
} // namespace v8.
+#undef V8EXPORT
+
#endif // PREPARSER_H
diff --git a/chromium/v8/include/v8-profiler.h b/chromium/v8/include/v8-profiler.h
index e538f4a8406..7898fef1967 100644
--- a/chromium/v8/include/v8-profiler.h
+++ b/chromium/v8/include/v8-profiler.h
@@ -30,6 +30,36 @@
#include "v8.h"
+#ifdef _WIN32
+// Setup for Windows DLL export/import. See v8.h in this directory for
+// information on how to build/use V8 as a DLL.
+#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
+#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\
+ build configuration to ensure that at most one of these is set
+#endif
+
+#ifdef BUILDING_V8_SHARED
+#define V8EXPORT __declspec(dllexport)
+#elif USING_V8_SHARED
+#define V8EXPORT __declspec(dllimport)
+#else
+#define V8EXPORT
+#endif
+
+#else // _WIN32
+
+// Setup for Linux shared library export. See v8.h in this directory for
+// information on how to build/use V8 as shared library.
+#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
+ (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED)
+#define V8EXPORT __attribute__ ((visibility("default")))
+#else
+#define V8EXPORT
+#endif
+
+#endif // _WIN32
+
+
/**
* Profiler support for the V8 JavaScript engine.
*/
@@ -40,7 +70,7 @@ typedef uint32_t SnapshotObjectId;
/**
* CpuProfileNode represents a node in a call graph.
*/
-class V8_EXPORT CpuProfileNode {
+class V8EXPORT CpuProfileNode {
public:
/** Returns function name (empty string for anonymous functions.) */
Handle<String> GetFunctionName() const;
@@ -61,27 +91,20 @@ class V8_EXPORT CpuProfileNode {
* Returns total (self + children) execution time of the function,
* in milliseconds, estimated by samples count.
*/
- V8_DEPRECATED(double GetTotalTime() const);
+ double GetTotalTime() const;
/**
* Returns self execution time of the function, in milliseconds,
* estimated by samples count.
*/
- V8_DEPRECATED(double GetSelfTime() const);
+ double GetSelfTime() const;
/** Returns the count of samples where function exists. */
- V8_DEPRECATED(double GetTotalSamplesCount() const);
+ double GetTotalSamplesCount() const;
- /** DEPRECATED. Please use GetHitCount instead.
- * Returns the count of samples where function was currently executing.
- */
+ /** Returns the count of samples where function was currently executing. */
double GetSelfSamplesCount() const;
- /**
- * Returns the count of samples where the function was currently executing.
- */
- unsigned GetHitCount() const;
-
/** Returns function entry UID. */
unsigned GetCallUid() const;
@@ -102,7 +125,7 @@ class V8_EXPORT CpuProfileNode {
* CpuProfile contains a CPU profile in a form of top-down call tree
* (from main() down to functions that do all the work).
*/
-class V8_EXPORT CpuProfile {
+class V8EXPORT CpuProfile {
public:
/** Returns CPU profile UID (assigned by the profiler.) */
unsigned GetUid() const;
@@ -153,7 +176,7 @@ class V8_EXPORT CpuProfile {
* Interface for controlling CPU profiling. Instance of the
* profiler can be retrieved using v8::Isolate::GetCpuProfiler.
*/
-class V8_EXPORT CpuProfiler {
+class V8EXPORT CpuProfiler {
public:
/**
* A note on security tokens usage. As scripts from different
@@ -199,11 +222,6 @@ class V8_EXPORT CpuProfiler {
*/
void DeleteAllCpuProfiles();
- /**
- * Tells the profiler whether the embedder is idle.
- */
- void SetIdle(bool is_idle);
-
private:
CpuProfiler();
~CpuProfiler();
@@ -219,7 +237,7 @@ class HeapGraphNode;
* HeapSnapshotEdge represents a directed connection between heap
* graph nodes: from retainers to retained nodes.
*/
-class V8_EXPORT HeapGraphEdge {
+class V8EXPORT HeapGraphEdge {
public:
enum Type {
kContextVariable = 0, // A variable from a function context.
@@ -255,7 +273,7 @@ class V8_EXPORT HeapGraphEdge {
/**
* HeapGraphNode represents a node in a heap graph.
*/
-class V8_EXPORT HeapGraphNode {
+class V8EXPORT HeapGraphNode {
public:
enum Type {
kHidden = 0, // Hidden node, may be filtered when shown to user.
@@ -307,7 +325,7 @@ class V8_EXPORT HeapGraphNode {
/**
* HeapSnapshots record the state of the JS heap at some moment.
*/
-class V8_EXPORT HeapSnapshot {
+class V8EXPORT HeapSnapshot {
public:
enum SerializationFormat {
kJSON = 0 // See format description near 'Serialize' method.
@@ -377,7 +395,7 @@ class RetainedObjectInfo;
* Interface for controlling heap profiling. Instance of the
* profiler can be retrieved using v8::Isolate::GetHeapProfiler.
*/
-class V8_EXPORT HeapProfiler {
+class V8EXPORT HeapProfiler {
public:
/**
* Callback function invoked for obtaining RetainedObjectInfo for
@@ -515,7 +533,7 @@ class V8_EXPORT HeapProfiler {
* keeps them alive only during snapshot collection. Afterwards, they
* are freed by calling the Dispose class function.
*/
-class V8_EXPORT RetainedObjectInfo { // NOLINT
+class V8EXPORT RetainedObjectInfo { // NOLINT
public:
/** Called by V8 when it no longer needs an instance. */
virtual void Dispose() = 0;
@@ -581,4 +599,7 @@ struct HeapStatsUpdate {
} // namespace v8
+#undef V8EXPORT
+
+
#endif // V8_V8_PROFILER_H_
diff --git a/chromium/v8/include/v8-testing.h b/chromium/v8/include/v8-testing.h
index 97b467a91b1..59eebf9db47 100644
--- a/chromium/v8/include/v8-testing.h
+++ b/chromium/v8/include/v8-testing.h
@@ -30,12 +30,42 @@
#include "v8.h"
+#ifdef _WIN32
+// Setup for Windows DLL export/import. See v8.h in this directory for
+// information on how to build/use V8 as a DLL.
+#if defined(BUILDING_V8_SHARED) && defined(USING_V8_SHARED)
+#error both BUILDING_V8_SHARED and USING_V8_SHARED are set - please check the\
+ build configuration to ensure that at most one of these is set
+#endif
+
+#ifdef BUILDING_V8_SHARED
+#define V8EXPORT __declspec(dllexport)
+#elif USING_V8_SHARED
+#define V8EXPORT __declspec(dllimport)
+#else
+#define V8EXPORT
+#endif
+
+#else // _WIN32
+
+// Setup for Linux shared library export. See v8.h in this directory for
+// information on how to build/use V8 as shared library.
+#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
+ (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED)
+#define V8EXPORT __attribute__ ((visibility("default")))
+#else
+#define V8EXPORT
+#endif
+
+#endif // _WIN32
+
+
/**
* Testing support for the V8 JavaScript engine.
*/
namespace v8 {
-class V8_EXPORT Testing {
+class V8EXPORT Testing {
public:
enum StressType {
kStressTypeOpt,
@@ -69,7 +99,7 @@ class V8_EXPORT Testing {
} // namespace v8
-#undef V8_EXPORT
+#undef V8EXPORT
#endif // V8_V8_TEST_H_
diff --git a/chromium/v8/include/v8.h b/chromium/v8/include/v8.h
index 3252602bcf1..3eb4794f5c6 100644
--- a/chromium/v8/include/v8.h
+++ b/chromium/v8/include/v8.h
@@ -40,9 +40,6 @@
#include "v8stdint.h"
-// We reserve the V8_* prefix for macros defined in V8 public API and
-// assume there are no name conflicts with the embedder's code.
-
#ifdef _WIN32
// Setup for Windows DLL export/import. When building the V8 DLL the
@@ -56,11 +53,11 @@
#endif
#ifdef BUILDING_V8_SHARED
-#define V8_EXPORT __declspec(dllexport)
+#define V8EXPORT __declspec(dllexport)
#elif USING_V8_SHARED
-#define V8_EXPORT __declspec(dllimport)
+#define V8EXPORT __declspec(dllimport)
#else
-#define V8_EXPORT
+#define V8EXPORT
#endif // BUILDING_V8_SHARED
#else // _WIN32
@@ -69,12 +66,12 @@
#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
(__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(V8_SHARED)
#ifdef BUILDING_V8_SHARED
-#define V8_EXPORT __attribute__ ((visibility("default")))
+#define V8EXPORT __attribute__ ((visibility("default")))
#else
-#define V8_EXPORT
+#define V8EXPORT
#endif
#else
-#define V8_EXPORT
+#define V8EXPORT
#endif
#endif // _WIN32
@@ -388,11 +385,6 @@ template <class T> class Handle {
};
-// A value which will never be returned by Local::Eternalize
-// Useful for static initialization
-const int kUninitializedEternalIndex = -1;
-
-
/**
* A light-weight stack-allocated object handle. All operations
* that return objects from within v8 return them in local handles. They
@@ -438,11 +430,6 @@ template <class T> class Local : public Handle<T> {
return Local<S>::Cast(*this);
}
- // Keep this Local alive for the lifetime of the Isolate.
- // It remains retrievable via the returned index,
- V8_INLINE(int Eternalize(Isolate* isolate));
- V8_INLINE(static Local<T> GetEternal(Isolate* isolate, int index));
-
/**
* Create a local handle for the content of another handle.
* The referee is kept alive by the local handle even when
@@ -814,7 +801,7 @@ template <class T> class Persistent // NOLINT
* handle and may deallocate it. The behavior of accessing a handle
* for which the handle scope has been deleted is undefined.
*/
-class V8_EXPORT HandleScope {
+class V8EXPORT HandleScope {
public:
// TODO(svenpanne) Deprecate me when Chrome is fixed!
HandleScope();
@@ -853,7 +840,7 @@ class V8_EXPORT HandleScope {
// This Data class is accessible internally as HandleScopeData through a
// typedef in the ImplementationUtilities class.
- class V8_EXPORT Data {
+ class V8EXPORT Data {
public:
internal::Object** next;
internal::Object** limit;
@@ -886,7 +873,7 @@ class V8_EXPORT HandleScope {
/**
* The superclass of values and API object templates.
*/
-class V8_EXPORT Data {
+class V8EXPORT Data {
private:
Data();
};
@@ -898,7 +885,7 @@ class V8_EXPORT Data {
* compiling it, and can be stored between compilations. When script
* data is given to the compile method compilation will be faster.
*/
-class V8_EXPORT ScriptData { // NOLINT
+class V8EXPORT ScriptData { // NOLINT
public:
virtual ~ScriptData() { }
@@ -976,7 +963,7 @@ class ScriptOrigin {
/**
* A compiled JavaScript script.
*/
-class V8_EXPORT Script {
+class V8EXPORT Script {
public:
/**
* Compiles the specified script (context-independent).
@@ -1094,7 +1081,7 @@ class V8_EXPORT Script {
/**
* An error message.
*/
-class V8_EXPORT Message {
+class V8EXPORT Message {
public:
Local<String> Get() const;
Local<String> GetSourceLine() const;
@@ -1166,7 +1153,7 @@ class V8_EXPORT Message {
* snapshot of the execution stack and the information remains valid after
* execution continues.
*/
-class V8_EXPORT StackTrace {
+class V8EXPORT StackTrace {
public:
/**
* Flags that determine what information is placed captured for each
@@ -1215,7 +1202,7 @@ class V8_EXPORT StackTrace {
/**
* A single JavaScript stack frame.
*/
-class V8_EXPORT StackFrame {
+class V8EXPORT StackFrame {
public:
/**
* Returns the number, 1-based, of the line for the associate function call.
@@ -1267,29 +1254,13 @@ class V8_EXPORT StackFrame {
};
-/**
- * A JSON Parser.
- */
-class V8_EXPORT JSON {
- public:
- /**
- * Tries to parse the string |json_string| and returns it as value if
- * successful.
- *
- * \param json_string The string to parse.
- * \return The corresponding value if successfully parsed.
- */
- static Local<Value> Parse(Local<String> json_string);
-};
-
-
// --- Value ---
/**
* The superclass of all JavaScript values and objects.
*/
-class V8_EXPORT Value : public Data {
+class V8EXPORT Value : public Data {
public:
/**
* Returns true if this value is the undefined value. See ECMA-262
@@ -1520,14 +1491,14 @@ class V8_EXPORT Value : public Data {
/**
* The superclass of primitive values. See ECMA-262 4.3.2.
*/
-class V8_EXPORT Primitive : public Value { };
+class V8EXPORT Primitive : public Value { };
/**
* A primitive boolean value (ECMA-262, 4.3.14). Either the true
* or false value.
*/
-class V8_EXPORT Boolean : public Primitive {
+class V8EXPORT Boolean : public Primitive {
public:
bool Value() const;
V8_INLINE(static Handle<Boolean> New(bool value));
@@ -1537,7 +1508,7 @@ class V8_EXPORT Boolean : public Primitive {
/**
* A JavaScript string value (ECMA-262, 4.3.17).
*/
-class V8_EXPORT String : public Primitive {
+class V8EXPORT String : public Primitive {
public:
enum Encoding {
UNKNOWN_ENCODING = 0x1,
@@ -1643,7 +1614,7 @@ class V8_EXPORT String : public Primitive {
*/
bool IsExternalAscii() const;
- class V8_EXPORT ExternalStringResourceBase { // NOLINT
+ class V8EXPORT ExternalStringResourceBase { // NOLINT
public:
virtual ~ExternalStringResourceBase() {}
@@ -1672,7 +1643,7 @@ class V8_EXPORT String : public Primitive {
* ExternalStringResource to manage the life cycle of the underlying
* buffer. Note that the string data must be immutable.
*/
- class V8_EXPORT ExternalStringResource
+ class V8EXPORT ExternalStringResource
: public ExternalStringResourceBase {
public:
/**
@@ -1706,7 +1677,7 @@ class V8_EXPORT String : public Primitive {
* Use String::New or convert to 16 bit data for non-ASCII.
*/
- class V8_EXPORT ExternalAsciiStringResource
+ class V8EXPORT ExternalAsciiStringResource
: public ExternalStringResourceBase {
public:
/**
@@ -1859,7 +1830,7 @@ class V8_EXPORT String : public Primitive {
* then the length() method returns 0 and the * operator returns
* NULL.
*/
- class V8_EXPORT Utf8Value {
+ class V8EXPORT Utf8Value {
public:
explicit Utf8Value(Handle<v8::Value> obj);
~Utf8Value();
@@ -1882,7 +1853,7 @@ class V8_EXPORT String : public Primitive {
* method of the object) then the length() method returns 0 and the * operator
* returns NULL.
*/
- class V8_EXPORT AsciiValue {
+ class V8EXPORT AsciiValue {
public:
// TODO(dcarney): deprecate
explicit AsciiValue(Handle<v8::Value> obj);
@@ -1905,7 +1876,7 @@ class V8_EXPORT String : public Primitive {
* method of the object) then the length() method returns 0 and the * operator
* returns NULL.
*/
- class V8_EXPORT Value {
+ class V8EXPORT Value {
public:
explicit Value(Handle<v8::Value> obj);
~Value();
@@ -1934,7 +1905,7 @@ class V8_EXPORT String : public Primitive {
*
* This is an experimental feature. Use at your own risk.
*/
-class V8_EXPORT Symbol : public Primitive {
+class V8EXPORT Symbol : public Primitive {
public:
// Returns the print name string of the symbol, or undefined if none.
Local<Value> Name() const;
@@ -1955,7 +1926,7 @@ class V8_EXPORT Symbol : public Primitive {
/**
* A JavaScript number value (ECMA-262, 4.3.20)
*/
-class V8_EXPORT Number : public Primitive {
+class V8EXPORT Number : public Primitive {
public:
double Value() const;
static Local<Number> New(double value);
@@ -1970,7 +1941,7 @@ class V8_EXPORT Number : public Primitive {
/**
* A JavaScript value representing a signed integer.
*/
-class V8_EXPORT Integer : public Number {
+class V8EXPORT Integer : public Number {
public:
static Local<Integer> New(int32_t value);
static Local<Integer> NewFromUnsigned(uint32_t value);
@@ -1987,7 +1958,7 @@ class V8_EXPORT Integer : public Number {
/**
* A JavaScript value representing a 32-bit signed integer.
*/
-class V8_EXPORT Int32 : public Integer {
+class V8EXPORT Int32 : public Integer {
public:
int32_t Value() const;
private:
@@ -1998,7 +1969,7 @@ class V8_EXPORT Int32 : public Integer {
/**
* A JavaScript value representing a 32-bit unsigned integer.
*/
-class V8_EXPORT Uint32 : public Integer {
+class V8EXPORT Uint32 : public Integer {
public:
uint32_t Value() const;
private:
@@ -2070,7 +2041,7 @@ enum AccessControl {
/**
* A JavaScript object (ECMA-262, 4.3.3)
*/
-class V8_EXPORT Object : public Value {
+class V8EXPORT Object : public Value {
public:
bool Set(Handle<Value> key,
Handle<Value> value,
@@ -2342,7 +2313,7 @@ class V8_EXPORT Object : public Value {
/**
* An instance of the built-in array constructor (ECMA-262, 15.4.2).
*/
-class V8_EXPORT Array : public Object {
+class V8EXPORT Array : public Object {
public:
uint32_t Length() const;
@@ -2368,7 +2339,7 @@ class V8_EXPORT Array : public Object {
/**
* A JavaScript function object (ECMA-262, 15.3).
*/
-class V8_EXPORT Function : public Object {
+class V8EXPORT Function : public Object {
public:
Local<Object> NewInstance() const;
Local<Object> NewInstance(int argc, Handle<Value> argv[]) const;
@@ -2424,7 +2395,7 @@ class V8_EXPORT Function : public Object {
* An instance of the built-in ArrayBuffer constructor (ES6 draft 15.13.5).
* This API is experimental and may change significantly.
*/
-class V8_EXPORT ArrayBuffer : public Object {
+class V8EXPORT ArrayBuffer : public Object {
public:
/**
* Allocator that V8 uses to allocate |ArrayBuffer|'s memory.
@@ -2433,7 +2404,7 @@ class V8_EXPORT ArrayBuffer : public Object {
*
* This API is experimental and may change significantly.
*/
- class V8_EXPORT Allocator { // NOLINT
+ class V8EXPORT Allocator { // NOLINT
public:
virtual ~Allocator() {}
@@ -2480,7 +2451,7 @@ class V8_EXPORT ArrayBuffer : public Object {
*
* This API is experimental and may change significantly.
*/
- class V8_EXPORT Contents { // NOLINT
+ class V8EXPORT Contents { // NOLINT
public:
Contents() : data_(NULL), byte_length_(0) {}
@@ -2563,7 +2534,7 @@ class V8_EXPORT ArrayBuffer : public Object {
*
* This API is experimental and may change significantly.
*/
-class V8_EXPORT ArrayBufferView : public Object {
+class V8EXPORT ArrayBufferView : public Object {
public:
/**
* Returns underlying ArrayBuffer.
@@ -2598,7 +2569,7 @@ class V8_EXPORT ArrayBufferView : public Object {
* (ES6 draft 15.13.6).
* This API is experimental and may change significantly.
*/
-class V8_EXPORT TypedArray : public ArrayBufferView {
+class V8EXPORT TypedArray : public ArrayBufferView {
public:
/**
* Number of elements in this typed array
@@ -2618,7 +2589,7 @@ class V8_EXPORT TypedArray : public ArrayBufferView {
* An instance of Uint8Array constructor (ES6 draft 15.13.6).
* This API is experimental and may change significantly.
*/
-class V8_EXPORT Uint8Array : public TypedArray {
+class V8EXPORT Uint8Array : public TypedArray {
public:
static Local<Uint8Array> New(Handle<ArrayBuffer> array_buffer,
size_t byte_offset, size_t length);
@@ -2634,7 +2605,7 @@ class V8_EXPORT Uint8Array : public TypedArray {
* An instance of Uint8ClampedArray constructor (ES6 draft 15.13.6).
* This API is experimental and may change significantly.
*/
-class V8_EXPORT Uint8ClampedArray : public TypedArray {
+class V8EXPORT Uint8ClampedArray : public TypedArray {
public:
static Local<Uint8ClampedArray> New(Handle<ArrayBuffer> array_buffer,
size_t byte_offset, size_t length);
@@ -2649,7 +2620,7 @@ class V8_EXPORT Uint8ClampedArray : public TypedArray {
* An instance of Int8Array constructor (ES6 draft 15.13.6).
* This API is experimental and may change significantly.
*/
-class V8_EXPORT Int8Array : public TypedArray {
+class V8EXPORT Int8Array : public TypedArray {
public:
static Local<Int8Array> New(Handle<ArrayBuffer> array_buffer,
size_t byte_offset, size_t length);
@@ -2665,7 +2636,7 @@ class V8_EXPORT Int8Array : public TypedArray {
* An instance of Uint16Array constructor (ES6 draft 15.13.6).
* This API is experimental and may change significantly.
*/
-class V8_EXPORT Uint16Array : public TypedArray {
+class V8EXPORT Uint16Array : public TypedArray {
public:
static Local<Uint16Array> New(Handle<ArrayBuffer> array_buffer,
size_t byte_offset, size_t length);
@@ -2681,7 +2652,7 @@ class V8_EXPORT Uint16Array : public TypedArray {
* An instance of Int16Array constructor (ES6 draft 15.13.6).
* This API is experimental and may change significantly.
*/
-class V8_EXPORT Int16Array : public TypedArray {
+class V8EXPORT Int16Array : public TypedArray {
public:
static Local<Int16Array> New(Handle<ArrayBuffer> array_buffer,
size_t byte_offset, size_t length);
@@ -2697,7 +2668,7 @@ class V8_EXPORT Int16Array : public TypedArray {
* An instance of Uint32Array constructor (ES6 draft 15.13.6).
* This API is experimental and may change significantly.
*/
-class V8_EXPORT Uint32Array : public TypedArray {
+class V8EXPORT Uint32Array : public TypedArray {
public:
static Local<Uint32Array> New(Handle<ArrayBuffer> array_buffer,
size_t byte_offset, size_t length);
@@ -2713,7 +2684,7 @@ class V8_EXPORT Uint32Array : public TypedArray {
* An instance of Int32Array constructor (ES6 draft 15.13.6).
* This API is experimental and may change significantly.
*/
-class V8_EXPORT Int32Array : public TypedArray {
+class V8EXPORT Int32Array : public TypedArray {
public:
static Local<Int32Array> New(Handle<ArrayBuffer> array_buffer,
size_t byte_offset, size_t length);
@@ -2729,7 +2700,7 @@ class V8_EXPORT Int32Array : public TypedArray {
* An instance of Float32Array constructor (ES6 draft 15.13.6).
* This API is experimental and may change significantly.
*/
-class V8_EXPORT Float32Array : public TypedArray {
+class V8EXPORT Float32Array : public TypedArray {
public:
static Local<Float32Array> New(Handle<ArrayBuffer> array_buffer,
size_t byte_offset, size_t length);
@@ -2745,7 +2716,7 @@ class V8_EXPORT Float32Array : public TypedArray {
* An instance of Float64Array constructor (ES6 draft 15.13.6).
* This API is experimental and may change significantly.
*/
-class V8_EXPORT Float64Array : public TypedArray {
+class V8EXPORT Float64Array : public TypedArray {
public:
static Local<Float64Array> New(Handle<ArrayBuffer> array_buffer,
size_t byte_offset, size_t length);
@@ -2761,7 +2732,7 @@ class V8_EXPORT Float64Array : public TypedArray {
* An instance of DataView constructor (ES6 draft 15.13.7).
* This API is experimental and may change significantly.
*/
-class V8_EXPORT DataView : public ArrayBufferView {
+class V8EXPORT DataView : public ArrayBufferView {
public:
static Local<DataView> New(Handle<ArrayBuffer> array_buffer,
size_t byte_offset, size_t length);
@@ -2776,7 +2747,7 @@ class V8_EXPORT DataView : public ArrayBufferView {
/**
* An instance of the built-in Date constructor (ECMA-262, 15.9).
*/
-class V8_EXPORT Date : public Object {
+class V8EXPORT Date : public Object {
public:
static Local<Value> New(double time);
@@ -2814,7 +2785,7 @@ class V8_EXPORT Date : public Object {
/**
* A Number object (ECMA-262, 4.3.21).
*/
-class V8_EXPORT NumberObject : public Object {
+class V8EXPORT NumberObject : public Object {
public:
static Local<Value> New(double value);
@@ -2837,7 +2808,7 @@ class V8_EXPORT NumberObject : public Object {
/**
* A Boolean object (ECMA-262, 4.3.15).
*/
-class V8_EXPORT BooleanObject : public Object {
+class V8EXPORT BooleanObject : public Object {
public:
static Local<Value> New(bool value);
@@ -2860,7 +2831,7 @@ class V8_EXPORT BooleanObject : public Object {
/**
* A String object (ECMA-262, 4.3.18).
*/
-class V8_EXPORT StringObject : public Object {
+class V8EXPORT StringObject : public Object {
public:
static Local<Value> New(Handle<String> value);
@@ -2885,7 +2856,7 @@ class V8_EXPORT StringObject : public Object {
*
* This is an experimental feature. Use at your own risk.
*/
-class V8_EXPORT SymbolObject : public Object {
+class V8EXPORT SymbolObject : public Object {
public:
static Local<Value> New(Isolate* isolate, Handle<Symbol> value);
@@ -2908,7 +2879,7 @@ class V8_EXPORT SymbolObject : public Object {
/**
* An instance of the built-in RegExp constructor (ECMA-262, 15.10).
*/
-class V8_EXPORT RegExp : public Object {
+class V8EXPORT RegExp : public Object {
public:
/**
* Regular expression flag bits. They can be or'ed to enable a set
@@ -2955,7 +2926,7 @@ class V8_EXPORT RegExp : public Object {
* A JavaScript value that wraps a C++ void*. This type of value is mainly used
* to associate C++ data structures with JavaScript objects.
*/
-class V8_EXPORT External : public Value {
+class V8EXPORT External : public Value {
public:
static Local<External> New(void* value);
V8_INLINE(static External* Cast(Value* obj));
@@ -2971,7 +2942,7 @@ class V8_EXPORT External : public Value {
/**
* The superclass of object and function templates.
*/
-class V8_EXPORT Template : public Data {
+class V8EXPORT Template : public Data {
public:
/** Adds a property to each instance created by this template.*/
void Set(Handle<String> name, Handle<Data> value,
@@ -3059,7 +3030,7 @@ class FunctionCallbackInfo {
};
-class V8_EXPORT Arguments : public FunctionCallbackInfo<Value> {
+class V8EXPORT Arguments : public FunctionCallbackInfo<Value> {
private:
friend class internal::FunctionCallbackArguments;
V8_INLINE(Arguments(internal::Object** implicit_args,
@@ -3100,7 +3071,7 @@ class PropertyCallbackInfo {
};
-class V8_EXPORT AccessorInfo : public PropertyCallbackInfo<Value> {
+class V8EXPORT AccessorInfo : public PropertyCallbackInfo<Value> {
private:
friend class internal::PropertyCallbackArguments;
V8_INLINE(AccessorInfo(internal::Object** args))
@@ -3348,7 +3319,7 @@ typedef bool (*IndexedSecurityCallback)(Local<Object> host,
* child_instance.instance_property == 3;
* \endcode
*/
-class V8_EXPORT FunctionTemplate : public Template {
+class V8EXPORT FunctionTemplate : public Template {
public:
/** Creates a function template.*/
V8_DEPRECATED(static Local<FunctionTemplate> New(
@@ -3439,7 +3410,7 @@ class V8_EXPORT FunctionTemplate : public Template {
* Properties added to an ObjectTemplate are added to each object
* created from the ObjectTemplate.
*/
-class V8_EXPORT ObjectTemplate : public Template {
+class V8EXPORT ObjectTemplate : public Template {
public:
/** Creates an ObjectTemplate. */
static Local<ObjectTemplate> New();
@@ -3625,7 +3596,7 @@ class V8_EXPORT ObjectTemplate : public Template {
* A Signature specifies which receivers and arguments are valid
* parameters to a function.
*/
-class V8_EXPORT Signature : public Data {
+class V8EXPORT Signature : public Data {
public:
static Local<Signature> New(Handle<FunctionTemplate> receiver =
Handle<FunctionTemplate>(),
@@ -3640,7 +3611,7 @@ class V8_EXPORT Signature : public Data {
* An AccessorSignature specifies which receivers are valid parameters
* to an accessor callback.
*/
-class V8_EXPORT AccessorSignature : public Data {
+class V8EXPORT AccessorSignature : public Data {
public:
static Local<AccessorSignature> New(Handle<FunctionTemplate> receiver =
Handle<FunctionTemplate>());
@@ -3649,13 +3620,13 @@ class V8_EXPORT AccessorSignature : public Data {
};
-class V8_EXPORT DeclaredAccessorDescriptor : public Data {
+class V8EXPORT DeclaredAccessorDescriptor : public Data {
private:
DeclaredAccessorDescriptor();
};
-class V8_EXPORT ObjectOperationDescriptor : public Data {
+class V8EXPORT ObjectOperationDescriptor : public Data {
public:
// This function is not yet stable and should not be used at this time.
static Local<RawOperationDescriptor> NewInternalFieldDereference(
@@ -3675,7 +3646,7 @@ enum DeclaredAccessorDescriptorDataType {
};
-class V8_EXPORT RawOperationDescriptor : public Data {
+class V8EXPORT RawOperationDescriptor : public Data {
public:
Local<DeclaredAccessorDescriptor> NewHandleDereference(Isolate* isolate);
Local<RawOperationDescriptor> NewRawDereference(Isolate* isolate);
@@ -3708,7 +3679,7 @@ class V8_EXPORT RawOperationDescriptor : public Data {
* A utility for determining the type of objects based on the template
* they were constructed from.
*/
-class V8_EXPORT TypeSwitch : public Data {
+class V8EXPORT TypeSwitch : public Data {
public:
static Local<TypeSwitch> New(Handle<FunctionTemplate> type);
static Local<TypeSwitch> New(int argc, Handle<FunctionTemplate> types[]);
@@ -3720,7 +3691,7 @@ class V8_EXPORT TypeSwitch : public Data {
// --- Extensions ---
-class V8_EXPORT ExternalAsciiStringResourceImpl
+class V8EXPORT ExternalAsciiStringResourceImpl
: public String::ExternalAsciiStringResource {
public:
ExternalAsciiStringResourceImpl() : data_(0), length_(0) {}
@@ -3737,7 +3708,7 @@ class V8_EXPORT ExternalAsciiStringResourceImpl
/**
* Ignore
*/
-class V8_EXPORT Extension { // NOLINT
+class V8EXPORT Extension { // NOLINT
public:
// Note that the strings passed into this constructor must live as long
// as the Extension itself.
@@ -3775,13 +3746,13 @@ class V8_EXPORT Extension { // NOLINT
};
-void V8_EXPORT RegisterExtension(Extension* extension);
+void V8EXPORT RegisterExtension(Extension* extension);
/**
* Ignore
*/
-class V8_EXPORT DeclareExtension {
+class V8EXPORT DeclareExtension {
public:
V8_INLINE(DeclareExtension(Extension* extension)) {
RegisterExtension(extension);
@@ -3792,10 +3763,10 @@ class V8_EXPORT DeclareExtension {
// --- Statics ---
-Handle<Primitive> V8_EXPORT Undefined();
-Handle<Primitive> V8_EXPORT Null();
-Handle<Boolean> V8_EXPORT True();
-Handle<Boolean> V8_EXPORT False();
+Handle<Primitive> V8EXPORT Undefined();
+Handle<Primitive> V8EXPORT Null();
+Handle<Boolean> V8EXPORT True();
+Handle<Boolean> V8EXPORT False();
V8_INLINE(Handle<Primitive> Undefined(Isolate* isolate));
V8_INLINE(Handle<Primitive> Null(Isolate* isolate));
@@ -3812,7 +3783,7 @@ V8_INLINE(Handle<Boolean> False(Isolate* isolate));
* setting the stack limit and you must set a non-default stack limit separately
* for each thread.
*/
-class V8_EXPORT ResourceConstraints {
+class V8EXPORT ResourceConstraints {
public:
ResourceConstraints();
int max_young_space_size() const { return max_young_space_size_; }
@@ -3832,7 +3803,7 @@ class V8_EXPORT ResourceConstraints {
};
-bool V8_EXPORT SetResourceConstraints(ResourceConstraints* constraints);
+bool V8EXPORT SetResourceConstraints(ResourceConstraints* constraints);
// --- Exceptions ---
@@ -3850,13 +3821,13 @@ typedef void (*MessageCallback)(Handle<Message> message, Handle<Value> error);
* operation; the caller must return immediately and only after the exception
* has been handled does it become legal to invoke JavaScript operations.
*/
-Handle<Value> V8_EXPORT ThrowException(Handle<Value> exception);
+Handle<Value> V8EXPORT ThrowException(Handle<Value> exception);
/**
* Create new error objects by calling the corresponding error object
* constructor with the message.
*/
-class V8_EXPORT Exception {
+class V8EXPORT Exception {
public:
static Local<Value> RangeError(Handle<String> message);
static Local<Value> ReferenceError(Handle<String> message);
@@ -3950,7 +3921,7 @@ typedef void (*GCCallback)();
* Instances of this class can be passed to v8::V8::HeapStatistics to
* get heap statistics from V8.
*/
-class V8_EXPORT HeapStatistics {
+class V8EXPORT HeapStatistics {
public:
HeapStatistics();
size_t total_heap_size() { return total_heap_size_; }
@@ -3982,13 +3953,13 @@ class RetainedObjectInfo;
* threads. An isolate can be entered by at most one thread at any
* given time. The Locker/Unlocker API must be used to synchronize.
*/
-class V8_EXPORT Isolate {
+class V8EXPORT Isolate {
public:
/**
* Stack-allocated class which sets the isolate for all operations
* executed within a local scope.
*/
- class V8_EXPORT Scope {
+ class V8EXPORT Scope {
public:
explicit Scope(Isolate* isolate) : isolate_(isolate) {
isolate->Enter();
@@ -4136,7 +4107,7 @@ class V8_EXPORT Isolate {
};
-class V8_EXPORT StartupData {
+class V8EXPORT StartupData {
public:
enum CompressionAlgorithm {
kUncompressed,
@@ -4157,7 +4128,7 @@ class V8_EXPORT StartupData {
*
* For an example of the class usage, see the "shell.cc" sample application.
*/
-class V8_EXPORT StartupDataDecompressor { // NOLINT
+class V8EXPORT StartupDataDecompressor { // NOLINT
public:
StartupDataDecompressor();
virtual ~StartupDataDecompressor();
@@ -4301,7 +4272,7 @@ typedef void (*JitCodeEventHandler)(const JitCodeEvent* event);
/**
* Interface for iterating through all external resources in the heap.
*/
-class V8_EXPORT ExternalResourceVisitor { // NOLINT
+class V8EXPORT ExternalResourceVisitor { // NOLINT
public:
virtual ~ExternalResourceVisitor() {}
virtual void VisitExternalString(Handle<String> string) {}
@@ -4311,7 +4282,7 @@ class V8_EXPORT ExternalResourceVisitor { // NOLINT
/**
* Interface for iterating through all the persistent handles in the heap.
*/
-class V8_EXPORT PersistentHandleVisitor { // NOLINT
+class V8EXPORT PersistentHandleVisitor { // NOLINT
public:
virtual ~PersistentHandleVisitor() {}
virtual void VisitPersistentHandle(Persistent<Value>* value,
@@ -4324,7 +4295,7 @@ class V8_EXPORT PersistentHandleVisitor { // NOLINT
* to be modified. Useful when otherwise unsafe handle operations need to
* be performed.
*/
-class V8_EXPORT AssertNoGCScope {
+class V8EXPORT AssertNoGCScope {
#ifndef DEBUG
// TODO(yangguo): remove isolate argument.
V8_INLINE(AssertNoGCScope(Isolate* isolate)) { }
@@ -4340,7 +4311,7 @@ class V8_EXPORT AssertNoGCScope {
/**
* Container class for static utility functions.
*/
-class V8_EXPORT V8 {
+class V8EXPORT V8 {
public:
/** Set the callback to invoke in case of fatal errors. */
static void SetFatalErrorHandler(FatalErrorCallback that);
@@ -4797,9 +4768,6 @@ class V8_EXPORT V8 {
void* data,
RevivableCallback weak_reference_callback);
static void ClearWeak(internal::Object** global_handle);
- static int Eternalize(internal::Isolate* isolate,
- internal::Object** handle);
- static internal::Object** GetEternal(internal::Isolate* isolate, int index);
template <class T> friend class Handle;
template <class T> friend class Local;
@@ -4811,7 +4779,7 @@ class V8_EXPORT V8 {
/**
* An external exception handler.
*/
-class V8_EXPORT TryCatch {
+class V8EXPORT TryCatch {
public:
/**
* Creates a new try/catch block and registers it with v8. Note that
@@ -4944,7 +4912,7 @@ class V8_EXPORT TryCatch {
/**
* Ignore
*/
-class V8_EXPORT ExtensionConfiguration {
+class V8EXPORT ExtensionConfiguration {
public:
ExtensionConfiguration(int name_count, const char* names[])
: name_count_(name_count), names_(names) { }
@@ -4959,7 +4927,7 @@ class V8_EXPORT ExtensionConfiguration {
* A sandboxed execution context with its own set of built-in objects
* and functions.
*/
-class V8_EXPORT Context {
+class V8EXPORT Context {
public:
/**
* Returns the global proxy object or global object itself for
@@ -5244,7 +5212,7 @@ class V8_EXPORT Context {
* // V8 Now no longer locked.
* \endcode
*/
-class V8_EXPORT Unlocker {
+class V8EXPORT Unlocker {
public:
/**
* Initialize Unlocker for a given Isolate.
@@ -5262,7 +5230,7 @@ class V8_EXPORT Unlocker {
};
-class V8_EXPORT Locker {
+class V8EXPORT Locker {
public:
/**
* Initialize Locker for a given Isolate.
@@ -5323,7 +5291,7 @@ struct HeapStatsUpdate;
/**
* An interface for exporting data from V8, using "push" model.
*/
-class V8_EXPORT OutputStream { // NOLINT
+class V8EXPORT OutputStream { // NOLINT
public:
enum OutputEncoding {
kAscii = 0 // 7-bit ASCII.
@@ -5360,7 +5328,7 @@ class V8_EXPORT OutputStream { // NOLINT
* An interface for reporting progress and controlling long-running
* activities.
*/
-class V8_EXPORT ActivityControl { // NOLINT
+class V8EXPORT ActivityControl { // NOLINT
public:
enum ControlOption {
kContinue = 0,
@@ -5483,7 +5451,7 @@ class Internals {
static const int kNullValueRootIndex = 7;
static const int kTrueValueRootIndex = 8;
static const int kFalseValueRootIndex = 9;
- static const int kEmptyStringRootIndex = 133;
+ static const int kEmptyStringRootIndex = 135;
static const int kNodeClassIdOffset = 1 * kApiPointerSize;
static const int kNodeFlagsOffset = 1 * kApiPointerSize + 3;
@@ -5544,14 +5512,14 @@ class Internals {
V8_INLINE(static uint8_t GetNodeFlag(internal::Object** obj, int shift)) {
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
- return *addr & static_cast<uint8_t>(1U << shift);
+ return *addr & (1 << shift);
}
V8_INLINE(static void UpdateNodeFlag(internal::Object** obj,
bool value, int shift)) {
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
- uint8_t mask = static_cast<uint8_t>(1 << shift);
- *addr = static_cast<uint8_t>((*addr & ~mask) | (value << shift));
+ uint8_t mask = 1 << shift;
+ *addr = (*addr & ~mask) | (value << shift);
}
V8_INLINE(static uint8_t GetNodeState(internal::Object** obj)) {
@@ -5562,7 +5530,7 @@ class Internals {
V8_INLINE(static void UpdateNodeState(internal::Object** obj,
uint8_t value)) {
uint8_t* addr = reinterpret_cast<uint8_t*>(obj) + kNodeFlagsOffset;
- *addr = static_cast<uint8_t>((*addr & ~kNodeStateMask) | value);
+ *addr = (*addr & ~kNodeStateMask) | value;
}
V8_INLINE(static void SetEmbedderData(v8::Isolate* isolate, void* data)) {
@@ -5663,21 +5631,6 @@ Local<T> Local<T>::New(Isolate* isolate, T* that) {
}
-template<class T>
-int Local<T>::Eternalize(Isolate* isolate) {
- return V8::Eternalize(reinterpret_cast<internal::Isolate*>(isolate),
- reinterpret_cast<internal::Object**>(this->val_));
-}
-
-
-template<class T>
-Local<T> Local<T>::GetEternal(Isolate* isolate, int index) {
- internal::Object** handle =
- V8::GetEternal(reinterpret_cast<internal::Isolate*>(isolate), index);
- return Local<T>(T::Cast(reinterpret_cast<Value*>(handle)));
-}
-
-
#ifdef V8_USE_UNSAFE_HANDLES
template <class T>
Persistent<T> Persistent<T>::New(Handle<T> that) {
@@ -5927,7 +5880,7 @@ void ReturnValue<T>::Set(uint32_t i) {
TYPE_CHECK(T, Integer);
typedef internal::Internals I;
// Can't simply use INT32_MAX here for whatever reason.
- bool fits_into_int32_t = (i & (1U << 31)) == 0;
+ bool fits_into_int32_t = (i & (1 << 31)) == 0;
if (V8_LIKELY(fits_into_int32_t)) {
Set(static_cast<int32_t>(i));
return;
@@ -6589,6 +6542,7 @@ void* Context::GetAlignedPointerFromEmbedderData(int index) {
} // namespace v8
+#undef V8EXPORT
#undef TYPE_CHECK
diff --git a/chromium/v8/src/api.cc b/chromium/v8/src/api.cc
index eb2ffcff180..7b2524cc4d7 100644
--- a/chromium/v8/src/api.cc
+++ b/chromium/v8/src/api.cc
@@ -46,7 +46,6 @@
#include "heap-profiler.h"
#include "heap-snapshot-generator-inl.h"
#include "icu_util.h"
-#include "json-parser.h"
#include "messages.h"
#ifdef COMPRESS_STARTUP_DATA_BZ2
#include "natives.h"
@@ -676,16 +675,6 @@ void V8::DisposeGlobal(i::Object** obj) {
}
-int V8::Eternalize(i::Isolate* isolate, i::Object** handle) {
- return isolate->eternal_handles()->Create(isolate, *handle);
-}
-
-
-i::Object** V8::GetEternal(i::Isolate* isolate, int index) {
- return isolate->eternal_handles()->Get(index).location();
-}
-
-
// --- H a n d l e s ---
@@ -781,6 +770,7 @@ void Context::Exit() {
i::Context* last_context =
isolate->handle_scope_implementer()->RestoreContext();
isolate->set_context(last_context);
+ isolate->set_context_exit_happened(true);
}
@@ -2617,29 +2607,6 @@ bool StackFrame::IsConstructor() const {
}
-// --- J S O N ---
-
-Local<Value> JSON::Parse(Local<String> json_string) {
- i::Isolate* isolate = i::Isolate::Current();
- EnsureInitializedForIsolate(isolate, "v8::JSON::Parse");
- ENTER_V8(isolate);
- i::HandleScope scope(isolate);
- i::Handle<i::String> source = i::Handle<i::String>(
- FlattenGetString(Utils::OpenHandle(*json_string)));
- EXCEPTION_PREAMBLE(isolate);
- i::Handle<i::Object> result;
- if (source->IsSeqOneByteString()) {
- result = i::JsonParser<true>::Parse(source);
- } else {
- result = i::JsonParser<false>::Parse(source);
- }
- has_pending_exception = result.is_null();
- EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>());
- return Utils::ToLocal(
- i::Handle<i::Object>::cast(scope.CloseAndEscape(result)));
-}
-
-
// --- D a t a ---
bool Value::FullIsUndefined() const {
@@ -7477,6 +7444,8 @@ Handle<String> CpuProfileNode::GetFunctionName() const {
int CpuProfileNode::GetScriptId() const {
+ i::Isolate* isolate = i::Isolate::Current();
+ IsDeadCheck(isolate, "v8::CpuProfileNode::GetScriptId");
const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this);
const i::CodeEntry* entry = node->entry();
return entry->script_id();
@@ -7493,6 +7462,8 @@ Handle<String> CpuProfileNode::GetScriptResourceName() const {
int CpuProfileNode::GetLineNumber() const {
+ i::Isolate* isolate = i::Isolate::Current();
+ IsDeadCheck(isolate, "v8::CpuProfileNode::GetLineNumber");
return reinterpret_cast<const i::ProfileNode*>(this)->entry()->line_number();
}
@@ -7525,12 +7496,9 @@ double CpuProfileNode::GetSelfSamplesCount() const {
}
-unsigned CpuProfileNode::GetHitCount() const {
- return reinterpret_cast<const i::ProfileNode*>(this)->self_ticks();
-}
-
-
unsigned CpuProfileNode::GetCallUid() const {
+ i::Isolate* isolate = i::Isolate::Current();
+ IsDeadCheck(isolate, "v8::CpuProfileNode::GetCallUid");
return reinterpret_cast<const i::ProfileNode*>(this)->entry()->GetCallUid();
}
@@ -7541,11 +7509,15 @@ unsigned CpuProfileNode::GetNodeId() const {
int CpuProfileNode::GetChildrenCount() const {
+ i::Isolate* isolate = i::Isolate::Current();
+ IsDeadCheck(isolate, "v8::CpuProfileNode::GetChildrenCount");
return reinterpret_cast<const i::ProfileNode*>(this)->children()->length();
}
const CpuProfileNode* CpuProfileNode::GetChild(int index) const {
+ i::Isolate* isolate = i::Isolate::Current();
+ IsDeadCheck(isolate, "v8::CpuProfileNode::GetChild");
const i::ProfileNode* child =
reinterpret_cast<const i::ProfileNode*>(this)->children()->at(index);
return reinterpret_cast<const CpuProfileNode*>(child);
@@ -7566,6 +7538,8 @@ void CpuProfile::Delete() {
unsigned CpuProfile::GetUid() const {
+ i::Isolate* isolate = i::Isolate::Current();
+ IsDeadCheck(isolate, "v8::CpuProfile::GetUid");
return reinterpret_cast<const i::CpuProfile*>(this)->uid();
}
@@ -7580,6 +7554,8 @@ Handle<String> CpuProfile::GetTitle() const {
const CpuProfileNode* CpuProfile::GetTopDownRoot() const {
+ i::Isolate* isolate = i::Isolate::Current();
+ IsDeadCheck(isolate, "v8::CpuProfile::GetTopDownRoot");
const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this);
return reinterpret_cast<const CpuProfileNode*>(profile->top_down()->root());
}
@@ -7637,19 +7613,6 @@ void CpuProfiler::DeleteAllCpuProfiles() {
}
-void CpuProfiler::SetIdle(bool is_idle) {
- i::Isolate* isolate = reinterpret_cast<i::CpuProfiler*>(this)->isolate();
- i::StateTag state = isolate->current_vm_state();
- ASSERT(state == i::EXTERNAL || state == i::IDLE);
- if (isolate->js_entry_sp() != NULL) return;
- if (is_idle) {
- isolate->set_current_vm_state(i::IDLE);
- } else if (state == i::IDLE) {
- isolate->set_current_vm_state(i::EXTERNAL);
- }
-}
-
-
static i::HeapGraphEdge* ToInternal(const HeapGraphEdge* edge) {
return const_cast<i::HeapGraphEdge*>(
reinterpret_cast<const i::HeapGraphEdge*>(edge));
diff --git a/chromium/v8/src/arm/builtins-arm.cc b/chromium/v8/src/arm/builtins-arm.cc
index 5f3a999f561..eff47e2692b 100644
--- a/chromium/v8/src/arm/builtins-arm.cc
+++ b/chromium/v8/src/arm/builtins-arm.cc
@@ -119,9 +119,9 @@ void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) {
// Initial map for the builtin InternalArray functions should be maps.
__ ldr(r2, FieldMemOperand(r1, JSFunction::kPrototypeOrInitialMapOffset));
__ SmiTst(r2);
- __ Assert(ne, kUnexpectedInitialMapForInternalArrayFunction);
+ __ Assert(ne, "Unexpected initial map for InternalArray function");
__ CompareObjectType(r2, r3, r4, MAP_TYPE);
- __ Assert(eq, kUnexpectedInitialMapForInternalArrayFunction);
+ __ Assert(eq, "Unexpected initial map for InternalArray function");
}
// Run the native code for the InternalArray function called as a normal
@@ -147,9 +147,9 @@ void Builtins::Generate_ArrayCode(MacroAssembler* masm) {
// Initial map for the builtin Array functions should be maps.
__ ldr(r2, FieldMemOperand(r1, JSFunction::kPrototypeOrInitialMapOffset));
__ SmiTst(r2);
- __ Assert(ne, kUnexpectedInitialMapForArrayFunction);
+ __ Assert(ne, "Unexpected initial map for Array function");
__ CompareObjectType(r2, r3, r4, MAP_TYPE);
- __ Assert(eq, kUnexpectedInitialMapForArrayFunction);
+ __ Assert(eq, "Unexpected initial map for Array function");
}
// Run the native code for the Array function called as a normal function.
@@ -178,7 +178,7 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) {
if (FLAG_debug_code) {
__ LoadGlobalFunction(Context::STRING_FUNCTION_INDEX, r2);
__ cmp(function, Operand(r2));
- __ Assert(eq, kUnexpectedStringFunction);
+ __ Assert(eq, "Unexpected String function");
}
// Load the first arguments in r0 and get rid of the rest.
@@ -224,10 +224,10 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) {
if (FLAG_debug_code) {
__ ldrb(r4, FieldMemOperand(map, Map::kInstanceSizeOffset));
__ cmp(r4, Operand(JSValue::kSize >> kPointerSizeLog2));
- __ Assert(eq, kUnexpectedStringWrapperInstanceSize);
+ __ Assert(eq, "Unexpected string wrapper instance size");
__ ldrb(r4, FieldMemOperand(map, Map::kUnusedPropertyFieldsOffset));
__ cmp(r4, Operand::Zero());
- __ Assert(eq, kUnexpectedUnusedPropertiesOfStringWrapper);
+ __ Assert(eq, "Unexpected unused properties of string wrapper");
}
__ str(map, FieldMemOperand(r0, HeapObject::kMapOffset));
@@ -471,7 +471,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
// r0: offset of first field after pre-allocated fields
if (FLAG_debug_code) {
__ cmp(r0, r6);
- __ Assert(le, kUnexpectedNumberOfPreAllocatedPropertyFields);
+ __ Assert(le, "Unexpected number of pre-allocated property fields.");
}
__ InitializeFieldsWithFiller(r5, r0, r7);
// To allow for truncation.
@@ -503,7 +503,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
// Done if no extra properties are to be allocated.
__ b(eq, &allocated);
- __ Assert(pl, kPropertyAllocationCountFailed);
+ __ Assert(pl, "Property allocation count failed.");
// Scale the number of elements by pointer size and add the header for
// FixedArrays to the start of the next object calculation from above.
@@ -547,7 +547,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
} else if (FLAG_debug_code) {
__ LoadRoot(r8, Heap::kUndefinedValueRootIndex);
__ cmp(r7, r8);
- __ Assert(eq, kUndefinedValueNotLoaded);
+ __ Assert(eq, "Undefined value not loaded.");
}
__ b(&entry);
__ bind(&loop);
diff --git a/chromium/v8/src/arm/code-stubs-arm.cc b/chromium/v8/src/arm/code-stubs-arm.cc
index 98a835fd1a5..ba98b963153 100644
--- a/chromium/v8/src/arm/code-stubs-arm.cc
+++ b/chromium/v8/src/arm/code-stubs-arm.cc
@@ -246,6 +246,17 @@ void InternalArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor(
}
+void UnaryOpStub::InitializeInterfaceDescriptor(
+ Isolate* isolate,
+ CodeStubInterfaceDescriptor* descriptor) {
+ static Register registers[] = { r0 };
+ descriptor->register_param_count_ = 1;
+ descriptor->register_params_ = registers;
+ descriptor->deoptimization_handler_ =
+ FUNCTION_ADDR(UnaryOpIC_Miss);
+}
+
+
void StoreGlobalStub::InitializeInterfaceDescriptor(
Isolate* isolate,
CodeStubInterfaceDescriptor* descriptor) {
@@ -509,8 +520,9 @@ void FastNewBlockContextStub::Generate(MacroAssembler* masm) {
Label after_sentinel;
__ JumpIfNotSmi(r3, &after_sentinel);
if (FLAG_debug_code) {
+ const char* message = "Expected 0 as a Smi sentinel";
__ cmp(r3, Operand::Zero());
- __ Assert(eq, kExpected0AsASmiSentinel);
+ __ Assert(eq, message);
}
__ ldr(r3, GlobalObjectOperand());
__ ldr(r3, FieldMemOperand(r3, GlobalObject::kNativeContextOffset));
@@ -3905,9 +3917,9 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
__ ldr(regexp_data, FieldMemOperand(r0, JSRegExp::kDataOffset));
if (FLAG_debug_code) {
__ SmiTst(regexp_data);
- __ Check(ne, kUnexpectedTypeForRegExpDataFixedArrayExpected);
+ __ Check(ne, "Unexpected type for RegExp data, FixedArray expected");
__ CompareObjectType(regexp_data, r0, r0, FIXED_ARRAY_TYPE);
- __ Check(eq, kUnexpectedTypeForRegExpDataFixedArrayExpected);
+ __ Check(eq, "Unexpected type for RegExp data, FixedArray expected");
}
// regexp_data: RegExp data (FixedArray)
@@ -4249,7 +4261,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
// Assert that we do not have a cons or slice (indirect strings) here.
// Sequential strings have already been ruled out.
__ tst(r0, Operand(kIsIndirectStringMask));
- __ Assert(eq, kExternalStringExpectedButNotFound);
+ __ Assert(eq, "external string expected, but not found");
}
__ ldr(subject,
FieldMemOperand(subject, ExternalString::kResourceDataOffset));
@@ -4631,7 +4643,7 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) {
void StringCharCodeAtGenerator::GenerateSlow(
MacroAssembler* masm,
const RuntimeCallHelper& call_helper) {
- __ Abort(kUnexpectedFallthroughToCharCodeAtSlowCase);
+ __ Abort("Unexpected fallthrough to CharCodeAt slow case");
// Index is not a smi.
__ bind(&index_not_smi_);
@@ -4676,7 +4688,7 @@ void StringCharCodeAtGenerator::GenerateSlow(
call_helper.AfterCall(masm);
__ jmp(&exit_);
- __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase);
+ __ Abort("Unexpected fallthrough from CharCodeAt slow case");
}
@@ -4706,7 +4718,7 @@ void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) {
void StringCharFromCodeGenerator::GenerateSlow(
MacroAssembler* masm,
const RuntimeCallHelper& call_helper) {
- __ Abort(kUnexpectedFallthroughToCharFromCodeSlowCase);
+ __ Abort("Unexpected fallthrough to CharFromCode slow case");
__ bind(&slow_case_);
call_helper.BeforeCall(masm);
@@ -4716,7 +4728,7 @@ void StringCharFromCodeGenerator::GenerateSlow(
call_helper.AfterCall(masm);
__ jmp(&exit_);
- __ Abort(kUnexpectedFallthroughFromCharFromCodeSlowCase);
+ __ Abort("Unexpected fallthrough from CharFromCode slow case");
}
@@ -4773,7 +4785,7 @@ void StringHelper::GenerateCopyCharactersLong(MacroAssembler* masm,
// Check that destination is actually word aligned if the flag says
// that it is.
__ tst(dest, Operand(kPointerAlignmentMask));
- __ Check(eq, kDestinationOfCopyNotAligned);
+ __ Check(eq, "Destination of copy not aligned.");
}
const int kReadAlignment = 4;
@@ -5002,7 +5014,7 @@ void StringHelper::GenerateTwoCharacterStringTableProbe(MacroAssembler* masm,
if (FLAG_debug_code) {
__ LoadRoot(ip, Heap::kTheHoleValueRootIndex);
__ cmp(ip, candidate);
- __ Assert(eq, kOddballInStringTableIsNotUndefinedOrTheHole);
+ __ Assert(eq, "oddball in string table is not undefined or the hole");
}
__ jmp(&next_probe[i]);
@@ -6900,7 +6912,7 @@ static void CreateArrayDispatch(MacroAssembler* masm) {
}
// If we reached this point there is a problem.
- __ Abort(kUnexpectedElementsKindInArrayConstructor);
+ __ Abort("Unexpected ElementsKind in array constructor");
}
@@ -6957,7 +6969,7 @@ static void CreateArrayDispatchOneArgument(MacroAssembler* masm) {
}
// If we reached this point there is a problem.
- __ Abort(kUnexpectedElementsKindInArrayConstructor);
+ __ Abort("Unexpected ElementsKind in array constructor");
}
@@ -7018,9 +7030,9 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
__ ldr(r3, FieldMemOperand(r1, JSFunction::kPrototypeOrInitialMapOffset));
// Will both indicate a NULL and a Smi.
__ tst(r3, Operand(kSmiTagMask));
- __ Assert(ne, kUnexpectedInitialMapForArrayFunction);
+ __ Assert(ne, "Unexpected initial map for Array function");
__ CompareObjectType(r3, r3, r4, MAP_TYPE);
- __ Assert(eq, kUnexpectedInitialMapForArrayFunction);
+ __ Assert(eq, "Unexpected initial map for Array function");
// We should either have undefined in ebx or a valid cell
Label okay_here;
@@ -7029,7 +7041,7 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
__ b(eq, &okay_here);
__ ldr(r3, FieldMemOperand(r2, 0));
__ cmp(r3, Operand(cell_map));
- __ Assert(eq, kExpectedPropertyCellInRegisterEbx);
+ __ Assert(eq, "Expected property cell in register ebx");
__ bind(&okay_here);
}
@@ -7132,9 +7144,9 @@ void InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
__ ldr(r3, FieldMemOperand(r1, JSFunction::kPrototypeOrInitialMapOffset));
// Will both indicate a NULL and a Smi.
__ tst(r3, Operand(kSmiTagMask));
- __ Assert(ne, kUnexpectedInitialMapForArrayFunction);
+ __ Assert(ne, "Unexpected initial map for Array function");
__ CompareObjectType(r3, r3, r4, MAP_TYPE);
- __ Assert(eq, kUnexpectedInitialMapForArrayFunction);
+ __ Assert(eq, "Unexpected initial map for Array function");
}
// Figure out the right elements kind
@@ -7151,7 +7163,7 @@ void InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
__ b(eq, &done);
__ cmp(r3, Operand(FAST_HOLEY_ELEMENTS));
__ Assert(eq,
- kInvalidElementsKindForInternalArrayOrInternalPackedArray);
+ "Invalid ElementsKind for InternalArray or InternalPackedArray");
__ bind(&done);
}
diff --git a/chromium/v8/src/arm/codegen-arm.cc b/chromium/v8/src/arm/codegen-arm.cc
index 1bcf3e3a605..7559373ee9a 100644
--- a/chromium/v8/src/arm/codegen-arm.cc
+++ b/chromium/v8/src/arm/codegen-arm.cc
@@ -532,7 +532,7 @@ void ElementsTransitionGenerator::GenerateSmiToDouble(
__ SmiTag(r9);
__ orr(r9, r9, Operand(1));
__ CompareRoot(r9, Heap::kTheHoleValueRootIndex);
- __ Assert(eq, kObjectFoundInSmiOnlyArray);
+ __ Assert(eq, "object found in smi-only array");
}
__ Strd(r4, r5, MemOperand(r7, 8, PostIndex));
@@ -728,7 +728,7 @@ void StringCharLoadGenerator::Generate(MacroAssembler* masm,
// Assert that we do not have a cons or slice (indirect strings) here.
// Sequential strings have already been ruled out.
__ tst(result, Operand(kIsIndirectStringMask));
- __ Assert(eq, kExternalStringExpectedButNotFound);
+ __ Assert(eq, "external string expected, but not found");
}
// Rule out short external strings.
STATIC_CHECK(kShortExternalStringTag != 0);
diff --git a/chromium/v8/src/arm/debug-arm.cc b/chromium/v8/src/arm/debug-arm.cc
index 108435f0a9f..7faea08034b 100644
--- a/chromium/v8/src/arm/debug-arm.cc
+++ b/chromium/v8/src/arm/debug-arm.cc
@@ -130,7 +130,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm,
if ((non_object_regs & (1 << r)) != 0) {
if (FLAG_debug_code) {
__ tst(reg, Operand(0xc0000000));
- __ Assert(eq, kUnableToEncodeValueAsSmi);
+ __ Assert(eq, "Unable to encode value as smi");
}
__ SmiTag(reg);
}
@@ -313,12 +313,12 @@ void Debug::GenerateSlotDebugBreak(MacroAssembler* masm) {
void Debug::GeneratePlainReturnLiveEdit(MacroAssembler* masm) {
- masm->Abort(kLiveEditFrameDroppingIsNotSupportedOnArm);
+ masm->Abort("LiveEdit frame dropping is not supported on arm");
}
void Debug::GenerateFrameDropperLiveEdit(MacroAssembler* masm) {
- masm->Abort(kLiveEditFrameDroppingIsNotSupportedOnArm);
+ masm->Abort("LiveEdit frame dropping is not supported on arm");
}
const bool Debug::kFrameDropperSupported = false;
diff --git a/chromium/v8/src/arm/full-codegen-arm.cc b/chromium/v8/src/arm/full-codegen-arm.cc
index b73006a17d9..ea7b73f2fe9 100644
--- a/chromium/v8/src/arm/full-codegen-arm.cc
+++ b/chromium/v8/src/arm/full-codegen-arm.cc
@@ -786,9 +786,9 @@ void FullCodeGenerator::EmitDebugCheckDeclarationContext(Variable* variable) {
// Check that we're not inside a with or catch context.
__ ldr(r1, FieldMemOperand(cp, HeapObject::kMapOffset));
__ CompareRoot(r1, Heap::kWithContextMapRootIndex);
- __ Check(ne, kDeclarationInWithContext);
+ __ Check(ne, "Declaration in with context.");
__ CompareRoot(r1, Heap::kCatchContextMapRootIndex);
- __ Check(ne, kDeclarationInCatchContext);
+ __ Check(ne, "Declaration in catch context.");
}
}
@@ -2512,7 +2512,7 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
// Check for an uninitialized let binding.
__ ldr(r2, location);
__ CompareRoot(r2, Heap::kTheHoleValueRootIndex);
- __ Check(eq, kLetBindingReInitialization);
+ __ Check(eq, "Let binding re-initialization.");
}
// Perform the assignment.
__ str(r0, location);
@@ -3473,23 +3473,23 @@ void FullCodeGenerator::EmitSeqStringSetCharCheck(Register string,
Register value,
uint32_t encoding_mask) {
__ SmiTst(index);
- __ Check(eq, kNonSmiIndex);
+ __ Check(eq, "Non-smi index");
__ SmiTst(value);
- __ Check(eq, kNonSmiValue);
+ __ Check(eq, "Non-smi value");
__ ldr(ip, FieldMemOperand(string, String::kLengthOffset));
__ cmp(index, ip);
- __ Check(lt, kIndexIsTooLarge);
+ __ Check(lt, "Index is too large");
__ cmp(index, Operand(Smi::FromInt(0)));
- __ Check(ge, kIndexIsNegative);
+ __ Check(ge, "Index is negative");
__ ldr(ip, FieldMemOperand(string, HeapObject::kMapOffset));
__ ldrb(ip, FieldMemOperand(ip, Map::kInstanceTypeOffset));
__ and_(ip, ip, Operand(kStringRepresentationMask | kStringEncodingMask));
__ cmp(ip, Operand(encoding_mask));
- __ Check(eq, kUnexpectedStringType);
+ __ Check(eq, "Unexpected string type");
}
@@ -3849,7 +3849,7 @@ void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) {
Handle<FixedArray> jsfunction_result_caches(
isolate()->native_context()->jsfunction_result_caches());
if (jsfunction_result_caches->length() <= cache_id) {
- __ Abort(kAttemptToUseUndefinedCache);
+ __ Abort("Attempt to use undefined cache.");
__ LoadRoot(r0, Heap::kUndefinedValueRootIndex);
context()->Plug(r0);
return;
@@ -4030,7 +4030,7 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
// elements_end: Array end.
if (generate_debug_code_) {
__ cmp(array_length, Operand::Zero());
- __ Assert(gt, kNoEmptyArraysHereInEmitFastAsciiArrayJoin);
+ __ Assert(gt, "No empty arrays here in EmitFastAsciiArrayJoin");
}
__ bind(&loop);
__ ldr(string, MemOperand(element, kPointerSize, PostIndex));
@@ -4349,12 +4349,35 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
break;
}
+ case Token::SUB:
+ EmitUnaryOperation(expr, "[ UnaryOperation (SUB)");
+ break;
+
+ case Token::BIT_NOT:
+ EmitUnaryOperation(expr, "[ UnaryOperation (BIT_NOT)");
+ break;
+
default:
UNREACHABLE();
}
}
+void FullCodeGenerator::EmitUnaryOperation(UnaryOperation* expr,
+ const char* comment) {
+ // TODO(svenpanne): Allowing format strings in Comment would be nice here...
+ Comment cmt(masm_, comment);
+ UnaryOpStub stub(expr->op());
+ // UnaryOpStub expects the argument to be in the
+ // accumulator register r0.
+ VisitForAccumulatorValue(expr->expression());
+ SetSourcePosition(expr->position());
+ CallIC(stub.GetCode(isolate()), RelocInfo::CODE_TARGET,
+ expr->UnaryOperationFeedbackId());
+ context()->Plug(r0);
+}
+
+
void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
Comment cmnt(masm_, "[ CountOperation");
SetSourcePosition(expr->position());
diff --git a/chromium/v8/src/arm/lithium-arm.cc b/chromium/v8/src/arm/lithium-arm.cc
index 998b73b62e9..e9ae04a1ee8 100644
--- a/chromium/v8/src/arm/lithium-arm.cc
+++ b/chromium/v8/src/arm/lithium-arm.cc
@@ -437,7 +437,7 @@ LPlatformChunk* LChunkBuilder::Build() {
}
-void LChunkBuilder::Abort(BailoutReason reason) {
+void LChunkBuilder::Abort(const char* reason) {
info()->set_bailout_reason(reason);
status_ = ABORTED;
}
@@ -593,10 +593,8 @@ LInstruction* LChunkBuilder::DefineFixedDouble(
LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
HEnvironment* hydrogen_env = current_block_->last_environment();
int argument_index_accumulator = 0;
- ZoneList<HValue*> objects_to_materialize(0, zone());
instr->set_environment(CreateEnvironment(hydrogen_env,
- &argument_index_accumulator,
- &objects_to_materialize));
+ &argument_index_accumulator));
return instr;
}
@@ -647,7 +645,7 @@ LUnallocated* LChunkBuilder::TempRegister() {
new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
int vreg = allocator_->GetVirtualRegister();
if (!allocator_->AllocationOk()) {
- Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
+ Abort("Out of virtual registers while trying to allocate temp register.");
vreg = 0;
}
operand->set_virtual_register(vreg);
@@ -885,7 +883,6 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
}
#endif
- instr->set_position(position_);
if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
instr = AssignPointerMap(instr);
}
@@ -901,13 +898,11 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
LEnvironment* LChunkBuilder::CreateEnvironment(
HEnvironment* hydrogen_env,
- int* argument_index_accumulator,
- ZoneList<HValue*>* objects_to_materialize) {
+ int* argument_index_accumulator) {
if (hydrogen_env == NULL) return NULL;
- LEnvironment* outer = CreateEnvironment(hydrogen_env->outer(),
- argument_index_accumulator,
- objects_to_materialize);
+ LEnvironment* outer =
+ CreateEnvironment(hydrogen_env->outer(), argument_index_accumulator);
BailoutId ast_id = hydrogen_env->ast_id();
ASSERT(!ast_id.IsNone() ||
hydrogen_env->frame_type() != JS_FUNCTION);
@@ -922,16 +917,16 @@ LEnvironment* LChunkBuilder::CreateEnvironment(
outer,
hydrogen_env->entry(),
zone());
+ bool needs_arguments_object_materialization = false;
int argument_index = *argument_index_accumulator;
- int object_index = objects_to_materialize->length();
for (int i = 0; i < hydrogen_env->length(); ++i) {
if (hydrogen_env->is_special_index(i)) continue;
- LOperand* op;
HValue* value = hydrogen_env->values()->at(i);
- if (value->IsArgumentsObject() || value->IsCapturedObject()) {
- objects_to_materialize->Add(value, zone());
- op = LEnvironment::materialization_marker();
+ LOperand* op = NULL;
+ if (value->IsArgumentsObject()) {
+ needs_arguments_object_materialization = true;
+ op = NULL;
} else if (value->IsPushArgument()) {
op = new(zone()) LArgument(argument_index++);
} else {
@@ -942,33 +937,15 @@ LEnvironment* LChunkBuilder::CreateEnvironment(
value->CheckFlag(HInstruction::kUint32));
}
- for (int i = object_index; i < objects_to_materialize->length(); ++i) {
- HValue* object_to_materialize = objects_to_materialize->at(i);
- int previously_materialized_object = -1;
- for (int prev = 0; prev < i; ++prev) {
- if (objects_to_materialize->at(prev) == objects_to_materialize->at(i)) {
- previously_materialized_object = prev;
- break;
- }
- }
- int length = object_to_materialize->OperandCount();
- bool is_arguments = object_to_materialize->IsArgumentsObject();
- if (previously_materialized_object >= 0) {
- result->AddDuplicateObject(previously_materialized_object);
- continue;
- } else {
- result->AddNewObject(is_arguments ? length - 1 : length, is_arguments);
- }
- for (int i = is_arguments ? 1 : 0; i < length; ++i) {
- LOperand* op;
- HValue* value = object_to_materialize->OperandAt(i);
- if (value->IsArgumentsObject() || value->IsCapturedObject()) {
- objects_to_materialize->Add(value, zone());
- op = LEnvironment::materialization_marker();
- } else {
- ASSERT(!value->IsPushArgument());
- op = UseAny(value);
- }
+ if (needs_arguments_object_materialization) {
+ HArgumentsObject* arguments = hydrogen_env->entry() == NULL
+ ? graph()->GetArgumentsObject()
+ : hydrogen_env->entry()->arguments_object();
+ ASSERT(arguments->IsLinked());
+ for (int i = 1; i < arguments->arguments_count(); ++i) {
+ HValue* value = arguments->arguments_values()->at(i);
+ ASSERT(!value->IsArgumentsObject() && !value->IsPushArgument());
+ LOperand* op = UseAny(value);
result->AddValue(op,
value->representation(),
value->CheckFlag(HInstruction::kUint32));
@@ -1348,6 +1325,15 @@ LInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
}
+LInstruction* LChunkBuilder::DoBitNot(HBitNot* instr) {
+ ASSERT(instr->value()->representation().IsInteger32());
+ ASSERT(instr->representation().IsInteger32());
+ if (instr->HasNoUses()) return NULL;
+ LOperand* value = UseRegisterAtStart(instr->value());
+ return DefineAsRegister(new(zone()) LBitNotI(value));
+}
+
+
LInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
if (instr->representation().IsDouble()) {
return DoArithmeticD(Token::DIV, instr);
@@ -1709,8 +1695,9 @@ LInstruction* LChunkBuilder::DoCompareNumericAndBranch(
HCompareNumericAndBranch* instr) {
Representation r = instr->representation();
if (r.IsSmiOrInteger32()) {
- ASSERT(instr->left()->representation().Equals(r));
- ASSERT(instr->right()->representation().Equals(r));
+ ASSERT(instr->left()->representation().IsSmiOrInteger32());
+ ASSERT(instr->left()->representation().Equals(
+ instr->right()->representation()));
LOperand* left = UseRegisterOrConstantAtStart(instr->left());
LOperand* right = UseRegisterOrConstantAtStart(instr->right());
return new(zone()) LCompareNumericAndBranch(left, right);
@@ -1733,13 +1720,6 @@ LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
}
-LInstruction* LChunkBuilder::DoCompareHoleAndBranch(
- HCompareHoleAndBranch* instr) {
- LOperand* object = UseRegisterAtStart(instr->object());
- return new(zone()) LCmpHoleAndBranch(object);
-}
-
-
LInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
ASSERT(instr->value()->representation().IsTagged());
LOperand* value = UseRegisterAtStart(instr->value());
@@ -1852,6 +1832,17 @@ LInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
}
+LInstruction* LChunkBuilder::DoNumericConstraint(HNumericConstraint* instr) {
+ return NULL;
+}
+
+
+LInstruction* LChunkBuilder::DoInductionVariableAnnotation(
+ HInductionVariableAnnotation* instr) {
+ return NULL;
+}
+
+
LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
LOperand* value = UseRegisterOrConstantAtStart(instr->index());
LOperand* length = UseRegister(instr->length());
@@ -2025,6 +2016,19 @@ LInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
}
+LInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) {
+ LUnallocated* temp1 = NULL;
+ LOperand* temp2 = NULL;
+ if (!instr->CanOmitPrototypeChecks()) {
+ temp1 = TempRegister();
+ temp2 = TempRegister();
+ }
+ LCheckPrototypeMaps* result = new(zone()) LCheckPrototypeMaps(temp1, temp2);
+ if (instr->CanOmitPrototypeChecks()) return result;
+ return AssignEnvironment(result);
+}
+
+
LInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) {
LOperand* value = UseRegisterAtStart(instr->value());
return AssignEnvironment(new(zone()) LCheckFunction(value));
@@ -2033,16 +2037,10 @@ LInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) {
LInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
LOperand* value = NULL;
- if (!instr->CanOmitMapChecks()) {
- value = UseRegisterAtStart(instr->value());
- if (instr->has_migration_target()) info()->MarkAsDeferredCalling();
- }
- LCheckMaps* result = new(zone()) LCheckMaps(value);
- if (!instr->CanOmitMapChecks()) {
- AssignEnvironment(result);
- if (instr->has_migration_target()) return AssignPointerMap(result);
- }
- return result;
+ if (!instr->CanOmitMapChecks()) value = UseRegisterAtStart(instr->value());
+ LInstruction* result = new(zone()) LCheckMaps(value);
+ if (instr->CanOmitMapChecks()) return result;
+ return AssignEnvironment(result);
}
@@ -2153,6 +2151,23 @@ LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
}
+LInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic(
+ HLoadNamedFieldPolymorphic* instr) {
+ ASSERT(instr->representation().IsTagged());
+ if (instr->need_generic()) {
+ LOperand* obj = UseFixed(instr->object(), r0);
+ LLoadNamedFieldPolymorphic* result =
+ new(zone()) LLoadNamedFieldPolymorphic(obj);
+ return MarkAsCall(DefineFixed(result, r0), instr);
+ } else {
+ LOperand* obj = UseRegisterAtStart(instr->object());
+ LLoadNamedFieldPolymorphic* result =
+ new(zone()) LLoadNamedFieldPolymorphic(obj);
+ return AssignEnvironment(DefineAsRegister(result));
+ }
+}
+
+
LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
LOperand* object = UseFixed(instr->object(), r0);
LInstruction* result = DefineFixed(new(zone()) LLoadNamedGeneric(object), r0);
@@ -2307,7 +2322,7 @@ LInstruction* LChunkBuilder::DoTrapAllocationMemento(
LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
bool is_in_object = instr->access().IsInobject();
bool needs_write_barrier = instr->NeedsWriteBarrier();
- bool needs_write_barrier_for_map = instr->has_transition() &&
+ bool needs_write_barrier_for_map = !instr->transition().is_null() &&
instr->NeedsWriteBarrierForMap();
LOperand* obj;
@@ -2427,7 +2442,7 @@ LInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
int spill_index = chunk()->GetNextSpillIndex(false); // Not double-width.
if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
- Abort(kTooManySpillSlotsNeededForOSR);
+ Abort("Too many spill slots needed for OSR");
spill_index = 0;
}
return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
@@ -2449,12 +2464,6 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
}
-LInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
- // There are no real uses of a captured object.
- return NULL;
-}
-
-
LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
info()->MarkAsRequiresFrame();
LOperand* args = UseRegister(instr->arguments());
diff --git a/chromium/v8/src/arm/lithium-arm.h b/chromium/v8/src/arm/lithium-arm.h
index d81dc0f57cd..c568ad6f95e 100644
--- a/chromium/v8/src/arm/lithium-arm.h
+++ b/chromium/v8/src/arm/lithium-arm.h
@@ -50,6 +50,7 @@ class LCodeGen;
V(ArithmeticD) \
V(ArithmeticT) \
V(BitI) \
+ V(BitNotI) \
V(BoundsCheck) \
V(Branch) \
V(CallConstantFunction) \
@@ -67,6 +68,7 @@ class LCodeGen;
V(CheckNonSmi) \
V(CheckMaps) \
V(CheckMapValue) \
+ V(CheckPrototypeMaps) \
V(CheckSmi) \
V(ClampDToUint8) \
V(ClampIToUint8) \
@@ -74,7 +76,6 @@ class LCodeGen;
V(ClassOfTestAndBranch) \
V(CompareNumericAndBranch) \
V(CmpObjectEqAndBranch) \
- V(CmpHoleAndBranch) \
V(CmpMapAndBranch) \
V(CmpT) \
V(ConstantD) \
@@ -127,6 +128,7 @@ class LCodeGen;
V(LoadKeyed) \
V(LoadKeyedGeneric) \
V(LoadNamedField) \
+ V(LoadNamedFieldPolymorphic) \
V(LoadNamedGeneric) \
V(MapEnumLength) \
V(MathAbs) \
@@ -208,12 +210,9 @@ class LCodeGen;
class LInstruction: public ZoneObject {
public:
LInstruction()
- : environment_(NULL),
- hydrogen_value_(NULL),
- bit_field_(IsCallBits::encode(false)) {
- set_position(RelocInfo::kNoPosition);
- }
-
+ : environment_(NULL),
+ hydrogen_value_(NULL),
+ is_call_(false) { }
virtual ~LInstruction() { }
virtual void CompileToNative(LCodeGen* generator) = 0;
@@ -252,30 +251,20 @@ class LInstruction: public ZoneObject {
LPointerMap* pointer_map() const { return pointer_map_.get(); }
bool HasPointerMap() const { return pointer_map_.is_set(); }
- // The 31 bits PositionBits is used to store the int position value. And the
- // position value may be RelocInfo::kNoPosition (-1). The accessor always
- // +1/-1 so that the encoded value of position in bit_field_ is always >= 0
- // and can fit into the 31 bits PositionBits.
- void set_position(int pos) {
- bit_field_ = PositionBits::update(bit_field_, pos + 1);
- }
- int position() { return PositionBits::decode(bit_field_) - 1; }
-
void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
HValue* hydrogen_value() const { return hydrogen_value_; }
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) { }
- void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); }
- bool IsCall() const { return IsCallBits::decode(bit_field_); }
+ void MarkAsCall() { is_call_ = true; }
// Interface to the register allocator and iterators.
- bool ClobbersTemps() const { return IsCall(); }
- bool ClobbersRegisters() const { return IsCall(); }
- bool ClobbersDoubleRegisters() const { return IsCall(); }
+ bool ClobbersTemps() const { return is_call_; }
+ bool ClobbersRegisters() const { return is_call_; }
+ bool ClobbersDoubleRegisters() const { return is_call_; }
// Interface to the register allocator and iterators.
- bool IsMarkedAsCall() const { return IsCall(); }
+ bool IsMarkedAsCall() const { return is_call_; }
virtual bool HasResult() const = 0;
virtual LOperand* result() const = 0;
@@ -299,13 +288,10 @@ class LInstruction: public ZoneObject {
virtual int TempCount() = 0;
virtual LOperand* TempAt(int i) = 0;
- class IsCallBits: public BitField<bool, 0, 1> {};
- class PositionBits: public BitField<int, 1, 31> {};
-
LEnvironment* environment_;
SetOncePointer<LPointerMap> pointer_map_;
HValue* hydrogen_value_;
- int bit_field_;
+ bool is_call_;
};
@@ -895,24 +881,12 @@ class LCmpObjectEqAndBranch: public LControlInstruction<2, 0> {
LOperand* left() { return inputs_[0]; }
LOperand* right() { return inputs_[1]; }
- DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch, "cmp-object-eq-and-branch")
+ DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch,
+ "cmp-object-eq-and-branch")
DECLARE_HYDROGEN_ACCESSOR(CompareObjectEqAndBranch)
};
-class LCmpHoleAndBranch: public LControlInstruction<1, 0> {
- public:
- explicit LCmpHoleAndBranch(LOperand* object) {
- inputs_[0] = object;
- }
-
- LOperand* object() { return inputs_[0]; }
-
- DECLARE_CONCRETE_INSTRUCTION(CmpHoleAndBranch, "cmp-hole-and-branch")
- DECLARE_HYDROGEN_ACCESSOR(CompareHoleAndBranch)
-};
-
-
class LIsObjectAndBranch: public LControlInstruction<1, 1> {
public:
LIsObjectAndBranch(LOperand* value, LOperand* temp) {
@@ -1404,6 +1378,18 @@ class LThrow: public LTemplateInstruction<0, 1, 0> {
};
+class LBitNotI: public LTemplateInstruction<1, 1, 0> {
+ public:
+ explicit LBitNotI(LOperand* value) {
+ inputs_[0] = value;
+ }
+
+ LOperand* value() { return inputs_[0]; }
+
+ DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i")
+};
+
+
class LAddI: public LTemplateInstruction<1, 2, 0> {
public:
LAddI(LOperand* left, LOperand* right) {
@@ -1539,6 +1525,19 @@ class LLoadNamedField: public LTemplateInstruction<1, 1, 0> {
};
+class LLoadNamedFieldPolymorphic: public LTemplateInstruction<1, 1, 0> {
+ public:
+ explicit LLoadNamedFieldPolymorphic(LOperand* object) {
+ inputs_[0] = object;
+ }
+
+ LOperand* object() { return inputs_[0]; }
+
+ DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field-polymorphic")
+ DECLARE_HYDROGEN_ACCESSOR(LoadNamedFieldPolymorphic)
+};
+
+
class LLoadNamedGeneric: public LTemplateInstruction<1, 1, 0> {
public:
explicit LLoadNamedGeneric(LOperand* object) {
@@ -2151,7 +2150,7 @@ class LStoreNamedField: public LTemplateInstruction<0, 2, 1> {
virtual void PrintDataTo(StringStream* stream);
- Handle<Map> transition() const { return hydrogen()->transition_map(); }
+ Handle<Map> transition() const { return hydrogen()->transition(); }
Representation representation() const {
return hydrogen()->field_representation();
}
@@ -2353,6 +2352,26 @@ class LCheckMaps: public LTemplateInstruction<0, 1, 0> {
};
+class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 2> {
+ public:
+ LCheckPrototypeMaps(LOperand* temp, LOperand* temp2) {
+ temps_[0] = temp;
+ temps_[1] = temp2;
+ }
+
+ LOperand* temp() { return temps_[0]; }
+ LOperand* temp2() { return temps_[1]; }
+
+ DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps")
+ DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps)
+
+ ZoneList<Handle<JSObject> >* prototypes() const {
+ return hydrogen()->prototypes();
+ }
+ ZoneList<Handle<Map> >* maps() const { return hydrogen()->maps(); }
+};
+
+
class LCheckSmi: public LTemplateInstruction<1, 1, 0> {
public:
explicit LCheckSmi(LOperand* value) {
@@ -2651,7 +2670,7 @@ class LChunkBuilder BASE_EMBEDDED {
bool is_done() const { return status_ == DONE; }
bool is_aborted() const { return status_ == ABORTED; }
- void Abort(BailoutReason reason);
+ void Abort(const char* reason);
// Methods for getting operands for Use / Define / Temp.
LUnallocated* ToUnallocated(Register reg);
@@ -2733,8 +2752,7 @@ class LChunkBuilder BASE_EMBEDDED {
CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
- int* argument_index_accumulator,
- ZoneList<HValue*>* objects_to_materialize);
+ int* argument_index_accumulator);
void VisitInstruction(HInstruction* current);
diff --git a/chromium/v8/src/arm/lithium-codegen-arm.cc b/chromium/v8/src/arm/lithium-codegen-arm.cc
index 9ec80f819a0..cf1e7c70f5f 100644
--- a/chromium/v8/src/arm/lithium-codegen-arm.cc
+++ b/chromium/v8/src/arm/lithium-codegen-arm.cc
@@ -91,7 +91,7 @@ void LCodeGen::FinishCode(Handle<Code> code) {
}
-void LCodeGen::Abort(BailoutReason reason) {
+void LCodeGen::Abort(const char* reason) {
info()->set_bailout_reason(reason);
status_ = ABORTED;
}
@@ -274,8 +274,6 @@ bool LCodeGen::GenerateBody() {
instr->Mnemonic());
}
- RecordAndUpdatePosition(instr->position());
-
instr->CompileToNative(this);
}
EnsureSpaceForLazyDeopt();
@@ -289,10 +287,6 @@ bool LCodeGen::GenerateDeferredCode() {
if (deferred_.length() > 0) {
for (int i = 0; !is_aborted() && i < deferred_.length(); i++) {
LDeferredCode* code = deferred_[i];
-
- int pos = instructions_->at(code->instruction_index())->position();
- RecordAndUpdatePosition(pos);
-
Comment(";;; <@%d,#%d> "
"-------------------- Deferred %s --------------------",
code->instruction_index(),
@@ -340,7 +334,7 @@ bool LCodeGen::GenerateDeoptJumpTable() {
// 32bit data after it.
if (!is_int24((masm()->pc_offset() / Assembler::kInstrSize) +
deopt_jump_table_.length() * 7)) {
- Abort(kGeneratedCodeIsTooLarge);
+ Abort("Generated code is too large");
}
if (deopt_jump_table_.length() > 0) {
@@ -429,7 +423,7 @@ Register LCodeGen::EmitLoadRegister(LOperand* op, Register scratch) {
ASSERT(literal->IsNumber());
__ mov(scratch, Operand(static_cast<int32_t>(literal->Number())));
} else if (r.IsDouble()) {
- Abort(kEmitLoadRegisterUnsupportedDoubleImmediate);
+ Abort("EmitLoadRegister: Unsupported double immediate.");
} else {
ASSERT(r.IsTagged());
__ LoadObject(scratch, literal);
@@ -467,9 +461,9 @@ DwVfpRegister LCodeGen::EmitLoadDoubleRegister(LOperand* op,
__ vcvt_f64_s32(dbl_scratch, flt_scratch);
return dbl_scratch;
} else if (r.IsDouble()) {
- Abort(kUnsupportedDoubleImmediate);
+ Abort("unsupported double immediate");
} else if (r.IsTagged()) {
- Abort(kUnsupportedTaggedImmediate);
+ Abort("unsupported tagged immediate");
}
} else if (op->IsStackSlot() || op->IsArgument()) {
// TODO(regis): Why is vldr not taking a MemOperand?
@@ -540,14 +534,14 @@ Operand LCodeGen::ToOperand(LOperand* op) {
ASSERT(constant->HasInteger32Value());
return Operand(constant->Integer32Value());
} else if (r.IsDouble()) {
- Abort(kToOperandUnsupportedDoubleImmediate);
+ Abort("ToOperand Unsupported double immediate.");
}
ASSERT(r.IsTagged());
return Operand(constant->handle());
} else if (op->IsRegister()) {
return Operand(ToRegister(op));
} else if (op->IsDoubleRegister()) {
- Abort(kToOperandIsDoubleRegisterUnimplemented);
+ Abort("ToOperand IsDoubleRegister unimplemented");
return Operand::Zero();
}
// Stack slots not implemented, use ToMemOperand instead.
@@ -611,57 +605,37 @@ void LCodeGen::WriteTranslation(LEnvironment* environment,
break;
}
- int object_index = 0;
- int dematerialized_index = 0;
for (int i = 0; i < translation_size; ++i) {
LOperand* value = environment->values()->at(i);
- AddToTranslation(environment,
- translation,
+
+ // TODO(mstarzinger): Introduce marker operands to indicate that this value
+ // is not present and must be reconstructed from the deoptimizer. Currently
+ // this is only used for the arguments object.
+ if (value == NULL) {
+ int arguments_count = environment->values()->length() - translation_size;
+ translation->BeginArgumentsObject(arguments_count);
+ for (int i = 0; i < arguments_count; ++i) {
+ LOperand* value = environment->values()->at(translation_size + i);
+ AddToTranslation(translation,
+ value,
+ environment->HasTaggedValueAt(translation_size + i),
+ environment->HasUint32ValueAt(translation_size + i));
+ }
+ continue;
+ }
+
+ AddToTranslation(translation,
value,
environment->HasTaggedValueAt(i),
- environment->HasUint32ValueAt(i),
- &object_index,
- &dematerialized_index);
+ environment->HasUint32ValueAt(i));
}
}
-void LCodeGen::AddToTranslation(LEnvironment* environment,
- Translation* translation,
+void LCodeGen::AddToTranslation(Translation* translation,
LOperand* op,
bool is_tagged,
- bool is_uint32,
- int* object_index_pointer,
- int* dematerialized_index_pointer) {
- if (op == LEnvironment::materialization_marker()) {
- int object_index = (*object_index_pointer)++;
- if (environment->ObjectIsDuplicateAt(object_index)) {
- int dupe_of = environment->ObjectDuplicateOfAt(object_index);
- translation->DuplicateObject(dupe_of);
- return;
- }
- int object_length = environment->ObjectLengthAt(object_index);
- if (environment->ObjectIsArgumentsAt(object_index)) {
- translation->BeginArgumentsObject(object_length);
- } else {
- translation->BeginCapturedObject(object_length);
- }
- int dematerialized_index = *dematerialized_index_pointer;
- int env_offset = environment->translation_size() + dematerialized_index;
- *dematerialized_index_pointer += object_length;
- for (int i = 0; i < object_length; ++i) {
- LOperand* value = environment->values()->at(env_offset + i);
- AddToTranslation(environment,
- translation,
- value,
- environment->HasTaggedValueAt(env_offset + i),
- environment->HasUint32ValueAt(env_offset + i),
- object_index_pointer,
- dematerialized_index_pointer);
- }
- return;
- }
-
+ bool is_uint32) {
if (op->IsStackSlot()) {
if (is_tagged) {
translation->StoreStackSlot(op->index());
@@ -788,7 +762,7 @@ void LCodeGen::RegisterEnvironmentForDeoptimization(LEnvironment* environment,
}
-void LCodeGen::DeoptimizeIf(Condition condition,
+void LCodeGen::DeoptimizeIf(Condition cc,
LEnvironment* environment,
Deoptimizer::BailoutType bailout_type) {
RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt);
@@ -798,7 +772,7 @@ void LCodeGen::DeoptimizeIf(Condition condition,
Address entry =
Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type);
if (entry == NULL) {
- Abort(kBailoutWasNotPrepared);
+ Abort("bailout was not prepared");
return;
}
@@ -811,12 +785,12 @@ void LCodeGen::DeoptimizeIf(Condition condition,
return;
}
- if (info()->ShouldTrapOnDeopt()) {
- __ stop("trap_on_deopt", condition);
+ if (FLAG_trap_on_deopt && info()->IsOptimizing()) {
+ __ stop("trap_on_deopt", cc);
}
ASSERT(info()->IsStub() || frame_is_built_);
- if (condition == al && frame_is_built_) {
+ if (cc == al && frame_is_built_) {
__ Call(entry, RelocInfo::RUNTIME_ENTRY);
} else {
// We often have several deopts to the same entry, reuse the last
@@ -830,17 +804,17 @@ void LCodeGen::DeoptimizeIf(Condition condition,
!frame_is_built_);
deopt_jump_table_.Add(table_entry, zone());
}
- __ b(condition, &deopt_jump_table_.last().label);
+ __ b(cc, &deopt_jump_table_.last().label);
}
}
-void LCodeGen::DeoptimizeIf(Condition condition,
+void LCodeGen::DeoptimizeIf(Condition cc,
LEnvironment* environment) {
Deoptimizer::BailoutType bailout_type = info()->IsStub()
? Deoptimizer::LAZY
: Deoptimizer::EAGER;
- DeoptimizeIf(condition, environment, bailout_type);
+ DeoptimizeIf(cc, environment, bailout_type);
}
@@ -1003,14 +977,6 @@ void LCodeGen::RecordPosition(int position) {
}
-void LCodeGen::RecordAndUpdatePosition(int position) {
- if (position >= 0 && position != old_position_) {
- masm()->positions_recorder()->RecordPosition(position);
- old_position_ = position;
- }
-}
-
-
static const char* LabelType(LLabel* label) {
if (label->is_loop_header()) return " (loop header)";
if (label->is_osr_entry()) return " (OSR entry)";
@@ -1703,11 +1669,7 @@ void LCodeGen::DoBitI(LBitI* instr) {
__ orr(result, left, right);
break;
case Token::BIT_XOR:
- if (right_op->IsConstantOperand() && right.immediate() == int32_t(~0)) {
- __ mvn(result, Operand(left));
- } else {
- __ eor(result, left, right);
- }
+ __ eor(result, left, right);
break;
default:
UNREACHABLE();
@@ -1974,7 +1936,7 @@ void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
static const uint32_t two_byte_seq_type = kSeqStringTag | kTwoByteStringTag;
__ cmp(ip, Operand(encoding == String::ONE_BYTE_ENCODING
? one_byte_seq_type : two_byte_seq_type));
- __ Check(eq, kUnexpectedStringType);
+ __ Check(eq, "Unexpected string type");
}
__ add(ip,
@@ -1991,6 +1953,13 @@ void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
}
+void LCodeGen::DoBitNotI(LBitNotI* instr) {
+ Register input = ToRegister(instr->value());
+ Register result = ToRegister(instr->result());
+ __ mvn(result, Operand(input));
+}
+
+
void LCodeGen::DoThrow(LThrow* instr) {
Register input_reg = EmitLoadRegister(instr->value(), ip);
__ push(input_reg);
@@ -2152,32 +2121,25 @@ int LCodeGen::GetNextEmittedBlock() const {
}
template<class InstrType>
-void LCodeGen::EmitBranch(InstrType instr, Condition condition) {
+void LCodeGen::EmitBranch(InstrType instr, Condition cc) {
int left_block = instr->TrueDestination(chunk_);
int right_block = instr->FalseDestination(chunk_);
int next_block = GetNextEmittedBlock();
- if (right_block == left_block || condition == al) {
+ if (right_block == left_block || cc == al) {
EmitGoto(left_block);
} else if (left_block == next_block) {
- __ b(NegateCondition(condition), chunk_->GetAssemblyLabel(right_block));
+ __ b(NegateCondition(cc), chunk_->GetAssemblyLabel(right_block));
} else if (right_block == next_block) {
- __ b(condition, chunk_->GetAssemblyLabel(left_block));
+ __ b(cc, chunk_->GetAssemblyLabel(left_block));
} else {
- __ b(condition, chunk_->GetAssemblyLabel(left_block));
+ __ b(cc, chunk_->GetAssemblyLabel(left_block));
__ b(chunk_->GetAssemblyLabel(right_block));
}
}
-template<class InstrType>
-void LCodeGen::EmitFalseBranch(InstrType instr, Condition condition) {
- int false_block = instr->FalseDestination(chunk_);
- __ b(condition, chunk_->GetAssemblyLabel(false_block));
-}
-
-
void LCodeGen::DoDebugBreak(LDebugBreak* instr) {
__ stop("LBreak");
}
@@ -2433,26 +2395,6 @@ void LCodeGen::DoCmpObjectEqAndBranch(LCmpObjectEqAndBranch* instr) {
}
-void LCodeGen::DoCmpHoleAndBranch(LCmpHoleAndBranch* instr) {
- if (instr->hydrogen()->representation().IsTagged()) {
- Register input_reg = ToRegister(instr->object());
- __ mov(ip, Operand(factory()->the_hole_value()));
- __ cmp(input_reg, ip);
- EmitBranch(instr, eq);
- return;
- }
-
- DwVfpRegister input_reg = ToDoubleRegister(instr->object());
- __ VFPCompareAndSetFlags(input_reg, input_reg);
- EmitFalseBranch(instr, vc);
-
- Register scratch = scratch0();
- __ VmovHigh(scratch, input_reg);
- __ cmp(scratch, Operand(kHoleNanUpper32));
- EmitBranch(instr, eq);
-}
-
-
Condition LCodeGen::EmitIsObject(Register input,
Register temp1,
Label* is_not_object,
@@ -3079,6 +3021,91 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
}
+void LCodeGen::EmitLoadFieldOrConstantFunction(Register result,
+ Register object,
+ Handle<Map> type,
+ Handle<String> name,
+ LEnvironment* env) {
+ LookupResult lookup(isolate());
+ type->LookupDescriptor(NULL, *name, &lookup);
+ ASSERT(lookup.IsFound() || lookup.IsCacheable());
+ if (lookup.IsField()) {
+ int index = lookup.GetLocalFieldIndexFromMap(*type);
+ int offset = index * kPointerSize;
+ if (index < 0) {
+ // Negative property indices are in-object properties, indexed
+ // from the end of the fixed part of the object.
+ __ ldr(result, FieldMemOperand(object, offset + type->instance_size()));
+ } else {
+ // Non-negative property indices are in the properties array.
+ __ ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset));
+ __ ldr(result, FieldMemOperand(result, offset + FixedArray::kHeaderSize));
+ }
+ } else if (lookup.IsConstant()) {
+ Handle<Object> constant(lookup.GetConstantFromMap(*type), isolate());
+ __ LoadObject(result, constant);
+ } else {
+ // Negative lookup.
+ // Check prototypes.
+ Handle<HeapObject> current(HeapObject::cast((*type)->prototype()));
+ Heap* heap = type->GetHeap();
+ while (*current != heap->null_value()) {
+ __ LoadHeapObject(result, current);
+ __ ldr(result, FieldMemOperand(result, HeapObject::kMapOffset));
+ __ cmp(result, Operand(Handle<Map>(current->map())));
+ DeoptimizeIf(ne, env);
+ current =
+ Handle<HeapObject>(HeapObject::cast(current->map()->prototype()));
+ }
+ __ LoadRoot(result, Heap::kUndefinedValueRootIndex);
+ }
+}
+
+
+void LCodeGen::DoLoadNamedFieldPolymorphic(LLoadNamedFieldPolymorphic* instr) {
+ Register object = ToRegister(instr->object());
+ Register result = ToRegister(instr->result());
+ Register object_map = scratch0();
+
+ int map_count = instr->hydrogen()->types()->length();
+ bool need_generic = instr->hydrogen()->need_generic();
+
+ if (map_count == 0 && !need_generic) {
+ DeoptimizeIf(al, instr->environment());
+ return;
+ }
+ Handle<String> name = instr->hydrogen()->name();
+ Label done;
+ __ ldr(object_map, FieldMemOperand(object, HeapObject::kMapOffset));
+ for (int i = 0; i < map_count; ++i) {
+ bool last = (i == map_count - 1);
+ Handle<Map> map = instr->hydrogen()->types()->at(i);
+ Label check_passed;
+ __ CompareMap(object_map, map, &check_passed);
+ if (last && !need_generic) {
+ DeoptimizeIf(ne, instr->environment());
+ __ bind(&check_passed);
+ EmitLoadFieldOrConstantFunction(
+ result, object, map, name, instr->environment());
+ } else {
+ Label next;
+ __ b(ne, &next);
+ __ bind(&check_passed);
+ EmitLoadFieldOrConstantFunction(
+ result, object, map, name, instr->environment());
+ __ b(&done);
+ __ bind(&next);
+ }
+ }
+ if (need_generic) {
+ __ mov(r2, Operand(name));
+ Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
+ CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS);
+ }
+ __ bind(&done);
+}
+
+
void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) {
ASSERT(ToRegister(instr->object()).is(r0));
ASSERT(ToRegister(instr->result()).is(r0));
@@ -3173,7 +3200,7 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) {
if (key_is_constant) {
constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
if (constant_key & 0xF0000000) {
- Abort(kArrayIndexConstantValueTooBig);
+ Abort("array index constant value too big.");
}
} else {
key = ToRegister(instr->key());
@@ -3257,7 +3284,7 @@ void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) {
if (key_is_constant) {
constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
if (constant_key & 0xF0000000) {
- Abort(kArrayIndexConstantValueTooBig);
+ Abort("array index constant value too big.");
}
} else {
key = ToRegister(instr->key());
@@ -3518,7 +3545,7 @@ void LCodeGen::DoApplyArguments(LApplyArguments* instr) {
void LCodeGen::DoPushArgument(LPushArgument* instr) {
LOperand* argument = instr->value();
if (argument->IsDoubleRegister() || argument->IsDoubleStackSlot()) {
- Abort(kDoPushArgumentNotImplementedForDoubleType);
+ Abort("DoPushArgument not implemented for double type.");
} else {
Register argument_reg = EmitLoadRegister(argument, ip);
__ push(argument_reg);
@@ -3738,7 +3765,7 @@ void LCodeGen::DoMathAbs(LMathAbs* instr) {
DwVfpRegister input = ToDoubleRegister(instr->value());
DwVfpRegister result = ToDoubleRegister(instr->result());
__ vabs(result, input);
- } else if (r.IsSmiOrInteger32()) {
+ } else if (r.IsInteger32()) {
EmitIntegerMathAbs(instr);
} else {
// Representation is tagged.
@@ -4251,14 +4278,14 @@ void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) {
}
-void LCodeGen::ApplyCheckIf(Condition condition, LBoundsCheck* check) {
+void LCodeGen::ApplyCheckIf(Condition cc, LBoundsCheck* check) {
if (FLAG_debug_code && check->hydrogen()->skip_check()) {
Label done;
- __ b(NegateCondition(condition), &done);
+ __ b(NegateCondition(cc), &done);
__ stop("eliminated bounds check failed");
__ bind(&done);
} else {
- DeoptimizeIf(condition, check->environment());
+ DeoptimizeIf(cc, check->environment());
}
}
@@ -4292,7 +4319,7 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) {
if (key_is_constant) {
constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
if (constant_key & 0xF0000000) {
- Abort(kArrayIndexConstantValueTooBig);
+ Abort("array index constant value too big.");
}
} else {
key = ToRegister(instr->key());
@@ -4365,7 +4392,7 @@ void LCodeGen::DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr) {
if (key_is_constant) {
constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
if (constant_key & 0xF0000000) {
- Abort(kArrayIndexConstantValueTooBig);
+ Abort("array index constant value too big.");
}
} else {
key = ToRegister(instr->key());
@@ -4388,7 +4415,7 @@ void LCodeGen::DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr) {
if (masm()->emit_debug_code()) {
__ vmrs(ip);
__ tst(ip, Operand(kVFPDefaultNaNModeControlBit));
- __ Assert(ne, kDefaultNaNModeNotSet);
+ __ Assert(ne, "Default NaN mode not set");
}
__ VFPCanonicalizeNaN(value);
}
@@ -4489,13 +4516,12 @@ void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) {
__ RecordWriteField(object_reg, HeapObject::kMapOffset, new_map_reg,
scratch, GetLinkRegisterState(), kDontSaveFPRegs);
} else {
- PushSafepointRegistersScope scope(
- this, Safepoint::kWithRegistersAndDoubles);
+ PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
__ Move(r0, object_reg);
__ Move(r1, to_map);
TransitionElementsKindStub stub(from_kind, to_kind);
__ CallStub(&stub);
- RecordSafepointWithRegistersAndDoubles(
+ RecordSafepointWithRegisters(
instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
}
__ bind(&not_applicable);
@@ -4783,6 +4809,29 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
Register temp1 = ToRegister(instr->temp());
Register temp2 = ToRegister(instr->temp2());
+ bool convert_hole = false;
+ HValue* change_input = instr->hydrogen()->value();
+ if (change_input->IsLoadKeyed()) {
+ HLoadKeyed* load = HLoadKeyed::cast(change_input);
+ convert_hole = load->UsesMustHandleHole();
+ }
+
+ Label no_special_nan_handling;
+ Label done;
+ if (convert_hole) {
+ DwVfpRegister input_reg = ToDoubleRegister(instr->value());
+ __ VFPCompareAndSetFlags(input_reg, input_reg);
+ __ b(vc, &no_special_nan_handling);
+ __ VmovHigh(scratch, input_reg);
+ __ cmp(scratch, Operand(kHoleNanUpper32));
+ // If not the hole NaN, force the NaN to be canonical.
+ __ VFPCanonicalizeNaN(input_reg, ne);
+ __ b(ne, &no_special_nan_handling);
+ __ Move(reg, factory()->the_hole_value());
+ __ b(&done);
+ }
+
+ __ bind(&no_special_nan_handling);
DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr);
if (FLAG_inline_new) {
__ LoadRoot(scratch, Heap::kHeapNumberMapRootIndex);
@@ -4796,6 +4845,7 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
__ vstr(input_reg, reg, HeapNumber::kValueOffset);
// Now that we have finished with the object's real address tag it
__ add(reg, reg, Operand(kHeapObjectTag));
+ __ bind(&done);
}
@@ -4835,7 +4885,7 @@ void LCodeGen::DoSmiUntag(LSmiUntag* instr) {
void LCodeGen::EmitNumberUntagD(Register input_reg,
DwVfpRegister result_reg,
- bool can_convert_undefined_to_nan,
+ bool allow_undefined_as_nan,
bool deoptimize_on_minus_zero,
LEnvironment* env,
NumberUntagDMode mode) {
@@ -4845,7 +4895,9 @@ void LCodeGen::EmitNumberUntagD(Register input_reg,
Label load_smi, heap_number, done;
- if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED) {
+ STATIC_ASSERT(NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE >
+ NUMBER_CANDIDATE_IS_ANY_TAGGED);
+ if (mode >= NUMBER_CANDIDATE_IS_ANY_TAGGED) {
// Smi check.
__ UntagAndJumpIfSmi(scratch, input_reg, &load_smi);
@@ -4853,7 +4905,7 @@ void LCodeGen::EmitNumberUntagD(Register input_reg,
__ ldr(scratch, FieldMemOperand(input_reg, HeapObject::kMapOffset));
__ LoadRoot(ip, Heap::kHeapNumberMapRootIndex);
__ cmp(scratch, Operand(ip));
- if (!can_convert_undefined_to_nan) {
+ if (!allow_undefined_as_nan) {
DeoptimizeIf(ne, env);
} else {
Label heap_number, convert;
@@ -4862,6 +4914,11 @@ void LCodeGen::EmitNumberUntagD(Register input_reg,
// Convert undefined (and hole) to NaN.
__ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
__ cmp(input_reg, Operand(ip));
+ if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE) {
+ __ b(eq, &convert);
+ __ LoadRoot(ip, Heap::kTheHoleValueRootIndex);
+ __ cmp(input_reg, Operand(ip));
+ }
DeoptimizeIf(ne, env);
__ bind(&convert);
@@ -5002,12 +5059,21 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) {
Register input_reg = ToRegister(input);
DwVfpRegister result_reg = ToDoubleRegister(result);
+ NumberUntagDMode mode = NUMBER_CANDIDATE_IS_ANY_TAGGED;
HValue* value = instr->hydrogen()->value();
- NumberUntagDMode mode = value->representation().IsSmi()
- ? NUMBER_CANDIDATE_IS_SMI : NUMBER_CANDIDATE_IS_ANY_TAGGED;
+ if (value->type().IsSmi()) {
+ mode = NUMBER_CANDIDATE_IS_SMI;
+ } else if (value->IsLoadKeyed()) {
+ HLoadKeyed* load = HLoadKeyed::cast(value);
+ if (load->UsesMustHandleHole()) {
+ if (load->hole_mode() == ALLOW_RETURN_HOLE) {
+ mode = NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE;
+ }
+ }
+ }
EmitNumberUntagD(input_reg, result_reg,
- instr->hydrogen()->can_convert_undefined_to_nan(),
+ instr->hydrogen()->allow_undefined_as_nan(),
instr->hydrogen()->deoptimize_on_minus_zero(),
instr->environment(),
mode);
@@ -5137,7 +5203,7 @@ void LCodeGen::DoCheckFunction(LCheckFunction* instr) {
AllowDeferredHandleDereference smi_check;
if (isolate()->heap()->InNewSpace(*target)) {
Register reg = ToRegister(instr->value());
- Handle<Cell> cell = isolate()->factory()->NewCell(target);
+ Handle<Cell> cell = isolate()->factory()->NewPropertyCell(target);
__ mov(ip, Operand(Handle<Object>(cell)));
__ ldr(ip, FieldMemOperand(ip, Cell::kValueOffset));
__ cmp(reg, ip);
@@ -5148,67 +5214,33 @@ void LCodeGen::DoCheckFunction(LCheckFunction* instr) {
}
-void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) {
- {
- PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
- __ push(object);
- CallRuntimeFromDeferred(Runtime::kMigrateInstance, 1, instr);
- __ StoreToSafepointRegisterSlot(r0, scratch0());
- }
- __ tst(scratch0(), Operand(kSmiTagMask));
- DeoptimizeIf(eq, instr->environment());
+void LCodeGen::DoCheckMapCommon(Register map_reg,
+ Handle<Map> map,
+ LEnvironment* env) {
+ Label success;
+ __ CompareMap(map_reg, map, &success);
+ DeoptimizeIf(ne, env);
+ __ bind(&success);
}
void LCodeGen::DoCheckMaps(LCheckMaps* instr) {
- class DeferredCheckMaps: public LDeferredCode {
- public:
- DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object)
- : LDeferredCode(codegen), instr_(instr), object_(object) {
- SetExit(check_maps());
- }
- virtual void Generate() {
- codegen()->DoDeferredInstanceMigration(instr_, object_);
- }
- Label* check_maps() { return &check_maps_; }
- virtual LInstruction* instr() { return instr_; }
- private:
- LCheckMaps* instr_;
- Label check_maps_;
- Register object_;
- };
-
if (instr->hydrogen()->CanOmitMapChecks()) return;
Register map_reg = scratch0();
-
LOperand* input = instr->value();
ASSERT(input->IsRegister());
Register reg = ToRegister(input);
+ Label success;
SmallMapList* map_set = instr->hydrogen()->map_set();
__ ldr(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
-
- DeferredCheckMaps* deferred = NULL;
- if (instr->hydrogen()->has_migration_target()) {
- deferred = new(zone()) DeferredCheckMaps(this, instr, reg);
- __ bind(deferred->check_maps());
- }
-
- Label success;
for (int i = 0; i < map_set->length() - 1; i++) {
Handle<Map> map = map_set->at(i);
__ CompareMap(map_reg, map, &success);
__ b(eq, &success);
}
-
Handle<Map> map = map_set->last();
- __ CompareMap(map_reg, map, &success);
- if (instr->hydrogen()->has_migration_target()) {
- __ b(ne, deferred->entry());
- } else {
- DeoptimizeIf(ne, instr->environment());
- }
-
+ DoCheckMapCommon(map_reg, map, instr->environment());
__ bind(&success);
}
@@ -5263,6 +5295,25 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) {
}
+void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
+ if (instr->hydrogen()->CanOmitPrototypeChecks()) return;
+
+ Register prototype_reg = ToRegister(instr->temp());
+ Register map_reg = ToRegister(instr->temp2());
+
+ ZoneList<Handle<JSObject> >* prototypes = instr->prototypes();
+ ZoneList<Handle<Map> >* maps = instr->maps();
+
+ ASSERT(prototypes->length() == maps->length());
+
+ for (int i = 0; i < prototypes->length(); i++) {
+ __ LoadHeapObject(prototype_reg, prototypes->at(i));
+ __ ldr(map_reg, FieldMemOperand(prototype_reg, HeapObject::kMapOffset));
+ DoCheckMapCommon(map_reg, maps->at(i), instr->environment());
+ }
+}
+
+
void LCodeGen::DoAllocate(LAllocate* instr) {
class DeferredAllocate: public LDeferredCode {
public:
@@ -5597,8 +5648,6 @@ void LCodeGen::DoDeoptimize(LDeoptimize* instr) {
if (info()->IsStub() && type == Deoptimizer::EAGER) {
type = Deoptimizer::LAZY;
}
-
- Comment(";;; deoptimize: %s", instr->hydrogen()->reason());
DeoptimizeIf(al, instr->environment(), type);
}
diff --git a/chromium/v8/src/arm/lithium-codegen-arm.h b/chromium/v8/src/arm/lithium-codegen-arm.h
index d0bfcbbb94e..21f792153ba 100644
--- a/chromium/v8/src/arm/lithium-codegen-arm.h
+++ b/chromium/v8/src/arm/lithium-codegen-arm.h
@@ -66,8 +66,7 @@ class LCodeGen BASE_EMBEDDED {
frame_is_built_(false),
safepoints_(info->zone()),
resolver_(this),
- expected_safepoint_kind_(Safepoint::kSimple),
- old_position_(RelocInfo::kNoPosition) {
+ expected_safepoint_kind_(Safepoint::kSimple) {
PopulateDeoptimizationLiteralsWithInlinedFunctions();
}
@@ -116,7 +115,7 @@ class LCodeGen BASE_EMBEDDED {
DwVfpRegister EmitLoadDoubleRegister(LOperand* op,
SwVfpRegister flt_scratch,
DwVfpRegister dbl_scratch);
- int32_t ToRepresentation(LConstantOperand* op, const Representation& r) const;
+ int ToRepresentation(LConstantOperand* op, const Representation& r) const;
int32_t ToInteger32(LConstantOperand* op) const;
Smi* ToSmi(LConstantOperand* op) const;
double ToDouble(LConstantOperand* op) const;
@@ -155,7 +154,8 @@ class LCodeGen BASE_EMBEDDED {
void DoDeferredAllocate(LAllocate* instr);
void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
Label* map_check);
- void DoDeferredInstanceMigration(LCheckMaps* instr, Register object);
+
+ void DoCheckMapCommon(Register map_reg, Handle<Map> map, LEnvironment* env);
// Parallel move support.
void DoParallelMove(LParallelMove* move);
@@ -214,7 +214,7 @@ class LCodeGen BASE_EMBEDDED {
int GetStackSlotCount() const { return chunk()->spill_slot_count(); }
- void Abort(BailoutReason reason);
+ void Abort(const char* reason);
void FPRINTF_CHECKING Comment(const char* format, ...);
void AddDeferredCode(LDeferredCode* code) { deferred_.Add(code, zone()); }
@@ -281,19 +281,16 @@ class LCodeGen BASE_EMBEDDED {
void RegisterEnvironmentForDeoptimization(LEnvironment* environment,
Safepoint::DeoptMode mode);
- void DeoptimizeIf(Condition condition,
+ void DeoptimizeIf(Condition cc,
LEnvironment* environment,
Deoptimizer::BailoutType bailout_type);
- void DeoptimizeIf(Condition condition, LEnvironment* environment);
- void ApplyCheckIf(Condition condition, LBoundsCheck* check);
+ void DeoptimizeIf(Condition cc, LEnvironment* environment);
+ void ApplyCheckIf(Condition cc, LBoundsCheck* check);
- void AddToTranslation(LEnvironment* environment,
- Translation* translation,
+ void AddToTranslation(Translation* translation,
LOperand* op,
bool is_tagged,
- bool is_uint32,
- int* object_index_pointer,
- int* dematerialized_index_pointer);
+ bool is_uint32);
void RegisterDependentCodeForEmbeddedMaps(Handle<Code> code);
void PopulateDeoptimizationData(Handle<Code> code);
int DefineDeoptimizationLiteral(Handle<Object> literal);
@@ -319,14 +316,11 @@ class LCodeGen BASE_EMBEDDED {
int arguments,
Safepoint::DeoptMode mode);
void RecordPosition(int position);
- void RecordAndUpdatePosition(int position);
static Condition TokenToCondition(Token::Value op, bool is_unsigned);
void EmitGoto(int block);
template<class InstrType>
- void EmitBranch(InstrType instr, Condition condition);
- template<class InstrType>
- void EmitFalseBranch(InstrType instr, Condition condition);
+ void EmitBranch(InstrType instr, Condition cc);
void EmitNumberUntagD(Register input,
DwVfpRegister result,
bool allow_undefined_as_nan,
@@ -362,6 +356,12 @@ class LCodeGen BASE_EMBEDDED {
// Caller should branch on equal condition.
void EmitIsConstructCall(Register temp1, Register temp2);
+ void EmitLoadFieldOrConstantFunction(Register result,
+ Register object,
+ Handle<Map> type,
+ Handle<String> name,
+ LEnvironment* env);
+
// Emits optimized code to deep-copy the contents of statically known
// object graphs (e.g. object literal boilerplate).
void EmitDeepCopy(Handle<JSObject> object,
@@ -418,8 +418,6 @@ class LCodeGen BASE_EMBEDDED {
Safepoint::Kind expected_safepoint_kind_;
- int old_position_;
-
class PushSafepointRegistersScope BASE_EMBEDDED {
public:
PushSafepointRegistersScope(LCodeGen* codegen,
diff --git a/chromium/v8/src/arm/lithium-gap-resolver-arm.cc b/chromium/v8/src/arm/lithium-gap-resolver-arm.cc
index 88ac7a2a21d..7a3c96892c2 100644
--- a/chromium/v8/src/arm/lithium-gap-resolver-arm.cc
+++ b/chromium/v8/src/arm/lithium-gap-resolver-arm.cc
@@ -254,7 +254,7 @@ void LGapResolver::EmitMove(int index) {
} else {
__ LoadObject(dst, cgen_->ToHandle(constant_source));
}
- } else if (destination->IsDoubleRegister()) {
+ } else if (source->IsDoubleRegister()) {
DwVfpRegister result = cgen_->ToDoubleRegister(destination);
double v = cgen_->ToDouble(constant_source);
__ Vmov(result, v, ip);
diff --git a/chromium/v8/src/arm/macro-assembler-arm.cc b/chromium/v8/src/arm/macro-assembler-arm.cc
index a56744bf597..cd124610f97 100644
--- a/chromium/v8/src/arm/macro-assembler-arm.cc
+++ b/chromium/v8/src/arm/macro-assembler-arm.cc
@@ -375,13 +375,16 @@ void MacroAssembler::LoadRoot(Register destination,
Heap::RootListIndex index,
Condition cond) {
if (CpuFeatures::IsSupported(MOVW_MOVT_IMMEDIATE_LOADS) &&
- isolate()->heap()->RootCanBeTreatedAsConstant(index) &&
+ !Heap::RootCanBeWrittenAfterInitialization(index) &&
!predictable_code_size()) {
- // The CPU supports fast immediate values, and this root will never
- // change. We will load it as a relocatable immediate value.
- Handle<Object> root(&isolate()->heap()->roots_array_start()[index]);
- mov(destination, Operand(root), LeaveCC, cond);
- return;
+ Handle<Object> root(isolate()->heap()->roots_array_start()[index],
+ isolate());
+ if (!isolate()->heap()->InNewSpace(*root)) {
+ // The CPU supports fast immediate values, and this root will never
+ // change. We will load it as a relocatable immediate value.
+ mov(destination, Operand(root), LeaveCC, cond);
+ return;
+ }
}
ldr(destination, MemOperand(kRootRegister, index << kPointerSizeLog2), cond);
}
@@ -486,7 +489,7 @@ void MacroAssembler::RecordWrite(Register object,
if (emit_debug_code()) {
ldr(ip, MemOperand(address));
cmp(ip, value);
- Check(eq, kWrongAddressOrValuePassedToRecordWrite);
+ Check(eq, "Wrong address or value passed to RecordWrite");
}
Label done;
@@ -1487,7 +1490,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
// In debug mode, make sure the lexical context is set.
#ifdef DEBUG
cmp(scratch, Operand::Zero());
- Check(ne, kWeShouldNotHaveAnEmptyLexicalContext);
+ Check(ne, "we should not have an empty lexical context");
#endif
// Load the native context of the current context.
@@ -1505,7 +1508,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
ldr(holder_reg, FieldMemOperand(scratch, HeapObject::kMapOffset));
LoadRoot(ip, Heap::kNativeContextMapRootIndex);
cmp(holder_reg, ip);
- Check(eq, kJSGlobalObjectNativeContextShouldBeANativeContext);
+ Check(eq, "JSGlobalObject::native_context should be a native context.");
pop(holder_reg); // Restore holder.
}
@@ -1522,12 +1525,12 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
mov(holder_reg, ip); // Move ip to its holding place.
LoadRoot(ip, Heap::kNullValueRootIndex);
cmp(holder_reg, ip);
- Check(ne, kJSGlobalProxyContextShouldNotBeNull);
+ Check(ne, "JSGlobalProxy::context() should not be null.");
ldr(holder_reg, FieldMemOperand(holder_reg, HeapObject::kMapOffset));
LoadRoot(ip, Heap::kNativeContextMapRootIndex);
cmp(holder_reg, ip);
- Check(eq, kJSGlobalObjectNativeContextShouldBeANativeContext);
+ Check(eq, "JSGlobalObject::native_context should be a native context.");
// Restore ip is not needed. ip is reloaded below.
pop(holder_reg); // Restore holder.
// Restore ip to holder's context.
@@ -1724,7 +1727,7 @@ void MacroAssembler::Allocate(int object_size,
// respect to register content between debug and release mode.
ldr(ip, MemOperand(topaddr));
cmp(result, ip);
- Check(eq, kUnexpectedAllocationTop);
+ Check(eq, "Unexpected allocation top");
}
// Load allocation limit into ip. Result already contains allocation top.
ldr(ip, MemOperand(topaddr, limit - top));
@@ -1822,7 +1825,7 @@ void MacroAssembler::Allocate(Register object_size,
// respect to register content between debug and release mode.
ldr(ip, MemOperand(topaddr));
cmp(result, ip);
- Check(eq, kUnexpectedAllocationTop);
+ Check(eq, "Unexpected allocation top");
}
// Load allocation limit into ip. Result already contains allocation top.
ldr(ip, MemOperand(topaddr, limit - top));
@@ -1856,7 +1859,7 @@ void MacroAssembler::Allocate(Register object_size,
// Update allocation top. result temporarily holds the new top.
if (emit_debug_code()) {
tst(scratch2, Operand(kObjectAlignmentMask));
- Check(eq, kUnalignedAllocationInNewSpace);
+ Check(eq, "Unaligned allocation in new space");
}
str(scratch2, MemOperand(topaddr));
@@ -1879,7 +1882,7 @@ void MacroAssembler::UndoAllocationInNewSpace(Register object,
mov(scratch, Operand(new_space_allocation_top));
ldr(scratch, MemOperand(scratch));
cmp(object, scratch);
- Check(lt, kUndoAllocationOfNonAllocatedMemory);
+ Check(lt, "Undo allocation of non allocated memory");
#endif
// Write the address of the object to un-allocate as the current top.
mov(scratch, Operand(new_space_allocation_top));
@@ -2128,7 +2131,7 @@ void MacroAssembler::StoreNumberToDoubleElements(
if (emit_debug_code()) {
vmrs(ip);
tst(ip, Operand(kVFPDefaultNaNModeControlBit));
- Assert(ne, kDefaultNaNModeNotSet);
+ Assert(ne, "Default NaN mode not set");
}
VFPCanonicalizeNaN(double_scratch);
b(&store);
@@ -2378,7 +2381,7 @@ void MacroAssembler::CallApiFunctionAndReturn(ExternalReference function,
if (emit_debug_code()) {
ldr(r1, MemOperand(r7, kLevelOffset));
cmp(r1, r6);
- Check(eq, kUnexpectedLevelAfterReturnFromApiCall);
+ Check(eq, "Unexpected level after return from api call");
}
sub(r6, r6, Operand(1));
str(r6, MemOperand(r7, kLevelOffset));
@@ -2779,9 +2782,9 @@ void MacroAssembler::DecrementCounter(StatsCounter* counter, int value,
}
-void MacroAssembler::Assert(Condition cond, BailoutReason reason) {
+void MacroAssembler::Assert(Condition cond, const char* msg) {
if (emit_debug_code())
- Check(cond, reason);
+ Check(cond, msg);
}
@@ -2800,23 +2803,23 @@ void MacroAssembler::AssertFastElements(Register elements) {
LoadRoot(ip, Heap::kFixedCOWArrayMapRootIndex);
cmp(elements, ip);
b(eq, &ok);
- Abort(kJSObjectWithFastElementsMapHasSlowElements);
+ Abort("JSObject with fast elements map has slow elements");
bind(&ok);
pop(elements);
}
}
-void MacroAssembler::Check(Condition cond, BailoutReason reason) {
+void MacroAssembler::Check(Condition cond, const char* msg) {
Label L;
b(cond, &L);
- Abort(reason);
+ Abort(msg);
// will not return here
bind(&L);
}
-void MacroAssembler::Abort(BailoutReason reason) {
+void MacroAssembler::Abort(const char* msg) {
Label abort_start;
bind(&abort_start);
// We want to pass the msg string like a smi to avoid GC
@@ -2824,7 +2827,6 @@ void MacroAssembler::Abort(BailoutReason reason) {
// properly. Instead, we pass an aligned pointer that is
// a proper v8 smi, but also pass the alignment difference
// from the real pointer as a smi.
- const char* msg = GetBailoutReason(reason);
intptr_t p1 = reinterpret_cast<intptr_t>(msg);
intptr_t p0 = (p1 & ~kSmiTagMask) + kSmiTag;
ASSERT(reinterpret_cast<Object*>(p0)->IsSmi());
@@ -2967,7 +2969,7 @@ void MacroAssembler::LoadGlobalFunctionInitialMap(Register function,
CheckMap(map, scratch, Heap::kMetaMapRootIndex, &fail, DO_SMI_CHECK);
b(&ok);
bind(&fail);
- Abort(kGlobalFunctionsMustHaveInitialMap);
+ Abort("Global functions must have initial map");
bind(&ok);
}
}
@@ -3036,7 +3038,7 @@ void MacroAssembler::AssertNotSmi(Register object) {
if (emit_debug_code()) {
STATIC_ASSERT(kSmiTag == 0);
tst(object, Operand(kSmiTagMask));
- Check(ne, kOperandIsASmi);
+ Check(ne, "Operand is a smi");
}
}
@@ -3045,7 +3047,7 @@ void MacroAssembler::AssertSmi(Register object) {
if (emit_debug_code()) {
STATIC_ASSERT(kSmiTag == 0);
tst(object, Operand(kSmiTagMask));
- Check(eq, kOperandIsNotSmi);
+ Check(eq, "Operand is not smi");
}
}
@@ -3054,12 +3056,12 @@ void MacroAssembler::AssertString(Register object) {
if (emit_debug_code()) {
STATIC_ASSERT(kSmiTag == 0);
tst(object, Operand(kSmiTagMask));
- Check(ne, kOperandIsASmiAndNotAString);
+ Check(ne, "Operand is a smi and not a string");
push(object);
ldr(object, FieldMemOperand(object, HeapObject::kMapOffset));
CompareInstanceType(object, object, FIRST_NONSTRING_TYPE);
pop(object);
- Check(lo, kOperandIsNotAString);
+ Check(lo, "Operand is not a string");
}
}
@@ -3068,12 +3070,12 @@ void MacroAssembler::AssertName(Register object) {
if (emit_debug_code()) {
STATIC_ASSERT(kSmiTag == 0);
tst(object, Operand(kSmiTagMask));
- Check(ne, kOperandIsASmiAndNotAName);
+ Check(ne, "Operand is a smi and not a name");
push(object);
ldr(object, FieldMemOperand(object, HeapObject::kMapOffset));
CompareInstanceType(object, object, LAST_NAME_TYPE);
pop(object);
- Check(le, kOperandIsNotAName);
+ Check(le, "Operand is not a name");
}
}
@@ -3082,7 +3084,7 @@ void MacroAssembler::AssertName(Register object) {
void MacroAssembler::AssertIsRoot(Register reg, Heap::RootListIndex index) {
if (emit_debug_code()) {
CompareRoot(reg, index);
- Check(eq, kHeapNumberMapRegisterClobbered);
+ Check(eq, "HeapNumberMap register clobbered.");
}
}
@@ -3228,7 +3230,7 @@ void MacroAssembler::CopyBytes(Register src,
bind(&word_loop);
if (emit_debug_code()) {
tst(src, Operand(kPointerSize - 1));
- Assert(eq, kExpectingAlignmentForCopyBytes);
+ Assert(eq, "Expecting alignment for CopyBytes");
}
cmp(length, Operand(kPointerSize));
b(lt, &byte_loop);
@@ -3492,7 +3494,7 @@ void MacroAssembler::GetRelocatedValueLocation(Register ldr_location,
// Check that the instruction is a ldr reg, [pc + offset] .
and_(result, result, Operand(kLdrPCPattern));
cmp(result, Operand(kLdrPCPattern));
- Check(eq, kTheInstructionToPatchShouldBeALoadFromPc);
+ Check(eq, "The instruction to patch should be a load from pc.");
// Result was clobbered. Restore it.
ldr(result, MemOperand(ldr_location));
}
diff --git a/chromium/v8/src/arm/macro-assembler-arm.h b/chromium/v8/src/arm/macro-assembler-arm.h
index 8b9fa2b2216..38308e5cdef 100644
--- a/chromium/v8/src/arm/macro-assembler-arm.h
+++ b/chromium/v8/src/arm/macro-assembler-arm.h
@@ -144,8 +144,6 @@ class MacroAssembler: public Assembler {
Condition cond = al);
void Call(Label* target);
- void Push(Register src) { push(src); }
- void Pop(Register dst) { pop(dst); }
// Register move. May do nothing if the registers are identical.
void Move(Register dst, Handle<Object> value);
@@ -1138,14 +1136,14 @@ class MacroAssembler: public Assembler {
// Calls Abort(msg) if the condition cond is not satisfied.
// Use --debug_code to enable.
- void Assert(Condition cond, BailoutReason reason);
+ void Assert(Condition cond, const char* msg);
void AssertFastElements(Register elements);
// Like Assert(), but always enabled.
- void Check(Condition cond, BailoutReason reason);
+ void Check(Condition cond, const char* msg);
// Print a message to stdout and abort execution.
- void Abort(BailoutReason msg);
+ void Abort(const char* msg);
// Verify restrictions about code generated in stubs.
void set_generating_stub(bool value) { generating_stub_ = value; }
diff --git a/chromium/v8/src/array-iterator.js b/chromium/v8/src/array-iterator.js
index defd7342ab2..8f1ab47b8a2 100644
--- a/chromium/v8/src/array-iterator.js
+++ b/chromium/v8/src/array-iterator.js
@@ -77,15 +77,16 @@ function ArrayIteratorNext() {
return CreateIteratorResultObject(void 0, true);
}
+ var elementKey = ToString(index);
iterator[arrayIteratorNextIndexSymbol] = index + 1;
if (itemKind == ARRAY_ITERATOR_KIND_VALUES)
- return CreateIteratorResultObject(array[index], false);
+ return CreateIteratorResultObject(array[elementKey], false);
if (itemKind == ARRAY_ITERATOR_KIND_ENTRIES)
- return CreateIteratorResultObject([index, array[index]], false);
+ return CreateIteratorResultObject([elementKey, array[elementKey]], false);
- return CreateIteratorResultObject(index, false);
+ return CreateIteratorResultObject(elementKey, false);
}
function ArrayEntries() {
diff --git a/chromium/v8/src/assert-scope.h b/chromium/v8/src/assert-scope.h
index 269b280d027..13adbd0f9c5 100644
--- a/chromium/v8/src/assert-scope.h
+++ b/chromium/v8/src/assert-scope.h
@@ -41,7 +41,6 @@ enum PerThreadAssertType {
HANDLE_ALLOCATION_ASSERT,
HANDLE_DEREFERENCE_ASSERT,
DEFERRED_HANDLE_DEREFERENCE_ASSERT,
- CODE_DEPENDENCY_CHANGE_ASSERT,
LAST_PER_THREAD_ASSERT_TYPE
};
@@ -171,14 +170,6 @@ typedef PerThreadAssertScope<DEFERRED_HANDLE_DEREFERENCE_ASSERT, false>
typedef PerThreadAssertScope<DEFERRED_HANDLE_DEREFERENCE_ASSERT, true>
AllowDeferredHandleDereference;
-// Scope to document where we do not expect deferred handles to be dereferenced.
-typedef PerThreadAssertScope<CODE_DEPENDENCY_CHANGE_ASSERT, false>
- DisallowCodeDependencyChange;
-
-// Scope to introduce an exception to DisallowDeferredHandleDereference.
-typedef PerThreadAssertScope<CODE_DEPENDENCY_CHANGE_ASSERT, true>
- AllowCodeDependencyChange;
-
} } // namespace v8::internal
#endif // V8_ASSERT_SCOPE_H_
diff --git a/chromium/v8/src/ast.cc b/chromium/v8/src/ast.cc
index 23b680d47f4..e0bca67aab1 100644
--- a/chromium/v8/src/ast.cc
+++ b/chromium/v8/src/ast.cc
@@ -273,8 +273,7 @@ void ObjectLiteral::CalculateEmitStore(Zone* zone) {
uint32_t hash = literal->Hash();
// If the key of a computed property is in the table, do not emit
// a store for the property later.
- if ((property->kind() == ObjectLiteral::Property::MATERIALIZED_LITERAL ||
- property->kind() == ObjectLiteral::Property::COMPUTED) &&
+ if (property->kind() == ObjectLiteral::Property::COMPUTED &&
table.Lookup(literal, hash, false, allocator) != NULL) {
property->set_emit_store(false);
} else {
@@ -305,6 +304,17 @@ void UnaryOperation::RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) {
}
+bool UnaryOperation::ResultOverwriteAllowed() {
+ switch (op_) {
+ case Token::BIT_NOT:
+ case Token::SUB:
+ return true;
+ default:
+ return false;
+ }
+}
+
+
void BinaryOperation::RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) {
// TODO(olivf) If this Operation is used in a test context, then the right
// hand side has a ToBoolean stub and we want to collect the type information.
diff --git a/chromium/v8/src/ast.h b/chromium/v8/src/ast.h
index a8b74213adb..f14156f93c6 100644
--- a/chromium/v8/src/ast.h
+++ b/chromium/v8/src/ast.h
@@ -259,7 +259,6 @@ class Statement: public AstNode {
Statement() : statement_pos_(RelocInfo::kNoPosition) {}
bool IsEmpty() { return AsEmptyStatement() != NULL; }
- virtual bool IsJump() const { return false; }
void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; }
int statement_pos() const { return statement_pos_; }
@@ -292,6 +291,7 @@ class SmallMapList {
}
void Add(Handle<Map> handle, Zone* zone) {
+ ASSERT(!handle->is_deprecated());
list_.Add(handle.location(), zone);
}
@@ -389,7 +389,7 @@ class Expression: public AstNode {
protected:
explicit Expression(Isolate* isolate)
- : bounds_(Bounds::Unbounded(isolate)),
+ : bounds_(Type::None(), Type::Any(), isolate),
id_(GetNextId(isolate)),
test_id_(GetNextId(isolate)) {}
void set_to_boolean_types(byte types) { to_boolean_types_ = types; }
@@ -459,11 +459,6 @@ class Block: public BreakableStatement {
ZoneList<Statement*>* statements() { return &statements_; }
bool is_initializer_block() const { return is_initializer_block_; }
- virtual bool IsJump() const {
- return !statements_.is_empty() && statements_.last()->IsJump()
- && labels() == NULL; // Good enough as an approximation...
- }
-
Scope* scope() const { return scope_; }
void set_scope(Scope* scope) { scope_ = scope; }
@@ -1014,7 +1009,6 @@ class ExpressionStatement: public Statement {
void set_expression(Expression* e) { expression_ = e; }
Expression* expression() const { return expression_; }
- virtual bool IsJump() const { return expression_->IsThrow(); }
protected:
explicit ExpressionStatement(Expression* expression)
@@ -1025,16 +1019,7 @@ class ExpressionStatement: public Statement {
};
-class JumpStatement: public Statement {
- public:
- virtual bool IsJump() const { return true; }
-
- protected:
- JumpStatement() {}
-};
-
-
-class ContinueStatement: public JumpStatement {
+class ContinueStatement: public Statement {
public:
DECLARE_NODE_TYPE(ContinueStatement)
@@ -1049,7 +1034,7 @@ class ContinueStatement: public JumpStatement {
};
-class BreakStatement: public JumpStatement {
+class BreakStatement: public Statement {
public:
DECLARE_NODE_TYPE(BreakStatement)
@@ -1064,7 +1049,7 @@ class BreakStatement: public JumpStatement {
};
-class ReturnStatement: public JumpStatement {
+class ReturnStatement: public Statement {
public:
DECLARE_NODE_TYPE(ReturnStatement)
@@ -1183,11 +1168,6 @@ class IfStatement: public Statement {
Statement* then_statement() const { return then_statement_; }
Statement* else_statement() const { return else_statement_; }
- virtual bool IsJump() const {
- return HasThenStatement() && then_statement()->IsJump()
- && HasElseStatement() && else_statement()->IsJump();
- }
-
BailoutId IfId() const { return if_id_; }
BailoutId ThenId() const { return then_id_; }
BailoutId ElseId() const { return else_id_; }
@@ -1847,6 +1827,8 @@ class UnaryOperation: public Expression {
public:
DECLARE_NODE_TYPE(UnaryOperation)
+ virtual bool ResultOverwriteAllowed();
+
Token::Value op() const { return op_; }
Expression* expression() const { return expression_; }
virtual int position() const { return pos_; }
@@ -1854,6 +1836,8 @@ class UnaryOperation: public Expression {
BailoutId MaterializeTrueId() { return materialize_true_id_; }
BailoutId MaterializeFalseId() { return materialize_false_id_; }
+ TypeFeedbackId UnaryOperationFeedbackId() const { return reuse(id()); }
+
virtual void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle);
protected:
diff --git a/chromium/v8/src/atomicops_internals_tsan.h b/chromium/v8/src/atomicops_internals_tsan.h
index b5162bad9f6..e52c26c2fe2 100644
--- a/chromium/v8/src/atomicops_internals_tsan.h
+++ b/chromium/v8/src/atomicops_internals_tsan.h
@@ -32,12 +32,6 @@
#ifndef V8_ATOMICOPS_INTERNALS_TSAN_H_
#define V8_ATOMICOPS_INTERNALS_TSAN_H_
-namespace v8 {
-namespace internal {
-
-#ifndef TSAN_INTERFACE_ATOMIC_H
-#define TSAN_INTERFACE_ATOMIC_H
-
// This struct is not part of the public API of this module; clients may not
// use it. (However, it's exported via BASE_EXPORT because clients implicitly
// do use it at link time by inlining these functions.)
@@ -53,6 +47,12 @@ extern struct AtomicOps_x86CPUFeatureStruct
#define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory")
+namespace v8 {
+namespace internal {
+
+#ifndef TSAN_INTERFACE_ATOMIC_H
+#define TSAN_INTERFACE_ATOMIC_H
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/chromium/v8/src/bootstrapper.cc b/chromium/v8/src/bootstrapper.cc
index 2a385aa4865..c2cc6efc45f 100644
--- a/chromium/v8/src/bootstrapper.cc
+++ b/chromium/v8/src/bootstrapper.cc
@@ -2085,11 +2085,6 @@ bool Genesis::InstallExperimentalNatives() {
"native harmony-string.js") == 0) {
if (!CompileExperimentalBuiltin(isolate(), i)) return false;
}
- if (FLAG_harmony_arrays &&
- strcmp(ExperimentalNatives::GetScriptName(i).start(),
- "native harmony-array.js") == 0) {
- if (!CompileExperimentalBuiltin(isolate(), i)) return false;
- }
}
InstallExperimentalNativeFunctions();
diff --git a/chromium/v8/src/builtins.h b/chromium/v8/src/builtins.h
index bb36c0251d9..73a2e964590 100644
--- a/chromium/v8/src/builtins.h
+++ b/chromium/v8/src/builtins.h
@@ -259,6 +259,8 @@ enum BuiltinExtraArguments {
V(BIT_OR, 1) \
V(BIT_AND, 1) \
V(BIT_XOR, 1) \
+ V(UNARY_MINUS, 0) \
+ V(BIT_NOT, 0) \
V(SHL, 1) \
V(SAR, 1) \
V(SHR, 1) \
diff --git a/chromium/v8/src/code-stubs-hydrogen.cc b/chromium/v8/src/code-stubs-hydrogen.cc
index 4f6db35dd93..9ca6a47f2ee 100644
--- a/chromium/v8/src/code-stubs-hydrogen.cc
+++ b/chromium/v8/src/code-stubs-hydrogen.cc
@@ -41,13 +41,13 @@ static LChunk* OptimizeGraph(HGraph* graph) {
DisallowHandleDereference no_deref;
ASSERT(graph != NULL);
- BailoutReason bailout_reason = kNoReason;
+ SmartArrayPointer<char> bailout_reason;
if (!graph->Optimize(&bailout_reason)) {
- FATAL(GetBailoutReason(bailout_reason));
+ FATAL(bailout_reason.is_empty() ? "unknown" : *bailout_reason);
}
LChunk* chunk = LChunk::NewChunk(graph);
if (chunk == NULL) {
- FATAL(GetBailoutReason(graph->info()->bailout_reason()));
+ FATAL(graph->info()->bailout_reason());
}
return chunk;
}
@@ -92,7 +92,7 @@ class CodeStubGraphBuilderBase : public HGraphBuilder {
}
~ArrayContextChecker() {
- checker_.ElseDeopt("Array constructor called from different context");
+ checker_.ElseDeopt();
checker_.End();
}
private:
@@ -233,7 +233,7 @@ class CodeStubGraphBuilder: public CodeStubGraphBuilderBase {
IfBuilder builder(this);
builder.IfNot<HCompareObjectEqAndBranch, HValue*>(undefined, undefined);
builder.Then();
- builder.ElseDeopt("Forced deopt to runtime");
+ builder.ElseDeopt();
return undefined;
}
@@ -387,7 +387,7 @@ HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() {
length));
}
- checker.ElseDeopt("Uninitialized boilerplate literals");
+ checker.ElseDeopt();
checker.End();
return environment()->Pop();
@@ -434,7 +434,7 @@ HValue* CodeStubGraphBuilder<FastCloneShallowObjectStub>::BuildCodeStub() {
}
environment()->Push(object);
- checker.ElseDeopt("Uninitialized boilerplate in fast clone");
+ checker.ElseDeopt();
checker.End();
return environment()->Pop();
@@ -802,6 +802,44 @@ Handle<Code> CompareNilICStub::GenerateCode() {
template <>
+HValue* CodeStubGraphBuilder<UnaryOpStub>::BuildCodeInitializedStub() {
+ UnaryOpStub* stub = casted_stub();
+ Handle<Type> type = stub->GetType(graph()->isolate());
+ HValue* input = GetParameter(0);
+
+ // Prevent unwanted HChange being inserted to ensure that the stub
+ // deopts on newly encountered types.
+ if (!type->Maybe(Type::Double())) {
+ input = Add<HForceRepresentation>(input, Representation::Smi());
+ }
+
+ if (!type->Is(Type::Number())) {
+ // If we expect to see other things than Numbers, we will create a generic
+ // stub, which handles all numbers and calls into the runtime for the rest.
+ IfBuilder if_number(this);
+ if_number.If<HIsNumberAndBranch>(input);
+ if_number.Then();
+ HInstruction* res = BuildUnaryMathOp(input, type, stub->operation());
+ if_number.Return(AddInstruction(res));
+ if_number.Else();
+ HValue* function = AddLoadJSBuiltin(stub->ToJSBuiltin());
+ Add<HPushArgument>(GetParameter(0));
+ HValue* result = Add<HInvokeFunction>(function, 1);
+ if_number.Return(result);
+ if_number.End();
+ return graph()->GetConstantUndefined();
+ }
+
+ return AddInstruction(BuildUnaryMathOp(input, type, stub->operation()));
+}
+
+
+Handle<Code> UnaryOpStub::GenerateCode() {
+ return DoGenerateCode(this);
+}
+
+
+template <>
HValue* CodeStubGraphBuilder<ToBooleanStub>::BuildCodeInitializedStub() {
ToBooleanStub* stub = casted_stub();
@@ -844,7 +882,7 @@ HValue* CodeStubGraphBuilder<StoreGlobalStub>::BuildCodeInitializedStub() {
IfBuilder builder(this);
builder.If<HCompareObjectEqAndBranch>(cell_contents, value);
builder.Then();
- builder.ElseDeopt("Unexpected cell contents in constant global store");
+ builder.ElseDeopt();
builder.End();
} else {
// Load the payload of the global parameter cell. A hole indicates that the
@@ -854,7 +892,7 @@ HValue* CodeStubGraphBuilder<StoreGlobalStub>::BuildCodeInitializedStub() {
HValue* hole_value = Add<HConstant>(hole);
builder.If<HCompareObjectEqAndBranch>(cell_contents, hole_value);
builder.Then();
- builder.Deopt("Unexpected cell contents in global store");
+ builder.Deopt();
builder.Else();
Add<HStoreNamedField>(cell, access, value);
builder.End();
@@ -878,8 +916,7 @@ HValue* CodeStubGraphBuilder<ElementsTransitionAndStoreStub>::BuildCodeStub() {
if (FLAG_trace_elements_transitions) {
// Tracing elements transitions is the job of the runtime.
- Add<HDeoptimize>("Deopt due to --trace-elements-transitions",
- Deoptimizer::EAGER);
+ Add<HDeoptimize>(Deoptimizer::EAGER);
} else {
info()->MarkAsSavesCallerDoubles();
diff --git a/chromium/v8/src/code-stubs.cc b/chromium/v8/src/code-stubs.cc
index f656bf7d96b..5f6616ea07a 100644
--- a/chromium/v8/src/code-stubs.cc
+++ b/chromium/v8/src/code-stubs.cc
@@ -204,6 +204,71 @@ void CodeStub::PrintName(StringStream* stream) {
}
+Builtins::JavaScript UnaryOpStub::ToJSBuiltin() {
+ switch (operation_) {
+ default:
+ UNREACHABLE();
+ case Token::SUB:
+ return Builtins::UNARY_MINUS;
+ case Token::BIT_NOT:
+ return Builtins::BIT_NOT;
+ }
+}
+
+
+Handle<JSFunction> UnaryOpStub::ToJSFunction(Isolate* isolate) {
+ Handle<JSBuiltinsObject> builtins(isolate->js_builtins_object());
+ Object* builtin = builtins->javascript_builtin(ToJSBuiltin());
+ return Handle<JSFunction>(JSFunction::cast(builtin), isolate);
+}
+
+
+MaybeObject* UnaryOpStub::Result(Handle<Object> object, Isolate* isolate) {
+ Handle<JSFunction> builtin_function = ToJSFunction(isolate);
+ bool caught_exception;
+ Handle<Object> result = Execution::Call(builtin_function, object,
+ 0, NULL, &caught_exception);
+ if (caught_exception) {
+ return Failure::Exception();
+ }
+ return *result;
+}
+
+
+void UnaryOpStub::UpdateStatus(Handle<Object> object) {
+ State old_state(state_);
+ if (object->IsSmi()) {
+ state_.Add(SMI);
+ if (operation_ == Token::SUB && *object == 0) {
+ // The result (-0) has to be represented as double.
+ state_.Add(HEAP_NUMBER);
+ }
+ } else if (object->IsHeapNumber()) {
+ state_.Add(HEAP_NUMBER);
+ } else {
+ state_.Add(GENERIC);
+ }
+ TraceTransition(old_state, state_);
+}
+
+
+Handle<Type> UnaryOpStub::GetType(Isolate* isolate) {
+ if (state_.Contains(GENERIC)) {
+ return handle(Type::Any(), isolate);
+ }
+ Handle<Type> type = handle(Type::None(), isolate);
+ if (state_.Contains(SMI)) {
+ type = handle(
+ Type::Union(type, handle(Type::Smi(), isolate)), isolate);
+ }
+ if (state_.Contains(HEAP_NUMBER)) {
+ type = handle(
+ Type::Union(type, handle(Type::Double(), isolate)), isolate);
+ }
+ return type;
+}
+
+
void BinaryOpStub::Generate(MacroAssembler* masm) {
// Explicitly allow generation of nested stubs. It is safe here because
// generation code does not use any raw pointers.
@@ -289,6 +354,29 @@ void BinaryOpStub::GenerateCallRuntime(MacroAssembler* masm) {
#undef __
+void UnaryOpStub::PrintBaseName(StringStream* stream) {
+ CodeStub::PrintBaseName(stream);
+ if (operation_ == Token::SUB) stream->Add("Minus");
+ if (operation_ == Token::BIT_NOT) stream->Add("Not");
+}
+
+
+void UnaryOpStub::PrintState(StringStream* stream) {
+ state_.Print(stream);
+}
+
+
+void UnaryOpStub::State::Print(StringStream* stream) const {
+ stream->Add("(");
+ SimpleListPrinter printer(stream);
+ if (IsEmpty()) printer.Add("None");
+ if (Contains(GENERIC)) printer.Add("Generic");
+ if (Contains(HEAP_NUMBER)) printer.Add("HeapNumber");
+ if (Contains(SMI)) printer.Add("Smi");
+ stream->Add(")");
+}
+
+
void BinaryOpStub::PrintName(StringStream* stream) {
const char* op_name = Token::Name(op_);
const char* overwrite_name;
@@ -469,9 +557,6 @@ void CompareNilICStub::UpdateStatus(Handle<Object> object) {
template<class StateType>
void HydrogenCodeStub::TraceTransition(StateType from, StateType to) {
- // Note: Although a no-op transition is semantically OK, it is hinting at a
- // bug somewhere in our state transition machinery.
- ASSERT(from != to);
#ifdef DEBUG
if (!FLAG_trace_ic) return;
char buffer[100];
diff --git a/chromium/v8/src/code-stubs.h b/chromium/v8/src/code-stubs.h
index c58acd6b16d..84d9b023b3a 100644
--- a/chromium/v8/src/code-stubs.h
+++ b/chromium/v8/src/code-stubs.h
@@ -40,6 +40,7 @@ namespace internal {
#define CODE_STUB_LIST_ALL_PLATFORMS(V) \
V(CallFunction) \
V(CallConstruct) \
+ V(UnaryOp) \
V(BinaryOp) \
V(StringAdd) \
V(SubString) \
@@ -592,6 +593,73 @@ class StoreGlobalStub : public HydrogenCodeStub {
};
+class UnaryOpStub : public HydrogenCodeStub {
+ public:
+ // Stub without type info available -> construct uninitialized
+ explicit UnaryOpStub(Token::Value operation)
+ : HydrogenCodeStub(UNINITIALIZED), operation_(operation) { }
+ explicit UnaryOpStub(Code::ExtraICState ic_state) :
+ state_(StateBits::decode(ic_state)),
+ operation_(OperatorBits::decode(ic_state)) { }
+
+ virtual void InitializeInterfaceDescriptor(
+ Isolate* isolate,
+ CodeStubInterfaceDescriptor* descriptor);
+
+ virtual Code::Kind GetCodeKind() const { return Code::UNARY_OP_IC; }
+ virtual InlineCacheState GetICState() {
+ if (state_.Contains(GENERIC)) {
+ return MEGAMORPHIC;
+ } else if (state_.IsEmpty()) {
+ return PREMONOMORPHIC;
+ } else {
+ return MONOMORPHIC;
+ }
+ }
+ virtual Code::ExtraICState GetExtraICState() {
+ return OperatorBits::encode(operation_) |
+ StateBits::encode(state_.ToIntegral());
+ }
+
+ Token::Value operation() { return operation_; }
+ Handle<JSFunction> ToJSFunction(Isolate* isolate);
+ Builtins::JavaScript ToJSBuiltin();
+
+ void UpdateStatus(Handle<Object> object);
+ MaybeObject* Result(Handle<Object> object, Isolate* isolate);
+ Handle<Code> GenerateCode();
+ Handle<Type> GetType(Isolate* isolate);
+
+ protected:
+ void PrintState(StringStream* stream);
+ void PrintBaseName(StringStream* stream);
+
+ private:
+ enum UnaryOpType {
+ SMI,
+ HEAP_NUMBER,
+ GENERIC,
+ NUMBER_OF_TYPES
+ };
+
+ class State : public EnumSet<UnaryOpType, byte> {
+ public:
+ State() : EnumSet<UnaryOpType, byte>() { }
+ explicit State(byte bits) : EnumSet<UnaryOpType, byte>(bits) { }
+ void Print(StringStream* stream) const;
+ };
+
+ class StateBits : public BitField<int, 0, NUMBER_OF_TYPES> { };
+ class OperatorBits : public BitField<Token::Value, NUMBER_OF_TYPES, 8> { };
+
+ State state_;
+ Token::Value operation_;
+
+ virtual CodeStub::Major MajorKey() { return UnaryOp; }
+ virtual int NotMissMinorKey() { return GetExtraICState(); }
+};
+
+
class FastCloneShallowArrayStub : public HydrogenCodeStub {
public:
// Maximum length of copied elements array.
diff --git a/chromium/v8/src/compiler.cc b/chromium/v8/src/compiler.cc
index f6e5daac854..3c51baa30e9 100644
--- a/chromium/v8/src/compiler.cc
+++ b/chromium/v8/src/compiler.cc
@@ -120,7 +120,6 @@ void CompilationInfo::Initialize(Isolate* isolate,
return;
}
mode_ = V8::UseCrankshaft() ? mode : NONOPT;
- abort_due_to_dependency_ = false;
if (script_->type()->value() == Script::TYPE_NATIVE) {
MarkAsNative();
}
@@ -128,7 +127,7 @@ void CompilationInfo::Initialize(Isolate* isolate,
ASSERT(language_mode() == CLASSIC_MODE);
SetLanguageMode(shared_info_->language_mode());
}
- set_bailout_reason(kUnknown);
+ set_bailout_reason("unknown");
}
@@ -343,7 +342,7 @@ OptimizingCompiler::Status OptimizingCompiler::CreateGraph() {
const int kMaxOptCount =
FLAG_deopt_every_n_times == 0 ? FLAG_max_opt_count : 1000;
if (info()->opt_count() > kMaxOptCount) {
- info()->set_bailout_reason(kOptimizedTooManyTimes);
+ info()->set_bailout_reason("optimized too many times");
return AbortOptimization();
}
@@ -357,14 +356,14 @@ OptimizingCompiler::Status OptimizingCompiler::CreateGraph() {
const int parameter_limit = -LUnallocated::kMinFixedSlotIndex;
Scope* scope = info()->scope();
if ((scope->num_parameters() + 1) > parameter_limit) {
- info()->set_bailout_reason(kTooManyParameters);
+ info()->set_bailout_reason("too many parameters");
return AbortOptimization();
}
const int locals_limit = LUnallocated::kMaxFixedSlotIndex;
if (!info()->osr_ast_id().IsNone() &&
scope->num_parameters() + 1 + scope->num_stack_slots() > locals_limit) {
- info()->set_bailout_reason(kTooManyParametersLocals);
+ info()->set_bailout_reason("too many parameters/locals");
return AbortOptimization();
}
@@ -447,12 +446,6 @@ OptimizingCompiler::Status OptimizingCompiler::CreateGraph() {
}
}
- if (info()->HasAbortedDueToDependencyChange()) {
- info_->set_bailout_reason(kBailedOutDueToDependencyChange);
- info_->AbortOptimization();
- return SetLastStatus(BAILED_OUT);
- }
-
return SetLastStatus(SUCCEEDED);
}
@@ -461,14 +454,13 @@ OptimizingCompiler::Status OptimizingCompiler::OptimizeGraph() {
DisallowHeapAllocation no_allocation;
DisallowHandleAllocation no_handles;
DisallowHandleDereference no_deref;
- DisallowCodeDependencyChange no_dependency_change;
ASSERT(last_status() == SUCCEEDED);
Timer t(this, &time_taken_to_optimize_);
ASSERT(graph_ != NULL);
- BailoutReason bailout_reason = kNoReason;
+ SmartArrayPointer<char> bailout_reason;
if (!graph_->Optimize(&bailout_reason)) {
- if (bailout_reason == kNoReason) graph_builder_->Bailout(bailout_reason);
+ if (!bailout_reason.is_empty()) graph_builder_->Bailout(*bailout_reason);
return SetLastStatus(BAILED_OUT);
} else {
chunk_ = LChunk::NewChunk(graph_);
@@ -482,8 +474,6 @@ OptimizingCompiler::Status OptimizingCompiler::OptimizeGraph() {
OptimizingCompiler::Status OptimizingCompiler::GenerateAndInstallCode() {
ASSERT(last_status() == SUCCEEDED);
- ASSERT(!info()->HasAbortedDueToDependencyChange());
- DisallowCodeDependencyChange no_dependency_change;
{ // Scope for timer.
Timer timer(this, &time_taken_to_codegen_);
ASSERT(chunk_ != NULL);
@@ -495,9 +485,7 @@ OptimizingCompiler::Status OptimizingCompiler::GenerateAndInstallCode() {
DisallowDeferredHandleDereference no_deferred_handle_deref;
Handle<Code> optimized_code = chunk_->Codegen();
if (optimized_code.is_null()) {
- if (info()->bailout_reason() == kNoReason) {
- info()->set_bailout_reason(kCodeGenerationFailed);
- }
+ info()->set_bailout_reason("code generation failed");
return AbortOptimization();
}
info()->SetCode(optimized_code);
@@ -792,7 +780,7 @@ Handle<SharedFunctionInfo> Compiler::CompileEval(Handle<String> source,
if (!result.is_null()) {
// Explicitly disable optimization for eval code. We're not yet prepared
// to handle eval-code in the optimizing compiler.
- result->DisableOptimization(kEval);
+ result->DisableOptimization("eval");
// If caller is strict mode, the result must be in strict mode or
// extended mode as well, but not the other way around. Consider:
@@ -825,7 +813,6 @@ static bool InstallFullCode(CompilationInfo* info) {
// was flushed. By setting the code object last we avoid this.
Handle<SharedFunctionInfo> shared = info->shared_info();
Handle<Code> code = info->code();
- CHECK(code->kind() == Code::FUNCTION);
Handle<JSFunction> function = info->closure();
Handle<ScopeInfo> scope_info =
ScopeInfo::Create(info->scope(), info->zone());
@@ -983,9 +970,7 @@ void Compiler::RecompileParallel(Handle<JSFunction> closure) {
if (!isolate->optimizing_compiler_thread()->IsQueueAvailable()) {
if (FLAG_trace_parallel_recompilation) {
- PrintF(" ** Compilation queue full, will retry optimizing ");
- closure->PrintName();
- PrintF(" on next run.\n");
+ PrintF(" ** Compilation queue, will retry opting on next run.\n");
}
return;
}
@@ -1070,13 +1055,13 @@ void Compiler::InstallOptimizedCode(OptimizingCompiler* optimizing_compiler) {
// the unoptimized code.
OptimizingCompiler::Status status = optimizing_compiler->last_status();
if (info->HasAbortedDueToDependencyChange()) {
- info->set_bailout_reason(kBailedOutDueToDependencyChange);
+ info->set_bailout_reason("bailed out due to dependent map");
status = optimizing_compiler->AbortOptimization();
} else if (status != OptimizingCompiler::SUCCEEDED) {
- info->set_bailout_reason(kFailedBailedOutLastTime);
+ info->set_bailout_reason("failed/bailed out last time");
status = optimizing_compiler->AbortOptimization();
} else if (isolate->DebuggerHasBreakPoints()) {
- info->set_bailout_reason(kDebuggerIsActive);
+ info->set_bailout_reason("debugger is active");
status = optimizing_compiler->AbortOptimization();
} else {
status = optimizing_compiler->GenerateAndInstallCode();
diff --git a/chromium/v8/src/compiler.h b/chromium/v8/src/compiler.h
index 7d442f9d461..d36e488b174 100644
--- a/chromium/v8/src/compiler.h
+++ b/chromium/v8/src/compiler.h
@@ -199,11 +199,6 @@ class CompilationInfo {
return IsCompilingForDebugging::decode(flags_);
}
- bool ShouldTrapOnDeopt() const {
- return (FLAG_trap_on_deopt && IsOptimizing()) ||
- (FLAG_trap_on_stub_deopt && IsStub());
- }
-
bool has_global_object() const {
return !closure().is_null() &&
(closure()->context()->global_object() != NULL);
@@ -263,8 +258,8 @@ class CompilationInfo {
SaveHandle(&script_);
}
- BailoutReason bailout_reason() const { return bailout_reason_; }
- void set_bailout_reason(BailoutReason reason) { bailout_reason_ = reason; }
+ const char* bailout_reason() const { return bailout_reason_; }
+ void set_bailout_reason(const char* reason) { bailout_reason_ = reason; }
int prologue_offset() const {
ASSERT_NE(kPrologueOffsetNotSet, prologue_offset_);
@@ -298,13 +293,11 @@ class CompilationInfo {
}
void AbortDueToDependencyChange() {
- ASSERT(!isolate()->optimizing_compiler_thread()->IsOptimizerThread());
- abort_due_to_dependency_ = true;
+ mode_ = DEPENDENCY_CHANGE_ABORT;
}
bool HasAbortedDueToDependencyChange() {
- ASSERT(!isolate()->optimizing_compiler_thread()->IsOptimizerThread());
- return abort_due_to_dependency_;
+ return mode_ == DEPENDENCY_CHANGE_ABORT;
}
protected:
@@ -328,7 +321,8 @@ class CompilationInfo {
BASE,
OPTIMIZE,
NONOPT,
- STUB
+ STUB,
+ DEPENDENCY_CHANGE_ABORT
};
void Initialize(Isolate* isolate, Mode mode, Zone* zone);
@@ -402,9 +396,6 @@ class CompilationInfo {
Mode mode_;
BailoutId osr_ast_id_;
- // Flag whether compilation needs to be aborted due to dependency change.
- bool abort_due_to_dependency_;
-
// The zone from which the compilation pipeline working on this
// CompilationInfo allocates.
Zone* zone_;
@@ -421,7 +412,7 @@ class CompilationInfo {
}
}
- BailoutReason bailout_reason_;
+ const char* bailout_reason_;
int prologue_offset_;
diff --git a/chromium/v8/src/cpu-profiler.cc b/chromium/v8/src/cpu-profiler.cc
index 747542f7378..0a83b85f505 100644
--- a/chromium/v8/src/cpu-profiler.cc
+++ b/chromium/v8/src/cpu-profiler.cc
@@ -106,7 +106,7 @@ bool ProfilerEventsProcessor::ProcessCodeEvent() {
bool ProfilerEventsProcessor::ProcessTicks() {
while (true) {
- while (!ticks_from_vm_buffer_.IsEmpty()
+ if (!ticks_from_vm_buffer_.IsEmpty()
&& ticks_from_vm_buffer_.Peek()->order ==
last_processed_code_event_id_) {
TickSampleEventRecord record;
diff --git a/chromium/v8/src/cpu-profiler.h b/chromium/v8/src/cpu-profiler.h
index 1dd405e5d76..cbe3e3cf81d 100644
--- a/chromium/v8/src/cpu-profiler.h
+++ b/chromium/v8/src/cpu-profiler.h
@@ -241,7 +241,6 @@ class CpuProfiler : public CodeEventListener {
ProfileGenerator* generator() const { return generator_; }
ProfilerEventsProcessor* processor() const { return processor_; }
- Isolate* isolate() const { return isolate_; }
private:
void StartProcessorIfNotStarted();
@@ -259,6 +258,7 @@ class CpuProfiler : public CodeEventListener {
bool need_to_stop_sampler_;
bool is_profiling_;
+ private:
DISALLOW_COPY_AND_ASSIGN(CpuProfiler);
};
diff --git a/chromium/v8/src/d8.cc b/chromium/v8/src/d8.cc
index c7b66c2a150..6e7beebf549 100644
--- a/chromium/v8/src/d8.cc
+++ b/chromium/v8/src/d8.cc
@@ -1406,14 +1406,6 @@ bool Shell::SetOptions(int argc, char* argv[]) {
#else
options.num_parallel_files++;
#endif // V8_SHARED
- } else if (strcmp(argv[i], "--dump-heap-constants") == 0) {
-#ifdef V8_SHARED
- printf("D8 with shared library does not support constant dumping\n");
- return false;
-#else
- options.dump_heap_constants = true;
- argv[i] = NULL;
-#endif
}
#ifdef V8_SHARED
else if (strcmp(argv[i], "--dump-counters") == 0) {
@@ -1568,63 +1560,6 @@ static void SetStandaloneFlagsViaCommandLine() {
#endif
-#ifndef V8_SHARED
-static void DumpHeapConstants(i::Isolate* isolate) {
- i::Heap* heap = isolate->heap();
-
- // Dump the INSTANCE_TYPES table to the console.
- printf("# List of known V8 instance types.\n");
-#define DUMP_TYPE(T) printf(" %d: \"%s\",\n", i::T, #T);
- printf("INSTANCE_TYPES = {\n");
- INSTANCE_TYPE_LIST(DUMP_TYPE)
- printf("}\n");
-#undef DUMP_TYPE
-
- // Dump the KNOWN_MAP table to the console.
- printf("\n# List of known V8 maps.\n");
-#define ROOT_LIST_CASE(type, name, camel_name) \
- if (n == NULL && o == heap->name()) n = #camel_name;
-#define STRUCT_LIST_CASE(upper_name, camel_name, name) \
- if (n == NULL && o == heap->name##_map()) n = #camel_name "Map";
- i::HeapObjectIterator it(heap->map_space());
- printf("KNOWN_MAPS = {\n");
- for (i::Object* o = it.Next(); o != NULL; o = it.Next()) {
- i::Map* m = i::Map::cast(o);
- const char* n = NULL;
- intptr_t p = reinterpret_cast<intptr_t>(m) & 0xfffff;
- int t = m->instance_type();
- ROOT_LIST(ROOT_LIST_CASE)
- STRUCT_LIST(STRUCT_LIST_CASE)
- if (n == NULL) continue;
- printf(" 0x%05" V8PRIxPTR ": (%d, \"%s\"),\n", p, t, n);
- }
- printf("}\n");
-#undef STRUCT_LIST_CASE
-#undef ROOT_LIST_CASE
-
- // Dump the KNOWN_OBJECTS table to the console.
- printf("\n# List of known V8 objects.\n");
-#define ROOT_LIST_CASE(type, name, camel_name) \
- if (n == NULL && o == heap->name()) n = #camel_name;
- i::OldSpaces spit(heap);
- printf("KNOWN_OBJECTS = {\n");
- for (i::PagedSpace* s = spit.next(); s != NULL; s = spit.next()) {
- i::HeapObjectIterator it(s);
- const char* sname = AllocationSpaceName(s->identity());
- for (i::Object* o = it.Next(); o != NULL; o = it.Next()) {
- const char* n = NULL;
- intptr_t p = reinterpret_cast<intptr_t>(o) & 0xfffff;
- ROOT_LIST(ROOT_LIST_CASE)
- if (n == NULL) continue;
- printf(" (\"%s\", 0x%05" V8PRIxPTR "): \"%s\",\n", sname, p, n);
- }
- }
- printf("}\n");
-#undef ROOT_LIST_CASE
-}
-#endif // V8_SHARED
-
-
class ShellArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
public:
virtual void* Allocate(size_t length) {
@@ -1668,13 +1603,6 @@ int Shell::Main(int argc, char* argv[]) {
PerIsolateData data(isolate);
InitializeDebugger(isolate);
-#ifndef V8_SHARED
- if (options.dump_heap_constants) {
- DumpHeapConstants(reinterpret_cast<i::Isolate*>(isolate));
- return 0;
- }
-#endif
-
if (options.stress_opt || options.stress_deopt) {
Testing::SetStressRunType(options.stress_opt
? Testing::kStressTypeOpt
diff --git a/chromium/v8/src/d8.h b/chromium/v8/src/d8.h
index 3b06985ca25..4f04342cf4d 100644
--- a/chromium/v8/src/d8.h
+++ b/chromium/v8/src/d8.h
@@ -231,7 +231,6 @@ class ShellOptions {
stress_deopt(false),
interactive_shell(false),
test_shell(false),
- dump_heap_constants(false),
num_isolates(1),
isolate_sources(NULL) { }
@@ -255,7 +254,6 @@ class ShellOptions {
bool stress_deopt;
bool interactive_shell;
bool test_shell;
- bool dump_heap_constants;
int num_isolates;
SourceGroup* isolate_sources;
};
diff --git a/chromium/v8/src/debug.cc b/chromium/v8/src/debug.cc
index 4966713baab..a0b9884410f 100644
--- a/chromium/v8/src/debug.cc
+++ b/chromium/v8/src/debug.cc
@@ -159,6 +159,7 @@ void BreakLocationIterator::Next() {
Code* code = Code::GetCodeFromTargetAddress(target);
if ((code->is_inline_cache_stub() &&
!code->is_binary_op_stub() &&
+ !code->is_unary_op_stub() &&
!code->is_compare_ic_stub() &&
!code->is_to_boolean_ic_stub()) ||
RelocInfo::IsConstructCall(rmode())) {
@@ -409,9 +410,6 @@ bool BreakLocationIterator::IsStepInLocation(Isolate* isolate) {
HandleScope scope(debug_info_->GetIsolate());
Address target = rinfo()->target_address();
Handle<Code> target_code(Code::GetCodeFromTargetAddress(target));
- if (target_code->kind() == Code::STUB) {
- return target_code->major_key() == CodeStub::CallFunction;
- }
return target_code->is_call_stub() || target_code->is_keyed_call_stub();
} else {
return false;
@@ -2047,10 +2045,6 @@ void Debug::PrepareForBreakPoints() {
// If preparing for the first break point make sure to deoptimize all
// functions as debugging does not work with optimized code.
if (!has_break_points_) {
- if (FLAG_parallel_recompilation) {
- isolate_->optimizing_compiler_thread()->Flush();
- }
-
Deoptimizer::DeoptimizeAll(isolate_);
Handle<Code> lazy_compile =
diff --git a/chromium/v8/src/deoptimizer.cc b/chromium/v8/src/deoptimizer.cc
index dc9ffc51186..53b9b76377f 100644
--- a/chromium/v8/src/deoptimizer.cc
+++ b/chromium/v8/src/deoptimizer.cc
@@ -602,12 +602,6 @@ Deoptimizer::Deoptimizer(Isolate* isolate,
deferred_objects_double_values_(0),
deferred_objects_(0),
deferred_heap_numbers_(0),
- jsframe_functions_(0),
- jsframe_has_adapted_arguments_(0),
- materialized_values_(NULL),
- materialized_objects_(NULL),
- materialization_value_index_(0),
- materialization_object_index_(0),
trace_(false) {
// For COMPILED_STUBs called from builtins, the function pointer is a SMI
// indicating an internal frame.
@@ -1214,15 +1208,7 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
unsigned output_offset = output_frame_size;
for (int i = 0; i < parameter_count; ++i) {
output_offset -= kPointerSize;
- int deferred_object_index = deferred_objects_.length();
DoTranslateCommand(iterator, frame_index, output_offset);
- // The allocated receiver of a construct stub frame is passed as the
- // receiver parameter through the translation. It might be encoding
- // a captured object, patch the slot address for a captured object.
- if (i == 0 && deferred_objects_.length() > deferred_object_index) {
- ASSERT(!deferred_objects_[deferred_object_index].is_arguments());
- deferred_objects_[deferred_object_index].patch_slot_address(top_address);
- }
}
// Read caller's PC from the previous frame.
@@ -1647,93 +1633,9 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
}
-Handle<Object> Deoptimizer::MaterializeNextHeapObject() {
- int object_index = materialization_object_index_++;
- ObjectMaterializationDescriptor desc = deferred_objects_[object_index];
- const int length = desc.object_length();
-
- if (desc.duplicate_object() >= 0) {
- // Found a previously materialized object by de-duplication.
- object_index = desc.duplicate_object();
- materialized_objects_->Add(Handle<Object>());
- } else if (desc.is_arguments() && ArgumentsObjectIsAdapted(object_index)) {
- // Use the arguments adapter frame we just built to materialize the
- // arguments object. FunctionGetArguments can't throw an exception.
- Handle<JSFunction> function = ArgumentsObjectFunction(object_index);
- Handle<JSObject> arguments = Handle<JSObject>::cast(
- Accessors::FunctionGetArguments(function));
- materialized_objects_->Add(arguments);
- materialization_value_index_ += length;
- } else if (desc.is_arguments()) {
- // Construct an arguments object and copy the parameters to a newly
- // allocated arguments object backing store.
- Handle<JSFunction> function = ArgumentsObjectFunction(object_index);
- Handle<JSObject> arguments =
- isolate_->factory()->NewArgumentsObject(function, length);
- Handle<FixedArray> array = isolate_->factory()->NewFixedArray(length);
- ASSERT(array->length() == length);
- arguments->set_elements(*array);
- materialized_objects_->Add(arguments);
- for (int i = 0; i < length; ++i) {
- Handle<Object> value = MaterializeNextValue();
- array->set(i, *value);
- }
- } else {
- // Dispatch on the instance type of the object to be materialized.
- Handle<Map> map = Handle<Map>::cast(MaterializeNextValue());
- switch (map->instance_type()) {
- case HEAP_NUMBER_TYPE: {
- Handle<HeapNumber> number =
- Handle<HeapNumber>::cast(MaterializeNextValue());
- materialized_objects_->Add(number);
- materialization_value_index_ += kDoubleSize / kPointerSize - 1;
- break;
- }
- case JS_OBJECT_TYPE: {
- Handle<JSObject> object =
- isolate_->factory()->NewJSObjectFromMap(map, NOT_TENURED, false);
- materialized_objects_->Add(object);
- Handle<Object> properties = MaterializeNextValue();
- Handle<Object> elements = MaterializeNextValue();
- object->set_properties(FixedArray::cast(*properties));
- object->set_elements(FixedArray::cast(*elements));
- for (int i = 0; i < length - 3; ++i) {
- Handle<Object> value = MaterializeNextValue();
- object->FastPropertyAtPut(i, *value);
- }
- break;
- }
- default:
- PrintF("[couldn't handle instance type %d]\n", map->instance_type());
- UNREACHABLE();
- }
- }
-
- return materialized_objects_->at(object_index);
-}
-
-
-Handle<Object> Deoptimizer::MaterializeNextValue() {
- int value_index = materialization_value_index_++;
- Handle<Object> value = materialized_values_->at(value_index);
- if (*value == isolate_->heap()->arguments_marker()) {
- value = MaterializeNextHeapObject();
- }
- return value;
-}
-
-
void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) {
ASSERT_NE(DEBUGGER, bailout_type_);
- // Walk all JavaScript output frames with the given frame iterator.
- for (int frame_index = 0; frame_index < jsframe_count(); ++frame_index) {
- if (frame_index != 0) it->Advance();
- JavaScriptFrame* frame = it->frame();
- jsframe_functions_.Add(handle(frame->function(), isolate_));
- jsframe_has_adapted_arguments_.Add(frame->has_adapted_arguments());
- }
-
// Handlify all tagged object values before triggering any allocation.
List<Handle<Object> > values(deferred_objects_tagged_values_.length());
for (int i = 0; i < deferred_objects_tagged_values_.length(); ++i) {
@@ -1750,7 +1652,7 @@ void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) {
HeapNumberMaterializationDescriptor d = deferred_heap_numbers_[i];
Handle<Object> num = isolate_->factory()->NewNumber(d.value());
if (trace_) {
- PrintF("Materialized a new heap number %p [%e] in slot %p\n",
+ PrintF("Materializing a new heap number %p [%e] in slot %p\n",
reinterpret_cast<void*>(*num),
d.value(),
d.slot_address());
@@ -1758,52 +1660,62 @@ void Deoptimizer::MaterializeHeapObjects(JavaScriptFrameIterator* it) {
Memory::Object_at(d.slot_address()) = *num;
}
- // Materialize all heap numbers required for arguments/captured objects.
+ // Materialize all heap numbers required for arguments objects.
for (int i = 0; i < values.length(); i++) {
if (!values.at(i)->IsTheHole()) continue;
double double_value = deferred_objects_double_values_[i];
Handle<Object> num = isolate_->factory()->NewNumber(double_value);
if (trace_) {
- PrintF("Materialized a new heap number %p [%e] for object\n",
+ PrintF("Materializing a new heap number %p [%e] for arguments object\n",
reinterpret_cast<void*>(*num), double_value);
}
values.Set(i, num);
}
- // Materialize arguments/captured objects.
- if (!deferred_objects_.is_empty()) {
- List<Handle<Object> > materialized_objects(deferred_objects_.length());
- materialized_objects_ = &materialized_objects;
- materialized_values_ = &values;
-
- while (materialization_object_index_ < deferred_objects_.length()) {
- int object_index = materialization_object_index_;
- ObjectMaterializationDescriptor descriptor =
- deferred_objects_.at(object_index);
-
- // Find a previously materialized object by de-duplication or
- // materialize a new instance of the object if necessary. Store
- // the materialized object into the frame slot.
- Handle<Object> object = MaterializeNextHeapObject();
- Memory::Object_at(descriptor.slot_address()) = *object;
- if (trace_) {
- if (descriptor.is_arguments()) {
- PrintF("Materialized %sarguments object of length %d for %p: ",
- ArgumentsObjectIsAdapted(object_index) ? "(adapted) " : "",
- Handle<JSObject>::cast(object)->elements()->length(),
- reinterpret_cast<void*>(descriptor.slot_address()));
- } else {
- PrintF("Materialized captured object of size %d for %p: ",
- Handle<HeapObject>::cast(object)->Size(),
+ // Materialize arguments objects one frame at a time.
+ for (int frame_index = 0; frame_index < jsframe_count(); ++frame_index) {
+ if (frame_index != 0) it->Advance();
+ JavaScriptFrame* frame = it->frame();
+ Handle<JSFunction> function(frame->function(), isolate_);
+ Handle<JSObject> arguments;
+ for (int i = frame->ComputeExpressionsCount() - 1; i >= 0; --i) {
+ if (frame->GetExpression(i) == isolate_->heap()->arguments_marker()) {
+ ObjectMaterializationDescriptor descriptor =
+ deferred_objects_.RemoveLast();
+ const int length = descriptor.object_length();
+ if (arguments.is_null()) {
+ if (frame->has_adapted_arguments()) {
+ // Use the arguments adapter frame we just built to materialize the
+ // arguments object. FunctionGetArguments can't throw an exception.
+ arguments = Handle<JSObject>::cast(
+ Accessors::FunctionGetArguments(function));
+ values.RewindBy(length);
+ } else {
+ // Construct an arguments object and copy the parameters to a newly
+ // allocated arguments object backing store.
+ arguments =
+ isolate_->factory()->NewArgumentsObject(function, length);
+ Handle<FixedArray> array =
+ isolate_->factory()->NewFixedArray(length);
+ ASSERT(array->length() == length);
+ for (int i = length - 1; i >= 0 ; --i) {
+ array->set(i, *values.RemoveLast());
+ }
+ arguments->set_elements(*array);
+ }
+ }
+ frame->SetExpression(i, *arguments);
+ ASSERT_EQ(Memory::Object_at(descriptor.slot_address()), *arguments);
+ if (trace_) {
+ PrintF("Materializing %sarguments object of length %d for %p: ",
+ frame->has_adapted_arguments() ? "(adapted) " : "",
+ arguments->elements()->length(),
reinterpret_cast<void*>(descriptor.slot_address()));
+ arguments->ShortPrint();
+ PrintF("\n");
}
- object->ShortPrint();
- PrintF("\n");
}
}
-
- ASSERT(materialization_object_index_ == materialized_objects_->length());
- ASSERT(materialization_value_index_ == materialized_values_->length());
}
}
@@ -1874,10 +1786,10 @@ static const char* TraceValueType(bool is_smi, bool is_native = false) {
void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
- int object_index,
+ int object_opcode,
int field_index) {
disasm::NameConverter converter;
- Address object_slot = deferred_objects_[object_index].slot_address();
+ Address object_slot = deferred_objects_.last().slot_address();
Translation::Opcode opcode =
static_cast<Translation::Opcode>(iterator->Next());
@@ -1890,6 +1802,7 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
case Translation::GETTER_STUB_FRAME:
case Translation::SETTER_STUB_FRAME:
case Translation::COMPILED_STUB_FRAME:
+ case Translation::ARGUMENTS_OBJECT:
UNREACHABLE();
return;
@@ -2059,50 +1972,6 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
AddObjectTaggedValue(value);
return;
}
-
- case Translation::DUPLICATED_OBJECT: {
- int object_index = iterator->Next();
- if (trace_) {
- PrintF(" nested @0x%08" V8PRIxPTR ": [field #%d] <- ",
- reinterpret_cast<intptr_t>(object_slot),
- field_index);
- isolate_->heap()->arguments_marker()->ShortPrint();
- PrintF(" ; duplicate of object #%d\n", object_index);
- }
- // Use the materialization marker value as a sentinel and fill in
- // the object after the deoptimized frame is built.
- intptr_t value = reinterpret_cast<intptr_t>(
- isolate_->heap()->arguments_marker());
- AddObjectDuplication(0, object_index);
- AddObjectTaggedValue(value);
- return;
- }
-
- case Translation::ARGUMENTS_OBJECT:
- case Translation::CAPTURED_OBJECT: {
- int length = iterator->Next();
- bool is_args = opcode == Translation::ARGUMENTS_OBJECT;
- if (trace_) {
- PrintF(" nested @0x%08" V8PRIxPTR ": [field #%d] <- ",
- reinterpret_cast<intptr_t>(object_slot),
- field_index);
- isolate_->heap()->arguments_marker()->ShortPrint();
- PrintF(" ; object (length = %d, is_args = %d)\n", length, is_args);
- }
- // Use the materialization marker value as a sentinel and fill in
- // the object after the deoptimized frame is built.
- intptr_t value = reinterpret_cast<intptr_t>(
- isolate_->heap()->arguments_marker());
- AddObjectStart(0, length, is_args);
- AddObjectTaggedValue(value);
- // We save the object values on the side and materialize the actual
- // object after the deoptimized frame is built.
- int object_index = deferred_objects_.length() - 1;
- for (int i = 0; i < length; i++) {
- DoTranslateObject(iterator, object_index, i);
- }
- return;
- }
}
}
@@ -2342,48 +2211,25 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
return;
}
- case Translation::DUPLICATED_OBJECT: {
- int object_index = iterator->Next();
- if (trace_) {
- PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- ",
- output_[frame_index]->GetTop() + output_offset,
- output_offset);
- isolate_->heap()->arguments_marker()->ShortPrint();
- PrintF(" ; duplicate of object #%d\n", object_index);
- }
- // Use the materialization marker value as a sentinel and fill in
- // the object after the deoptimized frame is built.
- intptr_t value = reinterpret_cast<intptr_t>(
- isolate_->heap()->arguments_marker());
- AddObjectDuplication(output_[frame_index]->GetTop() + output_offset,
- object_index);
- output_[frame_index]->SetFrameSlot(output_offset, value);
- return;
- }
-
- case Translation::ARGUMENTS_OBJECT:
- case Translation::CAPTURED_OBJECT: {
+ case Translation::ARGUMENTS_OBJECT: {
int length = iterator->Next();
- bool is_args = opcode == Translation::ARGUMENTS_OBJECT;
if (trace_) {
PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- ",
output_[frame_index]->GetTop() + output_offset,
output_offset);
isolate_->heap()->arguments_marker()->ShortPrint();
- PrintF(" ; object (length = %d, is_args = %d)\n", length, is_args);
+ PrintF(" ; arguments object (length = %d)\n", length);
}
- // Use the materialization marker value as a sentinel and fill in
- // the object after the deoptimized frame is built.
+ // Use the arguments marker value as a sentinel and fill in the arguments
+ // object after the deoptimized frame is built.
intptr_t value = reinterpret_cast<intptr_t>(
isolate_->heap()->arguments_marker());
- AddObjectStart(output_[frame_index]->GetTop() + output_offset,
- length, is_args);
+ AddObjectStart(output_[frame_index]->GetTop() + output_offset, length);
output_[frame_index]->SetFrameSlot(output_offset, value);
- // We save the object values on the side and materialize the actual
- // object after the deoptimized frame is built.
- int object_index = deferred_objects_.length() - 1;
+ // We save the argument values on the side and materialize the actual
+ // arguments object after the deoptimized frame is built.
for (int i = 0; i < length; i++) {
- DoTranslateObject(iterator, object_index, i);
+ DoTranslateObject(iterator, Translation::ARGUMENTS_OBJECT, i);
}
return;
}
@@ -2560,9 +2406,7 @@ bool Deoptimizer::DoOsrTranslateCommand(TranslationIterator* iterator,
break;
}
- case Translation::DUPLICATED_OBJECT:
- case Translation::ARGUMENTS_OBJECT:
- case Translation::CAPTURED_OBJECT: {
+ case Translation::ARGUMENTS_OBJECT: {
// Optimized code assumes that the argument object has not been
// materialized and so bypasses it when doing arguments access.
// We should have bailed out before starting the frame
@@ -2582,19 +2426,25 @@ void Deoptimizer::PatchInterruptCode(Code* unoptimized_code,
Code* replacement_code) {
// Iterate over the back edge table and patch every interrupt
// call to an unconditional call to the replacement code.
+ ASSERT(unoptimized_code->kind() == Code::FUNCTION);
int loop_nesting_level = unoptimized_code->allow_osr_at_loop_nesting_level();
-
- for (FullCodeGenerator::BackEdgeTableIterator back_edges(unoptimized_code);
- !back_edges.Done();
- back_edges.Next()) {
- if (static_cast<int>(back_edges.loop_depth()) == loop_nesting_level) {
+ Address back_edge_cursor = unoptimized_code->instruction_start() +
+ unoptimized_code->back_edge_table_offset();
+ uint32_t table_length = Memory::uint32_at(back_edge_cursor);
+ back_edge_cursor += kIntSize;
+ for (uint32_t i = 0; i < table_length; ++i) {
+ uint32_t loop_depth = Memory::uint32_at(back_edge_cursor + 2 * kIntSize);
+ if (static_cast<int>(loop_depth) == loop_nesting_level) {
+ // Loop back edge has the loop depth that we want to patch.
+ uint32_t pc_offset = Memory::uint32_at(back_edge_cursor + kIntSize);
+ Address pc_after = unoptimized_code->instruction_start() + pc_offset;
PatchInterruptCodeAt(unoptimized_code,
- back_edges.pc(),
+ pc_after,
interrupt_code,
replacement_code);
}
+ back_edge_cursor += FullCodeGenerator::kBackEdgeEntrySize;
}
-
unoptimized_code->set_back_edges_patched_for_osr(true);
#ifdef DEBUG
Deoptimizer::VerifyInterruptCode(
@@ -2607,20 +2457,25 @@ void Deoptimizer::RevertInterruptCode(Code* unoptimized_code,
Code* interrupt_code,
Code* replacement_code) {
// Iterate over the back edge table and revert the patched interrupt calls.
+ ASSERT(unoptimized_code->kind() == Code::FUNCTION);
ASSERT(unoptimized_code->back_edges_patched_for_osr());
int loop_nesting_level = unoptimized_code->allow_osr_at_loop_nesting_level();
-
- for (FullCodeGenerator::BackEdgeTableIterator back_edges(unoptimized_code);
- !back_edges.Done();
- back_edges.Next()) {
- if (static_cast<int>(back_edges.loop_depth()) <= loop_nesting_level) {
+ Address back_edge_cursor = unoptimized_code->instruction_start() +
+ unoptimized_code->back_edge_table_offset();
+ uint32_t table_length = Memory::uint32_at(back_edge_cursor);
+ back_edge_cursor += kIntSize;
+ for (uint32_t i = 0; i < table_length; ++i) {
+ uint32_t loop_depth = Memory::uint32_at(back_edge_cursor + 2 * kIntSize);
+ if (static_cast<int>(loop_depth) <= loop_nesting_level) {
+ uint32_t pc_offset = Memory::uint32_at(back_edge_cursor + kIntSize);
+ Address pc_after = unoptimized_code->instruction_start() + pc_offset;
RevertInterruptCodeAt(unoptimized_code,
- back_edges.pc(),
+ pc_after,
interrupt_code,
replacement_code);
}
+ back_edge_cursor += FullCodeGenerator::kBackEdgeEntrySize;
}
-
unoptimized_code->set_back_edges_patched_for_osr(false);
unoptimized_code->set_allow_osr_at_loop_nesting_level(0);
#ifdef DEBUG
@@ -2636,18 +2491,24 @@ void Deoptimizer::VerifyInterruptCode(Code* unoptimized_code,
Code* interrupt_code,
Code* replacement_code,
int loop_nesting_level) {
- for (FullCodeGenerator::BackEdgeTableIterator back_edges(unoptimized_code);
- !back_edges.Done();
- back_edges.Next()) {
- uint32_t loop_depth = back_edges.loop_depth();
+ CHECK(unoptimized_code->kind() == Code::FUNCTION);
+ Address back_edge_cursor = unoptimized_code->instruction_start() +
+ unoptimized_code->back_edge_table_offset();
+ uint32_t table_length = Memory::uint32_at(back_edge_cursor);
+ back_edge_cursor += kIntSize;
+ for (uint32_t i = 0; i < table_length; ++i) {
+ uint32_t loop_depth = Memory::uint32_at(back_edge_cursor + 2 * kIntSize);
CHECK_LE(static_cast<int>(loop_depth), Code::kMaxLoopNestingMarker);
// Assert that all back edges for shallower loops (and only those)
// have already been patched.
+ uint32_t pc_offset = Memory::uint32_at(back_edge_cursor + kIntSize);
+ Address pc_after = unoptimized_code->instruction_start() + pc_offset;
CHECK_EQ((static_cast<int>(loop_depth) <= loop_nesting_level),
InterruptCodeIsPatched(unoptimized_code,
- back_edges.pc(),
+ pc_after,
interrupt_code,
replacement_code));
+ back_edge_cursor += FullCodeGenerator::kBackEdgeEntrySize;
}
}
#endif // DEBUG
@@ -2710,16 +2571,9 @@ Object* Deoptimizer::ComputeLiteral(int index) const {
}
-void Deoptimizer::AddObjectStart(intptr_t slot, int length, bool is_args) {
+void Deoptimizer::AddObjectStart(intptr_t slot_address, int length) {
ObjectMaterializationDescriptor object_desc(
- reinterpret_cast<Address>(slot), jsframe_count_, length, -1, is_args);
- deferred_objects_.Add(object_desc);
-}
-
-
-void Deoptimizer::AddObjectDuplication(intptr_t slot, int object_index) {
- ObjectMaterializationDescriptor object_desc(
- reinterpret_cast<Address>(slot), jsframe_count_, -1, object_index, false);
+ reinterpret_cast<Address>(slot_address), length);
deferred_objects_.Add(object_desc);
}
@@ -2947,18 +2801,6 @@ void Translation::BeginArgumentsObject(int args_length) {
}
-void Translation::BeginCapturedObject(int length) {
- buffer_->Add(CAPTURED_OBJECT, zone());
- buffer_->Add(length, zone());
-}
-
-
-void Translation::DuplicateObject(int object_index) {
- buffer_->Add(DUPLICATED_OBJECT, zone());
- buffer_->Add(object_index, zone());
-}
-
-
void Translation::StoreRegister(Register reg) {
buffer_->Add(REGISTER, zone());
buffer_->Add(reg.code(), zone());
@@ -3027,9 +2869,7 @@ int Translation::NumberOfOperandsFor(Opcode opcode) {
switch (opcode) {
case GETTER_STUB_FRAME:
case SETTER_STUB_FRAME:
- case DUPLICATED_OBJECT:
case ARGUMENTS_OBJECT:
- case CAPTURED_OBJECT:
case REGISTER:
case INT32_REGISTER:
case UINT32_REGISTER:
@@ -3089,12 +2929,8 @@ const char* Translation::StringFor(Opcode opcode) {
return "DOUBLE_STACK_SLOT";
case LITERAL:
return "LITERAL";
- case DUPLICATED_OBJECT:
- return "DUPLICATED_OBJECT";
case ARGUMENTS_OBJECT:
return "ARGUMENTS_OBJECT";
- case CAPTURED_OBJECT:
- return "CAPTURED_OBJECT";
}
UNREACHABLE();
return "";
@@ -3138,9 +2974,7 @@ SlotRef SlotRef::ComputeSlotForNextArgument(TranslationIterator* iterator,
// Peeled off before getting here.
break;
- case Translation::DUPLICATED_OBJECT:
case Translation::ARGUMENTS_OBJECT:
- case Translation::CAPTURED_OBJECT:
// This can be only emitted for local slots not for argument slots.
break;
diff --git a/chromium/v8/src/deoptimizer.h b/chromium/v8/src/deoptimizer.h
index b6e4667a20d..7ad1ab0b2e7 100644
--- a/chromium/v8/src/deoptimizer.h
+++ b/chromium/v8/src/deoptimizer.h
@@ -77,31 +77,15 @@ class HeapNumberMaterializationDescriptor BASE_EMBEDDED {
class ObjectMaterializationDescriptor BASE_EMBEDDED {
public:
- ObjectMaterializationDescriptor(
- Address slot_address, int frame, int length, int duplicate, bool is_args)
- : slot_address_(slot_address),
- jsframe_index_(frame),
- object_length_(length),
- duplicate_object_(duplicate),
- is_arguments_(is_args) { }
+ ObjectMaterializationDescriptor(Address slot_address, int length)
+ : slot_address_(slot_address), object_length_(length) { }
Address slot_address() const { return slot_address_; }
- int jsframe_index() const { return jsframe_index_; }
int object_length() const { return object_length_; }
- int duplicate_object() const { return duplicate_object_; }
- bool is_arguments() const { return is_arguments_; }
-
- // Only used for allocated receivers in DoComputeConstructStubFrame.
- void patch_slot_address(intptr_t slot) {
- slot_address_ = reinterpret_cast<Address>(slot);
- }
private:
Address slot_address_;
- int jsframe_index_;
int object_length_;
- int duplicate_object_;
- bool is_arguments_;
};
@@ -388,7 +372,7 @@ class Deoptimizer : public Malloced {
int frame_index);
void DoTranslateObject(TranslationIterator* iterator,
- int object_index,
+ int object_opcode,
int field_index);
enum DeoptimizerTranslatedValueType {
@@ -416,28 +400,11 @@ class Deoptimizer : public Malloced {
Object* ComputeLiteral(int index) const;
- void AddObjectStart(intptr_t slot_address, int argc, bool is_arguments);
- void AddObjectDuplication(intptr_t slot, int object_index);
+ void AddObjectStart(intptr_t slot_address, int argc);
void AddObjectTaggedValue(intptr_t value);
void AddObjectDoubleValue(double value);
void AddDoubleValue(intptr_t slot_address, double value);
- bool ArgumentsObjectIsAdapted(int object_index) {
- ObjectMaterializationDescriptor desc = deferred_objects_.at(object_index);
- int reverse_jsframe_index = jsframe_count_ - desc.jsframe_index() - 1;
- return jsframe_has_adapted_arguments_[reverse_jsframe_index];
- }
-
- Handle<JSFunction> ArgumentsObjectFunction(int object_index) {
- ObjectMaterializationDescriptor desc = deferred_objects_.at(object_index);
- int reverse_jsframe_index = jsframe_count_ - desc.jsframe_index() - 1;
- return jsframe_functions_[reverse_jsframe_index];
- }
-
- // Helper function for heap object materialization.
- Handle<Object> MaterializeNextHeapObject();
- Handle<Object> MaterializeNextValue();
-
static void GenerateDeoptimizationEntries(
MacroAssembler* masm, int count, BailoutType type);
@@ -488,22 +455,10 @@ class Deoptimizer : public Malloced {
// Array of output frame descriptions.
FrameDescription** output_;
- // Deferred values to be materialized.
List<Object*> deferred_objects_tagged_values_;
List<double> deferred_objects_double_values_;
List<ObjectMaterializationDescriptor> deferred_objects_;
List<HeapNumberMaterializationDescriptor> deferred_heap_numbers_;
-
- // Output frame information. Only used during heap object materialization.
- List<Handle<JSFunction> > jsframe_functions_;
- List<bool> jsframe_has_adapted_arguments_;
-
- // Materialized objects. Only used during heap object materialization.
- List<Handle<Object> >* materialized_values_;
- List<Handle<Object> >* materialized_objects_;
- int materialization_value_index_;
- int materialization_object_index_;
-
#ifdef DEBUG
DisallowHeapAllocation* disallow_heap_allocation_;
#endif // DEBUG
@@ -757,9 +712,7 @@ class Translation BASE_EMBEDDED {
SETTER_STUB_FRAME,
ARGUMENTS_ADAPTOR_FRAME,
COMPILED_STUB_FRAME,
- DUPLICATED_OBJECT,
ARGUMENTS_OBJECT,
- CAPTURED_OBJECT,
REGISTER,
INT32_REGISTER,
UINT32_REGISTER,
@@ -791,8 +744,6 @@ class Translation BASE_EMBEDDED {
void BeginGetterStubFrame(int literal_id);
void BeginSetterStubFrame(int literal_id);
void BeginArgumentsObject(int args_length);
- void BeginCapturedObject(int length);
- void DuplicateObject(int object_index);
void StoreRegister(Register reg);
void StoreInt32Register(Register reg);
void StoreUint32Register(Register reg);
diff --git a/chromium/v8/src/effects.h b/chromium/v8/src/effects.h
deleted file mode 100644
index 8e823634710..00000000000
--- a/chromium/v8/src/effects.h
+++ /dev/null
@@ -1,361 +0,0 @@
-// Copyright 2013 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef V8_EFFECTS_H_
-#define V8_EFFECTS_H_
-
-#include "v8.h"
-
-#include "types.h"
-
-namespace v8 {
-namespace internal {
-
-
-// A simple struct to represent (write) effects. A write is represented as a
-// modification of type bounds (e.g. of a variable).
-//
-// An effect can either be definite, if the write is known to have taken place,
-// or 'possible', if it was optional. The difference is relevant when composing
-// effects.
-//
-// There are two ways to compose effects: sequentially (they happen one after
-// the other) or alternatively (either one or the other happens). A definite
-// effect cancels out any previous effect upon sequencing. A possible effect
-// merges into a previous effect, i.e., type bounds are merged. Alternative
-// composition always merges bounds. It yields a possible effect if at least
-// one was only possible.
-struct Effect {
- enum Modality { POSSIBLE, DEFINITE };
-
- Modality modality;
- Bounds bounds;
-
- Effect() {}
- Effect(Bounds b, Modality m = DEFINITE) : modality(m), bounds(b) {}
-
- // The unknown effect.
- static Effect Unknown(Isolate* isolate) {
- return Effect(Bounds::Unbounded(isolate), POSSIBLE);
- }
-
- static Effect Forget(Isolate* isolate) {
- return Effect(Bounds::Unbounded(isolate), DEFINITE);
- }
-
- // Sequential composition, as in 'e1; e2'.
- static Effect Seq(Effect e1, Effect e2, Isolate* isolate) {
- if (e2.modality == DEFINITE) return e2;
- return Effect(Bounds::Either(e1.bounds, e2.bounds, isolate), e1.modality);
- }
-
- // Alternative composition, as in 'cond ? e1 : e2'.
- static Effect Alt(Effect e1, Effect e2, Isolate* isolate) {
- return Effect(
- Bounds::Either(e1.bounds, e2.bounds, isolate),
- e1.modality == POSSIBLE ? POSSIBLE : e2.modality);
- }
-};
-
-
-// Classes encapsulating sets of effects on variables.
-//
-// Effects maps variables to effects and supports sequential and alternative
-// composition.
-//
-// NestedEffects is an incremental representation that supports persistence
-// through functional extension. It represents the map as an adjoin of a list
-// of maps, whose tail can be shared.
-//
-// Both classes provide similar interfaces, implemented in parts through the
-// EffectsMixin below (using sandwich style, to work around the style guide's
-// MI restriction).
-//
-// We also (ab)use Effects/NestedEffects as a representation for abstract
-// store typings. In that case, only definite effects are of interest.
-
-template<class Var, class Base, class Effects>
-class EffectsMixin: public Base {
- public:
- explicit EffectsMixin(Zone* zone) : Base(zone) {}
-
- Effect Lookup(Var var) {
- Locator locator;
- return this->Find(var, &locator)
- ? locator.value() : Effect::Unknown(Base::isolate());
- }
-
- Bounds LookupBounds(Var var) {
- Effect effect = Lookup(var);
- return effect.modality == Effect::DEFINITE
- ? effect.bounds : Bounds::Unbounded(Base::isolate());
- }
-
- // Sequential composition.
- void Seq(Var var, Effect effect) {
- Locator locator;
- if (!this->Insert(var, &locator)) {
- effect = Effect::Seq(locator.value(), effect, Base::isolate());
- }
- locator.set_value(effect);
- }
-
- void Seq(Effects that) {
- SeqMerger<EffectsMixin> merge = { *this };
- that.ForEach(&merge);
- }
-
- // Alternative composition.
- void Alt(Var var, Effect effect) {
- Locator locator;
- if (!this->Insert(var, &locator)) {
- effect = Effect::Alt(locator.value(), effect, Base::isolate());
- }
- locator.set_value(effect);
- }
-
- void Alt(Effects that) {
- AltWeakener<EffectsMixin> weaken = { *this, that };
- this->ForEach(&weaken);
- AltMerger<EffectsMixin> merge = { *this };
- that.ForEach(&merge);
- }
-
- // Invalidation.
- void Forget() {
- Overrider override = {
- Effect::Forget(Base::isolate()), Effects(Base::zone()) };
- this->ForEach(&override);
- Seq(override.effects);
- }
-
- protected:
- typedef typename Base::Locator Locator;
-
- template<class Self>
- struct SeqMerger {
- void Call(Var var, Effect effect) { self.Seq(var, effect); }
- Self self;
- };
-
- template<class Self>
- struct AltMerger {
- void Call(Var var, Effect effect) { self.Alt(var, effect); }
- Self self;
- };
-
- template<class Self>
- struct AltWeakener {
- void Call(Var var, Effect effect) {
- if (effect.modality == Effect::DEFINITE && !other.Contains(var)) {
- effect.modality = Effect::POSSIBLE;
- Locator locator;
- self.Insert(var, &locator);
- locator.set_value(effect);
- }
- }
- Self self;
- Effects other;
- };
-
- struct Overrider {
- void Call(Var var, Effect effect) { effects.Seq(var, new_effect); }
- Effect new_effect;
- Effects effects;
- };
-};
-
-
-template<class Var, Var kNoVar> class Effects;
-template<class Var, Var kNoVar> class NestedEffectsBase;
-
-template<class Var, Var kNoVar>
-class EffectsBase {
- public:
- explicit EffectsBase(Zone* zone) : map_(new(zone) Mapping(zone)) {}
-
- bool IsEmpty() { return map_->is_empty(); }
-
- protected:
- friend class NestedEffectsBase<Var, kNoVar>;
- friend class
- EffectsMixin<Var, NestedEffectsBase<Var, kNoVar>, Effects<Var, kNoVar> >;
-
- Zone* zone() { return map_->allocator().zone(); }
- Isolate* isolate() { return zone()->isolate(); }
-
- struct SplayTreeConfig {
- typedef Var Key;
- typedef Effect Value;
- static const Var kNoKey = kNoVar;
- static Effect NoValue() { return Effect(); }
- static int Compare(int x, int y) { return y - x; }
- };
- typedef ZoneSplayTree<SplayTreeConfig> Mapping;
- typedef typename Mapping::Locator Locator;
-
- bool Contains(Var var) {
- ASSERT(var != kNoVar);
- return map_->Contains(var);
- }
- bool Find(Var var, Locator* locator) {
- ASSERT(var != kNoVar);
- return map_->Find(var, locator);
- }
- bool Insert(Var var, Locator* locator) {
- ASSERT(var != kNoVar);
- return map_->Insert(var, locator);
- }
-
- template<class Callback>
- void ForEach(Callback* callback) {
- return map_->ForEach(callback);
- }
-
- private:
- Mapping* map_;
-};
-
-template<class Var, Var kNoVar>
-const Var EffectsBase<Var, kNoVar>::SplayTreeConfig::kNoKey;
-
-template<class Var, Var kNoVar>
-class Effects: public
- EffectsMixin<Var, EffectsBase<Var, kNoVar>, Effects<Var, kNoVar> > {
- public:
- explicit Effects(Zone* zone)
- : EffectsMixin<Var, EffectsBase<Var, kNoVar>, Effects<Var, kNoVar> >(zone)
- {}
-};
-
-
-template<class Var, Var kNoVar>
-class NestedEffectsBase {
- public:
- explicit NestedEffectsBase(Zone* zone) : node_(new(zone) Node(zone)) {}
-
- template<class Callback>
- void ForEach(Callback* callback) {
- if (node_->previous) NestedEffectsBase(node_->previous).ForEach(callback);
- node_->effects.ForEach(callback);
- }
-
- Effects<Var, kNoVar> Top() { return node_->effects; }
-
- bool IsEmpty() {
- for (Node* node = node_; node != NULL; node = node->previous) {
- if (!node->effects.IsEmpty()) return false;
- }
- return true;
- }
-
- protected:
- typedef typename EffectsBase<Var, kNoVar>::Locator Locator;
-
- Zone* zone() { return node_->zone; }
- Isolate* isolate() { return zone()->isolate(); }
-
- void push() { node_ = new(node_->zone) Node(node_->zone, node_); }
- void pop() { node_ = node_->previous; }
- bool is_empty() { return node_ == NULL; }
-
- bool Contains(Var var) {
- ASSERT(var != kNoVar);
- for (Node* node = node_; node != NULL; node = node->previous) {
- if (node->effects.Contains(var)) return true;
- }
- return false;
- }
-
- bool Find(Var var, Locator* locator) {
- ASSERT(var != kNoVar);
- for (Node* node = node_; node != NULL; node = node->previous) {
- if (node->effects.Find(var, locator)) return true;
- }
- return false;
- }
-
- bool Insert(Var var, Locator* locator);
-
- private:
- struct Node: ZoneObject {
- Zone* zone;
- Effects<Var, kNoVar> effects;
- Node* previous;
- explicit Node(Zone* zone, Node* previous = NULL)
- : zone(zone), effects(zone), previous(previous) {}
- };
-
- explicit NestedEffectsBase(Node* node) : node_(node) {}
-
- Node* node_;
-};
-
-
-template<class Var, Var kNoVar>
-bool NestedEffectsBase<Var, kNoVar>::Insert(Var var, Locator* locator) {
- ASSERT(var != kNoVar);
- if (!node_->effects.Insert(var, locator)) return false;
- Locator shadowed;
- for (Node* node = node_->previous; node != NULL; node = node->previous) {
- if (node->effects.Find(var, &shadowed)) {
- // Initialize with shadowed entry.
- locator->set_value(shadowed.value());
- return false;
- }
- }
- return true;
-}
-
-
-template<class Var, Var kNoVar>
-class NestedEffects: public
- EffectsMixin<Var, NestedEffectsBase<Var, kNoVar>, Effects<Var, kNoVar> > {
- public:
- explicit NestedEffects(Zone* zone) :
- EffectsMixin<Var, NestedEffectsBase<Var, kNoVar>, Effects<Var, kNoVar> >(
- zone) {}
-
- // Create an extension of the current effect set. The current set should not
- // be modified while the extension is in use.
- NestedEffects Push() {
- NestedEffects result = *this;
- result.push();
- return result;
- }
-
- NestedEffects Pop() {
- NestedEffects result = *this;
- result.pop();
- ASSERT(!this->is_empty());
- return result;
- }
-};
-
-} } // namespace v8::internal
-
-#endif // V8_EFFECTS_H_
diff --git a/chromium/v8/src/execution.cc b/chromium/v8/src/execution.cc
index ecfa1db1ed8..d7b9cf5d596 100644
--- a/chromium/v8/src/execution.cc
+++ b/chromium/v8/src/execution.cc
@@ -206,12 +206,10 @@ Handle<Object> Execution::TryCall(Handle<JSFunction> func,
catcher.SetCaptureMessage(false);
*caught_exception = false;
- // Get isolate now, because handle might be persistent
- // and get destroyed in the next call.
- Isolate* isolate = func->GetIsolate();
Handle<Object> result = Invoke(false, func, receiver, argc, args,
caught_exception);
+ Isolate* isolate = func->GetIsolate();
if (*caught_exception) {
ASSERT(catcher.HasCaught());
ASSERT(isolate->has_pending_exception());
diff --git a/chromium/v8/src/extensions/i18n/collator.cc b/chromium/v8/src/extensions/i18n/collator.cc
new file mode 100644
index 00000000000..61b1d63e5c2
--- /dev/null
+++ b/chromium/v8/src/extensions/i18n/collator.cc
@@ -0,0 +1,366 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// limitations under the License.
+
+#include "collator.h"
+
+#include "i18n-utils.h"
+#include "unicode/coll.h"
+#include "unicode/locid.h"
+#include "unicode/ucol.h"
+
+namespace v8_i18n {
+
+static icu::Collator* InitializeCollator(
+ v8::Handle<v8::String>, v8::Handle<v8::Object>, v8::Handle<v8::Object>);
+
+static icu::Collator* CreateICUCollator(
+ const icu::Locale&, v8::Handle<v8::Object>);
+
+static bool SetBooleanAttribute(
+ UColAttribute, const char*, v8::Handle<v8::Object>, icu::Collator*);
+
+static void SetResolvedSettings(
+ const icu::Locale&, icu::Collator*, v8::Handle<v8::Object>);
+
+static void SetBooleanSetting(
+ UColAttribute, icu::Collator*, const char*, v8::Handle<v8::Object>);
+
+icu::Collator* Collator::UnpackCollator(v8::Handle<v8::Object> obj) {
+ v8::HandleScope handle_scope;
+
+ if (obj->HasOwnProperty(v8::String::New("collator"))) {
+ return static_cast<icu::Collator*>(
+ obj->GetAlignedPointerFromInternalField(0));
+ }
+
+ return NULL;
+}
+
+void Collator::DeleteCollator(v8::Isolate* isolate,
+ v8::Persistent<v8::Object>* object,
+ void* param) {
+ // First delete the hidden C++ object.
+ // Unpacking should never return NULL here. That would only happen if
+ // this method is used as the weak callback for persistent handles not
+ // pointing to a collator.
+ v8::HandleScope handle_scope(isolate);
+ v8::Local<v8::Object> handle = v8::Local<v8::Object>::New(isolate, *object);
+ delete UnpackCollator(handle);
+
+ // Then dispose of the persistent handle to JS object.
+ object->Dispose(isolate);
+}
+
+
+// Throws a JavaScript exception.
+static v8::Handle<v8::Value> ThrowUnexpectedObjectError() {
+ // Returns undefined, and schedules an exception to be thrown.
+ return v8::ThrowException(v8::Exception::Error(
+ v8::String::New("Collator method called on an object "
+ "that is not a Collator.")));
+}
+
+
+// When there's an ICU error, throw a JavaScript error with |message|.
+static v8::Handle<v8::Value> ThrowExceptionForICUError(const char* message) {
+ return v8::ThrowException(v8::Exception::Error(v8::String::New(message)));
+}
+
+
+// static
+void Collator::JSInternalCompare(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ if (args.Length() != 3 || !args[0]->IsObject() ||
+ !args[1]->IsString() || !args[2]->IsString()) {
+ v8::ThrowException(v8::Exception::SyntaxError(
+ v8::String::New("Collator and two string arguments are required.")));
+ return;
+ }
+
+ icu::Collator* collator = UnpackCollator(args[0]->ToObject());
+ if (!collator) {
+ ThrowUnexpectedObjectError();
+ return;
+ }
+
+ v8::String::Value string_value1(args[1]);
+ v8::String::Value string_value2(args[2]);
+ const UChar* string1 = reinterpret_cast<const UChar*>(*string_value1);
+ const UChar* string2 = reinterpret_cast<const UChar*>(*string_value2);
+ UErrorCode status = U_ZERO_ERROR;
+ UCollationResult result = collator->compare(
+ string1, string_value1.length(), string2, string_value2.length(), status);
+
+ if (U_FAILURE(status)) {
+ ThrowExceptionForICUError(
+ "Internal error. Unexpected failure in Collator.compare.");
+ return;
+ }
+
+ args.GetReturnValue().Set(result);
+}
+
+void Collator::JSCreateCollator(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ if (args.Length() != 3 || !args[0]->IsString() || !args[1]->IsObject() ||
+ !args[2]->IsObject()) {
+ v8::ThrowException(v8::Exception::SyntaxError(
+ v8::String::New("Internal error, wrong parameters.")));
+ return;
+ }
+
+ v8::Isolate* isolate = args.GetIsolate();
+ v8::Local<v8::ObjectTemplate> intl_collator_template =
+ Utils::GetTemplate(isolate);
+
+ // Create an empty object wrapper.
+ v8::Local<v8::Object> local_object = intl_collator_template->NewInstance();
+ // But the handle shouldn't be empty.
+ // That can happen if there was a stack overflow when creating the object.
+ if (local_object.IsEmpty()) {
+ args.GetReturnValue().Set(local_object);
+ return;
+ }
+
+ // Set collator as internal field of the resulting JS object.
+ icu::Collator* collator = InitializeCollator(
+ args[0]->ToString(), args[1]->ToObject(), args[2]->ToObject());
+
+ if (!collator) {
+ v8::ThrowException(v8::Exception::Error(v8::String::New(
+ "Internal error. Couldn't create ICU collator.")));
+ return;
+ } else {
+ local_object->SetAlignedPointerInInternalField(0, collator);
+
+ // Make it safer to unpack later on.
+ v8::TryCatch try_catch;
+ local_object->Set(v8::String::New("collator"), v8::String::New("valid"));
+ if (try_catch.HasCaught()) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New("Internal error, couldn't set property.")));
+ return;
+ }
+ }
+
+ v8::Persistent<v8::Object> wrapper(isolate, local_object);
+ // Make object handle weak so we can delete iterator once GC kicks in.
+ wrapper.MakeWeak<void>(NULL, &DeleteCollator);
+ args.GetReturnValue().Set(wrapper);
+ wrapper.ClearAndLeak();
+}
+
+static icu::Collator* InitializeCollator(v8::Handle<v8::String> locale,
+ v8::Handle<v8::Object> options,
+ v8::Handle<v8::Object> resolved) {
+ // Convert BCP47 into ICU locale format.
+ UErrorCode status = U_ZERO_ERROR;
+ icu::Locale icu_locale;
+ char icu_result[ULOC_FULLNAME_CAPACITY];
+ int icu_length = 0;
+ v8::String::AsciiValue bcp47_locale(locale);
+ if (bcp47_locale.length() != 0) {
+ uloc_forLanguageTag(*bcp47_locale, icu_result, ULOC_FULLNAME_CAPACITY,
+ &icu_length, &status);
+ if (U_FAILURE(status) || icu_length == 0) {
+ return NULL;
+ }
+ icu_locale = icu::Locale(icu_result);
+ }
+
+ icu::Collator* collator = CreateICUCollator(icu_locale, options);
+ if (!collator) {
+ // Remove extensions and try again.
+ icu::Locale no_extension_locale(icu_locale.getBaseName());
+ collator = CreateICUCollator(no_extension_locale, options);
+
+ // Set resolved settings (pattern, numbering system).
+ SetResolvedSettings(no_extension_locale, collator, resolved);
+ } else {
+ SetResolvedSettings(icu_locale, collator, resolved);
+ }
+
+ return collator;
+}
+
+static icu::Collator* CreateICUCollator(
+ const icu::Locale& icu_locale, v8::Handle<v8::Object> options) {
+ // Make collator from options.
+ icu::Collator* collator = NULL;
+ UErrorCode status = U_ZERO_ERROR;
+ collator = icu::Collator::createInstance(icu_locale, status);
+
+ if (U_FAILURE(status)) {
+ delete collator;
+ return NULL;
+ }
+
+ // Set flags first, and then override them with sensitivity if necessary.
+ SetBooleanAttribute(UCOL_NUMERIC_COLLATION, "numeric", options, collator);
+
+ // Normalization is always on, by the spec. We are free to optimize
+ // if the strings are already normalized (but we don't have a way to tell
+ // that right now).
+ collator->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
+
+ icu::UnicodeString case_first;
+ if (Utils::ExtractStringSetting(options, "caseFirst", &case_first)) {
+ if (case_first == UNICODE_STRING_SIMPLE("upper")) {
+ collator->setAttribute(UCOL_CASE_FIRST, UCOL_UPPER_FIRST, status);
+ } else if (case_first == UNICODE_STRING_SIMPLE("lower")) {
+ collator->setAttribute(UCOL_CASE_FIRST, UCOL_LOWER_FIRST, status);
+ } else {
+ // Default (false/off).
+ collator->setAttribute(UCOL_CASE_FIRST, UCOL_OFF, status);
+ }
+ }
+
+ icu::UnicodeString sensitivity;
+ if (Utils::ExtractStringSetting(options, "sensitivity", &sensitivity)) {
+ if (sensitivity == UNICODE_STRING_SIMPLE("base")) {
+ collator->setStrength(icu::Collator::PRIMARY);
+ } else if (sensitivity == UNICODE_STRING_SIMPLE("accent")) {
+ collator->setStrength(icu::Collator::SECONDARY);
+ } else if (sensitivity == UNICODE_STRING_SIMPLE("case")) {
+ collator->setStrength(icu::Collator::PRIMARY);
+ collator->setAttribute(UCOL_CASE_LEVEL, UCOL_ON, status);
+ } else {
+ // variant (default)
+ collator->setStrength(icu::Collator::TERTIARY);
+ }
+ }
+
+ bool ignore;
+ if (Utils::ExtractBooleanSetting(options, "ignorePunctuation", &ignore)) {
+ if (ignore) {
+ collator->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, status);
+ }
+ }
+
+ return collator;
+}
+
+static bool SetBooleanAttribute(UColAttribute attribute,
+ const char* name,
+ v8::Handle<v8::Object> options,
+ icu::Collator* collator) {
+ UErrorCode status = U_ZERO_ERROR;
+ bool result;
+ if (Utils::ExtractBooleanSetting(options, name, &result)) {
+ collator->setAttribute(attribute, result ? UCOL_ON : UCOL_OFF, status);
+ if (U_FAILURE(status)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static void SetResolvedSettings(const icu::Locale& icu_locale,
+ icu::Collator* collator,
+ v8::Handle<v8::Object> resolved) {
+ SetBooleanSetting(UCOL_NUMERIC_COLLATION, collator, "numeric", resolved);
+
+ UErrorCode status = U_ZERO_ERROR;
+
+ switch (collator->getAttribute(UCOL_CASE_FIRST, status)) {
+ case UCOL_LOWER_FIRST:
+ resolved->Set(v8::String::New("caseFirst"), v8::String::New("lower"));
+ break;
+ case UCOL_UPPER_FIRST:
+ resolved->Set(v8::String::New("caseFirst"), v8::String::New("upper"));
+ break;
+ default:
+ resolved->Set(v8::String::New("caseFirst"), v8::String::New("false"));
+ }
+
+ switch (collator->getAttribute(UCOL_STRENGTH, status)) {
+ case UCOL_PRIMARY: {
+ resolved->Set(v8::String::New("strength"), v8::String::New("primary"));
+
+ // case level: true + s1 -> case, s1 -> base.
+ if (UCOL_ON == collator->getAttribute(UCOL_CASE_LEVEL, status)) {
+ resolved->Set(v8::String::New("sensitivity"), v8::String::New("case"));
+ } else {
+ resolved->Set(v8::String::New("sensitivity"), v8::String::New("base"));
+ }
+ break;
+ }
+ case UCOL_SECONDARY:
+ resolved->Set(v8::String::New("strength"), v8::String::New("secondary"));
+ resolved->Set(v8::String::New("sensitivity"), v8::String::New("accent"));
+ break;
+ case UCOL_TERTIARY:
+ resolved->Set(v8::String::New("strength"), v8::String::New("tertiary"));
+ resolved->Set(v8::String::New("sensitivity"), v8::String::New("variant"));
+ break;
+ case UCOL_QUATERNARY:
+ // We shouldn't get quaternary and identical from ICU, but if we do
+ // put them into variant.
+ resolved->Set(v8::String::New("strength"), v8::String::New("quaternary"));
+ resolved->Set(v8::String::New("sensitivity"), v8::String::New("variant"));
+ break;
+ default:
+ resolved->Set(v8::String::New("strength"), v8::String::New("identical"));
+ resolved->Set(v8::String::New("sensitivity"), v8::String::New("variant"));
+ }
+
+ if (UCOL_SHIFTED == collator->getAttribute(UCOL_ALTERNATE_HANDLING, status)) {
+ resolved->Set(v8::String::New("ignorePunctuation"),
+ v8::Boolean::New(true));
+ } else {
+ resolved->Set(v8::String::New("ignorePunctuation"),
+ v8::Boolean::New(false));
+ }
+
+ // Set the locale
+ char result[ULOC_FULLNAME_CAPACITY];
+ status = U_ZERO_ERROR;
+ uloc_toLanguageTag(
+ icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status);
+ if (U_SUCCESS(status)) {
+ resolved->Set(v8::String::New("locale"), v8::String::New(result));
+ } else {
+ // This would never happen, since we got the locale from ICU.
+ resolved->Set(v8::String::New("locale"), v8::String::New("und"));
+ }
+}
+
+static void SetBooleanSetting(UColAttribute attribute,
+ icu::Collator* collator,
+ const char* property,
+ v8::Handle<v8::Object> resolved) {
+ UErrorCode status = U_ZERO_ERROR;
+ if (UCOL_ON == collator->getAttribute(attribute, status)) {
+ resolved->Set(v8::String::New(property), v8::Boolean::New(true));
+ } else {
+ resolved->Set(v8::String::New(property), v8::Boolean::New(false));
+ }
+}
+
+} // namespace v8_i18n
diff --git a/chromium/v8/src/extensions/i18n/collator.h b/chromium/v8/src/extensions/i18n/collator.h
new file mode 100644
index 00000000000..a3991b9ed24
--- /dev/null
+++ b/chromium/v8/src/extensions/i18n/collator.h
@@ -0,0 +1,68 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// limitations under the License.
+
+#ifndef V8_EXTENSIONS_I18N_COLLATOR_H_
+#define V8_EXTENSIONS_I18N_COLLATOR_H_
+
+#include "unicode/uversion.h"
+#include "v8.h"
+
+namespace U_ICU_NAMESPACE {
+class Collator;
+class UnicodeString;
+}
+
+namespace v8_i18n {
+
+class Collator {
+ public:
+ static void JSCreateCollator(const v8::FunctionCallbackInfo<v8::Value>& args);
+
+ // Helper methods for various bindings.
+
+ // Unpacks collator object from corresponding JavaScript object.
+ static icu::Collator* UnpackCollator(v8::Handle<v8::Object> obj);
+
+ // Release memory we allocated for the Collator once the JS object that
+ // holds the pointer gets garbage collected.
+ static void DeleteCollator(v8::Isolate* isolate,
+ v8::Persistent<v8::Object>* object,
+ void* param);
+
+ // Compare two strings and returns -1, 0 and 1 depending on
+ // whether string1 is smaller than, equal to or larger than string2.
+ static void JSInternalCompare(
+ const v8::FunctionCallbackInfo<v8::Value>& args);
+
+ private:
+ Collator() {}
+};
+
+} // namespace v8_i18n
+
+#endif // V8_EXTENSIONS_I18N_COLLATOR_H_
diff --git a/chromium/v8/src/extensions/i18n/collator.js b/chromium/v8/src/extensions/i18n/collator.js
index d8d247b36f4..3483515bef2 100644
--- a/chromium/v8/src/extensions/i18n/collator.js
+++ b/chromium/v8/src/extensions/i18n/collator.js
@@ -35,6 +35,8 @@
* Useful for subclassing.
*/
function initializeCollator(collator, locales, options) {
+ native function NativeJSCreateCollator();
+
if (collator.hasOwnProperty('__initializedIntlObject')) {
throw new TypeError('Trying to re-initialize Collator object.');
}
@@ -101,9 +103,9 @@ function initializeCollator(collator, locales, options) {
usage: {value: internalOptions.usage, writable: true}
});
- var internalCollator = %CreateCollator(requestedLocale,
- internalOptions,
- resolved);
+ var internalCollator = NativeJSCreateCollator(requestedLocale,
+ internalOptions,
+ resolved);
// Writable, configurable and enumerable are set to false by default.
Object.defineProperty(collator, 'collator', {value: internalCollator});
@@ -202,7 +204,8 @@ function initializeCollator(collator, locales, options) {
* the sort order, or x comes after y in the sort order, respectively.
*/
function compare(collator, x, y) {
- return %InternalCompare(collator.collator, String(x), String(y));
+ native function NativeJSInternalCompare();
+ return NativeJSInternalCompare(collator.collator, String(x), String(y));
};
diff --git a/chromium/v8/src/extensions/i18n/date-format.cc b/chromium/v8/src/extensions/i18n/date-format.cc
new file mode 100644
index 00000000000..1058e37a58c
--- /dev/null
+++ b/chromium/v8/src/extensions/i18n/date-format.cc
@@ -0,0 +1,329 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// limitations under the License.
+
+#include "date-format.h"
+
+#include <string.h>
+
+#include "i18n-utils.h"
+#include "unicode/calendar.h"
+#include "unicode/dtfmtsym.h"
+#include "unicode/dtptngen.h"
+#include "unicode/locid.h"
+#include "unicode/numsys.h"
+#include "unicode/smpdtfmt.h"
+#include "unicode/timezone.h"
+
+namespace v8_i18n {
+
+static icu::SimpleDateFormat* InitializeDateTimeFormat(v8::Handle<v8::String>,
+ v8::Handle<v8::Object>,
+ v8::Handle<v8::Object>);
+static icu::SimpleDateFormat* CreateICUDateFormat(const icu::Locale&,
+ v8::Handle<v8::Object>);
+static void SetResolvedSettings(const icu::Locale&,
+ icu::SimpleDateFormat*,
+ v8::Handle<v8::Object>);
+
+icu::SimpleDateFormat* DateFormat::UnpackDateFormat(
+ v8::Handle<v8::Object> obj) {
+ v8::HandleScope handle_scope;
+
+ if (obj->HasOwnProperty(v8::String::New("dateFormat"))) {
+ return static_cast<icu::SimpleDateFormat*>(
+ obj->GetAlignedPointerFromInternalField(0));
+ }
+
+ return NULL;
+}
+
+void DateFormat::DeleteDateFormat(v8::Isolate* isolate,
+ v8::Persistent<v8::Object>* object,
+ void* param) {
+ // First delete the hidden C++ object.
+ // Unpacking should never return NULL here. That would only happen if
+ // this method is used as the weak callback for persistent handles not
+ // pointing to a date time formatter.
+ v8::HandleScope handle_scope(isolate);
+ v8::Local<v8::Object> handle = v8::Local<v8::Object>::New(isolate, *object);
+ delete UnpackDateFormat(handle);
+
+ // Then dispose of the persistent handle to JS object.
+ object->Dispose(isolate);
+}
+
+void DateFormat::JSInternalFormat(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ double millis = 0.0;
+ if (args.Length() != 2 || !args[0]->IsObject() || !args[1]->IsDate()) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New(
+ "Internal error. Formatter and date value have to be specified.")));
+ return;
+ } else {
+ millis = v8::Date::Cast(*args[1])->NumberValue();
+ }
+
+ icu::SimpleDateFormat* date_format = UnpackDateFormat(args[0]->ToObject());
+ if (!date_format) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New("DateTimeFormat method called on an object "
+ "that is not a DateTimeFormat.")));
+ return;
+ }
+
+ icu::UnicodeString result;
+ date_format->format(millis, result);
+
+ args.GetReturnValue().Set(v8::String::New(
+ reinterpret_cast<const uint16_t*>(result.getBuffer()), result.length()));
+}
+
+void DateFormat::JSInternalParse(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ icu::UnicodeString string_date;
+ if (args.Length() != 2 || !args[0]->IsObject() || !args[1]->IsString()) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New(
+ "Internal error. Formatter and string have to be specified.")));
+ return;
+ } else {
+ if (!Utils::V8StringToUnicodeString(args[1], &string_date)) {
+ string_date = "";
+ }
+ }
+
+ icu::SimpleDateFormat* date_format = UnpackDateFormat(args[0]->ToObject());
+ if (!date_format) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New("DateTimeFormat method called on an object "
+ "that is not a DateTimeFormat.")));
+ return;
+ }
+
+ UErrorCode status = U_ZERO_ERROR;
+ UDate date = date_format->parse(string_date, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+
+ args.GetReturnValue().Set(v8::Date::New(static_cast<double>(date)));
+}
+
+void DateFormat::JSCreateDateTimeFormat(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ if (args.Length() != 3 ||
+ !args[0]->IsString() ||
+ !args[1]->IsObject() ||
+ !args[2]->IsObject()) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New("Internal error, wrong parameters.")));
+ return;
+ }
+
+ v8::Isolate* isolate = args.GetIsolate();
+ v8::Local<v8::ObjectTemplate> date_format_template =
+ Utils::GetTemplate(isolate);
+
+ // Create an empty object wrapper.
+ v8::Local<v8::Object> local_object = date_format_template->NewInstance();
+ // But the handle shouldn't be empty.
+ // That can happen if there was a stack overflow when creating the object.
+ if (local_object.IsEmpty()) {
+ args.GetReturnValue().Set(local_object);
+ return;
+ }
+
+ // Set date time formatter as internal field of the resulting JS object.
+ icu::SimpleDateFormat* date_format = InitializeDateTimeFormat(
+ args[0]->ToString(), args[1]->ToObject(), args[2]->ToObject());
+
+ if (!date_format) {
+ v8::ThrowException(v8::Exception::Error(v8::String::New(
+ "Internal error. Couldn't create ICU date time formatter.")));
+ return;
+ } else {
+ local_object->SetAlignedPointerInInternalField(0, date_format);
+
+ v8::TryCatch try_catch;
+ local_object->Set(v8::String::New("dateFormat"), v8::String::New("valid"));
+ if (try_catch.HasCaught()) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New("Internal error, couldn't set property.")));
+ return;
+ }
+ }
+
+ v8::Persistent<v8::Object> wrapper(isolate, local_object);
+ // Make object handle weak so we can delete iterator once GC kicks in.
+ wrapper.MakeWeak<void>(NULL, &DeleteDateFormat);
+ args.GetReturnValue().Set(wrapper);
+ wrapper.ClearAndLeak();
+}
+
+static icu::SimpleDateFormat* InitializeDateTimeFormat(
+ v8::Handle<v8::String> locale,
+ v8::Handle<v8::Object> options,
+ v8::Handle<v8::Object> resolved) {
+ // Convert BCP47 into ICU locale format.
+ UErrorCode status = U_ZERO_ERROR;
+ icu::Locale icu_locale;
+ char icu_result[ULOC_FULLNAME_CAPACITY];
+ int icu_length = 0;
+ v8::String::AsciiValue bcp47_locale(locale);
+ if (bcp47_locale.length() != 0) {
+ uloc_forLanguageTag(*bcp47_locale, icu_result, ULOC_FULLNAME_CAPACITY,
+ &icu_length, &status);
+ if (U_FAILURE(status) || icu_length == 0) {
+ return NULL;
+ }
+ icu_locale = icu::Locale(icu_result);
+ }
+
+ icu::SimpleDateFormat* date_format = CreateICUDateFormat(icu_locale, options);
+ if (!date_format) {
+ // Remove extensions and try again.
+ icu::Locale no_extension_locale(icu_locale.getBaseName());
+ date_format = CreateICUDateFormat(no_extension_locale, options);
+
+ // Set resolved settings (pattern, numbering system, calendar).
+ SetResolvedSettings(no_extension_locale, date_format, resolved);
+ } else {
+ SetResolvedSettings(icu_locale, date_format, resolved);
+ }
+
+ return date_format;
+}
+
+static icu::SimpleDateFormat* CreateICUDateFormat(
+ const icu::Locale& icu_locale, v8::Handle<v8::Object> options) {
+ // Create time zone as specified by the user. We have to re-create time zone
+ // since calendar takes ownership.
+ icu::TimeZone* tz = NULL;
+ icu::UnicodeString timezone;
+ if (Utils::ExtractStringSetting(options, "timeZone", &timezone)) {
+ tz = icu::TimeZone::createTimeZone(timezone);
+ } else {
+ tz = icu::TimeZone::createDefault();
+ }
+
+ // Create a calendar using locale, and apply time zone to it.
+ UErrorCode status = U_ZERO_ERROR;
+ icu::Calendar* calendar =
+ icu::Calendar::createInstance(tz, icu_locale, status);
+
+ // Make formatter from skeleton. Calendar and numbering system are added
+ // to the locale as Unicode extension (if they were specified at all).
+ icu::SimpleDateFormat* date_format = NULL;
+ icu::UnicodeString skeleton;
+ if (Utils::ExtractStringSetting(options, "skeleton", &skeleton)) {
+ icu::DateTimePatternGenerator* generator =
+ icu::DateTimePatternGenerator::createInstance(icu_locale, status);
+ icu::UnicodeString pattern;
+ if (U_SUCCESS(status)) {
+ pattern = generator->getBestPattern(skeleton, status);
+ delete generator;
+ }
+
+ date_format = new icu::SimpleDateFormat(pattern, icu_locale, status);
+ if (U_SUCCESS(status)) {
+ date_format->adoptCalendar(calendar);
+ }
+ }
+
+ if (U_FAILURE(status)) {
+ delete calendar;
+ delete date_format;
+ date_format = NULL;
+ }
+
+ return date_format;
+}
+
+static void SetResolvedSettings(const icu::Locale& icu_locale,
+ icu::SimpleDateFormat* date_format,
+ v8::Handle<v8::Object> resolved) {
+ UErrorCode status = U_ZERO_ERROR;
+ icu::UnicodeString pattern;
+ date_format->toPattern(pattern);
+ resolved->Set(v8::String::New("pattern"),
+ v8::String::New(reinterpret_cast<const uint16_t*>(
+ pattern.getBuffer()), pattern.length()));
+
+ // Set time zone and calendar.
+ if (date_format) {
+ const icu::Calendar* calendar = date_format->getCalendar();
+ const char* calendar_name = calendar->getType();
+ resolved->Set(v8::String::New("calendar"), v8::String::New(calendar_name));
+
+ const icu::TimeZone& tz = calendar->getTimeZone();
+ icu::UnicodeString time_zone;
+ tz.getID(time_zone);
+
+ icu::UnicodeString canonical_time_zone;
+ icu::TimeZone::getCanonicalID(time_zone, canonical_time_zone, status);
+ if (U_SUCCESS(status)) {
+ if (canonical_time_zone == UNICODE_STRING_SIMPLE("Etc/GMT")) {
+ resolved->Set(v8::String::New("timeZone"), v8::String::New("UTC"));
+ } else {
+ resolved->Set(v8::String::New("timeZone"),
+ v8::String::New(reinterpret_cast<const uint16_t*>(
+ canonical_time_zone.getBuffer()),
+ canonical_time_zone.length()));
+ }
+ }
+ }
+
+ // Ugly hack. ICU doesn't expose numbering system in any way, so we have
+ // to assume that for given locale NumberingSystem constructor produces the
+ // same digits as NumberFormat/Calendar would.
+ status = U_ZERO_ERROR;
+ icu::NumberingSystem* numbering_system =
+ icu::NumberingSystem::createInstance(icu_locale, status);
+ if (U_SUCCESS(status)) {
+ const char* ns = numbering_system->getName();
+ resolved->Set(v8::String::New("numberingSystem"), v8::String::New(ns));
+ } else {
+ resolved->Set(v8::String::New("numberingSystem"), v8::Undefined());
+ }
+ delete numbering_system;
+
+ // Set the locale
+ char result[ULOC_FULLNAME_CAPACITY];
+ status = U_ZERO_ERROR;
+ uloc_toLanguageTag(
+ icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status);
+ if (U_SUCCESS(status)) {
+ resolved->Set(v8::String::New("locale"), v8::String::New(result));
+ } else {
+ // This would never happen, since we got the locale from ICU.
+ resolved->Set(v8::String::New("locale"), v8::String::New("und"));
+ }
+}
+
+} // namespace v8_i18n
diff --git a/chromium/v8/src/extensions/i18n/date-format.h b/chromium/v8/src/extensions/i18n/date-format.h
new file mode 100644
index 00000000000..daa5964e254
--- /dev/null
+++ b/chromium/v8/src/extensions/i18n/date-format.h
@@ -0,0 +1,71 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// limitations under the License.
+
+#ifndef V8_EXTENSIONS_I18N_DATE_FORMAT_H_
+#define V8_EXTENSIONS_I18N_DATE_FORMAT_H_
+
+#include "unicode/uversion.h"
+#include "v8.h"
+
+namespace U_ICU_NAMESPACE {
+class SimpleDateFormat;
+}
+
+namespace v8_i18n {
+
+class DateFormat {
+ public:
+ static void JSCreateDateTimeFormat(
+ const v8::FunctionCallbackInfo<v8::Value>& args);
+
+ // Helper methods for various bindings.
+
+ // Unpacks date format object from corresponding JavaScript object.
+ static icu::SimpleDateFormat* UnpackDateFormat(
+ v8::Handle<v8::Object> obj);
+
+ // Release memory we allocated for the DateFormat once the JS object that
+ // holds the pointer gets garbage collected.
+ static void DeleteDateFormat(v8::Isolate* isolate,
+ v8::Persistent<v8::Object>* object,
+ void* param);
+
+ // Formats date and returns corresponding string.
+ static void JSInternalFormat(const v8::FunctionCallbackInfo<v8::Value>& args);
+
+ // Parses date and returns corresponding Date object or undefined if parse
+ // failed.
+ static void JSInternalParse(const v8::FunctionCallbackInfo<v8::Value>& args);
+
+ private:
+ DateFormat();
+};
+
+} // namespace v8_i18n
+
+#endif // V8_EXTENSIONS_I18N_DATE_FORMAT_H_
diff --git a/chromium/v8/src/extensions/i18n/date-format.js b/chromium/v8/src/extensions/i18n/date-format.js
index b1d28e535cd..04e7a7c7b9d 100644
--- a/chromium/v8/src/extensions/i18n/date-format.js
+++ b/chromium/v8/src/extensions/i18n/date-format.js
@@ -235,6 +235,7 @@ function toDateTimeOptions(options, required, defaults) {
* Useful for subclassing.
*/
function initializeDateTimeFormat(dateFormat, locales, options) {
+ native function NativeJSCreateDateTimeFormat();
if (dateFormat.hasOwnProperty('__initializedIntlObject')) {
throw new TypeError('Trying to re-initialize DateTimeFormat object.');
@@ -291,7 +292,7 @@ function initializeDateTimeFormat(dateFormat, locales, options) {
year: {writable: true}
});
- var formatter = %CreateDateTimeFormat(
+ var formatter = NativeJSCreateDateTimeFormat(
requestedLocale, {skeleton: ldmlString, timeZone: tz}, resolved);
if (tz !== undefined && tz !== resolved.timeZone) {
@@ -408,6 +409,8 @@ function initializeDateTimeFormat(dateFormat, locales, options) {
* DateTimeFormat.
*/
function formatDate(formatter, dateValue) {
+ native function NativeJSInternalDateFormat();
+
var dateMs;
if (dateValue === undefined) {
dateMs = Date.now();
@@ -419,7 +422,7 @@ function formatDate(formatter, dateValue) {
throw new RangeError('Provided date is not in valid range.');
}
- return %InternalDateFormat(formatter.formatter, new Date(dateMs));
+ return NativeJSInternalDateFormat(formatter.formatter, new Date(dateMs));
}
@@ -430,7 +433,8 @@ function formatDate(formatter, dateValue) {
* Returns undefined if date string cannot be parsed.
*/
function parseDate(formatter, value) {
- return %InternalDateParse(formatter.formatter, String(value));
+ native function NativeJSInternalDateParse();
+ return NativeJSInternalDateParse(formatter.formatter, String(value));
}
diff --git a/chromium/v8/src/extensions/i18n/i18n-extension.cc b/chromium/v8/src/extensions/i18n/i18n-extension.cc
index e2cba8eb9ef..1c77b8899fb 100644
--- a/chromium/v8/src/extensions/i18n/i18n-extension.cc
+++ b/chromium/v8/src/extensions/i18n/i18n-extension.cc
@@ -29,7 +29,11 @@
#include "i18n-extension.h"
#include "break-iterator.h"
+#include "collator.h"
+#include "date-format.h"
+#include "locale.h"
#include "natives.h"
+#include "number-format.h"
using v8::internal::I18NNatives;
@@ -45,6 +49,42 @@ Extension::Extension()
v8::Handle<v8::FunctionTemplate> Extension::GetNativeFunction(
v8::Handle<v8::String> name) {
+ // Standalone, helper methods.
+ if (name->Equals(v8::String::New("NativeJSCanonicalizeLanguageTag"))) {
+ return v8::FunctionTemplate::New(JSCanonicalizeLanguageTag);
+ } else if (name->Equals(v8::String::New("NativeJSAvailableLocalesOf"))) {
+ return v8::FunctionTemplate::New(JSAvailableLocalesOf);
+ } else if (name->Equals(v8::String::New("NativeJSGetDefaultICULocale"))) {
+ return v8::FunctionTemplate::New(JSGetDefaultICULocale);
+ } else if (name->Equals(v8::String::New("NativeJSGetLanguageTagVariants"))) {
+ return v8::FunctionTemplate::New(JSGetLanguageTagVariants);
+ }
+
+ // Date format and parse.
+ if (name->Equals(v8::String::New("NativeJSCreateDateTimeFormat"))) {
+ return v8::FunctionTemplate::New(DateFormat::JSCreateDateTimeFormat);
+ } else if (name->Equals(v8::String::New("NativeJSInternalDateFormat"))) {
+ return v8::FunctionTemplate::New(DateFormat::JSInternalFormat);
+ } else if (name->Equals(v8::String::New("NativeJSInternalDateParse"))) {
+ return v8::FunctionTemplate::New(DateFormat::JSInternalParse);
+ }
+
+ // Number format and parse.
+ if (name->Equals(v8::String::New("NativeJSCreateNumberFormat"))) {
+ return v8::FunctionTemplate::New(NumberFormat::JSCreateNumberFormat);
+ } else if (name->Equals(v8::String::New("NativeJSInternalNumberFormat"))) {
+ return v8::FunctionTemplate::New(NumberFormat::JSInternalFormat);
+ } else if (name->Equals(v8::String::New("NativeJSInternalNumberParse"))) {
+ return v8::FunctionTemplate::New(NumberFormat::JSInternalParse);
+ }
+
+ // Collator.
+ if (name->Equals(v8::String::New("NativeJSCreateCollator"))) {
+ return v8::FunctionTemplate::New(Collator::JSCreateCollator);
+ } else if (name->Equals(v8::String::New("NativeJSInternalCompare"))) {
+ return v8::FunctionTemplate::New(Collator::JSInternalCompare);
+ }
+
// Break iterator.
if (name->Equals(v8::String::New("NativeJSCreateBreakIterator"))) {
return v8::FunctionTemplate::New(BreakIterator::JSCreateBreakIterator);
diff --git a/chromium/v8/src/extensions/i18n/i18n-utils.cc b/chromium/v8/src/extensions/i18n/i18n-utils.cc
index 8c87f0715b9..eac11669047 100644
--- a/chromium/v8/src/extensions/i18n/i18n-utils.cc
+++ b/chromium/v8/src/extensions/i18n/i18n-utils.cc
@@ -141,37 +141,35 @@ void Utils::AsciiToUChar(const char* source,
}
-static v8::Local<v8::ObjectTemplate> ToLocal(i::Handle<i::Object> handle) {
- return v8::Utils::ToLocal(i::Handle<i::ObjectTemplateInfo>::cast(handle));
-}
-
-
-template<int internal_fields, i::EternalHandles::SingletonHandle field>
-static v8::Local<v8::ObjectTemplate> GetEternal(v8::Isolate* external) {
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(external);
- if (isolate->eternal_handles()->Exists(field)) {
- return ToLocal(isolate->eternal_handles()->GetSingleton(field));
- }
- v8::Local<v8::ObjectTemplate> raw_template(v8::ObjectTemplate::New());
- raw_template->SetInternalFieldCount(internal_fields);
- return ToLocal(
- isolate->eternal_handles()->CreateSingleton(
- isolate,
- *v8::Utils::OpenHandle(*raw_template),
- field));
-}
-
-
// static
v8::Local<v8::ObjectTemplate> Utils::GetTemplate(v8::Isolate* isolate) {
- return GetEternal<1, i::EternalHandles::I18N_TEMPLATE_ONE>(isolate);
+ i::Isolate* internal = reinterpret_cast<i::Isolate*>(isolate);
+ if (internal->heap()->i18n_template_one() ==
+ internal->heap()->the_hole_value()) {
+ v8::Local<v8::ObjectTemplate> raw_template(v8::ObjectTemplate::New());
+ raw_template->SetInternalFieldCount(1);
+ internal->heap()
+ ->SetI18nTemplateOne(*v8::Utils::OpenHandle(*raw_template));
+ }
+
+ return v8::Utils::ToLocal(i::Handle<i::ObjectTemplateInfo>::cast(
+ internal->factory()->i18n_template_one()));
}
// static
v8::Local<v8::ObjectTemplate> Utils::GetTemplate2(v8::Isolate* isolate) {
- return GetEternal<2, i::EternalHandles::I18N_TEMPLATE_TWO>(isolate);
-}
+ i::Isolate* internal = reinterpret_cast<i::Isolate*>(isolate);
+ if (internal->heap()->i18n_template_two() ==
+ internal->heap()->the_hole_value()) {
+ v8::Local<v8::ObjectTemplate> raw_template(v8::ObjectTemplate::New());
+ raw_template->SetInternalFieldCount(2);
+ internal->heap()
+ ->SetI18nTemplateTwo(*v8::Utils::OpenHandle(*raw_template));
+ }
+ return v8::Utils::ToLocal(i::Handle<i::ObjectTemplateInfo>::cast(
+ internal->factory()->i18n_template_two()));
+}
} // namespace v8_i18n
diff --git a/chromium/v8/src/extensions/i18n/i18n-utils.js b/chromium/v8/src/extensions/i18n/i18n-utils.js
index 545082ecbba..d7e9486c507 100644
--- a/chromium/v8/src/extensions/i18n/i18n-utils.js
+++ b/chromium/v8/src/extensions/i18n/i18n-utils.js
@@ -255,6 +255,8 @@ function resolveLocale(service, requestedLocales, options) {
* lookup algorithm.
*/
function lookupMatcher(service, requestedLocales) {
+ native function NativeJSGetDefaultICULocale();
+
if (service.match(SERVICE_RE) === null) {
throw new Error('Internal error, wrong service type: ' + service);
}
@@ -285,7 +287,7 @@ function lookupMatcher(service, requestedLocales) {
// Didn't find a match, return default.
if (DEFAULT_ICU_LOCALE === undefined) {
- DEFAULT_ICU_LOCALE = %GetDefaultICULocale();
+ DEFAULT_ICU_LOCALE = NativeJSGetDefaultICULocale();
}
return {'locale': DEFAULT_ICU_LOCALE, 'extension': '', 'position': -1};
@@ -444,12 +446,14 @@ function getOptimalLanguageTag(original, resolved) {
// Returns Array<Object>, where each object has maximized and base properties.
// Maximized: zh -> zh-Hans-CN
// Base: zh-CN-u-ca-gregory -> zh-CN
+ native function NativeJSGetLanguageTagVariants();
+
// Take care of grandfathered or simple cases.
if (original === resolved) {
return original;
}
- var locales = %GetLanguageTagVariants([original, resolved]);
+ var locales = NativeJSGetLanguageTagVariants([original, resolved]);
if (locales[0].maximized !== locales[1].maximized) {
return resolved;
}
@@ -467,7 +471,8 @@ function getOptimalLanguageTag(original, resolved) {
* that is supported. This is required by the spec.
*/
function getAvailableLocalesOf(service) {
- var available = %AvailableLocalesOf(service);
+ native function NativeJSAvailableLocalesOf();
+ var available = NativeJSAvailableLocalesOf(service);
for (var i in available) {
if (available.hasOwnProperty(i)) {
diff --git a/chromium/v8/src/extensions/i18n/locale.cc b/chromium/v8/src/extensions/i18n/locale.cc
new file mode 100644
index 00000000000..6b6f9ac314d
--- /dev/null
+++ b/chromium/v8/src/extensions/i18n/locale.cc
@@ -0,0 +1,251 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// limitations under the License.
+
+#include "locale.h"
+
+#include <string.h>
+
+#include "unicode/brkiter.h"
+#include "unicode/coll.h"
+#include "unicode/datefmt.h"
+#include "unicode/numfmt.h"
+#include "unicode/uloc.h"
+#include "unicode/uversion.h"
+
+namespace v8_i18n {
+
+void JSCanonicalizeLanguageTag(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ // Expect locale id which is a string.
+ if (args.Length() != 1 || !args[0]->IsString()) {
+ v8::ThrowException(v8::Exception::SyntaxError(
+ v8::String::New("Locale identifier, as a string, is required.")));
+ return;
+ }
+
+ UErrorCode error = U_ZERO_ERROR;
+
+ char icu_result[ULOC_FULLNAME_CAPACITY];
+ int icu_length = 0;
+
+ // Return value which denotes invalid language tag.
+ const char* const kInvalidTag = "invalid-tag";
+
+ v8::String::AsciiValue locale_id(args[0]->ToString());
+ if (*locale_id == NULL) {
+ args.GetReturnValue().Set(v8::String::New(kInvalidTag));
+ return;
+ }
+
+ uloc_forLanguageTag(*locale_id, icu_result, ULOC_FULLNAME_CAPACITY,
+ &icu_length, &error);
+ if (U_FAILURE(error) || icu_length == 0) {
+ args.GetReturnValue().Set(v8::String::New(kInvalidTag));
+ return;
+ }
+
+ char result[ULOC_FULLNAME_CAPACITY];
+
+ // Force strict BCP47 rules.
+ uloc_toLanguageTag(icu_result, result, ULOC_FULLNAME_CAPACITY, TRUE, &error);
+
+ if (U_FAILURE(error)) {
+ args.GetReturnValue().Set(v8::String::New(kInvalidTag));
+ return;
+ }
+
+ args.GetReturnValue().Set(v8::String::New(result));
+}
+
+
+void JSAvailableLocalesOf(const v8::FunctionCallbackInfo<v8::Value>& args) {
+ // Expect service name which is a string.
+ if (args.Length() != 1 || !args[0]->IsString()) {
+ v8::ThrowException(v8::Exception::SyntaxError(
+ v8::String::New("Service identifier, as a string, is required.")));
+ return;
+ }
+
+ const icu::Locale* available_locales = NULL;
+
+ int32_t count = 0;
+ v8::String::AsciiValue service(args[0]->ToString());
+ if (strcmp(*service, "collator") == 0) {
+ available_locales = icu::Collator::getAvailableLocales(count);
+ } else if (strcmp(*service, "numberformat") == 0) {
+ available_locales = icu::NumberFormat::getAvailableLocales(count);
+ } else if (strcmp(*service, "dateformat") == 0) {
+ available_locales = icu::DateFormat::getAvailableLocales(count);
+ } else if (strcmp(*service, "breakiterator") == 0) {
+ available_locales = icu::BreakIterator::getAvailableLocales(count);
+ }
+
+ v8::TryCatch try_catch;
+ UErrorCode error = U_ZERO_ERROR;
+ char result[ULOC_FULLNAME_CAPACITY];
+ v8::Handle<v8::Object> locales = v8::Object::New();
+
+ for (int32_t i = 0; i < count; ++i) {
+ const char* icu_name = available_locales[i].getName();
+
+ error = U_ZERO_ERROR;
+ // No need to force strict BCP47 rules.
+ uloc_toLanguageTag(icu_name, result, ULOC_FULLNAME_CAPACITY, FALSE, &error);
+ if (U_FAILURE(error)) {
+ // This shouldn't happen, but lets not break the user.
+ continue;
+ }
+
+ // Index is just a dummy value for the property value.
+ locales->Set(v8::String::New(result), v8::Integer::New(i));
+ if (try_catch.HasCaught()) {
+ // Ignore error, but stop processing and return.
+ break;
+ }
+ }
+
+ args.GetReturnValue().Set(locales);
+}
+
+
+void JSGetDefaultICULocale(const v8::FunctionCallbackInfo<v8::Value>& args) {
+ icu::Locale default_locale;
+
+ // Set the locale
+ char result[ULOC_FULLNAME_CAPACITY];
+ UErrorCode status = U_ZERO_ERROR;
+ uloc_toLanguageTag(
+ default_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status);
+ if (U_SUCCESS(status)) {
+ args.GetReturnValue().Set(v8::String::New(result));
+ return;
+ }
+
+ args.GetReturnValue().Set(v8::String::New("und"));
+}
+
+
+void JSGetLanguageTagVariants(const v8::FunctionCallbackInfo<v8::Value>& args) {
+ v8::TryCatch try_catch;
+
+ // Expect an array of strings.
+ if (args.Length() != 1 || !args[0]->IsArray()) {
+ v8::ThrowException(v8::Exception::SyntaxError(
+ v8::String::New("Internal error. Expected Array<String>.")));
+ return;
+ }
+
+ v8::Local<v8::Array> input = v8::Local<v8::Array>::Cast(args[0]);
+ v8::Handle<v8::Array> output = v8::Array::New(input->Length());
+ for (unsigned int i = 0; i < input->Length(); ++i) {
+ v8::Local<v8::Value> locale_id = input->Get(i);
+ if (try_catch.HasCaught()) {
+ break;
+ }
+
+ if (!locale_id->IsString()) {
+ v8::ThrowException(v8::Exception::SyntaxError(
+ v8::String::New("Internal error. Array element is missing "
+ "or it isn't a string.")));
+ return;
+ }
+
+ v8::String::AsciiValue ascii_locale_id(locale_id);
+ if (*ascii_locale_id == NULL) {
+ v8::ThrowException(v8::Exception::SyntaxError(
+ v8::String::New("Internal error. Non-ASCII locale identifier.")));
+ return;
+ }
+
+ UErrorCode error = U_ZERO_ERROR;
+
+ // Convert from BCP47 to ICU format.
+ // de-DE-u-co-phonebk -> de_DE@collation=phonebook
+ char icu_locale[ULOC_FULLNAME_CAPACITY];
+ int icu_locale_length = 0;
+ uloc_forLanguageTag(*ascii_locale_id, icu_locale, ULOC_FULLNAME_CAPACITY,
+ &icu_locale_length, &error);
+ if (U_FAILURE(error) || icu_locale_length == 0) {
+ v8::ThrowException(v8::Exception::SyntaxError(
+ v8::String::New("Internal error. Failed to convert locale to ICU.")));
+ return;
+ }
+
+ // Maximize the locale.
+ // de_DE@collation=phonebook -> de_Latn_DE@collation=phonebook
+ char icu_max_locale[ULOC_FULLNAME_CAPACITY];
+ uloc_addLikelySubtags(
+ icu_locale, icu_max_locale, ULOC_FULLNAME_CAPACITY, &error);
+
+ // Remove extensions from maximized locale.
+ // de_Latn_DE@collation=phonebook -> de_Latn_DE
+ char icu_base_max_locale[ULOC_FULLNAME_CAPACITY];
+ uloc_getBaseName(
+ icu_max_locale, icu_base_max_locale, ULOC_FULLNAME_CAPACITY, &error);
+
+ // Get original name without extensions.
+ // de_DE@collation=phonebook -> de_DE
+ char icu_base_locale[ULOC_FULLNAME_CAPACITY];
+ uloc_getBaseName(
+ icu_locale, icu_base_locale, ULOC_FULLNAME_CAPACITY, &error);
+
+ // Convert from ICU locale format to BCP47 format.
+ // de_Latn_DE -> de-Latn-DE
+ char base_max_locale[ULOC_FULLNAME_CAPACITY];
+ uloc_toLanguageTag(icu_base_max_locale, base_max_locale,
+ ULOC_FULLNAME_CAPACITY, FALSE, &error);
+
+ // de_DE -> de-DE
+ char base_locale[ULOC_FULLNAME_CAPACITY];
+ uloc_toLanguageTag(
+ icu_base_locale, base_locale, ULOC_FULLNAME_CAPACITY, FALSE, &error);
+
+ if (U_FAILURE(error)) {
+ v8::ThrowException(v8::Exception::SyntaxError(
+ v8::String::New("Internal error. Couldn't generate maximized "
+ "or base locale.")));
+ return;
+ }
+
+ v8::Handle<v8::Object> result = v8::Object::New();
+ result->Set(v8::String::New("maximized"), v8::String::New(base_max_locale));
+ result->Set(v8::String::New("base"), v8::String::New(base_locale));
+ if (try_catch.HasCaught()) {
+ break;
+ }
+
+ output->Set(i, result);
+ if (try_catch.HasCaught()) {
+ break;
+ }
+ }
+
+ args.GetReturnValue().Set(output);
+}
+
+} // namespace v8_i18n
diff --git a/chromium/v8/src/extensions/i18n/locale.h b/chromium/v8/src/extensions/i18n/locale.h
new file mode 100644
index 00000000000..c39568e5d9d
--- /dev/null
+++ b/chromium/v8/src/extensions/i18n/locale.h
@@ -0,0 +1,56 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// limitations under the License.
+
+#ifndef V8_EXTENSIONS_I18N_SRC_LOCALE_H_
+#define V8_EXTENSIONS_I18N_SRC_LOCALE_H_
+
+#include "unicode/uversion.h"
+#include "v8.h"
+
+namespace v8_i18n {
+
+// Canonicalizes the BCP47 language tag using BCP47 rules.
+// Returns 'invalid-tag' in case input was not well formed.
+void JSCanonicalizeLanguageTag(const v8::FunctionCallbackInfo<v8::Value>& args);
+
+// Returns a list of available locales for collator, date or number formatter.
+void JSAvailableLocalesOf(const v8::FunctionCallbackInfo<v8::Value>& args);
+
+// Returns default ICU locale.
+void JSGetDefaultICULocale(const v8::FunctionCallbackInfo<v8::Value>& args);
+
+// Returns an array of objects, that have maximized and base names of inputs.
+// Unicode extensions are dropped from both.
+// Input: ['zh-TW-u-nu-thai', 'sr']
+// Output: [{maximized: 'zh-Hant-TW', base: 'zh-TW'},
+// {maximized: 'sr-Cyrl-RS', base: 'sr'}]
+void JSGetLanguageTagVariants(const v8::FunctionCallbackInfo<v8::Value>& args);
+
+} // namespace v8_i18n
+
+#endif // V8_EXTENSIONS_I18N_LOCALE_H_
diff --git a/chromium/v8/src/extensions/i18n/locale.js b/chromium/v8/src/extensions/i18n/locale.js
index e4783277e64..ea95b87192e 100644
--- a/chromium/v8/src/extensions/i18n/locale.js
+++ b/chromium/v8/src/extensions/i18n/locale.js
@@ -34,6 +34,8 @@
* Canonicalizes the language tag, or throws in case the tag is invalid.
*/
function canonicalizeLanguageTag(localeID) {
+ native function NativeJSCanonicalizeLanguageTag();
+
// null is typeof 'object' so we have to do extra check.
if (typeof localeID !== 'string' && typeof localeID !== 'object' ||
localeID === null) {
@@ -50,7 +52,7 @@ function canonicalizeLanguageTag(localeID) {
// ICU bug filled - http://bugs.icu-project.org/trac/ticket/9265.
// TODO(cira): check if -u-kn-true-kc-true-kh-true still throws after
// upgrade to ICU 4.9.
- var tag = %CanonicalizeLanguageTag(localeString);
+ var tag = NativeJSCanonicalizeLanguageTag(localeString);
if (tag === 'invalid-tag') {
throw new RangeError('Invalid language tag: ' + localeString);
}
diff --git a/chromium/v8/src/extensions/i18n/number-format.cc b/chromium/v8/src/extensions/i18n/number-format.cc
new file mode 100644
index 00000000000..136471561c4
--- /dev/null
+++ b/chromium/v8/src/extensions/i18n/number-format.cc
@@ -0,0 +1,418 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// limitations under the License.
+
+#include "number-format.h"
+
+#include <string.h>
+
+#include "i18n-utils.h"
+#include "unicode/curramt.h"
+#include "unicode/dcfmtsym.h"
+#include "unicode/decimfmt.h"
+#include "unicode/locid.h"
+#include "unicode/numfmt.h"
+#include "unicode/numsys.h"
+#include "unicode/uchar.h"
+#include "unicode/ucurr.h"
+#include "unicode/unum.h"
+#include "unicode/uversion.h"
+
+namespace v8_i18n {
+
+static icu::DecimalFormat* InitializeNumberFormat(v8::Handle<v8::String>,
+ v8::Handle<v8::Object>,
+ v8::Handle<v8::Object>);
+static icu::DecimalFormat* CreateICUNumberFormat(const icu::Locale&,
+ v8::Handle<v8::Object>);
+static void SetResolvedSettings(const icu::Locale&,
+ icu::DecimalFormat*,
+ v8::Handle<v8::Object>);
+
+icu::DecimalFormat* NumberFormat::UnpackNumberFormat(
+ v8::Handle<v8::Object> obj) {
+ v8::HandleScope handle_scope;
+
+ // v8::ObjectTemplate doesn't have HasInstance method so we can't check
+ // if obj is an instance of NumberFormat class. We'll check for a property
+ // that has to be in the object. The same applies to other services, like
+ // Collator and DateTimeFormat.
+ if (obj->HasOwnProperty(v8::String::New("numberFormat"))) {
+ return static_cast<icu::DecimalFormat*>(
+ obj->GetAlignedPointerFromInternalField(0));
+ }
+
+ return NULL;
+}
+
+void NumberFormat::DeleteNumberFormat(v8::Isolate* isolate,
+ v8::Persistent<v8::Object>* object,
+ void* param) {
+ // First delete the hidden C++ object.
+ // Unpacking should never return NULL here. That would only happen if
+ // this method is used as the weak callback for persistent handles not
+ // pointing to a date time formatter.
+ v8::HandleScope handle_scope(isolate);
+ v8::Local<v8::Object> handle = v8::Local<v8::Object>::New(isolate, *object);
+ delete UnpackNumberFormat(handle);
+
+ // Then dispose of the persistent handle to JS object.
+ object->Dispose(isolate);
+}
+
+void NumberFormat::JSInternalFormat(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ if (args.Length() != 2 || !args[0]->IsObject() || !args[1]->IsNumber()) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New("Formatter and numeric value have to be specified.")));
+ return;
+ }
+
+ icu::DecimalFormat* number_format = UnpackNumberFormat(args[0]->ToObject());
+ if (!number_format) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New("NumberFormat method called on an object "
+ "that is not a NumberFormat.")));
+ return;
+ }
+
+ // ICU will handle actual NaN value properly and return NaN string.
+ icu::UnicodeString result;
+ number_format->format(args[1]->NumberValue(), result);
+
+ args.GetReturnValue().Set(v8::String::New(
+ reinterpret_cast<const uint16_t*>(result.getBuffer()), result.length()));
+}
+
+void NumberFormat::JSInternalParse(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ if (args.Length() != 2 || !args[0]->IsObject() || !args[1]->IsString()) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New("Formatter and string have to be specified.")));
+ return;
+ }
+
+ icu::DecimalFormat* number_format = UnpackNumberFormat(args[0]->ToObject());
+ if (!number_format) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New("NumberFormat method called on an object "
+ "that is not a NumberFormat.")));
+ return;
+ }
+
+ // ICU will handle actual NaN value properly and return NaN string.
+ icu::UnicodeString string_number;
+ if (!Utils::V8StringToUnicodeString(args[1]->ToString(), &string_number)) {
+ string_number = "";
+ }
+
+ UErrorCode status = U_ZERO_ERROR;
+ icu::Formattable result;
+ // ICU 4.6 doesn't support parseCurrency call. We need to wait for ICU49
+ // to be part of Chrome.
+ // TODO(cira): Include currency parsing code using parseCurrency call.
+ // We need to check if the formatter parses all currencies or only the
+ // one it was constructed with (it will impact the API - how to return ISO
+ // code and the value).
+ number_format->parse(string_number, result, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+
+ switch (result.getType()) {
+ case icu::Formattable::kDouble:
+ args.GetReturnValue().Set(result.getDouble());
+ return;
+ case icu::Formattable::kLong:
+ args.GetReturnValue().Set(result.getLong());
+ return;
+ case icu::Formattable::kInt64:
+ args.GetReturnValue().Set(static_cast<double>(result.getInt64()));
+ return;
+ default:
+ return;
+ }
+}
+
+void NumberFormat::JSCreateNumberFormat(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ if (args.Length() != 3 ||
+ !args[0]->IsString() ||
+ !args[1]->IsObject() ||
+ !args[2]->IsObject()) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New("Internal error, wrong parameters.")));
+ return;
+ }
+
+ v8::Isolate* isolate = args.GetIsolate();
+ v8::Local<v8::ObjectTemplate> number_format_template =
+ Utils::GetTemplate(isolate);
+
+ // Create an empty object wrapper.
+ v8::Local<v8::Object> local_object = number_format_template->NewInstance();
+ // But the handle shouldn't be empty.
+ // That can happen if there was a stack overflow when creating the object.
+ if (local_object.IsEmpty()) {
+ args.GetReturnValue().Set(local_object);
+ return;
+ }
+
+ // Set number formatter as internal field of the resulting JS object.
+ icu::DecimalFormat* number_format = InitializeNumberFormat(
+ args[0]->ToString(), args[1]->ToObject(), args[2]->ToObject());
+
+ if (!number_format) {
+ v8::ThrowException(v8::Exception::Error(v8::String::New(
+ "Internal error. Couldn't create ICU number formatter.")));
+ return;
+ } else {
+ local_object->SetAlignedPointerInInternalField(0, number_format);
+
+ v8::TryCatch try_catch;
+ local_object->Set(v8::String::New("numberFormat"),
+ v8::String::New("valid"));
+ if (try_catch.HasCaught()) {
+ v8::ThrowException(v8::Exception::Error(
+ v8::String::New("Internal error, couldn't set property.")));
+ return;
+ }
+ }
+
+ v8::Persistent<v8::Object> wrapper(isolate, local_object);
+ // Make object handle weak so we can delete iterator once GC kicks in.
+ wrapper.MakeWeak<void>(NULL, &DeleteNumberFormat);
+ args.GetReturnValue().Set(wrapper);
+ wrapper.ClearAndLeak();
+}
+
+static icu::DecimalFormat* InitializeNumberFormat(
+ v8::Handle<v8::String> locale,
+ v8::Handle<v8::Object> options,
+ v8::Handle<v8::Object> resolved) {
+ // Convert BCP47 into ICU locale format.
+ UErrorCode status = U_ZERO_ERROR;
+ icu::Locale icu_locale;
+ char icu_result[ULOC_FULLNAME_CAPACITY];
+ int icu_length = 0;
+ v8::String::AsciiValue bcp47_locale(locale);
+ if (bcp47_locale.length() != 0) {
+ uloc_forLanguageTag(*bcp47_locale, icu_result, ULOC_FULLNAME_CAPACITY,
+ &icu_length, &status);
+ if (U_FAILURE(status) || icu_length == 0) {
+ return NULL;
+ }
+ icu_locale = icu::Locale(icu_result);
+ }
+
+ icu::DecimalFormat* number_format =
+ CreateICUNumberFormat(icu_locale, options);
+ if (!number_format) {
+ // Remove extensions and try again.
+ icu::Locale no_extension_locale(icu_locale.getBaseName());
+ number_format = CreateICUNumberFormat(no_extension_locale, options);
+
+ // Set resolved settings (pattern, numbering system).
+ SetResolvedSettings(no_extension_locale, number_format, resolved);
+ } else {
+ SetResolvedSettings(icu_locale, number_format, resolved);
+ }
+
+ return number_format;
+}
+
+static icu::DecimalFormat* CreateICUNumberFormat(
+ const icu::Locale& icu_locale, v8::Handle<v8::Object> options) {
+ // Make formatter from options. Numbering system is added
+ // to the locale as Unicode extension (if it was specified at all).
+ UErrorCode status = U_ZERO_ERROR;
+ icu::DecimalFormat* number_format = NULL;
+ icu::UnicodeString style;
+ icu::UnicodeString currency;
+ if (Utils::ExtractStringSetting(options, "style", &style)) {
+ if (style == UNICODE_STRING_SIMPLE("currency")) {
+ Utils::ExtractStringSetting(options, "currency", &currency);
+
+ icu::UnicodeString display;
+ Utils::ExtractStringSetting(options, "currencyDisplay", &display);
+#if (U_ICU_VERSION_MAJOR_NUM == 4) && (U_ICU_VERSION_MINOR_NUM <= 6)
+ icu::NumberFormat::EStyles style;
+ if (display == UNICODE_STRING_SIMPLE("code")) {
+ style = icu::NumberFormat::kIsoCurrencyStyle;
+ } else if (display == UNICODE_STRING_SIMPLE("name")) {
+ style = icu::NumberFormat::kPluralCurrencyStyle;
+ } else {
+ style = icu::NumberFormat::kCurrencyStyle;
+ }
+#else // ICU version is 4.8 or above (we ignore versions below 4.0).
+ UNumberFormatStyle style;
+ if (display == UNICODE_STRING_SIMPLE("code")) {
+ style = UNUM_CURRENCY_ISO;
+ } else if (display == UNICODE_STRING_SIMPLE("name")) {
+ style = UNUM_CURRENCY_PLURAL;
+ } else {
+ style = UNUM_CURRENCY;
+ }
+#endif
+
+ number_format = static_cast<icu::DecimalFormat*>(
+ icu::NumberFormat::createInstance(icu_locale, style, status));
+ } else if (style == UNICODE_STRING_SIMPLE("percent")) {
+ number_format = static_cast<icu::DecimalFormat*>(
+ icu::NumberFormat::createPercentInstance(icu_locale, status));
+ if (U_FAILURE(status)) {
+ delete number_format;
+ return NULL;
+ }
+ // Make sure 1.1% doesn't go into 2%.
+ number_format->setMinimumFractionDigits(1);
+ } else {
+ // Make a decimal instance by default.
+ number_format = static_cast<icu::DecimalFormat*>(
+ icu::NumberFormat::createInstance(icu_locale, status));
+ }
+ }
+
+ if (U_FAILURE(status)) {
+ delete number_format;
+ return NULL;
+ }
+
+ // Set all options.
+ if (!currency.isEmpty()) {
+ number_format->setCurrency(currency.getBuffer(), status);
+ }
+
+ int32_t digits;
+ if (Utils::ExtractIntegerSetting(
+ options, "minimumIntegerDigits", &digits)) {
+ number_format->setMinimumIntegerDigits(digits);
+ }
+
+ if (Utils::ExtractIntegerSetting(
+ options, "minimumFractionDigits", &digits)) {
+ number_format->setMinimumFractionDigits(digits);
+ }
+
+ if (Utils::ExtractIntegerSetting(
+ options, "maximumFractionDigits", &digits)) {
+ number_format->setMaximumFractionDigits(digits);
+ }
+
+ bool significant_digits_used = false;
+ if (Utils::ExtractIntegerSetting(
+ options, "minimumSignificantDigits", &digits)) {
+ number_format->setMinimumSignificantDigits(digits);
+ significant_digits_used = true;
+ }
+
+ if (Utils::ExtractIntegerSetting(
+ options, "maximumSignificantDigits", &digits)) {
+ number_format->setMaximumSignificantDigits(digits);
+ significant_digits_used = true;
+ }
+
+ number_format->setSignificantDigitsUsed(significant_digits_used);
+
+ bool grouping;
+ if (Utils::ExtractBooleanSetting(options, "useGrouping", &grouping)) {
+ number_format->setGroupingUsed(grouping);
+ }
+
+ // Set rounding mode.
+ number_format->setRoundingMode(icu::DecimalFormat::kRoundHalfUp);
+
+ return number_format;
+}
+
+static void SetResolvedSettings(const icu::Locale& icu_locale,
+ icu::DecimalFormat* number_format,
+ v8::Handle<v8::Object> resolved) {
+ icu::UnicodeString pattern;
+ number_format->toPattern(pattern);
+ resolved->Set(v8::String::New("pattern"),
+ v8::String::New(reinterpret_cast<const uint16_t*>(
+ pattern.getBuffer()), pattern.length()));
+
+ // Set resolved currency code in options.currency if not empty.
+ icu::UnicodeString currency(number_format->getCurrency());
+ if (!currency.isEmpty()) {
+ resolved->Set(v8::String::New("currency"),
+ v8::String::New(reinterpret_cast<const uint16_t*>(
+ currency.getBuffer()), currency.length()));
+ }
+
+ // Ugly hack. ICU doesn't expose numbering system in any way, so we have
+ // to assume that for given locale NumberingSystem constructor produces the
+ // same digits as NumberFormat would.
+ UErrorCode status = U_ZERO_ERROR;
+ icu::NumberingSystem* numbering_system =
+ icu::NumberingSystem::createInstance(icu_locale, status);
+ if (U_SUCCESS(status)) {
+ const char* ns = numbering_system->getName();
+ resolved->Set(v8::String::New("numberingSystem"), v8::String::New(ns));
+ } else {
+ resolved->Set(v8::String::New("numberingSystem"), v8::Undefined());
+ }
+ delete numbering_system;
+
+ resolved->Set(v8::String::New("useGrouping"),
+ v8::Boolean::New(number_format->isGroupingUsed()));
+
+ resolved->Set(v8::String::New("minimumIntegerDigits"),
+ v8::Integer::New(number_format->getMinimumIntegerDigits()));
+
+ resolved->Set(v8::String::New("minimumFractionDigits"),
+ v8::Integer::New(number_format->getMinimumFractionDigits()));
+
+ resolved->Set(v8::String::New("maximumFractionDigits"),
+ v8::Integer::New(number_format->getMaximumFractionDigits()));
+
+ if (resolved->HasOwnProperty(v8::String::New("minimumSignificantDigits"))) {
+ resolved->Set(v8::String::New("minimumSignificantDigits"), v8::Integer::New(
+ number_format->getMinimumSignificantDigits()));
+ }
+
+ if (resolved->HasOwnProperty(v8::String::New("maximumSignificantDigits"))) {
+ resolved->Set(v8::String::New("maximumSignificantDigits"), v8::Integer::New(
+ number_format->getMaximumSignificantDigits()));
+ }
+
+ // Set the locale
+ char result[ULOC_FULLNAME_CAPACITY];
+ status = U_ZERO_ERROR;
+ uloc_toLanguageTag(
+ icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status);
+ if (U_SUCCESS(status)) {
+ resolved->Set(v8::String::New("locale"), v8::String::New(result));
+ } else {
+ // This would never happen, since we got the locale from ICU.
+ resolved->Set(v8::String::New("locale"), v8::String::New("und"));
+ }
+}
+
+} // namespace v8_i18n
diff --git a/chromium/v8/src/extensions/i18n/number-format.h b/chromium/v8/src/extensions/i18n/number-format.h
new file mode 100644
index 00000000000..d4dbc4d6f3b
--- /dev/null
+++ b/chromium/v8/src/extensions/i18n/number-format.h
@@ -0,0 +1,69 @@
+// Copyright 2013 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// limitations under the License.
+
+#ifndef V8_EXTENSIONS_I18N_NUMBER_FORMAT_H_
+#define V8_EXTENSIONS_I18N_NUMBER_FORMAT_H_
+
+#include "unicode/uversion.h"
+#include "v8.h"
+
+namespace U_ICU_NAMESPACE {
+class DecimalFormat;
+}
+
+namespace v8_i18n {
+
+class NumberFormat {
+ public:
+ static void JSCreateNumberFormat(
+ const v8::FunctionCallbackInfo<v8::Value>& args);
+
+ // Helper methods for various bindings.
+
+ // Unpacks date format object from corresponding JavaScript object.
+ static icu::DecimalFormat* UnpackNumberFormat(v8::Handle<v8::Object> obj);
+
+ // Release memory we allocated for the NumberFormat once the JS object that
+ // holds the pointer gets garbage collected.
+ static void DeleteNumberFormat(v8::Isolate* isolate,
+ v8::Persistent<v8::Object>* object,
+ void* param);
+
+ // Formats number and returns corresponding string.
+ static void JSInternalFormat(const v8::FunctionCallbackInfo<v8::Value>& args);
+
+ // Parses a string and returns a number.
+ static void JSInternalParse(const v8::FunctionCallbackInfo<v8::Value>& args);
+
+ private:
+ NumberFormat();
+};
+
+} // namespace v8_i18n
+
+#endif // V8_EXTENSIONS_I18N_NUMBER_FORMAT_H_
diff --git a/chromium/v8/src/extensions/i18n/number-format.js b/chromium/v8/src/extensions/i18n/number-format.js
index 5722a5dc1f3..1cd3db13554 100644
--- a/chromium/v8/src/extensions/i18n/number-format.js
+++ b/chromium/v8/src/extensions/i18n/number-format.js
@@ -65,6 +65,8 @@ function getNumberOption(options, property, min, max, fallback) {
* Useful for subclassing.
*/
function initializeNumberFormat(numberFormat, locales, options) {
+ native function NativeJSCreateNumberFormat();
+
if (numberFormat.hasOwnProperty('__initializedIntlObject')) {
throw new TypeError('Trying to re-initialize NumberFormat object.');
}
@@ -146,9 +148,9 @@ function initializeNumberFormat(numberFormat, locales, options) {
if (internalOptions.hasOwnProperty('maximumSignificantDigits')) {
defineWEProperty(resolved, 'maximumSignificantDigits', undefined);
}
- var formatter = %CreateNumberFormat(requestedLocale,
- internalOptions,
- resolved);
+ var formatter = NativeJSCreateNumberFormat(requestedLocale,
+ internalOptions,
+ resolved);
// We can't get information about number or currency style from ICU, so we
// assume user request was fulfilled.
@@ -267,13 +269,15 @@ function initializeNumberFormat(numberFormat, locales, options) {
* NumberFormat.
*/
function formatNumber(formatter, value) {
+ native function NativeJSInternalNumberFormat();
+
// Spec treats -0 and +0 as 0.
var number = Number(value);
if (number === -0) {
number = 0;
}
- return %InternalNumberFormat(formatter.formatter, number);
+ return NativeJSInternalNumberFormat(formatter.formatter, number);
}
@@ -281,7 +285,9 @@ function formatNumber(formatter, value) {
* Returns a Number that represents string value that was passed in.
*/
function parseNumber(formatter, value) {
- return %InternalNumberParse(formatter.formatter, String(value));
+ native function NativeJSInternalNumberParse();
+
+ return NativeJSInternalNumberParse(formatter.formatter, String(value));
}
diff --git a/chromium/v8/src/factory.cc b/chromium/v8/src/factory.cc
index 9323c2f1f03..3ca0efa2107 100644
--- a/chromium/v8/src/factory.cc
+++ b/chromium/v8/src/factory.cc
@@ -1023,11 +1023,10 @@ Handle<GlobalObject> Factory::NewGlobalObject(
Handle<JSObject> Factory::NewJSObjectFromMap(Handle<Map> map,
- PretenureFlag pretenure,
- bool alloc_props) {
+ PretenureFlag pretenure) {
CALL_HEAP_FUNCTION(
isolate(),
- isolate()->heap()->AllocateJSObjectFromMap(*map, pretenure, alloc_props),
+ isolate()->heap()->AllocateJSObjectFromMap(*map, pretenure),
JSObject);
}
@@ -1216,7 +1215,6 @@ Handle<SharedFunctionInfo> Factory::NewSharedFunctionInfo(
shared->set_num_literals(literals_array_size);
if (is_generator) {
shared->set_instance_class_name(isolate()->heap()->Generator_string());
- shared->DisableOptimization(kGenerator);
}
return shared;
}
@@ -1393,10 +1391,8 @@ Handle<JSFunction> Factory::CreateApiFunction(
Smi::cast(instance_template->internal_field_count())->value();
}
- // TODO(svenpanne) Kill ApiInstanceType and refactor things by generalizing
- // JSObject::GetHeaderSize.
int instance_size = kPointerSize * internal_field_count;
- InstanceType type;
+ InstanceType type = INVALID_TYPE;
switch (instance_type) {
case JavaScriptObject:
type = JS_OBJECT_TYPE;
@@ -1411,10 +1407,9 @@ Handle<JSFunction> Factory::CreateApiFunction(
instance_size += JSGlobalProxy::kSize;
break;
default:
- UNREACHABLE();
- type = JS_OBJECT_TYPE; // Keep the compiler happy.
break;
}
+ ASSERT(type != INVALID_TYPE);
Handle<JSFunction> result =
NewFunction(Factory::empty_string(),
diff --git a/chromium/v8/src/factory.h b/chromium/v8/src/factory.h
index 02c9a4d2eb4..dc7933aa20f 100644
--- a/chromium/v8/src/factory.h
+++ b/chromium/v8/src/factory.h
@@ -301,11 +301,7 @@ class Factory {
// JS objects are pretenured when allocated by the bootstrapper and
// runtime.
Handle<JSObject> NewJSObjectFromMap(Handle<Map> map,
- PretenureFlag pretenure = NOT_TENURED,
- bool allocate_properties = true);
-
- Handle<JSObject> NewJSObjectFromMapForDeoptimizer(
- Handle<Map> map, PretenureFlag pretenure = NOT_TENURED);
+ PretenureFlag pretenure = NOT_TENURED);
// JS modules are pretenured.
Handle<JSModule> NewJSModule(Handle<Context> context,
diff --git a/chromium/v8/src/flag-definitions.h b/chromium/v8/src/flag-definitions.h
index c0ad4a8e17a..5fc5d880b3e 100644
--- a/chromium/v8/src/flag-definitions.h
+++ b/chromium/v8/src/flag-definitions.h
@@ -174,7 +174,6 @@ DEFINE_bool(harmony_iteration, false, "enable harmony iteration (for-of)")
DEFINE_bool(harmony_numeric_literals, false,
"enable harmony numeric literals (0o77, 0b11)")
DEFINE_bool(harmony_strings, false, "enable harmony string")
-DEFINE_bool(harmony_arrays, false, "enable harmony arrays")
DEFINE_bool(harmony, false, "enable all harmony features (except typeof)")
DEFINE_implication(harmony, harmony_scoping)
DEFINE_implication(harmony, harmony_modules)
@@ -186,7 +185,6 @@ DEFINE_implication(harmony, harmony_generators)
DEFINE_implication(harmony, harmony_iteration)
DEFINE_implication(harmony, harmony_numeric_literals)
DEFINE_implication(harmony, harmony_strings)
-DEFINE_implication(harmony, harmony_arrays)
DEFINE_implication(harmony_modules, harmony_scoping)
DEFINE_implication(harmony_observation, harmony_collections)
// TODO[dslomov] add harmony => harmony_typed_arrays
@@ -264,11 +262,10 @@ DEFINE_int(deopt_every_n_garbage_collections,
"deoptimize every n garbage collections")
DEFINE_bool(print_deopt_stress, false, "print number of possible deopt points")
DEFINE_bool(trap_on_deopt, false, "put a break point before deoptimizing")
-DEFINE_bool(trap_on_stub_deopt, false,
- "put a break point before deoptimizing a stub")
DEFINE_bool(deoptimize_uncommon_cases, true, "deoptimize uncommon cases")
DEFINE_bool(polymorphic_inlining, true, "polymorphic inlining")
DEFINE_bool(use_osr, true, "use on-stack replacement")
+DEFINE_bool(idefs, false, "use informative definitions")
DEFINE_bool(array_bounds_checks_elimination, true,
"perform array bounds checks elimination")
DEFINE_bool(array_bounds_checks_hoisting, false,
@@ -312,6 +309,9 @@ DEFINE_int(parallel_recompilation_queue_length, 8,
"the length of the parallel compilation queue")
DEFINE_int(parallel_recompilation_delay, 0,
"artificial compilation delay in ms")
+DEFINE_bool(omit_prototype_checks_for_leaf_maps, true,
+ "do not emit prototype checks if all prototypes have leaf maps, "
+ "deoptimize the optimized code if the layout of the maps changes.")
DEFINE_bool(omit_map_checks_for_leaf_maps, true,
"do not emit check maps for constant values that have a leaf map, "
"deoptimize the optimized code if the layout of the maps changes.")
diff --git a/chromium/v8/src/full-codegen.cc b/chromium/v8/src/full-codegen.cc
index f5539e8b187..6d802e965d2 100644
--- a/chromium/v8/src/full-codegen.cc
+++ b/chromium/v8/src/full-codegen.cc
@@ -512,7 +512,7 @@ void FullCodeGenerator::AccumulatorValueContext::Plug(Register reg) const {
void FullCodeGenerator::StackValueContext::Plug(Register reg) const {
- __ Push(reg);
+ __ push(reg);
}
@@ -530,7 +530,7 @@ void FullCodeGenerator::EffectContext::PlugTOS() const {
void FullCodeGenerator::AccumulatorValueContext::PlugTOS() const {
- __ Pop(result_register());
+ __ pop(result_register());
}
@@ -540,7 +540,7 @@ void FullCodeGenerator::StackValueContext::PlugTOS() const {
void FullCodeGenerator::TestContext::PlugTOS() const {
// For simplicity we always test the accumulator register.
- __ Pop(result_register());
+ __ pop(result_register());
codegen()->PrepareForBailoutBeforeSplit(condition(), false, NULL, NULL);
codegen()->DoTest(this);
}
@@ -1006,7 +1006,7 @@ void FullCodeGenerator::VisitLogicalExpression(BinaryOperation* expr) {
VisitForAccumulatorValue(left);
// We want the value in the accumulator for the test, and on the stack in
// case we need it.
- __ Push(result_register());
+ __ push(result_register());
Label discard, restore;
if (is_logical_and) {
DoTest(left, &discard, &restore, &restore);
@@ -1014,7 +1014,7 @@ void FullCodeGenerator::VisitLogicalExpression(BinaryOperation* expr) {
DoTest(left, &restore, &discard, &restore);
}
__ bind(&restore);
- __ Pop(result_register());
+ __ pop(result_register());
__ jmp(&done);
__ bind(&discard);
__ Drop(1);
@@ -1024,7 +1024,7 @@ void FullCodeGenerator::VisitLogicalExpression(BinaryOperation* expr) {
VisitForAccumulatorValue(left);
// We want the value in the accumulator for the test, and on the stack in
// case we need it.
- __ Push(result_register());
+ __ push(result_register());
Label discard;
if (is_logical_and) {
DoTest(left, &discard, &done, &discard);
@@ -1416,7 +1416,7 @@ void FullCodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) {
// Extend the context before executing the catch block.
{ Comment cmnt(masm_, "[ Extend catch context");
__ Push(stmt->variable()->name());
- __ Push(result_register());
+ __ push(result_register());
PushFunctionArgumentForContextAllocation();
__ CallRuntime(Runtime::kPushCatchContext, 3);
StoreToFrameField(StandardFrameConstants::kContextOffset,
@@ -1481,7 +1481,7 @@ void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
// preserved by the finally block. Call the finally block and then
// rethrow the exception if it returns.
__ Call(&finally_entry);
- __ Push(result_register());
+ __ push(result_register());
__ CallRuntime(Runtime::kReThrow, 1);
// Finally block implementation.
diff --git a/chromium/v8/src/full-codegen.h b/chromium/v8/src/full-codegen.h
index af63aedfbff..a9db54e32c1 100644
--- a/chromium/v8/src/full-codegen.h
+++ b/chromium/v8/src/full-codegen.h
@@ -31,14 +31,11 @@
#include "v8.h"
#include "allocation.h"
-#include "assert-scope.h"
#include "ast.h"
#include "code-stubs.h"
#include "codegen.h"
#include "compiler.h"
#include "data-flow.h"
-#include "globals.h"
-#include "objects.h"
namespace v8 {
namespace internal {
@@ -139,64 +136,7 @@ class FullCodeGenerator: public AstVisitor {
#error Unsupported target architecture.
#endif
- class BackEdgeTableIterator {
- public:
- explicit BackEdgeTableIterator(Code* unoptimized) {
- ASSERT(unoptimized->kind() == Code::FUNCTION);
- instruction_start_ = unoptimized->instruction_start();
- cursor_ = instruction_start_ + unoptimized->back_edge_table_offset();
- ASSERT(cursor_ < instruction_start_ + unoptimized->instruction_size());
- table_length_ = Memory::uint32_at(cursor_);
- cursor_ += kTableLengthSize;
- end_ = cursor_ + table_length_ * kEntrySize;
- }
-
- bool Done() { return cursor_ >= end_; }
-
- void Next() {
- ASSERT(!Done());
- cursor_ += kEntrySize;
- }
-
- BailoutId ast_id() {
- ASSERT(!Done());
- return BailoutId(static_cast<int>(
- Memory::uint32_at(cursor_ + kAstIdOffset)));
- }
-
- uint32_t loop_depth() {
- ASSERT(!Done());
- return Memory::uint32_at(cursor_ + kLoopDepthOffset);
- }
-
- uint32_t pc_offset() {
- ASSERT(!Done());
- return Memory::uint32_at(cursor_ + kPcOffsetOffset);
- }
-
- Address pc() {
- ASSERT(!Done());
- return instruction_start_ + pc_offset();
- }
-
- uint32_t table_length() { return table_length_; }
-
- private:
- static const int kTableLengthSize = kIntSize;
- static const int kAstIdOffset = 0 * kIntSize;
- static const int kPcOffsetOffset = 1 * kIntSize;
- static const int kLoopDepthOffset = 2 * kIntSize;
- static const int kEntrySize = 3 * kIntSize;
-
- Address cursor_;
- Address end_;
- Address instruction_start_;
- uint32_t table_length_;
- DisallowHeapAllocation no_gc_while_iterating_over_raw_addresses_;
-
- DISALLOW_COPY_AND_ASSIGN(BackEdgeTableIterator);
- };
-
+ static const int kBackEdgeEntrySize = 3 * kIntSize;
private:
class Breakable;
@@ -685,6 +625,8 @@ class FullCodeGenerator: public AstVisitor {
AST_NODE_LIST(DECLARE_VISIT)
#undef DECLARE_VISIT
+ void EmitUnaryOperation(UnaryOperation* expr, const char* comment);
+
void VisitComma(BinaryOperation* expr);
void VisitLogicalExpression(BinaryOperation* expr);
void VisitArithmeticExpression(BinaryOperation* expr);
diff --git a/chromium/v8/src/global-handles.cc b/chromium/v8/src/global-handles.cc
index 5df9dd4c6c7..41771e6db41 100644
--- a/chromium/v8/src/global-handles.cc
+++ b/chromium/v8/src/global-handles.cc
@@ -1019,68 +1019,4 @@ void GlobalHandles::ComputeObjectGroupsAndImplicitReferences() {
}
-EternalHandles::EternalHandles() : size_(0) {
- STATIC_ASSERT(v8::kUninitializedEternalIndex == kInvalidIndex);
- for (unsigned i = 0; i < ARRAY_SIZE(singleton_handles_); i++) {
- singleton_handles_[i] = kInvalidIndex;
- }
-}
-
-
-EternalHandles::~EternalHandles() {
- for (int i = 0; i < blocks_.length(); i++) delete[] blocks_[i];
-}
-
-
-void EternalHandles::IterateAllRoots(ObjectVisitor* visitor) {
- int limit = size_;
- for (int i = 0; i < blocks_.length(); i++) {
- ASSERT(limit > 0);
- Object** block = blocks_[i];
- visitor->VisitPointers(block, block + Min(limit, kSize));
- limit -= kSize;
- }
-}
-
-
-void EternalHandles::IterateNewSpaceRoots(ObjectVisitor* visitor) {
- for (int i = 0; i < new_space_indices_.length(); i++) {
- visitor->VisitPointer(GetLocation(new_space_indices_[i]));
- }
-}
-
-
-void EternalHandles::PostGarbageCollectionProcessing(Heap* heap) {
- int last = 0;
- for (int i = 0; i < new_space_indices_.length(); i++) {
- int index = new_space_indices_[i];
- if (heap->InNewSpace(*GetLocation(index))) {
- new_space_indices_[last++] = index;
- }
- }
- new_space_indices_.Rewind(last);
-}
-
-
-int EternalHandles::Create(Isolate* isolate, Object* object) {
- if (object == NULL) return kInvalidIndex;
- ASSERT_NE(isolate->heap()->the_hole_value(), object);
- int block = size_ >> kShift;
- int offset = size_ & kMask;
- // need to resize
- if (offset == 0) {
- Object** next_block = new Object*[kSize];
- Object* the_hole = isolate->heap()->the_hole_value();
- MemsetPointer(next_block, the_hole, kSize);
- blocks_.Add(next_block);
- }
- ASSERT_EQ(isolate->heap()->the_hole_value(), blocks_[block][offset]);
- blocks_[block][offset] = object;
- if (isolate->heap()->InNewSpace(object)) {
- new_space_indices_.Add(size_);
- }
- return size_++;
-}
-
-
} } // namespace v8::internal
diff --git a/chromium/v8/src/global-handles.h b/chromium/v8/src/global-handles.h
index 5a4ad13e2f5..cd75133a243 100644
--- a/chromium/v8/src/global-handles.h
+++ b/chromium/v8/src/global-handles.h
@@ -31,7 +31,6 @@
#include "../include/v8.h"
#include "../include/v8-profiler.h"
-#include "handles.h"
#include "list.h"
#include "v8utils.h"
@@ -332,76 +331,6 @@ class GlobalHandles {
};
-class EternalHandles {
- public:
- enum SingletonHandle {
- I18N_TEMPLATE_ONE,
- I18N_TEMPLATE_TWO,
-
- NUMBER_OF_SINGLETON_HANDLES
- };
-
- EternalHandles();
- ~EternalHandles();
-
- int NumberOfHandles() { return size_; }
-
- // Create an EternalHandle, returning the index.
- int Create(Isolate* isolate, Object* object);
-
- // Grab the handle for an existing EternalHandle.
- inline Handle<Object> Get(int index) {
- return Handle<Object>(GetLocation(index));
- }
-
- // Grab the handle for an existing SingletonHandle.
- inline Handle<Object> GetSingleton(SingletonHandle singleton) {
- ASSERT(Exists(singleton));
- return Get(singleton_handles_[singleton]);
- }
-
- // Checks whether a SingletonHandle has been assigned.
- inline bool Exists(SingletonHandle singleton) {
- return singleton_handles_[singleton] != kInvalidIndex;
- }
-
- // Assign a SingletonHandle to an empty slot and returns the handle.
- Handle<Object> CreateSingleton(Isolate* isolate,
- Object* object,
- SingletonHandle singleton) {
- ASSERT(singleton_handles_[singleton] == kInvalidIndex);
- singleton_handles_[singleton] = Create(isolate, object);
- return Get(singleton_handles_[singleton]);
- }
-
- // Iterates over all handles.
- void IterateAllRoots(ObjectVisitor* visitor);
- // Iterates over all handles which might be in new space.
- void IterateNewSpaceRoots(ObjectVisitor* visitor);
- // Rebuilds new space list.
- void PostGarbageCollectionProcessing(Heap* heap);
-
- private:
- static const int kInvalidIndex = -1;
- static const int kShift = 8;
- static const int kSize = 1 << kShift;
- static const int kMask = 0xff;
-
- // Gets the slot for an index
- inline Object** GetLocation(int index) {
- ASSERT(index >= 0 && index < size_);
- return &blocks_[index >> kShift][index & kMask];
- }
-
- int size_;
- List<Object**> blocks_;
- List<int> new_space_indices_;
- int singleton_handles_[NUMBER_OF_SINGLETON_HANDLES];
-
- DISALLOW_COPY_AND_ASSIGN(EternalHandles);
-};
-
-
} } // namespace v8::internal
#endif // V8_GLOBAL_HANDLES_H_
diff --git a/chromium/v8/src/harmony-array.js b/chromium/v8/src/harmony-array.js
deleted file mode 100644
index e440299ff61..00000000000
--- a/chromium/v8/src/harmony-array.js
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2013 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-'use strict';
-
-// This file relies on the fact that the following declaration has been made
-// in runtime.js:
-// var $Array = global.Array;
-
-// -------------------------------------------------------------------
-
-// ES6 draft 07-15-13, section 15.4.3.23
-function ArrayFind(predicate /* thisArg */) { // length == 1
- if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
- throw MakeTypeError("called_on_null_or_undefined",
- ["Array.prototype.find"]);
- }
-
- var array = ToObject(this);
- var length = ToInteger(array.length);
-
- if (!IS_SPEC_FUNCTION(predicate)) {
- throw MakeTypeError('called_non_callable', [predicate]);
- }
-
- var thisArg;
- if (%_ArgumentsLength() > 1) {
- thisArg = %_Arguments(1);
- }
-
- if (IS_NULL_OR_UNDEFINED(thisArg)) {
- thisArg = %GetDefaultReceiver(predicate) || thisArg;
- } else if (!IS_SPEC_OBJECT(thisArg) && %IsClassicModeFunction(predicate)) {
- thisArg = ToObject(thisArg);
- }
-
- for (var i = 0; i < length; i++) {
- if (i in array) {
- var element = array[i];
- if (%_CallFunction(thisArg, element, i, array, predicate)) {
- return element;
- }
- }
- }
-
- return;
-}
-
-
-// ES6 draft 07-15-13, section 15.4.3.24
-function ArrayFindIndex(predicate /* thisArg */) { // length == 1
- if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
- throw MakeTypeError("called_on_null_or_undefined",
- ["Array.prototype.findIndex"]);
- }
-
- var array = ToObject(this);
- var length = ToInteger(array.length);
-
- if (!IS_SPEC_FUNCTION(predicate)) {
- throw MakeTypeError('called_non_callable', [predicate]);
- }
-
- var thisArg;
- if (%_ArgumentsLength() > 1) {
- thisArg = %_Arguments(1);
- }
-
- if (IS_NULL_OR_UNDEFINED(thisArg)) {
- thisArg = %GetDefaultReceiver(predicate) || thisArg;
- } else if (!IS_SPEC_OBJECT(thisArg) && %IsClassicModeFunction(predicate)) {
- thisArg = ToObject(thisArg);
- }
-
- for (var i = 0; i < length; i++) {
- if (i in array) {
- var element = array[i];
- if (%_CallFunction(thisArg, element, i, array, predicate)) {
- return i;
- }
- }
- }
-
- return -1;
-}
-
-
-// -------------------------------------------------------------------
-
-function HarmonyArrayExtendArrayPrototype() {
- %CheckIsBootstrapping();
-
- // Set up the non-enumerable functions on the Array prototype object.
- InstallFunctions($Array.prototype, DONT_ENUM, $Array(
- "find", ArrayFind,
- "findIndex", ArrayFindIndex
- ));
-}
-
-HarmonyArrayExtendArrayPrototype(); \ No newline at end of file
diff --git a/chromium/v8/src/heap-snapshot-generator.cc b/chromium/v8/src/heap-snapshot-generator.cc
index 1c8a7b3dc4d..9f9f84a01dc 100644
--- a/chromium/v8/src/heap-snapshot-generator.cc
+++ b/chromium/v8/src/heap-snapshot-generator.cc
@@ -369,12 +369,6 @@ const SnapshotObjectId HeapObjectsMap::kFirstAvailableObjectId =
HeapObjectsMap::kGcRootsFirstSubrootId +
VisitorSynchronization::kNumberOfSyncTags * HeapObjectsMap::kObjectIdStep;
-
-static bool AddressesMatch(void* key1, void* key2) {
- return key1 == key2;
-}
-
-
HeapObjectsMap::HeapObjectsMap(Heap* heap)
: next_id_(kFirstAvailableObjectId),
entries_map_(AddressesMatch),
@@ -399,20 +393,19 @@ void HeapObjectsMap::MoveObject(Address from, Address to) {
ASSERT(to != NULL);
ASSERT(from != NULL);
if (from == to) return;
- void* from_value = entries_map_.Remove(from, ComputePointerHash(from));
+ void* from_value = entries_map_.Remove(from, AddressHash(from));
if (from_value == NULL) {
// It may occur that some untracked object moves to an address X and there
// is a tracked object at that address. In this case we should remove the
// entry as we know that the object has died.
- void* to_value = entries_map_.Remove(to, ComputePointerHash(to));
+ void* to_value = entries_map_.Remove(to, AddressHash(to));
if (to_value != NULL) {
int to_entry_info_index =
static_cast<int>(reinterpret_cast<intptr_t>(to_value));
entries_.at(to_entry_info_index).addr = NULL;
}
} else {
- HashMap::Entry* to_entry = entries_map_.Lookup(to, ComputePointerHash(to),
- true);
+ HashMap::Entry* to_entry = entries_map_.Lookup(to, AddressHash(to), true);
if (to_entry->value != NULL) {
// We found the existing entry with to address for an old object.
// Without this operation we will have two EntryInfo's with the same
@@ -432,8 +425,7 @@ void HeapObjectsMap::MoveObject(Address from, Address to) {
SnapshotObjectId HeapObjectsMap::FindEntry(Address addr) {
- HashMap::Entry* entry = entries_map_.Lookup(addr, ComputePointerHash(addr),
- false);
+ HashMap::Entry* entry = entries_map_.Lookup(addr, AddressHash(addr), false);
if (entry == NULL) return 0;
int entry_index = static_cast<int>(reinterpret_cast<intptr_t>(entry->value));
EntryInfo& entry_info = entries_.at(entry_index);
@@ -445,8 +437,7 @@ SnapshotObjectId HeapObjectsMap::FindEntry(Address addr) {
SnapshotObjectId HeapObjectsMap::FindOrAddEntry(Address addr,
unsigned int size) {
ASSERT(static_cast<uint32_t>(entries_.length()) > entries_map_.occupancy());
- HashMap::Entry* entry = entries_map_.Lookup(addr, ComputePointerHash(addr),
- true);
+ HashMap::Entry* entry = entries_map_.Lookup(addr, AddressHash(addr), true);
if (entry->value != NULL) {
int entry_index =
static_cast<int>(reinterpret_cast<intptr_t>(entry->value));
@@ -541,14 +532,13 @@ void HeapObjectsMap::RemoveDeadEntries() {
}
entries_.at(first_free_entry).accessed = false;
HashMap::Entry* entry = entries_map_.Lookup(
- entry_info.addr, ComputePointerHash(entry_info.addr), false);
+ entry_info.addr, AddressHash(entry_info.addr), false);
ASSERT(entry);
entry->value = reinterpret_cast<void*>(first_free_entry);
++first_free_entry;
} else {
if (entry_info.addr) {
- entries_map_.Remove(entry_info.addr,
- ComputePointerHash(entry_info.addr));
+ entries_map_.Remove(entry_info.addr, AddressHash(entry_info.addr));
}
}
}
diff --git a/chromium/v8/src/heap-snapshot-generator.h b/chromium/v8/src/heap-snapshot-generator.h
index cea995820f7..31d808856d1 100644
--- a/chromium/v8/src/heap-snapshot-generator.h
+++ b/chromium/v8/src/heap-snapshot-generator.h
@@ -266,6 +266,16 @@ class HeapObjectsMap {
void UpdateHeapObjectsMap();
void RemoveDeadEntries();
+ static bool AddressesMatch(void* key1, void* key2) {
+ return key1 == key2;
+ }
+
+ static uint32_t AddressHash(Address addr) {
+ return ComputeIntegerHash(
+ static_cast<uint32_t>(reinterpret_cast<uintptr_t>(addr)),
+ v8::internal::kZeroHashSeed);
+ }
+
SnapshotObjectId next_id_;
HashMap entries_map_;
List<EntryInfo> entries_;
diff --git a/chromium/v8/src/heap.cc b/chromium/v8/src/heap.cc
index 9d8a6fad995..c2a2707602e 100644
--- a/chromium/v8/src/heap.cc
+++ b/chromium/v8/src/heap.cc
@@ -703,16 +703,6 @@ bool Heap::CollectGarbage(AllocationSpace space,
}
-int Heap::NotifyContextDisposed() {
- if (FLAG_parallel_recompilation) {
- // Flush the queued recompilation tasks.
- isolate()->optimizing_compiler_thread()->Flush();
- }
- flush_monomorphic_ics_ = true;
- return ++contexts_disposed_;
-}
-
-
void Heap::PerformScavenge() {
GCTracer tracer(this, NULL, NULL);
if (incremental_marking()->IsStopped()) {
@@ -1024,8 +1014,6 @@ bool Heap::PerformGarbageCollection(GarbageCollector collector,
}
gc_post_processing_depth_--;
- isolate_->eternal_handles()->PostGarbageCollectionProcessing(this);
-
// Update relocatables.
Relocatable::PostGarbageCollectionProcessing();
@@ -2018,6 +2006,7 @@ class ScavengingVisitor : public StaticVisitorBase {
private:
enum ObjectContents { DATA_OBJECT, POINTER_OBJECT };
+ enum SizeRestriction { SMALL, UNKNOWN_SIZE };
static void RecordCopiedObject(Heap* heap, HeapObject* obj) {
bool should_record = false;
@@ -2069,12 +2058,15 @@ class ScavengingVisitor : public StaticVisitorBase {
}
- template<ObjectContents object_contents, int alignment>
+ template<ObjectContents object_contents,
+ SizeRestriction size_restriction,
+ int alignment>
static inline void EvacuateObject(Map* map,
HeapObject** slot,
HeapObject* object,
int object_size) {
- SLOW_ASSERT(object_size <= Page::kMaxNonCodeHeapObjectSize);
+ SLOW_ASSERT((size_restriction != SMALL) ||
+ (object_size <= Page::kMaxNonCodeHeapObjectSize));
SLOW_ASSERT(object->Size() == object_size);
int allocation_size = object_size;
@@ -2087,11 +2079,17 @@ class ScavengingVisitor : public StaticVisitorBase {
if (heap->ShouldBePromoted(object->address(), object_size)) {
MaybeObject* maybe_result;
- if (object_contents == DATA_OBJECT) {
- maybe_result = heap->old_data_space()->AllocateRaw(allocation_size);
+ if ((size_restriction != SMALL) &&
+ (allocation_size > Page::kMaxNonCodeHeapObjectSize)) {
+ maybe_result = heap->lo_space()->AllocateRaw(allocation_size,
+ NOT_EXECUTABLE);
} else {
- maybe_result =
- heap->old_pointer_space()->AllocateRaw(allocation_size);
+ if (object_contents == DATA_OBJECT) {
+ maybe_result = heap->old_data_space()->AllocateRaw(allocation_size);
+ } else {
+ maybe_result =
+ heap->old_pointer_space()->AllocateRaw(allocation_size);
+ }
}
Object* result = NULL; // Initialization to please compiler.
@@ -2165,8 +2163,10 @@ class ScavengingVisitor : public StaticVisitorBase {
HeapObject** slot,
HeapObject* object) {
int object_size = FixedArray::BodyDescriptor::SizeOf(map, object);
- EvacuateObject<POINTER_OBJECT, kObjectAlignment>(
- map, slot, object, object_size);
+ EvacuateObject<POINTER_OBJECT, UNKNOWN_SIZE, kObjectAlignment>(map,
+ slot,
+ object,
+ object_size);
}
@@ -2175,8 +2175,11 @@ class ScavengingVisitor : public StaticVisitorBase {
HeapObject* object) {
int length = reinterpret_cast<FixedDoubleArray*>(object)->length();
int object_size = FixedDoubleArray::SizeFor(length);
- EvacuateObject<DATA_OBJECT, kDoubleAlignment>(
- map, slot, object, object_size);
+ EvacuateObject<DATA_OBJECT, UNKNOWN_SIZE, kDoubleAlignment>(
+ map,
+ slot,
+ object,
+ object_size);
}
@@ -2184,7 +2187,7 @@ class ScavengingVisitor : public StaticVisitorBase {
HeapObject** slot,
HeapObject* object) {
int object_size = reinterpret_cast<ByteArray*>(object)->ByteArraySize();
- EvacuateObject<DATA_OBJECT, kObjectAlignment>(
+ EvacuateObject<DATA_OBJECT, UNKNOWN_SIZE, kObjectAlignment>(
map, slot, object, object_size);
}
@@ -2194,7 +2197,7 @@ class ScavengingVisitor : public StaticVisitorBase {
HeapObject* object) {
int object_size = SeqOneByteString::cast(object)->
SeqOneByteStringSize(map->instance_type());
- EvacuateObject<DATA_OBJECT, kObjectAlignment>(
+ EvacuateObject<DATA_OBJECT, UNKNOWN_SIZE, kObjectAlignment>(
map, slot, object, object_size);
}
@@ -2204,7 +2207,7 @@ class ScavengingVisitor : public StaticVisitorBase {
HeapObject* object) {
int object_size = SeqTwoByteString::cast(object)->
SeqTwoByteStringSize(map->instance_type());
- EvacuateObject<DATA_OBJECT, kObjectAlignment>(
+ EvacuateObject<DATA_OBJECT, UNKNOWN_SIZE, kObjectAlignment>(
map, slot, object, object_size);
}
@@ -2248,7 +2251,7 @@ class ScavengingVisitor : public StaticVisitorBase {
}
int object_size = ConsString::kSize;
- EvacuateObject<POINTER_OBJECT, kObjectAlignment>(
+ EvacuateObject<POINTER_OBJECT, SMALL, kObjectAlignment>(
map, slot, object, object_size);
}
@@ -2259,7 +2262,7 @@ class ScavengingVisitor : public StaticVisitorBase {
static inline void VisitSpecialized(Map* map,
HeapObject** slot,
HeapObject* object) {
- EvacuateObject<object_contents, kObjectAlignment>(
+ EvacuateObject<object_contents, SMALL, kObjectAlignment>(
map, slot, object, object_size);
}
@@ -2267,7 +2270,7 @@ class ScavengingVisitor : public StaticVisitorBase {
HeapObject** slot,
HeapObject* object) {
int object_size = map->instance_size();
- EvacuateObject<object_contents, kObjectAlignment>(
+ EvacuateObject<object_contents, SMALL, kObjectAlignment>(
map, slot, object, object_size);
}
};
@@ -3215,6 +3218,9 @@ bool Heap::CreateInitialObjects() {
}
set_observed_symbol(Symbol::cast(obj));
+ set_i18n_template_one(the_hole_value());
+ set_i18n_template_two(the_hole_value());
+
// Handling of script id generation is in Factory::NewScript.
set_last_script_id(Smi::FromInt(v8::Script::kNoScriptId));
@@ -3263,12 +3269,6 @@ bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) {
}
-bool Heap::RootCanBeTreatedAsConstant(RootListIndex root_index) {
- return !RootCanBeWrittenAfterInitialization(root_index) &&
- !InNewSpace(roots_array_start()[root_index]);
-}
-
-
Object* RegExpResultsCache::Lookup(Heap* heap,
String* key_string,
Object* key_pattern,
@@ -4481,8 +4481,7 @@ void Heap::InitializeJSObjectFromMap(JSObject* obj,
}
-MaybeObject* Heap::AllocateJSObjectFromMap(
- Map* map, PretenureFlag pretenure, bool allocate_properties) {
+MaybeObject* Heap::AllocateJSObjectFromMap(Map* map, PretenureFlag pretenure) {
// JSFunctions should be allocated using AllocateFunction to be
// properly initialized.
ASSERT(map->instance_type() != JS_FUNCTION_TYPE);
@@ -4493,15 +4492,11 @@ MaybeObject* Heap::AllocateJSObjectFromMap(
ASSERT(map->instance_type() != JS_BUILTINS_OBJECT_TYPE);
// Allocate the backing storage for the properties.
- FixedArray* properties;
- if (allocate_properties) {
- int prop_size = map->InitialPropertiesLength();
- ASSERT(prop_size >= 0);
- { MaybeObject* maybe_properties = AllocateFixedArray(prop_size, pretenure);
- if (!maybe_properties->To(&properties)) return maybe_properties;
- }
- } else {
- properties = empty_fixed_array();
+ int prop_size = map->InitialPropertiesLength();
+ ASSERT(prop_size >= 0);
+ Object* properties;
+ { MaybeObject* maybe_properties = AllocateFixedArray(prop_size, pretenure);
+ if (!maybe_properties->ToObject(&properties)) return maybe_properties;
}
// Allocate the JSObject.
@@ -4513,15 +4508,17 @@ MaybeObject* Heap::AllocateJSObjectFromMap(
if (!maybe_obj->To(&obj)) return maybe_obj;
// Initialize the JSObject.
- InitializeJSObjectFromMap(JSObject::cast(obj), properties, map);
+ InitializeJSObjectFromMap(JSObject::cast(obj),
+ FixedArray::cast(properties),
+ map);
ASSERT(JSObject::cast(obj)->HasFastElements() ||
JSObject::cast(obj)->HasExternalArrayElements());
return obj;
}
-MaybeObject* Heap::AllocateJSObjectFromMapWithAllocationSite(
- Map* map, Handle<AllocationSite> allocation_site) {
+MaybeObject* Heap::AllocateJSObjectFromMapWithAllocationSite(Map* map,
+ Handle<AllocationSite> allocation_site) {
// JSFunctions should be allocated using AllocateFunction to be
// properly initialized.
ASSERT(map->instance_type() != JS_FUNCTION_TYPE);
@@ -4534,9 +4531,9 @@ MaybeObject* Heap::AllocateJSObjectFromMapWithAllocationSite(
// Allocate the backing storage for the properties.
int prop_size = map->InitialPropertiesLength();
ASSERT(prop_size >= 0);
- FixedArray* properties;
+ Object* properties;
{ MaybeObject* maybe_properties = AllocateFixedArray(prop_size);
- if (!maybe_properties->To(&properties)) return maybe_properties;
+ if (!maybe_properties->ToObject(&properties)) return maybe_properties;
}
// Allocate the JSObject.
@@ -4548,7 +4545,9 @@ MaybeObject* Heap::AllocateJSObjectFromMapWithAllocationSite(
if (!maybe_obj->To(&obj)) return maybe_obj;
// Initialize the JSObject.
- InitializeJSObjectFromMap(JSObject::cast(obj), properties, map);
+ InitializeJSObjectFromMap(JSObject::cast(obj),
+ FixedArray::cast(properties),
+ map);
ASSERT(JSObject::cast(obj)->HasFastElements());
return obj;
}
@@ -6609,14 +6608,6 @@ void Heap::IterateStrongRoots(ObjectVisitor* v, VisitMode mode) {
}
v->Synchronize(VisitorSynchronization::kGlobalHandles);
- // Iterate over eternal handles.
- if (mode == VISIT_ALL_IN_SCAVENGE) {
- isolate_->eternal_handles()->IterateNewSpaceRoots(v);
- } else {
- isolate_->eternal_handles()->IterateAllRoots(v);
- }
- v->Synchronize(VisitorSynchronization::kEternalHandles);
-
// Iterate over pointers being held by inactive threads.
isolate_->thread_manager()->Iterate(v);
v->Synchronize(VisitorSynchronization::kThreadManager);
diff --git a/chromium/v8/src/heap.h b/chromium/v8/src/heap.h
index 78c0e5b26b4..672b8c16325 100644
--- a/chromium/v8/src/heap.h
+++ b/chromium/v8/src/heap.h
@@ -189,7 +189,9 @@ namespace internal {
V(Symbol, elements_transition_symbol, ElementsTransitionSymbol) \
V(SeededNumberDictionary, empty_slow_element_dictionary, \
EmptySlowElementDictionary) \
- V(Symbol, observed_symbol, ObservedSymbol)
+ V(Symbol, observed_symbol, ObservedSymbol) \
+ V(HeapObject, i18n_template_one, I18nTemplateOne) \
+ V(HeapObject, i18n_template_two, I18nTemplateTwo)
#define ROOT_LIST(V) \
STRONG_ROOT_LIST(V) \
@@ -736,7 +738,7 @@ class Heap {
// failed.
// Please note this does not perform a garbage collection.
MUST_USE_RESULT MaybeObject* AllocateJSObjectFromMap(
- Map* map, PretenureFlag pretenure = NOT_TENURED, bool alloc_props = true);
+ Map* map, PretenureFlag pretenure = NOT_TENURED);
MUST_USE_RESULT MaybeObject* AllocateJSObjectFromMapWithAllocationSite(
Map* map, Handle<AllocationSite> allocation_site);
@@ -1254,7 +1256,10 @@ class Heap {
void EnsureHeapIsIterable();
// Notify the heap that a context has been disposed.
- int NotifyContextDisposed();
+ int NotifyContextDisposed() {
+ flush_monomorphic_ics_ = true;
+ return ++contexts_disposed_;
+ }
// Utility to invoke the scavenger. This is needed in test code to
// ensure correct callback for weak global handles.
@@ -1297,6 +1302,12 @@ class Heap {
ASSERT((callback == NULL) ^ (global_gc_epilogue_callback_ == NULL));
global_gc_epilogue_callback_ = callback;
}
+ void SetI18nTemplateOne(ObjectTemplateInfo* tmpl) {
+ set_i18n_template_one(tmpl);
+ }
+ void SetI18nTemplateTwo(ObjectTemplateInfo* tmpl) {
+ set_i18n_template_two(tmpl);
+ }
// Heap root getters. We have versions with and without type::cast() here.
// You can't use type::cast during GC because the assert fails.
@@ -1615,8 +1626,6 @@ class Heap {
// Generated code can embed direct references to non-writable roots if
// they are in new space.
static bool RootCanBeWrittenAfterInitialization(RootListIndex root_index);
- // Generated code can treat direct references to this root as constant.
- bool RootCanBeTreatedAsConstant(RootListIndex root_index);
MUST_USE_RESULT MaybeObject* NumberToString(
Object* number, bool check_number_string_cache = true,
diff --git a/chromium/v8/src/hydrogen-escape-analysis.cc b/chromium/v8/src/hydrogen-escape-analysis.cc
index 0359678ef95..961bb94e9c1 100644
--- a/chromium/v8/src/hydrogen-escape-analysis.cc
+++ b/chromium/v8/src/hydrogen-escape-analysis.cc
@@ -63,234 +63,4 @@ void HEscapeAnalysisPhase::CollectCapturedValues() {
}
-HCapturedObject* HEscapeAnalysisPhase::NewState(HInstruction* previous) {
- Zone* zone = graph()->zone();
- HCapturedObject* state = new(zone) HCapturedObject(number_of_values_, zone);
- state->InsertAfter(previous);
- return state;
-}
-
-
-// Create a new state for replacing HAllocate instructions.
-HCapturedObject* HEscapeAnalysisPhase::NewStateForAllocation(
- HInstruction* previous) {
- HConstant* undefined = graph()->GetConstantUndefined();
- HCapturedObject* state = NewState(previous);
- for (int index = 0; index < number_of_values_; index++) {
- state->SetOperandAt(index, undefined);
- }
- return state;
-}
-
-
-// Create a new state full of phis for loop header entries.
-HCapturedObject* HEscapeAnalysisPhase::NewStateForLoopHeader(
- HInstruction* previous, HCapturedObject* old_state) {
- HBasicBlock* block = previous->block();
- HCapturedObject* state = NewState(previous);
- for (int index = 0; index < number_of_values_; index++) {
- HValue* operand = old_state->OperandAt(index);
- HPhi* phi = NewPhiAndInsert(block, operand, index);
- state->SetOperandAt(index, phi);
- }
- return state;
-}
-
-
-// Create a new state by copying an existing one.
-HCapturedObject* HEscapeAnalysisPhase::NewStateCopy(
- HInstruction* previous, HCapturedObject* old_state) {
- HCapturedObject* state = NewState(previous);
- for (int index = 0; index < number_of_values_; index++) {
- HValue* operand = old_state->OperandAt(index);
- state->SetOperandAt(index, operand);
- }
- return state;
-}
-
-
-// Insert a newly created phi into the given block and fill all incoming
-// edges with the given value.
-HPhi* HEscapeAnalysisPhase::NewPhiAndInsert(
- HBasicBlock* block, HValue* incoming_value, int index) {
- Zone* zone = graph()->zone();
- HPhi* phi = new(zone) HPhi(HPhi::kInvalidMergedIndex, zone);
- for (int i = 0; i < block->predecessors()->length(); i++) {
- phi->AddInput(incoming_value);
- }
- block->AddPhi(phi);
- return phi;
-}
-
-
-// Performs a forward data-flow analysis of all loads and stores on the
-// given captured allocation. This uses a reverse post-order iteration
-// over affected basic blocks. All non-escaping instructions are handled
-// and replaced during the analysis.
-void HEscapeAnalysisPhase::AnalyzeDataFlow(HInstruction* allocate) {
- HBasicBlock* allocate_block = allocate->block();
- block_states_.AddBlock(NULL, graph()->blocks()->length(), zone());
-
- // Iterate all blocks starting with the allocation block, since the
- // allocation cannot dominate blocks that come before.
- int start = allocate_block->block_id();
- for (int i = start; i < graph()->blocks()->length(); i++) {
- HBasicBlock* block = graph()->blocks()->at(i);
- HCapturedObject* state = StateAt(block);
-
- // Skip blocks that are not dominated by the captured allocation.
- if (!allocate_block->Dominates(block) && allocate_block != block) continue;
- if (FLAG_trace_escape_analysis) {
- PrintF("Analyzing data-flow in B%d\n", block->block_id());
- }
-
- // Go through all instructions of the current block.
- for (HInstructionIterator it(block); !it.Done(); it.Advance()) {
- HInstruction* instr = it.Current();
- switch (instr->opcode()) {
- case HValue::kAllocate: {
- if (instr != allocate) continue;
- state = NewStateForAllocation(allocate);
- break;
- }
- case HValue::kLoadNamedField: {
- HLoadNamedField* load = HLoadNamedField::cast(instr);
- int index = load->access().offset() / kPointerSize;
- if (load->object() != allocate) continue;
- ASSERT(load->access().IsInobject());
- HValue* replacement = state->OperandAt(index);
- load->DeleteAndReplaceWith(replacement);
- if (FLAG_trace_escape_analysis) {
- PrintF("Replacing load #%d with #%d (%s)\n", instr->id(),
- replacement->id(), replacement->Mnemonic());
- }
- break;
- }
- case HValue::kStoreNamedField: {
- HStoreNamedField* store = HStoreNamedField::cast(instr);
- int index = store->access().offset() / kPointerSize;
- if (store->object() != allocate) continue;
- ASSERT(store->access().IsInobject());
- state = NewStateCopy(store, state);
- state->SetOperandAt(index, store->value());
- if (store->has_transition()) {
- state->SetOperandAt(0, store->transition());
- }
- store->DeleteAndReplaceWith(NULL);
- if (FLAG_trace_escape_analysis) {
- PrintF("Replacing store #%d%s\n", instr->id(),
- store->has_transition() ? " (with transition)" : "");
- }
- break;
- }
- case HValue::kSimulate: {
- HSimulate* simulate = HSimulate::cast(instr);
- // TODO(mstarzinger): This doesn't track deltas for values on the
- // operand stack yet. Find a repro test case and fix this.
- for (int i = 0; i < simulate->OperandCount(); i++) {
- if (simulate->OperandAt(i) != allocate) continue;
- simulate->SetOperandAt(i, state);
- }
- break;
- }
- case HValue::kArgumentsObject:
- case HValue::kCapturedObject: {
- for (int i = 0; i < instr->OperandCount(); i++) {
- if (instr->OperandAt(i) != allocate) continue;
- instr->SetOperandAt(i, state);
- }
- break;
- }
- case HValue::kCheckHeapObject: {
- HCheckHeapObject* check = HCheckHeapObject::cast(instr);
- if (check->value() != allocate) continue;
- check->DeleteAndReplaceWith(NULL);
- break;
- }
- case HValue::kCheckMaps: {
- HCheckMaps* mapcheck = HCheckMaps::cast(instr);
- if (mapcheck->value() != allocate) continue;
- // TODO(mstarzinger): This approach breaks if the tracked map value
- // is not a HConstant. Find a repro test case and fix this.
- for (HUseIterator it(mapcheck->uses()); !it.Done(); it.Advance()) {
- if (!it.value()->IsLoadNamedField()) continue;
- HLoadNamedField* load = HLoadNamedField::cast(it.value());
- ASSERT(load->typecheck() == mapcheck);
- load->ClearTypeCheck();
- }
- ASSERT(mapcheck->HasNoUses());
-
- mapcheck->DeleteAndReplaceWith(NULL);
- break;
- }
- default:
- // Nothing to see here, move along ...
- break;
- }
- }
-
- // Propagate the block state forward to all successor blocks.
- for (int i = 0; i < block->end()->SuccessorCount(); i++) {
- HBasicBlock* succ = block->end()->SuccessorAt(i);
- if (!allocate_block->Dominates(succ)) continue;
- if (succ->predecessors()->length() == 1) {
- // Case 1: This is the only predecessor, just reuse state.
- SetStateAt(succ, state);
- } else if (StateAt(succ) == NULL && succ->IsLoopHeader()) {
- // Case 2: This is a state that enters a loop header, be
- // pessimistic about loop headers, add phis for all values.
- SetStateAt(succ, NewStateForLoopHeader(succ->first(), state));
- } else if (StateAt(succ) == NULL) {
- // Case 3: This is the first state propagated forward to the
- // successor, leave a copy of the current state.
- SetStateAt(succ, NewStateCopy(succ->first(), state));
- } else {
- // Case 4: This is a state that needs merging with previously
- // propagated states, potentially introducing new phis lazily or
- // adding values to existing phis.
- HCapturedObject* succ_state = StateAt(succ);
- for (int index = 0; index < number_of_values_; index++) {
- HValue* operand = state->OperandAt(index);
- HValue* succ_operand = succ_state->OperandAt(index);
- if (succ_operand->IsPhi() && succ_operand->block() == succ) {
- // Phi already exists, add operand.
- HPhi* phi = HPhi::cast(succ_operand);
- phi->SetOperandAt(succ->PredecessorIndexOf(block), operand);
- } else if (succ_operand != operand) {
- // Phi does not exist, introduce one.
- HPhi* phi = NewPhiAndInsert(succ, succ_operand, index);
- phi->SetOperandAt(succ->PredecessorIndexOf(block), operand);
- succ_state->SetOperandAt(index, phi);
- }
- }
- }
- }
- }
-
- // All uses have been handled.
- ASSERT(allocate->HasNoUses());
- allocate->DeleteAndReplaceWith(NULL);
-}
-
-
-void HEscapeAnalysisPhase::PerformScalarReplacement() {
- for (int i = 0; i < captured_.length(); i++) {
- HAllocate* allocate = HAllocate::cast(captured_.at(i));
-
- // Compute number of scalar values and start with clean slate.
- if (!allocate->size()->IsInteger32Constant()) continue;
- int size_in_bytes = allocate->size()->GetInteger32Constant();
- number_of_values_ = size_in_bytes / kPointerSize;
- block_states_.Clear();
-
- // Perform actual analysis steps.
- AnalyzeDataFlow(allocate);
-
- cumulative_values_ += number_of_values_;
- ASSERT(allocate->HasNoUses());
- ASSERT(!allocate->IsLinked());
- }
-}
-
-
} } // namespace v8::internal
diff --git a/chromium/v8/src/hydrogen-escape-analysis.h b/chromium/v8/src/hydrogen-escape-analysis.h
index 123da214e34..6ba6e823c54 100644
--- a/chromium/v8/src/hydrogen-escape-analysis.h
+++ b/chromium/v8/src/hydrogen-escape-analysis.h
@@ -38,48 +38,17 @@ namespace internal {
class HEscapeAnalysisPhase : public HPhase {
public:
explicit HEscapeAnalysisPhase(HGraph* graph)
- : HPhase("H_Escape analysis", graph),
- captured_(0, zone()),
- number_of_values_(0),
- cumulative_values_(0),
- block_states_(graph->blocks()->length(), zone()) { }
+ : HPhase("H_Escape analysis", graph), captured_(0, zone()) { }
void Run() {
CollectCapturedValues();
- PerformScalarReplacement();
}
private:
void CollectCapturedValues();
void CollectIfNoEscapingUses(HInstruction* instr);
- void PerformScalarReplacement();
- void AnalyzeDataFlow(HInstruction* instr);
- HCapturedObject* NewState(HInstruction* prev);
- HCapturedObject* NewStateForAllocation(HInstruction* prev);
- HCapturedObject* NewStateForLoopHeader(HInstruction* prev, HCapturedObject*);
- HCapturedObject* NewStateCopy(HInstruction* prev, HCapturedObject* state);
-
- HPhi* NewPhiAndInsert(HBasicBlock* block, HValue* incoming_value, int index);
-
- HCapturedObject* StateAt(HBasicBlock* block) {
- return block_states_.at(block->block_id());
- }
-
- void SetStateAt(HBasicBlock* block, HCapturedObject* state) {
- block_states_.Set(block->block_id(), state);
- }
-
- // List of allocations captured during collection phase.
- ZoneList<HInstruction*> captured_;
-
- // Number of scalar values tracked during scalar replacement phase.
- int number_of_values_;
- int cumulative_values_;
-
- // Map of block IDs to the data-flow state at block entry during the
- // scalar replacement phase.
- ZoneList<HCapturedObject*> block_states_;
+ ZoneList<HValue*> captured_;
};
diff --git a/chromium/v8/src/hydrogen-instructions.cc b/chromium/v8/src/hydrogen-instructions.cc
index a4c54e761e7..d2f16f46acc 100644
--- a/chromium/v8/src/hydrogen-instructions.cc
+++ b/chromium/v8/src/hydrogen-instructions.cc
@@ -149,6 +149,116 @@ void HValue::AddDependantsToWorklist(HInferRepresentationPhase* h_infer) {
}
+// This method is recursive but it is guaranteed to terminate because
+// RedefinedOperand() always dominates "this".
+bool HValue::IsRelationTrue(NumericRelation relation,
+ HValue* other,
+ int offset,
+ int scale) {
+ if (this == other) {
+ return scale == 0 && relation.IsExtendable(offset);
+ }
+
+ // Test the direct relation.
+ if (IsRelationTrueInternal(relation, other, offset, scale)) return true;
+
+ // If scale is 0 try the reversed relation.
+ if (scale == 0 &&
+ // TODO(mmassi): do we need the full, recursive IsRelationTrue?
+ other->IsRelationTrueInternal(relation.Reversed(), this, -offset)) {
+ return true;
+ }
+
+ // Try decomposition (but do not accept scaled compounds).
+ DecompositionResult decomposition;
+ if (TryDecompose(&decomposition) &&
+ decomposition.scale() == 0 &&
+ decomposition.base()->IsRelationTrue(relation, other,
+ offset + decomposition.offset(),
+ scale)) {
+ return true;
+ }
+
+ // Pass the request to the redefined value.
+ HValue* redefined = RedefinedOperand();
+ return redefined != NULL && redefined->IsRelationTrue(relation, other,
+ offset, scale);
+}
+
+
+bool HValue::TryGuaranteeRange(HValue* upper_bound) {
+ RangeEvaluationContext context = RangeEvaluationContext(this, upper_bound);
+ TryGuaranteeRangeRecursive(&context);
+ bool result = context.is_range_satisfied();
+ if (result) {
+ context.lower_bound_guarantee()->SetResponsibilityForRange(DIRECTION_LOWER);
+ context.upper_bound_guarantee()->SetResponsibilityForRange(DIRECTION_UPPER);
+ }
+ return result;
+}
+
+
+void HValue::TryGuaranteeRangeRecursive(RangeEvaluationContext* context) {
+ // Check if we already know that this value satisfies the lower bound.
+ if (context->lower_bound_guarantee() == NULL) {
+ if (IsRelationTrueInternal(NumericRelation::Ge(), context->lower_bound(),
+ context->offset(), context->scale())) {
+ context->set_lower_bound_guarantee(this);
+ }
+ }
+
+ // Check if we already know that this value satisfies the upper bound.
+ if (context->upper_bound_guarantee() == NULL) {
+ if (IsRelationTrueInternal(NumericRelation::Lt(), context->upper_bound(),
+ context->offset(), context->scale()) ||
+ (context->scale() == 0 &&
+ context->upper_bound()->IsRelationTrue(NumericRelation::Gt(),
+ this, -context->offset()))) {
+ context->set_upper_bound_guarantee(this);
+ }
+ }
+
+ if (context->is_range_satisfied()) return;
+
+ // See if our RedefinedOperand() satisfies the constraints.
+ if (RedefinedOperand() != NULL) {
+ RedefinedOperand()->TryGuaranteeRangeRecursive(context);
+ }
+ if (context->is_range_satisfied()) return;
+
+ // See if the constraints can be satisfied by decomposition.
+ DecompositionResult decomposition;
+ if (TryDecompose(&decomposition)) {
+ context->swap_candidate(&decomposition);
+ context->candidate()->TryGuaranteeRangeRecursive(context);
+ context->swap_candidate(&decomposition);
+ }
+ if (context->is_range_satisfied()) return;
+
+ // Try to modify this to satisfy the constraint.
+
+ TryGuaranteeRangeChanging(context);
+}
+
+
+RangeEvaluationContext::RangeEvaluationContext(HValue* value, HValue* upper)
+ : lower_bound_(upper->block()->graph()->GetConstant0()),
+ lower_bound_guarantee_(NULL),
+ candidate_(value),
+ upper_bound_(upper),
+ upper_bound_guarantee_(NULL),
+ offset_(0),
+ scale_(0) {
+}
+
+
+HValue* RangeEvaluationContext::ConvertGuarantee(HValue* guarantee) {
+ return guarantee->IsBoundsCheckBaseIndexInformation()
+ ? HBoundsCheckBaseIndexInformation::cast(guarantee)->bounds_check()
+ : guarantee;
+}
+
+
static int32_t ConvertAndSetOverflow(Representation r,
int64_t result,
bool* overflow) {
@@ -374,6 +484,55 @@ HType HType::TypeFromValue(Handle<Object> value) {
}
+bool HValue::Dominates(HValue* dominator, HValue* dominated) {
+ if (dominator->block() != dominated->block()) {
+ // If they are in different blocks we can use the dominance relation
+ // between the blocks.
+ return dominator->block()->Dominates(dominated->block());
+ } else {
+ // Otherwise we must see which instruction comes first, considering
+ // that phis always precede regular instructions.
+ if (dominator->IsInstruction()) {
+ if (dominated->IsInstruction()) {
+ for (HInstruction* next = HInstruction::cast(dominator)->next();
+ next != NULL;
+ next = next->next()) {
+ if (next == dominated) return true;
+ }
+ return false;
+ } else if (dominated->IsPhi()) {
+ return false;
+ } else {
+ UNREACHABLE();
+ }
+ } else if (dominator->IsPhi()) {
+ if (dominated->IsInstruction()) {
+ return true;
+ } else {
+ // We cannot compare which phi comes first.
+ UNREACHABLE();
+ }
+ } else {
+ UNREACHABLE();
+ }
+ return false;
+ }
+}
+
+
+bool HValue::TestDominanceUsingProcessedFlag(HValue* dominator,
+ HValue* dominated) {
+ if (dominator->block() != dominated->block()) {
+ return dominator->block()->Dominates(dominated->block());
+ } else {
+ // If both arguments are in the same block we check if dominator is a phi
+ // or if dominated has not already been processed: in either case we know
+ // that dominator precedes dominated.
+ return dominator->IsPhi() || !dominated->CheckFlag(kIDefsProcessingDone);
+ }
+}
+
+
bool HValue::IsDefinedAfter(HBasicBlock* other) const {
return block()->block_id() > other->block_id();
}
@@ -388,7 +547,7 @@ HUseListNode* HUseListNode::tail() {
}
-bool HValue::CheckUsesForFlag(Flag f) const {
+bool HValue::CheckUsesForFlag(Flag f) {
for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
if (it.value()->IsSimulate()) continue;
if (!it.value()->CheckFlag(f)) return false;
@@ -397,7 +556,7 @@ bool HValue::CheckUsesForFlag(Flag f) const {
}
-bool HValue::HasAtLeastOneUseWithFlagAndNoneWithout(Flag f) const {
+bool HValue::HasAtLeastOneUseWithFlagAndNoneWithout(Flag f) {
bool return_value = false;
for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
if (it.value()->IsSimulate()) continue;
@@ -801,6 +960,58 @@ void HInstruction::Verify() {
#endif
+HNumericConstraint* HNumericConstraint::AddToGraph(
+ HValue* constrained_value,
+ NumericRelation relation,
+ HValue* related_value,
+ HInstruction* insertion_point) {
+ if (insertion_point == NULL) {
+ if (constrained_value->IsInstruction()) {
+ insertion_point = HInstruction::cast(constrained_value);
+ } else if (constrained_value->IsPhi()) {
+ insertion_point = constrained_value->block()->first();
+ } else {
+ UNREACHABLE();
+ }
+ }
+ HNumericConstraint* result =
+ new(insertion_point->block()->zone()) HNumericConstraint(
+ constrained_value, relation, related_value);
+ result->InsertAfter(insertion_point);
+ return result;
+}
+
+
+void HNumericConstraint::PrintDataTo(StringStream* stream) {
+ stream->Add("(");
+ constrained_value()->PrintNameTo(stream);
+ stream->Add(" %s ", relation().Mnemonic());
+ related_value()->PrintNameTo(stream);
+ stream->Add(")");
+}
+
+
+HInductionVariableAnnotation* HInductionVariableAnnotation::AddToGraph(
+ HPhi* phi,
+ NumericRelation relation,
+ int operand_index) {
+ HInductionVariableAnnotation* result =
+ new(phi->block()->zone()) HInductionVariableAnnotation(phi, relation,
+ operand_index);
+ result->InsertAfter(phi->block()->first());
+ return result;
+}
+
+
+void HInductionVariableAnnotation::PrintDataTo(StringStream* stream) {
+ stream->Add("(");
+ RedefinedOperand()->PrintNameTo(stream);
+ stream->Add(" %s ", relation().Mnemonic());
+ induction_base()->PrintNameTo(stream);
+ stream->Add(")");
+}
+
+
void HDummyUse::PrintDataTo(StringStream* stream) {
value()->PrintNameTo(stream);
}
@@ -827,6 +1038,40 @@ void HBinaryCall::PrintDataTo(StringStream* stream) {
}
+void HBoundsCheck::TryGuaranteeRangeChanging(RangeEvaluationContext* context) {
+ if (context->candidate()->ActualValue() != base()->ActualValue() ||
+ context->scale() < scale()) {
+ return;
+ }
+
+ // TODO(mmassi)
+ // Instead of checking for "same basic block" we should check for
+ // "dominates and postdominates".
+ if (context->upper_bound() == length() &&
+ context->lower_bound_guarantee() != NULL &&
+ context->lower_bound_guarantee() != this &&
+ context->lower_bound_guarantee()->block() != block() &&
+ offset() < context->offset() &&
+ index_can_increase() &&
+ context->upper_bound_guarantee() == NULL) {
+ offset_ = context->offset();
+ SetResponsibilityForRange(DIRECTION_UPPER);
+ context->set_upper_bound_guarantee(this);
+ isolate()->counters()->bounds_checks_eliminated()->Increment();
+ } else if (context->upper_bound_guarantee() != NULL &&
+ context->upper_bound_guarantee() != this &&
+ context->upper_bound_guarantee()->block() != block() &&
+ offset() > context->offset() &&
+ index_can_decrease() &&
+ context->lower_bound_guarantee() == NULL) {
+ offset_ = context->offset();
+ SetResponsibilityForRange(DIRECTION_LOWER);
+ context->set_lower_bound_guarantee(this);
+ isolate()->counters()->bounds_checks_eliminated()->Increment();
+ }
+}
+
+
void HBoundsCheck::ApplyIndexChange() {
if (skip_check()) return;
@@ -874,6 +1119,40 @@ void HBoundsCheck::ApplyIndexChange() {
base_ = NULL;
offset_ = 0;
scale_ = 0;
+ responsibility_direction_ = DIRECTION_NONE;
+}
+
+
+void HBoundsCheck::AddInformativeDefinitions() {
+ // TODO(mmassi): Executing this code during AddInformativeDefinitions
+ // is a hack. Move it to some other HPhase.
+ if (FLAG_array_bounds_checks_elimination) {
+ if (index()->TryGuaranteeRange(length())) {
+ set_skip_check();
+ }
+ if (DetectCompoundIndex()) {
+ HBoundsCheckBaseIndexInformation* base_index_info =
+ new(block()->graph()->zone())
+ HBoundsCheckBaseIndexInformation(this);
+ base_index_info->InsertAfter(this);
+ }
+ }
+}
+
+
+bool HBoundsCheck::IsRelationTrueInternal(NumericRelation relation,
+ HValue* related_value,
+ int offset,
+ int scale) {
+ if (related_value == length()) {
+ // A HBoundsCheck is smaller than the length it compared against.
+ return NumericRelation::Lt().CompoundImplies(relation, 0, 0, offset, scale);
+ } else if (related_value == block()->graph()->GetConstant0()) {
+ // A HBoundsCheck is greater than or equal to zero.
+ return NumericRelation::Ge().CompoundImplies(relation, 0, 0, offset, scale);
+ } else {
+ return false;
+ }
}
@@ -916,6 +1195,25 @@ void HBoundsCheck::InferRepresentation(HInferRepresentationPhase* h_infer) {
}
+bool HBoundsCheckBaseIndexInformation::IsRelationTrueInternal(
+ NumericRelation relation,
+ HValue* related_value,
+ int offset,
+ int scale) {
+ if (related_value == bounds_check()->length()) {
+ return NumericRelation::Lt().CompoundImplies(
+ relation,
+ bounds_check()->offset(), bounds_check()->scale(), offset, scale);
+ } else if (related_value == block()->graph()->GetConstant0()) {
+ return NumericRelation::Ge().CompoundImplies(
+ relation,
+ bounds_check()->offset(), bounds_check()->scale(), offset, scale);
+ } else {
+ return false;
+ }
+}
+
+
void HBoundsCheckBaseIndexInformation::PrintDataTo(StringStream* stream) {
stream->Add("base: ");
base_index()->PrintNameTo(stream);
@@ -1155,29 +1453,6 @@ void HLoadFieldByIndex::PrintDataTo(StringStream* stream) {
}
-static bool MatchLeftIsOnes(HValue* l, HValue* r, HValue** negated) {
- if (!l->EqualsInteger32Constant(~0)) return false;
- *negated = r;
- return true;
-}
-
-
-static bool MatchNegationViaXor(HValue* instr, HValue** negated) {
- if (!instr->IsBitwise()) return false;
- HBitwise* b = HBitwise::cast(instr);
- return (b->op() == Token::BIT_XOR) &&
- (MatchLeftIsOnes(b->left(), b->right(), negated) ||
- MatchLeftIsOnes(b->right(), b->left(), negated));
-}
-
-
-static bool MatchDoubleNegation(HValue* instr, HValue** arg) {
- HValue* negated;
- return MatchNegationViaXor(instr, &negated) &&
- MatchNegationViaXor(negated, arg);
-}
-
-
HValue* HBitwise::Canonicalize() {
if (!representation().IsSmiOrInteger32()) return this;
// If x is an int32, then x & -1 == x, x | 0 == x and x ^ 0 == x.
@@ -1190,10 +1465,18 @@ HValue* HBitwise::Canonicalize() {
!left()->CheckFlag(kUint32)) {
return left();
}
- // Optimize double negation, a common pattern used for ToInt32(x).
- HValue* arg;
- if (MatchDoubleNegation(this, &arg) && !arg->CheckFlag(kUint32)) {
- return arg;
+ return this;
+}
+
+
+HValue* HBitNot::Canonicalize() {
+ // Optimize ~~x, a common pattern used for ToInt32(x).
+ if (value()->IsBitNot()) {
+ HValue* result = HBitNot::cast(value())->value();
+ ASSERT(result->representation().IsInteger32());
+ if (!result->CheckFlag(kUint32)) {
+ return result;
+ }
}
return this;
}
@@ -1285,16 +1568,16 @@ static HValue* SimplifiedDividendForMathFloorOfDiv(HValue* dividend) {
HValue* HUnaryMathOperation::Canonicalize() {
- if (op() == kMathRound || op() == kMathFloor) {
+ if (op() == kMathRound) {
HValue* val = value();
if (val->IsChange()) val = HChange::cast(val)->value();
- // If the input is smi or integer32 then we replace the instruction with its
- // input.
+ // If the input is integer32 then we replace the round instruction
+ // with its input.
if (val->representation().IsSmiOrInteger32()) {
if (!val->representation().Equals(representation())) {
HChange* result = new(block()->zone()) HChange(
- val, representation(), false, false);
+ val, representation(), false, false, false);
result->InsertBefore(this);
return result;
}
@@ -1305,6 +1588,19 @@ HValue* HUnaryMathOperation::Canonicalize() {
if (op() == kMathFloor) {
HValue* val = value();
if (val->IsChange()) val = HChange::cast(val)->value();
+
+ // If the input is integer32 then we replace the floor instruction
+ // with its input.
+ if (val->representation().IsSmiOrInteger32()) {
+ if (!val->representation().Equals(representation())) {
+ HChange* result = new(block()->zone()) HChange(
+ val, representation(), false, false, false);
+ result->InsertBefore(this);
+ return result;
+ }
+ return val;
+ }
+
if (val->IsDiv() && (val->UseCount() == 1)) {
HDiv* hdiv = HDiv::cast(val);
HValue* left = hdiv->left();
@@ -1314,7 +1610,7 @@ HValue* HUnaryMathOperation::Canonicalize() {
if (new_left == NULL &&
hdiv->observed_input_representation(1).IsSmiOrInteger32()) {
new_left = new(block()->zone()) HChange(
- left, Representation::Integer32(), false, false);
+ left, Representation::Integer32(), false, false, false);
HChange::cast(new_left)->InsertBefore(this);
}
HValue* new_right =
@@ -1325,7 +1621,7 @@ HValue* HUnaryMathOperation::Canonicalize() {
#endif
hdiv->observed_input_representation(2).IsSmiOrInteger32()) {
new_right = new(block()->zone()) HChange(
- right, Representation::Integer32(), false, false);
+ right, Representation::Integer32(), false, false, false);
HChange::cast(new_right)->InsertBefore(this);
}
@@ -1416,10 +1712,10 @@ void HCheckMaps::HandleSideEffectDominator(GVNFlag side_effect,
// for which the map is known.
if (HasNoUses() && dominator->IsStoreNamedField()) {
HStoreNamedField* store = HStoreNamedField::cast(dominator);
- if (!store->has_transition() || store->object() != value()) return;
- HConstant* transition = HConstant::cast(store->transition());
+ UniqueValueId map_unique_id = store->transition_unique_id();
+ if (!map_unique_id.IsInitialized() || store->object() != value()) return;
for (int i = 0; i < map_set()->length(); i++) {
- if (transition->UniqueValueIdsMatch(map_unique_ids_.at(i))) {
+ if (map_unique_id == map_unique_ids_.at(i)) {
DeleteAndReplaceWith(NULL);
return;
}
@@ -1470,6 +1766,13 @@ void HCheckInstanceType::PrintDataTo(StringStream* stream) {
}
+void HCheckPrototypeMaps::PrintDataTo(StringStream* stream) {
+ stream->Add("[receiver_prototype=%p,holder=%p]%s",
+ *prototypes_.first(), *prototypes_.last(),
+ CanOmitPrototypeChecks() ? " (omitted)" : "");
+}
+
+
void HCallStub::PrintDataTo(StringStream* stream) {
stream->Add("%s ",
CodeStub::MajorName(major_key_, false));
@@ -1672,6 +1975,60 @@ Range* HMod::InferRange(Zone* zone) {
}
+void HPhi::AddInformativeDefinitions() {
+ if (OperandCount() == 2) {
+ // If one of the operands is an OSR block give up (this cannot be an
+ // induction variable).
+ if (OperandAt(0)->block()->is_osr_entry() ||
+ OperandAt(1)->block()->is_osr_entry()) return;
+
+ for (int operand_index = 0; operand_index < 2; operand_index++) {
+ int other_operand_index = (operand_index + 1) % 2;
+
+ static NumericRelation relations[] = {
+ NumericRelation::Ge(),
+ NumericRelation::Le()
+ };
+
+ // Check if this phi is an induction variable. If, e.g., we know that
+ // its first input is greater than the phi itself, then that must be
+ // the back edge, and the phi is always greater than its second input.
+ for (int relation_index = 0; relation_index < 2; relation_index++) {
+ if (OperandAt(operand_index)->IsRelationTrue(relations[relation_index],
+ this)) {
+ HInductionVariableAnnotation::AddToGraph(this,
+ relations[relation_index],
+ other_operand_index);
+ }
+ }
+ }
+ }
+}
+
+
+bool HPhi::IsRelationTrueInternal(NumericRelation relation,
+ HValue* other,
+ int offset,
+ int scale) {
+ if (CheckFlag(kNumericConstraintEvaluationInProgress)) return false;
+
+ SetFlag(kNumericConstraintEvaluationInProgress);
+ bool result = true;
+ for (int i = 0; i < OperandCount(); i++) {
+ // Skip OSR entry blocks
+ if (OperandAt(i)->block()->is_osr_entry()) continue;
+
+ if (!OperandAt(i)->IsRelationTrue(relation, other, offset, scale)) {
+ result = false;
+ break;
+ }
+ }
+ ClearFlag(kNumericConstraintEvaluationInProgress);
+
+ return result;
+}
+
+
InductionVariableData* InductionVariableData::ExaminePhi(HPhi* phi) {
if (phi->block()->loop_information() == NULL) return NULL;
if (phi->OperandCount() != 2) return NULL;
@@ -2423,14 +2780,6 @@ HConstant::HConstant(ExternalReference reference)
}
-static void PrepareConstant(Handle<Object> object) {
- if (!object->IsJSObject()) return;
- Handle<JSObject> js_object = Handle<JSObject>::cast(object);
- if (!js_object->map()->is_deprecated()) return;
- JSObject::TryMigrateInstance(js_object);
-}
-
-
void HConstant::Initialize(Representation r) {
if (r.IsNone()) {
if (has_smi_value_ && kSmiValueSize == 31) {
@@ -2442,7 +2791,6 @@ void HConstant::Initialize(Representation r) {
} else if (has_external_reference_value_) {
r = Representation::External();
} else {
- PrepareConstant(handle_);
r = Representation::Tagged();
}
}
@@ -2767,6 +3115,16 @@ void HStringCompareAndBranch::PrintDataTo(StringStream* stream) {
}
+void HCompareNumericAndBranch::AddInformativeDefinitions() {
+ NumericRelation r = NumericRelation::FromToken(token());
+ if (r.IsNone()) return;
+
+ HNumericConstraint::AddToGraph(left(), r, right(), SuccessorAt(0)->first());
+ HNumericConstraint::AddToGraph(
+ left(), r.Negated(), right(), SuccessorAt(1)->first());
+}
+
+
void HCompareNumericAndBranch::PrintDataTo(StringStream* stream) {
stream->Add(Token::Name(token()));
stream->Add(" ");
@@ -2785,18 +3143,6 @@ void HCompareObjectEqAndBranch::PrintDataTo(StringStream* stream) {
}
-void HCompareHoleAndBranch::PrintDataTo(StringStream* stream) {
- object()->PrintNameTo(stream);
- HControlInstruction::PrintDataTo(stream);
-}
-
-
-void HCompareHoleAndBranch::InferRepresentation(
- HInferRepresentationPhase* h_infer) {
- ChangeRepresentation(object()->representation());
-}
-
-
void HGoto::PrintDataTo(StringStream* stream) {
stream->Add("B%d", SuccessorAt(0)->block_id());
}
@@ -2856,6 +3202,119 @@ void HLoadNamedField::PrintDataTo(StringStream* stream) {
}
+// Returns true if an instance of this map can never find a property with this
+// name in its prototype chain. This means all prototypes up to the top are
+// fast and don't have the name in them. It would be good if we could optimize
+// polymorphic loads where the property is sometimes found in the prototype
+// chain.
+static bool PrototypeChainCanNeverResolve(
+ Handle<Map> map, Handle<String> name) {
+ Isolate* isolate = map->GetIsolate();
+ Object* current = map->prototype();
+ while (current != isolate->heap()->null_value()) {
+ if (current->IsJSGlobalProxy() ||
+ current->IsGlobalObject() ||
+ !current->IsJSObject() ||
+ JSObject::cast(current)->map()->has_named_interceptor() ||
+ JSObject::cast(current)->IsAccessCheckNeeded() ||
+ !JSObject::cast(current)->HasFastProperties()) {
+ return false;
+ }
+
+ LookupResult lookup(isolate);
+ Map* map = JSObject::cast(current)->map();
+ map->LookupDescriptor(NULL, *name, &lookup);
+ if (lookup.IsFound()) return false;
+ if (!lookup.IsCacheable()) return false;
+ current = JSObject::cast(current)->GetPrototype();
+ }
+ return true;
+}
+
+
+HLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* context,
+ HValue* object,
+ SmallMapList* types,
+ Handle<String> name,
+ Zone* zone)
+ : types_(Min(types->length(), kMaxLoadPolymorphism), zone),
+ name_(name),
+ types_unique_ids_(0, zone),
+ name_unique_id_(),
+ need_generic_(false) {
+ SetOperandAt(0, context);
+ SetOperandAt(1, object);
+ set_representation(Representation::Tagged());
+ SetGVNFlag(kDependsOnMaps);
+ SmallMapList negative_lookups;
+ for (int i = 0;
+ i < types->length() && types_.length() < kMaxLoadPolymorphism;
+ ++i) {
+ Handle<Map> map = types->at(i);
+ // Deprecated maps are updated to the current map in the type oracle.
+ ASSERT(!map->is_deprecated());
+ LookupResult lookup(map->GetIsolate());
+ map->LookupDescriptor(NULL, *name, &lookup);
+ if (lookup.IsFound()) {
+ switch (lookup.type()) {
+ case FIELD: {
+ int index = lookup.GetLocalFieldIndexFromMap(*map);
+ if (index < 0) {
+ SetGVNFlag(kDependsOnInobjectFields);
+ } else {
+ SetGVNFlag(kDependsOnBackingStoreFields);
+ }
+ if (FLAG_track_double_fields &&
+ lookup.representation().IsDouble()) {
+ // Since the value needs to be boxed, use a generic handler for
+ // loading doubles.
+ continue;
+ }
+ types_.Add(types->at(i), zone);
+ break;
+ }
+ case CONSTANT:
+ types_.Add(types->at(i), zone);
+ break;
+ case CALLBACKS:
+ break;
+ case TRANSITION:
+ case INTERCEPTOR:
+ case NONEXISTENT:
+ case NORMAL:
+ case HANDLER:
+ UNREACHABLE();
+ break;
+ }
+ } else if (lookup.IsCacheable() &&
+ // For dicts the lookup on the map will fail, but the object may
+ // contain the property so we cannot generate a negative lookup
+ // (which would just be a map check and return undefined).
+ !map->is_dictionary_map() &&
+ !map->has_named_interceptor() &&
+ PrototypeChainCanNeverResolve(map, name)) {
+ negative_lookups.Add(types->at(i), zone);
+ }
+ }
+
+ bool need_generic =
+ (types->length() != negative_lookups.length() + types_.length());
+ if (!need_generic && FLAG_deoptimize_uncommon_cases) {
+ SetFlag(kUseGVN);
+ for (int i = 0; i < negative_lookups.length(); i++) {
+ types_.Add(negative_lookups.at(i), zone);
+ }
+ } else {
+ // We don't have an easy way to handle both a call (to the generic stub) and
+ // a deopt in the same hydrogen instruction, so in this case we don't add
+ // the negative lookups which can deopt - just let the generic stub handle
+ // them.
+ SetAllSideEffects();
+ need_generic_ = true;
+ }
+}
+
+
HCheckMaps* HCheckMaps::New(Zone* zone,
HValue* context,
HValue* value,
@@ -2863,7 +3322,7 @@ HCheckMaps* HCheckMaps::New(Zone* zone,
CompilationInfo* info,
HValue* typecheck) {
HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck);
- check_map->Add(map, zone);
+ check_map->map_set_.Add(map, zone);
if (map->CanOmitMapChecks() &&
value->IsConstant() &&
HConstant::cast(value)->InstanceOf(map)) {
@@ -2883,6 +3342,46 @@ void HCheckMaps::FinalizeUniqueValueId() {
}
+void HLoadNamedFieldPolymorphic::FinalizeUniqueValueId() {
+ if (!types_unique_ids_.is_empty()) return;
+ Zone* zone = block()->zone();
+ types_unique_ids_.Initialize(types_.length(), zone);
+ for (int i = 0; i < types_.length(); i++) {
+ types_unique_ids_.Add(UniqueValueId(types_.at(i)), zone);
+ }
+ name_unique_id_ = UniqueValueId(name_);
+}
+
+
+bool HLoadNamedFieldPolymorphic::DataEquals(HValue* value) {
+ ASSERT_EQ(types_.length(), types_unique_ids_.length());
+ HLoadNamedFieldPolymorphic* other = HLoadNamedFieldPolymorphic::cast(value);
+ if (name_unique_id_ != other->name_unique_id_) return false;
+ if (types_unique_ids_.length() != other->types_unique_ids_.length()) {
+ return false;
+ }
+ if (need_generic_ != other->need_generic_) return false;
+ for (int i = 0; i < types_unique_ids_.length(); i++) {
+ bool found = false;
+ for (int j = 0; j < types_unique_ids_.length(); j++) {
+ if (types_unique_ids_.at(j) == other->types_unique_ids_.at(i)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) return false;
+ }
+ return true;
+}
+
+
+void HLoadNamedFieldPolymorphic::PrintDataTo(StringStream* stream) {
+ object()->PrintNameTo(stream);
+ stream->Add(".");
+ stream->Add(*String::cast(*name())->ToCString());
+}
+
+
void HLoadNamedGeneric::PrintDataTo(StringStream* stream) {
object()->PrintNameTo(stream);
stream->Add(".");
@@ -2955,8 +3454,18 @@ bool HLoadKeyed::UsesMustHandleHole() const {
bool HLoadKeyed::AllUsesCanTreatHoleAsNaN() const {
- return IsFastDoubleElementsKind(elements_kind()) &&
- CheckUsesForFlag(HValue::kAllowUndefinedAsNaN);
+ if (!IsFastDoubleElementsKind(elements_kind())) {
+ return false;
+ }
+
+ for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
+ HValue* use = it.value();
+ if (!use->CheckFlag(HValue::kAllowUndefinedAsNaN)) {
+ return false;
+ }
+ }
+
+ return true;
}
@@ -3038,8 +3547,8 @@ void HStoreNamedField::PrintDataTo(StringStream* stream) {
if (NeedsWriteBarrier()) {
stream->Add(" (write-barrier)");
}
- if (has_transition()) {
- stream->Add(" (transition map %p)", *transition_map());
+ if (!transition().is_null()) {
+ stream->Add(" (transition map %p)", *transition());
}
}
@@ -3175,6 +3684,8 @@ Representation HUnaryMathOperation::RepresentationFromInputs() {
Representation input_rep = value()->representation();
if (!input_rep.IsTagged()) {
rep = rep.generalize(input_rep);
+ } else if (flexible_int()) {
+ rep = Representation::Integer32();
}
return rep;
}
@@ -3731,10 +4242,10 @@ void HPhi::SimplifyConstantInputs() {
DoubleToInt32(operand->DoubleValue()));
integer_input->InsertAfter(operand);
SetOperandAt(i, integer_input);
- } else if (operand->HasBooleanValue()) {
- SetOperandAt(i, operand->BooleanValue() ? graph->GetConstant1()
- : graph->GetConstant0());
- } else if (operand->ImmortalImmovable()) {
+ } else if (operand == graph->GetConstantTrue()) {
+ SetOperandAt(i, graph->GetConstant1());
+ } else {
+ // This catches |false|, |undefined|, strings and objects.
SetOperandAt(i, graph->GetConstant0());
}
}
diff --git a/chromium/v8/src/hydrogen-instructions.h b/chromium/v8/src/hydrogen-instructions.h
index 41f9d0d5ccd..78e9a6b192a 100644
--- a/chromium/v8/src/hydrogen-instructions.h
+++ b/chromium/v8/src/hydrogen-instructions.h
@@ -72,6 +72,7 @@ class LChunkBuilder;
V(ArgumentsLength) \
V(ArgumentsObject) \
V(Bitwise) \
+ V(BitNot) \
V(BlockEntry) \
V(BoundsCheck) \
V(BoundsCheckBaseIndexInformation) \
@@ -86,18 +87,17 @@ class LChunkBuilder;
V(CallNewArray) \
V(CallRuntime) \
V(CallStub) \
- V(CapturedObject) \
V(Change) \
V(CheckFunction) \
V(CheckHeapObject) \
V(CheckInstanceType) \
V(CheckMaps) \
V(CheckMapValue) \
+ V(CheckPrototypeMaps) \
V(CheckSmi) \
V(ClampToUint8) \
V(ClassOfTestAndBranch) \
V(CompareNumericAndBranch) \
- V(CompareHoleAndBranch) \
V(CompareGeneric) \
V(CompareObjectEqAndBranch) \
V(CompareMap) \
@@ -122,6 +122,7 @@ class LChunkBuilder;
V(Goto) \
V(HasCachedArrayIndexAndBranch) \
V(HasInstanceTypeAndBranch) \
+ V(InductionVariableAnnotation) \
V(InnerAllocatedObject) \
V(InstanceOf) \
V(InstanceOfKnownGlobal) \
@@ -143,12 +144,14 @@ class LChunkBuilder;
V(LoadKeyed) \
V(LoadKeyedGeneric) \
V(LoadNamedField) \
+ V(LoadNamedFieldPolymorphic) \
V(LoadNamedGeneric) \
V(MapEnumLength) \
V(MathFloorOfDiv) \
V(MathMinMax) \
V(Mod) \
V(Mul) \
+ V(NumericConstraint) \
V(OsrEntry) \
V(OuterContext) \
V(Parameter) \
@@ -539,6 +542,158 @@ enum GVNFlag {
};
+class NumericRelation {
+ public:
+ enum Kind { NONE, EQ, GT, GE, LT, LE, NE };
+ static const char* MnemonicFromKind(Kind kind) {
+ switch (kind) {
+ case NONE: return "NONE";
+ case EQ: return "EQ";
+ case GT: return "GT";
+ case GE: return "GE";
+ case LT: return "LT";
+ case LE: return "LE";
+ case NE: return "NE";
+ }
+ UNREACHABLE();
+ return NULL;
+ }
+ const char* Mnemonic() const { return MnemonicFromKind(kind_); }
+
+ static NumericRelation None() { return NumericRelation(NONE); }
+ static NumericRelation Eq() { return NumericRelation(EQ); }
+ static NumericRelation Gt() { return NumericRelation(GT); }
+ static NumericRelation Ge() { return NumericRelation(GE); }
+ static NumericRelation Lt() { return NumericRelation(LT); }
+ static NumericRelation Le() { return NumericRelation(LE); }
+ static NumericRelation Ne() { return NumericRelation(NE); }
+
+ bool IsNone() { return kind_ == NONE; }
+
+ static NumericRelation FromToken(Token::Value token) {
+ switch (token) {
+ case Token::EQ: return Eq();
+ case Token::EQ_STRICT: return Eq();
+ case Token::LT: return Lt();
+ case Token::GT: return Gt();
+ case Token::LTE: return Le();
+ case Token::GTE: return Ge();
+ case Token::NE: return Ne();
+ case Token::NE_STRICT: return Ne();
+ default: return None();
+ }
+ }
+
+ // The semantics of "Reversed" is that if "x rel y" is true then also
+ // "y rel.Reversed() x" is true, and that rel.Reversed().Reversed() == rel.
+ NumericRelation Reversed() {
+ switch (kind_) {
+ case NONE: return None();
+ case EQ: return Eq();
+ case GT: return Lt();
+ case GE: return Le();
+ case LT: return Gt();
+ case LE: return Ge();
+ case NE: return Ne();
+ }
+ UNREACHABLE();
+ return None();
+ }
+
+ // The semantics of "Negated" is that if "x rel y" is true then also
+ // "!(x rel.Negated() y)" is true.
+ NumericRelation Negated() {
+ switch (kind_) {
+ case NONE: return None();
+ case EQ: return Ne();
+ case GT: return Le();
+ case GE: return Lt();
+ case LT: return Ge();
+ case LE: return Gt();
+ case NE: return Eq();
+ }
+ UNREACHABLE();
+ return None();
+ }
+
+ // The semantics of "Implies" is that if "x rel y" is true
+ // then also "x other_relation y" is true.
+ bool Implies(NumericRelation other_relation) {
+ switch (kind_) {
+ case NONE: return false;
+ case EQ: return (other_relation.kind_ == EQ)
+ || (other_relation.kind_ == GE)
+ || (other_relation.kind_ == LE);
+ case GT: return (other_relation.kind_ == GT)
+ || (other_relation.kind_ == GE)
+ || (other_relation.kind_ == NE);
+ case LT: return (other_relation.kind_ == LT)
+ || (other_relation.kind_ == LE)
+ || (other_relation.kind_ == NE);
+ case GE: return (other_relation.kind_ == GE);
+ case LE: return (other_relation.kind_ == LE);
+ case NE: return (other_relation.kind_ == NE);
+ }
+ UNREACHABLE();
+ return false;
+ }
+
+ // The semantics of "IsExtendable" is that if
+ // "rel.IsExtendable(direction)" is true then
+ // "x rel y" implies "(x + direction) rel y" .
+ bool IsExtendable(int direction) {
+ switch (kind_) {
+ case NONE: return false;
+ case EQ: return false;
+ case GT: return (direction >= 0);
+ case GE: return (direction >= 0);
+ case LT: return (direction <= 0);
+ case LE: return (direction <= 0);
+ case NE: return false;
+ }
+ UNREACHABLE();
+ return false;
+ }
+
+ // CompoundImplies returns true when
+ // "((x + my_offset) >> my_scale) rel y" implies
+ // "((x + other_offset) >> other_scale) other_relation y".
+ bool CompoundImplies(NumericRelation other_relation,
+ int my_offset,
+ int my_scale,
+ int other_offset = 0,
+ int other_scale = 0) {
+ return Implies(other_relation) && ComponentsImply(
+ my_offset, my_scale, other_offset, other_scale);
+ }
+
+ private:
+ // ComponentsImply returns true when
+ // "((x + my_offset) >> my_scale) rel y" implies
+ // "((x + other_offset) >> other_scale) rel y".
+ bool ComponentsImply(int my_offset,
+ int my_scale,
+ int other_offset,
+ int other_scale) {
+ switch (kind_) {
+ case NONE: break; // Fall through to UNREACHABLE().
+ case EQ:
+ case NE: return my_offset == other_offset && my_scale == other_scale;
+ case GT:
+ case GE: return my_offset <= other_offset && my_scale >= other_scale;
+ case LT:
+ case LE: return my_offset >= other_offset && my_scale <= other_scale;
+ }
+ UNREACHABLE();
+ return false;
+ }
+
+ explicit NumericRelation(Kind kind) : kind_(kind) {}
+
+ Kind kind_;
+};
+
+
class DecompositionResult BASE_EMBEDDED {
public:
DecompositionResult() : base_(NULL), offset_(0), scale_(0) {}
@@ -584,6 +739,46 @@ class DecompositionResult BASE_EMBEDDED {
};
+class RangeEvaluationContext BASE_EMBEDDED {
+ public:
+ RangeEvaluationContext(HValue* value, HValue* upper);
+
+ HValue* lower_bound() { return lower_bound_; }
+ HValue* lower_bound_guarantee() { return lower_bound_guarantee_; }
+ HValue* candidate() { return candidate_; }
+ HValue* upper_bound() { return upper_bound_; }
+ HValue* upper_bound_guarantee() { return upper_bound_guarantee_; }
+ int offset() { return offset_; }
+ int scale() { return scale_; }
+
+ bool is_range_satisfied() {
+ return lower_bound_guarantee() != NULL && upper_bound_guarantee() != NULL;
+ }
+
+ void set_lower_bound_guarantee(HValue* guarantee) {
+ lower_bound_guarantee_ = ConvertGuarantee(guarantee);
+ }
+ void set_upper_bound_guarantee(HValue* guarantee) {
+ upper_bound_guarantee_ = ConvertGuarantee(guarantee);
+ }
+
+ void swap_candidate(DecompositionResult* other_candicate) {
+ other_candicate->SwapValues(&candidate_, &offset_, &scale_);
+ }
+
+ private:
+ HValue* ConvertGuarantee(HValue* guarantee);
+
+ HValue* lower_bound_;
+ HValue* lower_bound_guarantee_;
+ HValue* candidate_;
+ HValue* upper_bound_;
+ HValue* upper_bound_guarantee_;
+ int offset_;
+ int scale_;
+};
+
+
typedef EnumSet<GVNFlag> GVNFlagSet;
@@ -621,6 +816,12 @@ class HValue: public ZoneObject {
// HGraph::ComputeSafeUint32Operations is responsible for setting this
// flag.
kUint32,
+ // If a phi is involved in the evaluation of a numeric constraint the
+ // recursion can cause an endless cycle: we use this flag to exit the loop.
+ kNumericConstraintEvaluationInProgress,
+ // This flag is set to true after the SetupInformativeDefinitions() pass
+ // has processed this instruction.
+ kIDefsProcessingDone,
kHasNoObservableSideEffects,
// Indicates the instruction is live during dead code elimination.
kIsLive,
@@ -758,8 +959,8 @@ class HValue: public ZoneObject {
return RedefinedOperandIndex() != kNoRedefinedOperand;
}
HValue* RedefinedOperand() {
- int index = RedefinedOperandIndex();
- return index == kNoRedefinedOperand ? NULL : OperandAt(index);
+ return IsInformativeDefinition() ? OperandAt(RedefinedOperandIndex())
+ : NULL;
}
// A purely informative definition is an idef that will not emit code and
@@ -770,8 +971,17 @@ class HValue: public ZoneObject {
// This method must always return the original HValue SSA definition
// (regardless of any iDef of this value).
HValue* ActualValue() {
- int index = RedefinedOperandIndex();
- return index == kNoRedefinedOperand ? this : OperandAt(index);
+ return IsInformativeDefinition() ? RedefinedOperand()->ActualValue()
+ : this;
+ }
+
+ virtual void AddInformativeDefinitions() {}
+
+ void UpdateRedefinedUsesWhileSettingUpInformativeDefinitions() {
+ UpdateRedefinedUsesInner<TestDominanceUsingProcessedFlag>();
+ }
+ void UpdateRedefinedUses() {
+ UpdateRedefinedUsesInner<Dominates>();
}
bool IsInteger32Constant();
@@ -802,10 +1012,10 @@ class HValue: public ZoneObject {
bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; }
// Returns true if the flag specified is set for all uses, false otherwise.
- bool CheckUsesForFlag(Flag f) const;
+ bool CheckUsesForFlag(Flag f);
// Returns true if the flag specified is set for all uses, and this set
// of uses is non-empty.
- bool HasAtLeastOneUseWithFlagAndNoneWithout(Flag f) const;
+ bool HasAtLeastOneUseWithFlagAndNoneWithout(Flag f);
GVNFlagSet gvn_flags() const { return gvn_flags_; }
void SetGVNFlag(GVNFlag f) { gvn_flags_.Add(f); }
@@ -922,6 +1132,12 @@ class HValue: public ZoneObject {
virtual void Verify() = 0;
#endif
+ bool IsRelationTrue(NumericRelation relation,
+ HValue* other,
+ int offset = 0,
+ int scale = 0);
+
+ bool TryGuaranteeRange(HValue* upper_bound);
virtual bool TryDecompose(DecompositionResult* decomposition) {
if (RedefinedOperand() != NULL) {
return RedefinedOperand()->TryDecompose(decomposition);
@@ -943,6 +1159,17 @@ class HValue: public ZoneObject {
}
protected:
+ void TryGuaranteeRangeRecursive(RangeEvaluationContext* context);
+
+ enum RangeGuaranteeDirection {
+ DIRECTION_NONE = 0,
+ DIRECTION_UPPER = 1,
+ DIRECTION_LOWER = 2,
+ DIRECTION_BOTH = DIRECTION_UPPER | DIRECTION_LOWER
+ };
+ virtual void SetResponsibilityForRange(RangeGuaranteeDirection direction) {}
+ virtual void TryGuaranteeRangeChanging(RangeEvaluationContext* context) {}
+
// This function must be overridden for instructions with flag kUseGVN, to
// compare the non-Operand parts of the instruction.
virtual bool DataEquals(HValue* other) {
@@ -976,6 +1203,47 @@ class HValue: public ZoneObject {
representation_ = r;
}
+ // Signature of a function testing if a HValue properly dominates another.
+ typedef bool (*DominanceTest)(HValue*, HValue*);
+
+ // Simple implementation of DominanceTest implemented walking the chain
+ // of Hinstructions (used in UpdateRedefinedUsesInner).
+ static bool Dominates(HValue* dominator, HValue* dominated);
+
+ // A fast implementation of DominanceTest that works only for the
+ // "current" instruction in the SetupInformativeDefinitions() phase.
+ // During that phase we use a flag to mark processed instructions, and by
+ // checking the flag we can quickly test if an instruction comes before or
+ // after the "current" one.
+ static bool TestDominanceUsingProcessedFlag(HValue* dominator,
+ HValue* dominated);
+
+ // If we are redefining an operand, update all its dominated uses (the
+ // function that checks if a use is dominated is the template argument).
+ template<DominanceTest TestDominance>
+ void UpdateRedefinedUsesInner() {
+ HValue* input = RedefinedOperand();
+ if (input != NULL) {
+ for (HUseIterator uses = input->uses(); !uses.Done(); uses.Advance()) {
+ HValue* use = uses.value();
+ if (TestDominance(this, use)) {
+ use->SetOperandAt(uses.index(), this);
+ }
+ }
+ }
+ }
+
+ // Informative definitions can override this method to state any numeric
+ // relation they provide on the redefined value.
+ // Returns true if it is guaranteed that:
+ // ((this + offset) >> scale) relation other
+ virtual bool IsRelationTrueInternal(NumericRelation relation,
+ HValue* other,
+ int offset = 0,
+ int scale = 0) {
+ return false;
+ }
+
static GVNFlagSet AllDependsOnFlagSet() {
GVNFlagSet result;
// Create changes mask.
@@ -1246,25 +1514,67 @@ class HDummyUse: public HTemplateInstruction<1> {
};
+class HNumericConstraint : public HTemplateInstruction<2> {
+ public:
+ static HNumericConstraint* AddToGraph(HValue* constrained_value,
+ NumericRelation relation,
+ HValue* related_value,
+ HInstruction* insertion_point = NULL);
+
+ HValue* constrained_value() { return OperandAt(0); }
+ HValue* related_value() { return OperandAt(1); }
+ NumericRelation relation() { return relation_; }
+
+ virtual int RedefinedOperandIndex() { return 0; }
+ virtual bool IsPurelyInformativeDefinition() { return true; }
+
+ virtual Representation RequiredInputRepresentation(int index) {
+ return representation();
+ }
+
+ virtual void PrintDataTo(StringStream* stream);
+
+ virtual bool IsRelationTrueInternal(NumericRelation other_relation,
+ HValue* other_related_value,
+ int offset = 0,
+ int scale = 0) {
+ if (related_value() == other_related_value) {
+ return relation().CompoundImplies(other_relation, offset, scale);
+ } else {
+ return false;
+ }
+ }
+
+ DECLARE_CONCRETE_INSTRUCTION(NumericConstraint)
+
+ private:
+ HNumericConstraint(HValue* constrained_value,
+ NumericRelation relation,
+ HValue* related_value)
+ : relation_(relation) {
+ SetOperandAt(0, constrained_value);
+ SetOperandAt(1, related_value);
+ }
+
+ NumericRelation relation_;
+};
+
+
class HDeoptimize: public HTemplateInstruction<0> {
public:
- DECLARE_INSTRUCTION_FACTORY_P2(HDeoptimize, const char*,
- Deoptimizer::BailoutType);
+ DECLARE_INSTRUCTION_FACTORY_P1(HDeoptimize, Deoptimizer::BailoutType);
virtual Representation RequiredInputRepresentation(int index) {
return Representation::None();
}
- const char* reason() const { return reason_; }
Deoptimizer::BailoutType type() { return type_; }
DECLARE_CONCRETE_INSTRUCTION(Deoptimize)
private:
- explicit HDeoptimize(const char* reason, Deoptimizer::BailoutType type)
- : reason_(reason), type_(type) {}
+ explicit HDeoptimize(Deoptimizer::BailoutType type) : type_(type) {}
- const char* reason_;
Deoptimizer::BailoutType type_;
};
@@ -1522,13 +1832,15 @@ class HChange: public HUnaryOperation {
HChange(HValue* value,
Representation to,
bool is_truncating_to_smi,
- bool is_truncating_to_int32)
+ bool is_truncating_to_int32,
+ bool allow_undefined_as_nan)
: HUnaryOperation(value) {
ASSERT(!value->representation().IsNone());
ASSERT(!to.IsNone());
ASSERT(!value->representation().Equals(to));
set_representation(to);
SetFlag(kUseGVN);
+ if (allow_undefined_as_nan) SetFlag(kAllowUndefinedAsNaN);
if (is_truncating_to_smi) SetFlag(kTruncatingToSmi);
if (is_truncating_to_int32) SetFlag(kTruncatingToInt32);
if (value->representation().IsSmi() || value->type().IsSmi()) {
@@ -1539,16 +1851,15 @@ class HChange: public HUnaryOperation {
}
}
- bool can_convert_undefined_to_nan() {
- return CheckUsesForFlag(kAllowUndefinedAsNaN);
- }
-
virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
virtual HType CalculateInferredType();
virtual HValue* Canonicalize();
Representation from() const { return value()->representation(); }
Representation to() const { return representation(); }
+ bool allow_undefined_as_nan() const {
+ return CheckFlag(kAllowUndefinedAsNaN);
+ }
bool deoptimize_on_minus_zero() const {
return CheckFlag(kBailoutOnMinusZero);
}
@@ -2395,6 +2706,37 @@ class HElementsKind: public HUnaryOperation {
};
+class HBitNot: public HUnaryOperation {
+ public:
+ DECLARE_INSTRUCTION_FACTORY_P1(HBitNot, HValue*);
+
+ virtual Representation RequiredInputRepresentation(int index) {
+ return Representation::Integer32();
+ }
+ virtual Representation observed_input_representation(int index) {
+ return Representation::Integer32();
+ }
+
+ virtual HValue* Canonicalize();
+
+ DECLARE_CONCRETE_INSTRUCTION(BitNot)
+
+ protected:
+ virtual bool DataEquals(HValue* other) { return true; }
+
+ private:
+ explicit HBitNot(HValue* value)
+ : HUnaryOperation(value, HType::TaggedNumber()) {
+ set_representation(Representation::Integer32());
+ SetFlag(kUseGVN);
+ SetFlag(kTruncatingToInt32);
+ SetFlag(kAllowUndefinedAsNaN);
+ }
+
+ virtual bool IsDeletable() const { return true; }
+};
+
+
class HUnaryMathOperation: public HTemplateInstruction<2> {
public:
static HInstruction* New(Zone* zone,
@@ -2433,6 +2775,21 @@ class HUnaryMathOperation: public HTemplateInstruction<2> {
}
}
+ virtual void UpdateRepresentation(Representation new_rep,
+ HInferRepresentationPhase* h_infer,
+ const char* reason) {
+ if (flexible_int() && !new_rep.IsSmi()) {
+ new_rep = Representation::Integer32();
+ }
+ HValue::UpdateRepresentation(new_rep, h_infer, reason);
+ }
+
+ virtual void RepresentationChanged(Representation new_rep) {
+ if (flexible_int() && new_rep.IsInteger32()) {
+ ClearFlag(kFlexibleRepresentation);
+ }
+ }
+
virtual Range* InferRange(Zone* zone);
virtual HValue* Canonicalize();
@@ -2450,6 +2807,10 @@ class HUnaryMathOperation: public HTemplateInstruction<2> {
}
private:
+ bool flexible_int() {
+ return op_ == kMathFloor || op_ == kMathRound;
+ }
+
HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op)
: HTemplateInstruction<2>(HType::TaggedNumber()), op_(op) {
SetOperandAt(0, context);
@@ -2457,7 +2818,8 @@ class HUnaryMathOperation: public HTemplateInstruction<2> {
switch (op) {
case kMathFloor:
case kMathRound:
- set_representation(Representation::Integer32());
+ set_representation(Representation::Smi());
+ SetFlag(kFlexibleRepresentation);
break;
case kMathAbs:
// Not setting representation here: it is None intentionally.
@@ -2534,7 +2896,7 @@ class HCheckMaps: public HTemplateInstruction<2> {
HValue *typecheck = NULL) {
HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck);
for (int i = 0; i < maps->length(); i++) {
- check_map->Add(maps->at(i), zone);
+ check_map->map_set_.Add(maps->at(i), zone);
}
check_map->map_set_.Sort();
return check_map;
@@ -2553,10 +2915,6 @@ class HCheckMaps: public HTemplateInstruction<2> {
HValue* value() { return OperandAt(0); }
SmallMapList* map_set() { return &map_set_; }
- bool has_migration_target() {
- return has_migration_target_;
- }
-
virtual void FinalizeUniqueValueId();
DECLARE_CONCRETE_INSTRUCTION(CheckMaps)
@@ -2578,18 +2936,10 @@ class HCheckMaps: public HTemplateInstruction<2> {
}
private:
- void Add(Handle<Map> map, Zone* zone) {
- map_set_.Add(map, zone);
- if (!has_migration_target_ && map->is_migration_target()) {
- has_migration_target_ = true;
- SetGVNFlag(kChangesNewSpacePromotion);
- }
- }
-
// Clients should use one of the static New* methods above.
HCheckMaps(HValue* value, Zone *zone, HValue* typecheck)
: HTemplateInstruction<2>(value->type()),
- omit_(false), has_migration_target_(false), map_unique_ids_(0, zone) {
+ omit_(false), map_unique_ids_(0, zone) {
SetOperandAt(0, value);
// Use the object value for the dependency if NULL is passed.
// TODO(titzer): do GVN flags already express this dependency?
@@ -2611,7 +2961,6 @@ class HCheckMaps: public HTemplateInstruction<2> {
}
bool omit_;
- bool has_migration_target_;
SmallMapList map_set_;
ZoneList<UniqueValueId> map_unique_ids_;
};
@@ -2770,7 +3119,6 @@ class HCheckHeapObject: public HUnaryOperation {
public:
DECLARE_INSTRUCTION_FACTORY_P1(HCheckHeapObject, HValue*);
- virtual bool HasEscapingOperandAt(int index) { return false; }
virtual Representation RequiredInputRepresentation(int index) {
return Representation::Tagged();
}
@@ -2797,6 +3145,87 @@ class HCheckHeapObject: public HUnaryOperation {
};
+class HCheckPrototypeMaps: public HTemplateInstruction<0> {
+ public:
+ static HCheckPrototypeMaps* New(Zone* zone,
+ HValue* context,
+ Handle<JSObject> prototype,
+ Handle<JSObject> holder,
+ CompilationInfo* info) {
+ return new(zone) HCheckPrototypeMaps(prototype, holder, zone, info);
+ }
+
+ ZoneList<Handle<JSObject> >* prototypes() { return &prototypes_; }
+
+ ZoneList<Handle<Map> >* maps() { return &maps_; }
+
+ DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps)
+
+ virtual Representation RequiredInputRepresentation(int index) {
+ return Representation::None();
+ }
+
+ virtual void PrintDataTo(StringStream* stream);
+
+ virtual intptr_t Hashcode() {
+ return first_prototype_unique_id_.Hashcode() * 17 +
+ last_prototype_unique_id_.Hashcode();
+ }
+
+ virtual void FinalizeUniqueValueId() {
+ first_prototype_unique_id_ = UniqueValueId(prototypes_.first());
+ last_prototype_unique_id_ = UniqueValueId(prototypes_.last());
+ }
+
+ bool CanOmitPrototypeChecks() { return can_omit_prototype_maps_; }
+
+ protected:
+ virtual bool DataEquals(HValue* other) {
+ HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other);
+ return first_prototype_unique_id_ == b->first_prototype_unique_id_ &&
+ last_prototype_unique_id_ == b->last_prototype_unique_id_;
+ }
+
+ private:
+ HCheckPrototypeMaps(Handle<JSObject> prototype,
+ Handle<JSObject> holder,
+ Zone* zone,
+ CompilationInfo* info)
+ : prototypes_(2, zone),
+ maps_(2, zone),
+ first_prototype_unique_id_(),
+ last_prototype_unique_id_(),
+ can_omit_prototype_maps_(true) {
+ SetFlag(kUseGVN);
+ SetGVNFlag(kDependsOnMaps);
+ // Keep a list of all objects on the prototype chain up to the holder
+ // and the expected maps.
+ while (true) {
+ prototypes_.Add(prototype, zone);
+ Handle<Map> map(prototype->map());
+ maps_.Add(map, zone);
+ can_omit_prototype_maps_ &= map->CanOmitPrototypeChecks();
+ if (prototype.is_identical_to(holder)) break;
+ prototype = Handle<JSObject>(JSObject::cast(prototype->GetPrototype()));
+ }
+ if (can_omit_prototype_maps_) {
+ // Mark in-flight compilation as dependent on those maps.
+ for (int i = 0; i < maps()->length(); i++) {
+ Handle<Map> map = maps()->at(i);
+ map->AddDependentCompilationInfo(DependentCode::kPrototypeCheckGroup,
+ info);
+ }
+ }
+ }
+
+ ZoneList<Handle<JSObject> > prototypes_;
+ ZoneList<Handle<Map> > maps_;
+ UniqueValueId first_prototype_unique_id_;
+ UniqueValueId last_prototype_unique_id_;
+ bool can_omit_prototype_maps_;
+};
+
+
class InductionVariableData;
@@ -3071,6 +3500,8 @@ class HPhi: public HValue {
induction_variable_data_ = InductionVariableData::ExaminePhi(this);
}
+ virtual void AddInformativeDefinitions();
+
virtual void PrintTo(StringStream* stream);
#ifdef DEBUG
@@ -3124,6 +3555,11 @@ class HPhi: public HValue {
inputs_[index] = value;
}
+ virtual bool IsRelationTrueInternal(NumericRelation relation,
+ HValue* other,
+ int offset = 0,
+ int scale = 0);
+
private:
ZoneList<HValue*> inputs_;
int merged_index_;
@@ -3138,40 +3574,61 @@ class HPhi: public HValue {
};
-// Common base class for HArgumentsObject and HCapturedObject.
-class HDematerializedObject: public HTemplateInstruction<0> {
+class HInductionVariableAnnotation : public HUnaryOperation {
public:
- HDematerializedObject(int count, Zone* zone) : values_(count, zone) {}
+ static HInductionVariableAnnotation* AddToGraph(HPhi* phi,
+ NumericRelation relation,
+ int operand_index);
- virtual int OperandCount() { return values_.length(); }
- virtual HValue* OperandAt(int index) const { return values_[index]; }
+ NumericRelation relation() { return relation_; }
+ HValue* induction_base() { return phi_->OperandAt(operand_index_); }
- virtual bool HasEscapingOperandAt(int index) { return false; }
+ virtual int RedefinedOperandIndex() { return 0; }
+ virtual bool IsPurelyInformativeDefinition() { return true; }
virtual Representation RequiredInputRepresentation(int index) {
- return Representation::None();
+ return representation();
}
- protected:
- virtual void InternalSetOperandAt(int index, HValue* value) {
- values_[index] = value;
+ virtual void PrintDataTo(StringStream* stream);
+
+ virtual bool IsRelationTrueInternal(NumericRelation other_relation,
+ HValue* other_related_value,
+ int offset = 0,
+ int scale = 0) {
+ if (induction_base() == other_related_value) {
+ return relation().CompoundImplies(other_relation, offset, scale);
+ } else {
+ return false;
+ }
}
- // List of values tracked by this marker.
- ZoneList<HValue*> values_;
+ DECLARE_CONCRETE_INSTRUCTION(InductionVariableAnnotation)
private:
- virtual bool IsDeletable() const { return true; }
+ HInductionVariableAnnotation(HPhi* phi,
+ NumericRelation relation,
+ int operand_index)
+ : HUnaryOperation(phi),
+ phi_(phi), relation_(relation), operand_index_(operand_index) {
+ }
+
+ // We need to store the phi both here and in the instruction operand because
+ // the operand can change if a new idef of the phi is added between the phi
+ // and this instruction (inserting an idef updates every use).
+ HPhi* phi_;
+ NumericRelation relation_;
+ int operand_index_;
};
-class HArgumentsObject: public HDematerializedObject {
+class HArgumentsObject: public HTemplateInstruction<0> {
public:
- static HArgumentsObject* New(Zone* zone, HValue* context, int count) {
+ static HArgumentsObject* New(Zone* zone,
+ HValue* context,
+ int count) {
return new(zone) HArgumentsObject(count, zone);
}
- // The values contain a list of all elements in the arguments object
- // including the receiver object, which is skipped when materializing.
const ZoneList<HValue*>* arguments_values() const { return &values_; }
int arguments_count() const { return values_.length(); }
@@ -3180,32 +3637,30 @@ class HArgumentsObject: public HDematerializedObject {
SetOperandAt(values_.length() - 1, argument);
}
- DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject)
+ virtual int OperandCount() { return values_.length(); }
+ virtual HValue* OperandAt(int index) const { return values_[index]; }
- private:
- HArgumentsObject(int count, Zone* zone)
- : HDematerializedObject(count, zone) {
- set_representation(Representation::Tagged());
- SetFlag(kIsArguments);
+ virtual bool HasEscapingOperandAt(int index) { return false; }
+ virtual Representation RequiredInputRepresentation(int index) {
+ return Representation::None();
}
-};
+ DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject)
-class HCapturedObject: public HDematerializedObject {
- public:
- HCapturedObject(int length, Zone* zone)
- : HDematerializedObject(length, zone) {
+ protected:
+ virtual void InternalSetOperandAt(int index, HValue* value) {
+ values_[index] = value;
+ }
+
+ private:
+ HArgumentsObject(int count, Zone* zone) : values_(count, zone) {
set_representation(Representation::Tagged());
- values_.AddBlock(NULL, length, zone); // Resize list.
+ SetFlag(kIsArguments);
}
- // The values contain a list of all in-object properties inside the
- // captured object and is index by field index. Properties in the
- // properties or elements backing store are not tracked here.
- const ZoneList<HValue*>* values() const { return &values_; }
- int length() const { return values_.length(); }
+ virtual bool IsDeletable() const { return true; }
- DECLARE_CONCRETE_INSTRUCTION(CapturedObject)
+ ZoneList<HValue*> values_;
};
@@ -3230,9 +3685,8 @@ class HConstant: public HTemplateInstruction<0> {
}
bool InstanceOf(Handle<Map> map) {
- Handle<Object> constant_object = handle();
- return constant_object->IsJSObject() &&
- Handle<JSObject>::cast(constant_object)->map() == *map;
+ return handle_->IsJSObject() &&
+ Handle<JSObject>::cast(handle_)->map() == *map;
}
bool IsSpecialDouble() const {
@@ -3256,9 +3710,6 @@ class HConstant: public HTemplateInstruction<0> {
}
return false;
}
- if (has_external_reference_value_) {
- return false;
- }
ASSERT(!handle_.is_null());
Heap* heap = isolate()->heap();
@@ -3343,7 +3794,6 @@ class HConstant: public HTemplateInstruction<0> {
return external_reference_value_;
}
- bool HasBooleanValue() const { return type_.IsBoolean(); }
bool BooleanValue() const { return boolean_value_; }
virtual intptr_t Hashcode() {
@@ -3688,6 +4138,12 @@ class HBoundsCheck: public HTemplateInstruction<2> {
HValue* base() { return base_; }
int offset() { return offset_; }
int scale() { return scale_; }
+ bool index_can_increase() {
+ return (responsibility_direction_ & DIRECTION_LOWER) == 0;
+ }
+ bool index_can_decrease() {
+ return (responsibility_direction_ & DIRECTION_UPPER) == 0;
+ }
void ApplyIndexChange();
bool DetectCompoundIndex() {
@@ -3711,6 +4167,11 @@ class HBoundsCheck: public HTemplateInstruction<2> {
return representation();
}
+ virtual bool IsRelationTrueInternal(NumericRelation relation,
+ HValue* related_value,
+ int offset = 0,
+ int scale = 0);
+
virtual void PrintDataTo(StringStream* stream);
virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
@@ -3721,17 +4182,25 @@ class HBoundsCheck: public HTemplateInstruction<2> {
virtual int RedefinedOperandIndex() { return 0; }
virtual bool IsPurelyInformativeDefinition() { return skip_check(); }
+ virtual void AddInformativeDefinitions();
DECLARE_CONCRETE_INSTRUCTION(BoundsCheck)
protected:
friend class HBoundsCheckBaseIndexInformation;
+ virtual void SetResponsibilityForRange(RangeGuaranteeDirection direction) {
+ responsibility_direction_ = static_cast<RangeGuaranteeDirection>(
+ responsibility_direction_ | direction);
+ }
+
virtual bool DataEquals(HValue* other) { return true; }
+ virtual void TryGuaranteeRangeChanging(RangeEvaluationContext* context);
bool skip_check_;
HValue* base_;
int offset_;
int scale_;
+ RangeGuaranteeDirection responsibility_direction_;
bool allow_equality_;
private:
@@ -3742,6 +4211,7 @@ class HBoundsCheck: public HTemplateInstruction<2> {
HBoundsCheck(HValue* index, HValue* length)
: skip_check_(false),
base_(NULL), offset_(0), scale_(0),
+ responsibility_direction_(DIRECTION_NONE),
allow_equality_(false) {
SetOperandAt(0, index);
SetOperandAt(1, length);
@@ -3776,10 +4246,22 @@ class HBoundsCheckBaseIndexInformation: public HTemplateInstruction<2> {
return representation();
}
+ virtual bool IsRelationTrueInternal(NumericRelation relation,
+ HValue* related_value,
+ int offset = 0,
+ int scale = 0);
virtual void PrintDataTo(StringStream* stream);
virtual int RedefinedOperandIndex() { return 0; }
virtual bool IsPurelyInformativeDefinition() { return true; }
+
+ protected:
+ virtual void SetResponsibilityForRange(RangeGuaranteeDirection direction) {
+ bounds_check()->SetResponsibilityForRange(direction);
+ }
+ virtual void TryGuaranteeRangeChanging(RangeEvaluationContext* context) {
+ bounds_check()->TryGuaranteeRangeChanging(context);
+ }
};
@@ -3952,6 +4434,8 @@ class HCompareNumericAndBranch: public HTemplateControlInstruction<2, 2> {
}
virtual void PrintDataTo(StringStream* stream);
+ virtual void AddInformativeDefinitions();
+
DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch)
private:
@@ -3960,32 +4444,6 @@ class HCompareNumericAndBranch: public HTemplateControlInstruction<2, 2> {
};
-class HCompareHoleAndBranch: public HTemplateControlInstruction<2, 1> {
- public:
- // TODO(danno): make this private when the IfBuilder properly constructs
- // control flow instructions.
- explicit HCompareHoleAndBranch(HValue* object) {
- SetFlag(kFlexibleRepresentation);
- SetFlag(kAllowUndefinedAsNaN);
- SetOperandAt(0, object);
- }
-
- DECLARE_INSTRUCTION_FACTORY_P1(HCompareHoleAndBranch, HValue*);
-
- HValue* object() { return OperandAt(0); }
-
- virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
-
- virtual Representation RequiredInputRepresentation(int index) {
- return representation();
- }
-
- virtual void PrintDataTo(StringStream* stream);
-
- DECLARE_CONCRETE_INSTRUCTION(CompareHoleAndBranch)
-};
-
-
class HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> {
public:
// TODO(danno): make this private when the IfBuilder properly constructs
@@ -4369,11 +4827,6 @@ class HAdd: public HArithmeticBinaryOperation {
}
}
- virtual void RepresentationChanged(Representation to) {
- if (to.IsTagged()) ClearFlag(kAllowUndefinedAsNaN);
- HArithmeticBinaryOperation::RepresentationChanged(to);
- }
-
DECLARE_CONCRETE_INSTRUCTION(Add)
protected:
@@ -5588,7 +6041,6 @@ class HLoadNamedField: public HTemplateInstruction<2> {
}
bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); }
- void ClearTypeCheck() { SetOperandAt(1, object()); }
HObjectAccess access() const { return access_; }
Representation field_representation() const {
return access_.representation();
@@ -5646,6 +6098,45 @@ class HLoadNamedField: public HTemplateInstruction<2> {
};
+class HLoadNamedFieldPolymorphic: public HTemplateInstruction<2> {
+ public:
+ HLoadNamedFieldPolymorphic(HValue* context,
+ HValue* object,
+ SmallMapList* types,
+ Handle<String> name,
+ Zone* zone);
+
+ HValue* context() { return OperandAt(0); }
+ HValue* object() { return OperandAt(1); }
+ SmallMapList* types() { return &types_; }
+ Handle<String> name() { return name_; }
+ bool need_generic() { return need_generic_; }
+
+ virtual Representation RequiredInputRepresentation(int index) {
+ return Representation::Tagged();
+ }
+
+ virtual void PrintDataTo(StringStream* stream);
+
+ DECLARE_CONCRETE_INSTRUCTION(LoadNamedFieldPolymorphic)
+
+ static const int kMaxLoadPolymorphism = 4;
+
+ virtual void FinalizeUniqueValueId();
+
+ protected:
+ virtual bool DataEquals(HValue* value);
+
+ private:
+ SmallMapList types_;
+ Handle<String> name_;
+ ZoneList<UniqueValueId> types_unique_ids_;
+ UniqueValueId name_unique_id_;
+ bool need_generic_;
+};
+
+
+
class HLoadNamedGeneric: public HTemplateInstruction<2> {
public:
HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name)
@@ -5904,7 +6395,7 @@ class HLoadKeyedGeneric: public HTemplateInstruction<3> {
};
-class HStoreNamedField: public HTemplateInstruction<3> {
+class HStoreNamedField: public HTemplateInstruction<2> {
public:
DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*,
HObjectAccess, HValue*);
@@ -5936,35 +6427,24 @@ class HStoreNamedField: public HTemplateInstruction<3> {
return write_barrier_mode_ == SKIP_WRITE_BARRIER;
}
- HValue* object() const { return OperandAt(0); }
- HValue* value() const { return OperandAt(1); }
- HValue* transition() const { return OperandAt(2); }
+ HValue* object() { return OperandAt(0); }
+ HValue* value() { return OperandAt(1); }
HObjectAccess access() const { return access_; }
- HValue* new_space_dominator() const { return new_space_dominator_; }
- bool has_transition() const { return has_transition_; }
-
- Handle<Map> transition_map() const {
- if (has_transition()) {
- return Handle<Map>::cast(HConstant::cast(transition())->handle());
- } else {
- return Handle<Map>();
- }
- }
-
- void SetTransition(HConstant* map_constant, CompilationInfo* info) {
- ASSERT(!has_transition()); // Only set once.
- Handle<Map> map = Handle<Map>::cast(map_constant->handle());
+ Handle<Map> transition() const { return transition_; }
+ UniqueValueId transition_unique_id() const { return transition_unique_id_; }
+ void SetTransition(Handle<Map> map, CompilationInfo* info) {
+ ASSERT(transition_.is_null()); // Only set once.
if (map->CanBeDeprecated()) {
map->AddDependentCompilationInfo(DependentCode::kTransitionGroup, info);
}
- SetOperandAt(2, map_constant);
- has_transition_ = true;
+ transition_ = map;
}
+ HValue* new_space_dominator() const { return new_space_dominator_; }
bool NeedsWriteBarrier() {
ASSERT(!(FLAG_track_double_fields && field_representation().IsDouble()) ||
- !has_transition());
+ transition_.is_null());
if (IsSkipWriteBarrier()) return false;
if (field_representation().IsDouble()) return false;
if (field_representation().IsSmi()) return false;
@@ -5979,6 +6459,10 @@ class HStoreNamedField: public HTemplateInstruction<3> {
return ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator());
}
+ virtual void FinalizeUniqueValueId() {
+ transition_unique_id_ = UniqueValueId(transition_);
+ }
+
Representation field_representation() const {
return access_.representation();
}
@@ -5988,19 +6472,20 @@ class HStoreNamedField: public HTemplateInstruction<3> {
HObjectAccess access,
HValue* val)
: access_(access),
+ transition_(),
+ transition_unique_id_(),
new_space_dominator_(NULL),
- write_barrier_mode_(UPDATE_WRITE_BARRIER),
- has_transition_(false) {
+ write_barrier_mode_(UPDATE_WRITE_BARRIER) {
SetOperandAt(0, obj);
SetOperandAt(1, val);
- SetOperandAt(2, obj);
access.SetGVNFlags(this, true);
}
HObjectAccess access_;
+ Handle<Map> transition_;
+ UniqueValueId transition_unique_id_;
HValue* new_space_dominator_;
- WriteBarrierMode write_barrier_mode_ : 1;
- bool has_transition_ : 1;
+ WriteBarrierMode write_barrier_mode_;
};
@@ -6045,6 +6530,7 @@ class HStoreKeyed
DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*,
ElementsKind);
+ virtual bool HasEscapingOperandAt(int index) { return index != 0; }
virtual Representation RequiredInputRepresentation(int index) {
// kind_fast: tagged[int32] = tagged
// kind_double: tagged[int32] = double
@@ -6563,11 +7049,8 @@ class HToFastProperties: public HUnaryOperation {
private:
explicit HToFastProperties(HValue* value) : HUnaryOperation(value) {
- set_representation(Representation::Tagged());
- SetGVNFlag(kChangesNewSpacePromotion);
-
- // This instruction is not marked as kChangesMaps, but does
- // change the map of the input operand. Use it only when creating
+ // This instruction is not marked as having side effects, but
+ // changes the map of the input operand. Use it only when creating
// object literals via a runtime call.
ASSERT(value->IsCallRuntime());
#ifdef DEBUG
@@ -6575,6 +7058,7 @@ class HToFastProperties: public HUnaryOperation {
ASSERT(function->function_id == Runtime::kCreateObjectLiteral ||
function->function_id == Runtime::kCreateObjectLiteralShallow);
#endif
+ set_representation(Representation::Tagged());
}
virtual bool IsDeletable() const { return true; }
diff --git a/chromium/v8/src/hydrogen-mark-deoptimize.cc b/chromium/v8/src/hydrogen-mark-deoptimize.cc
index c0236e91cbb..111fcd2ce9b 100644
--- a/chromium/v8/src/hydrogen-mark-deoptimize.cc
+++ b/chromium/v8/src/hydrogen-mark-deoptimize.cc
@@ -34,9 +34,14 @@ void HMarkDeoptimizeOnUndefinedPhase::Run() {
const ZoneList<HPhi*>* phi_list = graph()->phi_list();
for (int i = 0; i < phi_list->length(); i++) {
HPhi* phi = phi_list->at(i);
- if (phi->CheckFlag(HValue::kAllowUndefinedAsNaN) &&
- !phi->CheckUsesForFlag(HValue::kAllowUndefinedAsNaN)) {
- ProcessPhi(phi);
+ if (phi->CheckFlag(HValue::kAllowUndefinedAsNaN)) {
+ for (HUseIterator it(phi->uses()); !it.Done(); it.Advance()) {
+ HValue* use_value = it.value();
+ if (!use_value->CheckFlag(HValue::kAllowUndefinedAsNaN)) {
+ ProcessPhi(phi);
+ break;
+ }
+ }
}
}
}
@@ -63,22 +68,4 @@ void HMarkDeoptimizeOnUndefinedPhase::ProcessPhi(HPhi* phi) {
}
}
-
-void HComputeChangeUndefinedToNaN::Run() {
- const ZoneList<HBasicBlock*>* blocks(graph()->blocks());
- for (int i = 0; i < blocks->length(); ++i) {
- const HBasicBlock* block(blocks->at(i));
- for (HInstruction* current = block->first(); current != NULL; ) {
- HInstruction* next = current->next();
- if (current->IsChange()) {
- if (HChange::cast(current)->can_convert_undefined_to_nan()) {
- current->SetFlag(HValue::kAllowUndefinedAsNaN);
- }
- }
- current = next;
- }
- }
-}
-
-
} } // namespace v8::internal
diff --git a/chromium/v8/src/hydrogen-mark-deoptimize.h b/chromium/v8/src/hydrogen-mark-deoptimize.h
index 30f35b3dec5..0aa2c2c7540 100644
--- a/chromium/v8/src/hydrogen-mark-deoptimize.h
+++ b/chromium/v8/src/hydrogen-mark-deoptimize.h
@@ -58,18 +58,6 @@ class HMarkDeoptimizeOnUndefinedPhase : public HPhase {
};
-class HComputeChangeUndefinedToNaN : public HPhase {
- public:
- explicit HComputeChangeUndefinedToNaN(HGraph* graph)
- : HPhase("H_Compute change undefined to nan", graph) {}
-
- void Run();
-
- private:
- DISALLOW_COPY_AND_ASSIGN(HComputeChangeUndefinedToNaN);
-};
-
-
} } // namespace v8::internal
#endif // V8_HYDROGEN_MARK_DEOPTIMIZE_H_
diff --git a/chromium/v8/src/hydrogen-representation-changes.cc b/chromium/v8/src/hydrogen-representation-changes.cc
index 862457db38c..63b7b4d6ec8 100644
--- a/chromium/v8/src/hydrogen-representation-changes.cc
+++ b/chromium/v8/src/hydrogen-representation-changes.cc
@@ -47,6 +47,8 @@ void HRepresentationChangesPhase::InsertRepresentationChangeForUse(
HInstruction* new_value = NULL;
bool is_truncating_to_smi = use_value->CheckFlag(HValue::kTruncatingToSmi);
bool is_truncating_to_int = use_value->CheckFlag(HValue::kTruncatingToInt32);
+ bool allow_undefined_as_nan =
+ use_value->CheckFlag(HValue::kAllowUndefinedAsNaN);
if (value->IsConstant()) {
HConstant* constant = HConstant::cast(value);
// Try to create a new copy of the constant with the new representation.
@@ -59,8 +61,10 @@ void HRepresentationChangesPhase::InsertRepresentationChangeForUse(
}
if (new_value == NULL) {
- new_value = new(graph()->zone()) HChange(
- value, to, is_truncating_to_smi, is_truncating_to_int);
+ new_value = new(graph()->zone()) HChange(value, to,
+ is_truncating_to_smi,
+ is_truncating_to_int,
+ allow_undefined_as_nan);
}
new_value->InsertBefore(next);
@@ -123,7 +127,7 @@ void HRepresentationChangesPhase::Run() {
!(input_representation.IsInteger32() &&
use->CheckFlag(HValue::kTruncatingToInt32))) ||
(phi->representation().IsSmi() &&
- !(input_representation.IsSmi() &&
+ !(input_representation.IsSmi() ||
use->CheckFlag(HValue::kTruncatingToSmi)))) {
if (FLAG_trace_representation) {
PrintF("#%d Phi is not truncating because of #%d %s\n",
diff --git a/chromium/v8/src/hydrogen-uint32-analysis.cc b/chromium/v8/src/hydrogen-uint32-analysis.cc
index 835a198d4d8..67219f55dff 100644
--- a/chromium/v8/src/hydrogen-uint32-analysis.cc
+++ b/chromium/v8/src/hydrogen-uint32-analysis.cc
@@ -33,7 +33,11 @@ namespace internal {
bool HUint32AnalysisPhase::IsSafeUint32Use(HValue* val, HValue* use) {
// Operations that operate on bits are safe.
- if (use->IsBitwise() || use->IsShl() || use->IsSar() || use->IsShr()) {
+ if (use->IsBitwise() ||
+ use->IsShl() ||
+ use->IsSar() ||
+ use->IsShr() ||
+ use->IsBitNot()) {
return true;
} else if (use->IsChange() || use->IsSimulate()) {
// Conversions and deoptimization have special support for unt32.
diff --git a/chromium/v8/src/hydrogen.cc b/chromium/v8/src/hydrogen.cc
index ba1de7aa225..aab64d64d45 100644
--- a/chromium/v8/src/hydrogen.cc
+++ b/chromium/v8/src/hydrogen.cc
@@ -834,14 +834,14 @@ void HGraphBuilder::IfBuilder::Else() {
}
-void HGraphBuilder::IfBuilder::Deopt(const char* reason) {
+void HGraphBuilder::IfBuilder::Deopt() {
ASSERT(did_then_);
if (did_else_) {
deopt_else_ = true;
} else {
deopt_then_ = true;
}
- builder_->Add<HDeoptimize>(reason, Deoptimizer::EAGER);
+ builder_->Add<HDeoptimize>(Deoptimizer::EAGER);
}
@@ -966,9 +966,8 @@ void HGraphBuilder::LoopBuilder::EndBody() {
// Push the new increment value on the expression stack to merge into the phi.
builder_->environment()->Push(increment_);
- HBasicBlock* last_block = builder_->current_block();
- last_block->GotoNoSimulate(header_block_);
- header_block_->loop_information()->RegisterBackEdge(last_block);
+ builder_->current_block()->GotoNoSimulate(header_block_);
+ header_block_->loop_information()->RegisterBackEdge(body_block_);
builder_->set_current_block(exit_block_);
// Pop the phi from the expression stack
@@ -1043,9 +1042,9 @@ HValue* HGraphBuilder::BuildCheckHeapObject(HValue* obj) {
void HGraphBuilder::FinishExitWithHardDeoptimization(
- const char* reason, HBasicBlock* continuation) {
+ HBasicBlock* continuation) {
PadEnvironmentForContinuation(current_block(), continuation);
- Add<HDeoptimize>(reason, Deoptimizer::EAGER);
+ Add<HDeoptimize>(Deoptimizer::EAGER);
if (graph()->IsInsideNoSideEffectsScope()) {
current_block()->GotoNoSimulate(continuation);
} else {
@@ -1059,14 +1058,12 @@ void HGraphBuilder::PadEnvironmentForContinuation(
HBasicBlock* continuation) {
if (continuation->last_environment() != NULL) {
// When merging from a deopt block to a continuation, resolve differences in
- // environment by pushing constant 0 and popping extra values so that the
- // environments match during the join. Push 0 since it has the most specific
- // representation, and will not influence representation inference of the
- // phi.
+ // environment by pushing undefined and popping extra values so that the
+ // environments match during the join.
int continuation_env_length = continuation->last_environment()->length();
while (continuation_env_length != from->last_environment()->length()) {
if (continuation_env_length > from->last_environment()->length()) {
- from->last_environment()->Push(graph()->GetConstant0());
+ from->last_environment()->Push(graph()->GetConstantUndefined());
} else {
from->last_environment()->Pop();
}
@@ -1117,7 +1114,7 @@ HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object,
IfBuilder key_checker(this);
key_checker.If<HCompareNumericAndBranch>(key, max_capacity, Token::LT);
key_checker.Then();
- key_checker.ElseDeopt("Key out of capacity range");
+ key_checker.ElseDeopt();
key_checker.End();
HValue* new_capacity = BuildNewElementsCapacity(key);
@@ -1273,7 +1270,7 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess(
negative_checker.Then();
HInstruction* result = AddExternalArrayElementAccess(
external_elements, key, val, bounds_check, elements_kind, is_store);
- negative_checker.ElseDeopt("Negative key encountered");
+ negative_checker.ElseDeopt();
length_checker.End();
return result;
} else {
@@ -1635,26 +1632,13 @@ void HGraphBuilder::BuildCopyElements(HValue* from_elements,
from_elements_kind,
ALLOW_RETURN_HOLE);
- ElementsKind kind = (IsHoleyElementsKind(from_elements_kind) &&
- IsFastSmiElementsKind(to_elements_kind))
+ ElementsKind holey_kind = IsFastSmiElementsKind(to_elements_kind)
? FAST_HOLEY_ELEMENTS : to_elements_kind;
-
- if (IsHoleyElementsKind(from_elements_kind) &&
- from_elements_kind != to_elements_kind) {
- IfBuilder if_hole(this);
- if_hole.If<HCompareHoleAndBranch>(element);
- if_hole.Then();
- HConstant* hole_constant = IsFastDoubleElementsKind(to_elements_kind)
- ? Add<HConstant>(FixedDoubleArray::hole_nan_as_double())
- : graph()->GetConstantHole();
- Add<HStoreKeyed>(to_elements, key, hole_constant, kind);
- if_hole.Else();
- HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind);
- store->SetFlag(HValue::kAllowUndefinedAsNaN);
- if_hole.End();
- } else {
- HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind);
- store->SetFlag(HValue::kAllowUndefinedAsNaN);
+ HInstruction* holey_store = Add<HStoreKeyed>(to_elements, key,
+ element, holey_kind);
+ // Allow NaN hole values to converted to their tagged counterparts.
+ if (IsFastHoleyElementsKind(to_elements_kind)) {
+ holey_store->SetFlag(HValue::kAllowUndefinedAsNaN);
}
builder.EndBody();
@@ -1741,6 +1725,38 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HValue* boilerplate,
}
+HInstruction* HGraphBuilder::BuildUnaryMathOp(
+ HValue* input, Handle<Type> type, Token::Value operation) {
+ // We only handle the numeric cases here
+ type = handle(
+ Type::Intersect(type, handle(Type::Number(), isolate())), isolate());
+
+ switch (operation) {
+ default:
+ UNREACHABLE();
+ case Token::SUB: {
+ HInstruction* instr =
+ NewUncasted<HMul>(input, graph()->GetConstantMinus1());
+ Representation rep = Representation::FromType(type);
+ if (type->Is(Type::None())) {
+ Add<HDeoptimize>(Deoptimizer::SOFT);
+ }
+ if (instr->IsBinaryOperation()) {
+ HBinaryOperation* binop = HBinaryOperation::cast(instr);
+ binop->set_observed_input_representation(1, rep);
+ binop->set_observed_input_representation(2, rep);
+ }
+ return instr;
+ }
+ case Token::BIT_NOT:
+ if (type->Is(Type::None())) {
+ Add<HDeoptimize>(Deoptimizer::SOFT);
+ }
+ return New<HBitNot>(input);
+ }
+}
+
+
void HGraphBuilder::BuildCompareNil(
HValue* value,
Handle<Type> type,
@@ -1773,7 +1789,7 @@ void HGraphBuilder::BuildCompareNil(
// emitted below is the actual monomorphic map.
BuildCheckMap(value, type->Classes().Current());
} else {
- if_nil.Deopt("Too many undetectable types");
+ if_nil.Deopt();
}
}
@@ -2572,7 +2588,7 @@ void ValueContext::ReturnValue(HValue* value) {
// The value is tracked in the bailout environment, and communicated
// through the environment as the result of the expression.
if (!arguments_allowed() && value->CheckFlag(HValue::kIsArguments)) {
- owner()->Bailout(kBadValueContextForArgumentsValue);
+ owner()->Bailout("bad value context for arguments value");
}
owner()->Push(value);
}
@@ -2624,7 +2640,7 @@ void EffectContext::ReturnContinuation(HIfContinuation* continuation,
void ValueContext::ReturnInstruction(HInstruction* instr, BailoutId ast_id) {
ASSERT(!instr->IsControlInstruction());
if (!arguments_allowed() && instr->CheckFlag(HValue::kIsArguments)) {
- return owner()->Bailout(kBadValueContextForArgumentsObjectValue);
+ return owner()->Bailout("bad value context for arguments object value");
}
owner()->AddInstruction(instr);
owner()->Push(instr);
@@ -2637,7 +2653,7 @@ void ValueContext::ReturnInstruction(HInstruction* instr, BailoutId ast_id) {
void ValueContext::ReturnControl(HControlInstruction* instr, BailoutId ast_id) {
ASSERT(!instr->HasObservableSideEffects());
if (!arguments_allowed() && instr->CheckFlag(HValue::kIsArguments)) {
- return owner()->Bailout(kBadValueContextForArgumentsObjectValue);
+ return owner()->Bailout("bad value context for arguments object value");
}
HBasicBlock* materialize_false = owner()->graph()->CreateBasicBlock();
HBasicBlock* materialize_true = owner()->graph()->CreateBasicBlock();
@@ -2727,7 +2743,7 @@ void TestContext::BuildBranch(HValue* value) {
// branch.
HOptimizedGraphBuilder* builder = owner();
if (value != NULL && value->CheckFlag(HValue::kIsArguments)) {
- builder->Bailout(kArgumentsObjectValueInATestContext);
+ builder->Bailout("arguments object value in a test context");
}
if (value->IsConstant()) {
HConstant* constant_value = HConstant::cast(value);
@@ -2773,7 +2789,7 @@ void TestContext::BuildBranch(HValue* value) {
} while (false)
-void HOptimizedGraphBuilder::Bailout(BailoutReason reason) {
+void HOptimizedGraphBuilder::Bailout(const char* reason) {
current_info()->set_bailout_reason(reason);
SetStackOverflow();
}
@@ -2832,16 +2848,16 @@ void HOptimizedGraphBuilder::VisitExpressions(
bool HOptimizedGraphBuilder::BuildGraph() {
if (current_info()->function()->is_generator()) {
- Bailout(kFunctionIsAGenerator);
+ Bailout("function is a generator");
return false;
}
Scope* scope = current_info()->scope();
if (scope->HasIllegalRedeclaration()) {
- Bailout(kFunctionWithIllegalRedeclaration);
+ Bailout("function with illegal redeclaration");
return false;
}
if (scope->calls_eval()) {
- Bailout(kFunctionCallsEval);
+ Bailout("function calls eval");
return false;
}
SetUpScope(scope);
@@ -2907,7 +2923,8 @@ bool HOptimizedGraphBuilder::BuildGraph() {
}
-bool HGraph::Optimize(BailoutReason* bailout_reason) {
+bool HGraph::Optimize(SmartArrayPointer<char>* bailout_reason) {
+ *bailout_reason = SmartArrayPointer<char>();
OrderBlocks();
AssignDominators();
@@ -2928,20 +2945,19 @@ bool HGraph::Optimize(BailoutReason* bailout_reason) {
Run<HPropagateDeoptimizingMarkPhase>();
if (!CheckConstPhiUses()) {
- *bailout_reason = kUnsupportedPhiUseOfConstVariable;
+ *bailout_reason = SmartArrayPointer<char>(StrDup(
+ "Unsupported phi use of const variable"));
return false;
}
Run<HRedundantPhiEliminationPhase>();
if (!CheckArgumentsPhiUses()) {
- *bailout_reason = kUnsupportedPhiUseOfArguments;
+ *bailout_reason = SmartArrayPointer<char>(StrDup(
+ "Unsupported phi use of arguments"));
return false;
}
// Remove dead code and phis
if (FLAG_dead_code_elimination) Run<HDeadCodeEliminationPhase>();
-
- if (FLAG_use_escape_analysis) Run<HEscapeAnalysisPhase>();
-
CollectPhis();
if (has_osr()) osr()->FinishOsrValues();
@@ -2965,20 +2981,22 @@ bool HGraph::Optimize(BailoutReason* bailout_reason) {
if (FLAG_use_canonicalizing) Run<HCanonicalizePhase>();
+ if (FLAG_use_escape_analysis) Run<HEscapeAnalysisPhase>();
+
if (FLAG_use_gvn) Run<HGlobalValueNumberingPhase>();
if (FLAG_use_range) Run<HRangeAnalysisPhase>();
- Run<HComputeChangeUndefinedToNaN>();
Run<HComputeMinusZeroChecksPhase>();
// Eliminate redundant stack checks on backwards branches.
Run<HStackCheckEliminationPhase>();
- if (FLAG_array_bounds_checks_elimination) {
+ if (FLAG_idefs) SetupInformativeDefinitions();
+ if (FLAG_array_bounds_checks_elimination && !FLAG_idefs) {
Run<HBoundsCheckEliminationPhase>();
}
- if (FLAG_array_bounds_checks_hoisting) {
+ if (FLAG_array_bounds_checks_hoisting && !FLAG_idefs) {
Run<HBoundsCheckHoistingPhase>();
}
if (FLAG_array_index_dehoisting) Run<HDehoistIndexComputationsPhase>();
@@ -2990,6 +3008,50 @@ bool HGraph::Optimize(BailoutReason* bailout_reason) {
}
+void HGraph::SetupInformativeDefinitionsInBlock(HBasicBlock* block) {
+ for (int phi_index = 0; phi_index < block->phis()->length(); phi_index++) {
+ HPhi* phi = block->phis()->at(phi_index);
+ phi->AddInformativeDefinitions();
+ phi->SetFlag(HValue::kIDefsProcessingDone);
+ // We do not support phis that "redefine just one operand".
+ ASSERT(!phi->IsInformativeDefinition());
+ }
+
+ for (HInstructionIterator it(block); !it.Done(); it.Advance()) {
+ HInstruction* i = it.Current();
+ i->AddInformativeDefinitions();
+ i->SetFlag(HValue::kIDefsProcessingDone);
+ i->UpdateRedefinedUsesWhileSettingUpInformativeDefinitions();
+ }
+}
+
+
+// This method is recursive, so if its stack frame is large it could
+// cause a stack overflow.
+// To keep the individual stack frames small we do the actual work inside
+// SetupInformativeDefinitionsInBlock();
+void HGraph::SetupInformativeDefinitionsRecursively(HBasicBlock* block) {
+ SetupInformativeDefinitionsInBlock(block);
+ for (int i = 0; i < block->dominated_blocks()->length(); ++i) {
+ SetupInformativeDefinitionsRecursively(block->dominated_blocks()->at(i));
+ }
+
+ for (HInstructionIterator it(block); !it.Done(); it.Advance()) {
+ HInstruction* i = it.Current();
+ if (i->IsBoundsCheck()) {
+ HBoundsCheck* check = HBoundsCheck::cast(i);
+ check->ApplyIndexChange();
+ }
+ }
+}
+
+
+void HGraph::SetupInformativeDefinitions() {
+ HPhase phase("H_Setup informative definitions", this);
+ SetupInformativeDefinitionsRecursively(entry_block());
+}
+
+
void HGraph::RestoreActualValues() {
HPhase phase("H_Restore actual values", this);
@@ -3072,7 +3134,7 @@ void HOptimizedGraphBuilder::SetUpScope(Scope* scope) {
// not have declarations).
if (scope->arguments() != NULL) {
if (!scope->arguments()->IsStackAllocated()) {
- return Bailout(kContextAllocatedArguments);
+ return Bailout("context-allocated arguments");
}
environment()->Bind(scope->arguments(),
@@ -3093,7 +3155,7 @@ void HOptimizedGraphBuilder::VisitBlock(Block* stmt) {
ASSERT(current_block() != NULL);
ASSERT(current_block()->HasPredecessor());
if (stmt->scope() != NULL) {
- return Bailout(kScopedBlock);
+ return Bailout("ScopedBlock");
}
BreakAndContinueInfo break_info(stmt);
{ BreakAndContinueScope push(&break_info, this);
@@ -3305,7 +3367,7 @@ void HOptimizedGraphBuilder::VisitWithStatement(WithStatement* stmt) {
ASSERT(!HasStackOverflow());
ASSERT(current_block() != NULL);
ASSERT(current_block()->HasPredecessor());
- return Bailout(kWithStatement);
+ return Bailout("WithStatement");
}
@@ -3320,12 +3382,12 @@ void HOptimizedGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) {
ZoneList<CaseClause*>* clauses = stmt->cases();
int clause_count = clauses->length();
if (clause_count > kCaseClauseLimit) {
- return Bailout(kSwitchStatementTooManyClauses);
+ return Bailout("SwitchStatement: too many clauses");
}
ASSERT(stmt->switch_type() != SwitchStatement::UNKNOWN_SWITCH);
if (stmt->switch_type() == SwitchStatement::GENERIC_SWITCH) {
- return Bailout(kSwitchStatementMixedOrNonLiteralSwitchLabels);
+ return Bailout("SwitchStatement: mixed or non-literal switch labels");
}
HValue* context = environment()->context();
@@ -3371,7 +3433,7 @@ void HOptimizedGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) {
if (stmt->switch_type() == SwitchStatement::SMI_SWITCH) {
if (!clause->compare_type()->Is(Type::Smi())) {
- Add<HDeoptimize>("Non-smi switch type", Deoptimizer::SOFT);
+ Add<HDeoptimize>(Deoptimizer::SOFT);
}
HCompareNumericAndBranch* compare_ =
@@ -3617,16 +3679,16 @@ void HOptimizedGraphBuilder::VisitForInStatement(ForInStatement* stmt) {
ASSERT(current_block()->HasPredecessor());
if (!FLAG_optimize_for_in) {
- return Bailout(kForInStatementOptimizationIsDisabled);
+ return Bailout("ForInStatement optimization is disabled");
}
if (stmt->for_in_type() != ForInStatement::FAST_FOR_IN) {
- return Bailout(kForInStatementIsNotFastCase);
+ return Bailout("ForInStatement is not fast case");
}
if (!stmt->each()->IsVariableProxy() ||
!stmt->each()->AsVariableProxy()->var()->IsStackLocal()) {
- return Bailout(kForInStatementWithNonLocalEachVariable);
+ return Bailout("ForInStatement with non-local each variable");
}
Variable* each_var = stmt->each()->AsVariableProxy()->var();
@@ -3720,7 +3782,7 @@ void HOptimizedGraphBuilder::VisitForOfStatement(ForOfStatement* stmt) {
ASSERT(!HasStackOverflow());
ASSERT(current_block() != NULL);
ASSERT(current_block()->HasPredecessor());
- return Bailout(kForOfStatement);
+ return Bailout("ForOfStatement");
}
@@ -3728,7 +3790,7 @@ void HOptimizedGraphBuilder::VisitTryCatchStatement(TryCatchStatement* stmt) {
ASSERT(!HasStackOverflow());
ASSERT(current_block() != NULL);
ASSERT(current_block()->HasPredecessor());
- return Bailout(kTryCatchStatement);
+ return Bailout("TryCatchStatement");
}
@@ -3737,7 +3799,7 @@ void HOptimizedGraphBuilder::VisitTryFinallyStatement(
ASSERT(!HasStackOverflow());
ASSERT(current_block() != NULL);
ASSERT(current_block()->HasPredecessor());
- return Bailout(kTryFinallyStatement);
+ return Bailout("TryFinallyStatement");
}
@@ -3745,7 +3807,7 @@ void HOptimizedGraphBuilder::VisitDebuggerStatement(DebuggerStatement* stmt) {
ASSERT(!HasStackOverflow());
ASSERT(current_block() != NULL);
ASSERT(current_block()->HasPredecessor());
- return Bailout(kDebuggerStatement);
+ return Bailout("DebuggerStatement");
}
@@ -3791,7 +3853,7 @@ void HOptimizedGraphBuilder::VisitSharedFunctionInfoLiteral(
ASSERT(!HasStackOverflow());
ASSERT(current_block() != NULL);
ASSERT(current_block()->HasPredecessor());
- return Bailout(kSharedFunctionInfoLiteral);
+ return Bailout("SharedFunctionInfoLiteral");
}
@@ -3871,7 +3933,7 @@ void HOptimizedGraphBuilder::VisitVariableProxy(VariableProxy* expr) {
case Variable::UNALLOCATED: {
if (IsLexicalVariableMode(variable->mode())) {
// TODO(rossberg): should this be an ASSERT?
- return Bailout(kReferenceToGlobalLexicalVariable);
+ return Bailout("reference to global lexical variable");
}
// Handle known global constants like 'undefined' specially to avoid a
// load from a global cell for them.
@@ -3928,7 +3990,7 @@ void HOptimizedGraphBuilder::VisitVariableProxy(VariableProxy* expr) {
if (value == graph()->GetConstantHole()) {
ASSERT(IsDeclaredVariableMode(variable->mode()) &&
variable->mode() != VAR);
- return Bailout(kReferenceToUninitializedVariable);
+ return Bailout("reference to uninitialized variable");
}
return ast_context()->ReturnValue(value);
}
@@ -3940,7 +4002,7 @@ void HOptimizedGraphBuilder::VisitVariableProxy(VariableProxy* expr) {
}
case Variable::LOOKUP:
- return Bailout(kReferenceToAVariableWhichRequiresDynamicLookup);
+ return Bailout("reference to a variable which requires dynamic lookup");
}
}
@@ -4061,7 +4123,8 @@ static bool IsFastLiteral(Handle<JSObject> boilerplate,
int* data_size,
int* pointer_size) {
if (boilerplate->map()->is_deprecated()) {
- Handle<Object> result = JSObject::TryMigrateInstance(boilerplate);
+ Handle<Object> result =
+ JSObject::TryMigrateInstance(boilerplate);
if (result->IsSmi()) return false;
}
@@ -4238,7 +4301,7 @@ void HOptimizedGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
case ObjectLiteral::Property::PROTOTYPE:
case ObjectLiteral::Property::SETTER:
case ObjectLiteral::Property::GETTER:
- return Bailout(kObjectLiteralWithComplexProperty);
+ return Bailout("Object literal with complex property");
default: UNREACHABLE();
}
}
@@ -4277,7 +4340,7 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
raw_boilerplate = Runtime::CreateArrayLiteralBoilerplate(
isolate(), literals, expr->constant_elements());
if (raw_boilerplate.is_null()) {
- return Bailout(kArrayBoilerplateCreationFailed);
+ return Bailout("array boilerplate creation failed");
}
site = isolate()->factory()->NewAllocationSite();
@@ -4369,7 +4432,7 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
CHECK_ALIVE(VisitForValue(subexpr));
HValue* value = Pop();
- if (!Smi::IsValid(i)) return Bailout(kNonSmiKeyInArrayLiteral);
+ if (!Smi::IsValid(i)) return Bailout("Non-smi key in array literal");
elements = AddLoadElements(literal, type_check);
@@ -4450,7 +4513,7 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField(
if (proto_result.IsProperty()) {
// If the inherited property could induce readonly-ness, bail out.
if (proto_result.IsReadOnly() || !proto_result.IsCacheable()) {
- Bailout(kImproperObjectOnPrototypeChainForStore);
+ Bailout("improper object on prototype chain for store");
return NULL;
}
// We only need to check up to the preexisting property.
@@ -4463,9 +4526,9 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField(
ASSERT(proto->GetPrototype(isolate())->IsNull());
}
ASSERT(proto->IsJSObject());
- BuildCheckPrototypeMaps(
+ Add<HCheckPrototypeMaps>(
Handle<JSObject>(JSObject::cast(map->prototype())),
- Handle<JSObject>(JSObject::cast(proto)));
+ Handle<JSObject>(JSObject::cast(proto)), top_info());
}
HObjectAccess field_access = HObjectAccess::ForField(map, lookup, name);
@@ -4503,8 +4566,7 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField(
if (transition_to_field) {
Handle<Map> transition(lookup->GetTransitionMapFromMap(*map));
- HConstant* transition_constant = Add<HConstant>(transition);
- instr->SetTransition(transition_constant, top_info());
+ instr->SetTransition(transition, top_info());
// TODO(fschneider): Record the new map type of the object in the IR to
// enable elimination of redundant checks after the transition store.
instr->SetGVNFlag(kChangesMaps);
@@ -4620,43 +4682,14 @@ HInstruction* HOptimizedGraphBuilder::TryLoadPolymorphicAsMonomorphic(
Handle<JSObject> holder(lookup.holder());
Handle<Map> holder_map(holder->map());
- BuildCheckPrototypeMaps(Handle<JSObject>::cast(prototype), holder);
+ Add<HCheckPrototypeMaps>(
+ Handle<JSObject>::cast(prototype), holder, top_info());
HValue* holder_value = Add<HConstant>(holder);
return BuildLoadNamedField(holder_value,
HObjectAccess::ForField(holder_map, &lookup, name), type_check);
}
-// Returns true if an instance of this map can never find a property with this
-// name in its prototype chain. This means all prototypes up to the top are
-// fast and don't have the name in them. It would be good if we could optimize
-// polymorphic loads where the property is sometimes found in the prototype
-// chain.
-static bool PrototypeChainCanNeverResolve(
- Handle<Map> map, Handle<String> name) {
- Isolate* isolate = map->GetIsolate();
- Object* current = map->prototype();
- while (current != isolate->heap()->null_value()) {
- if (current->IsJSGlobalProxy() ||
- current->IsGlobalObject() ||
- !current->IsJSObject() ||
- JSObject::cast(current)->map()->has_named_interceptor() ||
- JSObject::cast(current)->IsAccessCheckNeeded() ||
- !JSObject::cast(current)->HasFastProperties()) {
- return false;
- }
-
- LookupResult lookup(isolate);
- Map* map = JSObject::cast(current)->map();
- map->LookupDescriptor(NULL, *name, &lookup);
- if (lookup.IsFound()) return false;
- if (!lookup.IsCacheable()) return false;
- current = JSObject::cast(current)->GetPrototype();
- }
- return true;
-}
-
-
void HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField(
Property* expr,
HValue* object,
@@ -4664,90 +4697,16 @@ void HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField(
Handle<String> name) {
HInstruction* instr = TryLoadPolymorphicAsMonomorphic(
expr, object, types, name);
- if (instr != NULL) {
- instr->set_position(expr->position());
- return ast_context()->ReturnInstruction(instr, expr->id());
- }
-
- // Something did not match; must use a polymorphic load.
- int count = 0;
- HBasicBlock* join = NULL;
- for (int i = 0; i < types->length() && count < kMaxLoadPolymorphism; ++i) {
- Handle<Map> map = types->at(i);
- LookupResult lookup(isolate());
- if (ComputeLoadStoreField(map, name, &lookup, false) ||
- (lookup.IsCacheable() &&
- !map->is_dictionary_map() &&
- !map->has_named_interceptor() &&
- (lookup.IsConstant() ||
- (!lookup.IsFound() &&
- PrototypeChainCanNeverResolve(map, name))))) {
- if (count == 0) {
- BuildCheckHeapObject(object);
- join = graph()->CreateBasicBlock();
- }
- ++count;
- HBasicBlock* if_true = graph()->CreateBasicBlock();
- HBasicBlock* if_false = graph()->CreateBasicBlock();
- HCompareMap* compare =
- new(zone()) HCompareMap(object, map, if_true, if_false);
- current_block()->Finish(compare);
-
- set_current_block(if_true);
-
- // TODO(verwaest): Merge logic with BuildLoadNamedMonomorphic.
- if (lookup.IsField()) {
- HObjectAccess access = HObjectAccess::ForField(map, &lookup, name);
- HLoadNamedField* load = BuildLoadNamedField(object, access, compare);
- load->set_position(expr->position());
- AddInstruction(load);
- if (!ast_context()->IsEffect()) Push(load);
- } else if (lookup.IsConstant()) {
- Handle<Object> constant(lookup.GetConstantFromMap(*map), isolate());
- HConstant* hconstant = Add<HConstant>(constant);
- if (!ast_context()->IsEffect()) Push(hconstant);
- } else {
- ASSERT(!lookup.IsFound());
- if (map->prototype()->IsJSObject()) {
- Handle<JSObject> prototype(JSObject::cast(map->prototype()));
- Handle<JSObject> holder = prototype;
- while (holder->map()->prototype()->IsJSObject()) {
- holder = handle(JSObject::cast(holder->map()->prototype()));
- }
- BuildCheckPrototypeMaps(prototype, holder);
- }
- if (!ast_context()->IsEffect()) Push(graph()->GetConstantUndefined());
- }
-
- current_block()->Goto(join);
- set_current_block(if_false);
- }
- }
-
- // Finish up. Unconditionally deoptimize if we've handled all the maps we
- // know about and do not want to handle ones we've never seen. Otherwise
- // use a generic IC.
- if (count == types->length() && FLAG_deoptimize_uncommon_cases) {
- FinishExitWithHardDeoptimization("Unknown map in polymorphic load", join);
- } else {
- HInstruction* load = BuildLoadNamedGeneric(object, name, expr);
- load->set_position(expr->position());
- AddInstruction(load);
- if (!ast_context()->IsEffect()) Push(load);
-
- if (join != NULL) {
- current_block()->Goto(join);
- } else {
- Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE);
- if (!ast_context()->IsEffect()) ast_context()->ReturnValue(Pop());
- return;
- }
+ if (instr == NULL) {
+ // Something did not match; must use a polymorphic load.
+ BuildCheckHeapObject(object);
+ HValue* context = environment()->context();
+ instr = new(zone()) HLoadNamedFieldPolymorphic(
+ context, object, types, name, zone());
}
- ASSERT(join != NULL);
- join->SetJoinId(expr->id());
- set_current_block(join);
- if (!ast_context()->IsEffect()) ast_context()->ReturnValue(Pop());
+ instr->set_position(expr->position());
+ return ast_context()->ReturnInstruction(instr, expr->id());
}
@@ -4866,7 +4825,7 @@ void HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField(
// know about and do not want to handle ones we've never seen. Otherwise
// use a generic IC.
if (count == types->length() && FLAG_deoptimize_uncommon_cases) {
- FinishExitWithHardDeoptimization("Unknown map in polymorphic store", join);
+ FinishExitWithHardDeoptimization(join);
} else {
HInstruction* instr = BuildStoreNamedGeneric(object, name, store_value);
instr->set_position(position);
@@ -4914,10 +4873,7 @@ void HOptimizedGraphBuilder::HandlePropertyAssignment(Assignment* expr) {
HValue* value = environment()->ExpressionStackAt(0);
HValue* object = environment()->ExpressionStackAt(1);
- if (expr->IsUninitialized()) {
- Add<HDeoptimize>("Insufficient type feedback for property assignment",
- Deoptimizer::SOFT);
- }
+ if (expr->IsUninitialized()) Add<HDeoptimize>(Deoptimizer::SOFT);
return BuildStoreNamed(expr, expr->id(), expr->position(),
expr->AssignmentId(), prop, object, value, value);
} else {
@@ -4963,8 +4919,7 @@ void HOptimizedGraphBuilder::HandleGlobalVariableAssignment(
}
builder.Then();
builder.Else();
- Add<HDeoptimize>("Constant global variable assignment",
- Deoptimizer::EAGER);
+ Add<HDeoptimize>(Deoptimizer::EAGER);
builder.End();
}
HInstruction* instr =
@@ -5062,7 +5017,7 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) {
if (proxy != NULL) {
Variable* var = proxy->var();
if (var->mode() == LET) {
- return Bailout(kUnsupportedLetCompoundAssignment);
+ return Bailout("unsupported let compound assignment");
}
CHECK_ALIVE(VisitForValue(operation));
@@ -5078,7 +5033,7 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) {
case Variable::PARAMETER:
case Variable::LOCAL:
if (var->mode() == CONST) {
- return Bailout(kUnsupportedConstCompoundAssignment);
+ return Bailout("unsupported const compound assignment");
}
BindIfLive(var, Top());
break;
@@ -5094,7 +5049,8 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) {
int count = current_info()->scope()->num_parameters();
for (int i = 0; i < count; ++i) {
if (var == current_info()->scope()->parameter(i)) {
- Bailout(kAssignmentToParameterFunctionUsesArgumentsObject);
+ Bailout(
+ "assignment to parameter, function uses arguments object");
}
}
}
@@ -5125,7 +5081,7 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) {
}
case Variable::LOOKUP:
- return Bailout(kCompoundAssignmentToLookupSlot);
+ return Bailout("compound assignment to lookup slot");
}
return ast_context()->ReturnValue(Pop());
@@ -5173,7 +5129,7 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) {
Add<HSimulate>(operation->id(), REMOVABLE_SIMULATE);
}
- return BuildStoreNamed(expr, expr->id(), expr->position(),
+ return BuildStoreNamed(prop, expr->id(), expr->position(),
expr->AssignmentId(), prop, object, instr, instr);
} else {
// Keyed property.
@@ -5214,7 +5170,7 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) {
}
} else {
- return Bailout(kInvalidLhsInCompoundAssignment);
+ return Bailout("invalid lhs in compound assignment");
}
}
@@ -5251,11 +5207,11 @@ void HOptimizedGraphBuilder::VisitAssignment(Assignment* expr) {
}
} else if (var->mode() == CONST_HARMONY) {
if (expr->op() != Token::INIT_CONST_HARMONY) {
- return Bailout(kNonInitializerAssignmentToConst);
+ return Bailout("non-initializer assignment to const");
}
}
- if (proxy->IsArguments()) return Bailout(kAssignmentToArguments);
+ if (proxy->IsArguments()) return Bailout("assignment to arguments");
// Handle the assignment.
switch (var->location()) {
@@ -5274,7 +5230,7 @@ void HOptimizedGraphBuilder::VisitAssignment(Assignment* expr) {
if (var->mode() == LET && expr->op() == Token::ASSIGN) {
HValue* env_value = environment()->Lookup(var);
if (env_value == graph()->GetConstantHole()) {
- return Bailout(kAssignmentToLetVariableBeforeInitialization);
+ return Bailout("assignment to let variable before initialization");
}
}
// We do not allow the arguments object to occur in a context where it
@@ -5296,7 +5252,7 @@ void HOptimizedGraphBuilder::VisitAssignment(Assignment* expr) {
int count = current_info()->scope()->num_parameters();
for (int i = 0; i < count; ++i) {
if (var == current_info()->scope()->parameter(i)) {
- return Bailout(kAssignmentToParameterInArgumentsObject);
+ return Bailout("assignment to parameter in arguments object");
}
}
}
@@ -5337,10 +5293,10 @@ void HOptimizedGraphBuilder::VisitAssignment(Assignment* expr) {
}
case Variable::LOOKUP:
- return Bailout(kAssignmentToLOOKUPVariable);
+ return Bailout("assignment to LOOKUP variable");
}
} else {
- return Bailout(kInvalidLeftHandSideInAssignment);
+ return Bailout("invalid left-hand side in assignment");
}
}
@@ -5405,8 +5361,7 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadNamedGeneric(
Handle<String> name,
Property* expr) {
if (expr->IsUninitialized()) {
- Add<HDeoptimize>("Insufficient feedback for generic named load",
- Deoptimizer::SOFT);
+ Add<HDeoptimize>(Deoptimizer::SOFT);
}
HValue* context = environment()->context();
return new(zone()) HLoadNamedGeneric(context, object, name);
@@ -5463,7 +5418,7 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadNamedMonomorphic(
Handle<JSObject> holder(lookup.holder());
Handle<Map> holder_map(holder->map());
HCheckMaps* type_check = AddCheckMap(object, map);
- BuildCheckPrototypeMaps(prototype, holder);
+ Add<HCheckPrototypeMaps>(prototype, holder, top_info());
HValue* holder_value = Add<HConstant>(holder);
return BuildLoadNamedField(holder_value,
HObjectAccess::ForField(holder_map, &lookup, name), type_check);
@@ -5475,7 +5430,7 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadNamedMonomorphic(
Handle<JSObject> holder(lookup.holder());
Handle<Map> holder_map(holder->map());
AddCheckMap(object, map);
- BuildCheckPrototypeMaps(prototype, holder);
+ Add<HCheckPrototypeMaps>(prototype, holder, top_info());
Handle<Object> constant(lookup.GetConstantFromMap(*holder_map), isolate());
return New<HConstant>(constant);
}
@@ -5511,7 +5466,7 @@ HInstruction* HOptimizedGraphBuilder::BuildMonomorphicElementAccess(
isolate()->IsFastArrayConstructorPrototypeChainIntact()) {
Handle<JSObject> prototype(JSObject::cast(map->prototype()), isolate());
Handle<JSObject> object_prototype = isolate()->initial_object_prototype();
- BuildCheckPrototypeMaps(prototype, object_prototype);
+ Add<HCheckPrototypeMaps>(prototype, object_prototype, top_info());
load_mode = ALLOW_RETURN_HOLE;
graph()->MarkDependsOnEmptyArrayProtoElements();
}
@@ -5724,8 +5679,7 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess(
// Deopt if none of the cases matched.
NoObservableSideEffectsScope scope(this);
- FinishExitWithHardDeoptimization("Unknown type in polymorphic element access",
- join);
+ FinishExitWithHardDeoptimization(join);
set_current_block(join);
return is_store ? NULL : Pop();
}
@@ -5761,14 +5715,12 @@ HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess(
} else {
if (is_store) {
if (expr->IsAssignment() && expr->AsAssignment()->IsUninitialized()) {
- Add<HDeoptimize>("Insufficient feedback for keyed store",
- Deoptimizer::SOFT);
+ Add<HDeoptimize>(Deoptimizer::SOFT);
}
instr = BuildStoreKeyedGeneric(obj, key, val);
} else {
if (expr->AsProperty()->IsUninitialized()) {
- Add<HDeoptimize>("Insufficient feedback for keyed load",
- Deoptimizer::SOFT);
+ Add<HDeoptimize>(Deoptimizer::SOFT);
}
instr = BuildLoadKeyedGeneric(obj, key);
}
@@ -5961,38 +5913,11 @@ void HOptimizedGraphBuilder::VisitProperty(Property* expr) {
}
-void HGraphBuilder::BuildConstantMapCheck(Handle<JSObject> constant,
- CompilationInfo* info) {
- HConstant* constant_value = New<HConstant>(constant);
-
- if (constant->map()->CanOmitMapChecks()) {
- constant->map()->AddDependentCompilationInfo(
- DependentCode::kPrototypeCheckGroup, info);
- return;
- }
-
- AddInstruction(constant_value);
- HCheckMaps* check =
- Add<HCheckMaps>(constant_value, handle(constant->map()), info);
- check->ClearGVNFlag(kDependsOnElementsKind);
-}
-
-
-void HGraphBuilder::BuildCheckPrototypeMaps(Handle<JSObject> prototype,
- Handle<JSObject> holder) {
- BuildConstantMapCheck(prototype, top_info());
- while (!prototype.is_identical_to(holder)) {
- prototype = handle(JSObject::cast(prototype->GetPrototype()));
- BuildConstantMapCheck(prototype, top_info());
- }
-}
-
-
void HOptimizedGraphBuilder::AddCheckPrototypeMaps(Handle<JSObject> holder,
Handle<Map> receiver_map) {
if (!holder.is_null()) {
Handle<JSObject> prototype(JSObject::cast(receiver_map->prototype()));
- BuildCheckPrototypeMaps(prototype, holder);
+ Add<HCheckPrototypeMaps>(prototype, holder, top_info());
}
}
@@ -6215,7 +6140,7 @@ void HOptimizedGraphBuilder::HandlePolymorphicCallNamed(
// that the environment stack matches the depth on deopt that it otherwise
// would have had after a successful call.
Drop(argument_count - (ast_context()->IsEffect() ? 0 : 1));
- FinishExitWithHardDeoptimization("Unknown map in polymorphic call", join);
+ FinishExitWithHardDeoptimization(join);
} else {
HValue* context = environment()->context();
HCallNamed* call = new(zone()) HCallNamed(context, name, argument_count);
@@ -6364,7 +6289,7 @@ bool HOptimizedGraphBuilder::TryInline(CallKind call_kind,
if (target_info.isolate()->has_pending_exception()) {
// Parse or scope error, never optimize this function.
SetStackOverflow();
- target_shared->DisableOptimization(kParseScopeError);
+ target_shared->DisableOptimization("parse/scope error");
}
TraceInline(target, caller, "parse failure");
return false;
@@ -6503,7 +6428,7 @@ bool HOptimizedGraphBuilder::TryInline(CallKind call_kind,
// Bail out if the inline function did, as we cannot residualize a call
// instead.
TraceInline(target, caller, "inline graph construction failed");
- target_shared->DisableOptimization(kInliningBailedOut);
+ target_shared->DisableOptimization("inlining bailed out");
inline_bailout_ = true;
delete target_state;
return true;
@@ -6733,9 +6658,9 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall(
HValue* string = Pop();
HValue* context = environment()->context();
ASSERT(!expr->holder().is_null());
- BuildCheckPrototypeMaps(Call::GetPrototypeForPrimitiveCheck(
+ Add<HCheckPrototypeMaps>(Call::GetPrototypeForPrimitiveCheck(
STRING_CHECK, expr->holder()->GetIsolate()),
- expr->holder());
+ expr->holder(), top_info());
HInstruction* char_code =
BuildStringCharCodeAt(string, index);
if (id == kStringCharCodeAt) {
@@ -7048,7 +6973,7 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) {
} else {
VariableProxy* proxy = expr->expression()->AsVariableProxy();
if (proxy != NULL && proxy->var()->is_possibly_eval(isolate())) {
- return Bailout(kPossibleDirectCallToEval);
+ return Bailout("possible direct call to eval");
}
bool global_call = proxy != NULL && proxy->var()->IsUnallocated();
@@ -7316,7 +7241,7 @@ void HOptimizedGraphBuilder::VisitCallRuntime(CallRuntime* expr) {
ASSERT(current_block() != NULL);
ASSERT(current_block()->HasPredecessor());
if (expr->is_jsruntime()) {
- return Bailout(kCallToAJavaScriptRuntimeFunction);
+ return Bailout("call to a JavaScript runtime function");
}
const Runtime::Function* function = expr->function();
@@ -7356,6 +7281,8 @@ void HOptimizedGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) {
case Token::DELETE: return VisitDelete(expr);
case Token::VOID: return VisitVoid(expr);
case Token::TYPEOF: return VisitTypeof(expr);
+ case Token::SUB: return VisitSub(expr);
+ case Token::BIT_NOT: return VisitBitNot(expr);
case Token::NOT: return VisitNot(expr);
default: UNREACHABLE();
}
@@ -7381,7 +7308,7 @@ void HOptimizedGraphBuilder::VisitDelete(UnaryOperation* expr) {
} else if (proxy != NULL) {
Variable* var = proxy->var();
if (var->IsUnallocated()) {
- Bailout(kDeleteWithGlobalVariable);
+ Bailout("delete with global variable");
} else if (var->IsStackAllocated() || var->IsContextSlot()) {
// Result of deleting non-global variables is false. 'this' is not
// really a variable, though we implement it as one. The
@@ -7391,7 +7318,7 @@ void HOptimizedGraphBuilder::VisitDelete(UnaryOperation* expr) {
: graph()->GetConstantFalse();
return ast_context()->ReturnValue(value);
} else {
- Bailout(kDeleteWithNonGlobalVariable);
+ Bailout("delete with non-global variable");
}
} else {
// Result of deleting non-property, non-variable reference is true.
@@ -7417,6 +7344,24 @@ void HOptimizedGraphBuilder::VisitTypeof(UnaryOperation* expr) {
}
+void HOptimizedGraphBuilder::VisitSub(UnaryOperation* expr) {
+ CHECK_ALIVE(VisitForValue(expr->expression()));
+ Handle<Type> operand_type = expr->expression()->bounds().lower;
+ HValue* value = TruncateToNumber(Pop(), &operand_type);
+ HInstruction* instr = BuildUnaryMathOp(value, operand_type, Token::SUB);
+ return ast_context()->ReturnInstruction(instr, expr->id());
+}
+
+
+void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) {
+ CHECK_ALIVE(VisitForValue(expr->expression()));
+ Handle<Type> operand_type = expr->expression()->bounds().lower;
+ HValue* value = TruncateToNumber(Pop(), &operand_type);
+ HInstruction* instr = BuildUnaryMathOp(value, operand_type, Token::BIT_NOT);
+ return ast_context()->ReturnInstruction(instr, expr->id());
+}
+
+
void HOptimizedGraphBuilder::VisitNot(UnaryOperation* expr) {
if (ast_context()->IsTest()) {
TestContext* context = TestContext::cast(ast_context());
@@ -7505,7 +7450,7 @@ void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) {
VariableProxy* proxy = target->AsVariableProxy();
Property* prop = target->AsProperty();
if (proxy == NULL && prop == NULL) {
- return Bailout(kInvalidLhsInCountOperation);
+ return Bailout("invalid lhs in count operation");
}
// Match the full code generator stack by simulating an extra stack
@@ -7519,7 +7464,7 @@ void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) {
if (proxy != NULL) {
Variable* var = proxy->var();
if (var->mode() == CONST) {
- return Bailout(kUnsupportedCountOperationWithConst);
+ return Bailout("unsupported count operation with const");
}
// Argument of the count operation is a variable, not a property.
ASSERT(prop == NULL);
@@ -7553,7 +7498,7 @@ void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) {
int count = current_info()->scope()->num_parameters();
for (int i = 0; i < count; ++i) {
if (var == current_info()->scope()->parameter(i)) {
- return Bailout(kAssignmentToParameterInArgumentsObject);
+ return Bailout("assignment to parameter in arguments object");
}
}
}
@@ -7570,7 +7515,7 @@ void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) {
}
case Variable::LOOKUP:
- return Bailout(kLookupVariableInCountOperation);
+ return Bailout("lookup variable in count operation");
}
} else {
@@ -7613,7 +7558,7 @@ void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) {
after = BuildIncrement(returns_original_input, expr);
HValue* result = returns_original_input ? Pop() : after;
- return BuildStoreNamed(expr, expr->id(), expr->position(),
+ return BuildStoreNamed(prop, expr->id(), expr->position(),
expr->AssignmentId(), prop, object, after, result);
} else {
// Keyed property.
@@ -7775,14 +7720,12 @@ HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation(
}
if (left_type->Is(Type::None())) {
- Add<HDeoptimize>("Insufficient type feedback for left side",
- Deoptimizer::SOFT);
+ Add<HDeoptimize>(Deoptimizer::SOFT);
// TODO(rossberg): we should be able to get rid of non-continuous defaults.
left_type = handle(Type::Any(), isolate());
}
if (right_type->Is(Type::None())) {
- Add<HDeoptimize>("Insufficient type feedback for right side",
- Deoptimizer::SOFT);
+ Add<HDeoptimize>(Deoptimizer::SOFT);
right_type = handle(Type::Any(), isolate());
}
HInstruction* instr = NULL;
@@ -8132,8 +8075,7 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) {
// Cases handled below depend on collected type feedback. They should
// soft deoptimize when there is no type feedback.
if (combined_type->Is(Type::None())) {
- Add<HDeoptimize>("insufficient type feedback for combined type",
- Deoptimizer::SOFT);
+ Add<HDeoptimize>(Deoptimizer::SOFT);
combined_type = left_type = right_type = handle(Type::Any(), isolate());
}
@@ -8162,7 +8104,7 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) {
}
}
default:
- return Bailout(kUnsupportedNonPrimitiveCompare);
+ return Bailout("Unsupported non-primitive compare");
}
} else if (combined_type->Is(Type::InternalizedString()) &&
Token::IsEqualityOp(op)) {
@@ -8625,7 +8567,7 @@ void HOptimizedGraphBuilder::VisitVariableDeclaration(
}
break;
case Variable::LOOKUP:
- return Bailout(kUnsupportedLookupSlotInDeclaration);
+ return Bailout("unsupported lookup slot in declaration");
}
}
@@ -8663,7 +8605,7 @@ void HOptimizedGraphBuilder::VisitFunctionDeclaration(
break;
}
case Variable::LOOKUP:
- return Bailout(kUnsupportedLookupSlotInDeclaration);
+ return Bailout("unsupported lookup slot in declaration");
}
}
@@ -8784,7 +8726,7 @@ void HOptimizedGraphBuilder::GenerateIsObject(CallRuntime* call) {
void HOptimizedGraphBuilder::GenerateIsNonNegativeSmi(CallRuntime* call) {
- return Bailout(kInlinedRuntimeFunctionIsNonNegativeSmi);
+ return Bailout("inlined runtime function: IsNonNegativeSmi");
}
@@ -8800,7 +8742,8 @@ void HOptimizedGraphBuilder::GenerateIsUndetectableObject(CallRuntime* call) {
void HOptimizedGraphBuilder::GenerateIsStringWrapperSafeForDefaultValueOf(
CallRuntime* call) {
- return Bailout(kInlinedRuntimeFunctionIsStringWrapperSafeForDefaultValueOf);
+ return Bailout(
+ "inlined runtime function: IsStringWrapperSafeForDefaultValueOf");
}
@@ -8854,7 +8797,7 @@ void HOptimizedGraphBuilder::GenerateArguments(CallRuntime* call) {
void HOptimizedGraphBuilder::GenerateClassOf(CallRuntime* call) {
// The special form detected by IsClassOfTest is detected before we get here
// and does not cause a bailout.
- return Bailout(kInlinedRuntimeFunctionClassOf);
+ return Bailout("inlined runtime function: ClassOf");
}
@@ -9071,7 +9014,7 @@ void HOptimizedGraphBuilder::GenerateRegExpConstructResult(CallRuntime* call) {
// Support for fast native caches.
void HOptimizedGraphBuilder::GenerateGetFromCache(CallRuntime* call) {
- return Bailout(kInlinedRuntimeFunctionGetFromCache);
+ return Bailout("inlined runtime function: GetFromCache");
}
@@ -9201,7 +9144,7 @@ void HOptimizedGraphBuilder::GenerateMathSqrt(CallRuntime* call) {
// Check whether two RegExps are equivalent
void HOptimizedGraphBuilder::GenerateIsRegExpEquivalent(CallRuntime* call) {
- return Bailout(kInlinedRuntimeFunctionIsRegExpEquivalent);
+ return Bailout("inlined runtime function: IsRegExpEquivalent");
}
@@ -9215,18 +9158,18 @@ void HOptimizedGraphBuilder::GenerateGetCachedArrayIndex(CallRuntime* call) {
void HOptimizedGraphBuilder::GenerateFastAsciiArrayJoin(CallRuntime* call) {
- return Bailout(kInlinedRuntimeFunctionFastAsciiArrayJoin);
+ return Bailout("inlined runtime function: FastAsciiArrayJoin");
}
// Support for generators.
void HOptimizedGraphBuilder::GenerateGeneratorNext(CallRuntime* call) {
- return Bailout(kInlinedRuntimeFunctionGeneratorNext);
+ return Bailout("inlined runtime function: GeneratorNext");
}
void HOptimizedGraphBuilder::GenerateGeneratorThrow(CallRuntime* call) {
- return Bailout(kInlinedRuntimeFunctionGeneratorThrow);
+ return Bailout("inlined runtime function: GeneratorThrow");
}
diff --git a/chromium/v8/src/hydrogen.h b/chromium/v8/src/hydrogen.h
index 004aa16a878..20dc1a3e0ec 100644
--- a/chromium/v8/src/hydrogen.h
+++ b/chromium/v8/src/hydrogen.h
@@ -368,7 +368,7 @@ class HGraph: public ZoneObject {
return NULL;
}
- bool Optimize(BailoutReason* bailout_reason);
+ bool Optimize(SmartArrayPointer<char>* bailout_reason);
#ifdef DEBUG
void Verify(bool do_full_verify) const;
@@ -1266,8 +1266,7 @@ class HGraphBuilder {
void PushAndAdd(HInstruction* instr);
- void FinishExitWithHardDeoptimization(const char* reason,
- HBasicBlock* continuation);
+ void FinishExitWithHardDeoptimization(HBasicBlock* continuation);
void AddIncrementCounter(StatsCounter* counter,
HValue* context);
@@ -1371,10 +1370,10 @@ class HGraphBuilder {
void Else();
void End();
- void Deopt(const char* reason);
- void ElseDeopt(const char* reason) {
+ void Deopt();
+ void ElseDeopt() {
Else();
- Deopt(reason);
+ Deopt();
}
void Return(HValue* value);
@@ -1533,6 +1532,9 @@ class HGraphBuilder {
ElementsKind kind,
int length);
+ HInstruction* BuildUnaryMathOp(
+ HValue* value, Handle<Type> type, Token::Value token);
+
void BuildCompareNil(
HValue* value,
Handle<Type> type,
@@ -1543,10 +1545,6 @@ class HGraphBuilder {
int previous_object_size,
HValue* payload);
- void BuildConstantMapCheck(Handle<JSObject> constant, CompilationInfo* info);
- void BuildCheckPrototypeMaps(Handle<JSObject> prototype,
- Handle<JSObject> holder);
-
HInstruction* BuildGetNativeContext();
HInstruction* BuildGetArrayFunction();
@@ -1564,13 +1562,13 @@ class HGraphBuilder {
template<>
inline HInstruction* HGraphBuilder::AddUncasted<HDeoptimize>(
- const char* reason, Deoptimizer::BailoutType type) {
+ Deoptimizer::BailoutType type) {
if (type == Deoptimizer::SOFT) {
isolate()->counters()->soft_deopts_requested()->Increment();
if (FLAG_always_opt) return NULL;
}
if (current_block()->IsDeoptimizing()) return NULL;
- HDeoptimize* instr = New<HDeoptimize>(reason, type);
+ HDeoptimize* instr = New<HDeoptimize>(type);
AddInstruction(instr);
if (type == Deoptimizer::SOFT) {
isolate()->counters()->soft_deopts_inserted()->Increment();
@@ -1583,8 +1581,8 @@ inline HInstruction* HGraphBuilder::AddUncasted<HDeoptimize>(
template<>
inline HDeoptimize* HGraphBuilder::Add<HDeoptimize>(
- const char* reason, Deoptimizer::BailoutType type) {
- return static_cast<HDeoptimize*>(AddUncasted<HDeoptimize>(reason, type));
+ Deoptimizer::BailoutType type) {
+ return static_cast<HDeoptimize*>(AddUncasted<HDeoptimize>(type));
}
@@ -1709,7 +1707,7 @@ class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor {
HValue* context() { return environment()->context(); }
- void Bailout(BailoutReason reason);
+ void Bailout(const char* reason);
HBasicBlock* CreateJoin(HBasicBlock* first,
HBasicBlock* second,
@@ -1790,6 +1788,8 @@ class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor {
void VisitDelete(UnaryOperation* expr);
void VisitVoid(UnaryOperation* expr);
void VisitTypeof(UnaryOperation* expr);
+ void VisitSub(UnaryOperation* expr);
+ void VisitBitNot(UnaryOperation* expr);
void VisitNot(UnaryOperation* expr);
void VisitComma(BinaryOperation* expr);
diff --git a/chromium/v8/src/i18n.cc b/chromium/v8/src/i18n.cc
deleted file mode 100644
index 5cfe4c43b2f..00000000000
--- a/chromium/v8/src/i18n.cc
+++ /dev/null
@@ -1,938 +0,0 @@
-// Copyright 2013 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// limitations under the License.
-
-#include "i18n.h"
-
-#include "unicode/calendar.h"
-#include "unicode/coll.h"
-#include "unicode/curramt.h"
-#include "unicode/dcfmtsym.h"
-#include "unicode/decimfmt.h"
-#include "unicode/dtfmtsym.h"
-#include "unicode/dtptngen.h"
-#include "unicode/locid.h"
-#include "unicode/numfmt.h"
-#include "unicode/numsys.h"
-#include "unicode/smpdtfmt.h"
-#include "unicode/timezone.h"
-#include "unicode/uchar.h"
-#include "unicode/ucol.h"
-#include "unicode/ucurr.h"
-#include "unicode/unum.h"
-#include "unicode/uversion.h"
-
-namespace v8 {
-namespace internal {
-
-namespace {
-
-bool ExtractStringSetting(Isolate* isolate,
- Handle<JSObject> options,
- const char* key,
- icu::UnicodeString* setting) {
- Handle<String> str = isolate->factory()->NewStringFromAscii(CStrVector(key));
- MaybeObject* maybe_object = options->GetProperty(*str);
- Object* object;
- if (maybe_object->ToObject(&object) && object->IsString()) {
- v8::String::Utf8Value utf8_string(
- v8::Utils::ToLocal(Handle<String>(String::cast(object))));
- *setting = icu::UnicodeString::fromUTF8(*utf8_string);
- return true;
- }
- return false;
-}
-
-
-bool ExtractIntegerSetting(Isolate* isolate,
- Handle<JSObject> options,
- const char* key,
- int32_t* value) {
- Handle<String> str = isolate->factory()->NewStringFromAscii(CStrVector(key));
- MaybeObject* maybe_object = options->GetProperty(*str);
- Object* object;
- if (maybe_object->ToObject(&object) && object->IsNumber()) {
- object->ToInt32(value);
- return true;
- }
- return false;
-}
-
-
-bool ExtractBooleanSetting(Isolate* isolate,
- Handle<JSObject> options,
- const char* key,
- bool* value) {
- Handle<String> str = isolate->factory()->NewStringFromAscii(CStrVector(key));
- MaybeObject* maybe_object = options->GetProperty(*str);
- Object* object;
- if (maybe_object->ToObject(&object) && object->IsBoolean()) {
- *value = object->BooleanValue();
- return true;
- }
- return false;
-}
-
-
-icu::SimpleDateFormat* CreateICUDateFormat(
- Isolate* isolate,
- const icu::Locale& icu_locale,
- Handle<JSObject> options) {
- // Create time zone as specified by the user. We have to re-create time zone
- // since calendar takes ownership.
- icu::TimeZone* tz = NULL;
- icu::UnicodeString timezone;
- if (ExtractStringSetting(isolate, options, "timeZone", &timezone)) {
- tz = icu::TimeZone::createTimeZone(timezone);
- } else {
- tz = icu::TimeZone::createDefault();
- }
-
- // Create a calendar using locale, and apply time zone to it.
- UErrorCode status = U_ZERO_ERROR;
- icu::Calendar* calendar =
- icu::Calendar::createInstance(tz, icu_locale, status);
-
- // Make formatter from skeleton. Calendar and numbering system are added
- // to the locale as Unicode extension (if they were specified at all).
- icu::SimpleDateFormat* date_format = NULL;
- icu::UnicodeString skeleton;
- if (ExtractStringSetting(isolate, options, "skeleton", &skeleton)) {
- icu::DateTimePatternGenerator* generator =
- icu::DateTimePatternGenerator::createInstance(icu_locale, status);
- icu::UnicodeString pattern;
- if (U_SUCCESS(status)) {
- pattern = generator->getBestPattern(skeleton, status);
- delete generator;
- }
-
- date_format = new icu::SimpleDateFormat(pattern, icu_locale, status);
- if (U_SUCCESS(status)) {
- date_format->adoptCalendar(calendar);
- }
- }
-
- if (U_FAILURE(status)) {
- delete calendar;
- delete date_format;
- date_format = NULL;
- }
-
- return date_format;
-}
-
-
-void SetResolvedDateSettings(Isolate* isolate,
- const icu::Locale& icu_locale,
- icu::SimpleDateFormat* date_format,
- Handle<JSObject> resolved) {
- UErrorCode status = U_ZERO_ERROR;
- icu::UnicodeString pattern;
- date_format->toPattern(pattern);
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("pattern")),
- isolate->factory()->NewStringFromTwoByte(
- Vector<const uint16_t>(
- reinterpret_cast<const uint16_t*>(pattern.getBuffer()),
- pattern.length())),
- NONE,
- kNonStrictMode);
-
- // Set time zone and calendar.
- const icu::Calendar* calendar = date_format->getCalendar();
- const char* calendar_name = calendar->getType();
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("calendar")),
- isolate->factory()->NewStringFromAscii(CStrVector(calendar_name)),
- NONE,
- kNonStrictMode);
-
- const icu::TimeZone& tz = calendar->getTimeZone();
- icu::UnicodeString time_zone;
- tz.getID(time_zone);
-
- icu::UnicodeString canonical_time_zone;
- icu::TimeZone::getCanonicalID(time_zone, canonical_time_zone, status);
- if (U_SUCCESS(status)) {
- if (canonical_time_zone == UNICODE_STRING_SIMPLE("Etc/GMT")) {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("timeZone")),
- isolate->factory()->NewStringFromAscii(CStrVector("UTC")),
- NONE,
- kNonStrictMode);
- } else {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("timeZone")),
- isolate->factory()->NewStringFromTwoByte(
- Vector<const uint16_t>(
- reinterpret_cast<const uint16_t*>(
- canonical_time_zone.getBuffer()),
- canonical_time_zone.length())),
- NONE,
- kNonStrictMode);
- }
- }
-
- // Ugly hack. ICU doesn't expose numbering system in any way, so we have
- // to assume that for given locale NumberingSystem constructor produces the
- // same digits as NumberFormat/Calendar would.
- status = U_ZERO_ERROR;
- icu::NumberingSystem* numbering_system =
- icu::NumberingSystem::createInstance(icu_locale, status);
- if (U_SUCCESS(status)) {
- const char* ns = numbering_system->getName();
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("numberingSystem")),
- isolate->factory()->NewStringFromAscii(CStrVector(ns)),
- NONE,
- kNonStrictMode);
- } else {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("numberingSystem")),
- isolate->factory()->undefined_value(),
- NONE,
- kNonStrictMode);
- }
- delete numbering_system;
-
- // Set the locale
- char result[ULOC_FULLNAME_CAPACITY];
- status = U_ZERO_ERROR;
- uloc_toLanguageTag(
- icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status);
- if (U_SUCCESS(status)) {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("locale")),
- isolate->factory()->NewStringFromAscii(CStrVector(result)),
- NONE,
- kNonStrictMode);
- } else {
- // This would never happen, since we got the locale from ICU.
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("locale")),
- isolate->factory()->NewStringFromAscii(CStrVector("und")),
- NONE,
- kNonStrictMode);
- }
-}
-
-
-template<int internal_fields, EternalHandles::SingletonHandle field>
-Handle<ObjectTemplateInfo> GetEternal(Isolate* isolate) {
- if (isolate->eternal_handles()->Exists(field)) {
- return Handle<ObjectTemplateInfo>::cast(
- isolate->eternal_handles()->GetSingleton(field));
- }
- v8::Local<v8::ObjectTemplate> raw_template(v8::ObjectTemplate::New());
- raw_template->SetInternalFieldCount(internal_fields);
- return Handle<ObjectTemplateInfo>::cast(
- isolate->eternal_handles()->CreateSingleton(
- isolate,
- *v8::Utils::OpenHandle(*raw_template),
- field));
-}
-
-
-icu::DecimalFormat* CreateICUNumberFormat(
- Isolate* isolate,
- const icu::Locale& icu_locale,
- Handle<JSObject> options) {
- // Make formatter from options. Numbering system is added
- // to the locale as Unicode extension (if it was specified at all).
- UErrorCode status = U_ZERO_ERROR;
- icu::DecimalFormat* number_format = NULL;
- icu::UnicodeString style;
- icu::UnicodeString currency;
- if (ExtractStringSetting(isolate, options, "style", &style)) {
- if (style == UNICODE_STRING_SIMPLE("currency")) {
- icu::UnicodeString display;
- ExtractStringSetting(isolate, options, "currency", &currency);
- ExtractStringSetting(isolate, options, "currencyDisplay", &display);
-
-#if (U_ICU_VERSION_MAJOR_NUM == 4) && (U_ICU_VERSION_MINOR_NUM <= 6)
- icu::NumberFormat::EStyles format_style;
- if (display == UNICODE_STRING_SIMPLE("code")) {
- format_style = icu::NumberFormat::kIsoCurrencyStyle;
- } else if (display == UNICODE_STRING_SIMPLE("name")) {
- format_style = icu::NumberFormat::kPluralCurrencyStyle;
- } else {
- format_style = icu::NumberFormat::kCurrencyStyle;
- }
-#else // ICU version is 4.8 or above (we ignore versions below 4.0).
- UNumberFormatStyle format_style;
- if (display == UNICODE_STRING_SIMPLE("code")) {
- format_style = UNUM_CURRENCY_ISO;
- } else if (display == UNICODE_STRING_SIMPLE("name")) {
- format_style = UNUM_CURRENCY_PLURAL;
- } else {
- format_style = UNUM_CURRENCY;
- }
-#endif
-
- number_format = static_cast<icu::DecimalFormat*>(
- icu::NumberFormat::createInstance(icu_locale, format_style, status));
- } else if (style == UNICODE_STRING_SIMPLE("percent")) {
- number_format = static_cast<icu::DecimalFormat*>(
- icu::NumberFormat::createPercentInstance(icu_locale, status));
- if (U_FAILURE(status)) {
- delete number_format;
- return NULL;
- }
- // Make sure 1.1% doesn't go into 2%.
- number_format->setMinimumFractionDigits(1);
- } else {
- // Make a decimal instance by default.
- number_format = static_cast<icu::DecimalFormat*>(
- icu::NumberFormat::createInstance(icu_locale, status));
- }
- }
-
- if (U_FAILURE(status)) {
- delete number_format;
- return NULL;
- }
-
- // Set all options.
- if (!currency.isEmpty()) {
- number_format->setCurrency(currency.getBuffer(), status);
- }
-
- int32_t digits;
- if (ExtractIntegerSetting(
- isolate, options, "minimumIntegerDigits", &digits)) {
- number_format->setMinimumIntegerDigits(digits);
- }
-
- if (ExtractIntegerSetting(
- isolate, options, "minimumFractionDigits", &digits)) {
- number_format->setMinimumFractionDigits(digits);
- }
-
- if (ExtractIntegerSetting(
- isolate, options, "maximumFractionDigits", &digits)) {
- number_format->setMaximumFractionDigits(digits);
- }
-
- bool significant_digits_used = false;
- if (ExtractIntegerSetting(
- isolate, options, "minimumSignificantDigits", &digits)) {
- number_format->setMinimumSignificantDigits(digits);
- significant_digits_used = true;
- }
-
- if (ExtractIntegerSetting(
- isolate, options, "maximumSignificantDigits", &digits)) {
- number_format->setMaximumSignificantDigits(digits);
- significant_digits_used = true;
- }
-
- number_format->setSignificantDigitsUsed(significant_digits_used);
-
- bool grouping;
- if (ExtractBooleanSetting(isolate, options, "useGrouping", &grouping)) {
- number_format->setGroupingUsed(grouping);
- }
-
- // Set rounding mode.
- number_format->setRoundingMode(icu::DecimalFormat::kRoundHalfUp);
-
- return number_format;
-}
-
-
-void SetResolvedNumberSettings(Isolate* isolate,
- const icu::Locale& icu_locale,
- icu::DecimalFormat* number_format,
- Handle<JSObject> resolved) {
- icu::UnicodeString pattern;
- number_format->toPattern(pattern);
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("pattern")),
- isolate->factory()->NewStringFromTwoByte(
- Vector<const uint16_t>(
- reinterpret_cast<const uint16_t*>(pattern.getBuffer()),
- pattern.length())),
- NONE,
- kNonStrictMode);
-
- // Set resolved currency code in options.currency if not empty.
- icu::UnicodeString currency(number_format->getCurrency());
- if (!currency.isEmpty()) {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("currency")),
- isolate->factory()->NewStringFromTwoByte(
- Vector<const uint16_t>(
- reinterpret_cast<const uint16_t*>(currency.getBuffer()),
- currency.length())),
- NONE,
- kNonStrictMode);
- }
-
- // Ugly hack. ICU doesn't expose numbering system in any way, so we have
- // to assume that for given locale NumberingSystem constructor produces the
- // same digits as NumberFormat/Calendar would.
- UErrorCode status = U_ZERO_ERROR;
- icu::NumberingSystem* numbering_system =
- icu::NumberingSystem::createInstance(icu_locale, status);
- if (U_SUCCESS(status)) {
- const char* ns = numbering_system->getName();
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("numberingSystem")),
- isolate->factory()->NewStringFromAscii(CStrVector(ns)),
- NONE,
- kNonStrictMode);
- } else {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("numberingSystem")),
- isolate->factory()->undefined_value(),
- NONE,
- kNonStrictMode);
- }
- delete numbering_system;
-
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("useGrouping")),
- isolate->factory()->ToBoolean(number_format->isGroupingUsed()),
- NONE,
- kNonStrictMode);
-
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(
- CStrVector("minimumIntegerDigits")),
- isolate->factory()->NewNumberFromInt(
- number_format->getMinimumIntegerDigits()),
- NONE,
- kNonStrictMode);
-
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(
- CStrVector("minimumFractionDigits")),
- isolate->factory()->NewNumberFromInt(
- number_format->getMinimumFractionDigits()),
- NONE,
- kNonStrictMode);
-
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(
- CStrVector("maximumFractionDigits")),
- isolate->factory()->NewNumberFromInt(
- number_format->getMaximumFractionDigits()),
- NONE,
- kNonStrictMode);
-
- Handle<String> key = isolate->factory()->NewStringFromAscii(
- CStrVector("minimumSignificantDigits"));
- if (resolved->HasLocalProperty(*key)) {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(
- CStrVector("minimumSignificantDigits")),
- isolate->factory()->NewNumberFromInt(
- number_format->getMinimumSignificantDigits()),
- NONE,
- kNonStrictMode);
- }
-
- key = isolate->factory()->NewStringFromAscii(
- CStrVector("maximumSignificantDigits"));
- if (resolved->HasLocalProperty(*key)) {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(
- CStrVector("maximumSignificantDigits")),
- isolate->factory()->NewNumberFromInt(
- number_format->getMaximumSignificantDigits()),
- NONE,
- kNonStrictMode);
- }
-
- // Set the locale
- char result[ULOC_FULLNAME_CAPACITY];
- status = U_ZERO_ERROR;
- uloc_toLanguageTag(
- icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status);
- if (U_SUCCESS(status)) {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("locale")),
- isolate->factory()->NewStringFromAscii(CStrVector(result)),
- NONE,
- kNonStrictMode);
- } else {
- // This would never happen, since we got the locale from ICU.
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("locale")),
- isolate->factory()->NewStringFromAscii(CStrVector("und")),
- NONE,
- kNonStrictMode);
- }
-}
-
-
-icu::Collator* CreateICUCollator(
- Isolate* isolate,
- const icu::Locale& icu_locale,
- Handle<JSObject> options) {
- // Make collator from options.
- icu::Collator* collator = NULL;
- UErrorCode status = U_ZERO_ERROR;
- collator = icu::Collator::createInstance(icu_locale, status);
-
- if (U_FAILURE(status)) {
- delete collator;
- return NULL;
- }
-
- // Set flags first, and then override them with sensitivity if necessary.
- bool numeric;
- if (ExtractBooleanSetting(isolate, options, "numeric", &numeric)) {
- collator->setAttribute(
- UCOL_NUMERIC_COLLATION, numeric ? UCOL_ON : UCOL_OFF, status);
- }
-
- // Normalization is always on, by the spec. We are free to optimize
- // if the strings are already normalized (but we don't have a way to tell
- // that right now).
- collator->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
-
- icu::UnicodeString case_first;
- if (ExtractStringSetting(isolate, options, "caseFirst", &case_first)) {
- if (case_first == UNICODE_STRING_SIMPLE("upper")) {
- collator->setAttribute(UCOL_CASE_FIRST, UCOL_UPPER_FIRST, status);
- } else if (case_first == UNICODE_STRING_SIMPLE("lower")) {
- collator->setAttribute(UCOL_CASE_FIRST, UCOL_LOWER_FIRST, status);
- } else {
- // Default (false/off).
- collator->setAttribute(UCOL_CASE_FIRST, UCOL_OFF, status);
- }
- }
-
- icu::UnicodeString sensitivity;
- if (ExtractStringSetting(isolate, options, "sensitivity", &sensitivity)) {
- if (sensitivity == UNICODE_STRING_SIMPLE("base")) {
- collator->setStrength(icu::Collator::PRIMARY);
- } else if (sensitivity == UNICODE_STRING_SIMPLE("accent")) {
- collator->setStrength(icu::Collator::SECONDARY);
- } else if (sensitivity == UNICODE_STRING_SIMPLE("case")) {
- collator->setStrength(icu::Collator::PRIMARY);
- collator->setAttribute(UCOL_CASE_LEVEL, UCOL_ON, status);
- } else {
- // variant (default)
- collator->setStrength(icu::Collator::TERTIARY);
- }
- }
-
- bool ignore;
- if (ExtractBooleanSetting(isolate, options, "ignorePunctuation", &ignore)) {
- if (ignore) {
- collator->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, status);
- }
- }
-
- return collator;
-}
-
-
-void SetResolvedCollatorSettings(Isolate* isolate,
- const icu::Locale& icu_locale,
- icu::Collator* collator,
- Handle<JSObject> resolved) {
- UErrorCode status = U_ZERO_ERROR;
-
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("numeric")),
- isolate->factory()->ToBoolean(
- collator->getAttribute(UCOL_NUMERIC_COLLATION, status) == UCOL_ON),
- NONE,
- kNonStrictMode);
-
- switch (collator->getAttribute(UCOL_CASE_FIRST, status)) {
- case UCOL_LOWER_FIRST:
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("caseFirst")),
- isolate->factory()->NewStringFromAscii(CStrVector("lower")),
- NONE,
- kNonStrictMode);
- break;
- case UCOL_UPPER_FIRST:
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("caseFirst")),
- isolate->factory()->NewStringFromAscii(CStrVector("upper")),
- NONE,
- kNonStrictMode);
- break;
- default:
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("caseFirst")),
- isolate->factory()->NewStringFromAscii(CStrVector("false")),
- NONE,
- kNonStrictMode);
- }
-
- switch (collator->getAttribute(UCOL_STRENGTH, status)) {
- case UCOL_PRIMARY: {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("strength")),
- isolate->factory()->NewStringFromAscii(CStrVector("primary")),
- NONE,
- kNonStrictMode);
-
- // case level: true + s1 -> case, s1 -> base.
- if (UCOL_ON == collator->getAttribute(UCOL_CASE_LEVEL, status)) {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("sensitivity")),
- isolate->factory()->NewStringFromAscii(CStrVector("case")),
- NONE,
- kNonStrictMode);
- } else {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("sensitivity")),
- isolate->factory()->NewStringFromAscii(CStrVector("base")),
- NONE,
- kNonStrictMode);
- }
- break;
- }
- case UCOL_SECONDARY:
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("strength")),
- isolate->factory()->NewStringFromAscii(CStrVector("secondary")),
- NONE,
- kNonStrictMode);
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("sensitivity")),
- isolate->factory()->NewStringFromAscii(CStrVector("accent")),
- NONE,
- kNonStrictMode);
- break;
- case UCOL_TERTIARY:
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("strength")),
- isolate->factory()->NewStringFromAscii(CStrVector("tertiary")),
- NONE,
- kNonStrictMode);
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("sensitivity")),
- isolate->factory()->NewStringFromAscii(CStrVector("variant")),
- NONE,
- kNonStrictMode);
- break;
- case UCOL_QUATERNARY:
- // We shouldn't get quaternary and identical from ICU, but if we do
- // put them into variant.
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("strength")),
- isolate->factory()->NewStringFromAscii(CStrVector("quaternary")),
- NONE,
- kNonStrictMode);
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("sensitivity")),
- isolate->factory()->NewStringFromAscii(CStrVector("variant")),
- NONE,
- kNonStrictMode);
- break;
- default:
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("strength")),
- isolate->factory()->NewStringFromAscii(CStrVector("identical")),
- NONE,
- kNonStrictMode);
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("sensitivity")),
- isolate->factory()->NewStringFromAscii(CStrVector("variant")),
- NONE,
- kNonStrictMode);
- }
-
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("ignorePunctuation")),
- isolate->factory()->ToBoolean(collator->getAttribute(
- UCOL_ALTERNATE_HANDLING, status) == UCOL_SHIFTED),
- NONE,
- kNonStrictMode);
-
- // Set the locale
- char result[ULOC_FULLNAME_CAPACITY];
- status = U_ZERO_ERROR;
- uloc_toLanguageTag(
- icu_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status);
- if (U_SUCCESS(status)) {
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("locale")),
- isolate->factory()->NewStringFromAscii(CStrVector(result)),
- NONE,
- kNonStrictMode);
- } else {
- // This would never happen, since we got the locale from ICU.
- JSObject::SetProperty(
- resolved,
- isolate->factory()->NewStringFromAscii(CStrVector("locale")),
- isolate->factory()->NewStringFromAscii(CStrVector("und")),
- NONE,
- kNonStrictMode);
- }
-}
-
-} // namespace
-
-
-// static
-Handle<ObjectTemplateInfo> I18N::GetTemplate(Isolate* isolate) {
- return GetEternal<1, i::EternalHandles::I18N_TEMPLATE_ONE>(isolate);
-}
-
-
-// static
-Handle<ObjectTemplateInfo> I18N::GetTemplate2(Isolate* isolate) {
- return GetEternal<2, i::EternalHandles::I18N_TEMPLATE_TWO>(isolate);
-}
-
-
-// static
-icu::SimpleDateFormat* DateFormat::InitializeDateTimeFormat(
- Isolate* isolate,
- Handle<String> locale,
- Handle<JSObject> options,
- Handle<JSObject> resolved) {
- // Convert BCP47 into ICU locale format.
- UErrorCode status = U_ZERO_ERROR;
- icu::Locale icu_locale;
- char icu_result[ULOC_FULLNAME_CAPACITY];
- int icu_length = 0;
- v8::String::Utf8Value bcp47_locale(v8::Utils::ToLocal(locale));
- if (bcp47_locale.length() != 0) {
- uloc_forLanguageTag(*bcp47_locale, icu_result, ULOC_FULLNAME_CAPACITY,
- &icu_length, &status);
- if (U_FAILURE(status) || icu_length == 0) {
- return NULL;
- }
- icu_locale = icu::Locale(icu_result);
- }
-
- icu::SimpleDateFormat* date_format = CreateICUDateFormat(
- isolate, icu_locale, options);
- if (!date_format) {
- // Remove extensions and try again.
- icu::Locale no_extension_locale(icu_locale.getBaseName());
- date_format = CreateICUDateFormat(isolate, no_extension_locale, options);
-
- // Set resolved settings (pattern, numbering system, calendar).
- SetResolvedDateSettings(
- isolate, no_extension_locale, date_format, resolved);
- } else {
- SetResolvedDateSettings(isolate, icu_locale, date_format, resolved);
- }
-
- return date_format;
-}
-
-
-icu::SimpleDateFormat* DateFormat::UnpackDateFormat(
- Isolate* isolate,
- Handle<JSObject> obj) {
- Handle<String> key =
- isolate->factory()->NewStringFromAscii(CStrVector("dateFormat"));
- if (obj->HasLocalProperty(*key)) {
- return reinterpret_cast<icu::SimpleDateFormat*>(
- obj->GetInternalField(0));
- }
-
- return NULL;
-}
-
-
-void DateFormat::DeleteDateFormat(v8::Isolate* isolate,
- Persistent<v8::Object>* object,
- void* param) {
- // First delete the hidden C++ object.
- delete reinterpret_cast<icu::SimpleDateFormat*>(Handle<JSObject>::cast(
- v8::Utils::OpenPersistent(object))->GetInternalField(0));
-
- // Then dispose of the persistent handle to JS object.
- object->Dispose(isolate);
-}
-
-
-icu::DecimalFormat* NumberFormat::InitializeNumberFormat(
- Isolate* isolate,
- Handle<String> locale,
- Handle<JSObject> options,
- Handle<JSObject> resolved) {
- // Convert BCP47 into ICU locale format.
- UErrorCode status = U_ZERO_ERROR;
- icu::Locale icu_locale;
- char icu_result[ULOC_FULLNAME_CAPACITY];
- int icu_length = 0;
- v8::String::Utf8Value bcp47_locale(v8::Utils::ToLocal(locale));
- if (bcp47_locale.length() != 0) {
- uloc_forLanguageTag(*bcp47_locale, icu_result, ULOC_FULLNAME_CAPACITY,
- &icu_length, &status);
- if (U_FAILURE(status) || icu_length == 0) {
- return NULL;
- }
- icu_locale = icu::Locale(icu_result);
- }
-
- icu::DecimalFormat* number_format =
- CreateICUNumberFormat(isolate, icu_locale, options);
- if (!number_format) {
- // Remove extensions and try again.
- icu::Locale no_extension_locale(icu_locale.getBaseName());
- number_format = CreateICUNumberFormat(
- isolate, no_extension_locale, options);
-
- // Set resolved settings (pattern, numbering system).
- SetResolvedNumberSettings(
- isolate, no_extension_locale, number_format, resolved);
- } else {
- SetResolvedNumberSettings(isolate, icu_locale, number_format, resolved);
- }
-
- return number_format;
-}
-
-
-icu::DecimalFormat* NumberFormat::UnpackNumberFormat(
- Isolate* isolate,
- Handle<JSObject> obj) {
- Handle<String> key =
- isolate->factory()->NewStringFromAscii(CStrVector("numberFormat"));
- if (obj->HasLocalProperty(*key)) {
- return reinterpret_cast<icu::DecimalFormat*>(obj->GetInternalField(0));
- }
-
- return NULL;
-}
-
-
-void NumberFormat::DeleteNumberFormat(v8::Isolate* isolate,
- Persistent<v8::Object>* object,
- void* param) {
- // First delete the hidden C++ object.
- delete reinterpret_cast<icu::DecimalFormat*>(Handle<JSObject>::cast(
- v8::Utils::OpenPersistent(object))->GetInternalField(0));
-
- // Then dispose of the persistent handle to JS object.
- object->Dispose(isolate);
-}
-
-
-icu::Collator* Collator::InitializeCollator(
- Isolate* isolate,
- Handle<String> locale,
- Handle<JSObject> options,
- Handle<JSObject> resolved) {
- // Convert BCP47 into ICU locale format.
- UErrorCode status = U_ZERO_ERROR;
- icu::Locale icu_locale;
- char icu_result[ULOC_FULLNAME_CAPACITY];
- int icu_length = 0;
- v8::String::Utf8Value bcp47_locale(v8::Utils::ToLocal(locale));
- if (bcp47_locale.length() != 0) {
- uloc_forLanguageTag(*bcp47_locale, icu_result, ULOC_FULLNAME_CAPACITY,
- &icu_length, &status);
- if (U_FAILURE(status) || icu_length == 0) {
- return NULL;
- }
- icu_locale = icu::Locale(icu_result);
- }
-
- icu::Collator* collator = CreateICUCollator(isolate, icu_locale, options);
- if (!collator) {
- // Remove extensions and try again.
- icu::Locale no_extension_locale(icu_locale.getBaseName());
- collator = CreateICUCollator(isolate, no_extension_locale, options);
-
- // Set resolved settings (pattern, numbering system).
- SetResolvedCollatorSettings(
- isolate, no_extension_locale, collator, resolved);
- } else {
- SetResolvedCollatorSettings(isolate, icu_locale, collator, resolved);
- }
-
- return collator;
-}
-
-
-icu::Collator* Collator::UnpackCollator(Isolate* isolate,
- Handle<JSObject> obj) {
- Handle<String> key =
- isolate->factory()->NewStringFromAscii(CStrVector("collator"));
- if (obj->HasLocalProperty(*key)) {
- return reinterpret_cast<icu::Collator*>(obj->GetInternalField(0));
- }
-
- return NULL;
-}
-
-
-void Collator::DeleteCollator(v8::Isolate* isolate,
- Persistent<v8::Object>* object,
- void* param) {
- // First delete the hidden C++ object.
- delete reinterpret_cast<icu::Collator*>(Handle<JSObject>::cast(
- v8::Utils::OpenPersistent(object))->GetInternalField(0));
-
- // Then dispose of the persistent handle to JS object.
- object->Dispose(isolate);
-}
-
-} } // namespace v8::internal
diff --git a/chromium/v8/src/i18n.h b/chromium/v8/src/i18n.h
deleted file mode 100644
index 5825ab6c6c7..00000000000
--- a/chromium/v8/src/i18n.h
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2013 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// limitations under the License.
-
-#ifndef V8_I18N_H_
-#define V8_I18N_H_
-
-#include "unicode/uversion.h"
-#include "v8.h"
-
-namespace U_ICU_NAMESPACE {
-class Collator;
-class DecimalFormat;
-class SimpleDateFormat;
-}
-
-namespace v8 {
-namespace internal {
-
-class I18N {
- public:
- // Creates an ObjectTemplate with one internal field.
- static Handle<ObjectTemplateInfo> GetTemplate(Isolate* isolate);
-
- // Creates an ObjectTemplate with two internal fields.
- static Handle<ObjectTemplateInfo> GetTemplate2(Isolate* isolate);
-
- private:
- I18N();
-};
-
-
-class DateFormat {
- public:
- // Create a formatter for the specificied locale and options. Returns the
- // resolved settings for the locale / options.
- static icu::SimpleDateFormat* InitializeDateTimeFormat(
- Isolate* isolate,
- Handle<String> locale,
- Handle<JSObject> options,
- Handle<JSObject> resolved);
-
- // Unpacks date format object from corresponding JavaScript object.
- static icu::SimpleDateFormat* UnpackDateFormat(Isolate* isolate,
- Handle<JSObject> obj);
-
- // Release memory we allocated for the DateFormat once the JS object that
- // holds the pointer gets garbage collected.
- static void DeleteDateFormat(v8::Isolate* isolate,
- Persistent<v8::Object>* object,
- void* param);
- private:
- DateFormat();
-};
-
-
-class NumberFormat {
- public:
- // Create a formatter for the specificied locale and options. Returns the
- // resolved settings for the locale / options.
- static icu::DecimalFormat* InitializeNumberFormat(
- Isolate* isolate,
- Handle<String> locale,
- Handle<JSObject> options,
- Handle<JSObject> resolved);
-
- // Unpacks number format object from corresponding JavaScript object.
- static icu::DecimalFormat* UnpackNumberFormat(Isolate* isolate,
- Handle<JSObject> obj);
-
- // Release memory we allocated for the NumberFormat once the JS object that
- // holds the pointer gets garbage collected.
- static void DeleteNumberFormat(v8::Isolate* isolate,
- Persistent<v8::Object>* object,
- void* param);
- private:
- NumberFormat();
-};
-
-
-class Collator {
- public:
- // Create a collator for the specificied locale and options. Returns the
- // resolved settings for the locale / options.
- static icu::Collator* InitializeCollator(
- Isolate* isolate,
- Handle<String> locale,
- Handle<JSObject> options,
- Handle<JSObject> resolved);
-
- // Unpacks collator object from corresponding JavaScript object.
- static icu::Collator* UnpackCollator(Isolate* isolate, Handle<JSObject> obj);
-
- // Release memory we allocated for the Collator once the JS object that holds
- // the pointer gets garbage collected.
- static void DeleteCollator(v8::Isolate* isolate,
- Persistent<v8::Object>* object,
- void* param);
- private:
- Collator();
-};
-
-} } // namespace v8::internal
-
-#endif // V8_I18N_H_
diff --git a/chromium/v8/src/ia32/assembler-ia32.cc b/chromium/v8/src/ia32/assembler-ia32.cc
index 7bea3730258..e0ae0066552 100644
--- a/chromium/v8/src/ia32/assembler-ia32.cc
+++ b/chromium/v8/src/ia32/assembler-ia32.cc
@@ -1227,10 +1227,6 @@ void Assembler::test_b(Register reg, const Operand& op) {
void Assembler::test(const Operand& op, const Immediate& imm) {
- if (op.is_reg_only()) {
- test(op.reg(), imm);
- return;
- }
EnsureSpace ensure_space(this);
EMIT(0xF7);
emit_operand(eax, op);
diff --git a/chromium/v8/src/ia32/builtins-ia32.cc b/chromium/v8/src/ia32/builtins-ia32.cc
index 59124eab757..b90a17f6c38 100644
--- a/chromium/v8/src/ia32/builtins-ia32.cc
+++ b/chromium/v8/src/ia32/builtins-ia32.cc
@@ -241,7 +241,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
if (FLAG_debug_code) {
__ cmp(esi, edi);
__ Assert(less_equal,
- kUnexpectedNumberOfPreAllocatedPropertyFields);
+ "Unexpected number of pre-allocated property fields.");
}
__ InitializeFieldsWithFiller(ecx, esi, edx);
__ mov(edx, factory->one_pointer_filler_map());
@@ -272,7 +272,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
__ sub(edx, ecx);
// Done if no extra properties are to be allocated.
__ j(zero, &allocated);
- __ Assert(positive, kPropertyAllocationCountFailed);
+ __ Assert(positive, "Property allocation count failed.");
// Scale the number of elements by pointer size and add the header for
// FixedArrays to the start of the next object calculation from above.
@@ -654,7 +654,7 @@ static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm,
__ ret(2 * kPointerSize); // Remove state, eax.
__ bind(&not_tos_eax);
- __ Abort(kNoCasesLeft);
+ __ Abort("no cases left");
}
@@ -1033,9 +1033,9 @@ void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) {
__ mov(ebx, FieldOperand(edi, JSFunction::kPrototypeOrInitialMapOffset));
// Will both indicate a NULL and a Smi.
__ test(ebx, Immediate(kSmiTagMask));
- __ Assert(not_zero, kUnexpectedInitialMapForInternalArrayFunction);
+ __ Assert(not_zero, "Unexpected initial map for InternalArray function");
__ CmpObjectType(ebx, MAP_TYPE, ecx);
- __ Assert(equal, kUnexpectedInitialMapForInternalArrayFunction);
+ __ Assert(equal, "Unexpected initial map for InternalArray function");
}
// Run the native code for the InternalArray function called as a normal
@@ -1062,9 +1062,9 @@ void Builtins::Generate_ArrayCode(MacroAssembler* masm) {
__ mov(ebx, FieldOperand(edi, JSFunction::kPrototypeOrInitialMapOffset));
// Will both indicate a NULL and a Smi.
__ test(ebx, Immediate(kSmiTagMask));
- __ Assert(not_zero, kUnexpectedInitialMapForArrayFunction);
+ __ Assert(not_zero, "Unexpected initial map for Array function");
__ CmpObjectType(ebx, MAP_TYPE, ecx);
- __ Assert(equal, kUnexpectedInitialMapForArrayFunction);
+ __ Assert(equal, "Unexpected initial map for Array function");
}
// Run the native code for the Array function called as a normal function.
@@ -1092,7 +1092,7 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) {
if (FLAG_debug_code) {
__ LoadGlobalFunction(Context::STRING_FUNCTION_INDEX, ecx);
__ cmp(edi, ecx);
- __ Assert(equal, kUnexpectedStringFunction);
+ __ Assert(equal, "Unexpected String function");
}
// Load the first argument into eax and get rid of the rest
@@ -1137,9 +1137,9 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) {
if (FLAG_debug_code) {
__ cmpb(FieldOperand(ecx, Map::kInstanceSizeOffset),
JSValue::kSize >> kPointerSizeLog2);
- __ Assert(equal, kUnexpectedStringWrapperInstanceSize);
+ __ Assert(equal, "Unexpected string wrapper instance size");
__ cmpb(FieldOperand(ecx, Map::kUnusedPropertyFieldsOffset), 0);
- __ Assert(equal, kUnexpectedUnusedPropertiesOfStringWrapper);
+ __ Assert(equal, "Unexpected unused properties of string wrapper");
}
__ mov(FieldOperand(eax, HeapObject::kMapOffset), ecx);
diff --git a/chromium/v8/src/ia32/code-stubs-ia32.cc b/chromium/v8/src/ia32/code-stubs-ia32.cc
index 12cc499a777..5789f49216f 100644
--- a/chromium/v8/src/ia32/code-stubs-ia32.cc
+++ b/chromium/v8/src/ia32/code-stubs-ia32.cc
@@ -250,6 +250,17 @@ void ToBooleanStub::InitializeInterfaceDescriptor(
}
+void UnaryOpStub::InitializeInterfaceDescriptor(
+ Isolate* isolate,
+ CodeStubInterfaceDescriptor* descriptor) {
+ static Register registers[] = { eax };
+ descriptor->register_param_count_ = 1;
+ descriptor->register_params_ = registers;
+ descriptor->deoptimization_handler_ =
+ FUNCTION_ADDR(UnaryOpIC_Miss);
+}
+
+
void StoreGlobalStub::InitializeInterfaceDescriptor(
Isolate* isolate,
CodeStubInterfaceDescriptor* descriptor) {
@@ -500,8 +511,9 @@ void FastNewBlockContextStub::Generate(MacroAssembler* masm) {
Label after_sentinel;
__ JumpIfNotSmi(ecx, &after_sentinel, Label::kNear);
if (FLAG_debug_code) {
+ const char* message = "Expected 0 as a Smi sentinel";
__ cmp(ecx, 0);
- __ Assert(equal, kExpected0AsASmiSentinel);
+ __ Assert(equal, message);
}
__ mov(ecx, GlobalObjectOperand());
__ mov(ecx, FieldOperand(ecx, GlobalObject::kNativeContextOffset));
@@ -3457,9 +3469,9 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
__ mov(ecx, FieldOperand(eax, JSRegExp::kDataOffset));
if (FLAG_debug_code) {
__ test(ecx, Immediate(kSmiTagMask));
- __ Check(not_zero, kUnexpectedTypeForRegExpDataFixedArrayExpected);
+ __ Check(not_zero, "Unexpected type for RegExp data, FixedArray expected");
__ CmpObjectType(ecx, FIXED_ARRAY_TYPE, ebx);
- __ Check(equal, kUnexpectedTypeForRegExpDataFixedArrayExpected);
+ __ Check(equal, "Unexpected type for RegExp data, FixedArray expected");
}
// ecx: RegExp data (FixedArray)
@@ -3819,7 +3831,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
// Assert that we do not have a cons or slice (indirect strings) here.
// Sequential strings have already been ruled out.
__ test_b(ebx, kIsIndirectStringMask);
- __ Assert(zero, kExternalStringExpectedButNotFound);
+ __ Assert(zero, "external string expected, but not found");
}
__ mov(eax, FieldOperand(eax, ExternalString::kResourceDataOffset));
// Move the pointer so that offset-wise, it looks like a sequential string.
@@ -3956,7 +3968,11 @@ void NumberToStringStub::GenerateLookupNumberStringCache(MacroAssembler* masm,
Register scratch = scratch2;
// Load the number string cache.
- __ LoadRoot(number_string_cache, Heap::kNumberStringCacheRootIndex);
+ ExternalReference roots_array_start =
+ ExternalReference::roots_array_start(masm->isolate());
+ __ mov(scratch, Immediate(Heap::kNumberStringCacheRootIndex));
+ __ mov(number_string_cache,
+ Operand::StaticArray(scratch, times_pointer_size, roots_array_start));
// Make the hash mask from the length of the number string cache. It
// contains two elements (number and string) for each cache entry.
__ mov(mask, FieldOperand(number_string_cache, FixedArray::kLengthOffset));
@@ -4310,7 +4326,7 @@ void ICCompareStub::GenerateGeneric(MacroAssembler* masm) {
edi);
}
#ifdef DEBUG
- __ Abort(kUnexpectedFallThroughFromStringComparison);
+ __ Abort("Unexpected fall-through from string comparison");
#endif
__ bind(&check_unequal_objects);
@@ -5006,6 +5022,9 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
static const int8_t kCmpEdiOperandByte2 = BitCast<int8_t, uint8_t>(0x3d);
static const int8_t kMovEaxImmediateByte = BitCast<int8_t, uint8_t>(0xb8);
+ ExternalReference roots_array_start =
+ ExternalReference::roots_array_start(masm->isolate());
+
ASSERT_EQ(object.code(), InstanceofStub::left().code());
ASSERT_EQ(function.code(), InstanceofStub::right().code());
@@ -5025,11 +5044,18 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
if (!HasCallSiteInlineCheck()) {
// Look up the function and the map in the instanceof cache.
Label miss;
- __ CompareRoot(function, scratch, Heap::kInstanceofCacheFunctionRootIndex);
+ __ mov(scratch, Immediate(Heap::kInstanceofCacheFunctionRootIndex));
+ __ cmp(function, Operand::StaticArray(scratch,
+ times_pointer_size,
+ roots_array_start));
__ j(not_equal, &miss, Label::kNear);
- __ CompareRoot(map, scratch, Heap::kInstanceofCacheMapRootIndex);
+ __ mov(scratch, Immediate(Heap::kInstanceofCacheMapRootIndex));
+ __ cmp(map, Operand::StaticArray(
+ scratch, times_pointer_size, roots_array_start));
__ j(not_equal, &miss, Label::kNear);
- __ LoadRoot(eax, Heap::kInstanceofCacheAnswerRootIndex);
+ __ mov(scratch, Immediate(Heap::kInstanceofCacheAnswerRootIndex));
+ __ mov(eax, Operand::StaticArray(
+ scratch, times_pointer_size, roots_array_start));
__ ret((HasArgsInRegisters() ? 0 : 2) * kPointerSize);
__ bind(&miss);
}
@@ -5044,8 +5070,12 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
// Update the global instanceof or call site inlined cache with the current
// map and function. The cached answer will be set when it is known below.
if (!HasCallSiteInlineCheck()) {
- __ StoreRoot(map, scratch, Heap::kInstanceofCacheMapRootIndex);
- __ StoreRoot(function, scratch, Heap::kInstanceofCacheFunctionRootIndex);
+ __ mov(scratch, Immediate(Heap::kInstanceofCacheMapRootIndex));
+ __ mov(Operand::StaticArray(scratch, times_pointer_size, roots_array_start),
+ map);
+ __ mov(scratch, Immediate(Heap::kInstanceofCacheFunctionRootIndex));
+ __ mov(Operand::StaticArray(scratch, times_pointer_size, roots_array_start),
+ function);
} else {
// The constants for the code patching are based on no push instructions
// at the call site.
@@ -5055,9 +5085,9 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
__ sub(scratch, Operand(esp, 1 * kPointerSize));
if (FLAG_debug_code) {
__ cmpb(Operand(scratch, 0), kCmpEdiOperandByte1);
- __ Assert(equal, kInstanceofStubUnexpectedCallSiteCacheCmp1);
+ __ Assert(equal, "InstanceofStub unexpected call site cache (cmp 1)");
__ cmpb(Operand(scratch, 1), kCmpEdiOperandByte2);
- __ Assert(equal, kInstanceofStubUnexpectedCallSiteCacheCmp2);
+ __ Assert(equal, "InstanceofStub unexpected call site cache (cmp 2)");
}
__ mov(scratch, Operand(scratch, kDeltaToCmpImmediate));
__ mov(Operand(scratch, 0), map);
@@ -5079,8 +5109,10 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
__ bind(&is_instance);
if (!HasCallSiteInlineCheck()) {
- __ mov(eax, Immediate(0));
- __ StoreRoot(eax, scratch, Heap::kInstanceofCacheAnswerRootIndex);
+ __ Set(eax, Immediate(0));
+ __ mov(scratch, Immediate(Heap::kInstanceofCacheAnswerRootIndex));
+ __ mov(Operand::StaticArray(scratch,
+ times_pointer_size, roots_array_start), eax);
} else {
// Get return address and delta to inlined map check.
__ mov(eax, factory->true_value());
@@ -5088,7 +5120,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
__ sub(scratch, Operand(esp, 1 * kPointerSize));
if (FLAG_debug_code) {
__ cmpb(Operand(scratch, kDeltaToMov), kMovEaxImmediateByte);
- __ Assert(equal, kInstanceofStubUnexpectedCallSiteCacheMov);
+ __ Assert(equal, "InstanceofStub unexpected call site cache (mov)");
}
__ mov(Operand(scratch, kDeltaToMovImmediate), eax);
if (!ReturnTrueFalseObject()) {
@@ -5099,8 +5131,10 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
__ bind(&is_not_instance);
if (!HasCallSiteInlineCheck()) {
- __ mov(eax, Immediate(Smi::FromInt(1)));
- __ StoreRoot(eax, scratch, Heap::kInstanceofCacheAnswerRootIndex);
+ __ Set(eax, Immediate(Smi::FromInt(1)));
+ __ mov(scratch, Immediate(Heap::kInstanceofCacheAnswerRootIndex));
+ __ mov(Operand::StaticArray(
+ scratch, times_pointer_size, roots_array_start), eax);
} else {
// Get return address and delta to inlined map check.
__ mov(eax, factory->false_value());
@@ -5108,7 +5142,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
__ sub(scratch, Operand(esp, 1 * kPointerSize));
if (FLAG_debug_code) {
__ cmpb(Operand(scratch, kDeltaToMov), kMovEaxImmediateByte);
- __ Assert(equal, kInstanceofStubUnexpectedCallSiteCacheMov);
+ __ Assert(equal, "InstanceofStub unexpected call site cache (mov)");
}
__ mov(Operand(scratch, kDeltaToMovImmediate), eax);
if (!ReturnTrueFalseObject()) {
@@ -5221,7 +5255,7 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) {
void StringCharCodeAtGenerator::GenerateSlow(
MacroAssembler* masm,
const RuntimeCallHelper& call_helper) {
- __ Abort(kUnexpectedFallthroughToCharCodeAtSlowCase);
+ __ Abort("Unexpected fallthrough to CharCodeAt slow case");
// Index is not a smi.
__ bind(&index_not_smi_);
@@ -5271,7 +5305,7 @@ void StringCharCodeAtGenerator::GenerateSlow(
call_helper.AfterCall(masm);
__ jmp(&exit_);
- __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase);
+ __ Abort("Unexpected fallthrough from CharCodeAt slow case");
}
@@ -5306,7 +5340,7 @@ void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) {
void StringCharFromCodeGenerator::GenerateSlow(
MacroAssembler* masm,
const RuntimeCallHelper& call_helper) {
- __ Abort(kUnexpectedFallthroughToCharFromCodeSlowCase);
+ __ Abort("Unexpected fallthrough to CharFromCode slow case");
__ bind(&slow_case_);
call_helper.BeforeCall(masm);
@@ -5318,7 +5352,7 @@ void StringCharFromCodeGenerator::GenerateSlow(
call_helper.AfterCall(masm);
__ jmp(&exit_);
- __ Abort(kUnexpectedFallthroughFromCharFromCodeSlowCase);
+ __ Abort("Unexpected fallthrough from CharFromCode slow case");
}
@@ -5853,7 +5887,11 @@ void StringHelper::GenerateTwoCharacterStringTableProbe(MacroAssembler* masm,
// Load the string table.
Register string_table = c2;
- __ LoadRoot(string_table, Heap::kStringTableRootIndex);
+ ExternalReference roots_array_start =
+ ExternalReference::roots_array_start(masm->isolate());
+ __ mov(scratch, Immediate(Heap::kStringTableRootIndex));
+ __ mov(string_table,
+ Operand::StaticArray(scratch, times_pointer_size, roots_array_start));
// Calculate capacity mask from the string table capacity.
Register mask = scratch2;
@@ -5941,7 +5979,12 @@ void StringHelper::GenerateHashInit(MacroAssembler* masm,
Register scratch) {
// hash = (seed + character) + ((seed + character) << 10);
if (Serializer::enabled()) {
- __ LoadRoot(scratch, Heap::kHashSeedRootIndex);
+ ExternalReference roots_array_start =
+ ExternalReference::roots_array_start(masm->isolate());
+ __ mov(scratch, Immediate(Heap::kHashSeedRootIndex));
+ __ mov(scratch, Operand::StaticArray(scratch,
+ times_pointer_size,
+ roots_array_start));
__ SmiUntag(scratch);
__ add(scratch, character);
__ mov(hash, scratch);
@@ -7439,7 +7482,7 @@ static void CreateArrayDispatch(MacroAssembler* masm) {
}
// If we reached this point there is a problem.
- __ Abort(kUnexpectedElementsKindInArrayConstructor);
+ __ Abort("Unexpected ElementsKind in array constructor");
}
@@ -7502,7 +7545,7 @@ static void CreateArrayDispatchOneArgument(MacroAssembler* masm) {
}
// If we reached this point there is a problem.
- __ Abort(kUnexpectedElementsKindInArrayConstructor);
+ __ Abort("Unexpected ElementsKind in array constructor");
}
@@ -7567,9 +7610,9 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
__ mov(ecx, FieldOperand(edi, JSFunction::kPrototypeOrInitialMapOffset));
// Will both indicate a NULL and a Smi.
__ test(ecx, Immediate(kSmiTagMask));
- __ Assert(not_zero, kUnexpectedInitialMapForArrayFunction);
+ __ Assert(not_zero, "Unexpected initial map for Array function");
__ CmpObjectType(ecx, MAP_TYPE, ecx);
- __ Assert(equal, kUnexpectedInitialMapForArrayFunction);
+ __ Assert(equal, "Unexpected initial map for Array function");
// We should either have undefined in ebx or a valid cell
Label okay_here;
@@ -7577,7 +7620,7 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
__ cmp(ebx, Immediate(undefined_sentinel));
__ j(equal, &okay_here);
__ cmp(FieldOperand(ebx, 0), Immediate(cell_map));
- __ Assert(equal, kExpectedPropertyCellInRegisterEbx);
+ __ Assert(equal, "Expected property cell in register ebx");
__ bind(&okay_here);
}
@@ -7681,9 +7724,9 @@ void InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
__ mov(ecx, FieldOperand(edi, JSFunction::kPrototypeOrInitialMapOffset));
// Will both indicate a NULL and a Smi.
__ test(ecx, Immediate(kSmiTagMask));
- __ Assert(not_zero, kUnexpectedInitialMapForArrayFunction);
+ __ Assert(not_zero, "Unexpected initial map for Array function");
__ CmpObjectType(ecx, MAP_TYPE, ecx);
- __ Assert(equal, kUnexpectedInitialMapForArrayFunction);
+ __ Assert(equal, "Unexpected initial map for Array function");
}
// Figure out the right elements kind
@@ -7702,7 +7745,7 @@ void InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
__ j(equal, &done);
__ cmp(ecx, Immediate(FAST_HOLEY_ELEMENTS));
__ Assert(equal,
- kInvalidElementsKindForInternalArrayOrInternalPackedArray);
+ "Invalid ElementsKind for InternalArray or InternalPackedArray");
__ bind(&done);
}
diff --git a/chromium/v8/src/ia32/codegen-ia32.cc b/chromium/v8/src/ia32/codegen-ia32.cc
index 28b0f4ad82f..f488718dc6d 100644
--- a/chromium/v8/src/ia32/codegen-ia32.cc
+++ b/chromium/v8/src/ia32/codegen-ia32.cc
@@ -779,7 +779,7 @@ void ElementsTransitionGenerator::GenerateSmiToDouble(
if (FLAG_debug_code) {
__ cmp(ebx, masm->isolate()->factory()->the_hole_value());
- __ Assert(equal, kObjectFoundInSmiOnlyArray);
+ __ Assert(equal, "object found in smi-only array");
}
if (CpuFeatures::IsSupported(SSE2)) {
@@ -1011,7 +1011,7 @@ void StringCharLoadGenerator::Generate(MacroAssembler* masm,
// Assert that we do not have a cons or slice (indirect strings) here.
// Sequential strings have already been ruled out.
__ test(result, Immediate(kIsIndirectStringMask));
- __ Assert(zero, kExternalStringExpectedButNotFound);
+ __ Assert(zero, "external string expected, but not found");
}
// Rule out short external strings.
STATIC_CHECK(kShortExternalStringTag != 0);
diff --git a/chromium/v8/src/ia32/debug-ia32.cc b/chromium/v8/src/ia32/debug-ia32.cc
index fd703dcc0c7..68199f905b5 100644
--- a/chromium/v8/src/ia32/debug-ia32.cc
+++ b/chromium/v8/src/ia32/debug-ia32.cc
@@ -128,7 +128,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm,
if ((non_object_regs & (1 << r)) != 0) {
if (FLAG_debug_code) {
__ test(reg, Immediate(0xc0000000));
- __ Assert(zero, kUnableToEncodeValueAsSmi);
+ __ Assert(zero, "Unable to encode value as smi");
}
__ SmiTag(reg);
__ push(reg);
diff --git a/chromium/v8/src/ia32/deoptimizer-ia32.cc b/chromium/v8/src/ia32/deoptimizer-ia32.cc
index a9bd8c50b72..48968064aa3 100644
--- a/chromium/v8/src/ia32/deoptimizer-ia32.cc
+++ b/chromium/v8/src/ia32/deoptimizer-ia32.cc
@@ -625,7 +625,7 @@ void Deoptimizer::EntryGenerator::Generate() {
__ pop(ecx);
if (FLAG_debug_code) {
__ cmp(ecx, Immediate(kAlignmentZapValue));
- __ Assert(equal, kAlignmentMarkerExpected);
+ __ Assert(equal, "alignment marker expected");
}
__ bind(&no_padding);
} else {
diff --git a/chromium/v8/src/ia32/full-codegen-ia32.cc b/chromium/v8/src/ia32/full-codegen-ia32.cc
index f08a269e85b..8f11acc1bec 100644
--- a/chromium/v8/src/ia32/full-codegen-ia32.cc
+++ b/chromium/v8/src/ia32/full-codegen-ia32.cc
@@ -745,9 +745,9 @@ void FullCodeGenerator::EmitDebugCheckDeclarationContext(Variable* variable) {
// Check that we're not inside a with or catch context.
__ mov(ebx, FieldOperand(esi, HeapObject::kMapOffset));
__ cmp(ebx, isolate()->factory()->with_context_map());
- __ Check(not_equal, kDeclarationInWithContext);
+ __ Check(not_equal, "Declaration in with context.");
__ cmp(ebx, isolate()->factory()->catch_context_map());
- __ Check(not_equal, kDeclarationInCatchContext);
+ __ Check(not_equal, "Declaration in catch context.");
}
}
@@ -2169,7 +2169,7 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
__ Push(Smi::FromInt(resume_mode));
__ CallRuntime(Runtime::kResumeJSGeneratorObject, 3);
// Not reached: the runtime call returns elsewhere.
- __ Abort(kGeneratorFailedToResume);
+ __ Abort("Generator failed to resume.");
// Throw error if we attempt to operate on a running generator.
__ bind(&wrong_state);
@@ -2468,7 +2468,7 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
// Check for an uninitialized let binding.
__ mov(edx, location);
__ cmp(edx, isolate()->factory()->the_hole_value());
- __ Check(equal, kLetBindingReInitialization);
+ __ Check(equal, "Let binding re-initialization.");
}
// Perform the assignment.
__ mov(location, eax);
@@ -3430,15 +3430,15 @@ void FullCodeGenerator::EmitSeqStringSetCharCheck(Register string,
Register value,
uint32_t encoding_mask) {
__ test(index, Immediate(kSmiTagMask));
- __ Check(zero, kNonSmiIndex);
+ __ Check(zero, "Non-smi index");
__ test(value, Immediate(kSmiTagMask));
- __ Check(zero, kNonSmiValue);
+ __ Check(zero, "Non-smi value");
__ cmp(index, FieldOperand(string, String::kLengthOffset));
- __ Check(less, kIndexIsTooLarge);
+ __ Check(less, "Index is too large");
__ cmp(index, Immediate(Smi::FromInt(0)));
- __ Check(greater_equal, kIndexIsNegative);
+ __ Check(greater_equal, "Index is negative");
__ push(value);
__ mov(value, FieldOperand(string, HeapObject::kMapOffset));
@@ -3446,7 +3446,7 @@ void FullCodeGenerator::EmitSeqStringSetCharCheck(Register string,
__ and_(value, Immediate(kStringRepresentationMask | kStringEncodingMask));
__ cmp(value, Immediate(encoding_mask));
- __ Check(equal, kUnexpectedStringType);
+ __ Check(equal, "Unexpected string type");
__ pop(value);
}
@@ -3818,7 +3818,7 @@ void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) {
Handle<FixedArray> jsfunction_result_caches(
isolate()->native_context()->jsfunction_result_caches());
if (jsfunction_result_caches->length() <= cache_id) {
- __ Abort(kAttemptToUseUndefinedCache);
+ __ Abort("Attempt to use undefined cache.");
__ mov(eax, isolate()->factory()->undefined_value());
context()->Plug(eax);
return;
@@ -4000,7 +4000,7 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
// scratch, string_length, elements.
if (generate_debug_code_) {
__ cmp(index, array_length);
- __ Assert(less, kNoEmptyArraysHereInEmitFastAsciiArrayJoin);
+ __ Assert(less, "No empty arrays here in EmitFastAsciiArrayJoin");
}
__ bind(&loop);
__ mov(string, FieldOperand(elements,
@@ -4347,12 +4347,34 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
break;
}
+ case Token::SUB:
+ EmitUnaryOperation(expr, "[ UnaryOperation (SUB)");
+ break;
+
+ case Token::BIT_NOT:
+ EmitUnaryOperation(expr, "[ UnaryOperation (BIT_NOT)");
+ break;
+
default:
UNREACHABLE();
}
}
+void FullCodeGenerator::EmitUnaryOperation(UnaryOperation* expr,
+ const char* comment) {
+ Comment cmt(masm_, comment);
+ UnaryOpStub stub(expr->op());
+ // UnaryOpStub expects the argument to be in the
+ // accumulator register eax.
+ VisitForAccumulatorValue(expr->expression());
+ SetSourcePosition(expr->position());
+ CallIC(stub.GetCode(isolate()), RelocInfo::CODE_TARGET,
+ expr->UnaryOperationFeedbackId());
+ context()->Plug(eax);
+}
+
+
void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
Comment cmnt(masm_, "[ CountOperation");
SetSourcePosition(expr->position());
diff --git a/chromium/v8/src/ia32/ic-ia32.cc b/chromium/v8/src/ia32/ic-ia32.cc
index 1e0f14e7687..bf0c80b2b46 100644
--- a/chromium/v8/src/ia32/ic-ia32.cc
+++ b/chromium/v8/src/ia32/ic-ia32.cc
@@ -483,7 +483,7 @@ void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
// based on 32 bits of the map pointer and the string hash.
if (FLAG_debug_code) {
__ cmp(eax, FieldOperand(edx, HeapObject::kMapOffset));
- __ Check(equal, kMapIsNoLongerInEax);
+ __ Check(equal, "Map is no longer in eax.");
}
__ mov(ebx, eax); // Keep the map around for later.
__ shr(eax, KeyedLookupCache::kMapHashShift);
diff --git a/chromium/v8/src/ia32/lithium-codegen-ia32.cc b/chromium/v8/src/ia32/lithium-codegen-ia32.cc
index 19c553bfa51..7a601cf39bc 100644
--- a/chromium/v8/src/ia32/lithium-codegen-ia32.cc
+++ b/chromium/v8/src/ia32/lithium-codegen-ia32.cc
@@ -113,7 +113,7 @@ void LCodeGen::FinishCode(Handle<Code> code) {
}
-void LCodeGen::Abort(BailoutReason reason) {
+void LCodeGen::Abort(const char* reason) {
info()->set_bailout_reason(reason);
status_ = ABORTED;
}
@@ -220,7 +220,7 @@ bool LCodeGen::GeneratePrologue() {
dynamic_frame_alignment_ &&
FLAG_debug_code) {
__ test(esp, Immediate(kPointerSize));
- __ Assert(zero, kFrameIsExpectedToBeAligned);
+ __ Assert(zero, "frame is expected to be aligned");
}
// Reserve space for the stack slots needed by the code.
@@ -355,8 +355,6 @@ bool LCodeGen::GenerateBody() {
if (!CpuFeatures::IsSupported(SSE2)) FlushX87StackIfNecessary(instr);
- RecordAndUpdatePosition(instr->position());
-
instr->CompileToNative(this);
if (!CpuFeatures::IsSupported(SSE2)) {
@@ -424,10 +422,6 @@ bool LCodeGen::GenerateDeferredCode() {
if (deferred_.length() > 0) {
for (int i = 0; !is_aborted() && i < deferred_.length(); i++) {
LDeferredCode* code = deferred_[i];
-
- int pos = instructions_->at(code->instruction_index())->position();
- RecordAndUpdatePosition(pos);
-
Comment(";;; <@%d,#%d> "
"-------------------- Deferred %s --------------------",
code->instruction_index(),
@@ -769,57 +763,37 @@ void LCodeGen::WriteTranslation(LEnvironment* environment,
UNREACHABLE();
}
- int object_index = 0;
- int dematerialized_index = 0;
for (int i = 0; i < translation_size; ++i) {
LOperand* value = environment->values()->at(i);
- AddToTranslation(environment,
- translation,
+
+ // TODO(mstarzinger): Introduce marker operands to indicate that this value
+ // is not present and must be reconstructed from the deoptimizer. Currently
+ // this is only used for the arguments object.
+ if (value == NULL) {
+ int arguments_count = environment->values()->length() - translation_size;
+ translation->BeginArgumentsObject(arguments_count);
+ for (int i = 0; i < arguments_count; ++i) {
+ LOperand* value = environment->values()->at(translation_size + i);
+ AddToTranslation(translation,
+ value,
+ environment->HasTaggedValueAt(translation_size + i),
+ environment->HasUint32ValueAt(translation_size + i));
+ }
+ continue;
+ }
+
+ AddToTranslation(translation,
value,
environment->HasTaggedValueAt(i),
- environment->HasUint32ValueAt(i),
- &object_index,
- &dematerialized_index);
+ environment->HasUint32ValueAt(i));
}
}
-void LCodeGen::AddToTranslation(LEnvironment* environment,
- Translation* translation,
+void LCodeGen::AddToTranslation(Translation* translation,
LOperand* op,
bool is_tagged,
- bool is_uint32,
- int* object_index_pointer,
- int* dematerialized_index_pointer) {
- if (op == LEnvironment::materialization_marker()) {
- int object_index = (*object_index_pointer)++;
- if (environment->ObjectIsDuplicateAt(object_index)) {
- int dupe_of = environment->ObjectDuplicateOfAt(object_index);
- translation->DuplicateObject(dupe_of);
- return;
- }
- int object_length = environment->ObjectLengthAt(object_index);
- if (environment->ObjectIsArgumentsAt(object_index)) {
- translation->BeginArgumentsObject(object_length);
- } else {
- translation->BeginCapturedObject(object_length);
- }
- int dematerialized_index = *dematerialized_index_pointer;
- int env_offset = environment->translation_size() + dematerialized_index;
- *dematerialized_index_pointer += object_length;
- for (int i = 0; i < object_length; ++i) {
- LOperand* value = environment->values()->at(env_offset + i);
- AddToTranslation(environment,
- translation,
- value,
- environment->HasTaggedValueAt(env_offset + i),
- environment->HasUint32ValueAt(env_offset + i),
- object_index_pointer,
- dematerialized_index_pointer);
- }
- return;
- }
-
+ bool is_uint32) {
if (op->IsStackSlot()) {
if (is_tagged) {
translation->StoreStackSlot(op->index());
@@ -908,7 +882,7 @@ void LCodeGen::LoadContextFromDeferred(LOperand* context) {
} else if (context->IsConstantOperand()) {
HConstant* constant =
chunk_->LookupConstant(LConstantOperand::cast(context));
- __ LoadObject(esi, Handle<Object>::cast(constant->handle()));
+ __ LoadHeapObject(esi, Handle<Context>::cast(constant->handle()));
} else {
UNREACHABLE();
}
@@ -974,7 +948,7 @@ void LCodeGen::DeoptimizeIf(Condition cc,
Address entry =
Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type);
if (entry == NULL) {
- Abort(kBailoutWasNotPrepared);
+ Abort("bailout was not prepared");
return;
}
@@ -1010,7 +984,7 @@ void LCodeGen::DeoptimizeIf(Condition cc,
__ bind(&done);
}
- if (info()->ShouldTrapOnDeopt()) {
+ if (FLAG_trap_on_deopt && info()->IsOptimizing()) {
Label done;
if (cc != no_condition) __ j(NegateCondition(cc), &done, Label::kNear);
__ int3();
@@ -1194,14 +1168,6 @@ void LCodeGen::RecordPosition(int position) {
}
-void LCodeGen::RecordAndUpdatePosition(int position) {
- if (position >= 0 && position != old_position_) {
- masm()->positions_recorder()->RecordPosition(position);
- old_position_ = position;
- }
-}
-
-
static const char* LabelType(LLabel* label) {
if (label->is_loop_header()) return " (loop header)";
if (label->is_osr_entry()) return " (OSR entry)";
@@ -1713,9 +1679,8 @@ void LCodeGen::DoBitI(LBitI* instr) {
ASSERT(left->IsRegister());
if (right->IsConstantOperand()) {
- int32_t right_operand =
- ToRepresentation(LConstantOperand::cast(right),
- instr->hydrogen()->representation());
+ int right_operand = ToRepresentation(LConstantOperand::cast(right),
+ instr->hydrogen()->representation());
switch (instr->op()) {
case Token::BIT_AND:
__ and_(ToRegister(left), right_operand);
@@ -1724,11 +1689,7 @@ void LCodeGen::DoBitI(LBitI* instr) {
__ or_(ToRegister(left), right_operand);
break;
case Token::BIT_XOR:
- if (right_operand == int32_t(~0)) {
- __ not_(ToRegister(left));
- } else {
- __ xor_(ToRegister(left), right_operand);
- }
+ __ xor_(ToRegister(left), right_operand);
break;
default:
UNREACHABLE();
@@ -2015,7 +1976,7 @@ void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
static const uint32_t two_byte_seq_type = kSeqStringTag | kTwoByteStringTag;
__ cmp(value, Immediate(encoding == String::ONE_BYTE_ENCODING
? one_byte_seq_type : two_byte_seq_type));
- __ Check(equal, kUnexpectedStringType);
+ __ Check(equal, "Unexpected string type");
__ pop(value);
}
@@ -2029,6 +1990,13 @@ void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
}
+void LCodeGen::DoBitNotI(LBitNotI* instr) {
+ LOperand* input = instr->value();
+ ASSERT(input->Equals(instr->result()));
+ __ not_(ToRegister(input));
+}
+
+
void LCodeGen::DoThrow(LThrow* instr) {
__ push(ToOperand(instr->value()));
ASSERT(ToRegister(instr->context()).is(esi));
@@ -2233,17 +2201,6 @@ void LCodeGen::EmitBranch(InstrType instr, Condition cc) {
}
-template<class InstrType>
-void LCodeGen::EmitFalseBranch(InstrType instr, Condition cc) {
- int false_block = instr->FalseDestination(chunk_);
- if (cc == no_condition) {
- __ jmp(chunk_->GetAssemblyLabel(false_block));
- } else {
- __ j(cc, chunk_->GetAssemblyLabel(false_block));
- }
-}
-
-
void LCodeGen::DoIsNumberAndBranch(LIsNumberAndBranch* instr) {
Representation r = instr->hydrogen()->value()->representation();
if (r.IsSmiOrInteger32() || r.IsDouble()) {
@@ -2494,51 +2451,6 @@ void LCodeGen::DoCmpObjectEqAndBranch(LCmpObjectEqAndBranch* instr) {
}
-void LCodeGen::DoCmpHoleAndBranch(LCmpHoleAndBranch* instr) {
- if (instr->hydrogen()->representation().IsTagged()) {
- Register input_reg = ToRegister(instr->object());
- __ cmp(input_reg, factory()->the_hole_value());
- EmitBranch(instr, equal);
- return;
- }
-
- bool use_sse2 = CpuFeatures::IsSupported(SSE2);
- if (use_sse2) {
- CpuFeatureScope scope(masm(), SSE2);
- XMMRegister input_reg = ToDoubleRegister(instr->object());
- __ ucomisd(input_reg, input_reg);
- EmitFalseBranch(instr, parity_odd);
- } else {
- // Put the value to the top of stack
- X87Register src = ToX87Register(instr->object());
- X87LoadForUsage(src);
- __ fld(0);
- __ fld(0);
- __ FCmp();
- Label ok;
- __ j(parity_even, &ok);
- __ fstp(0);
- EmitFalseBranch(instr, no_condition);
- __ bind(&ok);
- }
-
-
- __ sub(esp, Immediate(kDoubleSize));
- if (use_sse2) {
- CpuFeatureScope scope(masm(), SSE2);
- XMMRegister input_reg = ToDoubleRegister(instr->object());
- __ movdbl(MemOperand(esp, 0), input_reg);
- } else {
- __ fstp_d(MemOperand(esp, 0));
- }
-
- __ add(esp, Immediate(kDoubleSize));
- int offset = sizeof(kHoleNanUpper32);
- __ cmp(MemOperand(esp, -offset), Immediate(kHoleNanUpper32));
- EmitBranch(instr, equal);
-}
-
-
Condition LCodeGen::EmitIsObject(Register input,
Register temp1,
Label* is_not_object,
@@ -2951,7 +2863,7 @@ void LCodeGen::EmitReturn(LReturn* instr, bool dynamic_frame_alignment) {
__ cmp(Operand(esp,
(parameter_count + extra_value_count) * kPointerSize),
Immediate(kAlignmentZapValue));
- __ Assert(equal, kExpectedAlignmentMarker);
+ __ Assert(equal, "expected alignment marker");
}
__ Ret((parameter_count + extra_value_count) * kPointerSize, ecx);
} else {
@@ -2964,7 +2876,7 @@ void LCodeGen::EmitReturn(LReturn* instr, bool dynamic_frame_alignment) {
__ cmp(Operand(esp, reg, times_pointer_size,
extra_value_count * kPointerSize),
Immediate(kAlignmentZapValue));
- __ Assert(equal, kExpectedAlignmentMarker);
+ __ Assert(equal, "expected alignment marker");
}
// emit code to restore stack based on instr->parameter_count()
@@ -3178,6 +3090,47 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
}
+void LCodeGen::EmitLoadFieldOrConstant(Register result,
+ Register object,
+ Handle<Map> type,
+ Handle<String> name,
+ LEnvironment* env) {
+ LookupResult lookup(isolate());
+ type->LookupDescriptor(NULL, *name, &lookup);
+ ASSERT(lookup.IsFound() || lookup.IsCacheable());
+ if (lookup.IsField()) {
+ int index = lookup.GetLocalFieldIndexFromMap(*type);
+ int offset = index * kPointerSize;
+ if (index < 0) {
+ // Negative property indices are in-object properties, indexed
+ // from the end of the fixed part of the object.
+ __ mov(result, FieldOperand(object, offset + type->instance_size()));
+ } else {
+ // Non-negative property indices are in the properties array.
+ __ mov(result, FieldOperand(object, JSObject::kPropertiesOffset));
+ __ mov(result, FieldOperand(result, offset + FixedArray::kHeaderSize));
+ }
+ } else if (lookup.IsConstant()) {
+ Handle<Object> constant(lookup.GetConstantFromMap(*type), isolate());
+ __ LoadObject(result, constant);
+ } else {
+ // Negative lookup.
+ // Check prototypes.
+ Handle<HeapObject> current(HeapObject::cast((*type)->prototype()));
+ Heap* heap = type->GetHeap();
+ while (*current != heap->null_value()) {
+ __ LoadHeapObject(result, current);
+ __ cmp(FieldOperand(result, HeapObject::kMapOffset),
+ Handle<Map>(current->map()));
+ DeoptimizeIf(not_equal, env);
+ current =
+ Handle<HeapObject>(HeapObject::cast(current->map()->prototype()));
+ }
+ __ mov(result, factory()->undefined_value());
+ }
+}
+
+
void LCodeGen::EmitPushTaggedOperand(LOperand* operand) {
ASSERT(!operand->IsDoubleRegister());
if (operand->IsConstantOperand()) {
@@ -3196,6 +3149,68 @@ void LCodeGen::EmitPushTaggedOperand(LOperand* operand) {
}
+// Check for cases where EmitLoadFieldOrConstantFunction needs to walk the
+// prototype chain, which causes unbounded code generation.
+static bool CompactEmit(SmallMapList* list,
+ Handle<String> name,
+ int i,
+ Isolate* isolate) {
+ Handle<Map> map = list->at(i);
+ LookupResult lookup(isolate);
+ map->LookupDescriptor(NULL, *name, &lookup);
+ return lookup.IsField() || lookup.IsConstant();
+}
+
+
+void LCodeGen::DoLoadNamedFieldPolymorphic(LLoadNamedFieldPolymorphic* instr) {
+ Register object = ToRegister(instr->object());
+ Register result = ToRegister(instr->result());
+
+ int map_count = instr->hydrogen()->types()->length();
+ bool need_generic = instr->hydrogen()->need_generic();
+
+ if (map_count == 0 && !need_generic) {
+ DeoptimizeIf(no_condition, instr->environment());
+ return;
+ }
+ Handle<String> name = instr->hydrogen()->name();
+ Label done;
+ bool all_are_compact = true;
+ for (int i = 0; i < map_count; ++i) {
+ if (!CompactEmit(instr->hydrogen()->types(), name, i, isolate())) {
+ all_are_compact = false;
+ break;
+ }
+ }
+ for (int i = 0; i < map_count; ++i) {
+ bool last = (i == map_count - 1);
+ Handle<Map> map = instr->hydrogen()->types()->at(i);
+ Label check_passed;
+ __ CompareMap(object, map, &check_passed);
+ if (last && !need_generic) {
+ DeoptimizeIf(not_equal, instr->environment());
+ __ bind(&check_passed);
+ EmitLoadFieldOrConstant(result, object, map, name, instr->environment());
+ } else {
+ Label next;
+ bool compact = all_are_compact ? true :
+ CompactEmit(instr->hydrogen()->types(), name, i, isolate());
+ __ j(not_equal, &next, compact ? Label::kNear : Label::kFar);
+ __ bind(&check_passed);
+ EmitLoadFieldOrConstant(result, object, map, name, instr->environment());
+ __ jmp(&done, all_are_compact ? Label::kNear : Label::kFar);
+ __ bind(&next);
+ }
+ }
+ if (need_generic) {
+ __ mov(ecx, name);
+ Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
+ CallCode(ic, RelocInfo::CODE_TARGET, instr);
+ }
+ __ bind(&done);
+}
+
+
void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) {
ASSERT(ToRegister(instr->context()).is(esi));
ASSERT(ToRegister(instr->object()).is(edx));
@@ -3432,7 +3447,7 @@ Operand LCodeGen::BuildFastArrayOperand(
if (key->IsConstantOperand()) {
int constant_value = ToInteger32(LConstantOperand::cast(key));
if (constant_value & 0xF0000000) {
- Abort(kArrayIndexConstantValueTooBig);
+ Abort("array index constant value too big");
}
return Operand(elements_pointer_reg,
((constant_value + additional_index) << shift_size)
@@ -3806,7 +3821,7 @@ void LCodeGen::DoMathAbs(LMathAbs* instr) {
__ xorps(scratch, scratch);
__ subsd(scratch, input_reg);
__ pand(input_reg, scratch);
- } else if (r.IsSmiOrInteger32()) {
+ } else if (r.IsInteger32()) {
EmitIntegerMathAbs(instr);
} else { // Tagged case.
DeferredMathAbsTaggedHeapNumber* deferred =
@@ -4148,9 +4163,6 @@ void LCodeGen::DoMathExp(LMathExp* instr) {
void LCodeGen::DoMathTan(LMathTan* instr) {
ASSERT(ToDoubleRegister(instr->result()).is(xmm1));
- // Set the context register to a GC-safe fake value. Clobbering it is
- // OK because this instruction is marked as a call.
- __ Set(esi, Immediate(0));
TranscendentalCacheStub stub(TranscendentalCache::TAN,
TranscendentalCacheStub::UNTAGGED);
CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
@@ -4159,9 +4171,6 @@ void LCodeGen::DoMathTan(LMathTan* instr) {
void LCodeGen::DoMathCos(LMathCos* instr) {
ASSERT(ToDoubleRegister(instr->result()).is(xmm1));
- // Set the context register to a GC-safe fake value. Clobbering it is
- // OK because this instruction is marked as a call.
- __ Set(esi, Immediate(0));
TranscendentalCacheStub stub(TranscendentalCache::COS,
TranscendentalCacheStub::UNTAGGED);
CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
@@ -4170,9 +4179,6 @@ void LCodeGen::DoMathCos(LMathCos* instr) {
void LCodeGen::DoMathSin(LMathSin* instr) {
ASSERT(ToDoubleRegister(instr->result()).is(xmm1));
- // Set the context register to a GC-safe fake value. Clobbering it is
- // OK because this instruction is marked as a call.
- __ Set(esi, Immediate(0));
TranscendentalCacheStub stub(TranscendentalCache::SIN,
TranscendentalCacheStub::UNTAGGED);
CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr);
@@ -5045,6 +5051,13 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
Register reg = ToRegister(instr->result());
+ bool convert_hole = false;
+ HValue* change_input = instr->hydrogen()->value();
+ if (change_input->IsLoadKeyed()) {
+ HLoadKeyed* load = HLoadKeyed::cast(change_input);
+ convert_hole = load->UsesMustHandleHole();
+ }
+
bool use_sse2 = CpuFeatures::IsSupported(SSE2);
if (!use_sse2) {
// Put the value to the top of stack
@@ -5052,6 +5065,54 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
X87LoadForUsage(src);
}
+ Label no_special_nan_handling;
+ Label done;
+ if (convert_hole) {
+ if (use_sse2) {
+ CpuFeatureScope scope(masm(), SSE2);
+ XMMRegister input_reg = ToDoubleRegister(instr->value());
+ __ ucomisd(input_reg, input_reg);
+ } else {
+ __ fld(0);
+ __ fld(0);
+ __ FCmp();
+ }
+
+ __ j(parity_odd, &no_special_nan_handling);
+ __ sub(esp, Immediate(kDoubleSize));
+ if (use_sse2) {
+ CpuFeatureScope scope(masm(), SSE2);
+ XMMRegister input_reg = ToDoubleRegister(instr->value());
+ __ movdbl(MemOperand(esp, 0), input_reg);
+ } else {
+ __ fld(0);
+ __ fstp_d(MemOperand(esp, 0));
+ }
+ __ cmp(MemOperand(esp, sizeof(kHoleNanLower32)),
+ Immediate(kHoleNanUpper32));
+ Label canonicalize;
+ __ j(not_equal, &canonicalize);
+ __ add(esp, Immediate(kDoubleSize));
+ __ mov(reg, factory()->the_hole_value());
+ if (!use_sse2) {
+ __ fstp(0);
+ }
+ __ jmp(&done);
+ __ bind(&canonicalize);
+ __ add(esp, Immediate(kDoubleSize));
+ ExternalReference nan =
+ ExternalReference::address_of_canonical_non_hole_nan();
+ if (use_sse2) {
+ CpuFeatureScope scope(masm(), SSE2);
+ XMMRegister input_reg = ToDoubleRegister(instr->value());
+ __ movdbl(input_reg, Operand::StaticVariable(nan));
+ } else {
+ __ fstp(0);
+ __ fld_d(Operand::StaticVariable(nan));
+ }
+ }
+
+ __ bind(&no_special_nan_handling);
DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr);
if (FLAG_inline_new) {
Register tmp = ToRegister(instr->temp());
@@ -5067,6 +5128,7 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
} else {
__ fstp_d(FieldOperand(reg, HeapNumber::kValueOffset));
}
+ __ bind(&done);
}
@@ -5116,21 +5178,23 @@ void LCodeGen::DoSmiUntag(LSmiUntag* instr) {
void LCodeGen::EmitNumberUntagDNoSSE2(Register input_reg,
Register temp_reg,
X87Register res_reg,
- bool can_convert_undefined_to_nan,
+ bool allow_undefined_as_nan,
bool deoptimize_on_minus_zero,
LEnvironment* env,
NumberUntagDMode mode) {
Label load_smi, done;
X87PrepareToWrite(res_reg);
- if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED) {
+ STATIC_ASSERT(NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE >
+ NUMBER_CANDIDATE_IS_ANY_TAGGED);
+ if (mode >= NUMBER_CANDIDATE_IS_ANY_TAGGED) {
// Smi check.
__ JumpIfSmi(input_reg, &load_smi, Label::kNear);
// Heap number map check.
__ cmp(FieldOperand(input_reg, HeapObject::kMapOffset),
factory()->heap_number_map());
- if (!can_convert_undefined_to_nan) {
+ if (!allow_undefined_as_nan) {
DeoptimizeIf(not_equal, env);
} else {
Label heap_number, convert;
@@ -5138,6 +5202,10 @@ void LCodeGen::EmitNumberUntagDNoSSE2(Register input_reg,
// Convert undefined (or hole) to NaN.
__ cmp(input_reg, factory()->undefined_value());
+ if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE) {
+ __ j(equal, &convert, Label::kNear);
+ __ cmp(input_reg, factory()->the_hole_value());
+ }
DeoptimizeIf(not_equal, env);
__ bind(&convert);
@@ -5184,20 +5252,22 @@ void LCodeGen::EmitNumberUntagDNoSSE2(Register input_reg,
void LCodeGen::EmitNumberUntagD(Register input_reg,
Register temp_reg,
XMMRegister result_reg,
- bool can_convert_undefined_to_nan,
+ bool allow_undefined_as_nan,
bool deoptimize_on_minus_zero,
LEnvironment* env,
NumberUntagDMode mode) {
Label load_smi, done;
- if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED) {
+ STATIC_ASSERT(NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE >
+ NUMBER_CANDIDATE_IS_ANY_TAGGED);
+ if (mode >= NUMBER_CANDIDATE_IS_ANY_TAGGED) {
// Smi check.
__ JumpIfSmi(input_reg, &load_smi, Label::kNear);
// Heap number map check.
__ cmp(FieldOperand(input_reg, HeapObject::kMapOffset),
factory()->heap_number_map());
- if (!can_convert_undefined_to_nan) {
+ if (!allow_undefined_as_nan) {
DeoptimizeIf(not_equal, env);
} else {
Label heap_number, convert;
@@ -5205,6 +5275,10 @@ void LCodeGen::EmitNumberUntagD(Register input_reg,
// Convert undefined (and hole) to NaN.
__ cmp(input_reg, factory()->undefined_value());
+ if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE) {
+ __ j(equal, &convert, Label::kNear);
+ __ cmp(input_reg, factory()->the_hole_value());
+ }
DeoptimizeIf(not_equal, env);
__ bind(&convert);
@@ -5529,9 +5603,16 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) {
instr->hydrogen()->deoptimize_on_minus_zero();
Register temp_reg = deoptimize_on_minus_zero ? ToRegister(temp) : no_reg;
+ NumberUntagDMode mode = NUMBER_CANDIDATE_IS_ANY_TAGGED;
HValue* value = instr->hydrogen()->value();
- NumberUntagDMode mode = value->representation().IsSmi()
- ? NUMBER_CANDIDATE_IS_SMI : NUMBER_CANDIDATE_IS_ANY_TAGGED;
+ if (value->representation().IsSmi()) {
+ mode = NUMBER_CANDIDATE_IS_SMI;
+ } else if (value->IsLoadKeyed()) {
+ HLoadKeyed* load = HLoadKeyed::cast(value);
+ if (load->UsesMustHandleHole()) {
+ mode = NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE;
+ }
+ }
if (CpuFeatures::IsSupported(SSE2)) {
CpuFeatureScope scope(masm(), SSE2);
@@ -5539,7 +5620,7 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) {
EmitNumberUntagD(input_reg,
temp_reg,
result_reg,
- instr->hydrogen()->can_convert_undefined_to_nan(),
+ instr->hydrogen()->allow_undefined_as_nan(),
deoptimize_on_minus_zero,
instr->environment(),
mode);
@@ -5547,7 +5628,7 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) {
EmitNumberUntagDNoSSE2(input_reg,
temp_reg,
ToX87Register(instr->result()),
- instr->hydrogen()->can_convert_undefined_to_nan(),
+ instr->hydrogen()->allow_undefined_as_nan(),
deoptimize_on_minus_zero,
instr->environment(),
mode);
@@ -5712,68 +5793,31 @@ void LCodeGen::DoCheckFunction(LCheckFunction* instr) {
}
-void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) {
- {
- PushSafepointRegistersScope scope(this);
- __ push(object);
- __ xor_(esi, esi);
- __ CallRuntimeSaveDoubles(Runtime::kMigrateInstance);
- RecordSafepointWithRegisters(
- instr->pointer_map(), 1, Safepoint::kNoLazyDeopt);
-
- __ test(eax, Immediate(kSmiTagMask));
- }
- DeoptimizeIf(zero, instr->environment());
+void LCodeGen::DoCheckMapCommon(Register reg,
+ Handle<Map> map,
+ LInstruction* instr) {
+ Label success;
+ __ CompareMap(reg, map, &success);
+ DeoptimizeIf(not_equal, instr->environment());
+ __ bind(&success);
}
void LCodeGen::DoCheckMaps(LCheckMaps* instr) {
- class DeferredCheckMaps: public LDeferredCode {
- public:
- DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object)
- : LDeferredCode(codegen), instr_(instr), object_(object) {
- SetExit(check_maps());
- }
- virtual void Generate() {
- codegen()->DoDeferredInstanceMigration(instr_, object_);
- }
- Label* check_maps() { return &check_maps_; }
- virtual LInstruction* instr() { return instr_; }
- private:
- LCheckMaps* instr_;
- Label check_maps_;
- Register object_;
- };
-
if (instr->hydrogen()->CanOmitMapChecks()) return;
-
LOperand* input = instr->value();
ASSERT(input->IsRegister());
Register reg = ToRegister(input);
- SmallMapList* map_set = instr->hydrogen()->map_set();
-
- DeferredCheckMaps* deferred = NULL;
- if (instr->hydrogen()->has_migration_target()) {
- deferred = new(zone()) DeferredCheckMaps(this, instr, reg);
- __ bind(deferred->check_maps());
- }
-
Label success;
+ SmallMapList* map_set = instr->hydrogen()->map_set();
for (int i = 0; i < map_set->length() - 1; i++) {
Handle<Map> map = map_set->at(i);
__ CompareMap(reg, map, &success);
__ j(equal, &success);
}
-
Handle<Map> map = map_set->last();
- __ CompareMap(reg, map, &success);
- if (instr->hydrogen()->has_migration_target()) {
- __ j(not_equal, deferred->entry());
- } else {
- DeoptimizeIf(not_equal, instr->environment());
- }
-
+ DoCheckMapCommon(reg, map, instr);
__ bind(&success);
}
@@ -5950,6 +5994,22 @@ void LCodeGen::DoClampTToUint8NoSSE2(LClampTToUint8NoSSE2* instr) {
}
+void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
+ if (instr->hydrogen()->CanOmitPrototypeChecks()) return;
+ Register reg = ToRegister(instr->temp());
+
+ ZoneList<Handle<JSObject> >* prototypes = instr->prototypes();
+ ZoneList<Handle<Map> >* maps = instr->maps();
+
+ ASSERT(prototypes->length() == maps->length());
+
+ for (int i = 0; i < prototypes->length(); i++) {
+ __ LoadHeapObject(reg, prototypes->at(i));
+ DoCheckMapCommon(reg, maps->at(i), instr);
+ }
+}
+
+
void LCodeGen::DoAllocate(LAllocate* instr) {
class DeferredAllocate: public LDeferredCode {
public:
@@ -6277,7 +6337,6 @@ void LCodeGen::DoDeoptimize(LDeoptimize* instr) {
if (info()->IsStub() && type == Deoptimizer::EAGER) {
type = Deoptimizer::LAZY;
}
- Comment(";;; deoptimize: %s", instr->hydrogen()->reason());
DeoptimizeIf(no_condition, instr->environment(), type);
}
diff --git a/chromium/v8/src/ia32/lithium-codegen-ia32.h b/chromium/v8/src/ia32/lithium-codegen-ia32.h
index aa8f6c248a3..0beef85f0bc 100644
--- a/chromium/v8/src/ia32/lithium-codegen-ia32.h
+++ b/chromium/v8/src/ia32/lithium-codegen-ia32.h
@@ -71,8 +71,7 @@ class LCodeGen BASE_EMBEDDED {
x87_stack_depth_(0),
safepoints_(info->zone()),
resolver_(this),
- expected_safepoint_kind_(Safepoint::kSimple),
- old_position_(RelocInfo::kNoPosition) {
+ expected_safepoint_kind_(Safepoint::kSimple) {
PopulateDeoptimizationLiteralsWithInlinedFunctions();
}
@@ -164,7 +163,8 @@ class LCodeGen BASE_EMBEDDED {
void DoDeferredAllocate(LAllocate* instr);
void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
Label* map_check);
- void DoDeferredInstanceMigration(LCheckMaps* instr, Register object);
+
+ void DoCheckMapCommon(Register reg, Handle<Map> map, LInstruction* instr);
// Parallel move support.
void DoParallelMove(LParallelMove* move);
@@ -212,7 +212,7 @@ class LCodeGen BASE_EMBEDDED {
int GetStackSlotCount() const { return chunk()->spill_slot_count(); }
- void Abort(BailoutReason reason);
+ void Abort(const char* reason);
void FPRINTF_CHECKING Comment(const char* format, ...);
void AddDeferredCode(LDeferredCode* code) { deferred_.Add(code, zone()); }
@@ -282,13 +282,10 @@ class LCodeGen BASE_EMBEDDED {
void DeoptimizeIf(Condition cc, LEnvironment* environment);
void ApplyCheckIf(Condition cc, LBoundsCheck* check);
- void AddToTranslation(LEnvironment* environment,
- Translation* translation,
+ void AddToTranslation(Translation* translation,
LOperand* op,
bool is_tagged,
- bool is_uint32,
- int* object_index_pointer,
- int* dematerialized_index_pointer);
+ bool is_uint32);
void RegisterDependentCodeForEmbeddedMaps(Handle<Code> code);
void PopulateDeoptimizationData(Handle<Code> code);
int DefineDeoptimizationLiteral(Handle<Object> literal);
@@ -298,7 +295,7 @@ class LCodeGen BASE_EMBEDDED {
Register ToRegister(int index) const;
XMMRegister ToDoubleRegister(int index) const;
X87Register ToX87Register(int index) const;
- int32_t ToRepresentation(LConstantOperand* op, const Representation& r) const;
+ int ToRepresentation(LConstantOperand* op, const Representation& r) const;
int32_t ToInteger32(LConstantOperand* op) const;
ExternalReference ToExternalReference(LConstantOperand* op) const;
@@ -323,14 +320,10 @@ class LCodeGen BASE_EMBEDDED {
Safepoint::DeoptMode mode);
void RecordPosition(int position);
- void RecordAndUpdatePosition(int position);
-
static Condition TokenToCondition(Token::Value op, bool is_unsigned);
void EmitGoto(int block);
template<class InstrType>
void EmitBranch(InstrType instr, Condition cc);
- template<class InstrType>
- void EmitFalseBranch(InstrType instr, Condition cc);
void EmitNumberUntagD(
Register input,
Register temp,
@@ -377,6 +370,12 @@ class LCodeGen BASE_EMBEDDED {
// Caller should branch on equal condition.
void EmitIsConstructCall(Register temp);
+ void EmitLoadFieldOrConstant(Register result,
+ Register object,
+ Handle<Map> type,
+ Handle<String> name,
+ LEnvironment* env);
+
// Emits optimized code to deep-copy the contents of statically known
// object graphs (e.g. object literal boilerplate).
void EmitDeepCopy(Handle<JSObject> object,
@@ -450,8 +449,6 @@ class LCodeGen BASE_EMBEDDED {
Safepoint::Kind expected_safepoint_kind_;
- int old_position_;
-
class PushSafepointRegistersScope BASE_EMBEDDED {
public:
explicit PushSafepointRegistersScope(LCodeGen* codegen)
diff --git a/chromium/v8/src/ia32/lithium-ia32.cc b/chromium/v8/src/ia32/lithium-ia32.cc
index b3158685fcf..ea07c5a1991 100644
--- a/chromium/v8/src/ia32/lithium-ia32.cc
+++ b/chromium/v8/src/ia32/lithium-ia32.cc
@@ -487,7 +487,7 @@ LPlatformChunk* LChunkBuilder::Build() {
}
-void LChunkBuilder::Abort(BailoutReason reason) {
+void LChunkBuilder::Abort(const char* reason) {
info()->set_bailout_reason(reason);
status_ = ABORTED;
}
@@ -645,10 +645,8 @@ LInstruction* LChunkBuilder::DefineFixedDouble(
LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
HEnvironment* hydrogen_env = current_block_->last_environment();
int argument_index_accumulator = 0;
- ZoneList<HValue*> objects_to_materialize(0, zone());
instr->set_environment(CreateEnvironment(hydrogen_env,
- &argument_index_accumulator,
- &objects_to_materialize));
+ &argument_index_accumulator));
return instr;
}
@@ -700,7 +698,7 @@ LUnallocated* LChunkBuilder::TempRegister() {
new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
int vreg = allocator_->GetVirtualRegister();
if (!allocator_->AllocationOk()) {
- Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
+ Abort("Out of virtual registers while trying to allocate temp register.");
vreg = 0;
}
operand->set_virtual_register(vreg);
@@ -940,7 +938,6 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
}
#endif
- instr->set_position(position_);
if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
instr = AssignPointerMap(instr);
}
@@ -956,13 +953,11 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
LEnvironment* LChunkBuilder::CreateEnvironment(
HEnvironment* hydrogen_env,
- int* argument_index_accumulator,
- ZoneList<HValue*>* objects_to_materialize) {
+ int* argument_index_accumulator) {
if (hydrogen_env == NULL) return NULL;
- LEnvironment* outer = CreateEnvironment(hydrogen_env->outer(),
- argument_index_accumulator,
- objects_to_materialize);
+ LEnvironment* outer =
+ CreateEnvironment(hydrogen_env->outer(), argument_index_accumulator);
BailoutId ast_id = hydrogen_env->ast_id();
ASSERT(!ast_id.IsNone() ||
hydrogen_env->frame_type() != JS_FUNCTION);
@@ -977,16 +972,16 @@ LEnvironment* LChunkBuilder::CreateEnvironment(
outer,
hydrogen_env->entry(),
zone());
+ bool needs_arguments_object_materialization = false;
int argument_index = *argument_index_accumulator;
- int object_index = objects_to_materialize->length();
for (int i = 0; i < hydrogen_env->length(); ++i) {
if (hydrogen_env->is_special_index(i)) continue;
- LOperand* op;
HValue* value = hydrogen_env->values()->at(i);
- if (value->IsArgumentsObject() || value->IsCapturedObject()) {
- objects_to_materialize->Add(value, zone());
- op = LEnvironment::materialization_marker();
+ LOperand* op = NULL;
+ if (value->IsArgumentsObject()) {
+ needs_arguments_object_materialization = true;
+ op = NULL;
} else if (value->IsPushArgument()) {
op = new(zone()) LArgument(argument_index++);
} else {
@@ -997,33 +992,15 @@ LEnvironment* LChunkBuilder::CreateEnvironment(
value->CheckFlag(HInstruction::kUint32));
}
- for (int i = object_index; i < objects_to_materialize->length(); ++i) {
- HValue* object_to_materialize = objects_to_materialize->at(i);
- int previously_materialized_object = -1;
- for (int prev = 0; prev < i; ++prev) {
- if (objects_to_materialize->at(prev) == objects_to_materialize->at(i)) {
- previously_materialized_object = prev;
- break;
- }
- }
- int length = object_to_materialize->OperandCount();
- bool is_arguments = object_to_materialize->IsArgumentsObject();
- if (previously_materialized_object >= 0) {
- result->AddDuplicateObject(previously_materialized_object);
- continue;
- } else {
- result->AddNewObject(is_arguments ? length - 1 : length, is_arguments);
- }
- for (int i = is_arguments ? 1 : 0; i < length; ++i) {
- LOperand* op;
- HValue* value = object_to_materialize->OperandAt(i);
- if (value->IsArgumentsObject() || value->IsCapturedObject()) {
- objects_to_materialize->Add(value, zone());
- op = LEnvironment::materialization_marker();
- } else {
- ASSERT(!value->IsPushArgument());
- op = UseAny(value);
- }
+ if (needs_arguments_object_materialization) {
+ HArgumentsObject* arguments = hydrogen_env->entry() == NULL
+ ? graph()->GetArgumentsObject()
+ : hydrogen_env->entry()->arguments_object();
+ ASSERT(arguments->IsLinked());
+ for (int i = 1; i < arguments->arguments_count(); ++i) {
+ HValue* value = arguments->arguments_values()->at(i);
+ ASSERT(!value->IsArgumentsObject() && !value->IsPushArgument());
+ LOperand* op = UseAny(value);
result->AddValue(op,
value->representation(),
value->CheckFlag(HInstruction::kUint32));
@@ -1415,8 +1392,9 @@ LInstruction* LChunkBuilder::DoShl(HShl* instr) {
LInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
if (instr->representation().IsSmiOrInteger32()) {
- ASSERT(instr->left()->representation().Equals(instr->representation()));
- ASSERT(instr->right()->representation().Equals(instr->representation()));
+ ASSERT(instr->left()->representation().IsSmiOrInteger32());
+ ASSERT(instr->right()->representation().Equals(
+ instr->left()->representation()));
LOperand* left = UseRegisterAtStart(instr->BetterLeftOperand());
LOperand* right = UseOrConstantAtStart(instr->BetterRightOperand());
@@ -1436,6 +1414,16 @@ LInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
}
+LInstruction* LChunkBuilder::DoBitNot(HBitNot* instr) {
+ ASSERT(instr->value()->representation().IsInteger32());
+ ASSERT(instr->representation().IsInteger32());
+ if (instr->HasNoUses()) return NULL;
+ LOperand* input = UseRegisterAtStart(instr->value());
+ LBitNotI* result = new(zone()) LBitNotI(input);
+ return DefineSameAsFirst(result);
+}
+
+
LInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
if (instr->representation().IsDouble()) {
return DoArithmeticD(Token::DIV, instr);
@@ -1524,8 +1512,8 @@ LInstruction* LChunkBuilder::DoMod(HMod* instr) {
HValue* left = instr->left();
HValue* right = instr->right();
if (instr->representation().IsSmiOrInteger32()) {
- ASSERT(instr->left()->representation().Equals(instr->representation()));
- ASSERT(instr->right()->representation().Equals(instr->representation()));
+ ASSERT(left->representation().IsSmiOrInteger32());
+ ASSERT(right->representation().Equals(left->representation()));
if (instr->HasPowerOf2Divisor()) {
ASSERT(!right->CanBeZero());
@@ -1601,8 +1589,9 @@ LInstruction* LChunkBuilder::DoMul(HMul* instr) {
LInstruction* LChunkBuilder::DoSub(HSub* instr) {
if (instr->representation().IsSmiOrInteger32()) {
- ASSERT(instr->left()->representation().Equals(instr->representation()));
- ASSERT(instr->right()->representation().Equals(instr->representation()));
+ ASSERT(instr->left()->representation().IsSmiOrInteger32());
+ ASSERT(instr->right()->representation().Equals(
+ instr->left()->representation()));
LOperand* left = UseRegisterAtStart(instr->left());
LOperand* right = UseOrConstantAtStart(instr->right());
LSubI* sub = new(zone()) LSubI(left, right);
@@ -1622,8 +1611,9 @@ LInstruction* LChunkBuilder::DoSub(HSub* instr) {
LInstruction* LChunkBuilder::DoAdd(HAdd* instr) {
if (instr->representation().IsSmiOrInteger32()) {
- ASSERT(instr->left()->representation().Equals(instr->representation()));
- ASSERT(instr->right()->representation().Equals(instr->representation()));
+ ASSERT(instr->left()->representation().IsSmiOrInteger32());
+ ASSERT(instr->right()->representation().Equals(
+ instr->left()->representation()));
// Check to see if it would be advantageous to use an lea instruction rather
// than an add. This is the case when no overflow check is needed and there
// are multiple uses of the add's inputs, so using a 3-register add will
@@ -1656,8 +1646,9 @@ LInstruction* LChunkBuilder::DoMathMinMax(HMathMinMax* instr) {
LOperand* left = NULL;
LOperand* right = NULL;
if (instr->representation().IsSmiOrInteger32()) {
- ASSERT(instr->left()->representation().Equals(instr->representation()));
- ASSERT(instr->right()->representation().Equals(instr->representation()));
+ ASSERT(instr->left()->representation().IsSmiOrInteger32());
+ ASSERT(instr->right()->representation().Equals(
+ instr->left()->representation()));
left = UseRegisterAtStart(instr->BetterLeftOperand());
right = UseOrConstantAtStart(instr->BetterRightOperand());
} else {
@@ -1712,8 +1703,9 @@ LInstruction* LChunkBuilder::DoCompareNumericAndBranch(
HCompareNumericAndBranch* instr) {
Representation r = instr->representation();
if (r.IsSmiOrInteger32()) {
- ASSERT(instr->left()->representation().Equals(r));
- ASSERT(instr->right()->representation().Equals(r));
+ ASSERT(instr->left()->representation().IsSmiOrInteger32());
+ ASSERT(instr->left()->representation().Equals(
+ instr->right()->representation()));
LOperand* left = UseRegisterOrConstantAtStart(instr->left());
LOperand* right = UseOrConstantAtStart(instr->right());
return new(zone()) LCompareNumericAndBranch(left, right);
@@ -1743,13 +1735,6 @@ LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
}
-LInstruction* LChunkBuilder::DoCompareHoleAndBranch(
- HCompareHoleAndBranch* instr) {
- LOperand* object = UseRegisterAtStart(instr->object());
- return new(zone()) LCmpHoleAndBranch(object);
-}
-
-
LInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
ASSERT(instr->value()->representation().IsSmiOrTagged());
LOperand* temp = TempRegister();
@@ -1866,6 +1851,17 @@ LInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
}
+LInstruction* LChunkBuilder::DoNumericConstraint(HNumericConstraint* instr) {
+ return NULL;
+}
+
+
+LInstruction* LChunkBuilder::DoInductionVariableAnnotation(
+ HInductionVariableAnnotation* instr) {
+ return NULL;
+}
+
+
LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
return AssignEnvironment(new(zone()) LBoundsCheck(
UseRegisterOrConstantAtStart(instr->index()),
@@ -2053,6 +2049,15 @@ LInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
}
+LInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) {
+ LUnallocated* temp = NULL;
+ if (!instr->CanOmitPrototypeChecks()) temp = TempRegister();
+ LCheckPrototypeMaps* result = new(zone()) LCheckPrototypeMaps(temp);
+ if (instr->CanOmitPrototypeChecks()) return result;
+ return AssignEnvironment(result);
+}
+
+
LInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) {
// If the target is in new space, we'll emit a global cell compare and so
// want the value in a register. If the target gets promoted before we
@@ -2066,16 +2071,10 @@ LInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) {
LInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
LOperand* value = NULL;
- if (!instr->CanOmitMapChecks()) {
- value = UseRegisterAtStart(instr->value());
- if (instr->has_migration_target()) info()->MarkAsDeferredCalling();
- }
+ if (!instr->CanOmitMapChecks()) value = UseRegisterAtStart(instr->value());
LCheckMaps* result = new(zone()) LCheckMaps(value);
- if (!instr->CanOmitMapChecks()) {
- AssignEnvironment(result);
- if (instr->has_migration_target()) return AssignPointerMap(result);
- }
- return result;
+ if (instr->CanOmitMapChecks()) return result;
+ return AssignEnvironment(result);
}
@@ -2207,6 +2206,25 @@ LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
}
+LInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic(
+ HLoadNamedFieldPolymorphic* instr) {
+ ASSERT(instr->representation().IsTagged());
+ if (instr->need_generic()) {
+ LOperand* context = UseFixed(instr->context(), esi);
+ LOperand* obj = UseFixed(instr->object(), edx);
+ LLoadNamedFieldPolymorphic* result =
+ new(zone()) LLoadNamedFieldPolymorphic(context, obj);
+ return MarkAsCall(DefineFixed(result, eax), instr);
+ } else {
+ LOperand* context = UseAny(instr->context()); // Not actually used.
+ LOperand* obj = UseRegisterAtStart(instr->object());
+ LLoadNamedFieldPolymorphic* result =
+ new(zone()) LLoadNamedFieldPolymorphic(context, obj);
+ return AssignEnvironment(DefineAsRegister(result));
+ }
+}
+
+
LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
LOperand* context = UseFixed(instr->context(), esi);
LOperand* object = UseFixed(instr->object(), edx);
@@ -2400,7 +2418,7 @@ LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
bool is_external_location = instr->access().IsExternalMemory() &&
instr->access().offset() == 0;
bool needs_write_barrier = instr->NeedsWriteBarrier();
- bool needs_write_barrier_for_map = instr->has_transition() &&
+ bool needs_write_barrier_for_map = !instr->transition().is_null() &&
instr->NeedsWriteBarrierForMap();
LOperand* obj;
@@ -2549,7 +2567,7 @@ LInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
int spill_index = chunk()->GetNextSpillIndex(false); // Not double-width.
if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
- Abort(kTooManySpillSlotsNeededForOSR);
+ Abort("Too many spill slots needed for OSR");
spill_index = 0;
}
return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
@@ -2573,12 +2591,6 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
}
-LInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
- // There are no real uses of a captured object.
- return NULL;
-}
-
-
LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
info()->MarkAsRequiresFrame();
LOperand* args = UseRegister(instr->arguments());
diff --git a/chromium/v8/src/ia32/lithium-ia32.h b/chromium/v8/src/ia32/lithium-ia32.h
index 7ae87a08c8d..6b0f9d0a74c 100644
--- a/chromium/v8/src/ia32/lithium-ia32.h
+++ b/chromium/v8/src/ia32/lithium-ia32.h
@@ -50,6 +50,7 @@ class LCodeGen;
V(ArithmeticD) \
V(ArithmeticT) \
V(BitI) \
+ V(BitNotI) \
V(BoundsCheck) \
V(Branch) \
V(CallConstantFunction) \
@@ -67,6 +68,7 @@ class LCodeGen;
V(CheckMaps) \
V(CheckMapValue) \
V(CheckNonSmi) \
+ V(CheckPrototypeMaps) \
V(CheckSmi) \
V(ClampDToUint8) \
V(ClampIToUint8) \
@@ -75,7 +77,6 @@ class LCodeGen;
V(ClassOfTestAndBranch) \
V(CompareNumericAndBranch) \
V(CmpObjectEqAndBranch) \
- V(CmpHoleAndBranch) \
V(CmpMapAndBranch) \
V(CmpT) \
V(ConstantD) \
@@ -128,6 +129,7 @@ class LCodeGen;
V(LoadKeyed) \
V(LoadKeyedGeneric) \
V(LoadNamedField) \
+ V(LoadNamedFieldPolymorphic) \
V(LoadNamedGeneric) \
V(MapEnumLength) \
V(MathAbs) \
@@ -209,10 +211,7 @@ class LInstruction: public ZoneObject {
LInstruction()
: environment_(NULL),
hydrogen_value_(NULL),
- bit_field_(IsCallBits::encode(false)) {
- set_position(RelocInfo::kNoPosition);
- }
-
+ is_call_(false) { }
virtual ~LInstruction() { }
virtual void CompileToNative(LCodeGen* generator) = 0;
@@ -251,28 +250,19 @@ class LInstruction: public ZoneObject {
LPointerMap* pointer_map() const { return pointer_map_.get(); }
bool HasPointerMap() const { return pointer_map_.is_set(); }
- // The 31 bits PositionBits is used to store the int position value. And the
- // position value may be RelocInfo::kNoPosition (-1). The accessor always
- // +1/-1 so that the encoded value of position in bit_field_ is always >= 0
- // and can fit into the 31 bits PositionBits.
- void set_position(int pos) {
- bit_field_ = PositionBits::update(bit_field_, pos + 1);
- }
- int position() { return PositionBits::decode(bit_field_) - 1; }
void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
HValue* hydrogen_value() const { return hydrogen_value_; }
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) { }
- void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); }
- bool IsCall() const { return IsCallBits::decode(bit_field_); }
+ void MarkAsCall() { is_call_ = true; }
// Interface to the register allocator and iterators.
- bool ClobbersTemps() const { return IsCall(); }
- bool ClobbersRegisters() const { return IsCall(); }
+ bool ClobbersTemps() const { return is_call_; }
+ bool ClobbersRegisters() const { return is_call_; }
virtual bool ClobbersDoubleRegisters() const {
- return IsCall() ||
+ return is_call_ ||
(!CpuFeatures::IsSupported(SSE2) &&
// We only have rudimentary X87Stack tracking, thus in general
// cannot handle deoptimization nor phi-nodes.
@@ -305,13 +295,10 @@ class LInstruction: public ZoneObject {
virtual int TempCount() = 0;
virtual LOperand* TempAt(int i) = 0;
- class IsCallBits: public BitField<bool, 0, 1> {};
- class PositionBits: public BitField<int, 1, 31> {};
-
LEnvironment* environment_;
SetOncePointer<LPointerMap> pointer_map_;
HValue* hydrogen_value_;
- int bit_field_;
+ bool is_call_;
};
@@ -864,20 +851,8 @@ class LCmpObjectEqAndBranch: public LControlInstruction<2, 0> {
LOperand* left() { return inputs_[0]; }
LOperand* right() { return inputs_[1]; }
- DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch, "cmp-object-eq-and-branch")
-};
-
-
-class LCmpHoleAndBranch: public LControlInstruction<1, 0> {
- public:
- explicit LCmpHoleAndBranch(LOperand* object) {
- inputs_[0] = object;
- }
-
- LOperand* object() { return inputs_[0]; }
-
- DECLARE_CONCRETE_INSTRUCTION(CmpHoleAndBranch, "cmp-hole-and-branch")
- DECLARE_HYDROGEN_ACCESSOR(CompareHoleAndBranch)
+ DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch,
+ "cmp-object-eq-and-branch")
};
@@ -1383,6 +1358,18 @@ class LThrow: public LTemplateInstruction<0, 2, 0> {
};
+class LBitNotI: public LTemplateInstruction<1, 1, 0> {
+ public:
+ explicit LBitNotI(LOperand* value) {
+ inputs_[0] = value;
+ }
+
+ LOperand* value() { return inputs_[0]; }
+
+ DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i")
+};
+
+
class LAddI: public LTemplateInstruction<1, 2, 0> {
public:
LAddI(LOperand* left, LOperand* right) {
@@ -1536,6 +1523,21 @@ class LLoadNamedField: public LTemplateInstruction<1, 1, 0> {
};
+class LLoadNamedFieldPolymorphic: public LTemplateInstruction<1, 2, 0> {
+ public:
+ LLoadNamedFieldPolymorphic(LOperand* context, LOperand* object) {
+ inputs_[0] = context;
+ inputs_[1] = object;
+ }
+
+ LOperand* context() { return inputs_[0]; }
+ LOperand* object() { return inputs_[1]; }
+
+ DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field-polymorphic")
+ DECLARE_HYDROGEN_ACCESSOR(LoadNamedFieldPolymorphic)
+};
+
+
class LLoadNamedGeneric: public LTemplateInstruction<1, 2, 0> {
public:
LLoadNamedGeneric(LOperand* context, LOperand* object) {
@@ -2234,7 +2236,7 @@ class LStoreNamedField: public LTemplateInstruction<0, 2, 2> {
virtual void PrintDataTo(StringStream* stream);
- Handle<Map> transition() const { return hydrogen()->transition_map(); }
+ Handle<Map> transition() const { return hydrogen()->transition(); }
Representation representation() const {
return hydrogen()->field_representation();
}
@@ -2449,6 +2451,24 @@ class LCheckMaps: public LTemplateInstruction<0, 1, 0> {
};
+class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 1> {
+ public:
+ explicit LCheckPrototypeMaps(LOperand* temp) {
+ temps_[0] = temp;
+ }
+
+ LOperand* temp() { return temps_[0]; }
+
+ DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps")
+ DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps)
+
+ ZoneList<Handle<JSObject> >* prototypes() const {
+ return hydrogen()->prototypes();
+ }
+ ZoneList<Handle<Map> >* maps() const { return hydrogen()->maps(); }
+};
+
+
class LCheckSmi: public LTemplateInstruction<1, 1, 0> {
public:
explicit LCheckSmi(LOperand* value) {
@@ -2780,7 +2800,7 @@ class LChunkBuilder BASE_EMBEDDED {
bool is_done() const { return status_ == DONE; }
bool is_aborted() const { return status_ == ABORTED; }
- void Abort(BailoutReason reason);
+ void Abort(const char* reason);
// Methods for getting operands for Use / Define / Temp.
LUnallocated* ToUnallocated(Register reg);
@@ -2869,8 +2889,7 @@ class LChunkBuilder BASE_EMBEDDED {
CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
- int* argument_index_accumulator,
- ZoneList<HValue*>* objects_to_materialize);
+ int* argument_index_accumulator);
void VisitInstruction(HInstruction* current);
diff --git a/chromium/v8/src/ia32/macro-assembler-ia32.cc b/chromium/v8/src/ia32/macro-assembler-ia32.cc
index 67a7c0d2b49..2ab5a259321 100644
--- a/chromium/v8/src/ia32/macro-assembler-ia32.cc
+++ b/chromium/v8/src/ia32/macro-assembler-ia32.cc
@@ -54,60 +54,6 @@ MacroAssembler::MacroAssembler(Isolate* arg_isolate, void* buffer, int size)
}
-void MacroAssembler::LoadRoot(Register destination, Heap::RootListIndex index) {
- if (isolate()->heap()->RootCanBeTreatedAsConstant(index)) {
- Handle<Object> value(&isolate()->heap()->roots_array_start()[index]);
- mov(destination, value);
- return;
- }
- ExternalReference roots_array_start =
- ExternalReference::roots_array_start(isolate());
- mov(destination, Immediate(index));
- mov(destination, Operand::StaticArray(destination,
- times_pointer_size,
- roots_array_start));
-}
-
-
-void MacroAssembler::StoreRoot(Register source,
- Register scratch,
- Heap::RootListIndex index) {
- ASSERT(Heap::RootCanBeWrittenAfterInitialization(index));
- ExternalReference roots_array_start =
- ExternalReference::roots_array_start(isolate());
- mov(scratch, Immediate(index));
- mov(Operand::StaticArray(scratch, times_pointer_size, roots_array_start),
- source);
-}
-
-
-void MacroAssembler::CompareRoot(Register with,
- Register scratch,
- Heap::RootListIndex index) {
- ExternalReference roots_array_start =
- ExternalReference::roots_array_start(isolate());
- mov(scratch, Immediate(index));
- cmp(with, Operand::StaticArray(scratch,
- times_pointer_size,
- roots_array_start));
-}
-
-
-void MacroAssembler::CompareRoot(Register with, Heap::RootListIndex index) {
- ASSERT(isolate()->heap()->RootCanBeTreatedAsConstant(index));
- Handle<Object> value(&isolate()->heap()->roots_array_start()[index]);
- cmp(with, value);
-}
-
-
-void MacroAssembler::CompareRoot(const Operand& with,
- Heap::RootListIndex index) {
- ASSERT(isolate()->heap()->RootCanBeTreatedAsConstant(index));
- Handle<Object> value(&isolate()->heap()->roots_array_start()[index]);
- cmp(with, value);
-}
-
-
void MacroAssembler::InNewSpace(
Register object,
Register scratch,
@@ -486,6 +432,21 @@ void MacroAssembler::SafePush(const Immediate& x) {
}
+void MacroAssembler::CompareRoot(Register with, Heap::RootListIndex index) {
+ // see ROOT_ACCESSOR macro in factory.h
+ Handle<Object> value(&isolate()->heap()->roots_array_start()[index]);
+ cmp(with, value);
+}
+
+
+void MacroAssembler::CompareRoot(const Operand& with,
+ Heap::RootListIndex index) {
+ // see ROOT_ACCESSOR macro in factory.h
+ Handle<Object> value(&isolate()->heap()->roots_array_start()[index]);
+ cmp(with, value);
+}
+
+
void MacroAssembler::CmpObjectType(Register heap_object,
InstanceType type,
Register map) {
@@ -717,7 +678,7 @@ void MacroAssembler::AssertNumber(Register object) {
JumpIfSmi(object, &ok);
cmp(FieldOperand(object, HeapObject::kMapOffset),
isolate()->factory()->heap_number_map());
- Check(equal, kOperandNotANumber);
+ Check(equal, "Operand not a number");
bind(&ok);
}
}
@@ -726,7 +687,7 @@ void MacroAssembler::AssertNumber(Register object) {
void MacroAssembler::AssertSmi(Register object) {
if (emit_debug_code()) {
test(object, Immediate(kSmiTagMask));
- Check(equal, kOperandIsNotASmi);
+ Check(equal, "Operand is not a smi");
}
}
@@ -734,12 +695,12 @@ void MacroAssembler::AssertSmi(Register object) {
void MacroAssembler::AssertString(Register object) {
if (emit_debug_code()) {
test(object, Immediate(kSmiTagMask));
- Check(not_equal, kOperandIsASmiAndNotAString);
+ Check(not_equal, "Operand is a smi and not a string");
push(object);
mov(object, FieldOperand(object, HeapObject::kMapOffset));
CmpInstanceType(object, FIRST_NONSTRING_TYPE);
pop(object);
- Check(below, kOperandIsNotAString);
+ Check(below, "Operand is not a string");
}
}
@@ -747,12 +708,12 @@ void MacroAssembler::AssertString(Register object) {
void MacroAssembler::AssertName(Register object) {
if (emit_debug_code()) {
test(object, Immediate(kSmiTagMask));
- Check(not_equal, kOperandIsASmiAndNotAName);
+ Check(not_equal, "Operand is a smi and not a name");
push(object);
mov(object, FieldOperand(object, HeapObject::kMapOffset));
CmpInstanceType(object, LAST_NAME_TYPE);
pop(object);
- Check(below_equal, kOperandIsNotAName);
+ Check(below_equal, "Operand is not a name");
}
}
@@ -760,7 +721,7 @@ void MacroAssembler::AssertName(Register object) {
void MacroAssembler::AssertNotSmi(Register object) {
if (emit_debug_code()) {
test(object, Immediate(kSmiTagMask));
- Check(not_equal, kOperandIsASmi);
+ Check(not_equal, "Operand is a smi");
}
}
@@ -773,7 +734,7 @@ void MacroAssembler::EnterFrame(StackFrame::Type type) {
push(Immediate(CodeObject()));
if (emit_debug_code()) {
cmp(Operand(esp, 0), Immediate(isolate()->factory()->undefined_value()));
- Check(not_equal, kCodeObjectNotProperlyPatched);
+ Check(not_equal, "code object not properly patched");
}
}
@@ -782,7 +743,7 @@ void MacroAssembler::LeaveFrame(StackFrame::Type type) {
if (emit_debug_code()) {
cmp(Operand(ebp, StandardFrameConstants::kMarkerOffset),
Immediate(Smi::FromInt(type)));
- Check(equal, kStackFrameTypesMustMatch);
+ Check(equal, "stack frame types must match");
}
leave();
}
@@ -1063,7 +1024,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
// When generating debug code, make sure the lexical context is set.
if (emit_debug_code()) {
cmp(scratch1, Immediate(0));
- Check(not_equal, kWeShouldNotHaveAnEmptyLexicalContext);
+ Check(not_equal, "we should not have an empty lexical context");
}
// Load the native context of the current context.
int offset =
@@ -1076,7 +1037,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
// Read the first word and compare to native_context_map.
cmp(FieldOperand(scratch1, HeapObject::kMapOffset),
isolate()->factory()->native_context_map());
- Check(equal, kJSGlobalObjectNativeContextShouldBeANativeContext);
+ Check(equal, "JSGlobalObject::native_context should be a native context.");
}
// Check if both contexts are the same.
@@ -1095,12 +1056,12 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
// Check the context is a native context.
if (emit_debug_code()) {
cmp(scratch2, isolate()->factory()->null_value());
- Check(not_equal, kJSGlobalProxyContextShouldNotBeNull);
+ Check(not_equal, "JSGlobalProxy::context() should not be null.");
// Read the first word and compare to native_context_map(),
cmp(FieldOperand(scratch2, HeapObject::kMapOffset),
isolate()->factory()->native_context_map());
- Check(equal, kJSGlobalObjectNativeContextShouldBeANativeContext);
+ Check(equal, "JSGlobalObject::native_context should be a native context.");
}
int token_offset = Context::kHeaderSize +
@@ -1245,7 +1206,7 @@ void MacroAssembler::LoadAllocationTopHelper(Register result,
#ifdef DEBUG
// Assert that result actually contains top on entry.
cmp(result, Operand::StaticVariable(allocation_top));
- Check(equal, kUnexpectedAllocationTop);
+ Check(equal, "Unexpected allocation top");
#endif
return;
}
@@ -1265,7 +1226,7 @@ void MacroAssembler::UpdateAllocationTopHelper(Register result_end,
AllocationFlags flags) {
if (emit_debug_code()) {
test(result_end, Immediate(kObjectAlignmentMask));
- Check(zero, kUnalignedAllocationInNewSpace);
+ Check(zero, "Unaligned allocation in new space");
}
ExternalReference allocation_top =
@@ -1497,7 +1458,7 @@ void MacroAssembler::UndoAllocationInNewSpace(Register object) {
and_(object, Immediate(~kHeapObjectTagMask));
#ifdef DEBUG
cmp(object, Operand::StaticVariable(new_space_allocation_top));
- Check(below, kUndoAllocationOfNonAllocatedMemory);
+ Check(below, "Undo allocation of non allocated memory");
#endif
mov(Operand::StaticVariable(new_space_allocation_top), object);
}
@@ -2101,7 +2062,7 @@ void MacroAssembler::CallApiFunctionAndReturn(Address function_address,
// previous handle scope.
mov(Operand::StaticVariable(next_address), ebx);
sub(Operand::StaticVariable(level_address), Immediate(1));
- Assert(above_equal, kInvalidHandleScopeLevel);
+ Assert(above_equal, "Invalid HandleScope level");
cmp(edi, Operand::StaticVariable(limit_address));
j(not_equal, &delete_allocated_handles);
bind(&leave_exit_frame);
@@ -2143,7 +2104,7 @@ void MacroAssembler::CallApiFunctionAndReturn(Address function_address,
cmp(return_value, isolate()->factory()->null_value());
j(equal, &ok, Label::kNear);
- Abort(kAPICallReturnedInvalidObject);
+ Abort("API call returned invalid object");
bind(&ok);
#endif
@@ -2429,7 +2390,7 @@ void MacroAssembler::LoadContext(Register dst, int context_chain_length) {
if (emit_debug_code()) {
cmp(FieldOperand(dst, HeapObject::kMapOffset),
isolate()->factory()->with_context_map());
- Check(not_equal, kVariableResolvedToWithContext);
+ Check(not_equal, "Variable resolved to with context.");
}
}
@@ -2516,7 +2477,7 @@ void MacroAssembler::LoadGlobalFunctionInitialMap(Register function,
CheckMap(map, isolate()->factory()->meta_map(), &fail, DO_SMI_CHECK);
jmp(&ok);
bind(&fail);
- Abort(kGlobalFunctionsMustHaveInitialMap);
+ Abort("Global functions must have initial map");
bind(&ok);
}
}
@@ -2617,7 +2578,7 @@ void MacroAssembler::VerifyX87StackDepth(uint32_t depth) {
and_(eax, kTopMask);
shr(eax, 11);
cmp(eax, Immediate(tos));
- Check(equal, kUnexpectedFPUStackDepthAfterInstruction);
+ Check(equal, "Unexpected FPU stack depth after instruction");
fnclex();
pop(eax);
}
@@ -2700,8 +2661,8 @@ void MacroAssembler::DecrementCounter(Condition cc,
}
-void MacroAssembler::Assert(Condition cc, BailoutReason reason) {
- if (emit_debug_code()) Check(cc, reason);
+void MacroAssembler::Assert(Condition cc, const char* msg) {
+ if (emit_debug_code()) Check(cc, msg);
}
@@ -2718,16 +2679,16 @@ void MacroAssembler::AssertFastElements(Register elements) {
cmp(FieldOperand(elements, HeapObject::kMapOffset),
Immediate(factory->fixed_cow_array_map()));
j(equal, &ok);
- Abort(kJSObjectWithFastElementsMapHasSlowElements);
+ Abort("JSObject with fast elements map has slow elements");
bind(&ok);
}
}
-void MacroAssembler::Check(Condition cc, BailoutReason reason) {
+void MacroAssembler::Check(Condition cc, const char* msg) {
Label L;
j(cc, &L);
- Abort(reason);
+ Abort(msg);
// will not return here
bind(&L);
}
@@ -2748,13 +2709,12 @@ void MacroAssembler::CheckStackAlignment() {
}
-void MacroAssembler::Abort(BailoutReason reason) {
+void MacroAssembler::Abort(const char* msg) {
// We want to pass the msg string like a smi to avoid GC
// problems, however msg is not guaranteed to be aligned
// properly. Instead, we pass an aligned pointer that is
// a proper v8 smi, but also pass the alignment difference
// from the real pointer as a smi.
- const char* msg = GetBailoutReason(reason);
intptr_t p1 = reinterpret_cast<intptr_t>(msg);
intptr_t p0 = (p1 & ~kSmiTagMask) + kSmiTag;
ASSERT(reinterpret_cast<Object*>(p0)->IsSmi());
@@ -3158,7 +3118,7 @@ void MacroAssembler::EnsureNotWhite(
if (emit_debug_code()) {
mov(length, Operand(bitmap_scratch, MemoryChunk::kLiveBytesOffset));
cmp(length, Operand(bitmap_scratch, MemoryChunk::kSizeOffset));
- Check(less_equal, kLiveBytesCountOverflowChunkSize);
+ Check(less_equal, "Live Bytes Count overflow chunk size");
}
bind(&done);
diff --git a/chromium/v8/src/ia32/macro-assembler-ia32.h b/chromium/v8/src/ia32/macro-assembler-ia32.h
index d537b0b2cbd..3bca930d667 100644
--- a/chromium/v8/src/ia32/macro-assembler-ia32.h
+++ b/chromium/v8/src/ia32/macro-assembler-ia32.h
@@ -61,15 +61,6 @@ class MacroAssembler: public Assembler {
// macro assembler.
MacroAssembler(Isolate* isolate, void* buffer, int size);
- // Operations on roots in the root-array.
- void LoadRoot(Register destination, Heap::RootListIndex index);
- void StoreRoot(Register source, Register scratch, Heap::RootListIndex index);
- void CompareRoot(Register with, Register scratch, Heap::RootListIndex index);
- // These methods can only be used with constant roots (i.e. non-writable
- // and not in new space).
- void CompareRoot(Register with, Heap::RootListIndex index);
- void CompareRoot(const Operand& with, Heap::RootListIndex index);
-
// ---------------------------------------------------------------------------
// GC Support
enum RememberedSetFinalAction {
@@ -371,6 +362,10 @@ class MacroAssembler: public Assembler {
void SafeSet(Register dst, const Immediate& x);
void SafePush(const Immediate& x);
+ // Compare against a known root, e.g. undefined, null, true, ...
+ void CompareRoot(Register with, Heap::RootListIndex index);
+ void CompareRoot(const Operand& with, Heap::RootListIndex index);
+
// Compare object type for heap object.
// Incoming register is heap_object and outgoing register is map.
void CmpObjectType(Register heap_object, InstanceType type, Register map);
@@ -812,8 +807,6 @@ class MacroAssembler: public Assembler {
void Drop(int element_count);
void Call(Label* target) { call(target); }
- void Push(Register src) { push(src); }
- void Pop(Register dst) { pop(dst); }
// Emit call to the code we are currently generating.
void CallSelf() {
@@ -851,15 +844,15 @@ class MacroAssembler: public Assembler {
// Calls Abort(msg) if the condition cc is not satisfied.
// Use --debug_code to enable.
- void Assert(Condition cc, BailoutReason reason);
+ void Assert(Condition cc, const char* msg);
void AssertFastElements(Register elements);
// Like Assert(), but always enabled.
- void Check(Condition cc, BailoutReason reason);
+ void Check(Condition cc, const char* msg);
// Print a message to stdout and abort execution.
- void Abort(BailoutReason reason);
+ void Abort(const char* msg);
// Check that the stack is aligned.
void CheckStackAlignment();
diff --git a/chromium/v8/src/ia32/stub-cache-ia32.cc b/chromium/v8/src/ia32/stub-cache-ia32.cc
index df7ad4467f9..123506fa623 100644
--- a/chromium/v8/src/ia32/stub-cache-ia32.cc
+++ b/chromium/v8/src/ia32/stub-cache-ia32.cc
@@ -2479,8 +2479,6 @@ Handle<Code> CallStubCompiler::CompileMathAbsCall(
STATIC_ASSERT(kSmiTag == 0);
__ JumpIfNotSmi(eax, &not_smi);
- // Branchless abs implementation, refer to below:
- // http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs
// Set ebx to 1...1 (== -1) if the argument is negative, or to 0...0
// otherwise.
__ mov(ebx, eax);
@@ -3155,7 +3153,7 @@ Handle<Code> LoadStubCompiler::CompileLoadGlobal(
__ j(equal, &miss);
} else if (FLAG_debug_code) {
__ cmp(eax, factory()->the_hole_value());
- __ Check(not_equal, kDontDeleteCellsCannotContainTheHole);
+ __ Check(not_equal, "DontDelete cells can't contain the hole");
}
HandlerFrontendFooter(name, &success, &miss);
diff --git a/chromium/v8/src/ic.cc b/chromium/v8/src/ic.cc
index 3c22580c2c7..a55160a394e 100644
--- a/chromium/v8/src/ic.cc
+++ b/chromium/v8/src/ic.cc
@@ -390,6 +390,7 @@ void IC::Clear(Address address) {
case Code::KEYED_CALL_IC: return KeyedCallIC::Clear(address, target);
case Code::COMPARE_IC: return CompareIC::Clear(address, target);
case Code::COMPARE_NIL_IC: return CompareNilIC::Clear(address, target);
+ case Code::UNARY_OP_IC:
case Code::BINARY_OP_IC:
case Code::TO_BOOLEAN_IC:
// Clearing these is tricky and does not
@@ -2588,6 +2589,27 @@ void BinaryOpIC::StubInfoToType(int minor_key,
}
+MaybeObject* UnaryOpIC::Transition(Handle<Object> object) {
+ Code::ExtraICState extra_ic_state = target()->extended_extra_ic_state();
+ UnaryOpStub stub(extra_ic_state);
+
+ stub.UpdateStatus(object);
+
+ Handle<Code> code = stub.GetCode(isolate());
+ set_target(*code);
+
+ return stub.Result(object, isolate());
+}
+
+
+RUNTIME_FUNCTION(MaybeObject*, UnaryOpIC_Miss) {
+ HandleScope scope(isolate);
+ Handle<Object> object = args.at<Object>(0);
+ UnaryOpIC ic(isolate);
+ return ic.Transition(object);
+}
+
+
static BinaryOpIC::TypeInfo TypeInfoFromValue(Handle<Object> value,
Token::Value op) {
v8::internal::TypeInfo type = v8::internal::TypeInfo::FromValue(value);
diff --git a/chromium/v8/src/ic.h b/chromium/v8/src/ic.h
index fcf0de58f1a..7820d407ec1 100644
--- a/chromium/v8/src/ic.h
+++ b/chromium/v8/src/ic.h
@@ -714,6 +714,14 @@ class KeyedStoreIC: public StoreIC {
};
+class UnaryOpIC: public IC {
+ public:
+ explicit UnaryOpIC(Isolate* isolate) : IC(EXTRA_CALL_FRAME, isolate) { }
+
+ MUST_USE_RESULT MaybeObject* Transition(Handle<Object> object);
+};
+
+
// Type Recording BinaryOpIC, that records the types of the inputs and outputs.
class BinaryOpIC: public IC {
public:
diff --git a/chromium/v8/src/isolate.cc b/chromium/v8/src/isolate.cc
index 7b77d893f15..61f1e2dcfa5 100644
--- a/chromium/v8/src/isolate.cc
+++ b/chromium/v8/src/isolate.cc
@@ -1774,7 +1774,6 @@ Isolate::Isolate()
inner_pointer_to_code_cache_(NULL),
write_iterator_(NULL),
global_handles_(NULL),
- eternal_handles_(NULL),
context_switcher_(NULL),
thread_manager_(NULL),
fp_stubs_generated_(false),
@@ -1783,6 +1782,7 @@ Isolate::Isolate()
regexp_stack_(NULL),
date_cache_(NULL),
code_stub_interface_descriptors_(NULL),
+ context_exit_happened_(false),
initialized_from_snapshot_(false),
cpu_profiler_(NULL),
heap_profiler_(NULL),
@@ -2052,8 +2052,6 @@ Isolate::~Isolate() {
code_range_ = NULL;
delete global_handles_;
global_handles_ = NULL;
- delete eternal_handles_;
- eternal_handles_ = NULL;
delete string_stream_debug_object_cache_;
string_stream_debug_object_cache_ = NULL;
@@ -2185,7 +2183,6 @@ bool Isolate::Init(Deserializer* des) {
inner_pointer_to_code_cache_ = new InnerPointerToCodeCache(this);
write_iterator_ = new ConsStringIteratorOp();
global_handles_ = new GlobalHandles(this);
- eternal_handles_ = new EternalHandles();
bootstrapper_ = new Bootstrapper(this);
handle_scope_implementer_ = new HandleScopeImplementer(this);
stub_cache_ = new StubCache(this);
diff --git a/chromium/v8/src/isolate.h b/chromium/v8/src/isolate.h
index 401505afdda..c0083177373 100644
--- a/chromium/v8/src/isolate.h
+++ b/chromium/v8/src/isolate.h
@@ -661,9 +661,9 @@ class Isolate {
}
inline Address* handler_address() { return &thread_local_top_.handler_; }
- // Bottom JS entry.
- Address js_entry_sp() {
- return thread_local_top_.js_entry_sp_;
+ // Bottom JS entry (see StackTracer::Trace in sampler.cc).
+ static Address js_entry_sp(ThreadLocalTop* thread) {
+ return thread->js_entry_sp_;
}
inline Address* js_entry_sp_address() {
return &thread_local_top_.js_entry_sp_;
@@ -922,8 +922,6 @@ class Isolate {
GlobalHandles* global_handles() { return global_handles_; }
- EternalHandles* eternal_handles() { return eternal_handles_; }
-
ThreadManager* thread_manager() { return thread_manager_; }
ContextSwitcher* context_switcher() { return context_switcher_; }
@@ -1062,6 +1060,13 @@ class Isolate {
thread_local_top_.top_lookup_result_ = top;
}
+ bool context_exit_happened() {
+ return context_exit_happened_;
+ }
+ void set_context_exit_happened(bool context_exit_happened) {
+ context_exit_happened_ = context_exit_happened;
+ }
+
bool initialized_from_snapshot() { return initialized_from_snapshot_; }
double time_millis_since_init() {
@@ -1290,7 +1295,6 @@ class Isolate {
InnerPointerToCodeCache* inner_pointer_to_code_cache_;
ConsStringIteratorOp* write_iterator_;
GlobalHandles* global_handles_;
- EternalHandles* eternal_handles_;
ContextSwitcher* context_switcher_;
ThreadManager* thread_manager_;
RuntimeState runtime_state_;
@@ -1310,6 +1314,10 @@ class Isolate {
unibrow::Mapping<unibrow::Ecma262Canonicalize> interp_canonicalize_mapping_;
CodeStubInterfaceDescriptor* code_stub_interface_descriptors_;
+ // The garbage collector should be a little more aggressive when it knows
+ // that a context was recently exited.
+ bool context_exit_happened_;
+
// True if this isolate was initialized from a snapshot.
bool initialized_from_snapshot_;
diff --git a/chromium/v8/src/lithium.cc b/chromium/v8/src/lithium.cc
index 790a2182b17..e9c3531e385 100644
--- a/chromium/v8/src/lithium.cc
+++ b/chromium/v8/src/lithium.cc
@@ -425,7 +425,7 @@ LChunk* LChunk::NewChunk(HGraph* graph) {
int values = graph->GetMaximumValueID();
CompilationInfo* info = graph->info();
if (values > LUnallocated::kMaxVirtualRegisters) {
- info->set_bailout_reason(kNotEnoughVirtualRegistersForValues);
+ info->set_bailout_reason("not enough virtual registers for values");
return NULL;
}
LAllocator allocator(values, graph);
@@ -434,7 +434,7 @@ LChunk* LChunk::NewChunk(HGraph* graph) {
if (chunk == NULL) return NULL;
if (!allocator.Allocate(chunk)) {
- info->set_bailout_reason(kNotEnoughVirtualRegistersRegalloc);
+ info->set_bailout_reason("not enough virtual registers (regalloc)");
return NULL;
}
diff --git a/chromium/v8/src/lithium.h b/chromium/v8/src/lithium.h
index f773916485d..1e0784eb98d 100644
--- a/chromium/v8/src/lithium.h
+++ b/chromium/v8/src/lithium.h
@@ -533,7 +533,6 @@ class LEnvironment: public ZoneObject {
values_(value_count, zone),
is_tagged_(value_count, zone),
is_uint32_(value_count, zone),
- object_mapping_(0, zone),
outer_(outer),
entry_(entry),
zone_(zone) { }
@@ -574,38 +573,6 @@ class LEnvironment: public ZoneObject {
return is_uint32_.Contains(index);
}
- void AddNewObject(int length, bool is_arguments) {
- uint32_t encoded = LengthOrDupeField::encode(length) |
- IsArgumentsField::encode(is_arguments) |
- IsDuplicateField::encode(false);
- object_mapping_.Add(encoded, zone());
- }
-
- void AddDuplicateObject(int dupe_of) {
- uint32_t encoded = LengthOrDupeField::encode(dupe_of) |
- IsDuplicateField::encode(true);
- object_mapping_.Add(encoded, zone());
- }
-
- int ObjectDuplicateOfAt(int index) {
- ASSERT(ObjectIsDuplicateAt(index));
- return LengthOrDupeField::decode(object_mapping_[index]);
- }
-
- int ObjectLengthAt(int index) {
- ASSERT(!ObjectIsDuplicateAt(index));
- return LengthOrDupeField::decode(object_mapping_[index]);
- }
-
- bool ObjectIsArgumentsAt(int index) {
- ASSERT(!ObjectIsDuplicateAt(index));
- return IsArgumentsField::decode(object_mapping_[index]);
- }
-
- bool ObjectIsDuplicateAt(int index) {
- return IsDuplicateField::decode(object_mapping_[index]);
- }
-
void Register(int deoptimization_index,
int translation_index,
int pc_offset) {
@@ -620,14 +587,6 @@ class LEnvironment: public ZoneObject {
void PrintTo(StringStream* stream);
- // Marker value indicating a de-materialized object.
- static LOperand* materialization_marker() { return NULL; }
-
- // Encoding used for the object_mapping map below.
- class LengthOrDupeField : public BitField<int, 0, 30> { };
- class IsArgumentsField : public BitField<bool, 30, 1> { };
- class IsDuplicateField : public BitField<bool, 31, 1> { };
-
private:
Handle<JSFunction> closure_;
FrameType frame_type_;
@@ -644,10 +603,6 @@ class LEnvironment: public ZoneObject {
ZoneList<LOperand*> values_;
GrowableBitVector is_tagged_;
GrowableBitVector is_uint32_;
-
- // Map with encoded information about materialization_marker operands.
- ZoneList<uint32_t> object_mapping_;
-
LEnvironment* outer_;
HEnterInlined* entry_;
Zone* zone_;
@@ -799,7 +754,8 @@ int StackSlotOffset(int index);
enum NumberUntagDMode {
NUMBER_CANDIDATE_IS_SMI,
- NUMBER_CANDIDATE_IS_ANY_TAGGED
+ NUMBER_CANDIDATE_IS_ANY_TAGGED,
+ NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE
};
diff --git a/chromium/v8/src/liveedit.cc b/chromium/v8/src/liveedit.cc
index 406510a3b86..859cf2b94f3 100644
--- a/chromium/v8/src/liveedit.cc
+++ b/chromium/v8/src/liveedit.cc
@@ -1290,7 +1290,6 @@ MaybeObject* LiveEdit::ReplaceFunctionCode(
if (code_scope_info->IsFixedArray()) {
shared_info->set_scope_info(ScopeInfo::cast(*code_scope_info));
}
- shared_info->DisableOptimization(kLiveEdit);
}
if (shared_info->debug_info()->IsDebugInfo()) {
diff --git a/chromium/v8/src/log.cc b/chromium/v8/src/log.cc
index a1e5a6752b1..b89c2bfba01 100644
--- a/chromium/v8/src/log.cc
+++ b/chromium/v8/src/log.cc
@@ -1644,6 +1644,7 @@ void Logger::LogCodeObject(Object* object) {
case Code::FUNCTION:
case Code::OPTIMIZED_FUNCTION:
return; // We log this later using LogCompiledFunctions.
+ case Code::UNARY_OP_IC: // fall through
case Code::BINARY_OP_IC: // fall through
case Code::COMPARE_IC: // fall through
case Code::COMPARE_NIL_IC: // fall through
diff --git a/chromium/v8/src/mark-compact.cc b/chromium/v8/src/mark-compact.cc
index 0e842670280..91da8a0117a 100644
--- a/chromium/v8/src/mark-compact.cc
+++ b/chromium/v8/src/mark-compact.cc
@@ -431,8 +431,8 @@ void MarkCompactCollector::CollectGarbage() {
heap()->weak_embedded_maps_verification_enabled()) {
VerifyWeakEmbeddedMapsInOptimizedCode();
}
- if (FLAG_collect_maps && FLAG_omit_map_checks_for_leaf_maps) {
- VerifyOmittedMapChecks();
+ if (FLAG_collect_maps && FLAG_omit_prototype_checks_for_leaf_maps) {
+ VerifyOmittedPrototypeChecks();
}
#endif
@@ -503,13 +503,13 @@ void MarkCompactCollector::VerifyWeakEmbeddedMapsInOptimizedCode() {
}
-void MarkCompactCollector::VerifyOmittedMapChecks() {
+void MarkCompactCollector::VerifyOmittedPrototypeChecks() {
HeapObjectIterator iterator(heap()->map_space());
for (HeapObject* obj = iterator.Next();
obj != NULL;
obj = iterator.Next()) {
Map* map = Map::cast(obj);
- map->VerifyOmittedMapChecks();
+ map->VerifyOmittedPrototypeChecks();
}
}
#endif // VERIFY_HEAP
diff --git a/chromium/v8/src/mark-compact.h b/chromium/v8/src/mark-compact.h
index ee845a08370..16e49e10295 100644
--- a/chromium/v8/src/mark-compact.h
+++ b/chromium/v8/src/mark-compact.h
@@ -638,7 +638,7 @@ class MarkCompactCollector {
static void VerifyMarkbitsAreClean(PagedSpace* space);
static void VerifyMarkbitsAreClean(NewSpace* space);
void VerifyWeakEmbeddedMapsInOptimizedCode();
- void VerifyOmittedMapChecks();
+ void VerifyOmittedPrototypeChecks();
#endif
// Sweep a single page from the given space conservatively.
diff --git a/chromium/v8/src/messages.js b/chromium/v8/src/messages.js
index 2debbf86540..b586d24882b 100644
--- a/chromium/v8/src/messages.js
+++ b/chromium/v8/src/messages.js
@@ -228,18 +228,16 @@ function NoSideEffectToString(obj) {
}
}
}
- if (CanBeSafelyTreatedAsAnErrorObject(obj)) {
- return %_CallFunction(obj, ErrorToString);
- }
+ if (IsNativeErrorObject(obj)) return %_CallFunction(obj, ErrorToString);
return %_CallFunction(obj, ObjectToString);
}
-// To determine whether we can safely stringify an object using ErrorToString
-// without the risk of side-effects, we need to check whether the object is
-// either an instance of a native error type (via '%_ClassOf'), or has $Error
-// in its prototype chain and hasn't overwritten 'toString' with something
-// strange and unusual.
-function CanBeSafelyTreatedAsAnErrorObject(obj) {
+
+// To check if something is a native error we need to check the
+// concrete native error types. It is not sufficient to use instanceof
+// since it possible to create an object that has Error.prototype on
+// its prototype chain. This is the case for DOMException for example.
+function IsNativeErrorObject(obj) {
switch (%_ClassOf(obj)) {
case 'Error':
case 'EvalError':
@@ -250,9 +248,7 @@ function CanBeSafelyTreatedAsAnErrorObject(obj) {
case 'URIError':
return true;
}
-
- var objToString = %GetDataProperty(obj, "toString");
- return obj instanceof $Error && objToString === ErrorToString;
+ return false;
}
@@ -261,7 +257,7 @@ function CanBeSafelyTreatedAsAnErrorObject(obj) {
// the error to string method. This is to avoid leaking error
// objects between script tags in a browser setting.
function ToStringCheckErrorObject(obj) {
- if (CanBeSafelyTreatedAsAnErrorObject(obj)) {
+ if (IsNativeErrorObject(obj)) {
return %_CallFunction(obj, ErrorToString);
} else {
return ToString(obj);
diff --git a/chromium/v8/src/mips/assembler-mips.h b/chromium/v8/src/mips/assembler-mips.h
index cb0896a8ded..8d533b36f40 100644
--- a/chromium/v8/src/mips/assembler-mips.h
+++ b/chromium/v8/src/mips/assembler-mips.h
@@ -358,11 +358,6 @@ class Operand BASE_EMBEDDED {
// Return true if this is a register operand.
INLINE(bool is_reg() const);
- inline int32_t immediate() const {
- ASSERT(!is_reg());
- return imm32_;
- }
-
Register rm() const { return rm_; }
private:
diff --git a/chromium/v8/src/mips/builtins-mips.cc b/chromium/v8/src/mips/builtins-mips.cc
index d424cbc7261..3f5dca00096 100644
--- a/chromium/v8/src/mips/builtins-mips.cc
+++ b/chromium/v8/src/mips/builtins-mips.cc
@@ -123,10 +123,10 @@ void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) {
// Initial map for the builtin InternalArray functions should be maps.
__ lw(a2, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset));
__ And(t0, a2, Operand(kSmiTagMask));
- __ Assert(ne, kUnexpectedInitialMapForInternalArrayFunction,
+ __ Assert(ne, "Unexpected initial map for InternalArray function",
t0, Operand(zero_reg));
__ GetObjectType(a2, a3, t0);
- __ Assert(eq, kUnexpectedInitialMapForInternalArrayFunction,
+ __ Assert(eq, "Unexpected initial map for InternalArray function",
t0, Operand(MAP_TYPE));
}
@@ -153,10 +153,10 @@ void Builtins::Generate_ArrayCode(MacroAssembler* masm) {
// Initial map for the builtin Array functions should be maps.
__ lw(a2, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset));
__ And(t0, a2, Operand(kSmiTagMask));
- __ Assert(ne, kUnexpectedInitialMapForArrayFunction1,
+ __ Assert(ne, "Unexpected initial map for Array function (1)",
t0, Operand(zero_reg));
__ GetObjectType(a2, a3, t0);
- __ Assert(eq, kUnexpectedInitialMapForArrayFunction2,
+ __ Assert(eq, "Unexpected initial map for Array function (2)",
t0, Operand(MAP_TYPE));
}
@@ -185,7 +185,7 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) {
Register function = a1;
if (FLAG_debug_code) {
__ LoadGlobalFunction(Context::STRING_FUNCTION_INDEX, a2);
- __ Assert(eq, kUnexpectedStringFunction, function, Operand(a2));
+ __ Assert(eq, "Unexpected String function", function, Operand(a2));
}
// Load the first arguments in a0 and get rid of the rest.
@@ -231,10 +231,10 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) {
__ LoadGlobalFunctionInitialMap(function, map, t0);
if (FLAG_debug_code) {
__ lbu(t0, FieldMemOperand(map, Map::kInstanceSizeOffset));
- __ Assert(eq, kUnexpectedStringWrapperInstanceSize,
+ __ Assert(eq, "Unexpected string wrapper instance size",
t0, Operand(JSValue::kSize >> kPointerSizeLog2));
__ lbu(t0, FieldMemOperand(map, Map::kUnusedPropertyFieldsOffset));
- __ Assert(eq, kUnexpectedUnusedPropertiesOfStringWrapper,
+ __ Assert(eq, "Unexpected unused properties of string wrapper",
t0, Operand(zero_reg));
}
__ sw(map, FieldMemOperand(v0, HeapObject::kMapOffset));
@@ -489,7 +489,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
__ addu(a0, t5, t0);
// a0: offset of first field after pre-allocated fields
if (FLAG_debug_code) {
- __ Assert(le, kUnexpectedNumberOfPreAllocatedPropertyFields,
+ __ Assert(le, "Unexpected number of pre-allocated property fields.",
a0, Operand(t6));
}
__ InitializeFieldsWithFiller(t5, a0, t7);
@@ -522,7 +522,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
// Done if no extra properties are to be allocated.
__ Branch(&allocated, eq, a3, Operand(zero_reg));
- __ Assert(greater_equal, kPropertyAllocationCountFailed,
+ __ Assert(greater_equal, "Property allocation count failed.",
a3, Operand(zero_reg));
// Scale the number of elements by pointer size and add the header for
@@ -569,7 +569,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
__ LoadRoot(t7, Heap::kUndefinedValueRootIndex);
} else if (FLAG_debug_code) {
__ LoadRoot(t8, Heap::kUndefinedValueRootIndex);
- __ Assert(eq, kUndefinedValueNotLoaded, t7, Operand(t8));
+ __ Assert(eq, "Undefined value not loaded.", t7, Operand(t8));
}
__ jmp(&entry);
__ bind(&loop);
diff --git a/chromium/v8/src/mips/code-stubs-mips.cc b/chromium/v8/src/mips/code-stubs-mips.cc
index 8a03a9a31a5..0e1b224eadf 100644
--- a/chromium/v8/src/mips/code-stubs-mips.cc
+++ b/chromium/v8/src/mips/code-stubs-mips.cc
@@ -247,6 +247,17 @@ void InternalArrayNArgumentsConstructorStub::InitializeInterfaceDescriptor(
}
+void UnaryOpStub::InitializeInterfaceDescriptor(
+ Isolate* isolate,
+ CodeStubInterfaceDescriptor* descriptor) {
+ static Register registers[] = { a0 };
+ descriptor->register_param_count_ = 1;
+ descriptor->register_params_ = registers;
+ descriptor->deoptimization_handler_ =
+ FUNCTION_ADDR(UnaryOpIC_Miss);
+}
+
+
void StoreGlobalStub::InitializeInterfaceDescriptor(
Isolate* isolate,
CodeStubInterfaceDescriptor* descriptor) {
@@ -509,7 +520,8 @@ void FastNewBlockContextStub::Generate(MacroAssembler* masm) {
Label after_sentinel;
__ JumpIfNotSmi(a3, &after_sentinel);
if (FLAG_debug_code) {
- __ Assert(eq, kExpected0AsASmiSentinel, a3, Operand(zero_reg));
+ const char* message = "Expected 0 as a Smi sentinel";
+ __ Assert(eq, message, a3, Operand(zero_reg));
}
__ lw(a3, GlobalObjectOperand());
__ lw(a3, FieldMemOperand(a3, GlobalObject::kNativeContextOffset));
@@ -667,7 +679,7 @@ void FloatingPointHelper::LoadNumber(MacroAssembler* masm,
Label* not_number) {
__ AssertRootValue(heap_number_map,
Heap::kHeapNumberMapRootIndex,
- kHeapNumberMapRegisterClobbered);
+ "HeapNumberMap register clobbered.");
Label is_smi, done;
@@ -717,7 +729,7 @@ void FloatingPointHelper::ConvertNumberToInt32(MacroAssembler* masm,
Label* not_number) {
__ AssertRootValue(heap_number_map,
Heap::kHeapNumberMapRootIndex,
- kHeapNumberMapRegisterClobbered);
+ "HeapNumberMap register clobbered.");
Label done;
Label not_in_int32_range;
@@ -794,7 +806,7 @@ void FloatingPointHelper::LoadNumberAsInt32Double(MacroAssembler* masm,
__ bind(&obj_is_not_smi);
__ AssertRootValue(heap_number_map,
Heap::kHeapNumberMapRootIndex,
- kHeapNumberMapRegisterClobbered);
+ "HeapNumberMap register clobbered.");
__ JumpIfNotHeapNumber(object, heap_number_map, scratch1, not_int32);
// Load the number.
@@ -841,7 +853,7 @@ void FloatingPointHelper::LoadNumberAsInt32(MacroAssembler* masm,
__ AssertRootValue(heap_number_map,
Heap::kHeapNumberMapRootIndex,
- kHeapNumberMapRegisterClobbered);
+ "HeapNumberMap register clobbered.");
__ JumpIfNotHeapNumber(object, heap_number_map, scratch1, &maybe_undefined);
@@ -4267,12 +4279,12 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
if (FLAG_debug_code) {
__ And(t0, regexp_data, Operand(kSmiTagMask));
__ Check(nz,
- kUnexpectedTypeForRegExpDataFixedArrayExpected,
+ "Unexpected type for RegExp data, FixedArray expected",
t0,
Operand(zero_reg));
__ GetObjectType(regexp_data, a0, a0);
__ Check(eq,
- kUnexpectedTypeForRegExpDataFixedArrayExpected,
+ "Unexpected type for RegExp data, FixedArray expected",
a0,
Operand(FIXED_ARRAY_TYPE));
}
@@ -4627,7 +4639,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
// Sequential strings have already been ruled out.
__ And(at, a0, Operand(kIsIndirectStringMask));
__ Assert(eq,
- kExternalStringExpectedButNotFound,
+ "external string expected, but not found",
at,
Operand(zero_reg));
}
@@ -5008,7 +5020,7 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) {
void StringCharCodeAtGenerator::GenerateSlow(
MacroAssembler* masm,
const RuntimeCallHelper& call_helper) {
- __ Abort(kUnexpectedFallthroughToCharCodeAtSlowCase);
+ __ Abort("Unexpected fallthrough to CharCodeAt slow case");
// Index is not a smi.
__ bind(&index_not_smi_);
@@ -5057,7 +5069,7 @@ void StringCharCodeAtGenerator::GenerateSlow(
call_helper.AfterCall(masm);
__ jmp(&exit_);
- __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase);
+ __ Abort("Unexpected fallthrough from CharCodeAt slow case");
}
@@ -5094,7 +5106,7 @@ void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) {
void StringCharFromCodeGenerator::GenerateSlow(
MacroAssembler* masm,
const RuntimeCallHelper& call_helper) {
- __ Abort(kUnexpectedFallthroughToCharFromCodeSlowCase);
+ __ Abort("Unexpected fallthrough to CharFromCode slow case");
__ bind(&slow_case_);
call_helper.BeforeCall(masm);
@@ -5105,7 +5117,7 @@ void StringCharFromCodeGenerator::GenerateSlow(
call_helper.AfterCall(masm);
__ Branch(&exit_);
- __ Abort(kUnexpectedFallthroughFromCharFromCodeSlowCase);
+ __ Abort("Unexpected fallthrough from CharFromCode slow case");
}
@@ -5160,7 +5172,7 @@ void StringHelper::GenerateCopyCharactersLong(MacroAssembler* masm,
// that it is.
__ And(scratch4, dest, Operand(kPointerAlignmentMask));
__ Check(eq,
- kDestinationOfCopyNotAligned,
+ "Destination of copy not aligned.",
scratch4,
Operand(zero_reg));
}
@@ -5360,7 +5372,7 @@ void StringHelper::GenerateTwoCharacterStringTableProbe(MacroAssembler* masm,
// Must be the hole (deleted entry).
if (FLAG_debug_code) {
__ LoadRoot(scratch, Heap::kTheHoleValueRootIndex);
- __ Assert(eq, kOddballInStringTableIsNotUndefinedOrTheHole,
+ __ Assert(eq, "oddball in string table is not undefined or the hole",
scratch, Operand(candidate));
}
__ jmp(&next_probe[i]);
@@ -6568,7 +6580,7 @@ void DirectCEntryStub::Generate(MacroAssembler* masm) {
// filled with kZapValue by the GC.
// Dereference the address and check for this.
__ lw(t0, MemOperand(t9));
- __ Assert(ne, kReceivedInvalidReturnAddress, t0,
+ __ Assert(ne, "Received invalid return address.", t0,
Operand(reinterpret_cast<uint32_t>(kZapValue)));
}
__ Jump(t9);
@@ -7319,7 +7331,7 @@ static void CreateArrayDispatch(MacroAssembler* masm) {
}
// If we reached this point there is a problem.
- __ Abort(kUnexpectedElementsKindInArrayConstructor);
+ __ Abort("Unexpected ElementsKind in array constructor");
}
@@ -7374,7 +7386,7 @@ static void CreateArrayDispatchOneArgument(MacroAssembler* masm) {
}
// If we reached this point there is a problem.
- __ Abort(kUnexpectedElementsKindInArrayConstructor);
+ __ Abort("Unexpected ElementsKind in array constructor");
}
@@ -7435,10 +7447,10 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
__ lw(a3, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset));
// Will both indicate a NULL and a Smi.
__ And(at, a3, Operand(kSmiTagMask));
- __ Assert(ne, kUnexpectedInitialMapForArrayFunction,
+ __ Assert(ne, "Unexpected initial map for Array function",
at, Operand(zero_reg));
__ GetObjectType(a3, a3, t0);
- __ Assert(eq, kUnexpectedInitialMapForArrayFunction,
+ __ Assert(eq, "Unexpected initial map for Array function",
t0, Operand(MAP_TYPE));
// We should either have undefined in a2 or a valid cell.
@@ -7447,7 +7459,7 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
__ LoadRoot(at, Heap::kUndefinedValueRootIndex);
__ Branch(&okay_here, eq, a2, Operand(at));
__ lw(a3, FieldMemOperand(a2, 0));
- __ Assert(eq, kExpectedPropertyCellInRegisterA2,
+ __ Assert(eq, "Expected property cell in register a2",
a3, Operand(cell_map));
__ bind(&okay_here);
}
@@ -7547,10 +7559,10 @@ void InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
__ lw(a3, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset));
// Will both indicate a NULL and a Smi.
__ And(at, a3, Operand(kSmiTagMask));
- __ Assert(ne, kUnexpectedInitialMapForArrayFunction,
+ __ Assert(ne, "Unexpected initial map for Array function",
at, Operand(zero_reg));
__ GetObjectType(a3, a3, t0);
- __ Assert(eq, kUnexpectedInitialMapForArrayFunction,
+ __ Assert(eq, "Unexpected initial map for Array function",
t0, Operand(MAP_TYPE));
}
@@ -7567,7 +7579,7 @@ void InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
Label done;
__ Branch(&done, eq, a3, Operand(FAST_ELEMENTS));
__ Assert(
- eq, kInvalidElementsKindForInternalArrayOrInternalPackedArray,
+ eq, "Invalid ElementsKind for InternalArray or InternalPackedArray",
a3, Operand(FAST_HOLEY_ELEMENTS));
__ bind(&done);
}
diff --git a/chromium/v8/src/mips/codegen-mips.cc b/chromium/v8/src/mips/codegen-mips.cc
index 5c847fc8f62..3f74154f58a 100644
--- a/chromium/v8/src/mips/codegen-mips.cc
+++ b/chromium/v8/src/mips/codegen-mips.cc
@@ -205,7 +205,7 @@ void ElementsTransitionGenerator::GenerateSmiToDouble(
// Allocate new FixedDoubleArray.
__ sll(scratch, t1, 2);
__ Addu(scratch, scratch, FixedDoubleArray::kHeaderSize);
- __ Allocate(scratch, t2, t3, t5, &gc_required, DOUBLE_ALIGNMENT);
+ __ Allocate(scratch, t2, t3, t5, &gc_required, NO_ALLOCATION_FLAGS);
// t2: destination FixedDoubleArray, not tagged as heap object
// Set destination FixedDoubleArray's length and map.
@@ -289,7 +289,7 @@ void ElementsTransitionGenerator::GenerateSmiToDouble(
__ SmiTag(t5);
__ Or(t5, t5, Operand(1));
__ LoadRoot(at, Heap::kTheHoleValueRootIndex);
- __ Assert(eq, kObjectFoundInSmiOnlyArray, at, Operand(t5));
+ __ Assert(eq, "object found in smi-only array", at, Operand(t5));
}
__ sw(t0, MemOperand(t3)); // mantissa
__ sw(t1, MemOperand(t3, kIntSize)); // exponent
@@ -489,7 +489,7 @@ void StringCharLoadGenerator::Generate(MacroAssembler* masm,
// Assert that we do not have a cons or slice (indirect strings) here.
// Sequential strings have already been ruled out.
__ And(at, result, Operand(kIsIndirectStringMask));
- __ Assert(eq, kExternalStringExpectedButNotFound,
+ __ Assert(eq, "external string expected, but not found",
at, Operand(zero_reg));
}
// Rule out short external strings.
diff --git a/chromium/v8/src/mips/debug-mips.cc b/chromium/v8/src/mips/debug-mips.cc
index 020228fc6b5..30cc4db6340 100644
--- a/chromium/v8/src/mips/debug-mips.cc
+++ b/chromium/v8/src/mips/debug-mips.cc
@@ -142,7 +142,8 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm,
if ((non_object_regs & (1 << r)) != 0) {
if (FLAG_debug_code) {
__ And(at, reg, 0xc0000000);
- __ Assert(eq, kUnableToEncodeValueAsSmi, at, Operand(zero_reg));
+ __ Assert(
+ eq, "Unable to encode value as smi", at, Operand(zero_reg));
}
__ sll(reg, reg, kSmiTagSize);
}
@@ -324,12 +325,12 @@ void Debug::GenerateSlotDebugBreak(MacroAssembler* masm) {
void Debug::GeneratePlainReturnLiveEdit(MacroAssembler* masm) {
- masm->Abort(kLiveEditFrameDroppingIsNotSupportedOnMips);
+ masm->Abort("LiveEdit frame dropping is not supported on mips");
}
void Debug::GenerateFrameDropperLiveEdit(MacroAssembler* masm) {
- masm->Abort(kLiveEditFrameDroppingIsNotSupportedOnMips);
+ masm->Abort("LiveEdit frame dropping is not supported on mips");
}
diff --git a/chromium/v8/src/mips/full-codegen-mips.cc b/chromium/v8/src/mips/full-codegen-mips.cc
index b60502c9a5b..1084af09298 100644
--- a/chromium/v8/src/mips/full-codegen-mips.cc
+++ b/chromium/v8/src/mips/full-codegen-mips.cc
@@ -786,10 +786,10 @@ void FullCodeGenerator::EmitDebugCheckDeclarationContext(Variable* variable) {
// Check that we're not inside a with or catch context.
__ lw(a1, FieldMemOperand(cp, HeapObject::kMapOffset));
__ LoadRoot(t0, Heap::kWithContextMapRootIndex);
- __ Check(ne, kDeclarationInWithContext,
+ __ Check(ne, "Declaration in with context.",
a1, Operand(t0));
__ LoadRoot(t0, Heap::kCatchContextMapRootIndex);
- __ Check(ne, kDeclarationInCatchContext,
+ __ Check(ne, "Declaration in catch context.",
a1, Operand(t0));
}
}
@@ -2529,7 +2529,7 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
// Check for an uninitialized let binding.
__ lw(a2, location);
__ LoadRoot(t0, Heap::kTheHoleValueRootIndex);
- __ Check(eq, kLetBindingReInitialization, a2, Operand(t0));
+ __ Check(eq, "Let binding re-initialization.", a2, Operand(t0));
}
// Perform the assignment.
__ sw(v0, location);
@@ -3492,21 +3492,21 @@ void FullCodeGenerator::EmitSeqStringSetCharCheck(Register string,
Register value,
uint32_t encoding_mask) {
__ And(at, index, Operand(kSmiTagMask));
- __ Check(eq, kNonSmiIndex, at, Operand(zero_reg));
+ __ Check(eq, "Non-smi index", at, Operand(zero_reg));
__ And(at, value, Operand(kSmiTagMask));
- __ Check(eq, kNonSmiValue, at, Operand(zero_reg));
+ __ Check(eq, "Non-smi value", at, Operand(zero_reg));
__ lw(at, FieldMemOperand(string, String::kLengthOffset));
- __ Check(lt, kIndexIsTooLarge, index, Operand(at));
+ __ Check(lt, "Index is too large", index, Operand(at));
- __ Check(ge, kIndexIsNegative, index, Operand(zero_reg));
+ __ Check(ge, "Index is negative", index, Operand(zero_reg));
__ lw(at, FieldMemOperand(string, HeapObject::kMapOffset));
__ lbu(at, FieldMemOperand(at, Map::kInstanceTypeOffset));
__ And(at, at, Operand(kStringRepresentationMask | kStringEncodingMask));
__ Subu(at, at, Operand(encoding_mask));
- __ Check(eq, kUnexpectedStringType, at, Operand(zero_reg));
+ __ Check(eq, "Unexpected string type", at, Operand(zero_reg));
}
@@ -3881,7 +3881,7 @@ void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) {
Handle<FixedArray> jsfunction_result_caches(
isolate()->native_context()->jsfunction_result_caches());
if (jsfunction_result_caches->length() <= cache_id) {
- __ Abort(kAttemptToUseUndefinedCache);
+ __ Abort("Attempt to use undefined cache.");
__ LoadRoot(v0, Heap::kUndefinedValueRootIndex);
context()->Plug(v0);
return;
@@ -4063,7 +4063,7 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
// element: Current array element.
// elements_end: Array end.
if (generate_debug_code_) {
- __ Assert(gt, kNoEmptyArraysHereInEmitFastAsciiArrayJoin,
+ __ Assert(gt, "No empty arrays here in EmitFastAsciiArrayJoin",
array_length, Operand(zero_reg));
}
__ bind(&loop);
@@ -4382,12 +4382,35 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
break;
}
+ case Token::SUB:
+ EmitUnaryOperation(expr, "[ UnaryOperation (SUB)");
+ break;
+
+ case Token::BIT_NOT:
+ EmitUnaryOperation(expr, "[ UnaryOperation (BIT_NOT)");
+ break;
+
default:
UNREACHABLE();
}
}
+void FullCodeGenerator::EmitUnaryOperation(UnaryOperation* expr,
+ const char* comment) {
+ // TODO(svenpanne): Allowing format strings in Comment would be nice here...
+ Comment cmt(masm_, comment);
+ UnaryOpStub stub(expr->op());
+ // GenericUnaryOpStub expects the argument to be in a0.
+ VisitForAccumulatorValue(expr->expression());
+ SetSourcePosition(expr->position());
+ __ mov(a0, result_register());
+ CallIC(stub.GetCode(isolate()), RelocInfo::CODE_TARGET,
+ expr->UnaryOperationFeedbackId());
+ context()->Plug(v0);
+}
+
+
void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
Comment cmnt(masm_, "[ CountOperation");
SetSourcePosition(expr->position());
diff --git a/chromium/v8/src/mips/lithium-codegen-mips.cc b/chromium/v8/src/mips/lithium-codegen-mips.cc
index 2bc52e4f3ff..88e7eb8f1d4 100644
--- a/chromium/v8/src/mips/lithium-codegen-mips.cc
+++ b/chromium/v8/src/mips/lithium-codegen-mips.cc
@@ -91,7 +91,7 @@ void LCodeGen::FinishCode(Handle<Code> code) {
}
-void LChunkBuilder::Abort(BailoutReason reason) {
+void LChunkBuilder::Abort(const char* reason) {
info()->set_bailout_reason(reason);
status_ = ABORTED;
}
@@ -268,8 +268,6 @@ bool LCodeGen::GenerateBody() {
instr->Mnemonic());
}
- RecordAndUpdatePosition(instr->position());
-
instr->CompileToNative(this);
}
EnsureSpaceForLazyDeopt();
@@ -283,10 +281,6 @@ bool LCodeGen::GenerateDeferredCode() {
if (deferred_.length() > 0) {
for (int i = 0; !is_aborted() && i < deferred_.length(); i++) {
LDeferredCode* code = deferred_[i];
-
- int pos = instructions_->at(code->instruction_index())->position();
- RecordAndUpdatePosition(pos);
-
Comment(";;; <@%d,#%d> "
"-------------------- Deferred %s --------------------",
code->instruction_index(),
@@ -330,7 +324,7 @@ bool LCodeGen::GenerateDeoptJumpTable() {
// end of the jump table.
if (!is_int16((masm()->pc_offset() / Assembler::kInstrSize) +
deopt_jump_table_.length() * 12)) {
- Abort(kGeneratedCodeIsTooLarge);
+ Abort("Generated code is too large");
}
if (deopt_jump_table_.length() > 0) {
@@ -417,7 +411,7 @@ Register LCodeGen::EmitLoadRegister(LOperand* op, Register scratch) {
ASSERT(constant->HasSmiValue());
__ li(scratch, Operand(Smi::FromInt(constant->Integer32Value())));
} else if (r.IsDouble()) {
- Abort(kEmitLoadRegisterUnsupportedDoubleImmediate);
+ Abort("EmitLoadRegister: Unsupported double immediate.");
} else {
ASSERT(r.IsTagged());
__ LoadObject(scratch, literal);
@@ -455,9 +449,9 @@ DoubleRegister LCodeGen::EmitLoadDoubleRegister(LOperand* op,
__ cvt_d_w(dbl_scratch, flt_scratch);
return dbl_scratch;
} else if (r.IsDouble()) {
- Abort(kUnsupportedDoubleImmediate);
+ Abort("unsupported double immediate");
} else if (r.IsTagged()) {
- Abort(kUnsupportedTaggedImmediate);
+ Abort("unsupported tagged immediate");
}
} else if (op->IsStackSlot() || op->IsArgument()) {
MemOperand mem_op = ToMemOperand(op);
@@ -526,14 +520,14 @@ Operand LCodeGen::ToOperand(LOperand* op) {
ASSERT(constant->HasInteger32Value());
return Operand(constant->Integer32Value());
} else if (r.IsDouble()) {
- Abort(kToOperandUnsupportedDoubleImmediate);
+ Abort("ToOperand Unsupported double immediate.");
}
ASSERT(r.IsTagged());
return Operand(constant->handle());
} else if (op->IsRegister()) {
return Operand(ToRegister(op));
} else if (op->IsDoubleRegister()) {
- Abort(kToOperandIsDoubleRegisterUnimplemented);
+ Abort("ToOperand IsDoubleRegister unimplemented");
return Operand(0);
}
// Stack slots not implemented, use ToMemOperand instead.
@@ -597,57 +591,37 @@ void LCodeGen::WriteTranslation(LEnvironment* environment,
break;
}
- int object_index = 0;
- int dematerialized_index = 0;
for (int i = 0; i < translation_size; ++i) {
LOperand* value = environment->values()->at(i);
- AddToTranslation(environment,
- translation,
+
+ // TODO(mstarzinger): Introduce marker operands to indicate that this value
+ // is not present and must be reconstructed from the deoptimizer. Currently
+ // this is only used for the arguments object.
+ if (value == NULL) {
+ int arguments_count = environment->values()->length() - translation_size;
+ translation->BeginArgumentsObject(arguments_count);
+ for (int i = 0; i < arguments_count; ++i) {
+ LOperand* value = environment->values()->at(translation_size + i);
+ AddToTranslation(translation,
+ value,
+ environment->HasTaggedValueAt(translation_size + i),
+ environment->HasUint32ValueAt(translation_size + i));
+ }
+ continue;
+ }
+
+ AddToTranslation(translation,
value,
environment->HasTaggedValueAt(i),
- environment->HasUint32ValueAt(i),
- &object_index,
- &dematerialized_index);
+ environment->HasUint32ValueAt(i));
}
}
-void LCodeGen::AddToTranslation(LEnvironment* environment,
- Translation* translation,
+void LCodeGen::AddToTranslation(Translation* translation,
LOperand* op,
bool is_tagged,
- bool is_uint32,
- int* object_index_pointer,
- int* dematerialized_index_pointer) {
- if (op == LEnvironment::materialization_marker()) {
- int object_index = (*object_index_pointer)++;
- if (environment->ObjectIsDuplicateAt(object_index)) {
- int dupe_of = environment->ObjectDuplicateOfAt(object_index);
- translation->DuplicateObject(dupe_of);
- return;
- }
- int object_length = environment->ObjectLengthAt(object_index);
- if (environment->ObjectIsArgumentsAt(object_index)) {
- translation->BeginArgumentsObject(object_length);
- } else {
- translation->BeginCapturedObject(object_length);
- }
- int dematerialized_index = *dematerialized_index_pointer;
- int env_offset = environment->translation_size() + dematerialized_index;
- *dematerialized_index_pointer += object_length;
- for (int i = 0; i < object_length; ++i) {
- LOperand* value = environment->values()->at(env_offset + i);
- AddToTranslation(environment,
- translation,
- value,
- environment->HasTaggedValueAt(env_offset + i),
- environment->HasUint32ValueAt(env_offset + i),
- object_index_pointer,
- dematerialized_index_pointer);
- }
- return;
- }
-
+ bool is_uint32) {
if (op->IsStackSlot()) {
if (is_tagged) {
translation->StoreStackSlot(op->index());
@@ -774,7 +748,7 @@ void LCodeGen::DeoptimizeIf(Condition cc,
Address entry =
Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type);
if (entry == NULL) {
- Abort(kBailoutWasNotPrepared);
+ Abort("bailout was not prepared");
return;
}
@@ -787,7 +761,7 @@ void LCodeGen::DeoptimizeIf(Condition cc,
return;
}
- if (info()->ShouldTrapOnDeopt()) {
+ if (FLAG_trap_on_deopt && info()->IsOptimizing()) {
Label skip;
if (cc != al) {
__ Branch(&skip, NegateCondition(cc), src1, src2);
@@ -986,14 +960,6 @@ void LCodeGen::RecordPosition(int position) {
}
-void LCodeGen::RecordAndUpdatePosition(int position) {
- if (position >= 0 && position != old_position_) {
- masm()->positions_recorder()->RecordPosition(position);
- old_position_ = position;
- }
-}
-
-
static const char* LabelType(LLabel* label) {
if (label->is_loop_header()) return " (loop header)";
if (label->is_osr_entry()) return " (OSR entry)";
@@ -1536,11 +1502,7 @@ void LCodeGen::DoBitI(LBitI* instr) {
__ Or(result, left, right);
break;
case Token::BIT_XOR:
- if (right_op->IsConstantOperand() && right.immediate() == int32_t(~0)) {
- __ Nor(result, zero_reg, left);
- } else {
- __ Xor(result, left, right);
- }
+ __ Xor(result, left, right);
break;
default:
UNREACHABLE();
@@ -1801,7 +1763,7 @@ void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
static const uint32_t two_byte_seq_type = kSeqStringTag | kTwoByteStringTag;
__ Subu(at, at, Operand(encoding == String::ONE_BYTE_ENCODING
? one_byte_seq_type : two_byte_seq_type));
- __ Check(eq, kUnexpectedStringType, at, Operand(zero_reg));
+ __ Check(eq, "Unexpected string type", at, Operand(zero_reg));
}
__ Addu(scratch,
@@ -1818,6 +1780,13 @@ void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
}
+void LCodeGen::DoBitNotI(LBitNotI* instr) {
+ Register input = ToRegister(instr->value());
+ Register result = ToRegister(instr->result());
+ __ Nor(result, zero_reg, Operand(input));
+}
+
+
void LCodeGen::DoThrow(LThrow* instr) {
Register input_reg = EmitLoadRegister(instr->value(), at);
__ push(input_reg);
@@ -2921,6 +2890,90 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
}
+void LCodeGen::EmitLoadFieldOrConstantFunction(Register result,
+ Register object,
+ Handle<Map> type,
+ Handle<String> name,
+ LEnvironment* env) {
+ LookupResult lookup(isolate());
+ type->LookupDescriptor(NULL, *name, &lookup);
+ ASSERT(lookup.IsFound() || lookup.IsCacheable());
+ if (lookup.IsField()) {
+ int index = lookup.GetLocalFieldIndexFromMap(*type);
+ int offset = index * kPointerSize;
+ if (index < 0) {
+ // Negative property indices are in-object properties, indexed
+ // from the end of the fixed part of the object.
+ __ lw(result, FieldMemOperand(object, offset + type->instance_size()));
+ } else {
+ // Non-negative property indices are in the properties array.
+ __ lw(result, FieldMemOperand(object, JSObject::kPropertiesOffset));
+ __ lw(result, FieldMemOperand(result, offset + FixedArray::kHeaderSize));
+ }
+ } else if (lookup.IsConstant()) {
+ Handle<Object> constant(lookup.GetConstantFromMap(*type), isolate());
+ __ LoadObject(result, constant);
+ } else {
+ // Negative lookup.
+ // Check prototypes.
+ Handle<HeapObject> current(HeapObject::cast((*type)->prototype()));
+ Heap* heap = type->GetHeap();
+ while (*current != heap->null_value()) {
+ __ LoadHeapObject(result, current);
+ __ lw(result, FieldMemOperand(result, HeapObject::kMapOffset));
+ DeoptimizeIf(ne, env, result, Operand(Handle<Map>(current->map())));
+ current =
+ Handle<HeapObject>(HeapObject::cast(current->map()->prototype()));
+ }
+ __ LoadRoot(result, Heap::kUndefinedValueRootIndex);
+ }
+}
+
+
+void LCodeGen::DoLoadNamedFieldPolymorphic(LLoadNamedFieldPolymorphic* instr) {
+ Register object = ToRegister(instr->object());
+ Register result = ToRegister(instr->result());
+ Register object_map = scratch0();
+
+ int map_count = instr->hydrogen()->types()->length();
+ bool need_generic = instr->hydrogen()->need_generic();
+
+ if (map_count == 0 && !need_generic) {
+ DeoptimizeIf(al, instr->environment());
+ return;
+ }
+ Handle<String> name = instr->hydrogen()->name();
+ Label done;
+ __ lw(object_map, FieldMemOperand(object, HeapObject::kMapOffset));
+ for (int i = 0; i < map_count; ++i) {
+ bool last = (i == map_count - 1);
+ Handle<Map> map = instr->hydrogen()->types()->at(i);
+ Label check_passed;
+ __ CompareMapAndBranch(object_map, map, &check_passed, eq, &check_passed);
+ if (last && !need_generic) {
+ DeoptimizeIf(al, instr->environment());
+ __ bind(&check_passed);
+ EmitLoadFieldOrConstantFunction(
+ result, object, map, name, instr->environment());
+ } else {
+ Label next;
+ __ Branch(&next);
+ __ bind(&check_passed);
+ EmitLoadFieldOrConstantFunction(
+ result, object, map, name, instr->environment());
+ __ Branch(&done);
+ __ bind(&next);
+ }
+ }
+ if (need_generic) {
+ __ li(a2, Operand(name));
+ Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
+ CallCode(ic, RelocInfo::CODE_TARGET, instr);
+ }
+ __ bind(&done);
+}
+
+
void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) {
ASSERT(ToRegister(instr->object()).is(a0));
ASSERT(ToRegister(instr->result()).is(v0));
@@ -3016,7 +3069,7 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) {
if (key_is_constant) {
constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
if (constant_key & 0xF0000000) {
- Abort(kArrayIndexConstantValueTooBig);
+ Abort("array index constant value too big.");
}
} else {
key = ToRegister(instr->key());
@@ -3102,7 +3155,7 @@ void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) {
if (key_is_constant) {
constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
if (constant_key & 0xF0000000) {
- Abort(kArrayIndexConstantValueTooBig);
+ Abort("array index constant value too big.");
}
} else {
key = ToRegister(instr->key());
@@ -3373,7 +3426,7 @@ void LCodeGen::DoApplyArguments(LApplyArguments* instr) {
void LCodeGen::DoPushArgument(LPushArgument* instr) {
LOperand* argument = instr->value();
if (argument->IsDoubleRegister() || argument->IsDoubleStackSlot()) {
- Abort(kDoPushArgumentNotImplementedForDoubleType);
+ Abort("DoPushArgument not implemented for double type.");
} else {
Register argument_reg = EmitLoadRegister(argument, at);
__ push(argument_reg);
@@ -3592,7 +3645,7 @@ void LCodeGen::DoMathAbs(LMathAbs* instr) {
FPURegister input = ToDoubleRegister(instr->value());
FPURegister result = ToDoubleRegister(instr->result());
__ abs_d(result, input);
- } else if (r.IsSmiOrInteger32()) {
+ } else if (r.IsInteger32()) {
EmitIntegerMathAbs(instr);
} else {
// Representation is tagged.
@@ -4198,7 +4251,7 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) {
if (key_is_constant) {
constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
if (constant_key & 0xF0000000) {
- Abort(kArrayIndexConstantValueTooBig);
+ Abort("array index constant value too big.");
}
} else {
key = ToRegister(instr->key());
@@ -4276,7 +4329,7 @@ void LCodeGen::DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr) {
if (key_is_constant) {
constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
if (constant_key & 0xF0000000) {
- Abort(kArrayIndexConstantValueTooBig);
+ Abort("array index constant value too big.");
}
} else {
key = ToRegister(instr->key());
@@ -4405,13 +4458,12 @@ void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) {
__ RecordWriteField(object_reg, HeapObject::kMapOffset, new_map_reg,
scratch, GetRAState(), kDontSaveFPRegs);
} else {
- PushSafepointRegistersScope scope(
- this, Safepoint::kWithRegistersAndDoubles);
+ PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
__ mov(a0, object_reg);
__ li(a1, Operand(to_map));
TransitionElementsKindStub stub(from_kind, to_kind);
__ CallStub(&stub);
- RecordSafepointWithRegistersAndDoubles(
+ RecordSafepointWithRegisters(
instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
}
__ bind(&not_applicable);
@@ -4717,7 +4769,7 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
__ Move(reg, scratch0(), input_reg);
Label canonicalize;
__ Branch(&canonicalize, ne, scratch0(), Operand(kHoleNanUpper32));
- __ li(reg, factory()->undefined_value());
+ __ li(reg, factory()->the_hole_value());
__ Branch(&done);
__ bind(&canonicalize);
__ Move(input_reg,
@@ -5122,7 +5174,7 @@ void LCodeGen::DoCheckFunction(LCheckFunction* instr) {
AllowDeferredHandleDereference smi_check;
if (isolate()->heap()->InNewSpace(*target)) {
Register reg = ToRegister(instr->value());
- Handle<Cell> cell = isolate()->factory()->NewCell(target);
+ Handle<Cell> cell = isolate()->factory()->NewPropertyCell(target);
__ li(at, Operand(Handle<Object>(cell)));
__ lw(at, FieldMemOperand(at, Cell::kValueOffset));
DeoptimizeIf(ne, instr->environment(), reg,
@@ -5134,63 +5186,31 @@ void LCodeGen::DoCheckFunction(LCheckFunction* instr) {
}
-void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) {
- {
- PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
- __ push(object);
- CallRuntimeFromDeferred(Runtime::kMigrateInstance, 1, instr);
- __ StoreToSafepointRegisterSlot(v0, scratch0());
- }
- __ And(at, scratch0(), Operand(kSmiTagMask));
- DeoptimizeIf(eq, instr->environment(), at, Operand(zero_reg));
+void LCodeGen::DoCheckMapCommon(Register map_reg,
+ Handle<Map> map,
+ LEnvironment* env) {
+ Label success;
+ __ CompareMapAndBranch(map_reg, map, &success, eq, &success);
+ DeoptimizeIf(al, env);
+ __ bind(&success);
}
void LCodeGen::DoCheckMaps(LCheckMaps* instr) {
- class DeferredCheckMaps: public LDeferredCode {
- public:
- DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object)
- : LDeferredCode(codegen), instr_(instr), object_(object) {
- SetExit(check_maps());
- }
- virtual void Generate() {
- codegen()->DoDeferredInstanceMigration(instr_, object_);
- }
- Label* check_maps() { return &check_maps_; }
- virtual LInstruction* instr() { return instr_; }
- private:
- LCheckMaps* instr_;
- Label check_maps_;
- Register object_;
- };
-
if (instr->hydrogen()->CanOmitMapChecks()) return;
Register map_reg = scratch0();
LOperand* input = instr->value();
ASSERT(input->IsRegister());
Register reg = ToRegister(input);
+ Label success;
SmallMapList* map_set = instr->hydrogen()->map_set();
__ lw(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
-
- DeferredCheckMaps* deferred = NULL;
- if (instr->hydrogen()->has_migration_target()) {
- deferred = new(zone()) DeferredCheckMaps(this, instr, reg);
- __ bind(deferred->check_maps());
- }
-
- Label success;
for (int i = 0; i < map_set->length() - 1; i++) {
Handle<Map> map = map_set->at(i);
__ CompareMapAndBranch(map_reg, map, &success, eq, &success);
}
Handle<Map> map = map_set->last();
- // Do the CompareMap() directly within the Branch() and DeoptimizeIf().
- if (instr->hydrogen()->has_migration_target()) {
- __ Branch(deferred->entry(), ne, map_reg, Operand(map));
- } else {
- DeoptimizeIf(ne, instr->environment(), map_reg, Operand(map));
- }
-
+ DoCheckMapCommon(map_reg, map, instr->environment());
__ bind(&success);
}
@@ -5245,6 +5265,25 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) {
}
+void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
+ if (instr->hydrogen()->CanOmitPrototypeChecks()) return;
+
+ Register prototype_reg = ToRegister(instr->temp());
+ Register map_reg = ToRegister(instr->temp2());
+
+ ZoneList<Handle<JSObject> >* prototypes = instr->prototypes();
+ ZoneList<Handle<Map> >* maps = instr->maps();
+
+ ASSERT(prototypes->length() == maps->length());
+
+ for (int i = 0; i < prototypes->length(); i++) {
+ __ LoadHeapObject(prototype_reg, prototypes->at(i));
+ __ lw(map_reg, FieldMemOperand(prototype_reg, HeapObject::kMapOffset));
+ DoCheckMapCommon(map_reg, maps->at(i), instr->environment());
+ }
+}
+
+
void LCodeGen::DoAllocate(LAllocate* instr) {
class DeferredAllocate: public LDeferredCode {
public:
@@ -5625,8 +5664,6 @@ void LCodeGen::DoDeoptimize(LDeoptimize* instr) {
if (info()->IsStub() && type == Deoptimizer::EAGER) {
type = Deoptimizer::LAZY;
}
-
- Comment(";;; deoptimize: %s", instr->hydrogen()->reason());
DeoptimizeIf(al, instr->environment(), type, zero_reg, Operand(zero_reg));
}
diff --git a/chromium/v8/src/mips/lithium-codegen-mips.h b/chromium/v8/src/mips/lithium-codegen-mips.h
index b97a3cdbaf1..a485b67db94 100644
--- a/chromium/v8/src/mips/lithium-codegen-mips.h
+++ b/chromium/v8/src/mips/lithium-codegen-mips.h
@@ -65,8 +65,7 @@ class LCodeGen BASE_EMBEDDED {
frame_is_built_(false),
safepoints_(info->zone()),
resolver_(this),
- expected_safepoint_kind_(Safepoint::kSimple),
- old_position_(RelocInfo::kNoPosition) {
+ expected_safepoint_kind_(Safepoint::kSimple) {
PopulateDeoptimizationLiteralsWithInlinedFunctions();
}
@@ -115,7 +114,7 @@ class LCodeGen BASE_EMBEDDED {
DoubleRegister EmitLoadDoubleRegister(LOperand* op,
FloatRegister flt_scratch,
DoubleRegister dbl_scratch);
- int32_t ToRepresentation(LConstantOperand* op, const Representation& r) const;
+ int ToRepresentation(LConstantOperand* op, const Representation& r) const;
int32_t ToInteger32(LConstantOperand* op) const;
Smi* ToSmi(LConstantOperand* op) const;
double ToDouble(LConstantOperand* op) const;
@@ -154,7 +153,7 @@ class LCodeGen BASE_EMBEDDED {
void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
Label* map_check);
- void DoDeferredInstanceMigration(LCheckMaps* instr, Register object);
+ void DoCheckMapCommon(Register map_reg, Handle<Map> map, LEnvironment* env);
// Parallel move support.
void DoParallelMove(LParallelMove* move);
@@ -214,7 +213,7 @@ class LCodeGen BASE_EMBEDDED {
int GetStackSlotCount() const { return chunk()->spill_slot_count(); }
- void Abort(BailoutReason reason);
+ void Abort(const char* reason);
void FPRINTF_CHECKING Comment(const char* format, ...);
void AddDeferredCode(LDeferredCode* code) { deferred_.Add(code, zone()); }
@@ -291,13 +290,10 @@ class LCodeGen BASE_EMBEDDED {
Register src1 = zero_reg,
const Operand& src2 = Operand(zero_reg));
- void AddToTranslation(LEnvironment* environment,
- Translation* translation,
+ void AddToTranslation(Translation* translation,
LOperand* op,
bool is_tagged,
- bool is_uint32,
- int* object_index_pointer,
- int* dematerialized_index_pointer);
+ bool is_uint32);
void RegisterDependentCodeForEmbeddedMaps(Handle<Code> code);
void PopulateDeoptimizationData(Handle<Code> code);
int DefineDeoptimizationLiteral(Handle<Object> literal);
@@ -323,7 +319,6 @@ class LCodeGen BASE_EMBEDDED {
int arguments,
Safepoint::DeoptMode mode);
void RecordPosition(int position);
- void RecordAndUpdatePosition(int position);
static Condition TokenToCondition(Token::Value op, bool is_unsigned);
void EmitGoto(int block);
@@ -378,6 +373,12 @@ class LCodeGen BASE_EMBEDDED {
// Caller should branch on equal condition.
void EmitIsConstructCall(Register temp1, Register temp2);
+ void EmitLoadFieldOrConstantFunction(Register result,
+ Register object,
+ Handle<Map> type,
+ Handle<String> name,
+ LEnvironment* env);
+
// Emits optimized code to deep-copy the contents of statically known
// object graphs (e.g. object literal boilerplate).
void EmitDeepCopy(Handle<JSObject> object,
@@ -434,8 +435,6 @@ class LCodeGen BASE_EMBEDDED {
Safepoint::Kind expected_safepoint_kind_;
- int old_position_;
-
class PushSafepointRegistersScope BASE_EMBEDDED {
public:
PushSafepointRegistersScope(LCodeGen* codegen,
diff --git a/chromium/v8/src/mips/lithium-gap-resolver-mips.cc b/chromium/v8/src/mips/lithium-gap-resolver-mips.cc
index 460e13bf0a9..771b22862ee 100644
--- a/chromium/v8/src/mips/lithium-gap-resolver-mips.cc
+++ b/chromium/v8/src/mips/lithium-gap-resolver-mips.cc
@@ -258,7 +258,7 @@ void LGapResolver::EmitMove(int index) {
} else {
__ LoadObject(dst, cgen_->ToHandle(constant_source));
}
- } else if (destination->IsDoubleRegister()) {
+ } else if (source->IsDoubleRegister()) {
DoubleRegister result = cgen_->ToDoubleRegister(destination);
double v = cgen_->ToDouble(constant_source);
__ Move(result, v);
diff --git a/chromium/v8/src/mips/lithium-mips.cc b/chromium/v8/src/mips/lithium-mips.cc
index 23f48a7709d..760be2e6e85 100644
--- a/chromium/v8/src/mips/lithium-mips.cc
+++ b/chromium/v8/src/mips/lithium-mips.cc
@@ -442,7 +442,7 @@ LPlatformChunk* LChunkBuilder::Build() {
}
-void LCodeGen::Abort(BailoutReason reason) {
+void LCodeGen::Abort(const char* reason) {
info()->set_bailout_reason(reason);
status_ = ABORTED;
}
@@ -598,10 +598,8 @@ LInstruction* LChunkBuilder::DefineFixedDouble(
LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
HEnvironment* hydrogen_env = current_block_->last_environment();
int argument_index_accumulator = 0;
- ZoneList<HValue*> objects_to_materialize(0, zone());
instr->set_environment(CreateEnvironment(hydrogen_env,
- &argument_index_accumulator,
- &objects_to_materialize));
+ &argument_index_accumulator));
return instr;
}
@@ -652,7 +650,7 @@ LUnallocated* LChunkBuilder::TempRegister() {
new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
int vreg = allocator_->GetVirtualRegister();
if (!allocator_->AllocationOk()) {
- Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
+ Abort("Out of virtual registers while trying to allocate temp register.");
vreg = 0;
}
operand->set_virtual_register(vreg);
@@ -890,7 +888,6 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
}
#endif
- instr->set_position(position_);
if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
instr = AssignPointerMap(instr);
}
@@ -906,13 +903,11 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
LEnvironment* LChunkBuilder::CreateEnvironment(
HEnvironment* hydrogen_env,
- int* argument_index_accumulator,
- ZoneList<HValue*>* objects_to_materialize) {
+ int* argument_index_accumulator) {
if (hydrogen_env == NULL) return NULL;
- LEnvironment* outer = CreateEnvironment(hydrogen_env->outer(),
- argument_index_accumulator,
- objects_to_materialize);
+ LEnvironment* outer =
+ CreateEnvironment(hydrogen_env->outer(), argument_index_accumulator);
BailoutId ast_id = hydrogen_env->ast_id();
ASSERT(!ast_id.IsNone() ||
hydrogen_env->frame_type() != JS_FUNCTION);
@@ -927,16 +922,16 @@ LEnvironment* LChunkBuilder::CreateEnvironment(
outer,
hydrogen_env->entry(),
zone());
+ bool needs_arguments_object_materialization = false;
int argument_index = *argument_index_accumulator;
- int object_index = objects_to_materialize->length();
for (int i = 0; i < hydrogen_env->length(); ++i) {
if (hydrogen_env->is_special_index(i)) continue;
- LOperand* op;
HValue* value = hydrogen_env->values()->at(i);
- if (value->IsArgumentsObject() || value->IsCapturedObject()) {
- objects_to_materialize->Add(value, zone());
- op = LEnvironment::materialization_marker();
+ LOperand* op = NULL;
+ if (value->IsArgumentsObject()) {
+ needs_arguments_object_materialization = true;
+ op = NULL;
} else if (value->IsPushArgument()) {
op = new(zone()) LArgument(argument_index++);
} else {
@@ -947,33 +942,15 @@ LEnvironment* LChunkBuilder::CreateEnvironment(
value->CheckFlag(HInstruction::kUint32));
}
- for (int i = object_index; i < objects_to_materialize->length(); ++i) {
- HValue* object_to_materialize = objects_to_materialize->at(i);
- int previously_materialized_object = -1;
- for (int prev = 0; prev < i; ++prev) {
- if (objects_to_materialize->at(prev) == objects_to_materialize->at(i)) {
- previously_materialized_object = prev;
- break;
- }
- }
- int length = object_to_materialize->OperandCount();
- bool is_arguments = object_to_materialize->IsArgumentsObject();
- if (previously_materialized_object >= 0) {
- result->AddDuplicateObject(previously_materialized_object);
- continue;
- } else {
- result->AddNewObject(is_arguments ? length - 1 : length, is_arguments);
- }
- for (int i = is_arguments ? 1 : 0; i < length; ++i) {
- LOperand* op;
- HValue* value = object_to_materialize->OperandAt(i);
- if (value->IsArgumentsObject() || value->IsCapturedObject()) {
- objects_to_materialize->Add(value, zone());
- op = LEnvironment::materialization_marker();
- } else {
- ASSERT(!value->IsPushArgument());
- op = UseAny(value);
- }
+ if (needs_arguments_object_materialization) {
+ HArgumentsObject* arguments = hydrogen_env->entry() == NULL
+ ? graph()->GetArgumentsObject()
+ : hydrogen_env->entry()->arguments_object();
+ ASSERT(arguments->IsLinked());
+ for (int i = 1; i < arguments->arguments_count(); ++i) {
+ HValue* value = arguments->arguments_values()->at(i);
+ ASSERT(!value->IsArgumentsObject() && !value->IsPushArgument());
+ LOperand* op = UseAny(value);
result->AddValue(op,
value->representation(),
value->CheckFlag(HInstruction::kUint32));
@@ -1350,6 +1327,15 @@ LInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
}
+LInstruction* LChunkBuilder::DoBitNot(HBitNot* instr) {
+ ASSERT(instr->value()->representation().IsInteger32());
+ ASSERT(instr->representation().IsInteger32());
+ if (instr->HasNoUses()) return NULL;
+ LOperand* value = UseRegisterAtStart(instr->value());
+ return DefineAsRegister(new(zone()) LBitNotI(value));
+}
+
+
LInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
if (instr->representation().IsDouble()) {
return DoArithmeticD(Token::DIV, instr);
@@ -1628,8 +1614,9 @@ LInstruction* LChunkBuilder::DoCompareNumericAndBranch(
HCompareNumericAndBranch* instr) {
Representation r = instr->representation();
if (r.IsSmiOrInteger32()) {
- ASSERT(instr->left()->representation().Equals(r));
- ASSERT(instr->right()->representation().Equals(r));
+ ASSERT(instr->left()->representation().IsSmiOrInteger32());
+ ASSERT(instr->left()->representation().Equals(
+ instr->right()->representation()));
LOperand* left = UseRegisterOrConstantAtStart(instr->left());
LOperand* right = UseRegisterOrConstantAtStart(instr->right());
return new(zone()) LCompareNumericAndBranch(left, right);
@@ -1764,6 +1751,17 @@ LInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
}
+LInstruction* LChunkBuilder::DoNumericConstraint(HNumericConstraint* instr) {
+ return NULL;
+}
+
+
+LInstruction* LChunkBuilder::DoInductionVariableAnnotation(
+ HInductionVariableAnnotation* instr) {
+ return NULL;
+}
+
+
LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
LOperand* value = UseRegisterOrConstantAtStart(instr->index());
LOperand* length = UseRegister(instr->length());
@@ -1937,6 +1935,19 @@ LInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
}
+LInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) {
+ LUnallocated* temp1 = NULL;
+ LOperand* temp2 = NULL;
+ if (!instr->CanOmitPrototypeChecks()) {
+ temp1 = TempRegister();
+ temp2 = TempRegister();
+ }
+ LCheckPrototypeMaps* result = new(zone()) LCheckPrototypeMaps(temp1, temp2);
+ if (instr->CanOmitPrototypeChecks()) return result;
+ return AssignEnvironment(result);
+}
+
+
LInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) {
LOperand* value = UseRegisterAtStart(instr->value());
return AssignEnvironment(new(zone()) LCheckFunction(value));
@@ -1945,16 +1956,10 @@ LInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) {
LInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
LOperand* value = NULL;
- if (!instr->CanOmitMapChecks()) {
- value = UseRegisterAtStart(instr->value());
- if (instr->has_migration_target()) info()->MarkAsDeferredCalling();
- }
- LCheckMaps* result = new(zone()) LCheckMaps(value);
- if (!instr->CanOmitMapChecks()) {
- AssignEnvironment(result);
- if (instr->has_migration_target()) return AssignPointerMap(result);
- }
- return result;
+ if (!instr->CanOmitMapChecks()) value = UseRegisterAtStart(instr->value());
+ LInstruction* result = new(zone()) LCheckMaps(value);
+ if (instr->CanOmitMapChecks()) return result;
+ return AssignEnvironment(result);
}
@@ -2066,6 +2071,23 @@ LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
}
+LInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic(
+ HLoadNamedFieldPolymorphic* instr) {
+ ASSERT(instr->representation().IsTagged());
+ if (instr->need_generic()) {
+ LOperand* obj = UseFixed(instr->object(), a0);
+ LLoadNamedFieldPolymorphic* result =
+ new(zone()) LLoadNamedFieldPolymorphic(obj);
+ return MarkAsCall(DefineFixed(result, v0), instr);
+ } else {
+ LOperand* obj = UseRegisterAtStart(instr->object());
+ LLoadNamedFieldPolymorphic* result =
+ new(zone()) LLoadNamedFieldPolymorphic(obj);
+ return AssignEnvironment(DefineAsRegister(result));
+ }
+}
+
+
LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
LOperand* object = UseFixed(instr->object(), a0);
LInstruction* result = DefineFixed(new(zone()) LLoadNamedGeneric(object), v0);
@@ -2221,7 +2243,7 @@ LInstruction* LChunkBuilder::DoTrapAllocationMemento(
LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
bool is_in_object = instr->access().IsInobject();
bool needs_write_barrier = instr->NeedsWriteBarrier();
- bool needs_write_barrier_for_map = instr->has_transition() &&
+ bool needs_write_barrier_for_map = !instr->transition().is_null() &&
instr->NeedsWriteBarrierForMap();
LOperand* obj;
@@ -2341,7 +2363,7 @@ LInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
int spill_index = chunk()->GetNextSpillIndex(false); // Not double-width.
if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
- Abort(kTooManySpillSlotsNeededForOSR);
+ Abort("Too many spill slots needed for OSR");
spill_index = 0;
}
return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
@@ -2363,12 +2385,6 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
}
-LInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
- // There are no real uses of a captured object.
- return NULL;
-}
-
-
LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
info()->MarkAsRequiresFrame();
LOperand* args = UseRegister(instr->arguments());
diff --git a/chromium/v8/src/mips/lithium-mips.h b/chromium/v8/src/mips/lithium-mips.h
index a1792b17b22..44c909ea766 100644
--- a/chromium/v8/src/mips/lithium-mips.h
+++ b/chromium/v8/src/mips/lithium-mips.h
@@ -50,6 +50,7 @@ class LCodeGen;
V(ArithmeticD) \
V(ArithmeticT) \
V(BitI) \
+ V(BitNotI) \
V(BoundsCheck) \
V(Branch) \
V(CallConstantFunction) \
@@ -67,6 +68,7 @@ class LCodeGen;
V(CheckMaps) \
V(CheckMapValue) \
V(CheckNonSmi) \
+ V(CheckPrototypeMaps) \
V(CheckSmi) \
V(ClampDToUint8) \
V(ClampIToUint8) \
@@ -126,6 +128,7 @@ class LCodeGen;
V(LoadKeyed) \
V(LoadKeyedGeneric) \
V(LoadNamedField) \
+ V(LoadNamedFieldPolymorphic) \
V(LoadNamedGeneric) \
V(MapEnumLength) \
V(MathAbs) \
@@ -204,12 +207,9 @@ class LCodeGen;
class LInstruction: public ZoneObject {
public:
LInstruction()
- : environment_(NULL),
- hydrogen_value_(NULL),
- bit_field_(IsCallBits::encode(false)) {
- set_position(RelocInfo::kNoPosition);
- }
-
+ : environment_(NULL),
+ hydrogen_value_(NULL),
+ is_call_(false) { }
virtual ~LInstruction() { }
virtual void CompileToNative(LCodeGen* generator) = 0;
@@ -248,30 +248,20 @@ class LInstruction: public ZoneObject {
LPointerMap* pointer_map() const { return pointer_map_.get(); }
bool HasPointerMap() const { return pointer_map_.is_set(); }
- // The 31 bits PositionBits is used to store the int position value. And the
- // position value may be RelocInfo::kNoPosition (-1). The accessor always
- // +1/-1 so that the encoded value of position in bit_field_ is always >= 0
- // and can fit into the 31 bits PositionBits.
- void set_position(int pos) {
- bit_field_ = PositionBits::update(bit_field_, pos + 1);
- }
- int position() { return PositionBits::decode(bit_field_) - 1; }
-
void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
HValue* hydrogen_value() const { return hydrogen_value_; }
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) { }
- void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); }
- bool IsCall() const { return IsCallBits::decode(bit_field_); }
+ void MarkAsCall() { is_call_ = true; }
// Interface to the register allocator and iterators.
- bool ClobbersTemps() const { return IsCall(); }
- bool ClobbersRegisters() const { return IsCall(); }
- bool ClobbersDoubleRegisters() const { return IsCall(); }
+ bool ClobbersTemps() const { return is_call_; }
+ bool ClobbersRegisters() const { return is_call_; }
+ bool ClobbersDoubleRegisters() const { return is_call_; }
// Interface to the register allocator and iterators.
- bool IsMarkedAsCall() const { return IsCall(); }
+ bool IsMarkedAsCall() const { return is_call_; }
virtual bool HasResult() const = 0;
virtual LOperand* result() const = 0;
@@ -295,13 +285,10 @@ class LInstruction: public ZoneObject {
virtual int TempCount() = 0;
virtual LOperand* TempAt(int i) = 0;
- class IsCallBits: public BitField<bool, 0, 1> {};
- class PositionBits: public BitField<int, 1, 31> {};
-
LEnvironment* environment_;
SetOncePointer<LPointerMap> pointer_map_;
HValue* hydrogen_value_;
- int bit_field_;
+ bool is_call_;
};
@@ -1369,6 +1356,18 @@ class LThrow: public LTemplateInstruction<0, 1, 0> {
};
+class LBitNotI: public LTemplateInstruction<1, 1, 0> {
+ public:
+ explicit LBitNotI(LOperand* value) {
+ inputs_[0] = value;
+ }
+
+ LOperand* value() { return inputs_[0]; }
+
+ DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i")
+};
+
+
class LAddI: public LTemplateInstruction<1, 2, 0> {
public:
LAddI(LOperand* left, LOperand* right) {
@@ -1504,6 +1503,19 @@ class LLoadNamedField: public LTemplateInstruction<1, 1, 0> {
};
+class LLoadNamedFieldPolymorphic: public LTemplateInstruction<1, 1, 0> {
+ public:
+ explicit LLoadNamedFieldPolymorphic(LOperand* object) {
+ inputs_[0] = object;
+ }
+
+ LOperand* object() { return inputs_[0]; }
+
+ DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field-polymorphic")
+ DECLARE_HYDROGEN_ACCESSOR(LoadNamedFieldPolymorphic)
+};
+
+
class LLoadNamedGeneric: public LTemplateInstruction<1, 1, 0> {
public:
explicit LLoadNamedGeneric(LOperand* object) {
@@ -2116,7 +2128,7 @@ class LStoreNamedField: public LTemplateInstruction<0, 2, 1> {
virtual void PrintDataTo(StringStream* stream);
- Handle<Map> transition() const { return hydrogen()->transition_map(); }
+ Handle<Map> transition() const { return hydrogen()->transition(); }
Representation representation() const {
return hydrogen()->field_representation();
}
@@ -2312,6 +2324,26 @@ class LCheckMaps: public LTemplateInstruction<0, 1, 0> {
};
+class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 2> {
+ public:
+ LCheckPrototypeMaps(LOperand* temp, LOperand* temp2) {
+ temps_[0] = temp;
+ temps_[1] = temp2;
+ }
+
+ LOperand* temp() { return temps_[0]; }
+ LOperand* temp2() { return temps_[1]; }
+
+ DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps")
+ DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps)
+
+ ZoneList<Handle<JSObject> >* prototypes() const {
+ return hydrogen()->prototypes();
+ }
+ ZoneList<Handle<Map> >* maps() const { return hydrogen()->maps(); }
+};
+
+
class LCheckSmi: public LTemplateInstruction<1, 1, 0> {
public:
explicit LCheckSmi(LOperand* value) {
@@ -2610,7 +2642,7 @@ class LChunkBuilder BASE_EMBEDDED {
bool is_done() const { return status_ == DONE; }
bool is_aborted() const { return status_ == ABORTED; }
- void Abort(BailoutReason reason);
+ void Abort(const char* reason);
// Methods for getting operands for Use / Define / Temp.
LUnallocated* ToUnallocated(Register reg);
@@ -2692,8 +2724,7 @@ class LChunkBuilder BASE_EMBEDDED {
CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
- int* argument_index_accumulator,
- ZoneList<HValue*>* objects_to_materialize);
+ int* argument_index_accumulator);
void VisitInstruction(HInstruction* current);
diff --git a/chromium/v8/src/mips/macro-assembler-mips.cc b/chromium/v8/src/mips/macro-assembler-mips.cc
index e53f10afaca..ea08a552be5 100644
--- a/chromium/v8/src/mips/macro-assembler-mips.cc
+++ b/chromium/v8/src/mips/macro-assembler-mips.cc
@@ -256,7 +256,7 @@ void MacroAssembler::RecordWrite(Register object,
if (emit_debug_code()) {
lw(at, MemOperand(address));
Assert(
- eq, kWrongAddressOrValuePassedToRecordWrite, at, Operand(value));
+ eq, "Wrong address or value passed to RecordWrite", at, Operand(value));
}
Label done;
@@ -358,7 +358,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
lw(scratch, MemOperand(fp, StandardFrameConstants::kContextOffset));
// In debug mode, make sure the lexical context is set.
#ifdef DEBUG
- Check(ne, kWeShouldNotHaveAnEmptyLexicalContext,
+ Check(ne, "we should not have an empty lexical context",
scratch, Operand(zero_reg));
#endif
@@ -374,7 +374,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
// Read the first word and compare to the native_context_map.
lw(holder_reg, FieldMemOperand(scratch, HeapObject::kMapOffset));
LoadRoot(at, Heap::kNativeContextMapRootIndex);
- Check(eq, kJSGlobalObjectNativeContextShouldBeANativeContext,
+ Check(eq, "JSGlobalObject::native_context should be a native context.",
holder_reg, Operand(at));
pop(holder_reg); // Restore holder.
}
@@ -388,12 +388,12 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
push(holder_reg); // Temporarily save holder on the stack.
mov(holder_reg, at); // Move at to its holding place.
LoadRoot(at, Heap::kNullValueRootIndex);
- Check(ne, kJSGlobalProxyContextShouldNotBeNull,
+ Check(ne, "JSGlobalProxy::context() should not be null.",
holder_reg, Operand(at));
lw(holder_reg, FieldMemOperand(holder_reg, HeapObject::kMapOffset));
LoadRoot(at, Heap::kNativeContextMapRootIndex);
- Check(eq, kJSGlobalObjectNativeContextShouldBeANativeContext,
+ Check(eq, "JSGlobalObject::native_context should be a native context.",
holder_reg, Operand(at));
// Restore at is not needed. at is reloaded below.
pop(holder_reg); // Restore holder.
@@ -2923,7 +2923,9 @@ void MacroAssembler::Allocate(int object_size,
// Set up allocation top address and object size registers.
Register topaddr = scratch1;
+ Register obj_size_reg = scratch2;
li(topaddr, Operand(allocation_top));
+ li(obj_size_reg, Operand(object_size));
// This code stores a temporary value in t9.
if ((flags & RESULT_CONTAINS_TOP) == 0) {
@@ -2936,29 +2938,15 @@ void MacroAssembler::Allocate(int object_size,
// immediately below so this use of t9 does not cause difference with
// respect to register content between debug and release mode.
lw(t9, MemOperand(topaddr));
- Check(eq, kUnexpectedAllocationTop, result, Operand(t9));
+ Check(eq, "Unexpected allocation top", result, Operand(t9));
}
// Load allocation limit into t9. Result already contains allocation top.
lw(t9, MemOperand(topaddr, limit - top));
}
- if ((flags & DOUBLE_ALIGNMENT) != 0) {
- // Align the next allocation. Storing the filler map without checking top is
- // always safe because the limit of the heap is always aligned.
- ASSERT((flags & PRETENURE_OLD_POINTER_SPACE) == 0);
- ASSERT(kPointerAlignment * 2 == kDoubleAlignment);
- And(scratch2, result, Operand(kDoubleAlignmentMask));
- Label aligned;
- Branch(&aligned, eq, scratch2, Operand(zero_reg));
- li(scratch2, Operand(isolate()->factory()->one_pointer_filler_map()));
- sw(scratch2, MemOperand(result));
- Addu(result, result, Operand(kDoubleSize / 2));
- bind(&aligned);
- }
-
// Calculate new top and bail out if new space is exhausted. Use result
// to calculate the new top.
- Addu(scratch2, result, Operand(object_size));
+ Addu(scratch2, result, Operand(obj_size_reg));
Branch(gc_required, Ugreater, scratch2, Operand(t9));
sw(scratch2, MemOperand(topaddr));
@@ -3020,26 +3008,12 @@ void MacroAssembler::Allocate(Register object_size,
// immediately below so this use of t9 does not cause difference with
// respect to register content between debug and release mode.
lw(t9, MemOperand(topaddr));
- Check(eq, kUnexpectedAllocationTop, result, Operand(t9));
+ Check(eq, "Unexpected allocation top", result, Operand(t9));
}
// Load allocation limit into t9. Result already contains allocation top.
lw(t9, MemOperand(topaddr, limit - top));
}
- if ((flags & DOUBLE_ALIGNMENT) != 0) {
- // Align the next allocation. Storing the filler map without checking top is
- // always safe because the limit of the heap is always aligned.
- ASSERT((flags & PRETENURE_OLD_POINTER_SPACE) == 0);
- ASSERT(kPointerAlignment * 2 == kDoubleAlignment);
- And(scratch2, result, Operand(kDoubleAlignmentMask));
- Label aligned;
- Branch(&aligned, eq, scratch2, Operand(zero_reg));
- li(scratch2, Operand(isolate()->factory()->one_pointer_filler_map()));
- sw(scratch2, MemOperand(result));
- Addu(result, result, Operand(kDoubleSize / 2));
- bind(&aligned);
- }
-
// Calculate new top and bail out if new space is exhausted. Use result
// to calculate the new top. Object size may be in words so a shift is
// required to get the number of bytes.
@@ -3054,7 +3028,7 @@ void MacroAssembler::Allocate(Register object_size,
// Update allocation top. result temporarily holds the new top.
if (emit_debug_code()) {
And(t9, scratch2, Operand(kObjectAlignmentMask));
- Check(eq, kUnalignedAllocationInNewSpace, t9, Operand(zero_reg));
+ Check(eq, "Unaligned allocation in new space", t9, Operand(zero_reg));
}
sw(scratch2, MemOperand(topaddr));
@@ -3076,7 +3050,7 @@ void MacroAssembler::UndoAllocationInNewSpace(Register object,
// Check that the object un-allocated is below the current top.
li(scratch, Operand(new_space_allocation_top));
lw(scratch, MemOperand(scratch));
- Check(less, kUndoAllocationOfNonAllocatedMemory,
+ Check(less, "Undo allocation of non allocated memory",
object, Operand(scratch));
#endif
// Write the address of the object to un-allocate as the current top.
@@ -3329,7 +3303,7 @@ void MacroAssembler::CopyBytes(Register src,
bind(&word_loop);
if (emit_debug_code()) {
And(scratch, src, kPointerSize - 1);
- Assert(eq, kExpectingAlignmentForCopyBytes,
+ Assert(eq, "Expecting alignment for CopyBytes",
scratch, Operand(zero_reg));
}
Branch(&byte_loop, lt, length, Operand(kPointerSize));
@@ -4055,7 +4029,7 @@ void MacroAssembler::CallApiFunctionAndReturn(ExternalReference function,
sw(s0, MemOperand(s3, kNextOffset));
if (emit_debug_code()) {
lw(a1, MemOperand(s3, kLevelOffset));
- Check(eq, kUnexpectedLevelAfterReturnFromApiCall, a1, Operand(s2));
+ Check(eq, "Unexpected level after return from api call", a1, Operand(s2));
}
Subu(s2, s2, Operand(1));
sw(s2, MemOperand(s3, kLevelOffset));
@@ -4409,10 +4383,10 @@ void MacroAssembler::DecrementCounter(StatsCounter* counter, int value,
// -----------------------------------------------------------------------------
// Debugging.
-void MacroAssembler::Assert(Condition cc, BailoutReason reason,
+void MacroAssembler::Assert(Condition cc, const char* msg,
Register rs, Operand rt) {
if (emit_debug_code())
- Check(cc, reason, rs, rt);
+ Check(cc, msg, rs, rt);
}
@@ -4420,7 +4394,7 @@ void MacroAssembler::AssertRegisterIsRoot(Register reg,
Heap::RootListIndex index) {
if (emit_debug_code()) {
LoadRoot(at, index);
- Check(eq, kRegisterDidNotMatchExpectedRoot, reg, Operand(at));
+ Check(eq, "Register did not match expected root", reg, Operand(at));
}
}
@@ -4437,24 +4411,24 @@ void MacroAssembler::AssertFastElements(Register elements) {
Branch(&ok, eq, elements, Operand(at));
LoadRoot(at, Heap::kFixedCOWArrayMapRootIndex);
Branch(&ok, eq, elements, Operand(at));
- Abort(kJSObjectWithFastElementsMapHasSlowElements);
+ Abort("JSObject with fast elements map has slow elements");
bind(&ok);
pop(elements);
}
}
-void MacroAssembler::Check(Condition cc, BailoutReason reason,
+void MacroAssembler::Check(Condition cc, const char* msg,
Register rs, Operand rt) {
Label L;
Branch(&L, cc, rs, rt);
- Abort(reason);
+ Abort(msg);
// Will not return here.
bind(&L);
}
-void MacroAssembler::Abort(BailoutReason reason) {
+void MacroAssembler::Abort(const char* msg) {
Label abort_start;
bind(&abort_start);
// We want to pass the msg string like a smi to avoid GC
@@ -4462,7 +4436,6 @@ void MacroAssembler::Abort(BailoutReason reason) {
// properly. Instead, we pass an aligned pointer that is
// a proper v8 smi, but also pass the alignment difference
// from the real pointer as a smi.
- const char* msg = GetBailoutReason(reason);
intptr_t p1 = reinterpret_cast<intptr_t>(msg);
intptr_t p0 = (p1 & ~kSmiTagMask) + kSmiTag;
ASSERT(reinterpret_cast<Object*>(p0)->IsSmi());
@@ -4606,7 +4579,7 @@ void MacroAssembler::LoadGlobalFunctionInitialMap(Register function,
CheckMap(map, scratch, Heap::kMetaMapRootIndex, &fail, DO_SMI_CHECK);
Branch(&ok);
bind(&fail);
- Abort(kGlobalFunctionsMustHaveInitialMap);
+ Abort("Global functions must have initial map");
bind(&ok);
}
}
@@ -4889,7 +4862,7 @@ void MacroAssembler::AssertNotSmi(Register object) {
if (emit_debug_code()) {
STATIC_ASSERT(kSmiTag == 0);
andi(at, object, kSmiTagMask);
- Check(ne, kOperandIsASmi, at, Operand(zero_reg));
+ Check(ne, "Operand is a smi", at, Operand(zero_reg));
}
}
@@ -4898,7 +4871,7 @@ void MacroAssembler::AssertSmi(Register object) {
if (emit_debug_code()) {
STATIC_ASSERT(kSmiTag == 0);
andi(at, object, kSmiTagMask);
- Check(eq, kOperandIsASmi, at, Operand(zero_reg));
+ Check(eq, "Operand is a smi", at, Operand(zero_reg));
}
}
@@ -4907,11 +4880,11 @@ void MacroAssembler::AssertString(Register object) {
if (emit_debug_code()) {
STATIC_ASSERT(kSmiTag == 0);
And(t0, object, Operand(kSmiTagMask));
- Check(ne, kOperandIsASmiAndNotAString, t0, Operand(zero_reg));
+ Check(ne, "Operand is a smi and not a string", t0, Operand(zero_reg));
push(object);
lw(object, FieldMemOperand(object, HeapObject::kMapOffset));
lbu(object, FieldMemOperand(object, Map::kInstanceTypeOffset));
- Check(lo, kOperandIsNotAString, object, Operand(FIRST_NONSTRING_TYPE));
+ Check(lo, "Operand is not a string", object, Operand(FIRST_NONSTRING_TYPE));
pop(object);
}
}
@@ -4921,11 +4894,11 @@ void MacroAssembler::AssertName(Register object) {
if (emit_debug_code()) {
STATIC_ASSERT(kSmiTag == 0);
And(t0, object, Operand(kSmiTagMask));
- Check(ne, kOperandIsASmiAndNotAName, t0, Operand(zero_reg));
+ Check(ne, "Operand is a smi and not a name", t0, Operand(zero_reg));
push(object);
lw(object, FieldMemOperand(object, HeapObject::kMapOffset));
lbu(object, FieldMemOperand(object, Map::kInstanceTypeOffset));
- Check(le, kOperandIsNotAName, object, Operand(LAST_NAME_TYPE));
+ Check(le, "Operand is not a name", object, Operand(LAST_NAME_TYPE));
pop(object);
}
}
@@ -4933,11 +4906,11 @@ void MacroAssembler::AssertName(Register object) {
void MacroAssembler::AssertRootValue(Register src,
Heap::RootListIndex root_value_index,
- BailoutReason reason) {
+ const char* message) {
if (emit_debug_code()) {
ASSERT(!src.is(at));
LoadRoot(at, root_value_index);
- Check(eq, reason, src, Operand(at));
+ Check(eq, message, src, Operand(at));
}
}
@@ -5154,7 +5127,7 @@ void MacroAssembler::PatchRelocatedValue(Register li_location,
// At this point scratch is a lui(at, ...) instruction.
if (emit_debug_code()) {
And(scratch, scratch, kOpcodeMask);
- Check(eq, kTheInstructionToPatchShouldBeALui,
+ Check(eq, "The instruction to patch should be a lui.",
scratch, Operand(LUI));
lw(scratch, MemOperand(li_location));
}
@@ -5166,7 +5139,7 @@ void MacroAssembler::PatchRelocatedValue(Register li_location,
// scratch is now ori(at, ...).
if (emit_debug_code()) {
And(scratch, scratch, kOpcodeMask);
- Check(eq, kTheInstructionToPatchShouldBeAnOri,
+ Check(eq, "The instruction to patch should be an ori.",
scratch, Operand(ORI));
lw(scratch, MemOperand(li_location, kInstrSize));
}
@@ -5183,7 +5156,7 @@ void MacroAssembler::GetRelocatedValue(Register li_location,
lw(value, MemOperand(li_location));
if (emit_debug_code()) {
And(value, value, kOpcodeMask);
- Check(eq, kTheInstructionShouldBeALui,
+ Check(eq, "The instruction should be a lui.",
value, Operand(LUI));
lw(value, MemOperand(li_location));
}
@@ -5194,7 +5167,7 @@ void MacroAssembler::GetRelocatedValue(Register li_location,
lw(scratch, MemOperand(li_location, kInstrSize));
if (emit_debug_code()) {
And(scratch, scratch, kOpcodeMask);
- Check(eq, kTheInstructionShouldBeAnOri,
+ Check(eq, "The instruction should be an ori.",
scratch, Operand(ORI));
lw(scratch, MemOperand(li_location, kInstrSize));
}
diff --git a/chromium/v8/src/mips/macro-assembler-mips.h b/chromium/v8/src/mips/macro-assembler-mips.h
index 61a0c3a228f..bc3e7c48b4a 100644
--- a/chromium/v8/src/mips/macro-assembler-mips.h
+++ b/chromium/v8/src/mips/macro-assembler-mips.h
@@ -51,6 +51,20 @@ class JumpTarget;
// MIPS generated code calls C code, it must be via t9 register.
+// Flags used for the AllocateInNewSpace functions.
+enum AllocationFlags {
+ // No special flags.
+ NO_ALLOCATION_FLAGS = 0,
+ // Return the pointer to the allocated already tagged as a heap object.
+ TAG_OBJECT = 1 << 0,
+ // The content of the result register already contains the allocation top in
+ // new space.
+ RESULT_CONTAINS_TOP = 1 << 1,
+ // Specify that the requested size of the space to allocate is specified in
+ // words instead of bytes.
+ SIZE_IN_WORDS = 1 << 2
+};
+
// Flags used for AllocateHeapNumber
enum TaggingMode {
// Tag the result.
@@ -613,11 +627,11 @@ class MacroAssembler: public Assembler {
void MultiPushFPU(RegList regs);
void MultiPushReversedFPU(RegList regs);
+ // Lower case push() for compatibility with arch-independent code.
void push(Register src) {
Addu(sp, sp, Operand(-kPointerSize));
sw(src, MemOperand(sp, 0));
}
- void Push(Register src) { push(src); }
// Push a handle.
void Push(Handle<Object> handle);
@@ -662,11 +676,11 @@ class MacroAssembler: public Assembler {
void MultiPopFPU(RegList regs);
void MultiPopReversedFPU(RegList regs);
+ // Lower case pop() for compatibility with arch-independent code.
void pop(Register dst) {
lw(dst, MemOperand(sp, 0));
Addu(sp, sp, Operand(kPointerSize));
}
- void Pop(Register dst) { pop(dst); }
// Pop two registers. Pops rightmost register first (from lower address).
void Pop(Register src1, Register src2) {
@@ -1272,15 +1286,15 @@ class MacroAssembler: public Assembler {
// Calls Abort(msg) if the condition cc is not satisfied.
// Use --debug_code to enable.
- void Assert(Condition cc, BailoutReason reason, Register rs, Operand rt);
+ void Assert(Condition cc, const char* msg, Register rs, Operand rt);
void AssertRegisterIsRoot(Register reg, Heap::RootListIndex index);
void AssertFastElements(Register elements);
// Like Assert(), but always enabled.
- void Check(Condition cc, BailoutReason reason, Register rs, Operand rt);
+ void Check(Condition cc, const char* msg, Register rs, Operand rt);
// Print a message to stdout and abort execution.
- void Abort(BailoutReason msg);
+ void Abort(const char* msg);
// Verify restrictions about code generated in stubs.
void set_generating_stub(bool value) { generating_stub_ = value; }
@@ -1364,7 +1378,7 @@ class MacroAssembler: public Assembler {
// enabled via --debug-code.
void AssertRootValue(Register src,
Heap::RootListIndex root_value_index,
- BailoutReason reason);
+ const char* message);
// ---------------------------------------------------------------------------
// HeapNumber utilities.
diff --git a/chromium/v8/src/object-observe.js b/chromium/v8/src/object-observe.js
index f5e0d9d563a..a5c12bf0098 100644
--- a/chromium/v8/src/object-observe.js
+++ b/chromium/v8/src/object-observe.js
@@ -394,10 +394,7 @@ function ObjectGetNotifier(object) {
if (ObjectIsFrozen(object)) return null;
var objectInfo = objectInfoMap.get(object);
- if (IS_UNDEFINED(objectInfo)) {
- objectInfo = CreateObjectInfo(object);
- %SetIsObserved(object);
- }
+ if (IS_UNDEFINED(objectInfo)) objectInfo = CreateObjectInfo(object);
if (IS_NULL(objectInfo.notifier)) {
objectInfo.notifier = { __proto__: notifierPrototype };
diff --git a/chromium/v8/src/objects-debug.cc b/chromium/v8/src/objects-debug.cc
index e0cb8c92948..395f95ca7ea 100644
--- a/chromium/v8/src/objects-debug.cc
+++ b/chromium/v8/src/objects-debug.cc
@@ -366,12 +366,9 @@ void Map::SharedMapVerify() {
}
-void Map::VerifyOmittedMapChecks() {
- if (!FLAG_omit_map_checks_for_leaf_maps) return;
- if (!is_stable() ||
- is_deprecated() ||
- HasTransitionArray() ||
- is_dictionary_map()) {
+void Map::VerifyOmittedPrototypeChecks() {
+ if (!FLAG_omit_prototype_checks_for_leaf_maps) return;
+ if (HasTransitionArray() || is_dictionary_map()) {
CHECK_EQ(0, dependent_code()->number_of_entries(
DependentCode::kPrototypeCheckGroup));
}
diff --git a/chromium/v8/src/objects-inl.h b/chromium/v8/src/objects-inl.h
index 169475791d0..128dc6be281 100644
--- a/chromium/v8/src/objects-inl.h
+++ b/chromium/v8/src/objects-inl.h
@@ -3617,17 +3617,6 @@ bool Map::is_deprecated() {
}
-void Map::set_migration_target(bool value) {
- set_bit_field3(IsMigrationTarget::update(bit_field3(), value));
-}
-
-
-bool Map::is_migration_target() {
- if (!FLAG_track_fields) return false;
- return IsMigrationTarget::decode(bit_field3());
-}
-
-
void Map::freeze() {
set_bit_field3(IsFrozen::update(bit_field3(), true));
}
@@ -3688,6 +3677,11 @@ void Map::NotifyLeafMapLayoutChange() {
}
+bool Map::CanOmitPrototypeChecks() {
+ return is_stable() && FLAG_omit_prototype_checks_for_leaf_maps;
+}
+
+
bool Map::CanOmitMapChecks() {
return is_stable() && FLAG_omit_map_checks_for_leaf_maps;
}
@@ -3822,6 +3816,7 @@ inline void Code::set_is_crankshafted(bool value) {
int Code::major_key() {
ASSERT(kind() == STUB ||
+ kind() == UNARY_OP_IC ||
kind() == BINARY_OP_IC ||
kind() == COMPARE_IC ||
kind() == COMPARE_NIL_IC ||
@@ -3836,6 +3831,7 @@ int Code::major_key() {
void Code::set_major_key(int major) {
ASSERT(kind() == STUB ||
+ kind() == UNARY_OP_IC ||
kind() == BINARY_OP_IC ||
kind() == COMPARE_IC ||
kind() == COMPARE_NIL_IC ||
@@ -4025,6 +4021,21 @@ void Code::set_check_type(CheckType value) {
}
+byte Code::unary_op_type() {
+ ASSERT(is_unary_op_stub());
+ return UnaryOpTypeField::decode(
+ READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
+}
+
+
+void Code::set_unary_op_type(byte value) {
+ ASSERT(is_unary_op_stub());
+ int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
+ int updated = UnaryOpTypeField::update(previous, value);
+ WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
+}
+
+
byte Code::to_boolean_state() {
return extended_extra_ic_state();
}
@@ -4209,20 +4220,7 @@ void Map::InitializeDescriptors(DescriptorArray* descriptors) {
ACCESSORS(Map, instance_descriptors, DescriptorArray, kDescriptorsOffset)
-
-
-void Map::set_bit_field3(uint32_t bits) {
- // Ensure the upper 2 bits have the same value by sign extending it. This is
- // necessary to be able to use the 31st bit.
- int value = bits << 1;
- WRITE_FIELD(this, kBitField3Offset, Smi::FromInt(value >> 1));
-}
-
-
-uint32_t Map::bit_field3() {
- Object* value = READ_FIELD(this, kBitField3Offset);
- return Smi::cast(value)->value();
-}
+SMI_ACCESSORS(Map, bit_field3, kBitField3Offset)
void Map::ClearTransitions(Heap* heap, WriteBarrierMode mode) {
diff --git a/chromium/v8/src/objects-printer.cc b/chromium/v8/src/objects-printer.cc
index 7b6f7a478ce..87b2811e413 100644
--- a/chromium/v8/src/objects-printer.cc
+++ b/chromium/v8/src/objects-printer.cc
@@ -37,6 +37,9 @@ namespace internal {
#ifdef OBJECT_PRINT
+static const char* TypeToString(InstanceType type);
+
+
void MaybeObject::Print() {
Print(stdout);
}
@@ -506,12 +509,83 @@ void JSModule::JSModulePrint(FILE* out) {
static const char* TypeToString(InstanceType type) {
switch (type) {
-#define TYPE_TO_STRING(TYPE) case TYPE: return #TYPE;
- INSTANCE_TYPE_LIST(TYPE_TO_STRING)
-#undef TYPE_TO_STRING
+ case INVALID_TYPE: return "INVALID";
+ case MAP_TYPE: return "MAP";
+ case HEAP_NUMBER_TYPE: return "HEAP_NUMBER";
+ case SYMBOL_TYPE: return "SYMBOL";
+ case STRING_TYPE: return "TWO_BYTE_STRING";
+ case ASCII_STRING_TYPE: return "ASCII_STRING";
+ case CONS_STRING_TYPE:
+ case CONS_ASCII_STRING_TYPE:
+ return "CONS_STRING";
+ case EXTERNAL_STRING_TYPE:
+ case EXTERNAL_ASCII_STRING_TYPE:
+ case EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE:
+ return "EXTERNAL_STRING";
+ case SHORT_EXTERNAL_STRING_TYPE:
+ case SHORT_EXTERNAL_ASCII_STRING_TYPE:
+ case SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE:
+ return "SHORT_EXTERNAL_STRING";
+ case INTERNALIZED_STRING_TYPE: return "INTERNALIZED_STRING";
+ case ASCII_INTERNALIZED_STRING_TYPE: return "ASCII_INTERNALIZED_STRING";
+ case CONS_INTERNALIZED_STRING_TYPE: return "CONS_INTERNALIZED_STRING";
+ case CONS_ASCII_INTERNALIZED_STRING_TYPE:
+ return "CONS_ASCII_INTERNALIZED_STRING";
+ case EXTERNAL_INTERNALIZED_STRING_TYPE:
+ case EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE:
+ case EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE:
+ return "EXTERNAL_INTERNALIZED_STRING";
+ case SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE:
+ case SHORT_EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE:
+ case SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE:
+ return "SHORT_EXTERNAL_INTERNALIZED_STRING";
+ case FIXED_ARRAY_TYPE: return "FIXED_ARRAY";
+ case BYTE_ARRAY_TYPE: return "BYTE_ARRAY";
+ case FREE_SPACE_TYPE: return "FREE_SPACE";
+ case EXTERNAL_PIXEL_ARRAY_TYPE: return "EXTERNAL_PIXEL_ARRAY";
+ case EXTERNAL_BYTE_ARRAY_TYPE: return "EXTERNAL_BYTE_ARRAY";
+ case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
+ return "EXTERNAL_UNSIGNED_BYTE_ARRAY";
+ case EXTERNAL_SHORT_ARRAY_TYPE: return "EXTERNAL_SHORT_ARRAY";
+ case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
+ return "EXTERNAL_UNSIGNED_SHORT_ARRAY";
+ case EXTERNAL_INT_ARRAY_TYPE: return "EXTERNAL_INT_ARRAY";
+ case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
+ return "EXTERNAL_UNSIGNED_INT_ARRAY";
+ case EXTERNAL_FLOAT_ARRAY_TYPE: return "EXTERNAL_FLOAT_ARRAY";
+ case EXTERNAL_DOUBLE_ARRAY_TYPE: return "EXTERNAL_DOUBLE_ARRAY";
+ case FILLER_TYPE: return "FILLER";
+ case JS_OBJECT_TYPE: return "JS_OBJECT";
+ case JS_CONTEXT_EXTENSION_OBJECT_TYPE: return "JS_CONTEXT_EXTENSION_OBJECT";
+ case ODDBALL_TYPE: return "ODDBALL";
+ case CELL_TYPE: return "CELL";
+ case PROPERTY_CELL_TYPE: return "PROPERTY_CELL";
+ case SHARED_FUNCTION_INFO_TYPE: return "SHARED_FUNCTION_INFO";
+ case JS_GENERATOR_OBJECT_TYPE: return "JS_GENERATOR_OBJECT";
+ case JS_MODULE_TYPE: return "JS_MODULE";
+ case JS_FUNCTION_TYPE: return "JS_FUNCTION";
+ case CODE_TYPE: return "CODE";
+ case JS_ARRAY_TYPE: return "JS_ARRAY";
+ case JS_PROXY_TYPE: return "JS_PROXY";
+ case JS_SET_TYPE: return "JS_SET";
+ case JS_MAP_TYPE: return "JS_MAP";
+ case JS_WEAK_MAP_TYPE: return "JS_WEAK_MAP";
+ case JS_WEAK_SET_TYPE: return "JS_WEAK_SET";
+ case JS_REGEXP_TYPE: return "JS_REGEXP";
+ case JS_VALUE_TYPE: return "JS_VALUE";
+ case JS_GLOBAL_OBJECT_TYPE: return "JS_GLOBAL_OBJECT";
+ case JS_BUILTINS_OBJECT_TYPE: return "JS_BUILTINS_OBJECT";
+ case JS_GLOBAL_PROXY_TYPE: return "JS_GLOBAL_PROXY";
+ case JS_ARRAY_BUFFER_TYPE: return "JS_ARRAY_BUFFER";
+ case JS_TYPED_ARRAY_TYPE: return "JS_TYPED_ARRAY";
+ case JS_DATA_VIEW_TYPE: return "JS_DATA_VIEW";
+ case FOREIGN_TYPE: return "FOREIGN";
+ case JS_MESSAGE_OBJECT_TYPE: return "JS_MESSAGE_OBJECT_TYPE";
+#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return #NAME;
+ STRUCT_LIST(MAKE_STRUCT_CASE)
+#undef MAKE_STRUCT_CASE
+ default: return "UNKNOWN";
}
- UNREACHABLE();
- return "UNKNOWN"; // Keep the compiler happy.
}
diff --git a/chromium/v8/src/objects-visiting.h b/chromium/v8/src/objects-visiting.h
index 21757377a4f..32e457b869a 100644
--- a/chromium/v8/src/objects-visiting.h
+++ b/chromium/v8/src/objects-visiting.h
@@ -141,7 +141,7 @@ class StaticVisitorBase : public AllStatic {
(base == kVisitJSObject));
ASSERT(IsAligned(object_size, kPointerSize));
ASSERT(kMinObjectSizeInWords * kPointerSize <= object_size);
- ASSERT(object_size <= Page::kMaxNonCodeHeapObjectSize);
+ ASSERT(object_size < Page::kMaxNonCodeHeapObjectSize);
const VisitorId specialization = static_cast<VisitorId>(
base + (object_size >> kPointerSizeLog2) - kMinObjectSizeInWords);
diff --git a/chromium/v8/src/objects.cc b/chromium/v8/src/objects.cc
index 995ed36f022..2e9badbb2aa 100644
--- a/chromium/v8/src/objects.cc
+++ b/chromium/v8/src/objects.cc
@@ -2719,7 +2719,6 @@ MaybeObject* Map::GeneralizeRepresentation(int modify_index,
Handle<Map>(new_map);
return maybe_map;
}
- new_map->set_migration_target(true);
}
new_map->set_owns_descriptors(true);
@@ -6518,7 +6517,6 @@ MaybeObject* Map::CopyNormalized(PropertyNormalizationMode mode,
result->set_is_shared(sharing == SHARED_NORMALIZED_MAP);
result->set_dictionary_map(true);
- result->set_migration_target(false);
#ifdef VERIFY_HEAP
if (FLAG_verify_heap && result->is_shared()) {
@@ -9222,7 +9220,6 @@ void JSFunction::MarkForLazyRecompilation() {
ASSERT(!IsOptimized());
ASSERT(shared()->allows_lazy_compilation() ||
code()->optimizable());
- ASSERT(!shared()->is_generator());
set_code_no_write_barrier(
GetIsolate()->builtins()->builtin(Builtins::kLazyRecompile));
// No write barrier required, since the builtin is part of the root set.
@@ -9233,8 +9230,10 @@ void JSFunction::MarkForParallelRecompilation() {
ASSERT(is_compiled() || GetIsolate()->DebuggerHasBreakPoints());
ASSERT(!IsOptimized());
ASSERT(shared()->allows_lazy_compilation() || code()->optimizable());
- ASSERT(!shared()->is_generator());
- ASSERT(FLAG_parallel_recompilation);
+ if (!FLAG_parallel_recompilation) {
+ JSFunction::MarkForLazyRecompilation();
+ return;
+ }
if (FLAG_trace_parallel_recompilation) {
PrintF(" ** Marking ");
PrintName();
@@ -9805,7 +9804,7 @@ void SharedFunctionInfo::EnableDeoptimizationSupport(Code* recompiled) {
}
-void SharedFunctionInfo::DisableOptimization(BailoutReason reason) {
+void SharedFunctionInfo::DisableOptimization(const char* reason) {
// Disable optimization for the shared function info and mark the
// code as non-optimizable. The marker on the shared function info
// is there because we flush non-optimized code thereby loosing the
@@ -9823,7 +9822,7 @@ void SharedFunctionInfo::DisableOptimization(BailoutReason reason) {
if (FLAG_trace_opt) {
PrintF("[disabled optimization for ");
ShortPrint();
- PrintF(", reason: %s]\n", GetBailoutReason(reason));
+ PrintF(", reason: %s]\n", reason);
}
}
@@ -10636,14 +10635,7 @@ void DeoptimizationInputData::DeoptimizationInputDataPrint(FILE* out) {
break;
}
- case Translation::DUPLICATED_OBJECT: {
- int object_index = iterator.Next();
- PrintF(out, "{object_index=%d}", object_index);
- break;
- }
-
- case Translation::ARGUMENTS_OBJECT:
- case Translation::CAPTURED_OBJECT: {
+ case Translation::ARGUMENTS_OBJECT: {
int args_length = iterator.Next();
PrintF(out, "{length=%d}", args_length);
break;
@@ -10801,17 +10793,18 @@ void Code::Disassemble(const char* name, FILE* out) {
// If there is no back edge table, the "table start" will be at or after
// (due to alignment) the end of the instruction stream.
if (static_cast<int>(offset) < instruction_size()) {
- FullCodeGenerator::BackEdgeTableIterator back_edges(this);
-
- PrintF(out, "Back edges (size = %u)\n", back_edges.table_length());
+ Address back_edge_cursor = instruction_start() + offset;
+ uint32_t table_length = Memory::uint32_at(back_edge_cursor);
+ PrintF(out, "Back edges (size = %u)\n", table_length);
PrintF(out, "ast_id pc_offset loop_depth\n");
-
- for ( ; !back_edges.Done(); back_edges.Next()) {
- PrintF(out, "%6d %9u %10u\n", back_edges.ast_id().ToInt(),
- back_edges.pc_offset(),
- back_edges.loop_depth());
+ for (uint32_t i = 0; i < table_length; ++i) {
+ uint32_t ast_id = Memory::uint32_at(back_edge_cursor);
+ uint32_t pc_offset = Memory::uint32_at(back_edge_cursor + kIntSize);
+ uint32_t loop_depth = Memory::uint32_at(back_edge_cursor +
+ 2 * kIntSize);
+ PrintF(out, "%6u %9u %10u\n", ast_id, pc_offset, loop_depth);
+ back_edge_cursor += FullCodeGenerator::kBackEdgeEntrySize;
}
-
PrintF(out, "\n");
}
#ifdef OBJECT_PRINT
@@ -11354,7 +11347,6 @@ bool DependentCode::Contains(DependencyGroup group, Code* code) {
void DependentCode::DeoptimizeDependentCodeGroup(
Isolate* isolate,
DependentCode::DependencyGroup group) {
- ASSERT(AllowCodeDependencyChange::IsAllowed());
DisallowHeapAllocation no_allocation_scope;
DependentCode::GroupStartIndexes starts(this);
int start = starts.at(group);
@@ -15972,15 +15964,4 @@ void PropertyCell::AddDependentCode(Handle<Code> code) {
}
-const char* GetBailoutReason(BailoutReason reason) {
- ASSERT(reason < kLastErrorMessage);
-#define ERROR_MESSAGES_TEXTS(C, T) T,
- static const char* error_messages_[] = {
- ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
- };
-#undef ERROR_MESSAGES_TEXTS
- return error_messages_[reason];
-}
-
-
} } // namespace v8::internal
diff --git a/chromium/v8/src/objects.h b/chromium/v8/src/objects.h
index f800c5d580e..d370c32a1a4 100644
--- a/chromium/v8/src/objects.h
+++ b/chromium/v8/src/objects.h
@@ -333,7 +333,6 @@ const int kStubMinorKeyBits = kBitsPerInt - kSmiTagSize - kStubMajorKeyBits;
V(CONS_STRING_TYPE) \
V(CONS_ASCII_STRING_TYPE) \
V(SLICED_STRING_TYPE) \
- V(SLICED_ASCII_STRING_TYPE) \
V(EXTERNAL_STRING_TYPE) \
V(EXTERNAL_ASCII_STRING_TYPE) \
V(EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE) \
@@ -417,8 +416,6 @@ const int kStubMinorKeyBits = kBitsPerInt - kSmiTagSize - kStubMajorKeyBits;
V(JS_TYPED_ARRAY_TYPE) \
V(JS_DATA_VIEW_TYPE) \
V(JS_PROXY_TYPE) \
- V(JS_SET_TYPE) \
- V(JS_MAP_TYPE) \
V(JS_WEAK_MAP_TYPE) \
V(JS_WEAK_SET_TYPE) \
V(JS_REGEXP_TYPE) \
@@ -786,6 +783,7 @@ enum InstanceType {
// Pseudo-types
FIRST_TYPE = 0x0,
LAST_TYPE = JS_FUNCTION_TYPE,
+ INVALID_TYPE = FIRST_TYPE - 1,
FIRST_NAME_TYPE = FIRST_TYPE,
LAST_NAME_TYPE = SYMBOL_TYPE,
FIRST_UNIQUE_NAME_TYPE = INTERNALIZED_STRING_TYPE,
@@ -1048,287 +1046,7 @@ class MaybeObject BASE_EMBEDDED {
V(AccessCheckNeeded) \
V(Cell) \
V(PropertyCell) \
- V(ObjectHashTable)
-
-
-#define ERROR_MESSAGES_LIST(V) \
- V(kNoReason, "no reason") \
- \
- V(k32BitValueInRegisterIsNotZeroExtended, \
- "32 bit value in register is not zero-extended") \
- V(kAlignmentMarkerExpected, "alignment marker expected") \
- V(kAllocationIsNotDoubleAligned, "Allocation is not double aligned") \
- V(kAPICallReturnedInvalidObject, "API call returned invalid object") \
- V(kArgumentsObjectValueInATestContext, \
- "arguments object value in a test context") \
- V(kArrayBoilerplateCreationFailed, "array boilerplate creation failed") \
- V(kArrayIndexConstantValueTooBig, "array index constant value too big") \
- V(kAssignmentToArguments, "assignment to arguments") \
- V(kAssignmentToLetVariableBeforeInitialization, \
- "assignment to let variable before initialization") \
- V(kAssignmentToLOOKUPVariable, "assignment to LOOKUP variable") \
- V(kAssignmentToParameterFunctionUsesArgumentsObject, \
- "assignment to parameter, function uses arguments object") \
- V(kAssignmentToParameterInArgumentsObject, \
- "assignment to parameter in arguments object") \
- V(kAttemptToUseUndefinedCache, "Attempt to use undefined cache") \
- V(kBadValueContextForArgumentsObjectValue, \
- "bad value context for arguments object value") \
- V(kBadValueContextForArgumentsValue, \
- "bad value context for arguments value") \
- V(kBailedOutDueToDependencyChange, "bailed out due to dependency change") \
- V(kBailoutWasNotPrepared, "bailout was not prepared") \
- V(kBinaryStubGenerateFloatingPointCode, \
- "BinaryStub_GenerateFloatingPointCode") \
- V(kBothRegistersWereSmisInSelectNonSmi, \
- "Both registers were smis in SelectNonSmi") \
- V(kCallToAJavaScriptRuntimeFunction, \
- "call to a JavaScript runtime function") \
- V(kCannotTranslatePositionInChangedArea, \
- "Cannot translate position in changed area") \
- V(kCodeGenerationFailed, "code generation failed") \
- V(kCodeObjectNotProperlyPatched, "code object not properly patched") \
- V(kCompoundAssignmentToLookupSlot, "compound assignment to lookup slot") \
- V(kContextAllocatedArguments, "context-allocated arguments") \
- V(kDebuggerIsActive, "debugger is active") \
- V(kDebuggerStatement, "DebuggerStatement") \
- V(kDeclarationInCatchContext, "Declaration in catch context") \
- V(kDeclarationInWithContext, "Declaration in with context") \
- V(kDefaultNaNModeNotSet, "Default NaN mode not set") \
- V(kDeleteWithGlobalVariable, "delete with global variable") \
- V(kDeleteWithNonGlobalVariable, "delete with non-global variable") \
- V(kDestinationOfCopyNotAligned, "Destination of copy not aligned") \
- V(kDontDeleteCellsCannotContainTheHole, \
- "DontDelete cells can't contain the hole") \
- V(kDoPushArgumentNotImplementedForDoubleType, \
- "DoPushArgument not implemented for double type") \
- V(kEmitLoadRegisterUnsupportedDoubleImmediate, \
- "EmitLoadRegister: Unsupported double immediate") \
- V(kEval, "eval") \
- V(kExpected0AsASmiSentinel, "Expected 0 as a Smi sentinel") \
- V(kExpectedAlignmentMarker, "expected alignment marker") \
- V(kExpectedPropertyCellInRegisterA2, \
- "Expected property cell in register a2") \
- V(kExpectedPropertyCellInRegisterEbx, \
- "Expected property cell in register ebx") \
- V(kExpectedPropertyCellInRegisterRbx, \
- "Expected property cell in register rbx") \
- V(kExpectingAlignmentForCopyBytes, \
- "Expecting alignment for CopyBytes") \
- V(kExternalStringExpectedButNotFound, \
- "external string expected, but not found") \
- V(kFailedBailedOutLastTime, "failed/bailed out last time") \
- V(kForInStatementIsNotFastCase, "ForInStatement is not fast case") \
- V(kForInStatementOptimizationIsDisabled, \
- "ForInStatement optimization is disabled") \
- V(kForInStatementWithNonLocalEachVariable, \
- "ForInStatement with non-local each variable") \
- V(kForOfStatement, "ForOfStatement") \
- V(kFrameIsExpectedToBeAligned, "frame is expected to be aligned") \
- V(kFunctionCallsEval, "function calls eval") \
- V(kFunctionIsAGenerator, "function is a generator") \
- V(kFunctionWithIllegalRedeclaration, "function with illegal redeclaration") \
- V(kGeneratedCodeIsTooLarge, "Generated code is too large") \
- V(kGeneratorFailedToResume, "Generator failed to resume") \
- V(kGenerator, "generator") \
- V(kGlobalFunctionsMustHaveInitialMap, \
- "Global functions must have initial map") \
- V(kHeapNumberMapRegisterClobbered, "HeapNumberMap register clobbered") \
- V(kImproperObjectOnPrototypeChainForStore, \
- "improper object on prototype chain for store") \
- V(kIndexIsNegative, "Index is negative") \
- V(kIndexIsTooLarge, "Index is too large") \
- V(kInlinedRuntimeFunctionClassOf, "inlined runtime function: ClassOf") \
- V(kInlinedRuntimeFunctionFastAsciiArrayJoin, \
- "inlined runtime function: FastAsciiArrayJoin") \
- V(kInlinedRuntimeFunctionGeneratorNext, \
- "inlined runtime function: GeneratorNext") \
- V(kInlinedRuntimeFunctionGeneratorThrow, \
- "inlined runtime function: GeneratorThrow") \
- V(kInlinedRuntimeFunctionGetFromCache, \
- "inlined runtime function: GetFromCache") \
- V(kInlinedRuntimeFunctionIsNonNegativeSmi, \
- "inlined runtime function: IsNonNegativeSmi") \
- V(kInlinedRuntimeFunctionIsRegExpEquivalent, \
- "inlined runtime function: IsRegExpEquivalent") \
- V(kInlinedRuntimeFunctionIsStringWrapperSafeForDefaultValueOf, \
- "inlined runtime function: IsStringWrapperSafeForDefaultValueOf") \
- V(kInliningBailedOut, "inlining bailed out") \
- V(kInputGPRIsExpectedToHaveUpper32Cleared, \
- "input GPR is expected to have upper32 cleared") \
- V(kInstanceofStubUnexpectedCallSiteCacheCheck, \
- "InstanceofStub unexpected call site cache (check)") \
- V(kInstanceofStubUnexpectedCallSiteCacheCmp1, \
- "InstanceofStub unexpected call site cache (cmp 1)") \
- V(kInstanceofStubUnexpectedCallSiteCacheCmp2, \
- "InstanceofStub unexpected call site cache (cmp 2)") \
- V(kInstanceofStubUnexpectedCallSiteCacheMov, \
- "InstanceofStub unexpected call site cache (mov)") \
- V(kInteger32ToSmiFieldWritingToNonSmiLocation, \
- "Integer32ToSmiField writing to non-smi location") \
- V(kInvalidCaptureReferenced, "Invalid capture referenced") \
- V(kInvalidElementsKindForInternalArrayOrInternalPackedArray, \
- "Invalid ElementsKind for InternalArray or InternalPackedArray") \
- V(kInvalidHandleScopeLevel, "Invalid HandleScope level") \
- V(kInvalidLeftHandSideInAssignment, "invalid left-hand side in assignment") \
- V(kInvalidLhsInCompoundAssignment, "invalid lhs in compound assignment") \
- V(kInvalidLhsInCountOperation, "invalid lhs in count operation") \
- V(kInvalidMinLength, "Invalid min_length") \
- V(kJSGlobalObjectNativeContextShouldBeANativeContext, \
- "JSGlobalObject::native_context should be a native context") \
- V(kJSGlobalProxyContextShouldNotBeNull, \
- "JSGlobalProxy::context() should not be null") \
- V(kJSObjectWithFastElementsMapHasSlowElements, \
- "JSObject with fast elements map has slow elements") \
- V(kLetBindingReInitialization, "Let binding re-initialization") \
- V(kLiveBytesCountOverflowChunkSize, "Live Bytes Count overflow chunk size") \
- V(kLiveEditFrameDroppingIsNotSupportedOnArm, \
- "LiveEdit frame dropping is not supported on arm") \
- V(kLiveEditFrameDroppingIsNotSupportedOnMips, \
- "LiveEdit frame dropping is not supported on mips") \
- V(kLiveEdit, "LiveEdit") \
- V(kLookupVariableInCountOperation, \
- "lookup variable in count operation") \
- V(kMapIsNoLongerInEax, "Map is no longer in eax") \
- V(kNoCasesLeft, "no cases left") \
- V(kNoEmptyArraysHereInEmitFastAsciiArrayJoin, \
- "No empty arrays here in EmitFastAsciiArrayJoin") \
- V(kNonInitializerAssignmentToConst, \
- "non-initializer assignment to const") \
- V(kNonSmiIndex, "Non-smi index") \
- V(kNonSmiKeyInArrayLiteral, "Non-smi key in array literal") \
- V(kNonSmiValue, "Non-smi value") \
- V(kNotEnoughVirtualRegistersForValues, \
- "not enough virtual registers for values") \
- V(kNotEnoughVirtualRegistersRegalloc, \
- "not enough virtual registers (regalloc)") \
- V(kObjectFoundInSmiOnlyArray, "object found in smi-only array") \
- V(kObjectLiteralWithComplexProperty, \
- "Object literal with complex property") \
- V(kOddballInStringTableIsNotUndefinedOrTheHole, \
- "oddball in string table is not undefined or the hole") \
- V(kOperandIsASmiAndNotAName, "Operand is a smi and not a name") \
- V(kOperandIsASmiAndNotAString, "Operand is a smi and not a string") \
- V(kOperandIsASmi, "Operand is a smi") \
- V(kOperandIsNotAName, "Operand is not a name") \
- V(kOperandIsNotANumber, "Operand is not a number") \
- V(kOperandIsNotASmi, "Operand is not a smi") \
- V(kOperandIsNotAString, "Operand is not a string") \
- V(kOperandIsNotSmi, "Operand is not smi") \
- V(kOperandNotANumber, "Operand not a number") \
- V(kOptimizedTooManyTimes, "optimized too many times") \
- V(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister, \
- "Out of virtual registers while trying to allocate temp register") \
- V(kParseScopeError, "parse/scope error") \
- V(kPossibleDirectCallToEval, "possible direct call to eval") \
- V(kPropertyAllocationCountFailed, "Property allocation count failed") \
- V(kReceivedInvalidReturnAddress, "Received invalid return address") \
- V(kReferenceToAVariableWhichRequiresDynamicLookup, \
- "reference to a variable which requires dynamic lookup") \
- V(kReferenceToGlobalLexicalVariable, \
- "reference to global lexical variable") \
- V(kReferenceToUninitializedVariable, "reference to uninitialized variable") \
- V(kRegisterDidNotMatchExpectedRoot, "Register did not match expected root") \
- V(kRegisterWasClobbered, "register was clobbered") \
- V(kScopedBlock, "ScopedBlock") \
- V(kSharedFunctionInfoLiteral, "SharedFunctionInfoLiteral") \
- V(kSmiAdditionOverflow, "Smi addition overflow") \
- V(kSmiSubtractionOverflow, "Smi subtraction overflow") \
- V(kStackFrameTypesMustMatch, "stack frame types must match") \
- V(kSwitchStatementMixedOrNonLiteralSwitchLabels, \
- "SwitchStatement: mixed or non-literal switch labels") \
- V(kSwitchStatementTooManyClauses, "SwitchStatement: too many clauses") \
- V(kTheInstructionShouldBeALui, "The instruction should be a lui") \
- V(kTheInstructionShouldBeAnOri, "The instruction should be an ori") \
- V(kTheInstructionToPatchShouldBeALoadFromPc, \
- "The instruction to patch should be a load from pc") \
- V(kTheInstructionToPatchShouldBeALui, \
- "The instruction to patch should be a lui") \
- V(kTheInstructionToPatchShouldBeAnOri, \
- "The instruction to patch should be an ori") \
- V(kTooManyParametersLocals, "too many parameters/locals") \
- V(kTooManyParameters, "too many parameters") \
- V(kTooManySpillSlotsNeededForOSR, "Too many spill slots needed for OSR") \
- V(kToOperandIsDoubleRegisterUnimplemented, \
- "ToOperand IsDoubleRegister unimplemented") \
- V(kToOperandUnsupportedDoubleImmediate, \
- "ToOperand Unsupported double immediate") \
- V(kTryCatchStatement, "TryCatchStatement") \
- V(kTryFinallyStatement, "TryFinallyStatement") \
- V(kUnableToEncodeValueAsSmi, "Unable to encode value as smi") \
- V(kUnalignedAllocationInNewSpace, "Unaligned allocation in new space") \
- V(kUndefinedValueNotLoaded, "Undefined value not loaded") \
- V(kUndoAllocationOfNonAllocatedMemory, \
- "Undo allocation of non allocated memory") \
- V(kUnexpectedAllocationTop, "Unexpected allocation top") \
- V(kUnexpectedElementsKindInArrayConstructor, \
- "Unexpected ElementsKind in array constructor") \
- V(kUnexpectedFallthroughFromCharCodeAtSlowCase, \
- "Unexpected fallthrough from CharCodeAt slow case") \
- V(kUnexpectedFallthroughFromCharFromCodeSlowCase, \
- "Unexpected fallthrough from CharFromCode slow case") \
- V(kUnexpectedFallThroughFromStringComparison, \
- "Unexpected fall-through from string comparison") \
- V(kUnexpectedFallThroughInBinaryStubGenerateFloatingPointCode, \
- "Unexpected fall-through in BinaryStub_GenerateFloatingPointCode") \
- V(kUnexpectedFallthroughToCharCodeAtSlowCase, \
- "Unexpected fallthrough to CharCodeAt slow case") \
- V(kUnexpectedFallthroughToCharFromCodeSlowCase, \
- "Unexpected fallthrough to CharFromCode slow case") \
- V(kUnexpectedFPUStackDepthAfterInstruction, \
- "Unexpected FPU stack depth after instruction") \
- V(kUnexpectedInitialMapForArrayFunction1, \
- "Unexpected initial map for Array function (1)") \
- V(kUnexpectedInitialMapForArrayFunction2, \
- "Unexpected initial map for Array function (2)") \
- V(kUnexpectedInitialMapForArrayFunction, \
- "Unexpected initial map for Array function") \
- V(kUnexpectedInitialMapForInternalArrayFunction, \
- "Unexpected initial map for InternalArray function") \
- V(kUnexpectedLevelAfterReturnFromApiCall, \
- "Unexpected level after return from api call") \
- V(kUnexpectedNumberOfPreAllocatedPropertyFields, \
- "Unexpected number of pre-allocated property fields") \
- V(kUnexpectedStringFunction, "Unexpected String function") \
- V(kUnexpectedStringType, "Unexpected string type") \
- V(kUnexpectedStringWrapperInstanceSize, \
- "Unexpected string wrapper instance size") \
- V(kUnexpectedTypeForRegExpDataFixedArrayExpected, \
- "Unexpected type for RegExp data, FixedArray expected") \
- V(kUnexpectedUnusedPropertiesOfStringWrapper, \
- "Unexpected unused properties of string wrapper") \
- V(kUninitializedKSmiConstantRegister, "Uninitialized kSmiConstantRegister") \
- V(kUnknown, "unknown") \
- V(kUnsupportedConstCompoundAssignment, \
- "unsupported const compound assignment") \
- V(kUnsupportedCountOperationWithConst, \
- "unsupported count operation with const") \
- V(kUnsupportedDoubleImmediate, "unsupported double immediate") \
- V(kUnsupportedLetCompoundAssignment, "unsupported let compound assignment") \
- V(kUnsupportedLookupSlotInDeclaration, \
- "unsupported lookup slot in declaration") \
- V(kUnsupportedNonPrimitiveCompare, "Unsupported non-primitive compare") \
- V(kUnsupportedPhiUseOfArguments, "Unsupported phi use of arguments") \
- V(kUnsupportedPhiUseOfConstVariable, \
- "Unsupported phi use of const variable") \
- V(kUnsupportedTaggedImmediate, "unsupported tagged immediate") \
- V(kVariableResolvedToWithContext, "Variable resolved to with context") \
- V(kWeShouldNotHaveAnEmptyLexicalContext, \
- "we should not have an empty lexical context") \
- V(kWithStatement, "WithStatement") \
- V(kWrongAddressOrValuePassedToRecordWrite, \
- "Wrong address or value passed to RecordWrite")
-
-
-#define ERROR_MESSAGES_CONSTANTS(C, T) C,
-enum BailoutReason {
- ERROR_MESSAGES_LIST(ERROR_MESSAGES_CONSTANTS)
- kLastErrorMessage
-};
-#undef ERROR_MESSAGES_CONSTANTS
-
-
-const char* GetBailoutReason(BailoutReason reason);
+ V(ObjectHashTable) \
// Object is the abstract superclass for all classes in the
@@ -4783,6 +4501,7 @@ class Code: public HeapObject {
V(KEYED_CALL_IC) \
V(STORE_IC) \
V(KEYED_STORE_IC) \
+ V(UNARY_OP_IC) \
V(BINARY_OP_IC) \
V(COMPARE_IC) \
V(COMPARE_NIL_IC) \
@@ -4901,7 +4620,8 @@ class Code: public HeapObject {
// TODO(danno): This is a bit of a hack right now since there are still
// clients of this API that pass "extra" values in for argc. These clients
// should be retrofitted to used ExtendedExtraICState.
- return kind == COMPARE_NIL_IC || kind == TO_BOOLEAN_IC;
+ return kind == COMPARE_NIL_IC || kind == TO_BOOLEAN_IC ||
+ kind == UNARY_OP_IC;
}
inline StubType type(); // Only valid for monomorphic IC stubs.
@@ -4916,6 +4636,7 @@ class Code: public HeapObject {
inline bool is_keyed_store_stub() { return kind() == KEYED_STORE_IC; }
inline bool is_call_stub() { return kind() == CALL_IC; }
inline bool is_keyed_call_stub() { return kind() == KEYED_CALL_IC; }
+ inline bool is_unary_op_stub() { return kind() == UNARY_OP_IC; }
inline bool is_binary_op_stub() { return kind() == BINARY_OP_IC; }
inline bool is_compare_ic_stub() { return kind() == COMPARE_IC; }
inline bool is_compare_nil_ic_stub() { return kind() == COMPARE_NIL_IC; }
@@ -4989,6 +4710,10 @@ class Code: public HeapObject {
inline CheckType check_type();
inline void set_check_type(CheckType value);
+ // [type-recording unary op type]: For kind UNARY_OP_IC.
+ inline byte unary_op_type();
+ inline void set_unary_op_type(byte value);
+
// [to_boolean_foo]: For kind TO_BOOLEAN_IC tells what state the stub is in.
inline byte to_boolean_state();
@@ -5227,6 +4952,9 @@ class Code: public HeapObject {
// KindSpecificFlags1 layout (STUB and OPTIMIZED_FUNCTION)
static const int kStackSlotsFirstBit = 0;
static const int kStackSlotsBitCount = 24;
+ static const int kUnaryOpTypeFirstBit =
+ kStackSlotsFirstBit + kStackSlotsBitCount;
+ static const int kUnaryOpTypeBitCount = 3;
static const int kHasFunctionCacheFirstBit =
kStackSlotsFirstBit + kStackSlotsBitCount;
static const int kHasFunctionCacheBitCount = 1;
@@ -5235,12 +4963,15 @@ class Code: public HeapObject {
static const int kMarkedForDeoptimizationBitCount = 1;
STATIC_ASSERT(kStackSlotsFirstBit + kStackSlotsBitCount <= 32);
+ STATIC_ASSERT(kUnaryOpTypeFirstBit + kUnaryOpTypeBitCount <= 32);
STATIC_ASSERT(kHasFunctionCacheFirstBit + kHasFunctionCacheBitCount <= 32);
STATIC_ASSERT(kMarkedForDeoptimizationFirstBit +
kMarkedForDeoptimizationBitCount <= 32);
class StackSlotsField: public BitField<int,
kStackSlotsFirstBit, kStackSlotsBitCount> {}; // NOLINT
+ class UnaryOpTypeField: public BitField<int,
+ kUnaryOpTypeFirstBit, kUnaryOpTypeBitCount> {}; // NOLINT
class HasFunctionCacheField: public BitField<bool,
kHasFunctionCacheFirstBit, kHasFunctionCacheBitCount> {}; // NOLINT
class MarkedForDeoptimizationField: public BitField<bool,
@@ -5445,8 +5176,8 @@ class Map: public HeapObject {
inline void set_bit_field2(byte value);
// Bit field 3.
- inline uint32_t bit_field3();
- inline void set_bit_field3(uint32_t bits);
+ inline int bit_field3();
+ inline void set_bit_field3(int value);
class EnumLengthBits: public BitField<int, 0, 11> {};
class NumberOfOwnDescriptorsBits: public BitField<int, 11, 11> {};
@@ -5458,7 +5189,6 @@ class Map: public HeapObject {
class Deprecated: public BitField<bool, 27, 1> {};
class IsFrozen: public BitField<bool, 28, 1> {};
class IsUnstable: public BitField<bool, 29, 1> {};
- class IsMigrationTarget: public BitField<bool, 30, 1> {};
// Tells whether the object in the prototype property will be used
// for instances created from this function. If the prototype
@@ -5765,8 +5495,6 @@ class Map: public HeapObject {
inline bool is_frozen();
inline void mark_unstable();
inline bool is_stable();
- inline void set_migration_target(bool value);
- inline bool is_migration_target();
inline void deprecate();
inline bool is_deprecated();
inline bool CanBeDeprecated();
@@ -5913,6 +5641,7 @@ class Map: public HeapObject {
// the descriptor array.
inline void NotifyLeafMapLayoutChange();
+ inline bool CanOmitPrototypeChecks();
inline bool CanOmitMapChecks();
void AddDependentCompilationInfo(DependentCode::DependencyGroup group,
@@ -5929,7 +5658,7 @@ class Map: public HeapObject {
#ifdef VERIFY_HEAP
void SharedMapVerify();
- void VerifyOmittedMapChecks();
+ void VerifyOmittedPrototypeChecks();
#endif
inline int visitor_id();
@@ -6576,7 +6305,7 @@ class SharedFunctionInfo: public HeapObject {
// Disable (further) attempted optimization of all functions sharing this
// shared function info.
- void DisableOptimization(BailoutReason reason);
+ void DisableOptimization(const char* reason);
// Lookup the bailout ID and ASSERT that it exists in the non-optimized
// code, returns whether it asserted (i.e., always true if assertions are
@@ -10058,7 +9787,6 @@ class BreakPointInfo: public Struct {
V(kHandleScope, "handlescope", "(Handle scope)") \
V(kBuiltins, "builtins", "(Builtins)") \
V(kGlobalHandles, "globalhandles", "(Global handles)") \
- V(kEternalHandles, "eternalhandles", "(Eternal handles)") \
V(kThreadManager, "threadmanager", "(Thread manager)") \
V(kExtensions, "Extensions", "(Extensions)")
diff --git a/chromium/v8/src/optimizing-compiler-thread.cc b/chromium/v8/src/optimizing-compiler-thread.cc
index 337ddd4b2d2..21ef2371071 100644
--- a/chromium/v8/src/optimizing-compiler-thread.cc
+++ b/chromium/v8/src/optimizing-compiler-thread.cc
@@ -60,25 +60,12 @@ void OptimizingCompilerThread::Run() {
OS::Sleep(FLAG_parallel_recompilation_delay);
}
- switch (static_cast<StopFlag>(Acquire_Load(&stop_thread_))) {
- case CONTINUE:
- break;
- case STOP:
- if (FLAG_trace_parallel_recompilation) {
- time_spent_total_ = OS::Ticks() - epoch;
- }
- stop_semaphore_->Signal();
- return;
- case FLUSH:
- // The main thread is blocked, waiting for the stop semaphore.
- { AllowHandleDereference allow_handle_dereference;
- FlushInputQueue(true);
- }
- Release_Store(&queue_length_, static_cast<AtomicWord>(0));
- Release_Store(&stop_thread_, static_cast<AtomicWord>(CONTINUE));
- stop_semaphore_->Signal();
- // Return to start of consumer loop.
- continue;
+ if (Acquire_Load(&stop_thread_)) {
+ stop_semaphore_->Signal();
+ if (FLAG_trace_parallel_recompilation) {
+ time_spent_total_ = OS::Ticks() - epoch;
+ }
+ return;
}
int64_t compiling_start = 0;
@@ -95,9 +82,7 @@ void OptimizingCompilerThread::Run() {
void OptimizingCompilerThread::CompileNext() {
OptimizingCompiler* optimizing_compiler = NULL;
- bool result = input_queue_.Dequeue(&optimizing_compiler);
- USE(result);
- ASSERT(result);
+ input_queue_.Dequeue(&optimizing_compiler);
Barrier_AtomicIncrement(&queue_length_, static_cast<Atomic32>(-1));
// The function may have already been optimized by OSR. Simply continue.
@@ -117,61 +102,26 @@ void OptimizingCompilerThread::CompileNext() {
}
-void OptimizingCompilerThread::FlushInputQueue(bool restore_function_code) {
- OptimizingCompiler* optimizing_compiler;
- // The optimizing compiler is allocated in the CompilationInfo's zone.
- while (input_queue_.Dequeue(&optimizing_compiler)) {
- // This should not block, since we have one signal on the input queue
- // semaphore corresponding to each element in the input queue.
- input_queue_semaphore_->Wait();
- CompilationInfo* info = optimizing_compiler->info();
- if (restore_function_code) {
- Handle<JSFunction> function = info->closure();
- function->ReplaceCode(function->shared()->code());
- }
- delete info;
- }
-}
-
-
-void OptimizingCompilerThread::FlushOutputQueue(bool restore_function_code) {
- OptimizingCompiler* optimizing_compiler;
- // The optimizing compiler is allocated in the CompilationInfo's zone.
- while (output_queue_.Dequeue(&optimizing_compiler)) {
- CompilationInfo* info = optimizing_compiler->info();
- if (restore_function_code) {
- Handle<JSFunction> function = info->closure();
- function->ReplaceCode(function->shared()->code());
- }
- delete info;
- }
-}
-
-
-void OptimizingCompilerThread::Flush() {
- ASSERT(!IsOptimizerThread());
- Release_Store(&stop_thread_, static_cast<AtomicWord>(FLUSH));
- input_queue_semaphore_->Signal();
- stop_semaphore_->Wait();
- FlushOutputQueue(true);
-}
-
-
void OptimizingCompilerThread::Stop() {
ASSERT(!IsOptimizerThread());
- Release_Store(&stop_thread_, static_cast<AtomicWord>(STOP));
+ Release_Store(&stop_thread_, static_cast<AtomicWord>(true));
input_queue_semaphore_->Signal();
stop_semaphore_->Wait();
if (FLAG_parallel_recompilation_delay != 0) {
// Barrier when loading queue length is not necessary since the write
// happens in CompileNext on the same thread.
- // This is used only for testing.
while (NoBarrier_Load(&queue_length_) > 0) CompileNext();
InstallOptimizedFunctions();
} else {
- FlushInputQueue(false);
- FlushOutputQueue(false);
+ OptimizingCompiler* optimizing_compiler;
+ // The optimizing compiler is allocated in the CompilationInfo's zone.
+ while (input_queue_.Dequeue(&optimizing_compiler)) {
+ delete optimizing_compiler->info();
+ }
+ while (output_queue_.Dequeue(&optimizing_compiler)) {
+ delete optimizing_compiler->info();
+ }
}
if (FLAG_trace_parallel_recompilation) {
diff --git a/chromium/v8/src/optimizing-compiler-thread.h b/chromium/v8/src/optimizing-compiler-thread.h
index cbd4d0e4872..275ceb40b71 100644
--- a/chromium/v8/src/optimizing-compiler-thread.h
+++ b/chromium/v8/src/optimizing-compiler-thread.h
@@ -54,13 +54,13 @@ class OptimizingCompilerThread : public Thread {
install_mutex_(OS::CreateMutex()),
time_spent_compiling_(0),
time_spent_total_(0) {
- NoBarrier_Store(&stop_thread_, static_cast<AtomicWord>(CONTINUE));
+ NoBarrier_Store(&stop_thread_, static_cast<AtomicWord>(false));
NoBarrier_Store(&queue_length_, static_cast<AtomicWord>(0));
}
void Run();
void Stop();
- void Flush();
+ void CompileNext();
void QueueForOptimization(OptimizingCompiler* optimizing_compiler);
void InstallOptimizedFunctions();
@@ -92,13 +92,6 @@ class OptimizingCompilerThread : public Thread {
}
private:
- enum StopFlag { CONTINUE, STOP, FLUSH };
-
- void FlushInputQueue(bool restore_function_code);
- void FlushOutputQueue(bool restore_function_code);
-
- void CompileNext();
-
#ifdef DEBUG
int thread_id_;
Mutex* thread_id_mutex_;
diff --git a/chromium/v8/src/parser.cc b/chromium/v8/src/parser.cc
index 4947790395f..df568ef1bbb 100644
--- a/chromium/v8/src/parser.cc
+++ b/chromium/v8/src/parser.cc
@@ -3197,20 +3197,6 @@ Expression* Parser::ParseUnaryExpression(bool* ok) {
factory()->NewNumberLiteral(1),
position);
}
- // The same idea for '-foo' => 'foo*(-1)'.
- if (op == Token::SUB) {
- return factory()->NewBinaryOperation(Token::MUL,
- expression,
- factory()->NewNumberLiteral(-1),
- position);
- }
- // ...and one more time for '~foo' => 'foo^(~0)'.
- if (op == Token::BIT_NOT) {
- return factory()->NewBinaryOperation(Token::BIT_XOR,
- expression,
- factory()->NewNumberLiteral(~0),
- position);
- }
return factory()->NewUnaryOperation(op, expression, position);
diff --git a/chromium/v8/src/platform-linux.cc b/chromium/v8/src/platform-linux.cc
index 885683398e2..5c252bbf884 100644
--- a/chromium/v8/src/platform-linux.cc
+++ b/chromium/v8/src/platform-linux.cc
@@ -239,8 +239,7 @@ bool OS::ArmUsingHardFloat() {
#else
#if defined(__ARM_PCS_VFP)
return true;
-#elif defined(__ARM_PCS) || defined(__SOFTFP__) || defined(__SOFTFP) || \
- !defined(__VFP_FP__)
+#elif defined(__ARM_PCS) || defined(__SOFTFP) || !defined(__VFP_FP__)
return false;
#else
#error "Your version of GCC does not report the FP ABI compiled for." \
diff --git a/chromium/v8/src/profile-generator-inl.h b/chromium/v8/src/profile-generator-inl.h
index 6791c88c56e..d92085ac32d 100644
--- a/chromium/v8/src/profile-generator-inl.h
+++ b/chromium/v8/src/profile-generator-inl.h
@@ -92,8 +92,6 @@ CodeEntry* ProfileGenerator::EntryForVMState(StateTag tag) {
case OTHER:
case EXTERNAL:
return program_entry_;
- case IDLE:
- return idle_entry_;
default: return NULL;
}
}
diff --git a/chromium/v8/src/profile-generator.cc b/chromium/v8/src/profile-generator.cc
index 86bd17b70a0..e772a546471 100644
--- a/chromium/v8/src/profile-generator.cc
+++ b/chromium/v8/src/profile-generator.cc
@@ -220,7 +220,7 @@ double ProfileNode::GetTotalMillis() const {
void ProfileNode::Print(int indent) {
- OS::Print("%5u %5u %*c %s%s %d #%d",
+ OS::Print("%5u %5u %*c %s%s #%d %d",
total_ticks_, self_ticks_,
indent, ' ',
entry_->name_prefix(),
@@ -614,8 +614,6 @@ const char* const ProfileGenerator::kAnonymousFunctionName =
"(anonymous function)";
const char* const ProfileGenerator::kProgramEntryName =
"(program)";
-const char* const ProfileGenerator::kIdleEntryName =
- "(idle)";
const char* const ProfileGenerator::kGarbageCollectorEntryName =
"(garbage collector)";
const char* const ProfileGenerator::kUnresolvedFunctionName =
@@ -626,8 +624,6 @@ ProfileGenerator::ProfileGenerator(CpuProfilesCollection* profiles)
: profiles_(profiles),
program_entry_(
profiles->NewCodeEntry(Logger::FUNCTION_TAG, kProgramEntryName)),
- idle_entry_(
- profiles->NewCodeEntry(Logger::FUNCTION_TAG, kIdleEntryName)),
gc_entry_(
profiles->NewCodeEntry(Logger::BUILTIN_TAG,
kGarbageCollectorEntryName)),
diff --git a/chromium/v8/src/profile-generator.h b/chromium/v8/src/profile-generator.h
index 99aeb1f5c7f..0cc397ed9bf 100644
--- a/chromium/v8/src/profile-generator.h
+++ b/chromium/v8/src/profile-generator.h
@@ -342,7 +342,6 @@ class ProfileGenerator {
static const char* const kAnonymousFunctionName;
static const char* const kProgramEntryName;
- static const char* const kIdleEntryName;
static const char* const kGarbageCollectorEntryName;
// Used to represent frames for which we have no reliable way to
// detect function.
@@ -354,7 +353,6 @@ class ProfileGenerator {
CpuProfilesCollection* profiles_;
CodeMap code_map_;
CodeEntry* program_entry_;
- CodeEntry* idle_entry_;
CodeEntry* gc_entry_;
CodeEntry* unresolved_entry_;
diff --git a/chromium/v8/src/runtime.cc b/chromium/v8/src/runtime.cc
index 10de6f9e5ec..ef6eeb3a497 100644
--- a/chromium/v8/src/runtime.cc
+++ b/chromium/v8/src/runtime.cc
@@ -66,30 +66,6 @@
#include "v8threads.h"
#include "vm-state-inl.h"
-#ifdef V8_I18N_SUPPORT
-#include "i18n.h"
-#include "unicode/brkiter.h"
-#include "unicode/calendar.h"
-#include "unicode/coll.h"
-#include "unicode/curramt.h"
-#include "unicode/datefmt.h"
-#include "unicode/dcfmtsym.h"
-#include "unicode/decimfmt.h"
-#include "unicode/dtfmtsym.h"
-#include "unicode/dtptngen.h"
-#include "unicode/locid.h"
-#include "unicode/numfmt.h"
-#include "unicode/numsys.h"
-#include "unicode/smpdtfmt.h"
-#include "unicode/timezone.h"
-#include "unicode/uchar.h"
-#include "unicode/ucol.h"
-#include "unicode/ucurr.h"
-#include "unicode/uloc.h"
-#include "unicode/unum.h"
-#include "unicode/uversion.h"
-#endif
-
#ifndef _STLP_VENDOR_CSTD
// STLPort doesn't import fpclassify and isless into the std namespace.
using std::fpclassify;
@@ -3020,7 +2996,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ResumeJSGeneratorObject) {
JavaScriptFrame* frame = stack_iterator.frame();
ASSERT_EQ(frame->function(), generator_object->function());
- ASSERT(frame->function()->is_compiled());
STATIC_ASSERT(JSGeneratorObject::kGeneratorExecuting <= 0);
STATIC_ASSERT(JSGeneratorObject::kGeneratorClosed <= 0);
@@ -7261,6 +7236,15 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberXor) {
}
+RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberNot) {
+ SealHandleScope shs(isolate);
+ ASSERT(args.length() == 1);
+
+ CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
+ return isolate->heap()->NumberFromInt32(~x);
+}
+
+
RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberShl) {
SealHandleScope shs(isolate);
ASSERT(args.length() == 2);
@@ -8495,7 +8479,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOptimizationStatus) {
}
CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
if (FLAG_parallel_recompilation && sync_with_compiler_thread) {
- while (function->IsInRecompileQueue() ||
+ while (function->IsMarkedForParallelRecompilation() ||
+ function->IsInRecompileQueue() ||
function->IsMarkedForInstallingRecompiledCode()) {
isolate->optimizing_compiler_thread()->InstallOptimizedFunctions();
OS::Sleep(50);
@@ -8562,21 +8547,23 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileForOnStackReplacement) {
// Use linear search of the unoptimized code's back edge table to find
// the AST id matching the PC.
- uint32_t target_pc_offset =
- static_cast<uint32_t>(frame->pc() - unoptimized->instruction_start());
+ Address start = unoptimized->instruction_start();
+ unsigned target_pc_offset = static_cast<unsigned>(frame->pc() - start);
+ Address table_cursor = start + unoptimized->back_edge_table_offset();
+ uint32_t table_length = Memory::uint32_at(table_cursor);
+ table_cursor += kIntSize;
uint32_t loop_depth = 0;
-
- for (FullCodeGenerator::BackEdgeTableIterator back_edges(*unoptimized);
- !back_edges.Done();
- back_edges.Next()) {
- if (back_edges.pc_offset() == target_pc_offset) {
- ast_id = back_edges.ast_id();
- loop_depth = back_edges.loop_depth();
+ for (unsigned i = 0; i < table_length; ++i) {
+ // Table entries are (AST id, pc offset) pairs.
+ uint32_t pc_offset = Memory::uint32_at(table_cursor + kIntSize);
+ if (pc_offset == target_pc_offset) {
+ ast_id = BailoutId(static_cast<int>(Memory::uint32_at(table_cursor)));
+ loop_depth = Memory::uint32_at(table_cursor + 2 * kIntSize);
break;
}
+ table_cursor += FullCodeGenerator::kBackEdgeEntrySize;
}
ASSERT(!ast_id.IsNone());
-
if (FLAG_trace_osr) {
PrintF("[replacing on-stack at AST id %d, loop depth %d in ",
ast_id.ToInt(), loop_depth);
@@ -8693,8 +8680,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Apply) {
CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 2);
CONVERT_SMI_ARG_CHECKED(offset, 3);
CONVERT_SMI_ARG_CHECKED(argc, 4);
- RUNTIME_ASSERT(offset >= 0);
- RUNTIME_ASSERT(argc >= 0);
+ ASSERT(offset >= 0);
+ ASSERT(argc >= 0);
// If there are too many arguments, allocate argv via malloc.
const int argv_small_size = 10;
@@ -9487,7 +9474,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ParseJson) {
ASSERT_EQ(1, args.length());
CONVERT_ARG_HANDLE_CHECKED(String, source, 0);
- source = Handle<String>(FlattenGetString(source));
+ source = Handle<String>(source->TryFlattenGetString());
// Optimized fast case where we only have ASCII characters.
Handle<Object> result;
if (source->IsSeqOneByteString()) {
@@ -11227,7 +11214,6 @@ static Handle<JSObject> MaterializeStackLocalsWithFrameInspector(
? frame_inspector->GetParameter(i)
: isolate->heap()->undefined_value(),
isolate);
- ASSERT(!value->IsTheHole());
RETURN_IF_EMPTY_HANDLE_VALUE(
isolate,
@@ -11242,15 +11228,12 @@ static Handle<JSObject> MaterializeStackLocalsWithFrameInspector(
// Second fill all stack locals.
for (int i = 0; i < scope_info->StackLocalCount(); ++i) {
- Handle<Object> value(frame_inspector->GetExpression(i), isolate);
- if (value->IsTheHole()) continue;
-
RETURN_IF_EMPTY_HANDLE_VALUE(
isolate,
SetProperty(isolate,
target,
Handle<String>(scope_info->StackLocalName(i)),
- value,
+ Handle<Object>(frame_inspector->GetExpression(i), isolate),
NONE,
kNonStrictMode),
Handle<JSObject>());
@@ -11277,7 +11260,6 @@ static void UpdateStackLocalsFromMaterializedObject(Isolate* isolate,
// Parameters.
for (int i = 0; i < scope_info->ParameterCount(); ++i) {
- ASSERT(!frame->GetParameter(i)->IsTheHole());
HandleScope scope(isolate);
Handle<Object> value = GetProperty(
isolate, target, Handle<String>(scope_info->ParameterName(i)));
@@ -11286,7 +11268,6 @@ static void UpdateStackLocalsFromMaterializedObject(Isolate* isolate,
// Stack locals.
for (int i = 0; i < scope_info->StackLocalCount(); ++i) {
- if (frame->GetExpression(i)->IsTheHole()) continue;
HandleScope scope(isolate);
Handle<Object> value = GetProperty(
isolate, target, Handle<String>(scope_info->StackLocalName(i)));
@@ -12021,15 +12002,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetStepInPositions) {
JavaScriptFrameIterator frame_it(isolate, id);
JavaScriptFrame* frame = frame_it.frame();
- Handle<JSFunction> fun =
- Handle<JSFunction>(frame->function());
Handle<SharedFunctionInfo> shared =
- Handle<SharedFunctionInfo>(fun->shared());
-
- if (!isolate->debug()->EnsureDebugInfo(shared, fun)) {
- return isolate->heap()->undefined_value();
- }
-
+ Handle<SharedFunctionInfo>(frame->function()->shared());
Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared);
int len = 0;
@@ -12042,14 +12016,12 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetStepInPositions) {
int current_statement_pos = break_location_iterator.statement_position();
while (!break_location_iterator.Done()) {
- if (break_location_iterator.pc() > frame->pc()) {
- if (break_location_iterator.IsStepInLocation(isolate)) {
- Smi* position_value = Smi::FromInt(break_location_iterator.position());
- JSObject::SetElement(array, len,
- Handle<Object>(position_value, isolate),
- NONE, kNonStrictMode);
- len++;
- }
+ if (break_location_iterator.IsStepInLocation(isolate)) {
+ Smi* position_value = Smi::FromInt(break_location_iterator.position());
+ JSObject::SetElement(array, len,
+ Handle<Object>(position_value, isolate),
+ NONE, kNonStrictMode);
+ len++;
}
// Advance iterator.
break_location_iterator.Next();
@@ -13392,489 +13364,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetHeapUsage) {
#endif // ENABLE_DEBUGGER_SUPPORT
-#ifdef V8_I18N_SUPPORT
-RUNTIME_FUNCTION(MaybeObject*, Runtime_CanonicalizeLanguageTag) {
- HandleScope scope(isolate);
-
- ASSERT(args.length() == 1);
- CONVERT_ARG_HANDLE_CHECKED(String, locale_id_str, 0);
-
- v8::String::Utf8Value locale_id(v8::Utils::ToLocal(locale_id_str));
-
- // Return value which denotes invalid language tag.
- const char* const kInvalidTag = "invalid-tag";
-
- UErrorCode error = U_ZERO_ERROR;
- char icu_result[ULOC_FULLNAME_CAPACITY];
- int icu_length = 0;
-
- uloc_forLanguageTag(*locale_id, icu_result, ULOC_FULLNAME_CAPACITY,
- &icu_length, &error);
- if (U_FAILURE(error) || icu_length == 0) {
- return isolate->heap()->AllocateStringFromOneByte(CStrVector(kInvalidTag));
- }
-
- char result[ULOC_FULLNAME_CAPACITY];
-
- // Force strict BCP47 rules.
- uloc_toLanguageTag(icu_result, result, ULOC_FULLNAME_CAPACITY, TRUE, &error);
-
- if (U_FAILURE(error)) {
- return isolate->heap()->AllocateStringFromOneByte(CStrVector(kInvalidTag));
- }
-
- return isolate->heap()->AllocateStringFromOneByte(CStrVector(result));
-}
-
-
-RUNTIME_FUNCTION(MaybeObject*, Runtime_AvailableLocalesOf) {
- HandleScope scope(isolate);
-
- ASSERT(args.length() == 1);
- CONVERT_ARG_HANDLE_CHECKED(String, service, 0);
-
- const icu::Locale* available_locales = NULL;
- int32_t count = 0;
-
- if (service->IsUtf8EqualTo(CStrVector("collator"))) {
- available_locales = icu::Collator::getAvailableLocales(count);
- } else if (service->IsUtf8EqualTo(CStrVector("numberformat"))) {
- available_locales = icu::NumberFormat::getAvailableLocales(count);
- } else if (service->IsUtf8EqualTo(CStrVector("dateformat"))) {
- available_locales = icu::DateFormat::getAvailableLocales(count);
- } else if (service->IsUtf8EqualTo(CStrVector("breakiterator"))) {
- available_locales = icu::BreakIterator::getAvailableLocales(count);
- }
-
- UErrorCode error = U_ZERO_ERROR;
- char result[ULOC_FULLNAME_CAPACITY];
- Handle<JSObject> locales =
- isolate->factory()->NewJSObject(isolate->object_function());
-
- for (int32_t i = 0; i < count; ++i) {
- const char* icu_name = available_locales[i].getName();
-
- error = U_ZERO_ERROR;
- // No need to force strict BCP47 rules.
- uloc_toLanguageTag(icu_name, result, ULOC_FULLNAME_CAPACITY, FALSE, &error);
- if (U_FAILURE(error)) {
- // This shouldn't happen, but lets not break the user.
- continue;
- }
-
- RETURN_IF_EMPTY_HANDLE(isolate,
- JSObject::SetLocalPropertyIgnoreAttributes(
- locales,
- isolate->factory()->NewStringFromAscii(CStrVector(result)),
- isolate->factory()->NewNumber(i),
- NONE));
- }
-
- return *locales;
-}
-
-
-RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultICULocale) {
- SealHandleScope shs(isolate);
-
- ASSERT(args.length() == 0);
-
- icu::Locale default_locale;
-
- // Set the locale
- char result[ULOC_FULLNAME_CAPACITY];
- UErrorCode status = U_ZERO_ERROR;
- uloc_toLanguageTag(
- default_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status);
- if (U_SUCCESS(status)) {
- return isolate->heap()->AllocateStringFromOneByte(CStrVector(result));
- }
-
- return isolate->heap()->AllocateStringFromOneByte(CStrVector("und"));
-}
-
-
-RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLanguageTagVariants) {
- HandleScope scope(isolate);
-
- ASSERT(args.length() == 1);
-
- CONVERT_ARG_HANDLE_CHECKED(JSArray, input, 0);
-
- uint32_t length = static_cast<uint32_t>(input->length()->Number());
- Handle<FixedArray> output = isolate->factory()->NewFixedArray(length);
- Handle<Name> maximized =
- isolate->factory()->NewStringFromAscii(CStrVector("maximized"));
- Handle<Name> base =
- isolate->factory()->NewStringFromAscii(CStrVector("base"));
- for (unsigned int i = 0; i < length; ++i) {
- MaybeObject* maybe_string = input->GetElement(i);
- Object* locale_id;
- if (!maybe_string->ToObject(&locale_id) || !locale_id->IsString()) {
- return isolate->Throw(isolate->heap()->illegal_argument_string());
- }
-
- v8::String::Utf8Value utf8_locale_id(
- v8::Utils::ToLocal(Handle<String>(String::cast(locale_id))));
-
- UErrorCode error = U_ZERO_ERROR;
-
- // Convert from BCP47 to ICU format.
- // de-DE-u-co-phonebk -> de_DE@collation=phonebook
- char icu_locale[ULOC_FULLNAME_CAPACITY];
- int icu_locale_length = 0;
- uloc_forLanguageTag(*utf8_locale_id, icu_locale, ULOC_FULLNAME_CAPACITY,
- &icu_locale_length, &error);
- if (U_FAILURE(error) || icu_locale_length == 0) {
- return isolate->Throw(isolate->heap()->illegal_argument_string());
- }
-
- // Maximize the locale.
- // de_DE@collation=phonebook -> de_Latn_DE@collation=phonebook
- char icu_max_locale[ULOC_FULLNAME_CAPACITY];
- uloc_addLikelySubtags(
- icu_locale, icu_max_locale, ULOC_FULLNAME_CAPACITY, &error);
-
- // Remove extensions from maximized locale.
- // de_Latn_DE@collation=phonebook -> de_Latn_DE
- char icu_base_max_locale[ULOC_FULLNAME_CAPACITY];
- uloc_getBaseName(
- icu_max_locale, icu_base_max_locale, ULOC_FULLNAME_CAPACITY, &error);
-
- // Get original name without extensions.
- // de_DE@collation=phonebook -> de_DE
- char icu_base_locale[ULOC_FULLNAME_CAPACITY];
- uloc_getBaseName(
- icu_locale, icu_base_locale, ULOC_FULLNAME_CAPACITY, &error);
-
- // Convert from ICU locale format to BCP47 format.
- // de_Latn_DE -> de-Latn-DE
- char base_max_locale[ULOC_FULLNAME_CAPACITY];
- uloc_toLanguageTag(icu_base_max_locale, base_max_locale,
- ULOC_FULLNAME_CAPACITY, FALSE, &error);
-
- // de_DE -> de-DE
- char base_locale[ULOC_FULLNAME_CAPACITY];
- uloc_toLanguageTag(
- icu_base_locale, base_locale, ULOC_FULLNAME_CAPACITY, FALSE, &error);
-
- if (U_FAILURE(error)) {
- return isolate->Throw(isolate->heap()->illegal_argument_string());
- }
-
- Handle<JSObject> result =
- isolate->factory()->NewJSObject(isolate->object_function());
- RETURN_IF_EMPTY_HANDLE(isolate,
- JSObject::SetLocalPropertyIgnoreAttributes(
- result,
- maximized,
- isolate->factory()->NewStringFromAscii(CStrVector(base_max_locale)),
- NONE));
- RETURN_IF_EMPTY_HANDLE(isolate,
- JSObject::SetLocalPropertyIgnoreAttributes(
- result,
- base,
- isolate->factory()->NewStringFromAscii(CStrVector(base_locale)),
- NONE));
- output->set(i, *result);
- }
-
- Handle<JSArray> result = isolate->factory()->NewJSArrayWithElements(output);
- result->set_length(Smi::FromInt(length));
- return *result;
-}
-
-
-RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateDateTimeFormat) {
- HandleScope scope(isolate);
-
- ASSERT(args.length() == 3);
-
- CONVERT_ARG_HANDLE_CHECKED(String, locale, 0);
- CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1);
- CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
-
- Handle<ObjectTemplateInfo> date_format_template =
- I18N::GetTemplate(isolate);
-
- // Create an empty object wrapper.
- bool has_pending_exception = false;
- Handle<JSObject> local_object = Execution::InstantiateObject(
- date_format_template, &has_pending_exception);
- if (has_pending_exception) {
- ASSERT(isolate->has_pending_exception());
- return Failure::Exception();
- }
-
- // Set date time formatter as internal field of the resulting JS object.
- icu::SimpleDateFormat* date_format = DateFormat::InitializeDateTimeFormat(
- isolate, locale, options, resolved);
-
- if (!date_format) return isolate->ThrowIllegalOperation();
-
- local_object->SetInternalField(0, reinterpret_cast<Smi*>(date_format));
-
- RETURN_IF_EMPTY_HANDLE(isolate,
- JSObject::SetLocalPropertyIgnoreAttributes(
- local_object,
- isolate->factory()->NewStringFromAscii(CStrVector("dateFormat")),
- isolate->factory()->NewStringFromAscii(CStrVector("valid")),
- NONE));
-
- Persistent<v8::Object> wrapper(reinterpret_cast<v8::Isolate*>(isolate),
- v8::Utils::ToLocal(local_object));
- // Make object handle weak so we can delete the data format once GC kicks in.
- wrapper.MakeWeak<void>(NULL, &DateFormat::DeleteDateFormat);
- wrapper.ClearAndLeak();
- return *local_object;
-}
-
-
-RUNTIME_FUNCTION(MaybeObject*, Runtime_InternalDateFormat) {
- HandleScope scope(isolate);
-
- ASSERT(args.length() == 2);
-
- CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0);
- CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 1);
-
- bool has_pending_exception = false;
- double millis = Execution::ToNumber(date, &has_pending_exception)->Number();
- if (has_pending_exception) {
- ASSERT(isolate->has_pending_exception());
- return Failure::Exception();
- }
-
- icu::SimpleDateFormat* date_format =
- DateFormat::UnpackDateFormat(isolate, date_format_holder);
- if (!date_format) return isolate->ThrowIllegalOperation();
-
- icu::UnicodeString result;
- date_format->format(millis, result);
-
- return *isolate->factory()->NewStringFromTwoByte(
- Vector<const uint16_t>(
- reinterpret_cast<const uint16_t*>(result.getBuffer()),
- result.length()));
-}
-
-
-RUNTIME_FUNCTION(MaybeObject*, Runtime_InternalDateParse) {
- HandleScope scope(isolate);
-
- ASSERT(args.length() == 2);
-
- CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0);
- CONVERT_ARG_HANDLE_CHECKED(String, date_string, 1);
-
- v8::String::Utf8Value utf8_date(v8::Utils::ToLocal(date_string));
- icu::UnicodeString u_date(icu::UnicodeString::fromUTF8(*utf8_date));
- icu::SimpleDateFormat* date_format =
- DateFormat::UnpackDateFormat(isolate, date_format_holder);
- if (!date_format) return isolate->ThrowIllegalOperation();
-
- UErrorCode status = U_ZERO_ERROR;
- UDate date = date_format->parse(u_date, status);
- if (U_FAILURE(status)) return isolate->heap()->undefined_value();
-
- bool has_pending_exception = false;
- Handle<JSDate> result = Handle<JSDate>::cast(
- Execution::NewDate(static_cast<double>(date), &has_pending_exception));
- if (has_pending_exception) {
- ASSERT(isolate->has_pending_exception());
- return Failure::Exception();
- }
- return *result;
-}
-
-
-RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateNumberFormat) {
- HandleScope scope(isolate);
-
- ASSERT(args.length() == 3);
-
- CONVERT_ARG_HANDLE_CHECKED(String, locale, 0);
- CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1);
- CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
-
- Handle<ObjectTemplateInfo> number_format_template =
- I18N::GetTemplate(isolate);
-
- // Create an empty object wrapper.
- bool has_pending_exception = false;
- Handle<JSObject> local_object = Execution::InstantiateObject(
- number_format_template, &has_pending_exception);
- if (has_pending_exception) {
- ASSERT(isolate->has_pending_exception());
- return Failure::Exception();
- }
-
- // Set number formatter as internal field of the resulting JS object.
- icu::DecimalFormat* number_format = NumberFormat::InitializeNumberFormat(
- isolate, locale, options, resolved);
-
- if (!number_format) return isolate->ThrowIllegalOperation();
-
- local_object->SetInternalField(0, reinterpret_cast<Smi*>(number_format));
-
- RETURN_IF_EMPTY_HANDLE(isolate,
- JSObject::SetLocalPropertyIgnoreAttributes(
- local_object,
- isolate->factory()->NewStringFromAscii(CStrVector("numberFormat")),
- isolate->factory()->NewStringFromAscii(CStrVector("valid")),
- NONE));
-
- Persistent<v8::Object> wrapper(reinterpret_cast<v8::Isolate*>(isolate),
- v8::Utils::ToLocal(local_object));
- // Make object handle weak so we can delete the number format once GC kicks
- // in.
- wrapper.MakeWeak<void>(NULL, &NumberFormat::DeleteNumberFormat);
- wrapper.ClearAndLeak();
- return *local_object;
-}
-
-
-RUNTIME_FUNCTION(MaybeObject*, Runtime_InternalNumberFormat) {
- HandleScope scope(isolate);
-
- ASSERT(args.length() == 2);
-
- CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0);
- CONVERT_ARG_HANDLE_CHECKED(Object, number, 1);
-
- bool has_pending_exception = false;
- double value = Execution::ToNumber(number, &has_pending_exception)->Number();
- if (has_pending_exception) {
- ASSERT(isolate->has_pending_exception());
- return Failure::Exception();
- }
-
- icu::DecimalFormat* number_format =
- NumberFormat::UnpackNumberFormat(isolate, number_format_holder);
- if (!number_format) return isolate->ThrowIllegalOperation();
-
- icu::UnicodeString result;
- number_format->format(value, result);
-
- return *isolate->factory()->NewStringFromTwoByte(
- Vector<const uint16_t>(
- reinterpret_cast<const uint16_t*>(result.getBuffer()),
- result.length()));
-}
-
-
-RUNTIME_FUNCTION(MaybeObject*, Runtime_InternalNumberParse) {
- HandleScope scope(isolate);
-
- ASSERT(args.length() == 2);
-
- CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0);
- CONVERT_ARG_HANDLE_CHECKED(String, number_string, 1);
-
- v8::String::Utf8Value utf8_number(v8::Utils::ToLocal(number_string));
- icu::UnicodeString u_number(icu::UnicodeString::fromUTF8(*utf8_number));
- icu::DecimalFormat* number_format =
- NumberFormat::UnpackNumberFormat(isolate, number_format_holder);
- if (!number_format) return isolate->ThrowIllegalOperation();
-
- UErrorCode status = U_ZERO_ERROR;
- icu::Formattable result;
- // ICU 4.6 doesn't support parseCurrency call. We need to wait for ICU49
- // to be part of Chrome.
- // TODO(cira): Include currency parsing code using parseCurrency call.
- // We need to check if the formatter parses all currencies or only the
- // one it was constructed with (it will impact the API - how to return ISO
- // code and the value).
- number_format->parse(u_number, result, status);
- if (U_FAILURE(status)) return isolate->heap()->undefined_value();
-
- switch (result.getType()) {
- case icu::Formattable::kDouble:
- return *isolate->factory()->NewNumber(result.getDouble());
- case icu::Formattable::kLong:
- return *isolate->factory()->NewNumberFromInt(result.getLong());
- case icu::Formattable::kInt64:
- return *isolate->factory()->NewNumber(
- static_cast<double>(result.getInt64()));
- default:
- return isolate->heap()->undefined_value();
- }
-}
-
-
-RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateCollator) {
- HandleScope scope(isolate);
-
- ASSERT(args.length() == 3);
-
- CONVERT_ARG_HANDLE_CHECKED(String, locale, 0);
- CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1);
- CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
-
- Handle<ObjectTemplateInfo> collator_template = I18N::GetTemplate(isolate);
-
- // Create an empty object wrapper.
- bool has_pending_exception = false;
- Handle<JSObject> local_object = Execution::InstantiateObject(
- collator_template, &has_pending_exception);
- if (has_pending_exception) {
- ASSERT(isolate->has_pending_exception());
- return Failure::Exception();
- }
-
- // Set collator as internal field of the resulting JS object.
- icu::Collator* collator = Collator::InitializeCollator(
- isolate, locale, options, resolved);
-
- if (!collator) return isolate->ThrowIllegalOperation();
-
- local_object->SetInternalField(0, reinterpret_cast<Smi*>(collator));
-
- RETURN_IF_EMPTY_HANDLE(isolate,
- JSObject::SetLocalPropertyIgnoreAttributes(
- local_object,
- isolate->factory()->NewStringFromAscii(CStrVector("collator")),
- isolate->factory()->NewStringFromAscii(CStrVector("valid")),
- NONE));
-
- Persistent<v8::Object> wrapper(reinterpret_cast<v8::Isolate*>(isolate),
- v8::Utils::ToLocal(local_object));
- // Make object handle weak so we can delete the collator once GC kicks in.
- wrapper.MakeWeak<void>(NULL, &Collator::DeleteCollator);
- wrapper.ClearAndLeak();
- return *local_object;
-}
-
-
-RUNTIME_FUNCTION(MaybeObject*, Runtime_InternalCompare) {
- HandleScope scope(isolate);
-
- ASSERT(args.length() == 3);
-
- CONVERT_ARG_HANDLE_CHECKED(JSObject, collator_holder, 0);
- CONVERT_ARG_HANDLE_CHECKED(String, string1, 1);
- CONVERT_ARG_HANDLE_CHECKED(String, string2, 2);
-
- icu::Collator* collator = Collator::UnpackCollator(isolate, collator_holder);
- if (!collator) return isolate->ThrowIllegalOperation();
-
- v8::String::Value string_value1(v8::Utils::ToLocal(string1));
- v8::String::Value string_value2(v8::Utils::ToLocal(string2));
- const UChar* u_string1 = reinterpret_cast<const UChar*>(*string_value1);
- const UChar* u_string2 = reinterpret_cast<const UChar*>(*string_value2);
- UErrorCode status = U_ZERO_ERROR;
- UCollationResult result = collator->compare(u_string1,
- string_value1.length(),
- u_string2,
- string_value2.length(),
- status);
- if (U_FAILURE(status)) return isolate->ThrowIllegalOperation();
-
- return *isolate->factory()->NewNumberFromInt(result);
-}
-#endif // V8_I18N_SUPPORT
-
-
// Finds the script object from the script data. NOTE: This operation uses
// heap traversal to find the function generated for the source position
// for the requested break point. For lazily compiled functions several heap
@@ -13993,18 +13482,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_FlattenString) {
}
-RUNTIME_FUNCTION(MaybeObject*, Runtime_MigrateInstance) {
- HandleScope scope(isolate);
- ASSERT(args.length() == 1);
- CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
- if (!object->IsJSObject()) return Smi::FromInt(0);
- Handle<JSObject> js_object = Handle<JSObject>::cast(object);
- if (!js_object->map()->is_deprecated()) return Smi::FromInt(0);
- JSObject::MigrateInstance(js_object);
- return *object;
-}
-
-
RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFromCache) {
SealHandleScope shs(isolate);
// This is only called from codegen, so checks might be more lax.
@@ -14248,9 +13725,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SetIsObserved) {
ASSERT(proto->IsJSGlobalObject());
obj = JSReceiver::cast(proto);
}
- if (obj->IsJSProxy())
- return isolate->heap()->undefined_value();
-
ASSERT(!(obj->map()->is_observed() && obj->IsJSObject() &&
JSObject::cast(obj)->HasFastElements()));
ASSERT(obj->IsJSObject());
diff --git a/chromium/v8/src/runtime.h b/chromium/v8/src/runtime.h
index 23e91f2ae9e..398cb3bcc24 100644
--- a/chromium/v8/src/runtime.h
+++ b/chromium/v8/src/runtime.h
@@ -109,7 +109,6 @@ namespace internal {
F(DebugCallbackSupportsStepping, 1, 1) \
F(DebugPrepareStepInIfStepping, 1, 1) \
F(FlattenString, 1, 1) \
- F(MigrateInstance, 1, 1) \
\
/* Array join support */ \
F(PushIfAbsent, 2, 1) \
@@ -158,6 +157,7 @@ namespace internal {
F(NumberOr, 2, 1) \
F(NumberAnd, 2, 1) \
F(NumberXor, 2, 1) \
+ F(NumberNot, 1, 1) \
\
F(NumberShl, 2, 1) \
F(NumberShr, 2, 1) \
@@ -534,35 +534,6 @@ namespace internal {
#define RUNTIME_FUNCTION_LIST_DEBUGGER_SUPPORT(F)
#endif
-
-#ifdef V8_I18N_SUPPORT
-#define RUNTIME_FUNCTION_LIST_I18N_SUPPORT(F) \
- /* i18n support */ \
- /* Standalone, helper methods. */ \
- F(CanonicalizeLanguageTag, 1, 1) \
- F(AvailableLocalesOf, 1, 1) \
- F(GetDefaultICULocale, 0, 1) \
- F(GetLanguageTagVariants, 1, 1) \
- \
- /* Date format and parse. */ \
- F(CreateDateTimeFormat, 3, 1) \
- F(InternalDateFormat, 2, 1) \
- F(InternalDateParse, 2, 1) \
- \
- /* Number format and parse. */ \
- F(CreateNumberFormat, 3, 1) \
- F(InternalNumberFormat, 2, 1) \
- F(InternalNumberParse, 2, 1) \
- \
- /* Collator. */ \
- F(CreateCollator, 3, 1) \
- F(InternalCompare, 3, 1) \
-
-#else
-#define RUNTIME_FUNCTION_LIST_I18N_SUPPORT(F)
-#endif
-
-
#ifdef DEBUG
#define RUNTIME_FUNCTION_LIST_DEBUG(F) \
/* Testing */ \
@@ -580,8 +551,7 @@ namespace internal {
RUNTIME_FUNCTION_LIST_ALWAYS_1(F) \
RUNTIME_FUNCTION_LIST_ALWAYS_2(F) \
RUNTIME_FUNCTION_LIST_DEBUG(F) \
- RUNTIME_FUNCTION_LIST_DEBUGGER_SUPPORT(F) \
- RUNTIME_FUNCTION_LIST_I18N_SUPPORT(F)
+ RUNTIME_FUNCTION_LIST_DEBUGGER_SUPPORT(F)
// ----------------------------------------------------------------------------
// INLINE_FUNCTION_LIST defines all inlined functions accessed
diff --git a/chromium/v8/src/runtime.js b/chromium/v8/src/runtime.js
index 5339570ef6e..90fb36b4223 100644
--- a/chromium/v8/src/runtime.js
+++ b/chromium/v8/src/runtime.js
@@ -294,6 +294,20 @@ function BIT_XOR(y) {
}
+// ECMA-262, section 11.4.7, page 47.
+function UNARY_MINUS() {
+ var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this);
+ return %NumberUnaryMinus(x);
+}
+
+
+// ECMA-262, section 11.4.8, page 48.
+function BIT_NOT() {
+ var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this);
+ return %NumberNot(x);
+}
+
+
// ECMA-262, section 11.7.1, page 51.
function SHL(y) {
var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this);
diff --git a/chromium/v8/src/sampler.cc b/chromium/v8/src/sampler.cc
index 1d0cdedd1fc..d72ed1acdb8 100644
--- a/chromium/v8/src/sampler.cc
+++ b/chromium/v8/src/sampler.cc
@@ -38,10 +38,7 @@
#include <signal.h>
#include <sys/time.h>
#include <sys/syscall.h>
-// OpenBSD doesn't have <ucontext.h>. ucontext_t lives in <signal.h>
-// and is a typedef for struct sigcontext. There is no uc_mcontext.
-#if (!defined(__ANDROID__) || defined(__BIONIC_HAVE_UCONTEXT_T)) \
- && !defined(__OpenBSD__)
+#if !defined(__ANDROID__) || defined(__BIONIC_HAVE_UCONTEXT_T)
#include <ucontext.h>
#endif
#include <unistd.h>
@@ -333,9 +330,7 @@ void SignalHandler::HandleProfilerSignal(int signal, siginfo_t* info,
#else
// Extracting the sample from the context is extremely machine dependent.
ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context);
-#if !defined(__OpenBSD__)
mcontext_t& mcontext = ucontext->uc_mcontext;
-#endif
#if defined(__linux__) || defined(__ANDROID__)
#if V8_HOST_ARCH_IA32
state.pc = reinterpret_cast<Address>(mcontext.gregs[REG_EIP]);
@@ -389,6 +384,7 @@ void SignalHandler::HandleProfilerSignal(int signal, siginfo_t* info,
state.fp = reinterpret_cast<Address>(mcontext.__gregs[_REG_RBP]);
#endif // V8_HOST_ARCH_*
#elif defined(__OpenBSD__)
+ USE(mcontext);
#if V8_HOST_ARCH_IA32
state.pc = reinterpret_cast<Address>(ucontext->sc_eip);
state.sp = reinterpret_cast<Address>(ucontext->sc_esp);
@@ -619,7 +615,8 @@ DISABLE_ASAN void TickSample::Init(Isolate* isolate,
// Avoid collecting traces while doing GC.
if (state == GC) return;
- Address js_entry_sp = isolate->js_entry_sp();
+ const Address js_entry_sp =
+ Isolate::js_entry_sp(isolate->thread_local_top());
if (js_entry_sp == 0) {
// Not executing JS now.
return;
diff --git a/chromium/v8/src/serialize.cc b/chromium/v8/src/serialize.cc
index 746c926653d..6c5a620a418 100644
--- a/chromium/v8/src/serialize.cc
+++ b/chromium/v8/src/serialize.cc
@@ -1304,7 +1304,6 @@ void StartupSerializer::SerializeStrongReferences() {
// No active or weak handles.
CHECK(isolate->handle_scope_implementer()->blocks()->is_empty());
CHECK_EQ(0, isolate->global_handles()->NumberOfWeakHandles());
- CHECK_EQ(0, isolate->eternal_handles()->NumberOfHandles());
// We don't support serializing installed extensions.
CHECK(!isolate->has_installed_extensions());
diff --git a/chromium/v8/src/spaces.h b/chromium/v8/src/spaces.h
index aa864b66ba5..b47452e421f 100644
--- a/chromium/v8/src/spaces.h
+++ b/chromium/v8/src/spaces.h
@@ -784,9 +784,8 @@ class Page : public MemoryChunk {
// Maximum object size that fits in a page. Objects larger than that size
// are allocated in large object space and are never moved in memory. This
// also applies to new space allocation, since objects are never migrated
- // from new space to large object space. Takes double alignment into account.
- static const int kMaxNonCodeHeapObjectSize =
- kNonCodeObjectAreaSize - kPointerSize;
+ // from new space to large object space.
+ static const int kMaxNonCodeHeapObjectSize = kNonCodeObjectAreaSize;
// Page size mask.
static const intptr_t kPageAlignmentMask = (1 << kPageSizeBits) - 1;
diff --git a/chromium/v8/src/splay-tree-inl.h b/chromium/v8/src/splay-tree-inl.h
index 42024756e9b..4eca71d1004 100644
--- a/chromium/v8/src/splay-tree-inl.h
+++ b/chromium/v8/src/splay-tree-inl.h
@@ -91,12 +91,6 @@ bool SplayTree<Config, Allocator>::FindInternal(const Key& key) {
template<typename Config, class Allocator>
-bool SplayTree<Config, Allocator>::Contains(const Key& key) {
- return FindInternal(key);
-}
-
-
-template<typename Config, class Allocator>
bool SplayTree<Config, Allocator>::Find(const Key& key, Locator* locator) {
if (FindInternal(key)) {
locator->bind(root_);
@@ -299,10 +293,9 @@ void SplayTree<Config, Allocator>::ForEach(Callback* callback) {
template <typename Config, class Allocator> template <class Callback>
void SplayTree<Config, Allocator>::ForEachNode(Callback* callback) {
- if (root_ == NULL) return;
// Pre-allocate some space for tiny trees.
List<Node*, Allocator> nodes_to_visit(10, allocator_);
- nodes_to_visit.Add(root_, allocator_);
+ if (root_ != NULL) nodes_to_visit.Add(root_, allocator_);
int pos = 0;
while (pos < nodes_to_visit.length()) {
Node* node = nodes_to_visit[pos++];
diff --git a/chromium/v8/src/splay-tree.h b/chromium/v8/src/splay-tree.h
index f393027a82c..8844d8a8ffe 100644
--- a/chromium/v8/src/splay-tree.h
+++ b/chromium/v8/src/splay-tree.h
@@ -39,9 +39,9 @@ namespace internal {
//
// typedef Key: the key type
// typedef Value: the value type
-// static const Key kNoKey: the dummy key used when no key is set
-// static Value kNoValue(): the dummy value used to initialize nodes
-// static int (Compare)(Key& a, Key& b) -> {-1, 0, 1}: comparison function
+// static const kNoKey: the dummy key used when no key is set
+// static const kNoValue: the dummy value used to initialize nodes
+// int (Compare)(Key& a, Key& b) -> {-1, 0, 1}: comparison function
//
// The tree is also parameterized by an allocation policy
// (Allocator). The policy is used for allocating lists in the C free
@@ -74,11 +74,6 @@ class SplayTree {
UNREACHABLE();
}
- AllocationPolicy allocator() { return allocator_; }
-
- // Checks if there is a mapping for the key.
- bool Contains(const Key& key);
-
// Inserts the given key in this tree with the given value. Returns
// true if a node was inserted, otherwise false. If found the locator
// is enabled and provides access to the mapping for the key.
@@ -109,9 +104,6 @@ class SplayTree {
// Remove the node with the given key from the tree.
bool Remove(const Key& key);
- // Remove all keys from the tree.
- void Clear() { ResetRoot(); }
-
bool is_empty() { return root_ == NULL; }
// Perform the splay operation for the given key. Moves the node with
diff --git a/chromium/v8/src/type-info.cc b/chromium/v8/src/type-info.cc
index 336b459d6b7..769df07e4fa 100644
--- a/chromium/v8/src/type-info.cc
+++ b/chromium/v8/src/type-info.cc
@@ -384,6 +384,17 @@ void TypeFeedbackOracle::CompareType(TypeFeedbackId id,
}
+Handle<Type> TypeFeedbackOracle::UnaryType(TypeFeedbackId id) {
+ Handle<Object> object = GetInfo(id);
+ if (!object->IsCode()) {
+ return handle(Type::None(), isolate());
+ }
+ Handle<Code> code = Handle<Code>::cast(object);
+ ASSERT(code->is_unary_op_stub());
+ return UnaryOpStub(code->extended_extra_ic_state()).GetType(isolate());
+}
+
+
void TypeFeedbackOracle::BinaryType(TypeFeedbackId id,
Handle<Type>* left,
Handle<Type>* right,
@@ -647,6 +658,7 @@ void TypeFeedbackOracle::ProcessRelocInfos(ZoneList<RelocInfo>* infos) {
}
break;
+ case Code::UNARY_OP_IC:
case Code::BINARY_OP_IC:
case Code::COMPARE_IC:
case Code::TO_BOOLEAN_IC:
diff --git a/chromium/v8/src/type-info.h b/chromium/v8/src/type-info.h
index 4b376c84bdc..1a7c67dfb88 100644
--- a/chromium/v8/src/type-info.h
+++ b/chromium/v8/src/type-info.h
@@ -297,6 +297,7 @@ class TypeFeedbackOracle: public ZoneObject {
byte ToBooleanTypes(TypeFeedbackId id);
// Get type information for arithmetic operations and compares.
+ Handle<Type> UnaryType(TypeFeedbackId id);
void BinaryType(TypeFeedbackId id,
Handle<Type>* left,
Handle<Type>* right,
diff --git a/chromium/v8/src/types.h b/chromium/v8/src/types.h
index fc69c785295..b2eb60c6920 100644
--- a/chromium/v8/src/types.h
+++ b/chromium/v8/src/types.h
@@ -303,11 +303,6 @@ struct Bounds {
explicit Bounds(Handle<Type> t) : lower(t), upper(t) {}
Bounds(Type* t, Isolate* isl) : lower(t, isl), upper(t, isl) {}
- // Unrestricted bounds.
- static Bounds Unbounded(Isolate* isl) {
- return Bounds(Type::None(), Type::Any(), isl);
- }
-
// Meet: both b1 and b2 are known to hold.
static Bounds Both(Bounds b1, Bounds b2, Isolate* isl) {
return Bounds(
diff --git a/chromium/v8/src/typing.cc b/chromium/v8/src/typing.cc
index f8e2a7c206d..4220d2110db 100644
--- a/chromium/v8/src/typing.cc
+++ b/chromium/v8/src/typing.cc
@@ -40,8 +40,7 @@ AstTyper::AstTyper(CompilationInfo* info)
Handle<Code>(info->closure()->shared()->code()),
Handle<Context>(info->closure()->context()->native_context()),
info->isolate(),
- info->zone()),
- store_(info->zone()) {
+ info->zone()) {
InitializeAstVisitor();
}
@@ -80,16 +79,12 @@ void AstTyper::VisitStatements(ZoneList<Statement*>* stmts) {
for (int i = 0; i < stmts->length(); ++i) {
Statement* stmt = stmts->at(i);
RECURSE(Visit(stmt));
- if (stmt->IsJump()) break;
}
}
void AstTyper::VisitBlock(Block* stmt) {
RECURSE(VisitStatements(stmt->statements()));
- if (stmt->labels() != NULL) {
- store_.Forget(); // Control may transfer here via 'break l'.
- }
}
@@ -103,41 +98,30 @@ void AstTyper::VisitEmptyStatement(EmptyStatement* stmt) {
void AstTyper::VisitIfStatement(IfStatement* stmt) {
- // Collect type feedback.
+ RECURSE(Visit(stmt->condition()));
+ RECURSE(Visit(stmt->then_statement()));
+ RECURSE(Visit(stmt->else_statement()));
+
if (!stmt->condition()->ToBooleanIsTrue() &&
!stmt->condition()->ToBooleanIsFalse()) {
stmt->condition()->RecordToBooleanTypeFeedback(oracle());
}
-
- RECURSE(Visit(stmt->condition()));
- Effects then_effects = EnterEffects();
- RECURSE(Visit(stmt->then_statement()));
- ExitEffects();
- Effects else_effects = EnterEffects();
- RECURSE(Visit(stmt->else_statement()));
- ExitEffects();
- then_effects.Alt(else_effects);
- store_.Seq(then_effects);
}
void AstTyper::VisitContinueStatement(ContinueStatement* stmt) {
- // TODO(rossberg): is it worth having a non-termination effect?
}
void AstTyper::VisitBreakStatement(BreakStatement* stmt) {
- // TODO(rossberg): is it worth having a non-termination effect?
}
void AstTyper::VisitReturnStatement(ReturnStatement* stmt) {
- // Collect type feedback.
+ RECURSE(Visit(stmt->expression()));
+
// TODO(rossberg): we only need this for inlining into test contexts...
stmt->expression()->RecordToBooleanTypeFeedback(oracle());
-
- RECURSE(Visit(stmt->expression()));
- // TODO(rossberg): is it worth having a non-termination effect?
}
@@ -149,18 +133,14 @@ void AstTyper::VisitWithStatement(WithStatement* stmt) {
void AstTyper::VisitSwitchStatement(SwitchStatement* stmt) {
RECURSE(Visit(stmt->tag()));
-
ZoneList<CaseClause*>* clauses = stmt->cases();
SwitchStatement::SwitchType switch_type = stmt->switch_type();
- Effects local_effects(zone());
- bool complex_effects = false; // True for label effects or fall-through.
-
for (int i = 0; i < clauses->length(); ++i) {
CaseClause* clause = clauses->at(i);
- Effects clause_effects = EnterEffects();
-
if (!clause->is_default()) {
Expression* label = clause->label();
+ RECURSE(Visit(label));
+
SwitchStatement::SwitchType label_switch_type =
label->IsSmiLiteral() ? SwitchStatement::SMI_SWITCH :
label->IsStringLiteral() ? SwitchStatement::STRING_SWITCH :
@@ -169,32 +149,13 @@ void AstTyper::VisitSwitchStatement(SwitchStatement* stmt) {
switch_type = label_switch_type;
else if (switch_type != label_switch_type)
switch_type = SwitchStatement::GENERIC_SWITCH;
-
- RECURSE(Visit(label));
- if (!clause_effects.IsEmpty()) complex_effects = true;
- }
-
- ZoneList<Statement*>* stmts = clause->statements();
- RECURSE(VisitStatements(stmts));
- ExitEffects();
- if (stmts->is_empty() || stmts->last()->IsJump()) {
- local_effects.Alt(clause_effects);
- } else {
- complex_effects = true;
}
+ RECURSE(VisitStatements(clause->statements()));
}
-
- if (complex_effects) {
- store_.Forget(); // Reached this in unknown state.
- } else {
- store_.Seq(local_effects);
- }
-
if (switch_type == SwitchStatement::UNKNOWN_SWITCH)
switch_type = SwitchStatement::GENERIC_SWITCH;
stmt->set_switch_type(switch_type);
- // Collect type feedback.
// TODO(rossberg): can we eliminate this special case and extra loop?
if (switch_type == SwitchStatement::SMI_SWITCH) {
for (int i = 0; i < clauses->length(); ++i) {
@@ -207,31 +168,22 @@ void AstTyper::VisitSwitchStatement(SwitchStatement* stmt) {
void AstTyper::VisitDoWhileStatement(DoWhileStatement* stmt) {
- // Collect type feedback.
+ RECURSE(Visit(stmt->body()));
+ RECURSE(Visit(stmt->cond()));
+
if (!stmt->cond()->ToBooleanIsTrue()) {
stmt->cond()->RecordToBooleanTypeFeedback(oracle());
}
-
- // TODO(rossberg): refine the unconditional Forget (here and elsewhere) by
- // computing the set of variables assigned in only some of the origins of the
- // control transfer (such as the loop body here).
- store_.Forget(); // Control may transfer here via looping or 'continue'.
- RECURSE(Visit(stmt->body()));
- RECURSE(Visit(stmt->cond()));
- store_.Forget(); // Control may transfer here via 'break'.
}
void AstTyper::VisitWhileStatement(WhileStatement* stmt) {
- // Collect type feedback.
+ RECURSE(Visit(stmt->cond()));
+ RECURSE(Visit(stmt->body()));
+
if (!stmt->cond()->ToBooleanIsTrue()) {
stmt->cond()->RecordToBooleanTypeFeedback(oracle());
}
-
- store_.Forget(); // Control may transfer here via looping or 'continue'.
- RECURSE(Visit(stmt->cond()));
- RECURSE(Visit(stmt->body()));
- store_.Forget(); // Control may transfer here via termination or 'break'.
}
@@ -239,65 +191,45 @@ void AstTyper::VisitForStatement(ForStatement* stmt) {
if (stmt->init() != NULL) {
RECURSE(Visit(stmt->init()));
}
- store_.Forget(); // Control may transfer here via looping.
if (stmt->cond() != NULL) {
- // Collect type feedback.
- stmt->cond()->RecordToBooleanTypeFeedback(oracle());
-
RECURSE(Visit(stmt->cond()));
+
+ stmt->cond()->RecordToBooleanTypeFeedback(oracle());
}
RECURSE(Visit(stmt->body()));
- store_.Forget(); // Control may transfer here via 'continue'.
if (stmt->next() != NULL) {
RECURSE(Visit(stmt->next()));
}
- store_.Forget(); // Control may transfer here via termination or 'break'.
}
void AstTyper::VisitForInStatement(ForInStatement* stmt) {
- // Collect type feedback.
- stmt->RecordTypeFeedback(oracle());
-
RECURSE(Visit(stmt->enumerable()));
- store_.Forget(); // Control may transfer here via looping or 'continue'.
RECURSE(Visit(stmt->body()));
- store_.Forget(); // Control may transfer here via 'break'.
+
+ stmt->RecordTypeFeedback(oracle());
}
void AstTyper::VisitForOfStatement(ForOfStatement* stmt) {
RECURSE(Visit(stmt->iterable()));
- store_.Forget(); // Control may transfer here via looping or 'continue'.
RECURSE(Visit(stmt->body()));
- store_.Forget(); // Control may transfer here via 'break'.
}
void AstTyper::VisitTryCatchStatement(TryCatchStatement* stmt) {
- Effects try_effects = EnterEffects();
RECURSE(Visit(stmt->try_block()));
- ExitEffects();
- Effects catch_effects = EnterEffects();
- store_.Forget(); // Control may transfer here via 'throw'.
RECURSE(Visit(stmt->catch_block()));
- ExitEffects();
- try_effects.Alt(catch_effects);
- store_.Seq(try_effects);
- // At this point, only variables that were reassigned in the catch block are
- // still remembered.
}
void AstTyper::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
RECURSE(Visit(stmt->try_block()));
- store_.Forget(); // Control may transfer here via 'throw'.
RECURSE(Visit(stmt->finally_block()));
}
void AstTyper::VisitDebuggerStatement(DebuggerStatement* stmt) {
- store_.Forget(); // May do whatever.
}
@@ -310,18 +242,11 @@ void AstTyper::VisitSharedFunctionInfoLiteral(SharedFunctionInfoLiteral* expr) {
void AstTyper::VisitConditional(Conditional* expr) {
- // Collect type feedback.
- expr->condition()->RecordToBooleanTypeFeedback(oracle());
-
RECURSE(Visit(expr->condition()));
- Effects then_effects = EnterEffects();
RECURSE(Visit(expr->then_expression()));
- ExitEffects();
- Effects else_effects = EnterEffects();
RECURSE(Visit(expr->else_expression()));
- ExitEffects();
- then_effects.Alt(else_effects);
- store_.Seq(then_effects);
+
+ expr->condition()->RecordToBooleanTypeFeedback(oracle());
NarrowType(expr, Bounds::Either(
expr->then_expression()->bounds(),
@@ -330,10 +255,7 @@ void AstTyper::VisitConditional(Conditional* expr) {
void AstTyper::VisitVariableProxy(VariableProxy* expr) {
- Variable* var = expr->var();
- if (var->IsStackAllocated()) {
- NarrowType(expr, store_.LookupBounds(variable_index(var)));
- }
+ // TODO(rossberg): typing of variables
}
@@ -352,8 +274,8 @@ void AstTyper::VisitObjectLiteral(ObjectLiteral* expr) {
ZoneList<ObjectLiteral::Property*>* properties = expr->properties();
for (int i = 0; i < properties->length(); ++i) {
ObjectLiteral::Property* prop = properties->at(i);
+ RECURSE(Visit(prop->value()));
- // Collect type feedback.
if ((prop->kind() == ObjectLiteral::Property::MATERIALIZED_LITERAL &&
!CompileTimeValue::IsCompileTimeValue(prop->value())) ||
prop->kind() == ObjectLiteral::Property::COMPUTED) {
@@ -361,8 +283,6 @@ void AstTyper::VisitObjectLiteral(ObjectLiteral* expr) {
prop->RecordTypeFeedback(oracle());
}
}
-
- RECURSE(Visit(prop->value()));
}
NarrowType(expr, Bounds(Type::Object(), isolate_));
@@ -383,33 +303,29 @@ void AstTyper::VisitArrayLiteral(ArrayLiteral* expr) {
void AstTyper::VisitAssignment(Assignment* expr) {
// TODO(rossberg): Can we clean this up?
if (expr->is_compound()) {
- // Collect type feedback.
+ RECURSE(Visit(expr->binary_operation()));
+
Expression* target = expr->target();
Property* prop = target->AsProperty();
if (prop != NULL) {
prop->RecordTypeFeedback(oracle(), zone());
- expr->RecordTypeFeedback(oracle(), zone());
+ if (!prop->key()->IsPropertyName()) { // i.e., keyed
+ expr->RecordTypeFeedback(oracle(), zone());
+ }
}
- RECURSE(Visit(expr->binary_operation()));
-
NarrowType(expr, expr->binary_operation()->bounds());
} else {
- // Collect type feedback.
- if (expr->target()->IsProperty()) {
- expr->RecordTypeFeedback(oracle(), zone());
- }
-
RECURSE(Visit(expr->target()));
RECURSE(Visit(expr->value()));
- NarrowType(expr, expr->value()->bounds());
- }
+ if (expr->target()->AsProperty()) {
+ expr->RecordTypeFeedback(oracle(), zone());
+ }
- VariableProxy* proxy = expr->target()->AsVariableProxy();
- if (proxy != NULL && proxy->var()->IsStackAllocated()) {
- store_.Seq(variable_index(proxy->var()), Effect(expr->bounds()));
+ NarrowType(expr, expr->value()->bounds());
}
+ // TODO(rossberg): handle target variables
}
@@ -417,40 +333,28 @@ void AstTyper::VisitYield(Yield* expr) {
RECURSE(Visit(expr->generator_object()));
RECURSE(Visit(expr->expression()));
- // We don't know anything about the result type.
+ // We don't know anything about the type.
}
void AstTyper::VisitThrow(Throw* expr) {
RECURSE(Visit(expr->exception()));
- // TODO(rossberg): is it worth having a non-termination effect?
NarrowType(expr, Bounds(Type::None(), isolate_));
}
void AstTyper::VisitProperty(Property* expr) {
- // Collect type feedback.
- expr->RecordTypeFeedback(oracle(), zone());
-
RECURSE(Visit(expr->obj()));
RECURSE(Visit(expr->key()));
- // We don't know anything about the result type.
+ expr->RecordTypeFeedback(oracle(), zone());
+
+ // We don't know anything about the type.
}
void AstTyper::VisitCall(Call* expr) {
- // Collect type feedback.
- Expression* callee = expr->expression();
- Property* prop = callee->AsProperty();
- if (prop != NULL) {
- if (prop->key()->IsPropertyName())
- expr->RecordTypeFeedback(oracle(), CALL_AS_METHOD);
- } else {
- expr->RecordTypeFeedback(oracle(), CALL_AS_FUNCTION);
- }
-
RECURSE(Visit(expr->expression()));
ZoneList<Expression*>* args = expr->arguments();
for (int i = 0; i < args->length(); ++i) {
@@ -458,19 +362,20 @@ void AstTyper::VisitCall(Call* expr) {
RECURSE(Visit(arg));
}
- VariableProxy* proxy = expr->expression()->AsVariableProxy();
- if (proxy != NULL && proxy->var()->is_possibly_eval(isolate())) {
- store_.Forget(); // Eval could do whatever to local variables.
+ Expression* callee = expr->expression();
+ Property* prop = callee->AsProperty();
+ if (prop != NULL) {
+ if (prop->key()->IsPropertyName())
+ expr->RecordTypeFeedback(oracle(), CALL_AS_METHOD);
+ } else {
+ expr->RecordTypeFeedback(oracle(), CALL_AS_FUNCTION);
}
- // We don't know anything about the result type.
+ // We don't know anything about the type.
}
void AstTyper::VisitCallNew(CallNew* expr) {
- // Collect type feedback.
- expr->RecordTypeFeedback(oracle());
-
RECURSE(Visit(expr->expression()));
ZoneList<Expression*>* args = expr->arguments();
for (int i = 0; i < args->length(); ++i) {
@@ -478,7 +383,9 @@ void AstTyper::VisitCallNew(CallNew* expr) {
RECURSE(Visit(arg));
}
- // We don't know anything about the result type.
+ expr->RecordTypeFeedback(oracle());
+
+ // We don't know anything about the type.
}
@@ -489,19 +396,21 @@ void AstTyper::VisitCallRuntime(CallRuntime* expr) {
RECURSE(Visit(arg));
}
- // We don't know anything about the result type.
+ // We don't know anything about the type.
}
void AstTyper::VisitUnaryOperation(UnaryOperation* expr) {
+ RECURSE(Visit(expr->expression()));
+
// Collect type feedback.
+ Handle<Type> op_type = oracle()->UnaryType(expr->UnaryOperationFeedbackId());
+ NarrowLowerType(expr->expression(), op_type);
if (expr->op() == Token::NOT) {
// TODO(rossberg): only do in test or value context.
expr->expression()->RecordToBooleanTypeFeedback(oracle());
}
- RECURSE(Visit(expr->expression()));
-
switch (expr->op()) {
case Token::NOT:
case Token::DELETE:
@@ -510,6 +419,16 @@ void AstTyper::VisitUnaryOperation(UnaryOperation* expr) {
case Token::VOID:
NarrowType(expr, Bounds(Type::Undefined(), isolate_));
break;
+ case Token::ADD:
+ case Token::SUB: {
+ Type* upper = *expr->expression()->bounds().upper;
+ if (!upper->Is(Type::Number())) upper = Type::Number();
+ NarrowType(expr, Bounds(Type::Smi(), upper, isolate_));
+ break;
+ }
+ case Token::BIT_NOT:
+ NarrowType(expr, Bounds(Type::Smi(), Type::Signed32(), isolate_));
+ break;
case Token::TYPEOF:
NarrowType(expr, Bounds(Type::InternalizedString(), isolate_));
break;
@@ -520,25 +439,22 @@ void AstTyper::VisitUnaryOperation(UnaryOperation* expr) {
void AstTyper::VisitCountOperation(CountOperation* expr) {
- // Collect type feedback.
+ RECURSE(Visit(expr->expression()));
+
expr->RecordTypeFeedback(oracle(), zone());
Property* prop = expr->expression()->AsProperty();
if (prop != NULL) {
prop->RecordTypeFeedback(oracle(), zone());
}
- RECURSE(Visit(expr->expression()));
-
NarrowType(expr, Bounds(Type::Smi(), Type::Number(), isolate_));
-
- VariableProxy* proxy = expr->expression()->AsVariableProxy();
- if (proxy != NULL && proxy->var()->IsStackAllocated()) {
- store_.Seq(variable_index(proxy->var()), Effect(expr->bounds()));
- }
}
void AstTyper::VisitBinaryOperation(BinaryOperation* expr) {
+ RECURSE(Visit(expr->left()));
+ RECURSE(Visit(expr->right()));
+
// Collect type feedback.
Handle<Type> type, left_type, right_type;
Maybe<int> fixed_right_arg;
@@ -554,29 +470,15 @@ void AstTyper::VisitBinaryOperation(BinaryOperation* expr) {
switch (expr->op()) {
case Token::COMMA:
- RECURSE(Visit(expr->left()));
- RECURSE(Visit(expr->right()));
NarrowType(expr, expr->right()->bounds());
break;
case Token::OR:
- case Token::AND: {
- Effects left_effects = EnterEffects();
- RECURSE(Visit(expr->left()));
- ExitEffects();
- Effects right_effects = EnterEffects();
- RECURSE(Visit(expr->right()));
- ExitEffects();
- left_effects.Alt(right_effects);
- store_.Seq(left_effects);
-
+ case Token::AND:
NarrowType(expr, Bounds::Either(
expr->left()->bounds(), expr->right()->bounds(), isolate_));
break;
- }
case Token::BIT_OR:
case Token::BIT_AND: {
- RECURSE(Visit(expr->left()));
- RECURSE(Visit(expr->right()));
Type* upper = Type::Union(
expr->left()->bounds().upper, expr->right()->bounds().upper);
if (!upper->Is(Type::Signed32())) upper = Type::Signed32();
@@ -586,18 +488,12 @@ void AstTyper::VisitBinaryOperation(BinaryOperation* expr) {
case Token::BIT_XOR:
case Token::SHL:
case Token::SAR:
- RECURSE(Visit(expr->left()));
- RECURSE(Visit(expr->right()));
NarrowType(expr, Bounds(Type::Smi(), Type::Signed32(), isolate_));
break;
case Token::SHR:
- RECURSE(Visit(expr->left()));
- RECURSE(Visit(expr->right()));
NarrowType(expr, Bounds(Type::Smi(), Type::Unsigned32(), isolate_));
break;
case Token::ADD: {
- RECURSE(Visit(expr->left()));
- RECURSE(Visit(expr->right()));
Bounds l = expr->left()->bounds();
Bounds r = expr->right()->bounds();
Type* lower =
@@ -617,8 +513,6 @@ void AstTyper::VisitBinaryOperation(BinaryOperation* expr) {
case Token::MUL:
case Token::DIV:
case Token::MOD:
- RECURSE(Visit(expr->left()));
- RECURSE(Visit(expr->right()));
NarrowType(expr, Bounds(Type::Smi(), Type::Number(), isolate_));
break;
default:
@@ -628,6 +522,9 @@ void AstTyper::VisitBinaryOperation(BinaryOperation* expr) {
void AstTyper::VisitCompareOperation(CompareOperation* expr) {
+ RECURSE(Visit(expr->left()));
+ RECURSE(Visit(expr->right()));
+
// Collect type feedback.
Handle<Type> left_type, right_type, combined_type;
oracle()->CompareType(expr->CompareOperationFeedbackId(),
@@ -636,9 +533,6 @@ void AstTyper::VisitCompareOperation(CompareOperation* expr) {
NarrowLowerType(expr->right(), right_type);
expr->set_combined_type(combined_type);
- RECURSE(Visit(expr->left()));
- RECURSE(Visit(expr->right()));
-
NarrowType(expr, Bounds(Type::Boolean(), isolate_));
}
diff --git a/chromium/v8/src/typing.h b/chromium/v8/src/typing.h
index c942b006327..ceef9843650 100644
--- a/chromium/v8/src/typing.h
+++ b/chromium/v8/src/typing.h
@@ -35,7 +35,6 @@
#include "compiler.h"
#include "type-info.h"
#include "types.h"
-#include "effects.h"
#include "zone.h"
#include "scopes.h"
@@ -58,13 +57,8 @@ class AstTyper: public AstVisitor {
private:
explicit AstTyper(CompilationInfo* info);
- static const int kNoVar = INT_MIN;
- typedef v8::internal::Effects<int, kNoVar> Effects;
- typedef v8::internal::NestedEffects<int, kNoVar> Store;
-
CompilationInfo* info_;
TypeFeedbackOracle oracle_;
- Store store_;
TypeFeedbackOracle* oracle() { return &oracle_; }
Zone* zone() const { return info_->zone(); }
@@ -76,17 +70,6 @@ class AstTyper: public AstVisitor {
e->set_bounds(Bounds::NarrowLower(e->bounds(), t, isolate_));
}
- Effects EnterEffects() {
- store_ = store_.Push();
- return store_.Top();
- }
- void ExitEffects() { store_ = store_.Pop(); }
-
- int variable_index(Variable* var) {
- return var->IsStackLocal() ? var->index() :
- var->IsParameter() ? -var->index() : kNoVar;
- }
-
void VisitDeclarations(ZoneList<Declaration*>* declarations);
void VisitStatements(ZoneList<Statement*>* statements);
diff --git a/chromium/v8/src/v8.cc b/chromium/v8/src/v8.cc
index 93f3efb2e3f..521d064129a 100644
--- a/chromium/v8/src/v8.cc
+++ b/chromium/v8/src/v8.cc
@@ -272,10 +272,9 @@ void V8::InitializeOncePerProcessImpl() {
FLAG_max_new_space_size = (1 << (kPageSizeBits - 10)) * 2;
}
- if (FLAG_parallel_recompilation &&
- (FLAG_trace_hydrogen || FLAG_trace_hydrogen_stubs)) {
+ if (FLAG_trace_hydrogen || FLAG_trace_hydrogen_stubs) {
+ // Tracing hydrogen do not work with parallel recompilation.
FLAG_parallel_recompilation = false;
- PrintF("Parallel recompilation has been disabled for tracing.\n");
}
if (FLAG_sweeper_threads <= 0) {
diff --git a/chromium/v8/src/v8globals.h b/chromium/v8/src/v8globals.h
index 6ec75478875..c3f1f01f944 100644
--- a/chromium/v8/src/v8globals.h
+++ b/chromium/v8/src/v8globals.h
@@ -363,8 +363,7 @@ enum StateTag {
GC,
COMPILER,
OTHER,
- EXTERNAL,
- IDLE
+ EXTERNAL
};
diff --git a/chromium/v8/src/version.cc b/chromium/v8/src/version.cc
index 5142d389c21..292389aa4ab 100644
--- a/chromium/v8/src/version.cc
+++ b/chromium/v8/src/version.cc
@@ -34,8 +34,8 @@
// system so their names cannot be changed without changing the scripts.
#define MAJOR_VERSION 3
#define MINOR_VERSION 20
-#define BUILD_NUMBER 17
-#define PATCH_LEVEL 0
+#define BUILD_NUMBER 15
+#define PATCH_LEVEL 5
// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
#define IS_CANDIDATE_VERSION 0
diff --git a/chromium/v8/src/x64/assembler-x64-inl.h b/chromium/v8/src/x64/assembler-x64-inl.h
index 826c06e5bad..ae9aeee8122 100644
--- a/chromium/v8/src/x64/assembler-x64-inl.h
+++ b/chromium/v8/src/x64/assembler-x64-inl.h
@@ -373,14 +373,13 @@ void RelocInfo::set_target_cell(Cell* cell, WriteBarrierMode mode) {
bool RelocInfo::IsPatchedReturnSequence() {
// The recognized call sequence is:
- // movq(kScratchRegister, address); call(kScratchRegister);
+ // movq(kScratchRegister, immediate64); call(kScratchRegister);
// It only needs to be distinguished from a return sequence
// movq(rsp, rbp); pop(rbp); ret(n); int3 *6
// The 11th byte is int3 (0xCC) in the return sequence and
// REX.WB (0x48+register bit) for the call sequence.
#ifdef ENABLE_DEBUGGER_SUPPORT
- return pc_[Assembler::kMoveAddressIntoScratchRegisterInstructionLength] !=
- 0xCC;
+ return pc_[2 + kPointerSize] != 0xCC;
#else
return false;
#endif
diff --git a/chromium/v8/src/x64/assembler-x64.cc b/chromium/v8/src/x64/assembler-x64.cc
index 8969d89a6a7..f5939c3b7e1 100644
--- a/chromium/v8/src/x64/assembler-x64.cc
+++ b/chromium/v8/src/x64/assembler-x64.cc
@@ -164,7 +164,10 @@ void CpuFeatures::Probe() {
// Patch the code at the current PC with a call to the target address.
// Additional guard int3 instructions can be added if required.
void RelocInfo::PatchCodeWithCall(Address target, int guard_bytes) {
- int code_size = Assembler::kCallSequenceLength + guard_bytes;
+ // Load register with immediate 64 and call through a register instructions
+ // takes up 13 bytes and int3 takes up one byte.
+ static const int kCallCodeSize = 13;
+ int code_size = kCallCodeSize + guard_bytes;
// Create a code patcher.
CodePatcher patcher(pc_, code_size);
@@ -180,7 +183,7 @@ void RelocInfo::PatchCodeWithCall(Address target, int guard_bytes) {
patcher.masm()->call(r10);
// Check that the size of the code generated is as expected.
- ASSERT_EQ(Assembler::kCallSequenceLength,
+ ASSERT_EQ(kCallCodeSize,
patcher.masm()->SizeOfCodeGeneratedSince(&check_codesize));
// Add the requested number of int3 instructions after the call.
diff --git a/chromium/v8/src/x64/assembler-x64.h b/chromium/v8/src/x64/assembler-x64.h
index 4e36b6e4bc4..07afc129dc8 100644
--- a/chromium/v8/src/x64/assembler-x64.h
+++ b/chromium/v8/src/x64/assembler-x64.h
@@ -579,36 +579,29 @@ class Assembler : public AssemblerBase {
// Distance between the address of the code target in the call instruction
// and the return address pushed on the stack.
static const int kCallTargetAddressOffset = 4; // Use 32-bit displacement.
- // The length of call(kScratchRegister).
- static const int kCallScratchRegisterInstructionLength = 3;
- // The length of call(Immediate32).
- static const int kShortCallInstructionLength = 5;
- // The length of movq(kScratchRegister, address).
- static const int kMoveAddressIntoScratchRegisterInstructionLength =
- 2 + kPointerSize;
- // The length of movq(kScratchRegister, address) and call(kScratchRegister).
- static const int kCallSequenceLength =
- kMoveAddressIntoScratchRegisterInstructionLength +
- kCallScratchRegisterInstructionLength;
-
- // The js return and debug break slot must be able to contain an indirect
- // call sequence, some x64 JS code is padded with int3 to make it large
- // enough to hold an instruction when the debugger patches it.
- static const int kJSReturnSequenceLength = kCallSequenceLength;
- static const int kDebugBreakSlotLength = kCallSequenceLength;
- static const int kPatchDebugBreakSlotReturnOffset = kCallTargetAddressOffset;
- // Distance between the start of the JS return sequence and where the
- // 32-bit displacement of a short call would be. The short call is from
- // SetDebugBreakAtIC from debug-x64.cc.
- static const int kPatchReturnSequenceAddressOffset =
- kJSReturnSequenceLength - kPatchDebugBreakSlotReturnOffset;
// Distance between the start of the JS return sequence and where the
- // 32-bit displacement of a short call would be. The short call is from
- // SetDebugBreakAtIC from debug-x64.cc.
- static const int kPatchDebugBreakSlotAddressOffset =
- kDebugBreakSlotLength - kPatchDebugBreakSlotReturnOffset;
- static const int kRealPatchReturnSequenceAddressOffset =
- kMoveAddressIntoScratchRegisterInstructionLength - kPointerSize;
+ // 32-bit displacement of a near call would be, relative to the pushed
+ // return address. TODO: Use return sequence length instead.
+ // Should equal Debug::kX64JSReturnSequenceLength - kCallTargetAddressOffset;
+ static const int kPatchReturnSequenceAddressOffset = 13 - 4;
+ // Distance between start of patched debug break slot and where the
+ // 32-bit displacement of a near call would be, relative to the pushed
+ // return address. TODO: Use return sequence length instead.
+ // Should equal Debug::kX64JSReturnSequenceLength - kCallTargetAddressOffset;
+ static const int kPatchDebugBreakSlotAddressOffset = 13 - 4;
+ // TODO(X64): Rename this, removing the "Real", after changing the above.
+ static const int kRealPatchReturnSequenceAddressOffset = 2;
+
+ // Some x64 JS code is padded with int3 to make it large
+ // enough to hold an instruction when the debugger patches it.
+ static const int kJumpInstructionLength = 13;
+ static const int kCallInstructionLength = 13;
+ static const int kJSReturnSequenceLength = 13;
+ static const int kShortCallInstructionLength = 5;
+ static const int kPatchDebugBreakSlotReturnOffset = 4;
+
+ // The debug break slot must be able to contain a call instruction.
+ static const int kDebugBreakSlotLength = kCallInstructionLength;
// One byte opcode for test eax,0xXXXXXXXX.
static const byte kTestEaxByte = 0xA9;
diff --git a/chromium/v8/src/x64/builtins-x64.cc b/chromium/v8/src/x64/builtins-x64.cc
index 18a6e566c6c..d34e4f70d9a 100644
--- a/chromium/v8/src/x64/builtins-x64.cc
+++ b/chromium/v8/src/x64/builtins-x64.cc
@@ -59,9 +59,9 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm,
int num_extra_args = 0;
if (extra_args == NEEDS_CALLED_FUNCTION) {
num_extra_args = 1;
- __ PopReturnAddressTo(kScratchRegister);
+ __ pop(kScratchRegister); // Save return address.
__ push(rdi);
- __ PushReturnAddressFrom(kScratchRegister);
+ __ push(kScratchRegister); // Restore return address.
} else {
ASSERT(extra_args == NO_EXTRA_ARGUMENTS);
}
@@ -249,7 +249,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
if (FLAG_debug_code) {
__ cmpq(rsi, rdi);
__ Assert(less_equal,
- kUnexpectedNumberOfPreAllocatedPropertyFields);
+ "Unexpected number of pre-allocated property fields.");
}
__ InitializeFieldsWithFiller(rcx, rsi, rdx);
__ LoadRoot(rdx, Heap::kOnePointerFillerMapRootIndex);
@@ -280,7 +280,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
__ subq(rdx, rcx);
// Done if no extra properties are to be allocated.
__ j(zero, &allocated);
- __ Assert(positive, kPropertyAllocationCountFailed);
+ __ Assert(positive, "Property allocation count failed.");
// Scale the number of elements by pointer size and add the header for
// FixedArrays to the start of the next object calculation from above.
@@ -429,10 +429,10 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
}
// Remove caller arguments from the stack and return.
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx);
SmiIndex index = masm->SmiToIndex(rbx, rbx, kPointerSizeLog2);
__ lea(rsp, Operand(rsp, index.reg, index.scale, 1 * kPointerSize));
- __ PushReturnAddressFrom(rcx);
+ __ push(rcx);
Counters* counters = masm->isolate()->counters();
__ IncrementCounter(counters->constructed_objects(), 1);
__ ret(0);
@@ -723,7 +723,7 @@ static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm,
__ ret(2 * kPointerSize); // Remove state, rax.
__ bind(&not_tos_rax);
- __ Abort(kNoCasesLeft);
+ __ Abort("no cases left");
}
@@ -772,9 +772,9 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) {
{ Label done;
__ testq(rax, rax);
__ j(not_zero, &done);
- __ PopReturnAddressTo(rbx);
+ __ pop(rbx);
__ Push(masm->isolate()->factory()->undefined_value());
- __ PushReturnAddressFrom(rbx);
+ __ push(rbx);
__ incq(rax);
__ bind(&done);
}
@@ -895,9 +895,9 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) {
__ cmpq(rdx, Immediate(1));
__ j(not_equal, &non_proxy);
- __ PopReturnAddressTo(rdx);
+ __ pop(rdx); // return address
__ push(rdi); // re-add proxy object as additional argument
- __ PushReturnAddressFrom(rdx);
+ __ push(rdx);
__ incq(rax);
__ GetBuiltinEntry(rdx, Builtins::CALL_FUNCTION_PROXY);
__ jmp(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
@@ -1113,9 +1113,9 @@ void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) {
// Will both indicate a NULL and a Smi.
STATIC_ASSERT(kSmiTag == 0);
Condition not_smi = NegateCondition(masm->CheckSmi(rbx));
- __ Check(not_smi, kUnexpectedInitialMapForInternalArrayFunction);
+ __ Check(not_smi, "Unexpected initial map for InternalArray function");
__ CmpObjectType(rbx, MAP_TYPE, rcx);
- __ Check(equal, kUnexpectedInitialMapForInternalArrayFunction);
+ __ Check(equal, "Unexpected initial map for InternalArray function");
}
// Run the native code for the InternalArray function called as a normal
@@ -1143,9 +1143,9 @@ void Builtins::Generate_ArrayCode(MacroAssembler* masm) {
// Will both indicate a NULL and a Smi.
STATIC_ASSERT(kSmiTag == 0);
Condition not_smi = NegateCondition(masm->CheckSmi(rbx));
- __ Check(not_smi, kUnexpectedInitialMapForArrayFunction);
+ __ Check(not_smi, "Unexpected initial map for Array function");
__ CmpObjectType(rbx, MAP_TYPE, rcx);
- __ Check(equal, kUnexpectedInitialMapForArrayFunction);
+ __ Check(equal, "Unexpected initial map for Array function");
}
// Run the native code for the Array function called as a normal function.
@@ -1173,7 +1173,7 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) {
if (FLAG_debug_code) {
__ LoadGlobalFunction(Context::STRING_FUNCTION_INDEX, rcx);
__ cmpq(rdi, rcx);
- __ Assert(equal, kUnexpectedStringFunction);
+ __ Assert(equal, "Unexpected String function");
}
// Load the first argument into rax and get rid of the rest
@@ -1182,9 +1182,9 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) {
__ testq(rax, rax);
__ j(zero, &no_arguments);
__ movq(rbx, Operand(rsp, rax, times_pointer_size, 0));
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx);
__ lea(rsp, Operand(rsp, rax, times_pointer_size, kPointerSize));
- __ PushReturnAddressFrom(rcx);
+ __ push(rcx);
__ movq(rax, rbx);
// Lookup the argument in the number to string cache.
@@ -1219,9 +1219,9 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) {
if (FLAG_debug_code) {
__ cmpb(FieldOperand(rcx, Map::kInstanceSizeOffset),
Immediate(JSValue::kSize >> kPointerSizeLog2));
- __ Assert(equal, kUnexpectedStringWrapperInstanceSize);
+ __ Assert(equal, "Unexpected string wrapper instance size");
__ cmpb(FieldOperand(rcx, Map::kUnusedPropertyFieldsOffset), Immediate(0));
- __ Assert(equal, kUnexpectedUnusedPropertiesOfStringWrapper);
+ __ Assert(equal, "Unexpected unused properties of string wrapper");
}
__ movq(FieldOperand(rax, HeapObject::kMapOffset), rcx);
@@ -1268,9 +1268,9 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) {
// stack, and jump back to the case where the argument is a string.
__ bind(&no_arguments);
__ LoadRoot(rbx, Heap::kempty_stringRootIndex);
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx);
__ lea(rsp, Operand(rsp, kPointerSize));
- __ PushReturnAddressFrom(rcx);
+ __ push(rcx);
__ jmp(&argument_is_string);
// At this point the argument is already a string. Call runtime to
@@ -1313,10 +1313,10 @@ static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) {
__ pop(rbp);
// Remove caller arguments from the stack.
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx);
SmiIndex index = masm->SmiToIndex(rbx, rbx, kPointerSizeLog2);
__ lea(rsp, Operand(rsp, index.reg, index.scale, 1 * kPointerSize));
- __ PushReturnAddressFrom(rcx);
+ __ push(rcx);
}
diff --git a/chromium/v8/src/x64/code-stubs-x64.cc b/chromium/v8/src/x64/code-stubs-x64.cc
index ad33a8c6319..551a71690e7 100644
--- a/chromium/v8/src/x64/code-stubs-x64.cc
+++ b/chromium/v8/src/x64/code-stubs-x64.cc
@@ -246,6 +246,17 @@ void ToBooleanStub::InitializeInterfaceDescriptor(
}
+void UnaryOpStub::InitializeInterfaceDescriptor(
+ Isolate* isolate,
+ CodeStubInterfaceDescriptor* descriptor) {
+ static Register registers[] = { rax };
+ descriptor->register_param_count_ = 1;
+ descriptor->register_params_ = registers;
+ descriptor->deoptimization_handler_ =
+ FUNCTION_ADDR(UnaryOpIC_Miss);
+}
+
+
void StoreGlobalStub::InitializeInterfaceDescriptor(
Isolate* isolate,
CodeStubInterfaceDescriptor* descriptor) {
@@ -419,12 +430,12 @@ void FastNewClosureStub::Generate(MacroAssembler* masm) {
// Create a new closure through the slower runtime call.
__ bind(&gc);
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx); // Temporarily remove return address.
__ pop(rdx);
__ push(rsi);
__ push(rdx);
__ PushRoot(Heap::kFalseValueRootIndex);
- __ PushReturnAddressFrom(rcx);
+ __ push(rcx); // Restore return address.
__ TailCallRuntime(Runtime::kNewClosure, 3, 1);
}
@@ -500,8 +511,9 @@ void FastNewBlockContextStub::Generate(MacroAssembler* masm) {
Label after_sentinel;
__ JumpIfNotSmi(rcx, &after_sentinel, Label::kNear);
if (FLAG_debug_code) {
+ const char* message = "Expected 0 as a Smi sentinel";
__ cmpq(rcx, Immediate(0));
- __ Assert(equal, kExpected0AsASmiSentinel);
+ __ Assert(equal, message);
}
__ movq(rcx, GlobalObjectOperand());
__ movq(rcx, FieldOperand(rcx, GlobalObject::kNativeContextOffset));
@@ -683,13 +695,13 @@ void BinaryOpStub::Initialize() {}
void BinaryOpStub::GenerateTypeTransition(MacroAssembler* masm) {
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx); // Save return address.
__ push(rdx);
__ push(rax);
// Left and right arguments are now on top.
__ Push(Smi::FromInt(MinorKey()));
- __ PushReturnAddressFrom(rcx);
+ __ push(rcx); // Push return address.
// Patch the caller to an appropriate specialized stub and return the
// operation result to the caller of the stub.
@@ -942,7 +954,7 @@ static void BinaryOpStub_GenerateFloatingPointCode(MacroAssembler* masm,
// Set the map.
__ AssertRootValue(heap_number_map,
Heap::kHeapNumberMapRootIndex,
- kHeapNumberMapRegisterClobbered);
+ "HeapNumberMap register clobbered.");
__ movq(FieldOperand(rax, HeapObject::kMapOffset),
heap_number_map);
__ cvtqsi2sd(xmm0, rbx);
@@ -962,7 +974,8 @@ static void BinaryOpStub_GenerateFloatingPointCode(MacroAssembler* masm,
}
// No fall-through from this generated code.
if (FLAG_debug_code) {
- __ Abort(kUnexpectedFallThroughInBinaryStubGenerateFloatingPointCode);
+ __ Abort("Unexpected fall-through in "
+ "BinaryStub_GenerateFloatingPointCode.");
}
}
@@ -971,10 +984,10 @@ static void BinaryOpStub_GenerateRegisterArgsPushUnderReturn(
MacroAssembler* masm) {
// Push arguments, but ensure they are under the return address
// for a tail call.
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx);
__ push(rdx);
__ push(rax);
- __ PushReturnAddressFrom(rcx);
+ __ push(rcx);
}
@@ -2142,10 +2155,10 @@ void StoreArrayLengthStub::Generate(MacroAssembler* masm) {
__ JumpIfNotSmi(value, &miss);
// Prepare tail call to StoreIC_ArrayLength.
- __ PopReturnAddressTo(scratch);
+ __ pop(scratch);
__ push(receiver);
__ push(value);
- __ PushReturnAddressFrom(scratch);
+ __ push(scratch); // return address
ExternalReference ref =
ExternalReference(IC_Utility(IC::kStoreIC_ArrayLength), masm->isolate());
@@ -2211,9 +2224,9 @@ void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) {
// Slow-case: Handle non-smi or out-of-bounds access to arguments
// by calling the runtime system.
__ bind(&slow);
- __ PopReturnAddressTo(rbx);
+ __ pop(rbx); // Return address.
__ push(rdx);
- __ PushReturnAddressFrom(rbx);
+ __ push(rbx);
__ TailCallRuntime(Runtime::kGetArgumentsProperty, 1, 1);
}
@@ -2603,9 +2616,9 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
if (FLAG_debug_code) {
Condition is_smi = masm->CheckSmi(rax);
__ Check(NegateCondition(is_smi),
- kUnexpectedTypeForRegExpDataFixedArrayExpected);
+ "Unexpected type for RegExp data, FixedArray expected");
__ CmpObjectType(rax, FIXED_ARRAY_TYPE, kScratchRegister);
- __ Check(equal, kUnexpectedTypeForRegExpDataFixedArrayExpected);
+ __ Check(equal, "Unexpected type for RegExp data, FixedArray expected");
}
// rax: RegExp data (FixedArray)
@@ -2971,7 +2984,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
// Assert that we do not have a cons or slice (indirect strings) here.
// Sequential strings have already been ruled out.
__ testb(rbx, Immediate(kIsIndirectStringMask));
- __ Assert(zero, kExternalStringExpectedButNotFound);
+ __ Assert(zero, "external string expected, but not found");
}
__ movq(rdi, FieldOperand(rdi, ExternalString::kResourceDataOffset));
// Move the pointer so that offset-wise, it looks like a sequential string.
@@ -3435,7 +3448,7 @@ void ICCompareStub::GenerateGeneric(MacroAssembler* masm) {
}
#ifdef DEBUG
- __ Abort(kUnexpectedFallThroughFromStringComparison);
+ __ Abort("Unexpected fall-through from string comparison");
#endif
__ bind(&check_unequal_objects);
@@ -3473,7 +3486,7 @@ void ICCompareStub::GenerateGeneric(MacroAssembler* masm) {
}
// Push arguments below the return address to prepare jump to builtin.
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx);
__ push(rdx);
__ push(rax);
@@ -3486,7 +3499,8 @@ void ICCompareStub::GenerateGeneric(MacroAssembler* masm) {
__ Push(Smi::FromInt(NegativeComparisonResult(cc)));
}
- __ PushReturnAddressFrom(rcx);
+ // Restore return address on the stack.
+ __ push(rcx);
// Call the native; it returns -1 (less), 0 (equal), or 1 (greater)
// tagged as a small integer.
@@ -3655,9 +3669,9 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
// Check for function proxy.
__ CmpInstanceType(rcx, JS_FUNCTION_PROXY_TYPE);
__ j(not_equal, &non_function);
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx);
__ push(rdi); // put proxy as additional argument under return address
- __ PushReturnAddressFrom(rcx);
+ __ push(rcx);
__ Set(rax, argc_ + 1);
__ Set(rbx, 0);
__ SetCallKind(rcx, CALL_AS_METHOD);
@@ -4261,7 +4275,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
if (FLAG_debug_code) {
__ movl(rdi, Immediate(kWordBeforeMapCheckValue));
__ cmpl(Operand(kScratchRegister, kOffsetToMapCheckValue - 4), rdi);
- __ Assert(equal, kInstanceofStubUnexpectedCallSiteCacheCheck);
+ __ Assert(equal, "InstanceofStub unexpected call site cache (check).");
}
__ movq(kScratchRegister,
Operand(kScratchRegister, kOffsetToMapCheckValue));
@@ -4303,7 +4317,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
if (FLAG_debug_code) {
__ movl(rax, Immediate(kWordBeforeResultValue));
__ cmpl(Operand(kScratchRegister, kOffsetToResultValue - 4), rax);
- __ Assert(equal, kInstanceofStubUnexpectedCallSiteCacheMov);
+ __ Assert(equal, "InstanceofStub unexpected call site cache (mov).");
}
__ Set(rax, 0);
}
@@ -4326,7 +4340,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
if (FLAG_debug_code) {
__ movl(rax, Immediate(kWordBeforeResultValue));
__ cmpl(Operand(kScratchRegister, kOffsetToResultValue - 4), rax);
- __ Assert(equal, kInstanceofStubUnexpectedCallSiteCacheMov);
+ __ Assert(equal, "InstanceofStub unexpected call site cache (mov)");
}
}
__ ret(2 * kPointerSize + extra_stack_space);
@@ -4335,9 +4349,9 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
__ bind(&slow);
if (HasCallSiteInlineCheck()) {
// Remove extra value from the stack.
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx);
__ pop(rax);
- __ PushReturnAddressFrom(rcx);
+ __ push(rcx);
}
__ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION);
}
@@ -4390,7 +4404,7 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) {
void StringCharCodeAtGenerator::GenerateSlow(
MacroAssembler* masm,
const RuntimeCallHelper& call_helper) {
- __ Abort(kUnexpectedFallthroughToCharCodeAtSlowCase);
+ __ Abort("Unexpected fallthrough to CharCodeAt slow case");
Factory* factory = masm->isolate()->factory();
// Index is not a smi.
@@ -4440,7 +4454,7 @@ void StringCharCodeAtGenerator::GenerateSlow(
call_helper.AfterCall(masm);
__ jmp(&exit_);
- __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase);
+ __ Abort("Unexpected fallthrough from CharCodeAt slow case");
}
@@ -4466,7 +4480,7 @@ void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) {
void StringCharFromCodeGenerator::GenerateSlow(
MacroAssembler* masm,
const RuntimeCallHelper& call_helper) {
- __ Abort(kUnexpectedFallthroughToCharFromCodeSlowCase);
+ __ Abort("Unexpected fallthrough to CharFromCode slow case");
__ bind(&slow_case_);
call_helper.BeforeCall(masm);
@@ -4478,7 +4492,7 @@ void StringCharFromCodeGenerator::GenerateSlow(
call_helper.AfterCall(masm);
__ jmp(&exit_);
- __ Abort(kUnexpectedFallthroughFromCharFromCodeSlowCase);
+ __ Abort("Unexpected fallthrough from CharFromCode slow case");
}
@@ -4808,10 +4822,10 @@ void StringAddStub::GenerateRegisterArgsPush(MacroAssembler* masm) {
void StringAddStub::GenerateRegisterArgsPop(MacroAssembler* masm,
Register temp) {
- __ PopReturnAddressTo(temp);
+ __ pop(temp);
__ pop(rdx);
__ pop(rax);
- __ PushReturnAddressFrom(temp);
+ __ push(temp);
}
@@ -5026,7 +5040,7 @@ void StringHelper::GenerateTwoCharacterStringTableProbe(MacroAssembler* masm,
if (FLAG_debug_code) {
__ LoadRoot(kScratchRegister, Heap::kTheHoleValueRootIndex);
__ cmpq(kScratchRegister, candidate);
- __ Assert(equal, kOddballInStringTableIsNotUndefinedOrTheHole);
+ __ Assert(equal, "oddball in string table is not undefined or the hole");
}
__ jmp(&next_probe[i]);
@@ -5515,9 +5529,9 @@ void StringCompareStub::Generate(MacroAssembler* masm) {
// Inline comparison of ASCII strings.
__ IncrementCounter(counters->string_compare_native(), 1);
// Drop arguments from the stack
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx);
__ addq(rsp, Immediate(2 * kPointerSize));
- __ PushReturnAddressFrom(rcx);
+ __ push(rcx);
GenerateCompareFlatAsciiStrings(masm, rdx, rax, rcx, rbx, rdi, r8);
// Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater)
@@ -5786,10 +5800,10 @@ void ICCompareStub::GenerateStrings(MacroAssembler* masm) {
// Handle more complex cases in runtime.
__ bind(&runtime);
- __ PopReturnAddressTo(tmp1);
+ __ pop(tmp1); // Return address.
__ push(left);
__ push(right);
- __ PushReturnAddressFrom(tmp1);
+ __ push(tmp1);
if (equality) {
__ TailCallRuntime(Runtime::kStringEquals, 2, 1);
} else {
@@ -6397,14 +6411,16 @@ void StoreArrayLiteralElementStub::Generate(MacroAssembler* masm) {
// the runtime.
__ bind(&slow_elements);
- __ PopReturnAddressTo(rdi);
+ __ pop(rdi); // Pop return address and remember to put back later for tail
+ // call.
__ push(rbx);
__ push(rcx);
__ push(rax);
__ movq(rbx, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset));
__ push(FieldOperand(rbx, JSFunction::kLiteralsOffset));
__ push(rdx);
- __ PushReturnAddressFrom(rdi);
+ __ push(rdi); // Return return address so that tail call returns to right
+ // place.
__ TailCallRuntime(Runtime::kStoreArrayLiteralElement, 5, 1);
// Array literal has ElementsKind of FAST_*_ELEMENTS and value is an object.
@@ -6451,7 +6467,7 @@ void StubFailureTrampolineStub::Generate(MacroAssembler* masm) {
StubFailureTrampolineFrame::kCallerStackParameterCountFrameOffset;
__ movq(rbx, MemOperand(rbp, parameter_count_offset));
masm->LeaveFrame(StackFrame::STUB_FAILURE_TRAMPOLINE);
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx);
int additional_offset = function_mode_ == JS_FUNCTION_STUB_MODE
? kPointerSize
: 0;
@@ -6523,7 +6539,7 @@ static void CreateArrayDispatch(MacroAssembler* masm) {
}
// If we reached this point there is a problem.
- __ Abort(kUnexpectedElementsKindInArrayConstructor);
+ __ Abort("Unexpected ElementsKind in array constructor");
}
@@ -6586,7 +6602,7 @@ static void CreateArrayDispatchOneArgument(MacroAssembler* masm) {
}
// If we reached this point there is a problem.
- __ Abort(kUnexpectedElementsKindInArrayConstructor);
+ __ Abort("Unexpected ElementsKind in array constructor");
}
@@ -6652,9 +6668,9 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
// Will both indicate a NULL and a Smi.
STATIC_ASSERT(kSmiTag == 0);
Condition not_smi = NegateCondition(masm->CheckSmi(rcx));
- __ Check(not_smi, kUnexpectedInitialMapForArrayFunction);
+ __ Check(not_smi, "Unexpected initial map for Array function");
__ CmpObjectType(rcx, MAP_TYPE, rcx);
- __ Check(equal, kUnexpectedInitialMapForArrayFunction);
+ __ Check(equal, "Unexpected initial map for Array function");
// We should either have undefined in rbx or a valid cell
Label okay_here;
@@ -6662,7 +6678,7 @@ void ArrayConstructorStub::Generate(MacroAssembler* masm) {
__ Cmp(rbx, undefined_sentinel);
__ j(equal, &okay_here);
__ Cmp(FieldOperand(rbx, 0), cell_map);
- __ Assert(equal, kExpectedPropertyCellInRegisterRbx);
+ __ Assert(equal, "Expected property cell in register rbx");
__ bind(&okay_here);
}
@@ -6767,9 +6783,9 @@ void InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
// Will both indicate a NULL and a Smi.
STATIC_ASSERT(kSmiTag == 0);
Condition not_smi = NegateCondition(masm->CheckSmi(rcx));
- __ Check(not_smi, kUnexpectedInitialMapForArrayFunction);
+ __ Check(not_smi, "Unexpected initial map for Array function");
__ CmpObjectType(rcx, MAP_TYPE, rcx);
- __ Check(equal, kUnexpectedInitialMapForArrayFunction);
+ __ Check(equal, "Unexpected initial map for Array function");
}
// Figure out the right elements kind
@@ -6788,7 +6804,7 @@ void InternalArrayConstructorStub::Generate(MacroAssembler* masm) {
__ j(equal, &done);
__ cmpl(rcx, Immediate(FAST_HOLEY_ELEMENTS));
__ Assert(equal,
- kInvalidElementsKindForInternalArrayOrInternalPackedArray);
+ "Invalid ElementsKind for InternalArray or InternalPackedArray");
__ bind(&done);
}
diff --git a/chromium/v8/src/x64/codegen-x64.cc b/chromium/v8/src/x64/codegen-x64.cc
index a39f14b0757..a823bf2e6d0 100644
--- a/chromium/v8/src/x64/codegen-x64.cc
+++ b/chromium/v8/src/x64/codegen-x64.cc
@@ -394,7 +394,7 @@ void ElementsTransitionGenerator::GenerateSmiToDouble(
if (FLAG_debug_code) {
__ CompareRoot(rbx, Heap::kTheHoleValueRootIndex);
- __ Assert(equal, kObjectFoundInSmiOnlyArray);
+ __ Assert(equal, "object found in smi-only array");
}
__ movq(FieldOperand(r14, r9, times_8, FixedDoubleArray::kHeaderSize), r15);
@@ -577,7 +577,7 @@ void StringCharLoadGenerator::Generate(MacroAssembler* masm,
// Assert that we do not have a cons or slice (indirect strings) here.
// Sequential strings have already been ruled out.
__ testb(result, Immediate(kIsIndirectStringMask));
- __ Assert(zero, kExternalStringExpectedButNotFound);
+ __ Assert(zero, "external string expected, but not found");
}
// Rule out short external strings.
STATIC_CHECK(kShortExternalStringTag != 0);
diff --git a/chromium/v8/src/x64/debug-x64.cc b/chromium/v8/src/x64/debug-x64.cc
index e6bc92950a9..a337b0d052f 100644
--- a/chromium/v8/src/x64/debug-x64.cc
+++ b/chromium/v8/src/x64/debug-x64.cc
@@ -48,10 +48,11 @@ bool BreakLocationIterator::IsDebugBreakAtReturn() {
// CodeGenerator::VisitReturnStatement and VirtualFrame::Exit in codegen-x64.cc
// for the precise return instructions sequence.
void BreakLocationIterator::SetDebugBreakAtReturn() {
- ASSERT(Assembler::kJSReturnSequenceLength >= Assembler::kCallSequenceLength);
+ ASSERT(Assembler::kJSReturnSequenceLength >=
+ Assembler::kCallInstructionLength);
rinfo()->PatchCodeWithCall(
Isolate::Current()->debug()->debug_break_return()->entry(),
- Assembler::kJSReturnSequenceLength - Assembler::kCallSequenceLength);
+ Assembler::kJSReturnSequenceLength - Assembler::kCallInstructionLength);
}
@@ -81,7 +82,7 @@ void BreakLocationIterator::SetDebugBreakAtSlot() {
ASSERT(IsDebugBreakSlot());
rinfo()->PatchCodeWithCall(
Isolate::Current()->debug()->debug_break_slot()->entry(),
- Assembler::kDebugBreakSlotLength - Assembler::kCallSequenceLength);
+ Assembler::kDebugBreakSlotLength - Assembler::kCallInstructionLength);
}
diff --git a/chromium/v8/src/x64/deoptimizer-x64.cc b/chromium/v8/src/x64/deoptimizer-x64.cc
index e9cf567f7e4..b45e9663e2a 100644
--- a/chromium/v8/src/x64/deoptimizer-x64.cc
+++ b/chromium/v8/src/x64/deoptimizer-x64.cc
@@ -42,7 +42,7 @@ const int Deoptimizer::table_entry_size_ = 10;
int Deoptimizer::patch_size() {
- return Assembler::kCallSequenceLength;
+ return Assembler::kCallInstructionLength;
}
@@ -69,7 +69,7 @@ void Deoptimizer::PatchCodeForDeoptimization(Isolate* isolate, Code* code) {
Address call_address = instruction_start + deopt_data->Pc(i)->value();
// There is room enough to write a long call instruction because we pad
// LLazyBailout instructions with nops if necessary.
- CodePatcher patcher(call_address, Assembler::kCallSequenceLength);
+ CodePatcher patcher(call_address, Assembler::kCallInstructionLength);
patcher.masm()->Call(GetDeoptimizationEntry(isolate, i, LAZY),
RelocInfo::NONE64);
ASSERT(prev_call_address == NULL ||
diff --git a/chromium/v8/src/x64/full-codegen-x64.cc b/chromium/v8/src/x64/full-codegen-x64.cc
index 6333e87bea1..bac4e793b27 100644
--- a/chromium/v8/src/x64/full-codegen-x64.cc
+++ b/chromium/v8/src/x64/full-codegen-x64.cc
@@ -753,9 +753,9 @@ void FullCodeGenerator::EmitDebugCheckDeclarationContext(Variable* variable) {
// Check that we're not inside a with or catch context.
__ movq(rbx, FieldOperand(rsi, HeapObject::kMapOffset));
__ CompareRoot(rbx, Heap::kWithContextMapRootIndex);
- __ Check(not_equal, kDeclarationInWithContext);
+ __ Check(not_equal, "Declaration in with context.");
__ CompareRoot(rbx, Heap::kCatchContextMapRootIndex);
- __ Check(not_equal, kDeclarationInCatchContext);
+ __ Check(not_equal, "Declaration in catch context.");
}
}
@@ -2192,7 +2192,7 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
__ Push(Smi::FromInt(resume_mode));
__ CallRuntime(Runtime::kResumeJSGeneratorObject, 3);
// Not reached: the runtime call returns elsewhere.
- __ Abort(kGeneratorFailedToResume);
+ __ Abort("Generator failed to resume.");
// Throw error if we attempt to operate on a running generator.
__ bind(&wrong_state);
@@ -2456,7 +2456,7 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
// Check for an uninitialized let binding.
__ movq(rdx, location);
__ CompareRoot(rdx, Heap::kTheHoleValueRootIndex);
- __ Check(equal, kLetBindingReInitialization);
+ __ Check(equal, "Let binding re-initialization.");
}
// Perform the assignment.
__ movq(location, rax);
@@ -3398,14 +3398,14 @@ void FullCodeGenerator::EmitSeqStringSetCharCheck(Register string,
Register index,
Register value,
uint32_t encoding_mask) {
- __ Check(masm()->CheckSmi(index), kNonSmiIndex);
- __ Check(masm()->CheckSmi(value), kNonSmiValue);
+ __ Check(masm()->CheckSmi(index), "Non-smi index");
+ __ Check(masm()->CheckSmi(value), "Non-smi value");
__ SmiCompare(index, FieldOperand(string, String::kLengthOffset));
- __ Check(less, kIndexIsTooLarge);
+ __ Check(less, "Index is too large");
__ SmiCompare(index, Smi::FromInt(0));
- __ Check(greater_equal, kIndexIsNegative);
+ __ Check(greater_equal, "Index is negative");
__ push(value);
__ movq(value, FieldOperand(string, HeapObject::kMapOffset));
@@ -3413,7 +3413,7 @@ void FullCodeGenerator::EmitSeqStringSetCharCheck(Register string,
__ andb(value, Immediate(kStringRepresentationMask | kStringEncodingMask));
__ cmpq(value, Immediate(encoding_mask));
- __ Check(equal, kUnexpectedStringType);
+ __ Check(equal, "Unexpected string type");
__ pop(value);
}
@@ -3777,7 +3777,7 @@ void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) {
Handle<FixedArray> jsfunction_result_caches(
isolate()->native_context()->jsfunction_result_caches());
if (jsfunction_result_caches->length() <= cache_id) {
- __ Abort(kAttemptToUseUndefinedCache);
+ __ Abort("Attempt to use undefined cache.");
__ LoadRoot(rax, Heap::kUndefinedValueRootIndex);
context()->Plug(rax);
return;
@@ -3971,7 +3971,7 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
// scratch, string_length(int32), elements(FixedArray*).
if (generate_debug_code_) {
__ cmpq(index, array_length);
- __ Assert(below, kNoEmptyArraysHereInEmitFastAsciiArrayJoin);
+ __ Assert(below, "No empty arrays here in EmitFastAsciiArrayJoin");
}
__ bind(&loop);
__ movq(string, FieldOperand(elements,
@@ -4335,12 +4335,35 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
break;
}
+ case Token::SUB:
+ EmitUnaryOperation(expr, "[ UnaryOperation (SUB)");
+ break;
+
+ case Token::BIT_NOT:
+ EmitUnaryOperation(expr, "[ UnaryOperation (BIT_NOT)");
+ break;
+
default:
UNREACHABLE();
}
}
+void FullCodeGenerator::EmitUnaryOperation(UnaryOperation* expr,
+ const char* comment) {
+ // TODO(svenpanne): Allowing format strings in Comment would be nice here...
+ Comment cmt(masm_, comment);
+ UnaryOpStub stub(expr->op());
+ // UnaryOpStub expects the argument to be in the
+ // accumulator register rax.
+ VisitForAccumulatorValue(expr->expression());
+ SetSourcePosition(expr->position());
+ CallIC(stub.GetCode(isolate()), RelocInfo::CODE_TARGET,
+ expr->UnaryOperationFeedbackId());
+ context()->Plug(rax);
+}
+
+
void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
Comment cmnt(masm_, "[ CountOperation");
SetSourcePosition(expr->position());
@@ -4796,7 +4819,7 @@ void FullCodeGenerator::EnterFinallyBlock() {
ASSERT(!result_register().is(rdx));
ASSERT(!result_register().is(rcx));
// Cook return address on top of stack (smi encoded Code* delta)
- __ PopReturnAddressTo(rdx);
+ __ pop(rdx);
__ Move(rcx, masm_->CodeObject());
__ subq(rdx, rcx);
__ Integer32ToSmi(rdx, rdx);
diff --git a/chromium/v8/src/x64/ic-x64.cc b/chromium/v8/src/x64/ic-x64.cc
index 4837b9aa9a8..6e238c76ece 100644
--- a/chromium/v8/src/x64/ic-x64.cc
+++ b/chromium/v8/src/x64/ic-x64.cc
@@ -570,10 +570,10 @@ void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) {
__ j(not_zero, &slow);
// Everything is fine, call runtime.
- __ PopReturnAddressTo(rcx);
+ __ pop(rcx);
__ push(rdx); // receiver
__ push(rax); // key
- __ PushReturnAddressFrom(rcx);
+ __ push(rcx); // return address
// Perform tail call to the entry.
__ TailCallExternalReference(
@@ -1369,10 +1369,10 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) {
Counters* counters = masm->isolate()->counters();
__ IncrementCounter(counters->load_miss(), 1);
- __ PopReturnAddressTo(rbx);
+ __ pop(rbx);
__ push(rax); // receiver
__ push(rcx); // name
- __ PushReturnAddressFrom(rbx);
+ __ push(rbx); // return address
// Perform tail call to the entry.
ExternalReference ref =
@@ -1388,10 +1388,10 @@ void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
// -- rsp[0] : return address
// -----------------------------------
- __ PopReturnAddressTo(rbx);
+ __ pop(rbx);
__ push(rax); // receiver
__ push(rcx); // name
- __ PushReturnAddressFrom(rbx);
+ __ push(rbx); // return address
// Perform tail call to the entry.
__ TailCallRuntime(Runtime::kGetProperty, 2, 1);
@@ -1408,10 +1408,10 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) {
Counters* counters = masm->isolate()->counters();
__ IncrementCounter(counters->keyed_load_miss(), 1);
- __ PopReturnAddressTo(rbx);
+ __ pop(rbx);
__ push(rdx); // receiver
__ push(rax); // name
- __ PushReturnAddressFrom(rbx);
+ __ push(rbx); // return address
// Perform tail call to the entry.
ExternalReference ref = miss_mode == MISS_FORCE_GENERIC
@@ -1429,10 +1429,10 @@ void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
// -- rsp[0] : return address
// -----------------------------------
- __ PopReturnAddressTo(rbx);
+ __ pop(rbx);
__ push(rdx); // receiver
__ push(rax); // name
- __ PushReturnAddressFrom(rbx);
+ __ push(rbx); // return address
// Perform tail call to the entry.
__ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1);
@@ -1468,11 +1468,11 @@ void StoreIC::GenerateMiss(MacroAssembler* masm) {
// -- rsp[0] : return address
// -----------------------------------
- __ PopReturnAddressTo(rbx);
+ __ pop(rbx);
__ push(rdx); // receiver
__ push(rcx); // name
__ push(rax); // value
- __ PushReturnAddressFrom(rbx);
+ __ push(rbx); // return address
// Perform tail call to the entry.
ExternalReference ref =
@@ -1512,13 +1512,13 @@ void StoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm,
// -- rdx : receiver
// -- rsp[0] : return address
// -----------------------------------
- __ PopReturnAddressTo(rbx);
+ __ pop(rbx);
__ push(rdx);
__ push(rcx);
__ push(rax);
__ Push(Smi::FromInt(NONE)); // PropertyAttributes
__ Push(Smi::FromInt(strict_mode));
- __ PushReturnAddressFrom(rbx);
+ __ push(rbx); // return address
// Do tail-call to runtime routine.
__ TailCallRuntime(Runtime::kSetProperty, 5, 1);
@@ -1534,13 +1534,13 @@ void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm,
// -- rsp[0] : return address
// -----------------------------------
- __ PopReturnAddressTo(rbx);
+ __ pop(rbx);
__ push(rdx); // receiver
__ push(rcx); // key
__ push(rax); // value
__ Push(Smi::FromInt(NONE)); // PropertyAttributes
__ Push(Smi::FromInt(strict_mode)); // Strict mode.
- __ PushReturnAddressFrom(rbx);
+ __ push(rbx); // return address
// Do tail-call to runtime routine.
__ TailCallRuntime(Runtime::kSetProperty, 5, 1);
@@ -1555,11 +1555,11 @@ void StoreIC::GenerateSlow(MacroAssembler* masm) {
// -- rsp[0] : return address
// -----------------------------------
- __ PopReturnAddressTo(rbx);
+ __ pop(rbx);
__ push(rdx); // receiver
__ push(rcx); // key
__ push(rax); // value
- __ PushReturnAddressFrom(rbx);
+ __ push(rbx); // return address
// Do tail-call to runtime routine.
ExternalReference ref(IC_Utility(kStoreIC_Slow), masm->isolate());
@@ -1575,11 +1575,11 @@ void KeyedStoreIC::GenerateSlow(MacroAssembler* masm) {
// -- rsp[0] : return address
// -----------------------------------
- __ PopReturnAddressTo(rbx);
+ __ pop(rbx);
__ push(rdx); // receiver
__ push(rcx); // key
__ push(rax); // value
- __ PushReturnAddressFrom(rbx);
+ __ push(rbx); // return address
// Do tail-call to runtime routine.
ExternalReference ref(IC_Utility(kKeyedStoreIC_Slow), masm->isolate());
@@ -1595,11 +1595,11 @@ void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) {
// -- rsp[0] : return address
// -----------------------------------
- __ PopReturnAddressTo(rbx);
+ __ pop(rbx);
__ push(rdx); // receiver
__ push(rcx); // key
__ push(rax); // value
- __ PushReturnAddressFrom(rbx);
+ __ push(rbx); // return address
// Do tail-call to runtime routine.
ExternalReference ref = miss_mode == MISS_FORCE_GENERIC
diff --git a/chromium/v8/src/x64/lithium-codegen-x64.cc b/chromium/v8/src/x64/lithium-codegen-x64.cc
index abb8c77b5b7..c2207317c18 100644
--- a/chromium/v8/src/x64/lithium-codegen-x64.cc
+++ b/chromium/v8/src/x64/lithium-codegen-x64.cc
@@ -96,7 +96,7 @@ void LCodeGen::FinishCode(Handle<Code> code) {
}
-void LChunkBuilder::Abort(BailoutReason reason) {
+void LChunkBuilder::Abort(const char* reason) {
info()->set_bailout_reason(reason);
status_ = ABORTED;
}
@@ -278,8 +278,6 @@ bool LCodeGen::GenerateBody() {
instr->Mnemonic());
}
- RecordAndUpdatePosition(instr->position());
-
instr->CompileToNative(this);
}
EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
@@ -333,10 +331,6 @@ bool LCodeGen::GenerateDeferredCode() {
if (deferred_.length() > 0) {
for (int i = 0; !is_aborted() && i < deferred_.length(); i++) {
LDeferredCode* code = deferred_[i];
-
- int pos = instructions_->at(code->instruction_index())->position();
- RecordAndUpdatePosition(pos);
-
Comment(";;; <@%d,#%d> "
"-------------------- Deferred %s --------------------",
code->instruction_index(),
@@ -503,57 +497,37 @@ void LCodeGen::WriteTranslation(LEnvironment* environment,
break;
}
- int object_index = 0;
- int dematerialized_index = 0;
for (int i = 0; i < translation_size; ++i) {
LOperand* value = environment->values()->at(i);
- AddToTranslation(environment,
- translation,
+
+ // TODO(mstarzinger): Introduce marker operands to indicate that this value
+ // is not present and must be reconstructed from the deoptimizer. Currently
+ // this is only used for the arguments object.
+ if (value == NULL) {
+ int arguments_count = environment->values()->length() - translation_size;
+ translation->BeginArgumentsObject(arguments_count);
+ for (int i = 0; i < arguments_count; ++i) {
+ LOperand* value = environment->values()->at(translation_size + i);
+ AddToTranslation(translation,
+ value,
+ environment->HasTaggedValueAt(translation_size + i),
+ environment->HasUint32ValueAt(translation_size + i));
+ }
+ continue;
+ }
+
+ AddToTranslation(translation,
value,
environment->HasTaggedValueAt(i),
- environment->HasUint32ValueAt(i),
- &object_index,
- &dematerialized_index);
+ environment->HasUint32ValueAt(i));
}
}
-void LCodeGen::AddToTranslation(LEnvironment* environment,
- Translation* translation,
+void LCodeGen::AddToTranslation(Translation* translation,
LOperand* op,
bool is_tagged,
- bool is_uint32,
- int* object_index_pointer,
- int* dematerialized_index_pointer) {
- if (op == LEnvironment::materialization_marker()) {
- int object_index = (*object_index_pointer)++;
- if (environment->ObjectIsDuplicateAt(object_index)) {
- int dupe_of = environment->ObjectDuplicateOfAt(object_index);
- translation->DuplicateObject(dupe_of);
- return;
- }
- int object_length = environment->ObjectLengthAt(object_index);
- if (environment->ObjectIsArgumentsAt(object_index)) {
- translation->BeginArgumentsObject(object_length);
- } else {
- translation->BeginCapturedObject(object_length);
- }
- int dematerialized_index = *dematerialized_index_pointer;
- int env_offset = environment->translation_size() + dematerialized_index;
- *dematerialized_index_pointer += object_length;
- for (int i = 0; i < object_length; ++i) {
- LOperand* value = environment->values()->at(env_offset + i);
- AddToTranslation(environment,
- translation,
- value,
- environment->HasTaggedValueAt(env_offset + i),
- environment->HasUint32ValueAt(env_offset + i),
- object_index_pointer,
- dematerialized_index_pointer);
- }
- return;
- }
-
+ bool is_uint32) {
if (op->IsStackSlot()) {
if (is_tagged) {
translation->StoreStackSlot(op->index());
@@ -687,13 +661,13 @@ void LCodeGen::DeoptimizeIf(Condition cc,
Address entry =
Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type);
if (entry == NULL) {
- Abort(kBailoutWasNotPrepared);
+ Abort("bailout was not prepared");
return;
}
ASSERT(FLAG_deopt_every_n_times == 0); // Not yet implemented on x64.
- if (info()->ShouldTrapOnDeopt()) {
+ if (FLAG_trap_on_deopt && info()->IsOptimizing()) {
Label done;
if (cc != no_condition) {
__ j(NegateCondition(cc), &done, Label::kNear);
@@ -885,14 +859,6 @@ void LCodeGen::RecordPosition(int position) {
}
-void LCodeGen::RecordAndUpdatePosition(int position) {
- if (position >= 0 && position != old_position_) {
- masm()->positions_recorder()->RecordPosition(position);
- old_position_ = position;
- }
-}
-
-
static const char* LabelType(LLabel* label) {
if (label->is_loop_header()) return " (loop header)";
if (label->is_osr_entry()) return " (OSR entry)";
@@ -1304,7 +1270,7 @@ void LCodeGen::DoMulI(LMulI* instr) {
bool can_overflow =
instr->hydrogen()->CheckFlag(HValue::kCanOverflow);
if (right->IsConstantOperand()) {
- int32_t right_value = ToInteger32(LConstantOperand::cast(right));
+ int right_value = ToInteger32(LConstantOperand::cast(right));
if (right_value == -1) {
__ negl(left);
} else if (right_value == 0) {
@@ -1396,7 +1362,7 @@ void LCodeGen::DoBitI(LBitI* instr) {
ASSERT(left->IsRegister());
if (right->IsConstantOperand()) {
- int32_t right_operand = ToInteger32(LConstantOperand::cast(right));
+ int right_operand = ToInteger32(LConstantOperand::cast(right));
switch (instr->op()) {
case Token::BIT_AND:
__ andl(ToRegister(left), Immediate(right_operand));
@@ -1405,11 +1371,7 @@ void LCodeGen::DoBitI(LBitI* instr) {
__ orl(ToRegister(left), Immediate(right_operand));
break;
case Token::BIT_XOR:
- if (right_operand == int32_t(~0)) {
- __ not_(ToRegister(left));
- } else {
- __ xorl(ToRegister(left), Immediate(right_operand));
- }
+ __ xorl(ToRegister(left), Immediate(right_operand));
break;
default:
UNREACHABLE();
@@ -1480,7 +1442,7 @@ void LCodeGen::DoShiftI(LShiftI* instr) {
break;
}
} else {
- int32_t value = ToInteger32(LConstantOperand::cast(right));
+ int value = ToInteger32(LConstantOperand::cast(right));
uint8_t shift_count = static_cast<uint8_t>(value & 0x1F);
switch (instr->op()) {
case Token::ROR:
@@ -1680,7 +1642,7 @@ void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
static const uint32_t two_byte_seq_type = kSeqStringTag | kTwoByteStringTag;
__ cmpq(value, Immediate(encoding == String::ONE_BYTE_ENCODING
? one_byte_seq_type : two_byte_seq_type));
- __ Check(equal, kUnexpectedStringType);
+ __ Check(equal, "Unexpected string type");
__ pop(value);
}
@@ -1694,6 +1656,13 @@ void LCodeGen::DoSeqStringSetChar(LSeqStringSetChar* instr) {
}
+void LCodeGen::DoBitNotI(LBitNotI* instr) {
+ LOperand* input = instr->value();
+ ASSERT(input->Equals(instr->result()));
+ __ not_(ToRegister(input));
+}
+
+
void LCodeGen::DoThrow(LThrow* instr) {
__ push(ToRegister(instr->value()));
CallRuntime(Runtime::kThrow, 1, instr);
@@ -1900,13 +1869,6 @@ void LCodeGen::EmitBranch(InstrType instr, Condition cc) {
}
-template<class InstrType>
-void LCodeGen::EmitFalseBranch(InstrType instr, Condition cc) {
- int false_block = instr->FalseDestination(chunk_);
- __ j(cc, chunk_->GetAssemblyLabel(false_block));
-}
-
-
void LCodeGen::DoDebugBreak(LDebugBreak* instr) {
__ int3();
}
@@ -2180,28 +2142,6 @@ void LCodeGen::DoCmpObjectEqAndBranch(LCmpObjectEqAndBranch* instr) {
}
-void LCodeGen::DoCmpHoleAndBranch(LCmpHoleAndBranch* instr) {
- if (instr->hydrogen()->representation().IsTagged()) {
- Register input_reg = ToRegister(instr->object());
- __ Cmp(input_reg, factory()->the_hole_value());
- EmitBranch(instr, equal);
- return;
- }
-
- XMMRegister input_reg = ToDoubleRegister(instr->object());
- __ ucomisd(input_reg, input_reg);
- EmitFalseBranch(instr, parity_odd);
-
- __ subq(rsp, Immediate(kDoubleSize));
- __ movsd(MemOperand(rsp, 0), input_reg);
- __ addq(rsp, Immediate(kDoubleSize));
-
- int offset = sizeof(kHoleNanUpper32);
- __ cmpl(MemOperand(rsp, -offset), Immediate(kHoleNanUpper32));
- EmitBranch(instr, equal);
-}
-
-
Condition LCodeGen::EmitIsObject(Register input,
Label* is_not_object,
Label* is_object) {
@@ -2634,7 +2574,7 @@ void LCodeGen::DoReturn(LReturn* instr) {
// The argument count parameter is a smi
__ SmiToInteger32(reg, reg);
Register return_addr_reg = reg.is(rcx) ? rbx : rcx;
- __ PopReturnAddressTo(return_addr_reg);
+ __ pop(return_addr_reg);
__ shl(reg, Immediate(kPointerSizeLog2));
__ addq(rsp, reg);
__ jmp(return_addr_reg);
@@ -2793,6 +2733,111 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
}
+void LCodeGen::EmitLoadFieldOrConstantFunction(Register result,
+ Register object,
+ Handle<Map> type,
+ Handle<String> name,
+ LEnvironment* env) {
+ LookupResult lookup(isolate());
+ type->LookupDescriptor(NULL, *name, &lookup);
+ ASSERT(lookup.IsFound() || lookup.IsCacheable());
+ if (lookup.IsField()) {
+ int index = lookup.GetLocalFieldIndexFromMap(*type);
+ int offset = index * kPointerSize;
+ if (index < 0) {
+ // Negative property indices are in-object properties, indexed
+ // from the end of the fixed part of the object.
+ __ movq(result, FieldOperand(object, offset + type->instance_size()));
+ } else {
+ // Non-negative property indices are in the properties array.
+ __ movq(result, FieldOperand(object, JSObject::kPropertiesOffset));
+ __ movq(result, FieldOperand(result, offset + FixedArray::kHeaderSize));
+ }
+ } else if (lookup.IsConstant()) {
+ Handle<Object> constant(lookup.GetConstantFromMap(*type), isolate());
+ __ LoadObject(result, constant);
+ } else {
+ // Negative lookup.
+ // Check prototypes.
+ Handle<HeapObject> current(HeapObject::cast((*type)->prototype()));
+ Heap* heap = type->GetHeap();
+ while (*current != heap->null_value()) {
+ __ LoadHeapObject(result, current);
+ __ Cmp(FieldOperand(result, HeapObject::kMapOffset),
+ Handle<Map>(current->map()));
+ DeoptimizeIf(not_equal, env);
+ current =
+ Handle<HeapObject>(HeapObject::cast(current->map()->prototype()));
+ }
+ __ LoadRoot(result, Heap::kUndefinedValueRootIndex);
+ }
+}
+
+
+// Check for cases where EmitLoadFieldOrConstantFunction needs to walk the
+// prototype chain, which causes unbounded code generation.
+static bool CompactEmit(SmallMapList* list,
+ Handle<String> name,
+ int i,
+ Isolate* isolate) {
+ Handle<Map> map = list->at(i);
+ LookupResult lookup(isolate);
+ map->LookupDescriptor(NULL, *name, &lookup);
+ return lookup.IsField() || lookup.IsConstant();
+}
+
+
+void LCodeGen::DoLoadNamedFieldPolymorphic(LLoadNamedFieldPolymorphic* instr) {
+ Register object = ToRegister(instr->object());
+ Register result = ToRegister(instr->result());
+
+ int map_count = instr->hydrogen()->types()->length();
+ bool need_generic = instr->hydrogen()->need_generic();
+
+ if (map_count == 0 && !need_generic) {
+ DeoptimizeIf(no_condition, instr->environment());
+ return;
+ }
+ Handle<String> name = instr->hydrogen()->name();
+ Label done;
+ bool all_are_compact = true;
+ for (int i = 0; i < map_count; ++i) {
+ if (!CompactEmit(instr->hydrogen()->types(), name, i, isolate())) {
+ all_are_compact = false;
+ break;
+ }
+ }
+ for (int i = 0; i < map_count; ++i) {
+ bool last = (i == map_count - 1);
+ Handle<Map> map = instr->hydrogen()->types()->at(i);
+ Label check_passed;
+ __ CompareMap(object, map, &check_passed);
+ if (last && !need_generic) {
+ DeoptimizeIf(not_equal, instr->environment());
+ __ bind(&check_passed);
+ EmitLoadFieldOrConstantFunction(
+ result, object, map, name, instr->environment());
+ } else {
+ Label next;
+ bool compact = all_are_compact ? true :
+ CompactEmit(instr->hydrogen()->types(), name, i, isolate());
+ __ j(not_equal, &next, compact ? Label::kNear : Label::kFar);
+ __ bind(&check_passed);
+ EmitLoadFieldOrConstantFunction(
+ result, object, map, name, instr->environment());
+ __ jmp(&done, all_are_compact ? Label::kNear : Label::kFar);
+ __ bind(&next);
+ }
+ }
+ if (need_generic) {
+ __ Move(rcx, name);
+ Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
+ CallCode(ic, RelocInfo::CODE_TARGET, instr);
+ }
+ __ bind(&done);
+}
+
+
void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) {
ASSERT(ToRegister(instr->object()).is(rax));
ASSERT(ToRegister(instr->result()).is(rax));
@@ -2859,8 +2904,8 @@ void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) {
if (instr->length()->IsConstantOperand() &&
instr->index()->IsConstantOperand()) {
- int32_t const_index = ToInteger32(LConstantOperand::cast(instr->index()));
- int32_t const_length = ToInteger32(LConstantOperand::cast(instr->length()));
+ int const_index = ToInteger32(LConstantOperand::cast(instr->index()));
+ int const_length = ToInteger32(LConstantOperand::cast(instr->length()));
int index = (const_length - const_index) + 1;
__ movq(result, Operand(arguments, index * kPointerSize));
} else {
@@ -3047,9 +3092,9 @@ Operand LCodeGen::BuildFastArrayOperand(
Register elements_pointer_reg = ToRegister(elements_pointer);
int shift_size = ElementsKindToShiftSize(elements_kind);
if (key->IsConstantOperand()) {
- int32_t constant_value = ToInteger32(LConstantOperand::cast(key));
+ int constant_value = ToInteger32(LConstantOperand::cast(key));
if (constant_value & 0xF0000000) {
- Abort(kArrayIndexConstantValueTooBig);
+ Abort("array index constant value too big");
}
return Operand(elements_pointer_reg,
((constant_value + additional_index) << shift_size)
@@ -3387,17 +3432,6 @@ void LCodeGen::EmitIntegerMathAbs(LMathAbs* instr) {
}
-void LCodeGen::EmitSmiMathAbs(LMathAbs* instr) {
- Register input_reg = ToRegister(instr->value());
- __ testq(input_reg, input_reg);
- Label is_positive;
- __ j(not_sign, &is_positive, Label::kNear);
- __ neg(input_reg); // Sets flags.
- DeoptimizeIf(negative, instr->environment());
- __ bind(&is_positive);
-}
-
-
void LCodeGen::DoMathAbs(LMathAbs* instr) {
// Class for deferred case.
class DeferredMathAbsTaggedHeapNumber: public LDeferredCode {
@@ -3423,15 +3457,15 @@ void LCodeGen::DoMathAbs(LMathAbs* instr) {
__ andpd(input_reg, scratch);
} else if (r.IsInteger32()) {
EmitIntegerMathAbs(instr);
- } else if (r.IsSmi()) {
- EmitSmiMathAbs(instr);
} else { // Tagged case.
DeferredMathAbsTaggedHeapNumber* deferred =
new(zone()) DeferredMathAbsTaggedHeapNumber(this, instr);
Register input_reg = ToRegister(instr->value());
// Smi check.
__ JumpIfNotSmi(input_reg, deferred->entry());
- EmitSmiMathAbs(instr);
+ __ SmiToInteger32(input_reg, input_reg);
+ EmitIntegerMathAbs(instr);
+ __ Integer32ToSmi(input_reg, input_reg);
__ bind(deferred->exit());
}
}
@@ -4055,7 +4089,7 @@ void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) {
__ AssertZeroExtended(reg);
}
if (instr->index()->IsConstantOperand()) {
- int32_t constant_index =
+ int constant_index =
ToInteger32(LConstantOperand::cast(instr->index()));
if (instr->hydrogen()->length()->representation().IsSmi()) {
__ Cmp(reg, Smi::FromInt(constant_index));
@@ -4072,7 +4106,7 @@ void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) {
} else {
Operand length = ToOperand(instr->length());
if (instr->index()->IsConstantOperand()) {
- int32_t constant_index =
+ int constant_index =
ToInteger32(LConstantOperand::cast(instr->index()));
if (instr->hydrogen()->length()->representation().IsSmi()) {
__ Cmp(length, Smi::FromInt(constant_index));
@@ -4359,7 +4393,7 @@ void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) {
// DoStringCharCodeAt above.
STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue);
if (instr->index()->IsConstantOperand()) {
- int32_t const_index = ToInteger32(LConstantOperand::cast(instr->index()));
+ int const_index = ToInteger32(LConstantOperand::cast(instr->index()));
__ Push(Smi::FromInt(const_index));
} else {
Register index = ToRegister(instr->index());
@@ -4545,6 +4579,36 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
Register reg = ToRegister(instr->result());
Register tmp = ToRegister(instr->temp());
+ bool convert_hole = false;
+ HValue* change_input = instr->hydrogen()->value();
+ if (change_input->IsLoadKeyed()) {
+ HLoadKeyed* load = HLoadKeyed::cast(change_input);
+ convert_hole = load->UsesMustHandleHole();
+ }
+
+ Label no_special_nan_handling;
+ Label done;
+ if (convert_hole) {
+ XMMRegister input_reg = ToDoubleRegister(instr->value());
+ __ ucomisd(input_reg, input_reg);
+ __ j(parity_odd, &no_special_nan_handling);
+ __ subq(rsp, Immediate(kDoubleSize));
+ __ movsd(MemOperand(rsp, 0), input_reg);
+ __ cmpl(MemOperand(rsp, sizeof(kHoleNanLower32)),
+ Immediate(kHoleNanUpper32));
+ Label canonicalize;
+ __ j(not_equal, &canonicalize);
+ __ addq(rsp, Immediate(kDoubleSize));
+ __ Move(reg, factory()->the_hole_value());
+ __ jmp(&done);
+ __ bind(&canonicalize);
+ __ addq(rsp, Immediate(kDoubleSize));
+ __ Set(kScratchRegister, BitCast<uint64_t>(
+ FixedDoubleArray::canonical_not_the_hole_nan_as_double()));
+ __ movq(input_reg, kScratchRegister);
+ }
+
+ __ bind(&no_special_nan_handling);
DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr);
if (FLAG_inline_new) {
__ AllocateHeapNumber(reg, tmp, deferred->entry());
@@ -4553,6 +4617,8 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
}
__ bind(deferred->exit());
__ movsd(FieldOperand(reg, HeapNumber::kValueOffset), input_reg);
+
+ __ bind(&done);
}
@@ -4596,20 +4662,22 @@ void LCodeGen::DoSmiUntag(LSmiUntag* instr) {
void LCodeGen::EmitNumberUntagD(Register input_reg,
XMMRegister result_reg,
- bool can_convert_undefined_to_nan,
+ bool allow_undefined_as_nan,
bool deoptimize_on_minus_zero,
LEnvironment* env,
NumberUntagDMode mode) {
Label load_smi, done;
- if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED) {
+ STATIC_ASSERT(NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE >
+ NUMBER_CANDIDATE_IS_ANY_TAGGED);
+ if (mode >= NUMBER_CANDIDATE_IS_ANY_TAGGED) {
// Smi check.
__ JumpIfSmi(input_reg, &load_smi, Label::kNear);
// Heap number map check.
__ CompareRoot(FieldOperand(input_reg, HeapObject::kMapOffset),
Heap::kHeapNumberMapRootIndex);
- if (!can_convert_undefined_to_nan) {
+ if (!allow_undefined_as_nan) {
DeoptimizeIf(not_equal, env);
} else {
Label heap_number, convert;
@@ -4617,6 +4685,10 @@ void LCodeGen::EmitNumberUntagD(Register input_reg,
// Convert undefined (and hole) to NaN. Compute NaN as 0/0.
__ CompareRoot(input_reg, Heap::kUndefinedValueRootIndex);
+ if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE) {
+ __ j(equal, &convert, Label::kNear);
+ __ CompareRoot(input_reg, Heap::kTheHoleValueRootIndex);
+ }
DeoptimizeIf(not_equal, env);
__ bind(&convert);
@@ -4729,12 +4801,19 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) {
Register input_reg = ToRegister(input);
XMMRegister result_reg = ToDoubleRegister(result);
+ NumberUntagDMode mode = NUMBER_CANDIDATE_IS_ANY_TAGGED;
HValue* value = instr->hydrogen()->value();
- NumberUntagDMode mode = value->representation().IsSmi()
- ? NUMBER_CANDIDATE_IS_SMI : NUMBER_CANDIDATE_IS_ANY_TAGGED;
+ if (value->type().IsSmi()) {
+ mode = NUMBER_CANDIDATE_IS_SMI;
+ } else if (value->IsLoadKeyed()) {
+ HLoadKeyed* load = HLoadKeyed::cast(value);
+ if (load->UsesMustHandleHole()) {
+ mode = NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE;
+ }
+ }
EmitNumberUntagD(input_reg, result_reg,
- instr->hydrogen()->can_convert_undefined_to_nan(),
+ instr->hydrogen()->allow_undefined_as_nan(),
instr->hydrogen()->deoptimize_on_minus_zero(),
instr->environment(),
mode);
@@ -4888,64 +4967,31 @@ void LCodeGen::DoCheckFunction(LCheckFunction* instr) {
}
-void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) {
- {
- PushSafepointRegistersScope scope(this);
- __ push(object);
- CallRuntimeFromDeferred(Runtime::kMigrateInstance, 1, instr);
- __ testq(rax, Immediate(kSmiTagMask));
- }
- DeoptimizeIf(zero, instr->environment());
+void LCodeGen::DoCheckMapCommon(Register reg,
+ Handle<Map> map,
+ LInstruction* instr) {
+ Label success;
+ __ CompareMap(reg, map, &success);
+ DeoptimizeIf(not_equal, instr->environment());
+ __ bind(&success);
}
void LCodeGen::DoCheckMaps(LCheckMaps* instr) {
- class DeferredCheckMaps: public LDeferredCode {
- public:
- DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object)
- : LDeferredCode(codegen), instr_(instr), object_(object) {
- SetExit(check_maps());
- }
- virtual void Generate() {
- codegen()->DoDeferredInstanceMigration(instr_, object_);
- }
- Label* check_maps() { return &check_maps_; }
- virtual LInstruction* instr() { return instr_; }
- private:
- LCheckMaps* instr_;
- Label check_maps_;
- Register object_;
- };
-
if (instr->hydrogen()->CanOmitMapChecks()) return;
-
LOperand* input = instr->value();
ASSERT(input->IsRegister());
Register reg = ToRegister(input);
- SmallMapList* map_set = instr->hydrogen()->map_set();
-
- DeferredCheckMaps* deferred = NULL;
- if (instr->hydrogen()->has_migration_target()) {
- deferred = new(zone()) DeferredCheckMaps(this, instr, reg);
- __ bind(deferred->check_maps());
- }
-
Label success;
+ SmallMapList* map_set = instr->hydrogen()->map_set();
for (int i = 0; i < map_set->length() - 1; i++) {
Handle<Map> map = map_set->at(i);
__ CompareMap(reg, map, &success);
__ j(equal, &success);
}
-
Handle<Map> map = map_set->last();
- __ CompareMap(reg, map, &success);
- if (instr->hydrogen()->has_migration_target()) {
- __ j(not_equal, deferred->entry());
- } else {
- DeoptimizeIf(not_equal, instr->environment());
- }
-
+ DoCheckMapCommon(reg, map, instr);
__ bind(&success);
}
@@ -4999,6 +5045,22 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) {
}
+void LCodeGen::DoCheckPrototypeMaps(LCheckPrototypeMaps* instr) {
+ if (instr->hydrogen()->CanOmitPrototypeChecks()) return;
+ Register reg = ToRegister(instr->temp());
+
+ ZoneList<Handle<JSObject> >* prototypes = instr->prototypes();
+ ZoneList<Handle<Map> >* maps = instr->maps();
+
+ ASSERT(prototypes->length() == maps->length());
+
+ for (int i = 0; i < prototypes->length(); i++) {
+ __ LoadHeapObject(reg, prototypes->at(i));
+ DoCheckMapCommon(reg, maps->at(i), instr);
+ }
+}
+
+
void LCodeGen::DoAllocate(LAllocate* instr) {
class DeferredAllocate: public LDeferredCode {
public:
@@ -5338,8 +5400,6 @@ void LCodeGen::DoDeoptimize(LDeoptimize* instr) {
if (info()->IsStub() && type == Deoptimizer::EAGER) {
type = Deoptimizer::LAZY;
}
-
- Comment(";;; deoptimize: %s", instr->hydrogen()->reason());
DeoptimizeIf(no_condition, instr->environment(), type);
}
diff --git a/chromium/v8/src/x64/lithium-codegen-x64.h b/chromium/v8/src/x64/lithium-codegen-x64.h
index a74ec7982c4..4286d07de74 100644
--- a/chromium/v8/src/x64/lithium-codegen-x64.h
+++ b/chromium/v8/src/x64/lithium-codegen-x64.h
@@ -67,8 +67,7 @@ class LCodeGen BASE_EMBEDDED {
frame_is_built_(false),
safepoints_(info->zone()),
resolver_(this),
- expected_safepoint_kind_(Safepoint::kSimple),
- old_position_(RelocInfo::kNoPosition) {
+ expected_safepoint_kind_(Safepoint::kSimple) {
PopulateDeoptimizationLiteralsWithInlinedFunctions();
}
@@ -103,6 +102,7 @@ class LCodeGen BASE_EMBEDDED {
XMMRegister ToDoubleRegister(LOperand* op) const;
bool IsInteger32Constant(LConstantOperand* op) const;
bool IsSmiConstant(LConstantOperand* op) const;
+ int ToRepresentation(LConstantOperand* op, const Representation& r) const;
int32_t ToInteger32(LConstantOperand* op) const;
Smi* ToSmi(LConstantOperand* op) const;
double ToDouble(LConstantOperand* op) const;
@@ -132,7 +132,8 @@ class LCodeGen BASE_EMBEDDED {
void DoDeferredAllocate(LAllocate* instr);
void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
Label* map_check);
- void DoDeferredInstanceMigration(LCheckMaps* instr, Register object);
+
+ void DoCheckMapCommon(Register reg, Handle<Map> map, LInstruction* instr);
// Parallel move support.
void DoParallelMove(LParallelMove* move);
@@ -178,7 +179,7 @@ class LCodeGen BASE_EMBEDDED {
int GetStackSlotCount() const { return chunk()->spill_slot_count(); }
- void Abort(BailoutReason reason);
+ void Abort(const char* reason);
void FPRINTF_CHECKING Comment(const char* format, ...);
void AddDeferredCode(LDeferredCode* code) { deferred_.Add(code, zone()); }
@@ -236,6 +237,7 @@ class LCodeGen BASE_EMBEDDED {
CallKind call_kind,
RDIState rdi_state);
+
void RecordSafepointWithLazyDeopt(LInstruction* instr,
SafepointMode safepoint_mode,
int argc);
@@ -246,14 +248,10 @@ class LCodeGen BASE_EMBEDDED {
Deoptimizer::BailoutType bailout_type);
void DeoptimizeIf(Condition cc, LEnvironment* environment);
void ApplyCheckIf(Condition cc, LBoundsCheck* check);
-
- void AddToTranslation(LEnvironment* environment,
- Translation* translation,
+ void AddToTranslation(Translation* translation,
LOperand* op,
bool is_tagged,
- bool is_uint32,
- int* object_index_pointer,
- int* dematerialized_index_pointer);
+ bool is_uint32);
void RegisterDependentCodeForEmbeddedMaps(Handle<Code> code);
void PopulateDeoptimizationData(Handle<Code> code);
int DefineDeoptimizationLiteral(Handle<Object> literal);
@@ -270,7 +268,6 @@ class LCodeGen BASE_EMBEDDED {
uint32_t additional_index = 0);
void EmitIntegerMathAbs(LMathAbs* instr);
- void EmitSmiMathAbs(LMathAbs* instr);
// Support for recording safepoint and position information.
void RecordSafepoint(LPointerMap* pointers,
@@ -283,14 +280,11 @@ class LCodeGen BASE_EMBEDDED {
int arguments,
Safepoint::DeoptMode mode);
void RecordPosition(int position);
- void RecordAndUpdatePosition(int position);
static Condition TokenToCondition(Token::Value op, bool is_unsigned);
void EmitGoto(int block);
template<class InstrType>
void EmitBranch(InstrType instr, Condition cc);
- template<class InstrType>
- void EmitFalseBranch(InstrType instr, Condition cc);
void EmitNumberUntagD(
Register input,
XMMRegister result,
@@ -326,6 +320,12 @@ class LCodeGen BASE_EMBEDDED {
// Caller should branch on equal condition.
void EmitIsConstructCall(Register temp);
+ void EmitLoadFieldOrConstantFunction(Register result,
+ Register object,
+ Handle<Map> type,
+ Handle<String> name,
+ LEnvironment* env);
+
// Emits code for pushing either a tagged constant, a (non-double)
// register, or a stack slot operand.
void EmitPushTaggedOperand(LOperand* operand);
@@ -382,8 +382,6 @@ class LCodeGen BASE_EMBEDDED {
Safepoint::Kind expected_safepoint_kind_;
- int old_position_;
-
class PushSafepointRegistersScope BASE_EMBEDDED {
public:
explicit PushSafepointRegistersScope(LCodeGen* codegen)
diff --git a/chromium/v8/src/x64/lithium-x64.cc b/chromium/v8/src/x64/lithium-x64.cc
index c058b0df44a..897af2bca14 100644
--- a/chromium/v8/src/x64/lithium-x64.cc
+++ b/chromium/v8/src/x64/lithium-x64.cc
@@ -443,7 +443,7 @@ LPlatformChunk* LChunkBuilder::Build() {
}
-void LCodeGen::Abort(BailoutReason reason) {
+void LCodeGen::Abort(const char* reason) {
info()->set_bailout_reason(reason);
status_ = ABORTED;
}
@@ -601,10 +601,8 @@ LInstruction* LChunkBuilder::DefineFixedDouble(
LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
HEnvironment* hydrogen_env = current_block_->last_environment();
int argument_index_accumulator = 0;
- ZoneList<HValue*> objects_to_materialize(0, zone());
instr->set_environment(CreateEnvironment(hydrogen_env,
- &argument_index_accumulator,
- &objects_to_materialize));
+ &argument_index_accumulator));
return instr;
}
@@ -656,7 +654,7 @@ LUnallocated* LChunkBuilder::TempRegister() {
new(zone()) LUnallocated(LUnallocated::MUST_HAVE_REGISTER);
int vreg = allocator_->GetVirtualRegister();
if (!allocator_->AllocationOk()) {
- Abort(kOutOfVirtualRegistersWhileTryingToAllocateTempRegister);
+ Abort("Out of virtual registers while trying to allocate temp register.");
vreg = 0;
}
operand->set_virtual_register(vreg);
@@ -884,7 +882,6 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
}
#endif
- instr->set_position(position_);
if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) {
instr = AssignPointerMap(instr);
}
@@ -900,13 +897,11 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
LEnvironment* LChunkBuilder::CreateEnvironment(
HEnvironment* hydrogen_env,
- int* argument_index_accumulator,
- ZoneList<HValue*>* objects_to_materialize) {
+ int* argument_index_accumulator) {
if (hydrogen_env == NULL) return NULL;
- LEnvironment* outer = CreateEnvironment(hydrogen_env->outer(),
- argument_index_accumulator,
- objects_to_materialize);
+ LEnvironment* outer =
+ CreateEnvironment(hydrogen_env->outer(), argument_index_accumulator);
BailoutId ast_id = hydrogen_env->ast_id();
ASSERT(!ast_id.IsNone() ||
hydrogen_env->frame_type() != JS_FUNCTION);
@@ -921,16 +916,16 @@ LEnvironment* LChunkBuilder::CreateEnvironment(
outer,
hydrogen_env->entry(),
zone());
+ bool needs_arguments_object_materialization = false;
int argument_index = *argument_index_accumulator;
- int object_index = objects_to_materialize->length();
for (int i = 0; i < hydrogen_env->length(); ++i) {
if (hydrogen_env->is_special_index(i)) continue;
- LOperand* op;
HValue* value = hydrogen_env->values()->at(i);
- if (value->IsArgumentsObject() || value->IsCapturedObject()) {
- objects_to_materialize->Add(value, zone());
- op = LEnvironment::materialization_marker();
+ LOperand* op = NULL;
+ if (value->IsArgumentsObject()) {
+ needs_arguments_object_materialization = true;
+ op = NULL;
} else if (value->IsPushArgument()) {
op = new(zone()) LArgument(argument_index++);
} else {
@@ -941,33 +936,15 @@ LEnvironment* LChunkBuilder::CreateEnvironment(
value->CheckFlag(HInstruction::kUint32));
}
- for (int i = object_index; i < objects_to_materialize->length(); ++i) {
- HValue* object_to_materialize = objects_to_materialize->at(i);
- int previously_materialized_object = -1;
- for (int prev = 0; prev < i; ++prev) {
- if (objects_to_materialize->at(prev) == objects_to_materialize->at(i)) {
- previously_materialized_object = prev;
- break;
- }
- }
- int length = object_to_materialize->OperandCount();
- bool is_arguments = object_to_materialize->IsArgumentsObject();
- if (previously_materialized_object >= 0) {
- result->AddDuplicateObject(previously_materialized_object);
- continue;
- } else {
- result->AddNewObject(is_arguments ? length - 1 : length, is_arguments);
- }
- for (int i = is_arguments ? 1 : 0; i < length; ++i) {
- LOperand* op;
- HValue* value = object_to_materialize->OperandAt(i);
- if (value->IsArgumentsObject() || value->IsCapturedObject()) {
- objects_to_materialize->Add(value, zone());
- op = LEnvironment::materialization_marker();
- } else {
- ASSERT(!value->IsPushArgument());
- op = UseAny(value);
- }
+ if (needs_arguments_object_materialization) {
+ HArgumentsObject* arguments = hydrogen_env->entry() == NULL
+ ? graph()->GetArgumentsObject()
+ : hydrogen_env->entry()->arguments_object();
+ ASSERT(arguments->IsLinked());
+ for (int i = 1; i < arguments->arguments_count(); ++i) {
+ HValue* value = arguments->arguments_values()->at(i);
+ ASSERT(!value->IsArgumentsObject() && !value->IsPushArgument());
+ LOperand* op = UseAny(value);
result->AddValue(op,
value->representation(),
value->CheckFlag(HInstruction::kUint32));
@@ -1344,6 +1321,16 @@ LInstruction* LChunkBuilder::DoBitwise(HBitwise* instr) {
}
+LInstruction* LChunkBuilder::DoBitNot(HBitNot* instr) {
+ ASSERT(instr->value()->representation().IsInteger32());
+ ASSERT(instr->representation().IsInteger32());
+ if (instr->HasNoUses()) return NULL;
+ LOperand* input = UseRegisterAtStart(instr->value());
+ LBitNotI* result = new(zone()) LBitNotI(input);
+ return DefineSameAsFirst(result);
+}
+
+
LInstruction* LChunkBuilder::DoDiv(HDiv* instr) {
if (instr->representation().IsDouble()) {
return DoArithmeticD(Token::DIV, instr);
@@ -1612,8 +1599,9 @@ LInstruction* LChunkBuilder::DoCompareNumericAndBranch(
HCompareNumericAndBranch* instr) {
Representation r = instr->representation();
if (r.IsSmiOrInteger32()) {
- ASSERT(instr->left()->representation().Equals(r));
- ASSERT(instr->right()->representation().Equals(r));
+ ASSERT(instr->left()->representation().IsSmiOrInteger32());
+ ASSERT(instr->left()->representation().Equals(
+ instr->right()->representation()));
LOperand* left = UseRegisterOrConstantAtStart(instr->left());
LOperand* right = UseOrConstantAtStart(instr->right());
return new(zone()) LCompareNumericAndBranch(left, right);
@@ -1643,13 +1631,6 @@ LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
}
-LInstruction* LChunkBuilder::DoCompareHoleAndBranch(
- HCompareHoleAndBranch* instr) {
- LOperand* object = UseRegisterAtStart(instr->object());
- return new(zone()) LCmpHoleAndBranch(object);
-}
-
-
LInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
ASSERT(instr->value()->representation().IsTagged());
return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value()));
@@ -1764,6 +1745,17 @@ LInstruction* LChunkBuilder::DoSeqStringSetChar(HSeqStringSetChar* instr) {
}
+LInstruction* LChunkBuilder::DoNumericConstraint(HNumericConstraint* instr) {
+ return NULL;
+}
+
+
+LInstruction* LChunkBuilder::DoInductionVariableAnnotation(
+ HInductionVariableAnnotation* instr) {
+ return NULL;
+}
+
+
LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
LOperand* value = UseRegisterOrConstantAtStart(instr->index());
LOperand* length = Use(instr->length());
@@ -1928,6 +1920,15 @@ LInstruction* LChunkBuilder::DoCheckInstanceType(HCheckInstanceType* instr) {
}
+LInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) {
+ LUnallocated* temp = NULL;
+ if (!instr->CanOmitPrototypeChecks()) temp = TempRegister();
+ LCheckPrototypeMaps* result = new(zone()) LCheckPrototypeMaps(temp);
+ if (instr->CanOmitPrototypeChecks()) return result;
+ return AssignEnvironment(result);
+}
+
+
LInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) {
LOperand* value = UseRegisterAtStart(instr->value());
return AssignEnvironment(new(zone()) LCheckFunction(value));
@@ -1936,16 +1937,10 @@ LInstruction* LChunkBuilder::DoCheckFunction(HCheckFunction* instr) {
LInstruction* LChunkBuilder::DoCheckMaps(HCheckMaps* instr) {
LOperand* value = NULL;
- if (!instr->CanOmitMapChecks()) {
- value = UseRegisterAtStart(instr->value());
- if (instr->has_migration_target()) info()->MarkAsDeferredCalling();
- }
+ if (!instr->CanOmitMapChecks()) value = UseRegisterAtStart(instr->value());
LCheckMaps* result = new(zone()) LCheckMaps(value);
- if (!instr->CanOmitMapChecks()) {
- AssignEnvironment(result);
- if (instr->has_migration_target()) return AssignPointerMap(result);
- }
- return result;
+ if (instr->CanOmitMapChecks()) return result;
+ return AssignEnvironment(result);
}
@@ -2065,6 +2060,23 @@ LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
}
+LInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic(
+ HLoadNamedFieldPolymorphic* instr) {
+ ASSERT(instr->representation().IsTagged());
+ if (instr->need_generic()) {
+ LOperand* obj = UseFixed(instr->object(), rax);
+ LLoadNamedFieldPolymorphic* result =
+ new(zone()) LLoadNamedFieldPolymorphic(obj);
+ return MarkAsCall(DefineFixed(result, rax), instr);
+ } else {
+ LOperand* obj = UseRegisterAtStart(instr->object());
+ LLoadNamedFieldPolymorphic* result =
+ new(zone()) LLoadNamedFieldPolymorphic(obj);
+ return AssignEnvironment(DefineAsRegister(result));
+ }
+}
+
+
LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
LOperand* object = UseFixed(instr->object(), rax);
LLoadNamedGeneric* result = new(zone()) LLoadNamedGeneric(object);
@@ -2221,7 +2233,7 @@ LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
bool is_external_location = instr->access().IsExternalMemory() &&
instr->access().offset() == 0;
bool needs_write_barrier = instr->NeedsWriteBarrier();
- bool needs_write_barrier_for_map = instr->has_transition() &&
+ bool needs_write_barrier_for_map = !instr->transition().is_null() &&
instr->NeedsWriteBarrierForMap();
LOperand* obj;
@@ -2356,7 +2368,7 @@ LInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
int spill_index = chunk()->GetNextSpillIndex(false); // Not double-width.
if (spill_index > LUnallocated::kMaxFixedSlotIndex) {
- Abort(kTooManySpillSlotsNeededForOSR);
+ Abort("Too many spill slots needed for OSR");
spill_index = 0;
}
return DefineAsSpilled(new(zone()) LUnknownOSRValue, spill_index);
@@ -2378,12 +2390,6 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
}
-LInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
- // There are no real uses of a captured object.
- return NULL;
-}
-
-
LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
info()->MarkAsRequiresFrame();
LOperand* args = UseRegister(instr->arguments());
diff --git a/chromium/v8/src/x64/lithium-x64.h b/chromium/v8/src/x64/lithium-x64.h
index 77bebe64bd7..31e54370e0a 100644
--- a/chromium/v8/src/x64/lithium-x64.h
+++ b/chromium/v8/src/x64/lithium-x64.h
@@ -50,6 +50,7 @@ class LCodeGen;
V(ArithmeticD) \
V(ArithmeticT) \
V(BitI) \
+ V(BitNotI) \
V(BoundsCheck) \
V(Branch) \
V(CallConstantFunction) \
@@ -67,6 +68,7 @@ class LCodeGen;
V(CheckMaps) \
V(CheckMapValue) \
V(CheckNonSmi) \
+ V(CheckPrototypeMaps) \
V(CheckSmi) \
V(ClampDToUint8) \
V(ClampIToUint8) \
@@ -74,7 +76,6 @@ class LCodeGen;
V(ClassOfTestAndBranch) \
V(CompareNumericAndBranch) \
V(CmpObjectEqAndBranch) \
- V(CmpHoleAndBranch) \
V(CmpMapAndBranch) \
V(CmpT) \
V(ConstantD) \
@@ -127,6 +128,7 @@ class LCodeGen;
V(LoadKeyed) \
V(LoadKeyedGeneric) \
V(LoadNamedField) \
+ V(LoadNamedFieldPolymorphic) \
V(LoadNamedGeneric) \
V(MapEnumLength) \
V(MathAbs) \
@@ -205,11 +207,9 @@ class LCodeGen;
class LInstruction: public ZoneObject {
public:
LInstruction()
- : environment_(NULL),
- hydrogen_value_(NULL),
- bit_field_(IsCallBits::encode(false)) {
- set_position(RelocInfo::kNoPosition);
- }
+ : environment_(NULL),
+ hydrogen_value_(NULL),
+ is_call_(false) { }
virtual ~LInstruction() { }
@@ -249,30 +249,20 @@ class LInstruction: public ZoneObject {
LPointerMap* pointer_map() const { return pointer_map_.get(); }
bool HasPointerMap() const { return pointer_map_.is_set(); }
- // The 31 bits PositionBits is used to store the int position value. And the
- // position value may be RelocInfo::kNoPosition (-1). The accessor always
- // +1/-1 so that the encoded value of position in bit_field_ is always >= 0
- // and can fit into the 31 bits PositionBits.
- void set_position(int pos) {
- bit_field_ = PositionBits::update(bit_field_, pos + 1);
- }
- int position() { return PositionBits::decode(bit_field_) - 1; }
-
void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
HValue* hydrogen_value() const { return hydrogen_value_; }
- void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); }
- bool IsCall() const { return IsCallBits::decode(bit_field_); }
+ void MarkAsCall() { is_call_ = true; }
// Interface to the register allocator and iterators.
- bool ClobbersTemps() const { return IsCall(); }
- bool ClobbersRegisters() const { return IsCall(); }
- bool ClobbersDoubleRegisters() const { return IsCall(); }
+ bool ClobbersTemps() const { return is_call_; }
+ bool ClobbersRegisters() const { return is_call_; }
+ bool ClobbersDoubleRegisters() const { return is_call_; }
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) { }
// Interface to the register allocator and iterators.
- bool IsMarkedAsCall() const { return IsCall(); }
+ bool IsMarkedAsCall() const { return is_call_; }
virtual bool HasResult() const = 0;
virtual LOperand* result() const = 0;
@@ -296,13 +286,10 @@ class LInstruction: public ZoneObject {
virtual int TempCount() = 0;
virtual LOperand* TempAt(int i) = 0;
- class IsCallBits: public BitField<bool, 0, 1> {};
- class PositionBits: public BitField<int, 1, 31> {};
-
LEnvironment* environment_;
SetOncePointer<LPointerMap> pointer_map_;
HValue* hydrogen_value_;
- int bit_field_;
+ bool is_call_;
};
@@ -838,20 +825,8 @@ class LCmpObjectEqAndBranch: public LControlInstruction<2, 0> {
LOperand* left() { return inputs_[0]; }
LOperand* right() { return inputs_[1]; }
- DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch, "cmp-object-eq-and-branch")
-};
-
-
-class LCmpHoleAndBranch: public LControlInstruction<1, 0> {
- public:
- explicit LCmpHoleAndBranch(LOperand* object) {
- inputs_[0] = object;
- }
-
- LOperand* object() { return inputs_[0]; }
-
- DECLARE_CONCRETE_INSTRUCTION(CmpHoleAndBranch, "cmp-hole-and-branch")
- DECLARE_HYDROGEN_ACCESSOR(CompareHoleAndBranch)
+ DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch,
+ "cmp-object-eq-and-branch")
};
@@ -1337,6 +1312,18 @@ class LThrow: public LTemplateInstruction<0, 1, 0> {
};
+class LBitNotI: public LTemplateInstruction<1, 1, 0> {
+ public:
+ explicit LBitNotI(LOperand* value) {
+ inputs_[0] = value;
+ }
+
+ LOperand* value() { return inputs_[0]; }
+
+ DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i")
+};
+
+
class LAddI: public LTemplateInstruction<1, 2, 0> {
public:
LAddI(LOperand* left, LOperand* right) {
@@ -1478,6 +1465,19 @@ class LLoadNamedField: public LTemplateInstruction<1, 1, 0> {
};
+class LLoadNamedFieldPolymorphic: public LTemplateInstruction<1, 1, 0> {
+ public:
+ explicit LLoadNamedFieldPolymorphic(LOperand* object) {
+ inputs_[0] = object;
+ }
+
+ DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field-polymorphic")
+ DECLARE_HYDROGEN_ACCESSOR(LoadNamedFieldPolymorphic)
+
+ LOperand* object() { return inputs_[0]; }
+};
+
+
class LLoadNamedGeneric: public LTemplateInstruction<1, 1, 0> {
public:
explicit LLoadNamedGeneric(LOperand* object) {
@@ -2066,7 +2066,7 @@ class LStoreNamedField: public LTemplateInstruction<0, 2, 1> {
virtual void PrintDataTo(StringStream* stream);
- Handle<Map> transition() const { return hydrogen()->transition_map(); }
+ Handle<Map> transition() const { return hydrogen()->transition(); }
Representation representation() const {
return hydrogen()->field_representation();
}
@@ -2262,6 +2262,24 @@ class LCheckMaps: public LTemplateInstruction<0, 1, 0> {
};
+class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 1> {
+ public:
+ explicit LCheckPrototypeMaps(LOperand* temp) {
+ temps_[0] = temp;
+ }
+
+ LOperand* temp() { return temps_[0]; }
+
+ DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps")
+ DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps)
+
+ ZoneList<Handle<JSObject> >* prototypes() const {
+ return hydrogen()->prototypes();
+ }
+ ZoneList<Handle<Map> >* maps() const { return hydrogen()->maps(); }
+};
+
+
class LCheckSmi: public LTemplateInstruction<1, 1, 0> {
public:
explicit LCheckSmi(LOperand* value) {
@@ -2555,7 +2573,7 @@ class LChunkBuilder BASE_EMBEDDED {
bool is_done() const { return status_ == DONE; }
bool is_aborted() const { return status_ == ABORTED; }
- void Abort(BailoutReason reason);
+ void Abort(const char* reason);
// Methods for getting operands for Use / Define / Temp.
LUnallocated* ToUnallocated(Register reg);
@@ -2641,8 +2659,7 @@ class LChunkBuilder BASE_EMBEDDED {
CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
- int* argument_index_accumulator,
- ZoneList<HValue*>* objects_to_materialize);
+ int* argument_index_accumulator);
void VisitInstruction(HInstruction* current);
diff --git a/chromium/v8/src/x64/macro-assembler-x64.cc b/chromium/v8/src/x64/macro-assembler-x64.cc
index 9c9b1620e58..13d7ddaa685 100644
--- a/chromium/v8/src/x64/macro-assembler-x64.cc
+++ b/chromium/v8/src/x64/macro-assembler-x64.cc
@@ -155,7 +155,7 @@ int MacroAssembler::LoadAddressSize(ExternalReference source) {
}
}
// Size of movq(destination, src);
- return Assembler::kMoveAddressIntoScratchRegisterInstructionLength;
+ return 10;
}
@@ -449,8 +449,8 @@ void MacroAssembler::RecordWrite(Register object,
}
-void MacroAssembler::Assert(Condition cc, BailoutReason reason) {
- if (emit_debug_code()) Check(cc, reason);
+void MacroAssembler::Assert(Condition cc, const char* msg) {
+ if (emit_debug_code()) Check(cc, msg);
}
@@ -466,16 +466,16 @@ void MacroAssembler::AssertFastElements(Register elements) {
CompareRoot(FieldOperand(elements, HeapObject::kMapOffset),
Heap::kFixedCOWArrayMapRootIndex);
j(equal, &ok, Label::kNear);
- Abort(kJSObjectWithFastElementsMapHasSlowElements);
+ Abort("JSObject with fast elements map has slow elements");
bind(&ok);
}
}
-void MacroAssembler::Check(Condition cc, BailoutReason reason) {
+void MacroAssembler::Check(Condition cc, const char* msg) {
Label L;
j(cc, &L, Label::kNear);
- Abort(reason);
+ Abort(msg);
// Control will not return here.
bind(&L);
}
@@ -508,13 +508,12 @@ void MacroAssembler::NegativeZeroTest(Register result,
}
-void MacroAssembler::Abort(BailoutReason reason) {
+void MacroAssembler::Abort(const char* msg) {
// We want to pass the msg string like a smi to avoid GC
// problems, however msg is not guaranteed to be aligned
// properly. Instead, we pass an aligned pointer that is
// a proper v8 smi, but also pass the alignment difference
// from the real pointer as a smi.
- const char* msg = GetBailoutReason(reason);
intptr_t p1 = reinterpret_cast<intptr_t>(msg);
intptr_t p0 = (p1 & ~kSmiTagMask) + kSmiTag;
// Note: p0 might not be a valid Smi _value_, but it has a valid Smi tag.
@@ -839,7 +838,7 @@ void MacroAssembler::CallApiFunctionAndReturn(Address function_address,
CompareRoot(return_value, Heap::kNullValueRootIndex);
j(equal, &ok, Label::kNear);
- Abort(kAPICallReturnedInvalidObject);
+ Abort("API call returned invalid object");
bind(&ok);
#endif
@@ -1039,7 +1038,7 @@ void MacroAssembler::LoadSmiConstant(Register dst, Smi* source) {
RelocInfo::NONE64);
cmpq(dst, kSmiConstantRegister);
if (allow_stub_calls()) {
- Assert(equal, kUninitializedKSmiConstantRegister);
+ Assert(equal, "Uninitialized kSmiConstantRegister");
} else {
Label ok;
j(equal, &ok, Label::kNear);
@@ -1107,7 +1106,7 @@ void MacroAssembler::Integer32ToSmiField(const Operand& dst, Register src) {
Label ok;
j(zero, &ok, Label::kNear);
if (allow_stub_calls()) {
- Abort(kInteger32ToSmiFieldWritingToNonSmiLocation);
+ Abort("Integer32ToSmiField writing to non-smi location");
} else {
int3();
}
@@ -1690,12 +1689,12 @@ void MacroAssembler::SmiAdd(Register dst,
if (emit_debug_code()) {
movq(kScratchRegister, src1);
addq(kScratchRegister, src2);
- Check(no_overflow, kSmiAdditionOverflow);
+ Check(no_overflow, "Smi addition overflow");
}
lea(dst, Operand(src1, src2, times_1, 0));
} else {
addq(dst, src2);
- Assert(no_overflow, kSmiAdditionOverflow);
+ Assert(no_overflow, "Smi addition overflow");
}
}
@@ -1727,7 +1726,7 @@ void MacroAssembler::SmiSub(Register dst, Register src1, Register src2) {
movq(dst, src1);
}
subq(dst, src2);
- Assert(no_overflow, kSmiSubtractionOverflow);
+ Assert(no_overflow, "Smi subtraction overflow");
}
@@ -1759,7 +1758,7 @@ void MacroAssembler::SmiSub(Register dst,
movq(dst, src1);
}
subq(dst, src2);
- Assert(no_overflow, kSmiSubtractionOverflow);
+ Assert(no_overflow, "Smi subtraction overflow");
}
@@ -2156,7 +2155,7 @@ void MacroAssembler::SelectNonSmi(Register dst,
#ifdef DEBUG
if (allow_stub_calls()) { // Check contains a stub call.
Condition not_both_smis = NegateCondition(CheckBothSmi(src1, src2));
- Check(not_both_smis, kBothRegistersWereSmisInSelectNonSmi);
+ Check(not_both_smis, "Both registers were smis in SelectNonSmi.");
}
#endif
STATIC_ASSERT(kSmiTag == 0);
@@ -2511,8 +2510,8 @@ void MacroAssembler::Jump(Handle<Code> code_object, RelocInfo::Mode rmode) {
int MacroAssembler::CallSize(ExternalReference ext) {
// Opcode for call kScratchRegister is: Rex.B FF D4 (three bytes).
- return LoadAddressSize(ext) +
- Assembler::kCallScratchRegisterInstructionLength;
+ const int kCallInstructionSize = 3;
+ return LoadAddressSize(ext) + kCallInstructionSize;
}
@@ -2799,9 +2798,9 @@ void MacroAssembler::Ret(int bytes_dropped, Register scratch) {
if (is_uint16(bytes_dropped)) {
ret(bytes_dropped);
} else {
- PopReturnAddressTo(scratch);
+ pop(scratch);
addq(rsp, Immediate(bytes_dropped));
- PushReturnAddressFrom(scratch);
+ push(scratch);
ret(0);
}
}
@@ -2985,7 +2984,7 @@ void MacroAssembler::LoadUint32(XMMRegister dst,
XMMRegister scratch) {
if (FLAG_debug_code) {
cmpq(src, Immediate(0xffffffff));
- Assert(below_equal, kInputGPRIsExpectedToHaveUpper32Cleared);
+ Assert(below_equal, "input GPR is expected to have upper32 cleared");
}
cvtqsi2sd(dst, src);
}
@@ -3034,7 +3033,7 @@ void MacroAssembler::AssertNumber(Register object) {
j(is_smi, &ok, Label::kNear);
Cmp(FieldOperand(object, HeapObject::kMapOffset),
isolate()->factory()->heap_number_map());
- Check(equal, kOperandIsNotANumber);
+ Check(equal, "Operand is not a number");
bind(&ok);
}
}
@@ -3043,7 +3042,7 @@ void MacroAssembler::AssertNumber(Register object) {
void MacroAssembler::AssertNotSmi(Register object) {
if (emit_debug_code()) {
Condition is_smi = CheckSmi(object);
- Check(NegateCondition(is_smi), kOperandIsASmi);
+ Check(NegateCondition(is_smi), "Operand is a smi");
}
}
@@ -3051,7 +3050,7 @@ void MacroAssembler::AssertNotSmi(Register object) {
void MacroAssembler::AssertSmi(Register object) {
if (emit_debug_code()) {
Condition is_smi = CheckSmi(object);
- Check(is_smi, kOperandIsNotASmi);
+ Check(is_smi, "Operand is not a smi");
}
}
@@ -3059,7 +3058,7 @@ void MacroAssembler::AssertSmi(Register object) {
void MacroAssembler::AssertSmi(const Operand& object) {
if (emit_debug_code()) {
Condition is_smi = CheckSmi(object);
- Check(is_smi, kOperandIsNotASmi);
+ Check(is_smi, "Operand is not a smi");
}
}
@@ -3069,7 +3068,7 @@ void MacroAssembler::AssertZeroExtended(Register int32_register) {
ASSERT(!int32_register.is(kScratchRegister));
movq(kScratchRegister, 0x100000000l, RelocInfo::NONE64);
cmpq(kScratchRegister, int32_register);
- Check(above_equal, k32BitValueInRegisterIsNotZeroExtended);
+ Check(above_equal, "32 bit value in register is not zero-extended");
}
}
@@ -3077,12 +3076,12 @@ void MacroAssembler::AssertZeroExtended(Register int32_register) {
void MacroAssembler::AssertString(Register object) {
if (emit_debug_code()) {
testb(object, Immediate(kSmiTagMask));
- Check(not_equal, kOperandIsASmiAndNotAString);
+ Check(not_equal, "Operand is a smi and not a string");
push(object);
movq(object, FieldOperand(object, HeapObject::kMapOffset));
CmpInstanceType(object, FIRST_NONSTRING_TYPE);
pop(object);
- Check(below, kOperandIsNotAString);
+ Check(below, "Operand is not a string");
}
}
@@ -3090,24 +3089,24 @@ void MacroAssembler::AssertString(Register object) {
void MacroAssembler::AssertName(Register object) {
if (emit_debug_code()) {
testb(object, Immediate(kSmiTagMask));
- Check(not_equal, kOperandIsASmiAndNotAName);
+ Check(not_equal, "Operand is a smi and not a name");
push(object);
movq(object, FieldOperand(object, HeapObject::kMapOffset));
CmpInstanceType(object, LAST_NAME_TYPE);
pop(object);
- Check(below_equal, kOperandIsNotAName);
+ Check(below_equal, "Operand is not a name");
}
}
void MacroAssembler::AssertRootValue(Register src,
Heap::RootListIndex root_value_index,
- BailoutReason reason) {
+ const char* message) {
if (emit_debug_code()) {
ASSERT(!src.is(kScratchRegister));
LoadRoot(kScratchRegister, root_value_index);
cmpq(src, kScratchRegister);
- Check(equal, reason);
+ Check(equal, message);
}
}
@@ -3458,7 +3457,7 @@ void MacroAssembler::EnterFrame(StackFrame::Type type) {
isolate()->factory()->undefined_value(),
RelocInfo::EMBEDDED_OBJECT);
cmpq(Operand(rsp, 0), kScratchRegister);
- Check(not_equal, kCodeObjectNotProperlyPatched);
+ Check(not_equal, "code object not properly patched");
}
}
@@ -3467,7 +3466,7 @@ void MacroAssembler::LeaveFrame(StackFrame::Type type) {
if (emit_debug_code()) {
Move(kScratchRegister, Smi::FromInt(type));
cmpq(Operand(rbp, StandardFrameConstants::kMarkerOffset), kScratchRegister);
- Check(equal, kStackFrameTypesMustMatch);
+ Check(equal, "stack frame types must match");
}
movq(rsp, rbp);
pop(rbp);
@@ -3568,7 +3567,8 @@ void MacroAssembler::LeaveExitFrame(bool save_doubles) {
// from the caller stack.
lea(rsp, Operand(r15, 1 * kPointerSize));
- PushReturnAddressFrom(rcx);
+ // Push the return address to get ready to return.
+ push(rcx);
LeaveExitFrameEpilogue();
}
@@ -3612,7 +3612,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
// When generating debug code, make sure the lexical context is set.
if (emit_debug_code()) {
cmpq(scratch, Immediate(0));
- Check(not_equal, kWeShouldNotHaveAnEmptyLexicalContext);
+ Check(not_equal, "we should not have an empty lexical context");
}
// Load the native context of the current context.
int offset =
@@ -3624,7 +3624,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
if (emit_debug_code()) {
Cmp(FieldOperand(scratch, HeapObject::kMapOffset),
isolate()->factory()->native_context_map());
- Check(equal, kJSGlobalObjectNativeContextShouldBeANativeContext);
+ Check(equal, "JSGlobalObject::native_context should be a native context.");
}
// Check if both contexts are the same.
@@ -3643,12 +3643,12 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
movq(holder_reg,
FieldOperand(holder_reg, JSGlobalProxy::kNativeContextOffset));
CompareRoot(holder_reg, Heap::kNullValueRootIndex);
- Check(not_equal, kJSGlobalProxyContextShouldNotBeNull);
+ Check(not_equal, "JSGlobalProxy::context() should not be null.");
// Read the first word and compare to native_context_map(),
movq(holder_reg, FieldOperand(holder_reg, HeapObject::kMapOffset));
CompareRoot(holder_reg, Heap::kNativeContextMapRootIndex);
- Check(equal, kJSGlobalObjectNativeContextShouldBeANativeContext);
+ Check(equal, "JSGlobalObject::native_context should be a native context.");
pop(holder_reg);
}
@@ -3794,7 +3794,7 @@ void MacroAssembler::LoadAllocationTopHelper(Register result,
// Assert that result actually contains top on entry.
Operand top_operand = ExternalOperand(allocation_top);
cmpq(result, top_operand);
- Check(equal, kUnexpectedAllocationTop);
+ Check(equal, "Unexpected allocation top");
#endif
return;
}
@@ -3815,7 +3815,7 @@ void MacroAssembler::UpdateAllocationTopHelper(Register result_end,
AllocationFlags flags) {
if (emit_debug_code()) {
testq(result_end, Immediate(kObjectAlignmentMask));
- Check(zero, kUnalignedAllocationInNewSpace);
+ Check(zero, "Unaligned allocation in new space");
}
ExternalReference allocation_top =
@@ -3862,7 +3862,7 @@ void MacroAssembler::Allocate(int object_size,
// always safe because the limit of the heap is always aligned.
if (((flags & DOUBLE_ALIGNMENT) != 0) && FLAG_debug_code) {
testq(result, Immediate(kDoubleAlignmentMask));
- Check(zero, kAllocationIsNotDoubleAligned);
+ Check(zero, "Allocation is not double aligned");
}
// Calculate new top and bail out if new space is exhausted.
@@ -3941,7 +3941,7 @@ void MacroAssembler::Allocate(Register object_size,
// always safe because the limit of the heap is always aligned.
if (((flags & DOUBLE_ALIGNMENT) != 0) && FLAG_debug_code) {
testq(result, Immediate(kDoubleAlignmentMask));
- Check(zero, kAllocationIsNotDoubleAligned);
+ Check(zero, "Allocation is not double aligned");
}
// Calculate new top and bail out if new space is exhausted.
@@ -3975,7 +3975,7 @@ void MacroAssembler::UndoAllocationInNewSpace(Register object) {
Operand top_operand = ExternalOperand(new_space_allocation_top);
#ifdef DEBUG
cmpq(object, top_operand);
- Check(below, kUndoAllocationOfNonAllocatedMemory);
+ Check(below, "Undo allocation of non allocated memory");
#endif
movq(top_operand, object);
}
@@ -4165,7 +4165,7 @@ void MacroAssembler::CopyBytes(Register destination,
ASSERT(min_length >= 0);
if (emit_debug_code()) {
cmpl(length, Immediate(min_length));
- Assert(greater_equal, kInvalidMinLength);
+ Assert(greater_equal, "Invalid min_length");
}
Label loop, done, short_string, short_loop;
@@ -4249,7 +4249,7 @@ void MacroAssembler::LoadContext(Register dst, int context_chain_length) {
if (emit_debug_code()) {
CompareRoot(FieldOperand(dst, HeapObject::kMapOffset),
Heap::kWithContextMapRootIndex);
- Check(not_equal, kVariableResolvedToWithContext);
+ Check(not_equal, "Variable resolved to with context.");
}
}
@@ -4340,7 +4340,7 @@ void MacroAssembler::LoadGlobalFunctionInitialMap(Register function,
CheckMap(map, isolate()->factory()->meta_map(), &fail, DO_SMI_CHECK);
jmp(&ok);
bind(&fail);
- Abort(kGlobalFunctionsMustHaveInitialMap);
+ Abort("Global functions must have initial map");
bind(&ok);
}
}
diff --git a/chromium/v8/src/x64/macro-assembler-x64.h b/chromium/v8/src/x64/macro-assembler-x64.h
index 61abc206e10..e611c8ae279 100644
--- a/chromium/v8/src/x64/macro-assembler-x64.h
+++ b/chromium/v8/src/x64/macro-assembler-x64.h
@@ -823,10 +823,6 @@ class MacroAssembler: public Assembler {
void Drop(int stack_elements);
void Call(Label* target) { call(target); }
- void Push(Register src) { push(src); }
- void Pop(Register dst) { pop(dst); }
- void PushReturnAddressFrom(Register src) { push(src); }
- void PopReturnAddressTo(Register dst) { pop(dst); }
// Control Flow
void Jump(Address destination, RelocInfo::Mode rmode);
@@ -841,7 +837,7 @@ class MacroAssembler: public Assembler {
// The size of the code generated for different call instructions.
int CallSize(Address destination, RelocInfo::Mode rmode) {
- return kCallSequenceLength;
+ return kCallInstructionLength;
}
int CallSize(ExternalReference ext);
int CallSize(Handle<Code> code_object) {
@@ -1006,7 +1002,7 @@ class MacroAssembler: public Assembler {
// enabled via --debug-code.
void AssertRootValue(Register src,
Heap::RootListIndex root_value_index,
- BailoutReason reason);
+ const char* message);
// ---------------------------------------------------------------------------
// Exception handling
@@ -1323,15 +1319,15 @@ class MacroAssembler: public Assembler {
// Calls Abort(msg) if the condition cc is not satisfied.
// Use --debug_code to enable.
- void Assert(Condition cc, BailoutReason reason);
+ void Assert(Condition cc, const char* msg);
void AssertFastElements(Register elements);
// Like Assert(), but always enabled.
- void Check(Condition cc, BailoutReason reason);
+ void Check(Condition cc, const char* msg);
// Print a message to stdout and abort execution.
- void Abort(BailoutReason msg);
+ void Abort(const char* msg);
// Check that the stack is aligned.
void CheckStackAlignment();
diff --git a/chromium/v8/src/x64/regexp-macro-assembler-x64.cc b/chromium/v8/src/x64/regexp-macro-assembler-x64.cc
index dcd317c666e..106ffb76da5 100644
--- a/chromium/v8/src/x64/regexp-macro-assembler-x64.cc
+++ b/chromium/v8/src/x64/regexp-macro-assembler-x64.cc
@@ -397,7 +397,7 @@ void RegExpMacroAssemblerX64::CheckNotBackReference(
// Fail on partial or illegal capture (start of capture after end of capture).
// This must not happen (no back-reference can reference a capture that wasn't
// closed before in the reg-exp).
- __ Check(greater_equal, kInvalidCaptureReferenced);
+ __ Check(greater_equal, "Invalid capture referenced");
// Succeed on empty capture (including non-participating capture)
__ j(equal, &fallthrough);
diff --git a/chromium/v8/src/x64/stub-cache-x64.cc b/chromium/v8/src/x64/stub-cache-x64.cc
index 34a557bd1af..39ff656ec45 100644
--- a/chromium/v8/src/x64/stub-cache-x64.cc
+++ b/chromium/v8/src/x64/stub-cache-x64.cc
@@ -830,11 +830,11 @@ void BaseStoreStubCompiler::GenerateStoreTransition(MacroAssembler* masm,
object->map()->unused_property_fields() == 0) {
// The properties must be extended before we can store the value.
// We jump to a runtime call that extends the properties array.
- __ PopReturnAddressTo(scratch1);
+ __ pop(scratch1); // Return address.
__ push(receiver_reg);
__ Push(transition);
__ push(value_reg);
- __ PushReturnAddressFrom(scratch1);
+ __ push(scratch1);
__ TailCallExternalReference(
ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage),
masm->isolate()),
@@ -1284,7 +1284,7 @@ void BaseLoadStubCompiler::GenerateLoadCallback(
Handle<ExecutableAccessorInfo> callback) {
// Insert additional parameters into the stack frame above return address.
ASSERT(!scratch4().is(reg));
- __ PopReturnAddressTo(scratch4());
+ __ pop(scratch4()); // Get return address to place it below.
__ push(receiver()); // receiver
__ push(reg); // holder
@@ -1324,7 +1324,7 @@ void BaseLoadStubCompiler::GenerateLoadCallback(
ASSERT(!name_arg.is(scratch4()));
__ movq(name_arg, rsp);
- __ PushReturnAddressFrom(scratch4());
+ __ push(scratch4()); // Restore return address.
// v8::Arguments::values_ and handler for name.
const int kStackSpace = PropertyCallbackArguments::kArgsLength + 1;
@@ -1444,10 +1444,10 @@ void BaseLoadStubCompiler::GenerateLoadInterceptor(
} else { // !compile_followup_inline
// Call the runtime system to load the interceptor.
// Check that the maps haven't changed.
- __ PopReturnAddressTo(scratch2());
+ __ pop(scratch2()); // save old return address
PushInterceptorArguments(masm(), receiver(), holder_reg,
this->name(), interceptor_holder);
- __ PushReturnAddressFrom(scratch2());
+ __ push(scratch2()); // restore old return address
ExternalReference ref = ExternalReference(
IC_Utility(IC::kLoadPropertyWithInterceptorForLoad), isolate());
@@ -2246,25 +2246,26 @@ Handle<Code> CallStubCompiler::CompileMathAbsCall(
Label not_smi;
STATIC_ASSERT(kSmiTag == 0);
__ JumpIfNotSmi(rax, &not_smi);
+ __ SmiToInteger32(rax, rax);
- // Branchless abs implementation, refer to below:
- // http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs
// Set ebx to 1...1 (== -1) if the argument is negative, or to 0...0
// otherwise.
- __ movq(rbx, rax);
- __ sar(rbx, Immediate(kBitsPerPointer - 1));
+ __ movl(rbx, rax);
+ __ sarl(rbx, Immediate(kBitsPerInt - 1));
// Do bitwise not or do nothing depending on ebx.
- __ xor_(rax, rbx);
+ __ xorl(rax, rbx);
// Add 1 or do nothing depending on ebx.
- __ subq(rax, rbx);
+ __ subl(rax, rbx);
// If the result is still negative, go to the slow case.
// This only happens for the most negative smi.
Label slow;
__ j(negative, &slow);
+ // Smi case done.
+ __ Integer32ToSmi(rax, rax);
__ ret(2 * kPointerSize);
// Check if the argument is a heap number and load its value.
@@ -2649,12 +2650,12 @@ Handle<Code> StoreStubCompiler::CompileStoreCallback(
HandlerFrontend(object, receiver(), holder, name, &success);
__ bind(&success);
- __ PopReturnAddressTo(scratch1());
+ __ pop(scratch1()); // remove the return address
__ push(receiver());
__ Push(callback); // callback info
__ Push(name);
__ push(value());
- __ PushReturnAddressFrom(scratch1());
+ __ push(scratch1()); // restore return address
// Do tail-call to the runtime system.
ExternalReference store_callback_property =
@@ -2716,12 +2717,12 @@ void StoreStubCompiler::GenerateStoreViaSetter(
Handle<Code> StoreStubCompiler::CompileStoreInterceptor(
Handle<JSObject> object,
Handle<Name> name) {
- __ PopReturnAddressTo(scratch1());
+ __ pop(scratch1()); // remove the return address
__ push(receiver());
__ push(this->name());
__ push(value());
__ Push(Smi::FromInt(strict_mode()));
- __ PushReturnAddressFrom(scratch1());
+ __ push(scratch1()); // restore return address
// Do tail-call to the runtime system.
ExternalReference store_ic_property =
@@ -2937,7 +2938,7 @@ Handle<Code> LoadStubCompiler::CompileLoadGlobal(
__ j(equal, &miss);
} else if (FLAG_debug_code) {
__ CompareRoot(rbx, Heap::kTheHoleValueRootIndex);
- __ Check(not_equal, kDontDeleteCellsCannotContainTheHole);
+ __ Check(not_equal, "DontDelete cells can't contain the hole");
}
HandlerFrontendFooter(name, &success, &miss);
diff --git a/chromium/v8/src/zone-inl.h b/chromium/v8/src/zone-inl.h
index f257382a2db..49e7626f74e 100644
--- a/chromium/v8/src/zone-inl.h
+++ b/chromium/v8/src/zone-inl.h
@@ -109,12 +109,6 @@ void* ZoneList<T>::operator new(size_t size, Zone* zone) {
}
-template <typename T>
-void* ZoneSplayTree<T>::operator new(size_t size, Zone* zone) {
- return zone->New(static_cast<int>(size));
-}
-
-
} } // namespace v8::internal
#endif // V8_ZONE_INL_H_
diff --git a/chromium/v8/src/zone.h b/chromium/v8/src/zone.h
index bd7cc39b0c4..a12ed793123 100644
--- a/chromium/v8/src/zone.h
+++ b/chromium/v8/src/zone.h
@@ -177,7 +177,6 @@ struct ZoneAllocationPolicy {
explicit ZoneAllocationPolicy(Zone* zone) : zone_(zone) { }
INLINE(void* New(size_t size));
INLINE(static void Delete(void *pointer)) { }
- Zone* zone() { return zone_; }
private:
Zone* zone_;
@@ -202,7 +201,7 @@ class ZoneList: public List<T, ZoneAllocationPolicy> {
ZoneList(const ZoneList<T>& other, Zone* zone)
: List<T, ZoneAllocationPolicy>(other.length(),
ZoneAllocationPolicy(zone)) {
- AddAll(other, zone);
+ AddAll(other, ZoneAllocationPolicy(zone));
}
// We add some convenience wrappers so that we can pass in a Zone
@@ -210,7 +209,8 @@ class ZoneList: public List<T, ZoneAllocationPolicy> {
INLINE(void Add(const T& element, Zone* zone)) {
List<T, ZoneAllocationPolicy>::Add(element, ZoneAllocationPolicy(zone));
}
- INLINE(void AddAll(const List<T, ZoneAllocationPolicy>& other, Zone* zone)) {
+ INLINE(void AddAll(const List<T, ZoneAllocationPolicy>& other,
+ Zone* zone)) {
List<T, ZoneAllocationPolicy>::AddAll(other, ZoneAllocationPolicy(zone));
}
INLINE(void AddAll(const Vector<T>& other, Zone* zone)) {
@@ -246,11 +246,6 @@ class ZoneSplayTree: public SplayTree<Config, ZoneAllocationPolicy> {
explicit ZoneSplayTree(Zone* zone)
: SplayTree<Config, ZoneAllocationPolicy>(ZoneAllocationPolicy(zone)) {}
~ZoneSplayTree();
-
- INLINE(void* operator new(size_t size, Zone* zone));
-
- void operator delete(void* pointer) { UNREACHABLE(); }
- void operator delete(void* pointer, Zone* zone) { UNREACHABLE(); }
};
diff --git a/chromium/v8/tools/gcmole/Makefile b/chromium/v8/tools/gcmole/Makefile
index 764245caf61..23c029c2dc3 100644
--- a/chromium/v8/tools/gcmole/Makefile
+++ b/chromium/v8/tools/gcmole/Makefile
@@ -40,4 +40,4 @@ libgcmole.so: gcmole.cc
-shared -o libgcmole.so gcmole.cc
clean:
- rm -f libgcmole.so
+ rm libgcmole.so
diff --git a/chromium/v8/tools/gcmole/bootstrap.sh b/chromium/v8/tools/gcmole/bootstrap.sh
deleted file mode 100755
index baa0b1f5f54..00000000000
--- a/chromium/v8/tools/gcmole/bootstrap.sh
+++ /dev/null
@@ -1,126 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright 2013 the V8 project authors. All rights reserved.
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following
-# disclaimer in the documentation and/or other materials provided
-# with the distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived
-# from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# This script will build libgcmole.so.
-
-CLANG_RELEASE=2.9
-
-THIS_DIR="$(dirname "${0}")"
-LLVM_DIR="${THIS_DIR}/../../third_party/llvm"
-CLANG_DIR="${LLVM_DIR}/tools/clang"
-
-LLVM_REPO_URL=${LLVM_URL:-https://llvm.org/svn/llvm-project}
-
-# Die if any command dies.
-set -e
-
-OS="$(uname -s)"
-
-# Xcode and clang don't get along when predictive compilation is enabled.
-# http://crbug.com/96315
-if [[ "${OS}" = "Darwin" ]] && xcodebuild -version | grep -q 'Xcode 3.2' ; then
- XCONF=com.apple.Xcode
- if [[ "${GYP_GENERATORS}" != "make" ]] && \
- [ "$(defaults read "${XCONF}" EnablePredictiveCompilation)" != "0" ]; then
- echo
- echo " HEARKEN!"
- echo "You're using Xcode3 and you have 'Predictive Compilation' enabled."
- echo "This does not work well with clang (http://crbug.com/96315)."
- echo "Disable it in Preferences->Building (lower right), or run"
- echo " defaults write ${XCONF} EnablePredictiveCompilation -boolean NO"
- echo "while Xcode is not running."
- echo
- fi
-
- SUB_VERSION=$(xcodebuild -version | sed -Ene 's/Xcode 3\.2\.([0-9]+)/\1/p')
- if [[ "${SUB_VERSION}" < 6 ]]; then
- echo
- echo " YOUR LD IS BUGGY!"
- echo "Please upgrade Xcode to at least 3.2.6."
- echo
- fi
-fi
-
-echo Getting LLVM r"${CLANG_RELEASE}" in "${LLVM_DIR}"
-if ! svn co --force \
- "${LLVM_REPO_URL}/llvm/branches/release_${CLANG_RELEASE/./}" \
- "${LLVM_DIR}"; then
- echo Checkout failed, retrying
- rm -rf "${LLVM_DIR}"
- svn co --force \
- "${LLVM_REPO_URL}/llvm/branches/release_${CLANG_RELEASE/./}" \
- "${LLVM_DIR}"
-fi
-
-echo Getting clang r"${CLANG_RELEASE}" in "${CLANG_DIR}"
-svn co --force \
- "${LLVM_REPO_URL}/cfe/branches/release_${CLANG_RELEASE/./}" \
- "${CLANG_DIR}"
-
-# Echo all commands
-set -x
-
-NUM_JOBS=3
-if [[ "${OS}" = "Linux" ]]; then
- NUM_JOBS="$(grep -c "^processor" /proc/cpuinfo)"
-elif [ "${OS}" = "Darwin" ]; then
- NUM_JOBS="$(sysctl -n hw.ncpu)"
-fi
-
-# Build clang.
-cd "${LLVM_DIR}"
-if [[ ! -f ./config.status ]]; then
- ../llvm/configure \
- --enable-optimized \
- --disable-threads \
- --disable-pthreads \
- --without-llvmgcc \
- --without-llvmgxx
-fi
-
-MACOSX_DEPLOYMENT_TARGET=10.5 make -j"${NUM_JOBS}"
-STRIP_FLAGS=
-if [ "${OS}" = "Darwin" ]; then
- # See http://crbug.com/256342
- STRIP_FLAGS=-x
-fi
-strip ${STRIP_FLAGS} Release/bin/clang
-cd -
-
-# Build libgcmole.so
-make -C "${THIS_DIR}" clean
-make -C "${THIS_DIR}" LLVM_SRC_ROOT="${LLVM_DIR}" libgcmole.so
-
-set +x
-
-echo
-echo You can now run gcmole using this command:
-echo
-echo CLANG_BIN=\"third_party/llvm/Release/bin\" lua tools/gcmole/gcmole.lua
-echo
diff --git a/chromium/v8/tools/gcmole/gcmole.lua b/chromium/v8/tools/gcmole/gcmole.lua
index aa9324756ac..66aff942a49 100644
--- a/chromium/v8/tools/gcmole/gcmole.lua
+++ b/chromium/v8/tools/gcmole/gcmole.lua
@@ -103,10 +103,7 @@ local function MakeClangCommandLine(plugin, plugin_args, triple, arch_define)
.. " -triple " .. triple
.. " -D" .. arch_define
.. " -DENABLE_DEBUGGER_SUPPORT"
- .. " -DV8_I18N_SUPPORT"
.. " -Isrc"
- .. " -Ithird_party/icu/source/common"
- .. " -Ithird_party/icu/source/i18n"
end
function InvokeClangPluginForEachFile(filenames, cfg, func)
diff --git a/chromium/v8/tools/grokdump.py b/chromium/v8/tools/grokdump.py
index 12ccefdef74..9719376d7f4 100755
--- a/chromium/v8/tools/grokdump.py
+++ b/chromium/v8/tools/grokdump.py
@@ -40,7 +40,6 @@ import re
import struct
import sys
import types
-import v8heapconst
USAGE="""usage: %prog [OPTIONS] [DUMP-FILE]
@@ -164,11 +163,6 @@ def FullDump(reader, heap):
reader.ForEachMemoryRegion(dump_region)
-# Heap constants generated by 'make grokdump' in v8heapconst module.
-INSTANCE_TYPES = v8heapconst.INSTANCE_TYPES
-KNOWN_MAPS = v8heapconst.KNOWN_MAPS
-KNOWN_OBJECTS = v8heapconst.KNOWN_OBJECTS
-
# Set of structures and constants that describe the layout of minidump
# files. Based on MSDN and Google Breakpad.
@@ -760,14 +754,6 @@ class MinidumpReader(object):
elif self.arch == MD_CPU_ARCHITECTURE_X86:
return self.exception_context.esp
- def ExceptionFP(self):
- if self.arch == MD_CPU_ARCHITECTURE_AMD64:
- return self.exception_context.rbp
- elif self.arch == MD_CPU_ARCHITECTURE_ARM:
- return None
- elif self.arch == MD_CPU_ARCHITECTURE_X86:
- return self.exception_context.ebp
-
def FormatIntPtr(self, value):
if self.arch == MD_CPU_ARCHITECTURE_AMD64:
return "%016x" % value
@@ -848,6 +834,262 @@ class MinidumpReader(object):
return "%s+0x%x" % (symbol.name, diff)
+
+# List of V8 instance types. Obtained by adding the code below to any .cc file.
+#
+# #define DUMP_TYPE(T) printf(" %d: \"%s\",\n", T, #T);
+# struct P {
+# P() {
+# printf("INSTANCE_TYPES = {\n");
+# INSTANCE_TYPE_LIST(DUMP_TYPE)
+# printf("}\n");
+# }
+# };
+# static P p;
+INSTANCE_TYPES = {
+ 0: "STRING_TYPE",
+ 4: "ASCII_STRING_TYPE",
+ 1: "CONS_STRING_TYPE",
+ 5: "CONS_ASCII_STRING_TYPE",
+ 3: "SLICED_STRING_TYPE",
+ 2: "EXTERNAL_STRING_TYPE",
+ 6: "EXTERNAL_ASCII_STRING_TYPE",
+ 10: "EXTERNAL_STRING_WITH_ASCII_DATA_TYPE",
+ 18: "SHORT_EXTERNAL_STRING_TYPE",
+ 22: "SHORT_EXTERNAL_ASCII_STRING_TYPE",
+ 26: "SHORT_EXTERNAL_STRING_WITH_ASCII_DATA_TYPE",
+ 64: "INTERNALIZED_STRING_TYPE",
+ 68: "ASCII_INTERNALIZED_STRING_TYPE",
+ 65: "CONS_INTERNALIZED_STRING_TYPE",
+ 69: "CONS_ASCII_INTERNALIZED_STRING_TYPE",
+ 66: "EXTERNAL_INTERNALIZED_STRING_TYPE",
+ 70: "EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE",
+ 74: "EXTERNAL_INTERNALIZED_STRING_WITH_ASCII_DATA_TYPE",
+ 82: "SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE",
+ 86: "SHORT_EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE",
+ 90: "SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ASCII_DATA_TYPE",
+ 128: "SYMBOL_TYPE",
+ 129: "MAP_TYPE",
+ 130: "CODE_TYPE",
+ 131: "ODDBALL_TYPE",
+ 132: "JS_GLOBAL_PROPERTY_CELL_TYPE",
+ 133: "HEAP_NUMBER_TYPE",
+ 134: "FOREIGN_TYPE",
+ 135: "BYTE_ARRAY_TYPE",
+ 136: "FREE_SPACE_TYPE",
+ 137: "EXTERNAL_BYTE_ARRAY_TYPE",
+ 138: "EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE",
+ 139: "EXTERNAL_SHORT_ARRAY_TYPE",
+ 140: "EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE",
+ 141: "EXTERNAL_INT_ARRAY_TYPE",
+ 142: "EXTERNAL_UNSIGNED_INT_ARRAY_TYPE",
+ 143: "EXTERNAL_FLOAT_ARRAY_TYPE",
+ 145: "EXTERNAL_PIXEL_ARRAY_TYPE",
+ 147: "FILLER_TYPE",
+ 148: "DECLARED_ACCESSOR_DESCRIPTOR_TYPE",
+ 149: "DECLARED_ACCESSOR_INFO_TYPE",
+ 150: "EXECUTABLE_ACCESSOR_INFO_TYPE",
+ 151: "ACCESSOR_PAIR_TYPE",
+ 152: "ACCESS_CHECK_INFO_TYPE",
+ 153: "INTERCEPTOR_INFO_TYPE",
+ 154: "CALL_HANDLER_INFO_TYPE",
+ 155: "FUNCTION_TEMPLATE_INFO_TYPE",
+ 156: "OBJECT_TEMPLATE_INFO_TYPE",
+ 157: "SIGNATURE_INFO_TYPE",
+ 158: "TYPE_SWITCH_INFO_TYPE",
+ 159: "ALLOCATION_SITE_INFO_TYPE",
+ 160: "SCRIPT_TYPE",
+ 161: "CODE_CACHE_TYPE",
+ 162: "POLYMORPHIC_CODE_CACHE_TYPE",
+ 163: "TYPE_FEEDBACK_INFO_TYPE",
+ 164: "ALIASED_ARGUMENTS_ENTRY_TYPE",
+ 167: "FIXED_ARRAY_TYPE",
+ 146: "FIXED_DOUBLE_ARRAY_TYPE",
+ 168: "SHARED_FUNCTION_INFO_TYPE",
+ 169: "JS_MESSAGE_OBJECT_TYPE",
+ 172: "JS_VALUE_TYPE",
+ 173: "JS_DATE_TYPE",
+ 174: "JS_OBJECT_TYPE",
+ 175: "JS_CONTEXT_EXTENSION_OBJECT_TYPE",
+ 176: "JS_MODULE_TYPE",
+ 177: "JS_GLOBAL_OBJECT_TYPE",
+ 178: "JS_BUILTINS_OBJECT_TYPE",
+ 179: "JS_GLOBAL_PROXY_TYPE",
+ 180: "JS_ARRAY_TYPE",
+ 171: "JS_PROXY_TYPE",
+ 183: "JS_WEAK_MAP_TYPE",
+ 184: "JS_WEAK_SET_TYPE",
+ 185: "JS_REGEXP_TYPE",
+ 186: "JS_FUNCTION_TYPE",
+ 170: "JS_FUNCTION_PROXY_TYPE",
+ 165: "DEBUG_INFO_TYPE",
+ 166: "BREAK_POINT_INFO_TYPE",
+}
+
+
+# List of known V8 maps. Used to determine the instance type and name
+# for maps that are part of the root-set and hence on the first page of
+# the map-space. Obtained by adding the code below to an IA32 release
+# build with enabled snapshots to the end of the Isolate::Init method.
+#
+# #define ROOT_LIST_CASE(type, name, camel_name) \
+# if (o == heap_.name()) n = #camel_name;
+# #define STRUCT_LIST_CASE(upper_name, camel_name, name) \
+# if (o == heap_.name##_map()) n = #camel_name "Map";
+# HeapObjectIterator it(heap_.map_space());
+# printf("KNOWN_MAPS = {\n");
+# for (Object* o = it.Next(); o != NULL; o = it.Next()) {
+# Map* m = Map::cast(o);
+# const char* n = "";
+# intptr_t p = reinterpret_cast<intptr_t>(m) & 0xfffff;
+# int t = m->instance_type();
+# ROOT_LIST(ROOT_LIST_CASE)
+# STRUCT_LIST(STRUCT_LIST_CASE)
+# printf(" 0x%05x: (%d, \"%s\"),\n", p, t, n);
+# }
+# printf("}\n");
+KNOWN_MAPS = {
+ 0x08081: (135, "ByteArrayMap"),
+ 0x080a9: (129, "MetaMap"),
+ 0x080d1: (131, "OddballMap"),
+ 0x080f9: (68, "AsciiInternalizedStringMap"),
+ 0x08121: (167, "FixedArrayMap"),
+ 0x08149: (133, "HeapNumberMap"),
+ 0x08171: (136, "FreeSpaceMap"),
+ 0x08199: (147, "OnePointerFillerMap"),
+ 0x081c1: (147, "TwoPointerFillerMap"),
+ 0x081e9: (132, "GlobalPropertyCellMap"),
+ 0x08211: (168, "SharedFunctionInfoMap"),
+ 0x08239: (167, "NativeContextMap"),
+ 0x08261: (130, "CodeMap"),
+ 0x08289: (167, "ScopeInfoMap"),
+ 0x082b1: (167, "FixedCOWArrayMap"),
+ 0x082d9: (146, "FixedDoubleArrayMap"),
+ 0x08301: (167, "HashTableMap"),
+ 0x08329: (128, "SymbolMap"),
+ 0x08351: (0, "StringMap"),
+ 0x08379: (4, "AsciiStringMap"),
+ 0x083a1: (1, "ConsStringMap"),
+ 0x083c9: (5, "ConsAsciiStringMap"),
+ 0x083f1: (3, "SlicedStringMap"),
+ 0x08419: (7, "SlicedAsciiStringMap"),
+ 0x08441: (2, "ExternalStringMap"),
+ 0x08469: (10, "ExternalStringWithAsciiDataMap"),
+ 0x08491: (6, "ExternalAsciiStringMap"),
+ 0x084b9: (18, "ShortExternalStringMap"),
+ 0x084e1: (26, "ShortExternalStringWithAsciiDataMap"),
+ 0x08509: (64, "InternalizedStringMap"),
+ 0x08531: (65, "ConsInternalizedStringMap"),
+ 0x08559: (69, "ConsAsciiInternalizedStringMap"),
+ 0x08581: (66, "ExternalInternalizedStringMap"),
+ 0x085a9: (74, "ExternalInternalizedStringWithAsciiDataMap"),
+ 0x085d1: (70, "ExternalAsciiInternalizedStringMap"),
+ 0x085f9: (82, "ShortExternalInternalizedStringMap"),
+ 0x08621: (90, "ShortExternalInternalizedStringWithAsciiDataMap"),
+ 0x08649: (86, "ShortExternalAsciiInternalizedStringMap"),
+ 0x08671: (22, "ShortExternalAsciiStringMap"),
+ 0x08699: (0, "UndetectableStringMap"),
+ 0x086c1: (4, "UndetectableAsciiStringMap"),
+ 0x086e9: (145, "ExternalPixelArrayMap"),
+ 0x08711: (137, "ExternalByteArrayMap"),
+ 0x08739: (138, "ExternalUnsignedByteArrayMap"),
+ 0x08761: (139, "ExternalShortArrayMap"),
+ 0x08789: (140, "ExternalUnsignedShortArrayMap"),
+ 0x087b1: (141, "ExternalIntArrayMap"),
+ 0x087d9: (142, "ExternalUnsignedIntArrayMap"),
+ 0x08801: (143, "ExternalFloatArrayMap"),
+ 0x08829: (144, "ExternalDoubleArrayMap"),
+ 0x08851: (167, "NonStrictArgumentsElementsMap"),
+ 0x08879: (167, "FunctionContextMap"),
+ 0x088a1: (167, "CatchContextMap"),
+ 0x088c9: (167, "WithContextMap"),
+ 0x088f1: (167, "BlockContextMap"),
+ 0x08919: (167, "ModuleContextMap"),
+ 0x08941: (167, "GlobalContextMap"),
+ 0x08969: (169, "JSMessageObjectMap"),
+ 0x08991: (134, "ForeignMap"),
+ 0x089b9: (174, "NeanderMap"),
+ 0x089e1: (159, "AllocationSiteInfoMap"),
+ 0x08a09: (162, "PolymorphicCodeCacheMap"),
+ 0x08a31: (160, "ScriptMap"),
+ 0x08a59: (174, ""),
+ 0x08a81: (174, "ExternalMap"),
+ 0x08aa9: (148, "DeclaredAccessorDescriptorMap"),
+ 0x08ad1: (149, "DeclaredAccessorInfoMap"),
+ 0x08af9: (150, "ExecutableAccessorInfoMap"),
+ 0x08b21: (151, "AccessorPairMap"),
+ 0x08b49: (152, "AccessCheckInfoMap"),
+ 0x08b71: (153, "InterceptorInfoMap"),
+ 0x08b99: (154, "CallHandlerInfoMap"),
+ 0x08bc1: (155, "FunctionTemplateInfoMap"),
+ 0x08be9: (156, "ObjectTemplateInfoMap"),
+ 0x08c11: (157, "SignatureInfoMap"),
+ 0x08c39: (158, "TypeSwitchInfoMap"),
+ 0x08c61: (161, "CodeCacheMap"),
+ 0x08c89: (163, "TypeFeedbackInfoMap"),
+ 0x08cb1: (164, "AliasedArgumentsEntryMap"),
+ 0x08cd9: (165, "DebugInfoMap"),
+ 0x08d01: (166, "BreakPointInfoMap"),
+}
+
+
+# List of known V8 objects. Used to determine name for objects that are
+# part of the root-set and hence on the first page of various old-space
+# paged. Obtained by adding the code below to an IA32 release build with
+# enabled snapshots to the end of the Isolate::Init method.
+#
+# #define ROOT_LIST_CASE(type, name, camel_name) \
+# if (o == heap_.name()) n = #camel_name;
+# OldSpaces spit(heap());
+# printf("KNOWN_OBJECTS = {\n");
+# for (PagedSpace* s = spit.next(); s != NULL; s = spit.next()) {
+# HeapObjectIterator it(s);
+# const char* sname = AllocationSpaceName(s->identity());
+# for (Object* o = it.Next(); o != NULL; o = it.Next()) {
+# const char* n = NULL;
+# intptr_t p = reinterpret_cast<intptr_t>(o) & 0xfffff;
+# ROOT_LIST(ROOT_LIST_CASE)
+# if (n != NULL) {
+# printf(" (\"%s\", 0x%05x): \"%s\",\n", sname, p, n);
+# }
+# }
+# }
+# printf("}\n");
+KNOWN_OBJECTS = {
+ ("OLD_POINTER_SPACE", 0x08081): "NullValue",
+ ("OLD_POINTER_SPACE", 0x08091): "UndefinedValue",
+ ("OLD_POINTER_SPACE", 0x080a1): "InstanceofCacheMap",
+ ("OLD_POINTER_SPACE", 0x080b1): "TrueValue",
+ ("OLD_POINTER_SPACE", 0x080c1): "FalseValue",
+ ("OLD_POINTER_SPACE", 0x080d1): "NoInterceptorResultSentinel",
+ ("OLD_POINTER_SPACE", 0x080e1): "ArgumentsMarker",
+ ("OLD_POINTER_SPACE", 0x080f1): "NumberStringCache",
+ ("OLD_POINTER_SPACE", 0x088f9): "SingleCharacterStringCache",
+ ("OLD_POINTER_SPACE", 0x08b01): "StringSplitCache",
+ ("OLD_POINTER_SPACE", 0x08f09): "RegExpMultipleCache",
+ ("OLD_POINTER_SPACE", 0x09311): "TerminationException",
+ ("OLD_POINTER_SPACE", 0x09321): "MessageListeners",
+ ("OLD_POINTER_SPACE", 0x0933d): "CodeStubs",
+ ("OLD_POINTER_SPACE", 0x09fa5): "NonMonomorphicCache",
+ ("OLD_POINTER_SPACE", 0x0a5b9): "PolymorphicCodeCache",
+ ("OLD_POINTER_SPACE", 0x0a5c1): "NativesSourceCache",
+ ("OLD_POINTER_SPACE", 0x0a601): "EmptyScript",
+ ("OLD_POINTER_SPACE", 0x0a63d): "IntrinsicFunctionNames",
+ ("OLD_POINTER_SPACE", 0x0d659): "ObservationState",
+ ("OLD_POINTER_SPACE", 0x27415): "SymbolTable",
+ ("OLD_DATA_SPACE", 0x08099): "EmptyDescriptorArray",
+ ("OLD_DATA_SPACE", 0x080a1): "EmptyFixedArray",
+ ("OLD_DATA_SPACE", 0x080a9): "NanValue",
+ ("OLD_DATA_SPACE", 0x08125): "EmptyByteArray",
+ ("OLD_DATA_SPACE", 0x0812d): "EmptyString",
+ ("OLD_DATA_SPACE", 0x08259): "InfinityValue",
+ ("OLD_DATA_SPACE", 0x08265): "MinusZeroValue",
+ ("OLD_DATA_SPACE", 0x08271): "PrototypeAccessors",
+ ("CODE_SPACE", 0x0aea1): "JsEntryCode",
+ ("CODE_SPACE", 0x0b5c1): "JsConstructEntryCode",
+}
+
+
class Printer(object):
"""Printer with indentation support."""
@@ -1959,15 +2201,11 @@ def AnalyzeMinidump(options, minidump_name):
print "Kthxbye."
elif not options.command:
if reader.exception is not None:
- frame_pointer = reader.ExceptionFP()
print "Annotated stack (from exception.esp to bottom):"
for slot in xrange(stack_top, stack_bottom, reader.PointerSize()):
maybe_address = reader.ReadUIntPtr(slot)
heap_object = heap.FindObject(maybe_address)
maybe_symbol = reader.FindSymbol(maybe_address)
- if slot == frame_pointer:
- maybe_symbol = "<---- frame pointer"
- frame_pointer = maybe_address
print "%s: %s %s" % (reader.FormatIntPtr(slot),
reader.FormatIntPtr(maybe_address),
maybe_symbol or "")
diff --git a/chromium/v8/tools/gyp/v8.gyp b/chromium/v8/tools/gyp/v8.gyp
index 66376c17df5..bdbc7163df4 100644
--- a/chromium/v8/tools/gyp/v8.gyp
+++ b/chromium/v8/tools/gyp/v8.gyp
@@ -290,7 +290,6 @@
'../../src/double.h',
'../../src/dtoa.cc',
'../../src/dtoa.h',
- '../../src/effects.h',
'../../src/elements-kind.cc',
'../../src/elements-kind.h',
'../../src/elements.cc',
@@ -823,14 +822,20 @@
}],
['v8_enable_i18n_support==1', {
'sources': [
- '../../src/i18n.cc',
- '../../src/i18n.h',
'../../src/extensions/i18n/break-iterator.cc',
'../../src/extensions/i18n/break-iterator.h',
+ '../../src/extensions/i18n/collator.cc',
+ '../../src/extensions/i18n/collator.h',
+ '../../src/extensions/i18n/date-format.cc',
+ '../../src/extensions/i18n/date-format.h',
'../../src/extensions/i18n/i18n-extension.cc',
'../../src/extensions/i18n/i18n-extension.h',
'../../src/extensions/i18n/i18n-utils.cc',
'../../src/extensions/i18n/i18n-utils.h',
+ '../../src/extensions/i18n/locale.cc',
+ '../../src/extensions/i18n/locale.h',
+ '../../src/extensions/i18n/number-format.cc',
+ '../../src/extensions/i18n/number-format.h',
],
'dependencies': [
'<(DEPTH)/third_party/icu/icu.gyp:icui18n',
@@ -902,8 +907,7 @@
'../../src/typedarray.js',
'../../src/generator.js',
'../../src/array-iterator.js',
- '../../src/harmony-string.js',
- '../../src/harmony-array.js',
+ '../../src/harmony-string.js'
],
'i18n_library_files': [
'../../src/extensions/i18n/header.js',
diff --git a/chromium/v8/tools/run-tests.py b/chromium/v8/tools/run-tests.py
index 48682d4444e..761d03fe335 100755
--- a/chromium/v8/tools/run-tests.py
+++ b/chromium/v8/tools/run-tests.py
@@ -94,9 +94,6 @@ def BuildOptions():
default=False, action="store_true")
result.add_option("--cat", help="Print the source of the tests",
default=False, action="store_true")
- result.add_option("--flaky-tests",
- help="Regard tests marked as flaky (run|skip|dontcare)",
- default="dontcare")
result.add_option("--command-prefix",
help="Prepended to each shell command used to run a test",
default="")
@@ -207,9 +204,6 @@ def ProcessOptions(options):
# This is OK for distributed running, so we don't need to set no_network.
options.command_prefix = (["python", "-u", run_valgrind] +
options.command_prefix)
- if not options.flaky_tests in ["run", "skip", "dontcare"]:
- print "Unknown flaky test mode %s" % options.flaky_tests
- return False
return True
@@ -321,7 +315,7 @@ def Execute(arch, mode, args, options, suites, workspace):
if len(args) > 0:
s.FilterTestCasesByArgs(args)
all_tests += s.tests
- s.FilterTestCasesByStatus(options.warn_unused, options.flaky_tests)
+ s.FilterTestCasesByStatus(options.warn_unused)
if options.cat:
verbose.PrintTestSource(s.tests)
continue
diff --git a/chromium/v8/tools/testrunner/local/old_statusfile.py b/chromium/v8/tools/testrunner/local/old_statusfile.py
index d634e3ec955..a9a62036ec4 100644
--- a/chromium/v8/tools/testrunner/local/old_statusfile.py
+++ b/chromium/v8/tools/testrunner/local/old_statusfile.py
@@ -37,7 +37,6 @@ OKAY = 'OKAY'
TIMEOUT = 'TIMEOUT'
CRASH = 'CRASH'
SLOW = 'SLOW'
-FLAKY = 'FLAKY'
# These are just for the status files and are mapped below in DEFS:
FAIL_OK = 'FAIL_OK'
PASS_OR_FAIL = 'PASS_OR_FAIL'
@@ -49,7 +48,6 @@ KEYWORDS = {SKIP: SKIP,
TIMEOUT: TIMEOUT,
CRASH: CRASH,
SLOW: SLOW,
- FLAKY: FLAKY,
FAIL_OK: FAIL_OK,
PASS_OR_FAIL: PASS_OR_FAIL}
diff --git a/chromium/v8/tools/testrunner/local/statusfile.py b/chromium/v8/tools/testrunner/local/statusfile.py
index 1d30fe3d3c1..634fe6a08a8 100644
--- a/chromium/v8/tools/testrunner/local/statusfile.py
+++ b/chromium/v8/tools/testrunner/local/statusfile.py
@@ -42,7 +42,6 @@ OKAY = "OKAY"
TIMEOUT = "TIMEOUT"
CRASH = "CRASH"
SLOW = "SLOW"
-FLAKY = "FLAKY"
# These are just for the status files and are mapped below in DEFS:
FAIL_OK = "FAIL_OK"
PASS_OR_FAIL = "PASS_OR_FAIL"
@@ -50,7 +49,7 @@ PASS_OR_FAIL = "PASS_OR_FAIL"
ALWAYS = "ALWAYS"
KEYWORDS = {}
-for key in [SKIP, FAIL, PASS, OKAY, TIMEOUT, CRASH, SLOW, FLAKY, FAIL_OK,
+for key in [SKIP, FAIL, PASS, OKAY, TIMEOUT, CRASH, SLOW, FAIL_OK,
PASS_OR_FAIL, ALWAYS]:
KEYWORDS[key] = key
@@ -69,10 +68,6 @@ def DoSkip(outcomes):
def IsFlaky(outcomes):
- return FLAKY in outcomes
-
-
-def IsPassOrFail(outcomes):
return ((PASS in outcomes) and (FAIL in outcomes) and
(not CRASH in outcomes) and (not OKAY in outcomes))
diff --git a/chromium/v8/tools/testrunner/local/testsuite.py b/chromium/v8/tools/testrunner/local/testsuite.py
index b0372e7f739..473e8b1efed 100644
--- a/chromium/v8/tools/testrunner/local/testsuite.py
+++ b/chromium/v8/tools/testrunner/local/testsuite.py
@@ -66,10 +66,7 @@ class TestSuite(object):
# Used in the status file and for stdout printing.
def CommonTestName(self, testcase):
- if utils.IsWindows():
- return testcase.path.replace("\\", "/")
- else:
- return testcase.path
+ return testcase.path
def ListTests(self, context):
raise NotImplementedError
@@ -87,36 +84,32 @@ class TestSuite(object):
def ReadTestCases(self, context):
self.tests = self.ListTests(context)
- @staticmethod
- def _FilterFlaky(flaky, mode):
- return (mode == "run" and not flaky) or (mode == "skip" and flaky)
-
- def FilterTestCasesByStatus(self, warn_unused_rules, flaky_tests="dontcare"):
+ def FilterTestCasesByStatus(self, warn_unused_rules):
filtered = []
used_rules = set()
for t in self.tests:
- flaky = False
testname = self.CommonTestName(t)
+ if utils.IsWindows():
+ testname = testname.replace("\\", "/")
if testname in self.rules:
used_rules.add(testname)
- # Even for skipped tests, as the TestCase object stays around and
- # PrintReport() uses it.
- t.outcomes = self.rules[testname]
- if statusfile.DoSkip(t.outcomes):
+ outcomes = self.rules[testname]
+ t.outcomes = outcomes # Even for skipped tests, as the TestCase
+ # object stays around and PrintReport() uses it.
+ if statusfile.DoSkip(outcomes):
continue # Don't add skipped tests to |filtered|.
- flaky = statusfile.IsFlaky(t.outcomes)
- skip = False
- for rule in self.wildcards:
- assert rule[-1] == '*'
- if testname.startswith(rule[:-1]):
- used_rules.add(rule)
- t.outcomes = self.wildcards[rule]
- if statusfile.DoSkip(t.outcomes):
- skip = True
- break # "for rule in self.wildcards"
- flaky = flaky or statusfile.IsFlaky(t.outcomes)
- if skip or self._FilterFlaky(flaky, flaky_tests):
- continue # "for t in self.tests"
+ if len(self.wildcards) != 0:
+ skip = False
+ for rule in self.wildcards:
+ assert rule[-1] == '*'
+ if testname.startswith(rule[:-1]):
+ used_rules.add(rule)
+ outcomes = self.wildcards[rule]
+ t.outcomes = outcomes
+ if statusfile.DoSkip(outcomes):
+ skip = True
+ break # "for rule in self.wildcards"
+ if skip: continue # "for t in self.tests"
filtered.append(t)
self.tests = filtered
diff --git a/chromium/v8/tools/testrunner/local/verbose.py b/chromium/v8/tools/testrunner/local/verbose.py
index 00c330d2d9c..f6934675231 100644
--- a/chromium/v8/tools/testrunner/local/verbose.py
+++ b/chromium/v8/tools/testrunner/local/verbose.py
@@ -54,7 +54,7 @@ def PrintReport(tests):
skipped += 1
continue
if statusfile.TIMEOUT in o: timeout += 1
- if statusfile.IsPassOrFail(o): nocrash += 1
+ if statusfile.IsFlaky(o): nocrash += 1
if list(o) == [statusfile.PASS]: passes += 1
if statusfile.IsFailOk(o): fail_ok += 1
if list(o) == [statusfile.FAIL]: fail += 1
diff --git a/chromium/v8/tools/tickprocessor.js b/chromium/v8/tools/tickprocessor.js
index f1a11ccc948..967bd3c5b71 100644
--- a/chromium/v8/tools/tickprocessor.js
+++ b/chromium/v8/tools/tickprocessor.js
@@ -249,8 +249,7 @@ TickProcessor.VmStates = {
GC: 1,
COMPILER: 2,
OTHER: 3,
- EXTERNAL: 4,
- IDLE: 5
+ EXTERNAL: 4
};
diff --git a/chromium/v8/tools/v8heapconst.py b/chromium/v8/tools/v8heapconst.py
deleted file mode 100644
index 57a1f595ace..00000000000
--- a/chromium/v8/tools/v8heapconst.py
+++ /dev/null
@@ -1,255 +0,0 @@
-# Copyright 2013 the V8 project authors. All rights reserved.
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following
-# disclaimer in the documentation and/or other materials provided
-# with the distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived
-# from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# This file is automatically generated from the V8 source and should not
-# be modified manually, run 'make grokdump' instead to update this file.
-
-# List of known V8 instance types.
-INSTANCE_TYPES = {
- 64: "STRING_TYPE",
- 68: "ASCII_STRING_TYPE",
- 65: "CONS_STRING_TYPE",
- 69: "CONS_ASCII_STRING_TYPE",
- 67: "SLICED_STRING_TYPE",
- 71: "SLICED_ASCII_STRING_TYPE",
- 66: "EXTERNAL_STRING_TYPE",
- 70: "EXTERNAL_ASCII_STRING_TYPE",
- 74: "EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE",
- 82: "SHORT_EXTERNAL_STRING_TYPE",
- 86: "SHORT_EXTERNAL_ASCII_STRING_TYPE",
- 90: "SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE",
- 0: "INTERNALIZED_STRING_TYPE",
- 4: "ASCII_INTERNALIZED_STRING_TYPE",
- 1: "CONS_INTERNALIZED_STRING_TYPE",
- 5: "CONS_ASCII_INTERNALIZED_STRING_TYPE",
- 2: "EXTERNAL_INTERNALIZED_STRING_TYPE",
- 6: "EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE",
- 10: "EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE",
- 18: "SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE",
- 22: "SHORT_EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE",
- 26: "SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE",
- 128: "SYMBOL_TYPE",
- 129: "MAP_TYPE",
- 130: "CODE_TYPE",
- 131: "ODDBALL_TYPE",
- 132: "CELL_TYPE",
- 133: "PROPERTY_CELL_TYPE",
- 134: "HEAP_NUMBER_TYPE",
- 135: "FOREIGN_TYPE",
- 136: "BYTE_ARRAY_TYPE",
- 137: "FREE_SPACE_TYPE",
- 138: "EXTERNAL_BYTE_ARRAY_TYPE",
- 139: "EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE",
- 140: "EXTERNAL_SHORT_ARRAY_TYPE",
- 141: "EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE",
- 142: "EXTERNAL_INT_ARRAY_TYPE",
- 143: "EXTERNAL_UNSIGNED_INT_ARRAY_TYPE",
- 144: "EXTERNAL_FLOAT_ARRAY_TYPE",
- 145: "EXTERNAL_DOUBLE_ARRAY_TYPE",
- 146: "EXTERNAL_PIXEL_ARRAY_TYPE",
- 148: "FILLER_TYPE",
- 149: "DECLARED_ACCESSOR_DESCRIPTOR_TYPE",
- 150: "DECLARED_ACCESSOR_INFO_TYPE",
- 151: "EXECUTABLE_ACCESSOR_INFO_TYPE",
- 152: "ACCESSOR_PAIR_TYPE",
- 153: "ACCESS_CHECK_INFO_TYPE",
- 154: "INTERCEPTOR_INFO_TYPE",
- 155: "CALL_HANDLER_INFO_TYPE",
- 156: "FUNCTION_TEMPLATE_INFO_TYPE",
- 157: "OBJECT_TEMPLATE_INFO_TYPE",
- 158: "SIGNATURE_INFO_TYPE",
- 159: "TYPE_SWITCH_INFO_TYPE",
- 161: "ALLOCATION_MEMENTO_TYPE",
- 160: "ALLOCATION_SITE_TYPE",
- 162: "SCRIPT_TYPE",
- 163: "CODE_CACHE_TYPE",
- 164: "POLYMORPHIC_CODE_CACHE_TYPE",
- 165: "TYPE_FEEDBACK_INFO_TYPE",
- 166: "ALIASED_ARGUMENTS_ENTRY_TYPE",
- 167: "BOX_TYPE",
- 170: "FIXED_ARRAY_TYPE",
- 147: "FIXED_DOUBLE_ARRAY_TYPE",
- 171: "SHARED_FUNCTION_INFO_TYPE",
- 172: "JS_MESSAGE_OBJECT_TYPE",
- 175: "JS_VALUE_TYPE",
- 176: "JS_DATE_TYPE",
- 177: "JS_OBJECT_TYPE",
- 178: "JS_CONTEXT_EXTENSION_OBJECT_TYPE",
- 179: "JS_GENERATOR_OBJECT_TYPE",
- 180: "JS_MODULE_TYPE",
- 181: "JS_GLOBAL_OBJECT_TYPE",
- 182: "JS_BUILTINS_OBJECT_TYPE",
- 183: "JS_GLOBAL_PROXY_TYPE",
- 184: "JS_ARRAY_TYPE",
- 185: "JS_ARRAY_BUFFER_TYPE",
- 186: "JS_TYPED_ARRAY_TYPE",
- 187: "JS_DATA_VIEW_TYPE",
- 174: "JS_PROXY_TYPE",
- 188: "JS_SET_TYPE",
- 189: "JS_MAP_TYPE",
- 190: "JS_WEAK_MAP_TYPE",
- 191: "JS_WEAK_SET_TYPE",
- 192: "JS_REGEXP_TYPE",
- 193: "JS_FUNCTION_TYPE",
- 173: "JS_FUNCTION_PROXY_TYPE",
- 168: "DEBUG_INFO_TYPE",
- 169: "BREAK_POINT_INFO_TYPE",
-}
-
-# List of known V8 maps.
-KNOWN_MAPS = {
- 0x08081: (136, "ByteArrayMap"),
- 0x080a9: (129, "MetaMap"),
- 0x080d1: (131, "OddballMap"),
- 0x080f9: (4, "AsciiInternalizedStringMap"),
- 0x08121: (170, "FixedArrayMap"),
- 0x08149: (134, "HeapNumberMap"),
- 0x08171: (137, "FreeSpaceMap"),
- 0x08199: (148, "OnePointerFillerMap"),
- 0x081c1: (148, "TwoPointerFillerMap"),
- 0x081e9: (132, "CellMap"),
- 0x08211: (133, "GlobalPropertyCellMap"),
- 0x08239: (171, "SharedFunctionInfoMap"),
- 0x08261: (170, "NativeContextMap"),
- 0x08289: (130, "CodeMap"),
- 0x082b1: (170, "ScopeInfoMap"),
- 0x082d9: (170, "FixedCOWArrayMap"),
- 0x08301: (147, "FixedDoubleArrayMap"),
- 0x08329: (170, "HashTableMap"),
- 0x08351: (128, "SymbolMap"),
- 0x08379: (64, "StringMap"),
- 0x083a1: (68, "AsciiStringMap"),
- 0x083c9: (65, "ConsStringMap"),
- 0x083f1: (69, "ConsAsciiStringMap"),
- 0x08419: (67, "SlicedStringMap"),
- 0x08441: (71, "SlicedAsciiStringMap"),
- 0x08469: (66, "ExternalStringMap"),
- 0x08491: (74, "ExternalStringWithOneByteDataMap"),
- 0x084b9: (70, "ExternalAsciiStringMap"),
- 0x084e1: (82, "ShortExternalStringMap"),
- 0x08509: (90, "ShortExternalStringWithOneByteDataMap"),
- 0x08531: (0, "InternalizedStringMap"),
- 0x08559: (1, "ConsInternalizedStringMap"),
- 0x08581: (5, "ConsAsciiInternalizedStringMap"),
- 0x085a9: (2, "ExternalInternalizedStringMap"),
- 0x085d1: (10, "ExternalInternalizedStringWithOneByteDataMap"),
- 0x085f9: (6, "ExternalAsciiInternalizedStringMap"),
- 0x08621: (18, "ShortExternalInternalizedStringMap"),
- 0x08649: (26, "ShortExternalInternalizedStringWithOneByteDataMap"),
- 0x08671: (22, "ShortExternalAsciiInternalizedStringMap"),
- 0x08699: (86, "ShortExternalAsciiStringMap"),
- 0x086c1: (64, "UndetectableStringMap"),
- 0x086e9: (68, "UndetectableAsciiStringMap"),
- 0x08711: (138, "ExternalByteArrayMap"),
- 0x08739: (139, "ExternalUnsignedByteArrayMap"),
- 0x08761: (140, "ExternalShortArrayMap"),
- 0x08789: (141, "ExternalUnsignedShortArrayMap"),
- 0x087b1: (142, "ExternalIntArrayMap"),
- 0x087d9: (143, "ExternalUnsignedIntArrayMap"),
- 0x08801: (144, "ExternalFloatArrayMap"),
- 0x08829: (145, "ExternalDoubleArrayMap"),
- 0x08851: (146, "ExternalPixelArrayMap"),
- 0x08879: (170, "NonStrictArgumentsElementsMap"),
- 0x088a1: (170, "FunctionContextMap"),
- 0x088c9: (170, "CatchContextMap"),
- 0x088f1: (170, "WithContextMap"),
- 0x08919: (170, "BlockContextMap"),
- 0x08941: (170, "ModuleContextMap"),
- 0x08969: (170, "GlobalContextMap"),
- 0x08991: (172, "JSMessageObjectMap"),
- 0x089b9: (135, "ForeignMap"),
- 0x089e1: (177, "NeanderMap"),
- 0x08a09: (161, "AllocationMementoMap"),
- 0x08a31: (160, "AllocationSiteMap"),
- 0x08a59: (164, "PolymorphicCodeCacheMap"),
- 0x08a81: (162, "ScriptMap"),
- 0x08ad1: (177, "ExternalMap"),
- 0x08af9: (167, "BoxMap"),
- 0x08b21: (149, "DeclaredAccessorDescriptorMap"),
- 0x08b49: (150, "DeclaredAccessorInfoMap"),
- 0x08b71: (151, "ExecutableAccessorInfoMap"),
- 0x08b99: (152, "AccessorPairMap"),
- 0x08bc1: (153, "AccessCheckInfoMap"),
- 0x08be9: (154, "InterceptorInfoMap"),
- 0x08c11: (155, "CallHandlerInfoMap"),
- 0x08c39: (156, "FunctionTemplateInfoMap"),
- 0x08c61: (157, "ObjectTemplateInfoMap"),
- 0x08c89: (158, "SignatureInfoMap"),
- 0x08cb1: (159, "TypeSwitchInfoMap"),
- 0x08cd9: (163, "CodeCacheMap"),
- 0x08d01: (165, "TypeFeedbackInfoMap"),
- 0x08d29: (166, "AliasedArgumentsEntryMap"),
- 0x08d51: (168, "DebugInfoMap"),
- 0x08d79: (169, "BreakPointInfoMap"),
-}
-
-# List of known V8 objects.
-KNOWN_OBJECTS = {
- ("OLD_POINTER_SPACE", 0x08081): "NullValue",
- ("OLD_POINTER_SPACE", 0x08091): "UndefinedValue",
- ("OLD_POINTER_SPACE", 0x080a1): "TheHoleValue",
- ("OLD_POINTER_SPACE", 0x080b1): "TrueValue",
- ("OLD_POINTER_SPACE", 0x080c1): "FalseValue",
- ("OLD_POINTER_SPACE", 0x080d1): "UninitializedValue",
- ("OLD_POINTER_SPACE", 0x080e1): "NoInterceptorResultSentinel",
- ("OLD_POINTER_SPACE", 0x080f1): "ArgumentsMarker",
- ("OLD_POINTER_SPACE", 0x08101): "NumberStringCache",
- ("OLD_POINTER_SPACE", 0x08909): "SingleCharacterStringCache",
- ("OLD_POINTER_SPACE", 0x08d11): "StringSplitCache",
- ("OLD_POINTER_SPACE", 0x09119): "RegExpMultipleCache",
- ("OLD_POINTER_SPACE", 0x09521): "TerminationException",
- ("OLD_POINTER_SPACE", 0x09531): "MessageListeners",
- ("OLD_POINTER_SPACE", 0x0954d): "CodeStubs",
- ("OLD_POINTER_SPACE", 0x0a9d9): "NonMonomorphicCache",
- ("OLD_POINTER_SPACE", 0x0afed): "PolymorphicCodeCache",
- ("OLD_POINTER_SPACE", 0x0aff5): "NativesSourceCache",
- ("OLD_POINTER_SPACE", 0x0b035): "EmptyScript",
- ("OLD_POINTER_SPACE", 0x0b06d): "IntrinsicFunctionNames",
- ("OLD_POINTER_SPACE", 0x0e089): "ObservationState",
- ("OLD_POINTER_SPACE", 0x0e095): "FrozenSymbol",
- ("OLD_POINTER_SPACE", 0x0e0a1): "ElementsTransitionSymbol",
- ("OLD_POINTER_SPACE", 0x0e0ad): "EmptySlowElementDictionary",
- ("OLD_POINTER_SPACE", 0x0e249): "ObservedSymbol",
- ("OLD_POINTER_SPACE", 0x274e9): "StringTable",
- ("OLD_DATA_SPACE", 0x08099): "EmptyDescriptorArray",
- ("OLD_DATA_SPACE", 0x080a1): "EmptyFixedArray",
- ("OLD_DATA_SPACE", 0x080a9): "NanValue",
- ("OLD_DATA_SPACE", 0x08141): "EmptyByteArray",
- ("OLD_DATA_SPACE", 0x08269): "EmptyExternalByteArray",
- ("OLD_DATA_SPACE", 0x08275): "EmptyExternalUnsignedByteArray",
- ("OLD_DATA_SPACE", 0x08281): "EmptyExternalShortArray",
- ("OLD_DATA_SPACE", 0x0828d): "EmptyExternalUnsignedShortArray",
- ("OLD_DATA_SPACE", 0x08299): "EmptyExternalIntArray",
- ("OLD_DATA_SPACE", 0x082a5): "EmptyExternalUnsignedIntArray",
- ("OLD_DATA_SPACE", 0x082b1): "EmptyExternalFloatArray",
- ("OLD_DATA_SPACE", 0x082bd): "EmptyExternalDoubleArray",
- ("OLD_DATA_SPACE", 0x082c9): "EmptyExternalPixelArray",
- ("OLD_DATA_SPACE", 0x082d5): "InfinityValue",
- ("OLD_DATA_SPACE", 0x082e1): "MinusZeroValue",
- ("CODE_SPACE", 0x10d01): "JsConstructEntryCode",
- ("CODE_SPACE", 0x183c1): "JsEntryCode",
-}
diff --git a/chromium/v8/tools/v8heapconst.py.tmpl b/chromium/v8/tools/v8heapconst.py.tmpl
deleted file mode 100644
index a773f47c8b9..00000000000
--- a/chromium/v8/tools/v8heapconst.py.tmpl
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2013 the V8 project authors. All rights reserved.
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following
-# disclaimer in the documentation and/or other materials provided
-# with the distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived
-# from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# This file is automatically generated from the V8 source and should not
-# be modified manually, run 'make grokdump' instead to update this file.
-
diff --git a/chromium/webkit/browser/fileapi/file_permission_policy.cc b/chromium/webkit/browser/fileapi/file_permission_policy.cc
index 164548791db..6f1a36c3440 100644
--- a/chromium/webkit/browser/fileapi/file_permission_policy.cc
+++ b/chromium/webkit/browser/fileapi/file_permission_policy.cc
@@ -21,14 +21,17 @@ const int kWriteFilePermissions = base::PLATFORM_FILE_OPEN |
const int kCreateFilePermissions = base::PLATFORM_FILE_CREATE;
-const int kOpenFilePermissions = base::PLATFORM_FILE_CREATE |
- base::PLATFORM_FILE_OPEN_ALWAYS |
- base::PLATFORM_FILE_CREATE_ALWAYS |
- base::PLATFORM_FILE_OPEN_TRUNCATED |
- base::PLATFORM_FILE_WRITE |
- base::PLATFORM_FILE_EXCLUSIVE_WRITE |
- base::PLATFORM_FILE_DELETE_ON_CLOSE |
- base::PLATFORM_FILE_WRITE_ATTRIBUTES;
+const int kOpenPepperFilePermissions = base::PLATFORM_FILE_OPEN |
+ base::PLATFORM_FILE_CREATE |
+ base::PLATFORM_FILE_OPEN_ALWAYS |
+ base::PLATFORM_FILE_CREATE_ALWAYS |
+ base::PLATFORM_FILE_OPEN_TRUNCATED |
+ base::PLATFORM_FILE_READ |
+ base::PLATFORM_FILE_WRITE |
+ base::PLATFORM_FILE_APPEND |
+ base::PLATFORM_FILE_EXCLUSIVE_WRITE |
+ base::PLATFORM_FILE_DELETE_ON_CLOSE |
+ base::PLATFORM_FILE_WRITE_ATTRIBUTES;
} // namespace fileapi
diff --git a/chromium/webkit/browser/fileapi/file_permission_policy.h b/chromium/webkit/browser/fileapi/file_permission_policy.h
index 3975c3ccace..5c9ced54e8a 100644
--- a/chromium/webkit/browser/fileapi/file_permission_policy.h
+++ b/chromium/webkit/browser/fileapi/file_permission_policy.h
@@ -12,7 +12,7 @@ namespace fileapi {
WEBKIT_STORAGE_BROWSER_EXPORT extern const int kReadFilePermissions;
WEBKIT_STORAGE_BROWSER_EXPORT extern const int kWriteFilePermissions;
WEBKIT_STORAGE_BROWSER_EXPORT extern const int kCreateFilePermissions;
-WEBKIT_STORAGE_BROWSER_EXPORT extern const int kOpenFilePermissions;
+WEBKIT_STORAGE_BROWSER_EXPORT extern const int kOpenPepperFilePermissions;
enum FilePermissionPolicy {
// Any access should be always denied.
diff --git a/chromium/webkit/browser/fileapi/file_system_context.cc b/chromium/webkit/browser/fileapi/file_system_context.cc
index f2973d35fa2..d43ba8a846e 100644
--- a/chromium/webkit/browser/fileapi/file_system_context.cc
+++ b/chromium/webkit/browser/fileapi/file_system_context.cc
@@ -108,14 +108,14 @@ FileSystemContext::FileSystemContext(
: io_task_runner_(io_task_runner),
default_file_task_runner_(file_task_runner),
quota_manager_proxy_(quota_manager_proxy),
- sandbox_delegate_(new SandboxFileSystemBackendDelegate(
+ sandbox_context_(new SandboxContext(
quota_manager_proxy,
file_task_runner,
partition_path,
special_storage_policy,
options)),
sandbox_backend_(new SandboxFileSystemBackend(
- sandbox_delegate_.get())),
+ sandbox_context_.get())),
isolated_backend_(new IsolatedFileSystemBackend()),
additional_backends_(additional_backends.Pass()),
external_mount_points_(external_mount_points),
diff --git a/chromium/webkit/browser/fileapi/file_system_context.h b/chromium/webkit/browser/fileapi/file_system_context.h
index 528f7a26021..d6934ec7c68 100644
--- a/chromium/webkit/browser/fileapi/file_system_context.h
+++ b/chromium/webkit/browser/fileapi/file_system_context.h
@@ -17,7 +17,7 @@
#include "base/sequenced_task_runner_helpers.h"
#include "webkit/browser/fileapi/file_system_url.h"
#include "webkit/browser/fileapi/open_file_system_mode.h"
-#include "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h"
+#include "webkit/browser/fileapi/sandbox_context.h"
#include "webkit/browser/fileapi/task_runner_bound_observer_list.h"
#include "webkit/browser/webkit_storage_browser_export.h"
#include "webkit/common/fileapi/file_system_types.h"
@@ -228,9 +228,7 @@ class WEBKIT_STORAGE_BROWSER_EXPORT FileSystemContext
void EnableTemporaryFileSystemInIncognito();
#endif
- SandboxFileSystemBackendDelegate* sandbox_delegate() {
- return sandbox_delegate_.get();
- }
+ SandboxContext* sandbox_context() { return sandbox_context_.get(); }
private:
typedef std::map<FileSystemType, FileSystemBackend*>
@@ -285,7 +283,7 @@ class WEBKIT_STORAGE_BROWSER_EXPORT FileSystemContext
scoped_refptr<quota::QuotaManagerProxy> quota_manager_proxy_;
- scoped_ptr<SandboxFileSystemBackendDelegate> sandbox_delegate_;
+ scoped_ptr<SandboxContext> sandbox_context_;
// Regular file system backends.
scoped_ptr<SandboxFileSystemBackend> sandbox_backend_;
diff --git a/chromium/webkit/browser/fileapi/file_system_quota_util.h b/chromium/webkit/browser/fileapi/file_system_quota_util.h
index 5655c990d4d..be98936c2f5 100644
--- a/chromium/webkit/browser/fileapi/file_system_quota_util.h
+++ b/chromium/webkit/browser/fileapi/file_system_quota_util.h
@@ -56,6 +56,11 @@ class WEBKIT_STORAGE_BROWSER_EXPORT FileSystemQuotaUtil {
const GURL& origin_url,
fileapi::FileSystemType type) = 0;
+ virtual void InvalidateUsageCache(const GURL& origin_url,
+ fileapi::FileSystemType type) = 0;
+ virtual void StickyInvalidateUsageCache(const GURL& origin,
+ fileapi::FileSystemType type) = 0;
+
virtual void AddFileUpdateObserver(
FileSystemType type,
FileUpdateObserver* observer,
diff --git a/chromium/webkit/browser/fileapi/obfuscated_file_util.cc b/chromium/webkit/browser/fileapi/obfuscated_file_util.cc
index 7e2f7df12a8..77e2d86a7e7 100644
--- a/chromium/webkit/browser/fileapi/obfuscated_file_util.cc
+++ b/chromium/webkit/browser/fileapi/obfuscated_file_util.cc
@@ -276,7 +276,7 @@ PlatformFileError ObfuscatedFileUtil::CreateOrOpen(
file_flags & base::PLATFORM_FILE_WRITE &&
context->quota_limit_type() == quota::kQuotaLimitTypeUnlimited) {
DCHECK_EQ(base::PLATFORM_FILE_OK, error);
- context->file_system_context()->sandbox_delegate()->
+ context->file_system_context()->GetQuotaUtil(url.type())->
StickyInvalidateUsageCache(url.origin(), url.type());
}
return error;
@@ -1261,7 +1261,7 @@ void ObfuscatedFileUtil::InvalidateUsageCache(
FileSystemOperationContext* context,
const GURL& origin,
FileSystemType type) {
- context->file_system_context()->sandbox_delegate()->
+ context->file_system_context()->GetQuotaUtil(type)->
InvalidateUsageCache(origin, type);
}
diff --git a/chromium/webkit/browser/fileapi/sandbox_file_system_backend_delegate.cc b/chromium/webkit/browser/fileapi/sandbox_context.cc
index 0a6034e7d9a..d8b7293b6a4 100644
--- a/chromium/webkit/browser/fileapi/sandbox_file_system_backend_delegate.cc
+++ b/chromium/webkit/browser/fileapi/sandbox_context.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 "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h"
+#include "webkit/browser/fileapi/sandbox_context.h"
#include "base/command_line.h"
#include "base/file_util.h"
@@ -53,7 +53,7 @@ const base::FilePath::CharType kRestrictedChars[] = {
};
class ObfuscatedOriginEnumerator
- : public SandboxFileSystemBackendDelegate::OriginEnumerator {
+ : public SandboxContext::OriginEnumerator {
public:
explicit ObfuscatedOriginEnumerator(ObfuscatedFileUtil* file_util) {
enum_.reset(file_util->CreateOriginEnumerator());
@@ -94,21 +94,20 @@ void OpenFileSystemOnFileThread(
}
void DidOpenFileSystem(
- base::WeakPtr<SandboxFileSystemBackendDelegate> delegate,
+ base::WeakPtr<SandboxContext> sandbox_context,
const base::Callback<void(base::PlatformFileError error)>& callback,
base::PlatformFileError* error) {
- if (delegate.get())
- delegate.get()->CollectOpenFileSystemMetrics(*error);
+ if (sandbox_context.get())
+ sandbox_context.get()->CollectOpenFileSystemMetrics(*error);
callback.Run(*error);
}
} // namespace
const base::FilePath::CharType
-SandboxFileSystemBackendDelegate::kFileSystemDirectory[] =
- FILE_PATH_LITERAL("File System");
+SandboxContext::kFileSystemDirectory[] = FILE_PATH_LITERAL("File System");
-SandboxFileSystemBackendDelegate::SandboxFileSystemBackendDelegate(
+SandboxContext::SandboxContext(
quota::QuotaManagerProxy* quota_manager_proxy,
base::SequencedTaskRunner* file_task_runner,
const base::FilePath& profile_path,
@@ -124,16 +123,16 @@ SandboxFileSystemBackendDelegate::SandboxFileSystemBackendDelegate(
quota_observer_(new SandboxQuotaObserver(
quota_manager_proxy,
file_task_runner,
- obfuscated_file_util(),
+ sync_file_util(),
usage_cache())),
special_storage_policy_(special_storage_policy),
file_system_options_(file_system_options),
weak_factory_(this) {
}
-SandboxFileSystemBackendDelegate::~SandboxFileSystemBackendDelegate() {
+SandboxContext::~SandboxContext() {
if (!file_task_runner_->RunsTasksOnCurrentThread()) {
- AsyncFileUtil* sandbox_file_util = sandbox_file_util_.release();
+ AsyncFileUtilAdapter* sandbox_file_util = sandbox_file_util_.release();
SandboxQuotaObserver* quota_observer = quota_observer_.release();
FileSystemUsageCache* file_system_usage_cache =
file_system_usage_cache_.release();
@@ -146,8 +145,7 @@ SandboxFileSystemBackendDelegate::~SandboxFileSystemBackendDelegate() {
}
}
-bool SandboxFileSystemBackendDelegate::IsAccessValid(
- const FileSystemURL& url) const {
+bool SandboxContext::IsAccessValid(const FileSystemURL& url) const {
if (!IsAllowedScheme(url.origin()))
return false;
@@ -178,7 +176,7 @@ bool SandboxFileSystemBackendDelegate::IsAccessValid(
return true;
}
-bool SandboxFileSystemBackendDelegate::IsAllowedScheme(const GURL& url) const {
+bool SandboxContext::IsAllowedScheme(const GURL& url) const {
// Basically we only accept http or https. We allow file:// URLs
// only if --allow-file-access-from-files flag is given.
if (url.SchemeIs("http") || url.SchemeIs("https"))
@@ -196,25 +194,21 @@ bool SandboxFileSystemBackendDelegate::IsAllowedScheme(const GURL& url) const {
return false;
}
-SandboxFileSystemBackendDelegate::OriginEnumerator*
-SandboxFileSystemBackendDelegate::CreateOriginEnumerator() {
- return new ObfuscatedOriginEnumerator(obfuscated_file_util());
+SandboxContext::OriginEnumerator* SandboxContext::CreateOriginEnumerator() {
+ return new ObfuscatedOriginEnumerator(sync_file_util());
}
-base::FilePath
-SandboxFileSystemBackendDelegate::GetBaseDirectoryForOriginAndType(
- const GURL& origin_url,
- fileapi::FileSystemType type,
- bool create) {
+base::FilePath SandboxContext::GetBaseDirectoryForOriginAndType(
+ const GURL& origin_url, fileapi::FileSystemType type, bool create) {
base::PlatformFileError error = base::PLATFORM_FILE_OK;
- base::FilePath path = obfuscated_file_util()->GetDirectoryForOriginAndType(
+ base::FilePath path = sync_file_util()->GetDirectoryForOriginAndType(
origin_url, type, create, &error);
if (error != base::PLATFORM_FILE_OK)
return base::FilePath();
return path;
}
-void SandboxFileSystemBackendDelegate::OpenFileSystem(
+void SandboxContext::OpenFileSystem(
const GURL& origin_url,
fileapi::FileSystemType type,
OpenFileSystemMode mode,
@@ -231,7 +225,7 @@ void SandboxFileSystemBackendDelegate::OpenFileSystem(
file_task_runner_->PostTaskAndReply(
FROM_HERE,
base::Bind(&OpenFileSystemOnFileThread,
- obfuscated_file_util(), origin_url, type, mode,
+ sync_file_util(), origin_url, type, mode,
base::Unretained(error_ptr)),
base::Bind(&DidOpenFileSystem,
weak_factory_.GetWeakPtr(),
@@ -239,8 +233,7 @@ void SandboxFileSystemBackendDelegate::OpenFileSystem(
base::Owned(error_ptr)));
}
-base::PlatformFileError
-SandboxFileSystemBackendDelegate::DeleteOriginDataOnFileThread(
+base::PlatformFileError SandboxContext::DeleteOriginDataOnFileThread(
FileSystemContext* file_system_context,
quota::QuotaManagerProxy* proxy,
const GURL& origin_url,
@@ -248,7 +241,7 @@ SandboxFileSystemBackendDelegate::DeleteOriginDataOnFileThread(
int64 usage = GetOriginUsageOnFileThread(
file_system_context, origin_url, type);
usage_cache()->CloseCacheFiles();
- bool result = obfuscated_file_util()->DeleteDirectoryForOriginAndType(
+ bool result = sync_file_util()->DeleteDirectoryForOriginAndType(
origin_url, type);
if (result && proxy) {
proxy->NotifyStorageModified(
@@ -263,7 +256,7 @@ SandboxFileSystemBackendDelegate::DeleteOriginDataOnFileThread(
return base::PLATFORM_FILE_ERROR_FAILED;
}
-void SandboxFileSystemBackendDelegate::GetOriginsForTypeOnFileThread(
+void SandboxContext::GetOriginsForTypeOnFileThread(
fileapi::FileSystemType type, std::set<GURL>* origins) {
DCHECK(origins);
scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator());
@@ -274,7 +267,7 @@ void SandboxFileSystemBackendDelegate::GetOriginsForTypeOnFileThread(
}
}
-void SandboxFileSystemBackendDelegate::GetOriginsForHostOnFileThread(
+void SandboxContext::GetOriginsForHostOnFileThread(
fileapi::FileSystemType type, const std::string& host,
std::set<GURL>* origins) {
DCHECK(origins);
@@ -287,7 +280,7 @@ void SandboxFileSystemBackendDelegate::GetOriginsForHostOnFileThread(
}
}
-int64 SandboxFileSystemBackendDelegate::GetOriginUsageOnFileThread(
+int64 SandboxContext::GetOriginUsageOnFileThread(
FileSystemContext* file_system_context,
const GURL& origin_url,
fileapi::FileSystemType type) {
@@ -325,18 +318,18 @@ int64 SandboxFileSystemBackendDelegate::GetOriginUsageOnFileThread(
return usage;
}
-void SandboxFileSystemBackendDelegate::InvalidateUsageCache(
+void SandboxContext::InvalidateUsageCache(
const GURL& origin,
fileapi::FileSystemType type) {
base::PlatformFileError error = base::PLATFORM_FILE_OK;
base::FilePath usage_file_path = GetUsageCachePathForOriginAndType(
- obfuscated_file_util(), origin, type, &error);
+ sync_file_util(), origin, type, &error);
if (error != base::PLATFORM_FILE_OK)
return;
usage_cache()->IncrementDirty(usage_file_path);
}
-void SandboxFileSystemBackendDelegate::StickyInvalidateUsageCache(
+void SandboxContext::StickyInvalidateUsageCache(
const GURL& origin,
fileapi::FileSystemType type) {
sticky_dirty_origins_.insert(std::make_pair(origin, type));
@@ -344,25 +337,19 @@ void SandboxFileSystemBackendDelegate::StickyInvalidateUsageCache(
InvalidateUsageCache(origin, type);
}
-FileSystemFileUtil* SandboxFileSystemBackendDelegate::sync_file_util() {
- return static_cast<AsyncFileUtilAdapter*>(file_util())->sync_file_util();
-}
-
-base::FilePath
-SandboxFileSystemBackendDelegate::GetUsageCachePathForOriginAndType(
+base::FilePath SandboxContext::GetUsageCachePathForOriginAndType(
const GURL& origin_url,
FileSystemType type) {
base::PlatformFileError error;
base::FilePath path = GetUsageCachePathForOriginAndType(
- obfuscated_file_util(), origin_url, type, &error);
+ sync_file_util(), origin_url, type, &error);
if (error != base::PLATFORM_FILE_OK)
return base::FilePath();
return path;
}
// static
-base::FilePath
-SandboxFileSystemBackendDelegate::GetUsageCachePathForOriginAndType(
+base::FilePath SandboxContext::GetUsageCachePathForOriginAndType(
ObfuscatedFileUtil* sandbox_file_util,
const GURL& origin_url,
fileapi::FileSystemType type,
@@ -376,16 +363,14 @@ SandboxFileSystemBackendDelegate::GetUsageCachePathForOriginAndType(
return base_path.Append(FileSystemUsageCache::kUsageFileName);
}
-int64 SandboxFileSystemBackendDelegate::RecalculateUsage(
- FileSystemContext* context,
- const GURL& origin,
- FileSystemType type) {
+int64 SandboxContext::RecalculateUsage(FileSystemContext* context,
+ const GURL& origin,
+ FileSystemType type) {
FileSystemOperationContext operation_context(context);
FileSystemURL url = context->CreateCrackedFileSystemURL(
origin, type, base::FilePath());
scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> enumerator(
- obfuscated_file_util()->CreateFileEnumerator(
- &operation_context, url, true));
+ sync_file_util()->CreateFileEnumerator(&operation_context, url, true));
base::FilePath file_path_each;
int64 usage = 0;
@@ -398,7 +383,7 @@ int64 SandboxFileSystemBackendDelegate::RecalculateUsage(
return usage;
}
-void SandboxFileSystemBackendDelegate::CollectOpenFileSystemMetrics(
+void SandboxContext::CollectOpenFileSystemMetrics(
base::PlatformFileError error_code) {
base::Time now = base::Time::Now();
bool throttled = now < next_release_time_for_open_filesystem_stat_;
@@ -435,8 +420,8 @@ void SandboxFileSystemBackendDelegate::CollectOpenFileSystemMetrics(
#undef REPORT
}
-ObfuscatedFileUtil* SandboxFileSystemBackendDelegate::obfuscated_file_util() {
- return static_cast<ObfuscatedFileUtil*>(sync_file_util());
+ObfuscatedFileUtil* SandboxContext::sync_file_util() {
+ return static_cast<ObfuscatedFileUtil*>(file_util()->sync_file_util());
}
} // namespace fileapi
diff --git a/chromium/webkit/browser/fileapi/sandbox_file_system_backend_delegate.h b/chromium/webkit/browser/fileapi/sandbox_context.h
index 5fb83f082b9..c765077b8d3 100644
--- a/chromium/webkit/browser/fileapi/sandbox_file_system_backend_delegate.h
+++ b/chromium/webkit/browser/fileapi/sandbox_context.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 WEBKIT_BROWSER_FILEAPI_SANDBOX_FILE_SYSTEM_BACKEND_DELEGATE_H_
-#define WEBKIT_BROWSER_FILEAPI_SANDBOX_FILE_SYSTEM_BACKEND_DELEGATE_H_
+#ifndef WEBKIT_BROWSER_FILEAPI_SANDBOX_CONTEXT_H_
+#define WEBKIT_BROWSER_FILEAPI_SANDBOX_CONTEXT_H_
#include <set>
#include <string>
@@ -30,8 +30,7 @@ class SpecialStoragePolicy;
namespace fileapi {
-class AsyncFileUtil;
-class FileSystemFileUtil;
+class AsyncFileUtilAdapter;
class FileSystemURL;
class FileSystemUsageCache;
class ObfuscatedFileUtil;
@@ -39,9 +38,9 @@ class SandboxFileSystemBackend;
class SandboxFileSystemTestHelper;
class SandboxQuotaObserver;
-// Delegate implementation of the some methods in Sandbox/SyncFileSystemBackend.
+// This class keeps and provides a sandbox file system context.
// An instance of this class is created and owned by FileSystemContext.
-class WEBKIT_STORAGE_BROWSER_EXPORT SandboxFileSystemBackendDelegate {
+class WEBKIT_STORAGE_BROWSER_EXPORT SandboxContext {
public:
typedef FileSystemBackend::OpenFileSystemCallback OpenFileSystemCallback;
@@ -61,14 +60,14 @@ class WEBKIT_STORAGE_BROWSER_EXPORT SandboxFileSystemBackendDelegate {
virtual bool HasFileSystemType(FileSystemType type) const = 0;
};
- SandboxFileSystemBackendDelegate(
+ SandboxContext(
quota::QuotaManagerProxy* quota_manager_proxy,
base::SequencedTaskRunner* file_task_runner,
const base::FilePath& profile_path,
quota::SpecialStoragePolicy* special_storage_policy,
const FileSystemOptions& file_system_options);
- ~SandboxFileSystemBackendDelegate();
+ ~SandboxContext();
// Performs API-specific validity checks on the given path |url|.
// Returns true if access to |url| is valid in this filesystem.
@@ -131,7 +130,7 @@ class WEBKIT_STORAGE_BROWSER_EXPORT SandboxFileSystemBackendDelegate {
return file_task_runner_.get();
}
- AsyncFileUtil* file_util() { return sandbox_file_util_.get(); }
+ AsyncFileUtilAdapter* file_util() { return sandbox_file_util_.get(); }
FileSystemUsageCache* usage_cache() { return file_system_usage_cache_.get(); }
SandboxQuotaObserver* quota_observer() { return quota_observer_.get(); };
@@ -139,11 +138,9 @@ class WEBKIT_STORAGE_BROWSER_EXPORT SandboxFileSystemBackendDelegate {
return special_storage_policy_.get();
}
- const FileSystemOptions& file_system_options() const {
- return file_system_options_;
- }
+ FileSystemOptions file_system_options() { return file_system_options_; }
- FileSystemFileUtil* sync_file_util();
+ ObfuscatedFileUtil* sync_file_util();
private:
friend class SandboxQuotaObserver;
@@ -165,11 +162,9 @@ class WEBKIT_STORAGE_BROWSER_EXPORT SandboxFileSystemBackendDelegate {
const GURL& origin,
FileSystemType type);
- ObfuscatedFileUtil* obfuscated_file_util();
-
scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
- scoped_ptr<AsyncFileUtil> sandbox_file_util_;
+ scoped_ptr<AsyncFileUtilAdapter> sandbox_file_util_;
scoped_ptr<FileSystemUsageCache> file_system_usage_cache_;
scoped_ptr<SandboxQuotaObserver> quota_observer_;
@@ -184,11 +179,11 @@ class WEBKIT_STORAGE_BROWSER_EXPORT SandboxFileSystemBackendDelegate {
base::Time next_release_time_for_open_filesystem_stat_;
- base::WeakPtrFactory<SandboxFileSystemBackendDelegate> weak_factory_;
+ base::WeakPtrFactory<SandboxContext> weak_factory_;
- DISALLOW_COPY_AND_ASSIGN(SandboxFileSystemBackendDelegate);
+ DISALLOW_COPY_AND_ASSIGN(SandboxContext);
};
} // namespace fileapi
-#endif // WEBKIT_BROWSER_FILEAPI_SANDBOX_FILE_SYSTEM_BACKEND_DELEGATE_H_
+#endif // WEBKIT_BROWSER_FILEAPI_SANDBOX_CONTEXT_H_
diff --git a/chromium/webkit/browser/fileapi/sandbox_file_system_backend_delegate_unittest.cc b/chromium/webkit/browser/fileapi/sandbox_context_unittest.cc
index 48c3b8c4e70..841e10b5b83 100644
--- a/chromium/webkit/browser/fileapi/sandbox_file_system_backend_delegate_unittest.cc
+++ b/chromium/webkit/browser/fileapi/sandbox_context_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 "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h"
+#include "webkit/browser/fileapi/sandbox_context.h"
#include "base/basictypes.h"
#include "base/file_util.h"
@@ -27,11 +27,11 @@ FileSystemURL CreateFileSystemURL(const char* path) {
} // namespace
-class SandboxFileSystemBackendDelegateTest : public testing::Test {
+class SandboxContextTest : public testing::Test {
protected:
virtual void SetUp() {
ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
- delegate_.reset(new SandboxFileSystemBackendDelegate(
+ context_.reset(new SandboxContext(
NULL /* quota_manager_proxy */,
base::MessageLoopProxy::current().get(),
data_dir_.path(),
@@ -41,42 +41,42 @@ class SandboxFileSystemBackendDelegateTest : public testing::Test {
base::ScopedTempDir data_dir_;
base::MessageLoop message_loop_;
- scoped_ptr<SandboxFileSystemBackendDelegate> delegate_;
+ scoped_ptr<SandboxContext> context_;
};
-TEST_F(SandboxFileSystemBackendDelegateTest, IsAccessValid) {
+TEST_F(SandboxContextTest, IsAccessValid) {
// Normal case.
- EXPECT_TRUE(delegate_->IsAccessValid(CreateFileSystemURL("a")));
+ EXPECT_TRUE(context_->IsAccessValid(CreateFileSystemURL("a")));
// Access to a path with parent references ('..') should be disallowed.
- EXPECT_FALSE(delegate_->IsAccessValid(CreateFileSystemURL("a/../b")));
+ EXPECT_FALSE(context_->IsAccessValid(CreateFileSystemURL("a/../b")));
// Access from non-allowed scheme should be disallowed.
- EXPECT_FALSE(delegate_->IsAccessValid(
+ EXPECT_FALSE(context_->IsAccessValid(
FileSystemURL::CreateForTest(
GURL("unknown://bar"), kFileSystemTypeTemporary,
base::FilePath::FromUTF8Unsafe("foo"))));
// Access with restricted name should be disallowed.
- EXPECT_FALSE(delegate_->IsAccessValid(CreateFileSystemURL(".")));
- EXPECT_FALSE(delegate_->IsAccessValid(CreateFileSystemURL("..")));
+ EXPECT_FALSE(context_->IsAccessValid(CreateFileSystemURL(".")));
+ EXPECT_FALSE(context_->IsAccessValid(CreateFileSystemURL("..")));
// This is also disallowed due to Windows XP parent path handling.
- EXPECT_FALSE(delegate_->IsAccessValid(CreateFileSystemURL("...")));
+ EXPECT_FALSE(context_->IsAccessValid(CreateFileSystemURL("...")));
// These are identified as unsafe cases due to weird path handling
// on Windows.
- EXPECT_FALSE(delegate_->IsAccessValid(CreateFileSystemURL(" ..")));
- EXPECT_FALSE(delegate_->IsAccessValid(CreateFileSystemURL(".. ")));
+ EXPECT_FALSE(context_->IsAccessValid(CreateFileSystemURL(" ..")));
+ EXPECT_FALSE(context_->IsAccessValid(CreateFileSystemURL(".. ")));
// Similar but safe cases.
- EXPECT_TRUE(delegate_->IsAccessValid(CreateFileSystemURL(" .")));
- EXPECT_TRUE(delegate_->IsAccessValid(CreateFileSystemURL(". ")));
- EXPECT_TRUE(delegate_->IsAccessValid(CreateFileSystemURL("b.")));
- EXPECT_TRUE(delegate_->IsAccessValid(CreateFileSystemURL(".b")));
+ EXPECT_TRUE(context_->IsAccessValid(CreateFileSystemURL(" .")));
+ EXPECT_TRUE(context_->IsAccessValid(CreateFileSystemURL(". ")));
+ EXPECT_TRUE(context_->IsAccessValid(CreateFileSystemURL("b.")));
+ EXPECT_TRUE(context_->IsAccessValid(CreateFileSystemURL(".b")));
// A path that looks like a drive letter.
- EXPECT_TRUE(delegate_->IsAccessValid(CreateFileSystemURL("c:")));
+ EXPECT_TRUE(context_->IsAccessValid(CreateFileSystemURL("c:")));
}
} // namespace fileapi
diff --git a/chromium/webkit/browser/fileapi/sandbox_directory_database.cc b/chromium/webkit/browser/fileapi/sandbox_directory_database.cc
index 24790b15e31..8a90bd33479 100644
--- a/chromium/webkit/browser/fileapi/sandbox_directory_database.cc
+++ b/chromium/webkit/browser/fileapi/sandbox_directory_database.cc
@@ -715,7 +715,7 @@ bool SandboxDirectoryDatabase::Init(RecoveryOption recovery_option) {
FilePathToString(filesystem_data_directory_.Append(
kDirectoryDatabaseName));
leveldb::Options options;
- options.max_open_files = 0; // Use minimum.
+ options.max_open_files = 64; // Use minimum.
options.create_if_missing = true;
leveldb::DB* db;
leveldb::Status status = leveldb::DB::Open(options, path, &db);
@@ -763,7 +763,7 @@ bool SandboxDirectoryDatabase::Init(RecoveryOption recovery_option) {
bool SandboxDirectoryDatabase::RepairDatabase(const std::string& db_path) {
DCHECK(!db_.get());
leveldb::Options options;
- options.max_open_files = 0; // Use minimum.
+ options.max_open_files = 64; // Use minimum.
if (!leveldb::RepairDB(db_path, options).ok())
return false;
if (!Init(FAIL_ON_CORRUPTION))
diff --git a/chromium/webkit/browser/fileapi/sandbox_file_system_backend.cc b/chromium/webkit/browser/fileapi/sandbox_file_system_backend.cc
index 665c0f1f798..20f732989d4 100644
--- a/chromium/webkit/browser/fileapi/sandbox_file_system_backend.cc
+++ b/chromium/webkit/browser/fileapi/sandbox_file_system_backend.cc
@@ -19,8 +19,8 @@
#include "webkit/browser/fileapi/file_system_options.h"
#include "webkit/browser/fileapi/file_system_usage_cache.h"
#include "webkit/browser/fileapi/obfuscated_file_util.h"
+#include "webkit/browser/fileapi/sandbox_context.h"
#include "webkit/browser/fileapi/sandbox_file_stream_writer.h"
-#include "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h"
#include "webkit/browser/fileapi/sandbox_quota_observer.h"
#include "webkit/browser/quota/quota_manager.h"
#include "webkit/common/fileapi/file_system_types.h"
@@ -39,8 +39,8 @@ const char kPersistentOriginsCountLabel[] = "FileSystem.PersistentOriginsCount";
} // anonymous namespace
SandboxFileSystemBackend::SandboxFileSystemBackend(
- SandboxFileSystemBackendDelegate* delegate)
- : delegate_(delegate),
+ SandboxContext* sandbox_context)
+ : sandbox_context_(sandbox_context),
enable_temporary_file_system_in_incognito_(false) {
}
@@ -55,10 +55,10 @@ bool SandboxFileSystemBackend::CanHandleType(FileSystemType type) const {
void SandboxFileSystemBackend::Initialize(FileSystemContext* context) {
// Set quota observers.
update_observers_ = update_observers_.AddObserver(
- delegate_->quota_observer(),
- delegate_->file_task_runner());
+ sandbox_context_->quota_observer(),
+ sandbox_context_->file_task_runner());
access_observers_ = access_observers_.AddObserver(
- delegate_->quota_observer(), NULL);
+ sandbox_context_->quota_observer(), NULL);
}
void SandboxFileSystemBackend::OpenFileSystem(
@@ -67,8 +67,8 @@ void SandboxFileSystemBackend::OpenFileSystem(
OpenFileSystemMode mode,
const OpenFileSystemCallback& callback) {
DCHECK(CanHandleType(type));
- DCHECK(delegate_);
- if (delegate_->file_system_options().is_incognito() &&
+ DCHECK(sandbox_context_);
+ if (sandbox_context_->file_system_options().is_incognito() &&
!(type == kFileSystemTypeTemporary &&
enable_temporary_file_system_in_incognito_)) {
// TODO(kinuko): return an isolated temporary directory.
@@ -76,20 +76,20 @@ void SandboxFileSystemBackend::OpenFileSystem(
return;
}
- delegate_->OpenFileSystem(
+ sandbox_context_->OpenFileSystem(
origin_url, type, mode, callback,
GetFileSystemRootURI(origin_url, type));
}
FileSystemFileUtil* SandboxFileSystemBackend::GetFileUtil(
FileSystemType type) {
- return delegate_->sync_file_util();
+ return sandbox_context_->sync_file_util();
}
AsyncFileUtil* SandboxFileSystemBackend::GetAsyncFileUtil(
FileSystemType type) {
- DCHECK(delegate_);
- return delegate_->file_util();
+ DCHECK(sandbox_context_);
+ return sandbox_context_->file_util();
}
CopyOrMoveFileValidatorFactory*
@@ -106,8 +106,8 @@ FileSystemOperation* SandboxFileSystemBackend::CreateFileSystemOperation(
FileSystemContext* context,
base::PlatformFileError* error_code) const {
DCHECK(CanHandleType(url.type()));
- DCHECK(delegate_);
- if (!delegate_->IsAccessValid(url)) {
+ DCHECK(sandbox_context_);
+ if (!sandbox_context_->IsAccessValid(url)) {
*error_code = base::PLATFORM_FILE_ERROR_SECURITY;
return NULL;
}
@@ -117,7 +117,7 @@ FileSystemOperation* SandboxFileSystemBackend::CreateFileSystemOperation(
operation_context->set_update_observers(update_observers_);
operation_context->set_change_observers(change_observers_);
- SpecialStoragePolicy* policy = delegate_->special_storage_policy();
+ SpecialStoragePolicy* policy = sandbox_context_->special_storage_policy();
if (policy && policy->IsStorageUnlimited(url.origin()))
operation_context->set_quota_limit_type(quota::kQuotaLimitTypeUnlimited);
else
@@ -133,8 +133,8 @@ SandboxFileSystemBackend::CreateFileStreamReader(
const base::Time& expected_modification_time,
FileSystemContext* context) const {
DCHECK(CanHandleType(url.type()));
- DCHECK(delegate_);
- if (!delegate_->IsAccessValid(url))
+ DCHECK(sandbox_context_);
+ if (!sandbox_context_->IsAccessValid(url))
return scoped_ptr<webkit_blob::FileStreamReader>();
return scoped_ptr<webkit_blob::FileStreamReader>(
new FileSystemFileStreamReader(
@@ -147,8 +147,8 @@ SandboxFileSystemBackend::CreateFileStreamWriter(
int64 offset,
FileSystemContext* context) const {
DCHECK(CanHandleType(url.type()));
- DCHECK(delegate_);
- if (!delegate_->IsAccessValid(url))
+ DCHECK(sandbox_context_);
+ if (!sandbox_context_->IsAccessValid(url))
return scoped_ptr<fileapi::FileStreamWriter>();
return scoped_ptr<fileapi::FileStreamWriter>(
new SandboxFileStreamWriter(context, url, offset, update_observers_));
@@ -158,10 +158,10 @@ FileSystemQuotaUtil* SandboxFileSystemBackend::GetQuotaUtil() {
return this;
}
-SandboxFileSystemBackendDelegate::OriginEnumerator*
+SandboxContext::OriginEnumerator*
SandboxFileSystemBackend::CreateOriginEnumerator() {
- DCHECK(delegate_);
- return delegate_->CreateOriginEnumerator();
+ DCHECK(sandbox_context_);
+ return sandbox_context_->CreateOriginEnumerator();
}
base::PlatformFileError
@@ -171,16 +171,16 @@ SandboxFileSystemBackend::DeleteOriginDataOnFileThread(
const GURL& origin_url,
fileapi::FileSystemType type) {
DCHECK(CanHandleType(type));
- DCHECK(delegate_);
- return delegate_->DeleteOriginDataOnFileThread(
+ DCHECK(sandbox_context_);
+ return sandbox_context_->DeleteOriginDataOnFileThread(
file_system_context, proxy, origin_url, type);
}
void SandboxFileSystemBackend::GetOriginsForTypeOnFileThread(
fileapi::FileSystemType type, std::set<GURL>* origins) {
DCHECK(CanHandleType(type));
- DCHECK(delegate_);
- delegate_->GetOriginsForTypeOnFileThread(type, origins);
+ DCHECK(sandbox_context_);
+ sandbox_context_->GetOriginsForTypeOnFileThread(type, origins);
switch (type) {
case kFileSystemTypeTemporary:
UMA_HISTOGRAM_COUNTS(kTemporaryOriginsCountLabel, origins->size());
@@ -197,8 +197,8 @@ void SandboxFileSystemBackend::GetOriginsForHostOnFileThread(
fileapi::FileSystemType type, const std::string& host,
std::set<GURL>* origins) {
DCHECK(CanHandleType(type));
- DCHECK(delegate_);
- delegate_->GetOriginsForHostOnFileThread(type, host, origins);
+ DCHECK(sandbox_context_);
+ sandbox_context_->GetOriginsForHostOnFileThread(type, host, origins);
}
int64 SandboxFileSystemBackend::GetOriginUsageOnFileThread(
@@ -206,11 +206,27 @@ int64 SandboxFileSystemBackend::GetOriginUsageOnFileThread(
const GURL& origin_url,
fileapi::FileSystemType type) {
DCHECK(CanHandleType(type));
- DCHECK(delegate_);
- return delegate_->GetOriginUsageOnFileThread(
+ DCHECK(sandbox_context_);
+ return sandbox_context_->GetOriginUsageOnFileThread(
file_system_context, origin_url, type);
}
+void SandboxFileSystemBackend::InvalidateUsageCache(
+ const GURL& origin,
+ fileapi::FileSystemType type) {
+ DCHECK(CanHandleType(type));
+ DCHECK(sandbox_context_);
+ sandbox_context_->InvalidateUsageCache(origin, type);
+}
+
+void SandboxFileSystemBackend::StickyInvalidateUsageCache(
+ const GURL& origin,
+ fileapi::FileSystemType type) {
+ DCHECK(CanHandleType(type));
+ DCHECK(sandbox_context_);
+ sandbox_context_->StickyInvalidateUsageCache(origin, type);
+}
+
void SandboxFileSystemBackend::AddFileUpdateObserver(
FileSystemType type,
FileUpdateObserver* observer,
diff --git a/chromium/webkit/browser/fileapi/sandbox_file_system_backend.h b/chromium/webkit/browser/fileapi/sandbox_file_system_backend.h
index a1a568637a0..3e7ff60b529 100644
--- a/chromium/webkit/browser/fileapi/sandbox_file_system_backend.h
+++ b/chromium/webkit/browser/fileapi/sandbox_file_system_backend.h
@@ -14,7 +14,7 @@
#include "base/memory/scoped_ptr.h"
#include "webkit/browser/fileapi/file_system_backend.h"
#include "webkit/browser/fileapi/file_system_quota_util.h"
-#include "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h"
+#include "webkit/browser/fileapi/sandbox_context.h"
#include "webkit/browser/fileapi/task_runner_bound_observer_list.h"
#include "webkit/browser/quota/special_storage_policy.h"
#include "webkit/browser/webkit_storage_browser_export.h"
@@ -30,7 +30,7 @@ class WEBKIT_STORAGE_BROWSER_EXPORT SandboxFileSystemBackend
: public FileSystemBackend,
public FileSystemQuotaUtil {
public:
- explicit SandboxFileSystemBackend(SandboxFileSystemBackendDelegate* delegate);
+ explicit SandboxFileSystemBackend(SandboxContext* sandbox_context);
virtual ~SandboxFileSystemBackend();
// FileSystemBackend overrides.
@@ -63,7 +63,7 @@ class WEBKIT_STORAGE_BROWSER_EXPORT SandboxFileSystemBackend
// Returns an origin enumerator of this backend.
// This method can only be called on the file thread.
- SandboxFileSystemBackendDelegate::OriginEnumerator* CreateOriginEnumerator();
+ SandboxContext::OriginEnumerator* CreateOriginEnumerator();
// FileSystemQuotaUtil overrides.
virtual base::PlatformFileError DeleteOriginDataOnFileThread(
@@ -82,6 +82,12 @@ class WEBKIT_STORAGE_BROWSER_EXPORT SandboxFileSystemBackend
FileSystemContext* context,
const GURL& origin_url,
FileSystemType type) OVERRIDE;
+ virtual void InvalidateUsageCache(
+ const GURL& origin_url,
+ FileSystemType type) OVERRIDE;
+ virtual void StickyInvalidateUsageCache(
+ const GURL& origin_url,
+ FileSystemType type) OVERRIDE;
virtual void AddFileUpdateObserver(
FileSystemType type,
FileUpdateObserver* observer,
@@ -106,7 +112,7 @@ class WEBKIT_STORAGE_BROWSER_EXPORT SandboxFileSystemBackend
}
private:
- SandboxFileSystemBackendDelegate* delegate_; // Not owned.
+ SandboxContext* sandbox_context_; // Not owned.
bool enable_temporary_file_system_in_incognito_;
diff --git a/chromium/webkit/browser/fileapi/sandbox_file_system_backend_unittest.cc b/chromium/webkit/browser/fileapi/sandbox_file_system_backend_unittest.cc
index c7f03170e42..ec213a36386 100644
--- a/chromium/webkit/browser/fileapi/sandbox_file_system_backend_unittest.cc
+++ b/chromium/webkit/browser/fileapi/sandbox_file_system_backend_unittest.cc
@@ -17,7 +17,7 @@
#include "webkit/browser/fileapi/file_system_backend.h"
#include "webkit/browser/fileapi/file_system_url.h"
#include "webkit/browser/fileapi/mock_file_system_options.h"
-#include "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h"
+#include "webkit/browser/fileapi/sandbox_context.h"
#include "webkit/common/fileapi/file_system_util.h"
// PS stands for path separator.
@@ -85,11 +85,11 @@ class SandboxFileSystemBackendTest : public testing::Test {
protected:
virtual void SetUp() {
ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
- SetUpNewDelegate(CreateAllowFileAccessOptions());
+ SetUpNewSandboxContext(CreateAllowFileAccessOptions());
}
- void SetUpNewDelegate(const FileSystemOptions& options) {
- delegate_.reset(new SandboxFileSystemBackendDelegate(
+ void SetUpNewSandboxContext(const FileSystemOptions& options) {
+ context_.reset(new SandboxContext(
NULL /* quota_manager_proxy */,
base::MessageLoopProxy::current().get(),
data_dir_.path(),
@@ -98,18 +98,17 @@ class SandboxFileSystemBackendTest : public testing::Test {
}
void SetUpNewBackend(const FileSystemOptions& options) {
- SetUpNewDelegate(options);
- backend_.reset(new SandboxFileSystemBackend(delegate_.get()));
+ SetUpNewSandboxContext(options);
+ backend_.reset(new SandboxFileSystemBackend(context_.get()));
}
- SandboxFileSystemBackendDelegate::OriginEnumerator*
- CreateOriginEnumerator() const {
+ SandboxContext::OriginEnumerator* CreateOriginEnumerator() const {
return backend_->CreateOriginEnumerator();
}
void CreateOriginTypeDirectory(const GURL& origin,
fileapi::FileSystemType type) {
- base::FilePath target = delegate_->
+ base::FilePath target = context_->
GetBaseDirectoryForOriginAndType(origin, type, true);
ASSERT_TRUE(!target.empty());
ASSERT_TRUE(base::DirectoryExists(target));
@@ -127,7 +126,7 @@ class SandboxFileSystemBackendTest : public testing::Test {
if (error != base::PLATFORM_FILE_OK)
return false;
base::FilePath returned_root_path =
- delegate_->GetBaseDirectoryForOriginAndType(
+ context_->GetBaseDirectoryForOriginAndType(
origin_url, type, false /* create */);
if (root_path)
*root_path = returned_root_path;
@@ -135,19 +134,18 @@ class SandboxFileSystemBackendTest : public testing::Test {
}
base::FilePath file_system_path() const {
- return data_dir_.path().Append(
- SandboxFileSystemBackendDelegate::kFileSystemDirectory);
+ return data_dir_.path().Append(SandboxContext::kFileSystemDirectory);
}
base::ScopedTempDir data_dir_;
base::MessageLoop message_loop_;
- scoped_ptr<SandboxFileSystemBackendDelegate> delegate_;
+ scoped_ptr<SandboxContext> context_;
scoped_ptr<SandboxFileSystemBackend> backend_;
};
TEST_F(SandboxFileSystemBackendTest, Empty) {
SetUpNewBackend(CreateAllowFileAccessOptions());
- scoped_ptr<SandboxFileSystemBackendDelegate::OriginEnumerator> enumerator(
+ scoped_ptr<SandboxContext::OriginEnumerator> enumerator(
CreateOriginEnumerator());
ASSERT_TRUE(enumerator->Next().is_empty());
}
@@ -180,7 +178,7 @@ TEST_F(SandboxFileSystemBackendTest, EnumerateOrigins) {
persistent_set.insert(GURL(persistent_origins[i]));
}
- scoped_ptr<SandboxFileSystemBackendDelegate::OriginEnumerator> enumerator(
+ scoped_ptr<SandboxContext::OriginEnumerator> enumerator(
CreateOriginEnumerator());
size_t temporary_actual_size = 0;
size_t persistent_actual_size = 0;
diff --git a/chromium/webkit/browser/fileapi/sandbox_file_system_test_helper.cc b/chromium/webkit/browser/fileapi/sandbox_file_system_test_helper.cc
index 97d7a5f2e4a..179bf9b2c1a 100644
--- a/chromium/webkit/browser/fileapi/sandbox_file_system_test_helper.cc
+++ b/chromium/webkit/browser/fileapi/sandbox_file_system_test_helper.cc
@@ -61,7 +61,7 @@ void SandboxFileSystemTestHelper::TearDown() {
}
base::FilePath SandboxFileSystemTestHelper::GetOriginRootPath() {
- return file_system_context_->sandbox_delegate()->
+ return file_system_context_->sandbox_context()->
GetBaseDirectoryForOriginAndType(origin_, type_, false);
}
@@ -80,8 +80,8 @@ base::FilePath SandboxFileSystemTestHelper::GetLocalPathFromASCII(
}
base::FilePath SandboxFileSystemTestHelper::GetUsageCachePath() const {
- return file_system_context_->sandbox_delegate()->
- GetUsageCachePathForOriginAndType(origin_, type_);
+ return file_system_context_->
+ sandbox_context()->GetUsageCachePathForOriginAndType(origin_, type_);
}
FileSystemURL SandboxFileSystemTestHelper::CreateURL(
@@ -129,7 +129,7 @@ void SandboxFileSystemTestHelper::AddFileChangeObserver(
}
FileSystemUsageCache* SandboxFileSystemTestHelper::usage_cache() {
- return file_system_context()->sandbox_delegate()->usage_cache();
+ return file_system_context()->sandbox_context()->usage_cache();
}
void SandboxFileSystemTestHelper::SetUpFileSystem() {
@@ -140,7 +140,7 @@ void SandboxFileSystemTestHelper::SetUpFileSystem() {
DCHECK(file_util_);
// Prepare the origin's root directory.
- file_system_context_->sandbox_delegate()->
+ file_system_context_->sandbox_context()->
GetBaseDirectoryForOriginAndType(origin_, type_, true /* create */);
// Initialize the usage cache file.
diff --git a/chromium/webkit/browser/fileapi/sandbox_origin_database.cc b/chromium/webkit/browser/fileapi/sandbox_origin_database.cc
index 4ce83017cc0..9ca399673fd 100644
--- a/chromium/webkit/browser/fileapi/sandbox_origin_database.cc
+++ b/chromium/webkit/browser/fileapi/sandbox_origin_database.cc
@@ -76,7 +76,7 @@ bool SandboxOriginDatabase::Init(InitOption init_option,
std::string path = FilePathToString(db_path);
leveldb::Options options;
- options.max_open_files = 0; // Use minimum.
+ options.max_open_files = 64; // Use minimum.
options.create_if_missing = true;
leveldb::DB* db;
leveldb::Status status = leveldb::DB::Open(options, path, &db);
@@ -122,7 +122,7 @@ bool SandboxOriginDatabase::Init(InitOption init_option,
bool SandboxOriginDatabase::RepairDatabase(const std::string& db_path) {
DCHECK(!db_.get());
leveldb::Options options;
- options.max_open_files = 0; // Use minimum.
+ options.max_open_files = 64; // Use minimum.
if (!leveldb::RepairDB(db_path, options).ok() ||
!Init(FAIL_IF_NONEXISTENT, FAIL_ON_CORRUPTION)) {
LOG(WARNING) << "Failed to repair SandboxOriginDatabase.";
diff --git a/chromium/webkit/browser/fileapi/sandbox_quota_observer.cc b/chromium/webkit/browser/fileapi/sandbox_quota_observer.cc
index fe5ee3796fb..02a47ee255c 100644
--- a/chromium/webkit/browser/fileapi/sandbox_quota_observer.cc
+++ b/chromium/webkit/browser/fileapi/sandbox_quota_observer.cc
@@ -7,7 +7,7 @@
#include "base/sequenced_task_runner.h"
#include "webkit/browser/fileapi/file_system_url.h"
#include "webkit/browser/fileapi/file_system_usage_cache.h"
-#include "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h"
+#include "webkit/browser/fileapi/sandbox_context.h"
#include "webkit/browser/fileapi/timed_task_helper.h"
#include "webkit/browser/quota/quota_client.h"
#include "webkit/browser/quota/quota_manager.h"
@@ -107,7 +107,7 @@ base::FilePath SandboxQuotaObserver::GetUsageCachePath(
DCHECK(sandbox_file_util_);
base::PlatformFileError error = base::PLATFORM_FILE_OK;
base::FilePath path =
- SandboxFileSystemBackendDelegate::GetUsageCachePathForOriginAndType(
+ SandboxContext::GetUsageCachePathForOriginAndType(
sandbox_file_util_, url.origin(), url.type(), &error);
if (error != base::PLATFORM_FILE_OK) {
LOG(WARNING) << "Could not get usage cache path for: "
diff --git a/chromium/webkit/browser/fileapi/test_file_system_backend.cc b/chromium/webkit/browser/fileapi/test_file_system_backend.cc
index 1cff5c2fb14..584e2e3a10d 100644
--- a/chromium/webkit/browser/fileapi/test_file_system_backend.cc
+++ b/chromium/webkit/browser/fileapi/test_file_system_backend.cc
@@ -66,6 +66,17 @@ class TestFileSystemBackend::QuotaUtil
return usage_;
}
+ virtual void InvalidateUsageCache(const GURL& origin_url,
+ FileSystemType type) OVERRIDE {
+ // Do nothing.
+ }
+
+ virtual void StickyInvalidateUsageCache(
+ const GURL& origin,
+ FileSystemType type) OVERRIDE {
+ // Do nothing.
+ }
+
virtual void AddFileUpdateObserver(
FileSystemType type,
FileUpdateObserver* observer,
diff --git a/chromium/webkit/common/gpu/context_provider_in_process.cc b/chromium/webkit/common/gpu/context_provider_in_process.cc
index 1e42ab04d6b..e56da80fd0a 100644
--- a/chromium/webkit/common/gpu/context_provider_in_process.cc
+++ b/chromium/webkit/common/gpu/context_provider_in_process.cc
@@ -4,7 +4,6 @@
#include "webkit/common/gpu/context_provider_in_process.h"
-#include "base/bind.h"
#include "base/callback_helpers.h"
#include "webkit/common/gpu/grcontext_for_webgraphicscontext3d.h"
#include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h"
@@ -54,35 +53,6 @@ class ContextProviderInProcess::MemoryAllocationCallbackProxy
ContextProviderInProcess* provider_;
};
-// static
-scoped_refptr<ContextProviderInProcess> ContextProviderInProcess::Create(
- const CreateCallback& create_callback) {
- scoped_refptr<ContextProviderInProcess> provider =
- new ContextProviderInProcess;
- if (!provider->InitializeOnMainThread(create_callback))
- return NULL;
- return provider;
-}
-
-static scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
-CreateOffscreenContext() {
- WebKit::WebGraphicsContext3D::Attributes attributes;
- attributes.depth = false;
- attributes.stencil = true;
- attributes.antialias = false;
- attributes.shareResources = true;
- attributes.noAutomaticFlushes = true;
-
- return WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext(
- attributes).Pass();
-}
-
-// static
-scoped_refptr<ContextProviderInProcess>
-ContextProviderInProcess::CreateOffscreen() {
- return Create(base::Bind(&CreateOffscreenContext));
-}
-
ContextProviderInProcess::ContextProviderInProcess()
: destroyed_(false) {
DCHECK(main_thread_checker_.CalledOnValidThread());
@@ -94,13 +64,22 @@ ContextProviderInProcess::~ContextProviderInProcess() {
context_thread_checker_.CalledOnValidThread());
}
-bool ContextProviderInProcess::InitializeOnMainThread(
- const CreateCallback& create_callback) {
+bool ContextProviderInProcess::InitializeOnMainThread() {
DCHECK(!context3d_);
DCHECK(main_thread_checker_.CalledOnValidThread());
- DCHECK(!create_callback.is_null());
- context3d_ = create_callback.Run();
+ WebKit::WebGraphicsContext3D::Attributes attributes;
+ attributes.depth = false;
+ attributes.stencil = true;
+ attributes.antialias = false;
+ attributes.shareResources = true;
+ attributes.noAutomaticFlushes = true;
+
+ using webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl;
+ context3d_ =
+ WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext(
+ attributes);
+
return context3d_;
}
diff --git a/chromium/webkit/common/gpu/context_provider_in_process.h b/chromium/webkit/common/gpu/context_provider_in_process.h
index 169a1a8fdd3..b427abeb043 100644
--- a/chromium/webkit/common/gpu/context_provider_in_process.h
+++ b/chromium/webkit/common/gpu/context_provider_in_process.h
@@ -19,21 +19,17 @@ class WebGraphicsContext3D;
namespace webkit {
namespace gpu {
class GrContextForWebGraphicsContext3D;
-class WebGraphicsContext3DInProcessCommandBufferImpl;
class WEBKIT_GPU_EXPORT ContextProviderInProcess
: NON_EXPORTED_BASE(public cc::ContextProvider) {
public:
- typedef base::Callback<
- scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>(void)>
- CreateCallback;
-
- static scoped_refptr<ContextProviderInProcess> Create(
- const CreateCallback& create_callback);
-
- // Calls Create() with a default factory method for creating an offscreen
- // context.
- static scoped_refptr<ContextProviderInProcess> CreateOffscreen();
+ static scoped_refptr<ContextProviderInProcess> Create() {
+ scoped_refptr<ContextProviderInProcess> provider =
+ new ContextProviderInProcess;
+ if (!provider->InitializeOnMainThread())
+ return NULL;
+ return provider;
+ }
virtual bool BindToCurrentThread() OVERRIDE;
virtual WebKit::WebGraphicsContext3D* Context3d() OVERRIDE;
@@ -47,8 +43,7 @@ class WEBKIT_GPU_EXPORT ContextProviderInProcess
ContextProviderInProcess();
virtual ~ContextProviderInProcess();
- bool InitializeOnMainThread(
- const CreateCallback& create_callback);
+ bool InitializeOnMainThread();
void OnLostContext();
void OnMemoryAllocationChanged(bool nonzero_allocation);
diff --git a/chromium/webkit/common/gpu/test_context_provider_factory.cc b/chromium/webkit/common/gpu/test_context_provider_factory.cc
index 7e4f04f949e..88464c00074 100644
--- a/chromium/webkit/common/gpu/test_context_provider_factory.cc
+++ b/chromium/webkit/common/gpu/test_context_provider_factory.cc
@@ -27,7 +27,7 @@ TestContextProviderFactory::~TestContextProviderFactory() {}
scoped_refptr<cc::ContextProvider> TestContextProviderFactory::
OffscreenContextProviderForMainThread() {
if (!main_thread_.get() || main_thread_->DestroyedOnMainThread()) {
- main_thread_ = ContextProviderInProcess::CreateOffscreen();
+ main_thread_ = ContextProviderInProcess::Create();
if (main_thread_.get() && !main_thread_->BindToCurrentThread())
main_thread_ = NULL;
}
diff --git a/chromium/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc b/chromium/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
index 66c7a53a525..886e40f5f46 100644
--- a/chromium/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
+++ b/chromium/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
@@ -66,11 +66,11 @@ static base::LazyInstance<GLES2Initializer> g_gles2_initializer =
} // namespace anonymous
// static
-scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
+scoped_ptr<WebKit::WebGraphicsContext3D>
WebGraphicsContext3DInProcessCommandBufferImpl::CreateViewContext(
const WebKit::WebGraphicsContext3D::Attributes& attributes,
gfx::AcceleratedWidget window) {
- scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> context;
+ scoped_ptr<WebKit::WebGraphicsContext3D> context;
if (gfx::GLSurface::InitializeOneOff()) {
context.reset(new WebGraphicsContext3DInProcessCommandBufferImpl(
scoped_ptr< ::gpu::GLInProcessContext>(), attributes, false, window));
@@ -79,7 +79,7 @@ WebGraphicsContext3DInProcessCommandBufferImpl::CreateViewContext(
}
// static
-scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
+scoped_ptr<WebKit::WebGraphicsContext3D>
WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext(
const WebKit::WebGraphicsContext3D::Attributes& attributes) {
return make_scoped_ptr(new WebGraphicsContext3DInProcessCommandBufferImpl(
@@ -87,10 +87,10 @@ WebGraphicsContext3DInProcessCommandBufferImpl::CreateOffscreenContext(
attributes,
true,
gfx::kNullAcceleratedWidget))
- .Pass();
+ .PassAs<WebKit::WebGraphicsContext3D>();
}
-scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
+scoped_ptr<WebKit::WebGraphicsContext3D>
WebGraphicsContext3DInProcessCommandBufferImpl::WrapContext(
scoped_ptr< ::gpu::GLInProcessContext> context,
const WebKit::WebGraphicsContext3D::Attributes& attributes) {
@@ -100,7 +100,7 @@ WebGraphicsContext3DInProcessCommandBufferImpl::WrapContext(
attributes,
true /* is_offscreen. Not used. */,
gfx::kNullAcceleratedWidget /* window. Not used. */))
- .Pass();
+ .PassAs<WebKit::WebGraphicsContext3D>();
}
WebGraphicsContext3DInProcessCommandBufferImpl::
diff --git a/chromium/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h b/chromium/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h
index f96607d7dc3..d3620b411b2 100644
--- a/chromium/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h
+++ b/chromium/webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h
@@ -48,19 +48,16 @@ namespace gpu {
class WEBKIT_GPU_EXPORT WebGraphicsContext3DInProcessCommandBufferImpl
: public NON_EXPORTED_BASE(WebKit::WebGraphicsContext3D) {
public:
- static scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
- CreateViewContext(
- const WebKit::WebGraphicsContext3D::Attributes& attributes,
- gfx::AcceleratedWidget window);
-
- static scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
- CreateOffscreenContext(
- const WebKit::WebGraphicsContext3D::Attributes& attributes);
-
- static scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl>
- WrapContext(
- scoped_ptr< ::gpu::GLInProcessContext> context,
- const WebKit::WebGraphicsContext3D::Attributes& attributes);
+ static scoped_ptr<WebKit::WebGraphicsContext3D> CreateViewContext(
+ const WebKit::WebGraphicsContext3D::Attributes& attributes,
+ gfx::AcceleratedWidget window);
+
+ static scoped_ptr<WebKit::WebGraphicsContext3D> CreateOffscreenContext(
+ const WebKit::WebGraphicsContext3D::Attributes& attributes);
+
+ static scoped_ptr<WebKit::WebGraphicsContext3D> WrapContext(
+ scoped_ptr< ::gpu::GLInProcessContext> context,
+ const WebKit::WebGraphicsContext3D::Attributes& attributes);
virtual ~WebGraphicsContext3DInProcessCommandBufferImpl();
diff --git a/chromium/webkit/common/webpreferences.cc b/chromium/webkit/common/webpreferences.cc
index 9ae6118b0ab..865b7199fed 100644
--- a/chromium/webkit/common/webpreferences.cc
+++ b/chromium/webkit/common/webpreferences.cc
@@ -126,7 +126,11 @@ WebPreferences::WebPreferences()
double_tap_to_zoom_enabled(true),
user_gesture_required_for_media_playback(true),
support_deprecated_target_density_dpi(false),
- use_wide_viewport(true)
+ use_legacy_background_size_shorthand_behavior(false),
+ wide_viewport_quirk(false),
+ use_wide_viewport(true),
+ viewport_meta_layout_size_quirk(false),
+ viewport_meta_zero_values_quirk(false)
#endif
{
standard_font_family_map[webkit_glue::kCommonScript] =
diff --git a/chromium/webkit/common/webpreferences.h b/chromium/webkit/common/webpreferences.h
index 5f697d15527..45f7eb03643 100644
--- a/chromium/webkit/common/webpreferences.h
+++ b/chromium/webkit/common/webpreferences.h
@@ -169,7 +169,11 @@ struct WEBKIT_COMMON_EXPORT WebPreferences {
bool user_gesture_required_for_media_playback;
GURL default_video_poster_url;
bool support_deprecated_target_density_dpi;
+ bool use_legacy_background_size_shorthand_behavior;
+ bool wide_viewport_quirk;
bool use_wide_viewport;
+ bool viewport_meta_layout_size_quirk;
+ bool viewport_meta_zero_values_quirk;
#endif
// We try to keep the default values the same as the default values in
diff --git a/chromium/webkit/glue/resources/webkit_strings_ar.xtb b/chromium/webkit/glue/resources/webkit_strings_ar.xtb
index b2f2c5b0bb3..4dbc3a06f7c 100644
--- a/chromium/webkit/glue/resources/webkit_strings_ar.xtb
+++ b/chromium/webkit/glue/resources/webkit_strings_ar.xtb
@@ -31,7 +31,7 @@
<translation id="2723001399770238859">الصوت</translation>
<translation id="6845533974506654842">اضغط</translation>
<translation id="8244226242650769279">مخطّط صورة</translation>
-<translation id="310520048233152454">الرجاء إدخال عنوان URL.</translation>
+<translation id="310520048233152454">‏الرجاء إدخال عنوان URL.</translation>
<translation id="9039488204461337220">محاولة الانتقال للأمام بسرعة</translation>
<translation id="4812940957355064477">الرجاء إدخال عدد.</translation>
<translation id="2548326553472216322">لا عمليات بحث حديثة</translation>
@@ -77,7 +77,7 @@
<translation id="5466621249238537318">الرجاء تحديد ملف واحد أو أكثر.</translation>
<translation id="9132465097189459683">آخر...</translation>
<translation id="8750798805984357768">الرجاء اختيار أحد هذه الخيارات.</translation>
-<translation id="7740050170769002709">محتوى HTML</translation>
+<translation id="7740050170769002709">‏محتوى HTML</translation>
<translation id="6692633176391053278">تخطي</translation>
<translation id="8541249477527128034">التحكم في الوسائط</translation>
<translation id="2226276347425096477">الرجاء اختصار هذا النص حتى يصل إلى <ph name="MAX_CHARACTERS"/> من الحروف أو أقل (أنت الآن تستخدم <ph name="CURRENT_LENGTH"/> من الحروف).</translation>
@@ -101,7 +101,7 @@
<translation id="6643016212128521049">محو</translation>
<translation id="4851297395436456855">تقديم سريع</translation>
<translation id="1088086359088493902">ثوانٍ‬‬</translation>
-<translation id="3934680773876859118">إخفاق تحميل مستند PDF</translation>
+<translation id="3934680773876859118">‏إخفاق تحميل مستند PDF</translation>
<translation id="3632707345189162177">عدد الثواني المتبقية من الفيلم</translation>
<translation id="6359256949422175976">صورة مصغرة لشريط تمرير وقت الفيلم</translation>
<translation id="8597182159515967513">العنوان</translation>
diff --git a/chromium/webkit/glue/resources/webkit_strings_fa.xtb b/chromium/webkit/glue/resources/webkit_strings_fa.xtb
index acb0ffac4cf..d64898e023d 100644
--- a/chromium/webkit/glue/resources/webkit_strings_fa.xtb
+++ b/chromium/webkit/glue/resources/webkit_strings_fa.xtb
@@ -31,7 +31,7 @@
<translation id="2723001399770238859">صدا</translation>
<translation id="6845533974506654842">فشار دادن</translation>
<translation id="8244226242650769279">نقشه تصویر</translation>
-<translation id="310520048233152454">لطفاً یک URL وارد کنید.</translation>
+<translation id="310520048233152454">‏لطفاً یک URL وارد کنید.</translation>
<translation id="9039488204461337220">جستجو به جلو</translation>
<translation id="4812940957355064477">لطفاً شماره‌ای را وارد کنید.</translation>
<translation id="2548326553472216322">جستجوی جدیدی وجود ندارد</translation>
@@ -77,7 +77,7 @@
<translation id="5466621249238537318">لطفاً یک یا چند فایل را انتخاب کنید.</translation>
<translation id="9132465097189459683">موارد دیگر...</translation>
<translation id="8750798805984357768">لطفاً یکی از این گزینه‌ها را انتخاب کنید.</translation>
-<translation id="7740050170769002709">محتوای HTML</translation>
+<translation id="7740050170769002709">‏محتوای HTML</translation>
<translation id="6692633176391053278">گام به گام</translation>
<translation id="8541249477527128034">کنترل رسانه</translation>
<translation id="2226276347425096477">لطفاً این متن را به اندازه <ph name="MAX_CHARACTERS"/> نویسه یا کمتر کوتاه کنید (شما در حال حاضر از <ph name="CURRENT_LENGTH"/> نویسه استفاده می‌کنید).</translation>
@@ -101,7 +101,7 @@
<translation id="6643016212128521049">پاک کردن</translation>
<translation id="4851297395436456855">سریع به جلو</translation>
<translation id="1088086359088493902">ثانیه</translation>
-<translation id="3934680773876859118">بارگیری سند PDF انجام نشد</translation>
+<translation id="3934680773876859118">‏بارگیری سند PDF انجام نشد</translation>
<translation id="3632707345189162177">مقدار ثانیه‌های باقیمانده فیلم</translation>
<translation id="6359256949422175976">نشانگر حذف‌کننده زمان فیلم</translation>
<translation id="8597182159515967513">عنوان</translation>
diff --git a/chromium/webkit/glue/resources/webkit_strings_iw.xtb b/chromium/webkit/glue/resources/webkit_strings_iw.xtb
index a2c31fbc68c..e0adf0e94e1 100644
--- a/chromium/webkit/glue/resources/webkit_strings_iw.xtb
+++ b/chromium/webkit/glue/resources/webkit_strings_iw.xtb
@@ -77,7 +77,7 @@
<translation id="5466621249238537318">בחר קובץ אחד או יותר.</translation>
<translation id="9132465097189459683">אחר...</translation>
<translation id="8750798805984357768">בחר אחת מהאפשרויות הבאות.</translation>
-<translation id="7740050170769002709">תוכן HTML</translation>
+<translation id="7740050170769002709">‏תוכן HTML</translation>
<translation id="6692633176391053278">פקד חצים</translation>
<translation id="8541249477527128034">שליטה במדיה</translation>
<translation id="2226276347425096477">קצר טקסט זה ל-<ph name="MAX_CHARACTERS"/> תווים או פחות (אתה משתמש כעת ב-<ph name="CURRENT_LENGTH"/> תווים).</translation>
@@ -101,7 +101,7 @@
<translation id="6643016212128521049">נקה</translation>
<translation id="4851297395436456855">הרץ קדימה</translation>
<translation id="1088086359088493902">שניות</translation>
-<translation id="3934680773876859118">הטעינה של מסמך PDF נכשלה</translation>
+<translation id="3934680773876859118">‏הטעינה של מסמך PDF נכשלה</translation>
<translation id="3632707345189162177">מספר שניות שנותרו עד לסיום הסרט</translation>
<translation id="6359256949422175976">תמונה ממוזערת של מסתיר זמן סרט</translation>
<translation id="8597182159515967513">כותרת</translation>
diff --git a/chromium/webkit/glue/resources/webkit_strings_nl.xtb b/chromium/webkit/glue/resources/webkit_strings_nl.xtb
index b52f04aa964..5f813c93006 100644
--- a/chromium/webkit/glue/resources/webkit_strings_nl.xtb
+++ b/chromium/webkit/glue/resources/webkit_strings_nl.xtb
@@ -55,7 +55,7 @@
<translation id="8987927404178983737">Maand</translation>
<translation id="8115662671911883373">het weergeven van ondertiteling starten</translation>
<translation id="7364796246159120393">Bestand kiezen</translation>
-<translation id="2761667185364618470">Vink dit selectievakje aan als u wilt doorgaan.</translation>
+<translation id="2761667185364618470">Vink dit selectievakje aan als je wilt doorgaan.</translation>
<translation id="8534579021159131403">Minuten</translation>
<translation id="819205353528511139">film afspelen op volledig scherm</translation>
<translation id="8964020114565522021">Sleep bestand hier naartoe</translation>
@@ -80,7 +80,7 @@
<translation id="7740050170769002709">HTML-inhoud</translation>
<translation id="6692633176391053278">stappenregelaar</translation>
<translation id="8541249477527128034">mediacontrole</translation>
-<translation id="2226276347425096477">Kort deze tekst in tot <ph name="MAX_CHARACTERS"/> tekens of minder (u gebruikt momenteel <ph name="CURRENT_LENGTH"/> tekens).</translation>
+<translation id="2226276347425096477">Kort deze tekst in tot <ph name="MAX_CHARACTERS"/> tekens of minder (je gebruikt momenteel <ph name="CURRENT_LENGTH"/> tekens).</translation>
<translation id="6101327004457443354">dempen van audiotrack opheffen</translation>
<translation id="1822429046913737220">a.m./p.m.</translation>
<translation id="1639239467298939599">Laden</translation>
diff --git a/chromium/webkit/glue/resources/webkit_strings_ru.xtb b/chromium/webkit/glue/resources/webkit_strings_ru.xtb
index 57d1920f7f6..43f80d90e0c 100644
--- a/chromium/webkit/glue/resources/webkit_strings_ru.xtb
+++ b/chromium/webkit/glue/resources/webkit_strings_ru.xtb
@@ -82,10 +82,10 @@
<translation id="8541249477527128034">управление мультимедиа</translation>
<translation id="2226276347425096477">Длина текста не должна превышать <ph name="MAX_CHARACTERS"/> симв. (сейчас <ph name="CURRENT_LENGTH"/> симв.).</translation>
<translation id="6101327004457443354">включение звуковой дорожки</translation>
-<translation id="1822429046913737220">до полудня/после полудня</translation>
+<translation id="1822429046913737220">AM/PM</translation>
<translation id="1639239467298939599">Загрузка</translation>
<translation id="2908441821576996758">Введите адреса электронной почты через запятую.</translation>
-<translation id="5939518447894949180">Изменить</translation>
+<translation id="5939518447894949180">Сбросить</translation>
<translation id="1921819250265091946">дд</translation>
<translation id="835897206747267392">Недопустимые данные.</translation>
<translation id="1842960171412779397">выбрать</translation>
diff --git a/chromium/webkit/glue/simple_webmimeregistry_impl.cc b/chromium/webkit/glue/simple_webmimeregistry_impl.cc
index 48364efbeeb..8340458df38 100644
--- a/chromium/webkit/glue/simple_webmimeregistry_impl.cc
+++ b/chromium/webkit/glue/simple_webmimeregistry_impl.cc
@@ -94,4 +94,12 @@ WebString SimpleWebMimeRegistryImpl::mimeTypeFromFile(
return WebString::fromUTF8(mime_type);
}
+WebString SimpleWebMimeRegistryImpl::preferredExtensionForMIMEType(
+ const WebString& mime_type) {
+ base::FilePath::StringType file_extension;
+ net::GetPreferredExtensionForMimeType(ToASCIIOrEmpty(mime_type),
+ &file_extension);
+ return base::FilePath(file_extension).AsUTF16Unsafe();
+}
+
} // namespace webkit_glue
diff --git a/chromium/webkit/glue/simple_webmimeregistry_impl.h b/chromium/webkit/glue/simple_webmimeregistry_impl.h
index 1055dfe18ab..39972ebe516 100644
--- a/chromium/webkit/glue/simple_webmimeregistry_impl.h
+++ b/chromium/webkit/glue/simple_webmimeregistry_impl.h
@@ -45,6 +45,8 @@ class WEBKIT_GLUE_EXPORT SimpleWebMimeRegistryImpl :
virtual WebKit::WebString wellKnownMimeTypeForExtension(
const WebKit::WebString&);
virtual WebKit::WebString mimeTypeFromFile(const WebKit::WebString&);
+ virtual WebKit::WebString preferredExtensionForMIMEType(
+ const WebKit::WebString&);
};
} // namespace webkit_glue
diff --git a/chromium/webkit/renderer/fileapi/OWNERS b/chromium/webkit/renderer/fileapi/OWNERS
new file mode 100644
index 00000000000..13c32887350
--- /dev/null
+++ b/chromium/webkit/renderer/fileapi/OWNERS
@@ -0,0 +1 @@
+ericu@chromium.org
diff --git a/chromium/content/child/fileapi/webfilewriter_base.cc b/chromium/webkit/renderer/fileapi/webfilewriter_base.cc
index fd0a2070c49..92c7ae1db20 100644
--- a/chromium/content/child/fileapi/webfilewriter_base.cc
+++ b/chromium/webkit/renderer/fileapi/webfilewriter_base.cc
@@ -1,8 +1,8 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "content/child/fileapi/webfilewriter_base.h"
+#include "webkit/renderer/fileapi/webfilewriter_base.h"
#include "base/logging.h"
#include "third_party/WebKit/public/platform/WebURL.h"
@@ -10,18 +10,18 @@
#include "third_party/WebKit/public/web/WebFileWriterClient.h"
#include "webkit/common/fileapi/file_system_util.h"
-using fileapi::PlatformFileErrorToWebFileError;
+namespace fileapi {
-namespace content {
-
-WebFileWriterBase::WebFileWriterBase(const GURL& path,
- WebKit::WebFileWriterClient* client)
- : path_(path),
- client_(client),
- operation_(kOperationNone),
- cancel_state_(kCancelNotInProgress) {}
+WebFileWriterBase::WebFileWriterBase(
+ const GURL& path, WebKit::WebFileWriterClient* client)
+ : path_(path),
+ client_(client),
+ operation_(kOperationNone),
+ cancel_state_(kCancelNotInProgress) {
+}
-WebFileWriterBase::~WebFileWriterBase() {}
+WebFileWriterBase::~WebFileWriterBase() {
+}
void WebFileWriterBase::truncate(long long length) {
DCHECK(kOperationNone == operation_);
@@ -30,8 +30,9 @@ void WebFileWriterBase::truncate(long long length) {
DoTruncate(path_, length);
}
-void WebFileWriterBase::write(long long position,
- const WebKit::WebURL& blob_url) {
+void WebFileWriterBase::write(
+ long long position,
+ const WebKit::WebURL& blob_url) {
DCHECK(kOperationNone == operation_);
DCHECK(kCancelNotInProgress == cancel_state_);
operation_ = kOperationWrite;
@@ -122,7 +123,8 @@ void WebFileWriterBase::DidFail(base::PlatformFileError error_code) {
case kCancelNotInProgress:
// A write or truncate failed.
operation_ = kOperationNone;
- client_->didFail(PlatformFileErrorToWebFileError(error_code));
+ client_->didFail(
+ PlatformFileErrorToWebFileError(error_code));
break;
case kCancelSent:
// This is the failure of a write or truncate; the next message should be
@@ -149,4 +151,4 @@ void WebFileWriterBase::FinishCancel() {
client_->didFail(WebKit::WebFileErrorAbort);
}
-} // namespace content
+} // namespace fileapi
diff --git a/chromium/content/child/fileapi/webfilewriter_base.h b/chromium/webkit/renderer/fileapi/webfilewriter_base.h
index d3873dc1fb6..dc1d730163d 100644
--- a/chromium/content/child/fileapi/webfilewriter_base.h
+++ b/chromium/webkit/renderer/fileapi/webfilewriter_base.h
@@ -1,26 +1,27 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// 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 CONTENT_CHILD_FILEAPI_WEBFILEWRITER_BASE_H_
-#define CONTENT_CHILD_FILEAPI_WEBFILEWRITER_BASE_H_
+#ifndef WEBKIT_RENDERER_FILEAPI_WEBFILEWRITER_BASE_H_
+#define WEBKIT_RENDERER_FILEAPI_WEBFILEWRITER_BASE_H_
#include "base/platform_file.h"
-#include "content/common/content_export.h"
#include "third_party/WebKit/public/web/WebFileWriter.h"
#include "url/gurl.h"
+#include "webkit/renderer/webkit_storage_renderer_export.h"
namespace WebKit {
class WebFileWriterClient;
class WebURL;
}
-namespace content {
+namespace fileapi {
-class CONTENT_EXPORT WebFileWriterBase
+class WEBKIT_STORAGE_RENDERER_EXPORT WebFileWriterBase
: public NON_EXPORTED_BASE(WebKit::WebFileWriter) {
public:
- WebFileWriterBase(const GURL& path, WebKit::WebFileWriterClient* client);
+ WebFileWriterBase(
+ const GURL& path, WebKit::WebFileWriterClient* client);
virtual ~WebFileWriterBase();
// WebFileWriter implementation
@@ -40,8 +41,7 @@ class CONTENT_EXPORT WebFileWriterBase
// the requested operation, and they must call the appropiate DidSomething
// method upon completion and as progress is made in the Write case.
virtual void DoTruncate(const GURL& path, int64 offset) = 0;
- virtual void DoWrite(const GURL& path,
- const GURL& blob_url,
+ virtual void DoWrite(const GURL& path, const GURL& blob_url,
int64 offset) = 0;
virtual void DoCancel() = 0;
@@ -66,6 +66,6 @@ class CONTENT_EXPORT WebFileWriterBase
CancelState cancel_state_;
};
-} // namespace content
+} // namespace fileapi
-#endif // CONTENT_CHILD_FILEAPI_WEBFILEWRITER_BASE_H_
+#endif // WEBKIT_RENDERER_FILEAPI_WEBFILEWRITER_BASE_H_
diff --git a/chromium/content/child/fileapi/webfilewriter_base_unittest.cc b/chromium/webkit/renderer/fileapi/webfilewriter_base_unittest.cc
index 92150813dfa..d7067380b95 100644
--- a/chromium/content/child/fileapi/webfilewriter_base_unittest.cc
+++ b/chromium/webkit/renderer/fileapi/webfilewriter_base_unittest.cc
@@ -1,8 +1,8 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// 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 "content/child/fileapi/webfilewriter_base.h"
+#include "webkit/renderer/fileapi/webfilewriter_base.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
@@ -14,7 +14,7 @@
#include "third_party/WebKit/public/web/WebFileWriterClient.h"
#include "url/gurl.h"
-namespace content {
+namespace fileapi {
namespace {
@@ -408,4 +408,4 @@ TEST_F(FileWriterTest, DeleteInCompletionCallbacks) {
// Not crashing counts as passing.
}
-} // namespace content
+} // namespace fileapi
diff --git a/chromium/webkit/renderer/webkit_storage_renderer_export.h b/chromium/webkit/renderer/webkit_storage_renderer_export.h
new file mode 100644
index 00000000000..4225bc683e9
--- /dev/null
+++ b/chromium/webkit/renderer/webkit_storage_renderer_export.h
@@ -0,0 +1,29 @@
+// Copyright (c) 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 WEBKIT_RENDERER_WEBKIT_STORAGE_RENDERER_EXPORT_H_
+#define WEBKIT_RENDERER_WEBKIT_STORAGE_RENDERER_EXPORT_H_
+
+#if defined(COMPONENT_BUILD)
+#if defined(WIN32)
+
+#if defined(WEBKIT_STORAGE_RENDERER_IMPLEMENTATION)
+#define WEBKIT_STORAGE_RENDERER_EXPORT __declspec(dllexport)
+#else
+#define WEBKIT_STORAGE_RENDERER_EXPORT __declspec(dllimport)
+#endif // defined(WEBKIT_STORAGE_RENDERER_IMPLEMENTATION)
+
+#else // defined(WIN32)
+#if defined(WEBKIT_STORAGE_RENDERER_IMPLEMENTATION)
+#define WEBKIT_STORAGE_RENDERER_EXPORT __attribute__((visibility("default")))
+#else
+#define WEBKIT_STORAGE_RENDERER_EXPORT
+#endif
+#endif
+
+#else // defined(COMPONENT_BUILD)
+#define WEBKIT_STORAGE_RENDERER_EXPORT
+#endif
+
+#endif // WEBKIT_RENDERER_WEBKIT_STORAGE_RENDERER_EXPORT_H_
diff --git a/chromium/webkit/renderer/webpreferences_renderer.cc b/chromium/webkit/renderer/webpreferences_renderer.cc
index 0b0738534a0..5952110c88e 100644
--- a/chromium/webkit/renderer/webpreferences_renderer.cc
+++ b/chromium/webkit/renderer/webpreferences_renderer.cc
@@ -331,7 +331,14 @@ void ApplyWebPreferences(const WebPreferences& prefs, WebView* web_view) {
ASCIIToUTF16(prefs.default_video_poster_url.spec()));
settings->setSupportDeprecatedTargetDensityDPI(
prefs.support_deprecated_target_density_dpi);
+ settings->setUseLegacyBackgroundSizeShorthandBehavior(
+ prefs.use_legacy_background_size_shorthand_behavior);
+ settings->setWideViewportQuirkEnabled(prefs.wide_viewport_quirk);
settings->setUseWideViewport(prefs.use_wide_viewport);
+ settings->setViewportMetaLayoutSizeQuirk(
+ prefs.viewport_meta_layout_size_quirk);
+ settings->setViewportMetaZeroValuesQuirk(
+ prefs.viewport_meta_zero_values_quirk);
#endif
WebNetworkStateNotifier::setOnLine(prefs.is_online);
diff --git a/chromium/webkit/storage_browser.gyp b/chromium/webkit/storage_browser.gyp
index 04d25656bd5..04e609ae6fc 100644
--- a/chromium/webkit/storage_browser.gyp
+++ b/chromium/webkit/storage_browser.gyp
@@ -154,14 +154,14 @@
'browser/fileapi/recursive_operation_delegate.h',
'browser/fileapi/remove_operation_delegate.cc',
'browser/fileapi/remove_operation_delegate.h',
+ 'browser/fileapi/sandbox_context.cc',
+ 'browser/fileapi/sandbox_context.h',
'browser/fileapi/sandbox_directory_database.cc',
'browser/fileapi/sandbox_directory_database.h',
'browser/fileapi/sandbox_file_stream_writer.cc',
'browser/fileapi/sandbox_file_stream_writer.h',
'browser/fileapi/sandbox_file_system_backend.cc',
'browser/fileapi/sandbox_file_system_backend.h',
- 'browser/fileapi/sandbox_file_system_backend_delegate.cc',
- 'browser/fileapi/sandbox_file_system_backend_delegate.h',
'browser/fileapi/sandbox_isolated_origin_database.cc',
'browser/fileapi/sandbox_isolated_origin_database.h',
'browser/fileapi/sandbox_origin_database.cc',
diff --git a/chromium/webkit/storage_renderer.gyp b/chromium/webkit/storage_renderer.gyp
new file mode 100644
index 00000000000..dc406e202dd
--- /dev/null
+++ b/chromium/webkit/storage_renderer.gyp
@@ -0,0 +1,29 @@
+# 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.
+
+{
+ 'targets': [
+ {
+ 'target_name': 'webkit_storage_renderer',
+ 'type': '<(component)',
+ 'variables': { 'enable_wexit_time_destructors': 1, },
+ 'dependencies': [
+ '<(DEPTH)/base/base.gyp:base',
+ '<(DEPTH)/base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
+ '<(DEPTH)/third_party/WebKit/public/blink.gyp:blink',
+ '<(DEPTH)/url/url.gyp:url_lib',
+ '<(DEPTH)/webkit/common/webkit_common.gyp:webkit_common',
+ '<(DEPTH)/webkit/storage_common.gyp:webkit_storage_common',
+ ],
+ 'defines': ['WEBKIT_STORAGE_RENDERER_IMPLEMENTATION'],
+ 'sources': [
+ 'renderer/webkit_storage_renderer_export.h',
+ 'renderer/fileapi/webfilewriter_base.cc',
+ 'renderer/fileapi/webfilewriter_base.h',
+ ],
+ # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
+ 'msvs_disabled_warnings': [ 4267, ],
+ },
+ ],
+}
diff --git a/chromium/webkit/support/drt_application_mac.h b/chromium/webkit/support/drt_application_mac.h
new file mode 100644
index 00000000000..969894f9500
--- /dev/null
+++ b/chromium/webkit/support/drt_application_mac.h
@@ -0,0 +1,23 @@
+// 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 WEBKIT_SUPPORT_DRT_APPLICATION_MAC_H
+#define WEBKIT_SUPPORT_DRT_APPLICATION_MAC_H
+
+#include "base/mac/scoped_sending_event.h"
+#include "base/message_loop/message_pump_mac.h"
+
+@interface CrDrtApplication : NSApplication<CrAppProtocol,
+ CrAppControlProtocol> {
+ @private
+ BOOL handlingSendEvent_;
+}
+// CrAppProtocol
+- (BOOL)isHandlingSendEvent;
+
+// CrAppControlProtocol
+- (void)setHandlingSendEvent:(BOOL)handlingSendEvent;
+@end
+
+#endif // WEBKIT_SUPPORT_DRT_APPLICATION_MAC_H
diff --git a/chromium/webkit/support/drt_application_mac.mm b/chromium/webkit/support/drt_application_mac.mm
new file mode 100644
index 00000000000..0c2f900039c
--- /dev/null
+++ b/chromium/webkit/support/drt_application_mac.mm
@@ -0,0 +1,24 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "webkit/support/drt_application_mac.h"
+
+#include "base/auto_reset.h"
+
+@implementation CrDrtApplication
+
+- (BOOL)isHandlingSendEvent {
+ return handlingSendEvent_;
+}
+
+- (void)sendEvent:(NSEvent*)event {
+ base::AutoReset<BOOL> scoper(&handlingSendEvent_, YES);
+ [super sendEvent:event];
+}
+
+- (void)setHandlingSendEvent:(BOOL)handlingSendEvent {
+ handlingSendEvent_ = handlingSendEvent;
+}
+
+@end
diff --git a/chromium/webkit/support/mac/DumpRenderTreePasteboard.h b/chromium/webkit/support/mac/DumpRenderTreePasteboard.h
new file mode 100644
index 00000000000..41796ea3779
--- /dev/null
+++ b/chromium/webkit/support/mac/DumpRenderTreePasteboard.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2005, 2006, 2007 Apple, Inc. All rights reserved.
+ * (C) 2007 Graham Dennis (graham.dennis@gmail.com)
+ * (C) 2007 Eric Seidel <eric@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+//
+// This file comes from WebKit:
+// WebKit/Tools/DumpRenderTree/mac/DumpRenderTreePasteboard.m
+// It is copied here since that location is the best for pulling into Chromium
+// and has a few includes commented out. darin@chromium.org suggests in the
+// future we see if there is a better place for it to live so it could be
+// shared.
+//
+
+#import <AppKit/AppKit.h>
+// #import <WebKit/WebTypesInternal.h>
+
+@interface DumpRenderTreePasteboard : NSPasteboard
+- (NSInteger)declareType:(NSString *)type owner:(id)newOwner;
++ (void)releaseLocalPasteboards;
+@end
diff --git a/chromium/webkit/support/mac/DumpRenderTreePasteboard.m b/chromium/webkit/support/mac/DumpRenderTreePasteboard.m
new file mode 100644
index 00000000000..3e3cf1c47d3
--- /dev/null
+++ b/chromium/webkit/support/mac/DumpRenderTreePasteboard.m
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2005, 2006, 2007 Apple, Inc. All rights reserved.
+ * (C) 2007 Graham Dennis (graham.dennis@gmail.com)
+ * (C) 2007 Eric Seidel <eric@webkit.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+//
+// This file comes from WebKit:
+// WebKit/Tools/DumpRenderTree/mac/DumpRenderTreePasteboard.m
+// It is copied here since that location is the best for pulling into Chromium
+// and has a few includes commented out. darin@chromium.org suggests in the
+// future we see if there is a better place for it to live so it could be
+// shared.
+//
+
+// #import "DumpRenderTreeMac.h"
+#import "DumpRenderTreePasteboard.h"
+
+// #import <WebKit/WebTypesInternal.h>
+
+@interface LocalPasteboard : NSPasteboard
+{
+ NSMutableArray *typesArray;
+ NSMutableSet *typesSet;
+ NSMutableDictionary *dataByType;
+ NSInteger changeCount;
+}
+@end
+
+static NSMutableDictionary *localPasteboards;
+
+@implementation DumpRenderTreePasteboard
+
+// Return a local pasteboard so we don't disturb the real pasteboards when running tests.
++ (NSPasteboard *)_pasteboardWithName:(NSString *)name
+{
+ static int number = 0;
+ if (!name)
+ name = [NSString stringWithFormat:@"LocalPasteboard%d", ++number];
+ if (!localPasteboards)
+ localPasteboards = [[NSMutableDictionary alloc] init];
+ LocalPasteboard *pasteboard = [localPasteboards objectForKey:name];
+ if (pasteboard)
+ return pasteboard;
+ pasteboard = [[LocalPasteboard alloc] init];
+ [localPasteboards setObject:pasteboard forKey:name];
+ [pasteboard release];
+ return pasteboard;
+}
+
++ (void)releaseLocalPasteboards
+{
+ [localPasteboards release];
+ localPasteboards = nil;
+}
+
+// Convenience method for JS so that it doesn't have to try and create a NSArray on the objc side instead
+// of the usual WebScriptObject that is passed around
+- (NSInteger)declareType:(NSString *)type owner:(id)newOwner
+{
+ return [self declareTypes:[NSArray arrayWithObject:type] owner:newOwner];
+}
+
+@end
+
+@implementation LocalPasteboard
+
++ (id)alloc
+{
+ return NSAllocateObject(self, 0, 0);
+}
+
+- (id)init
+{
+ typesArray = [[NSMutableArray alloc] init];
+ typesSet = [[NSMutableSet alloc] init];
+ dataByType = [[NSMutableDictionary alloc] init];
+ return self;
+}
+
+- (void)dealloc
+{
+ [typesArray release];
+ [typesSet release];
+ [dataByType release];
+ [super dealloc];
+}
+
+- (NSString *)name
+{
+ return nil;
+}
+
+- (void)releaseGlobally
+{
+}
+
+- (NSInteger)declareTypes:(NSArray *)newTypes owner:(id)newOwner
+{
+ [typesArray removeAllObjects];
+ [typesSet removeAllObjects];
+ [dataByType removeAllObjects];
+ return [self addTypes:newTypes owner:newOwner];
+}
+
+- (NSInteger)addTypes:(NSArray *)newTypes owner:(id)newOwner
+{
+ unsigned count = [newTypes count];
+ unsigned i;
+ for (i = 0; i < count; ++i) {
+ NSString *type = [newTypes objectAtIndex:i];
+ NSString *setType = [typesSet member:type];
+ if (!setType) {
+ setType = [type copy];
+ [typesArray addObject:setType];
+ [typesSet addObject:setType];
+ [setType release];
+ }
+ if (newOwner && [newOwner respondsToSelector:@selector(pasteboard:provideDataForType:)])
+ [newOwner pasteboard:self provideDataForType:setType];
+ }
+ return ++changeCount;
+}
+
+- (NSInteger)changeCount
+{
+ return changeCount;
+}
+
+- (NSArray *)types
+{
+ return typesArray;
+}
+
+- (NSString *)availableTypeFromArray:(NSArray *)types
+{
+ unsigned count = [types count];
+ unsigned i;
+ for (i = 0; i < count; ++i) {
+ NSString *type = [types objectAtIndex:i];
+ NSString *setType = [typesSet member:type];
+ if (setType)
+ return setType;
+ }
+ return nil;
+}
+
+- (BOOL)setData:(NSData *)data forType:(NSString *)dataType
+{
+ if (data == nil)
+ data = [NSData data];
+ if (![typesSet containsObject:dataType])
+ return NO;
+ [dataByType setObject:data forKey:dataType];
+ ++changeCount;
+ return YES;
+}
+
+- (NSData *)dataForType:(NSString *)dataType
+{
+ return [dataByType objectForKey:dataType];
+}
+
+- (BOOL)setPropertyList:(id)propertyList forType:(NSString *)dataType
+{
+ CFDataRef data = NULL;
+ if (propertyList)
+ data = CFPropertyListCreateXMLData(NULL, propertyList);
+ BOOL result = [self setData:(NSData *)data forType:dataType];
+ if (data)
+ CFRelease(data);
+ return result;
+}
+
+- (BOOL)setString:(NSString *)string forType:(NSString *)dataType
+{
+ CFDataRef data = NULL;
+ if (string) {
+ if ([string length] == 0)
+ data = CFDataCreate(NULL, NULL, 0);
+ else
+ data = CFStringCreateExternalRepresentation(NULL, (CFStringRef)string, kCFStringEncodingUTF8, 0);
+ }
+ BOOL result = [self setData:(NSData *)data forType:dataType];
+ if (data)
+ CFRelease(data);
+ return result;
+}
+
+@end
diff --git a/chromium/webkit/support/platform_support.h b/chromium/webkit/support/platform_support.h
new file mode 100644
index 00000000000..73ab9501a7b
--- /dev/null
+++ b/chromium/webkit/support/platform_support.h
@@ -0,0 +1,22 @@
+// Copyright (c) 2010 The Chromium 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 WEBKIT_SUPPORT_PLATFORM_SUPORT_H_
+#define WEBKIT_SUPPORT_PLATFORM_SUPORT_H_
+
+namespace webkit_support {
+// Called before WebKit::initialize().
+void BeforeInitialize();
+
+// Called after WebKit::initialize().
+void AfterInitialize();
+
+// Called before WebKit::shutdown().
+void BeforeShutdown();
+
+// Called after WebKit::shutdown().
+void AfterShutdown();
+} // namespace webkit_support
+
+#endif // WEBKIT_SUPPORT_PLATFORM_SUPORT_H_
diff --git a/chromium/webkit/support/platform_support_android.cc b/chromium/webkit/support/platform_support_android.cc
new file mode 100644
index 00000000000..582dc3a85bd
--- /dev/null
+++ b/chromium/webkit/support/platform_support_android.cc
@@ -0,0 +1,62 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "webkit/support/platform_support.h"
+
+#include "base/android/jni_android.h"
+#include "base/file_util.h"
+#include "base/files/file_path.h"
+#include "base/logging.h"
+#include "base/path_service.h"
+#include "base/strings/string16.h"
+#include "base/strings/string_piece.h"
+#include "base/test/test_support_android.h"
+#include "grit/webkit_resources.h"
+#include "media/base/android/media_jni_registrar.h"
+#include "net/android/net_jni_registrar.h"
+#include "net/android/network_library.h"
+#include "ui/android/ui_jni_registrar.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/gl/android/gl_jni_registrar.h"
+#include "url/gurl.h"
+#include "webkit/support/test_webkit_platform_support.h"
+
+namespace {
+
+// The place where the Android layout test script will put the required tools
+// and resources. Must keep consistent with DEVICE_DRT_DIR in
+// WebKit/Tools/Scripts/webkitpy/layout_tests/port/chromium_android.py.
+const char kDumpRenderTreeDir[] = "/data/local/tmp/drt";
+
+}
+
+namespace webkit_support {
+
+void BeforeInitialize() {
+ base::InitAndroidTestPaths();
+
+ // Place cache under kDumpRenderTreeDir to allow the NRWT script to clear it.
+ base::FilePath path(kDumpRenderTreeDir);
+ path = path.Append("cache");
+ PathService::Override(base::DIR_CACHE, path);
+
+ // Set XML_CATALOG_FILES environment variable to blank to prevent libxml from
+ // loading and complaining the non-exsistent /etc/xml/catalog file.
+ setenv("XML_CATALOG_FILES", "", 0);
+
+ JNIEnv* env = base::android::AttachCurrentThread();
+ net::android::RegisterNetworkLibrary(env);
+}
+
+void AfterInitialize() {
+}
+
+void BeforeShutdown() {
+}
+
+void AfterShutdown() {
+}
+
+} // namespace webkit_support
+
diff --git a/chromium/webkit/support/platform_support_linux.cc b/chromium/webkit/support/platform_support_linux.cc
new file mode 100644
index 00000000000..85cc8418eaa
--- /dev/null
+++ b/chromium/webkit/support/platform_support_linux.cc
@@ -0,0 +1,35 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "webkit/support/platform_support.h"
+
+#include "base/file_util.h"
+#include "base/files/file_path.h"
+#include "base/logging.h"
+#include "base/path_service.h"
+#include "base/strings/string16.h"
+#include "base/strings/string_piece.h"
+#include "grit/webkit_resources.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "webkit/support/test_webkit_platform_support.h"
+
+namespace webkit_support {
+
+// TODO(tkent): Implement some of the followings for platform-dependent tasks
+// such as loading resource.
+
+void BeforeInitialize() {
+}
+
+void AfterInitialize() {
+}
+
+void BeforeShutdown() {
+}
+
+void AfterShutdown() {
+}
+
+} // namespace webkit_support
+
diff --git a/chromium/webkit/support/platform_support_mac.mm b/chromium/webkit/support/platform_support_mac.mm
new file mode 100644
index 00000000000..6d96ec13cf8
--- /dev/null
+++ b/chromium/webkit/support/platform_support_mac.mm
@@ -0,0 +1,46 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "webkit/support/platform_support.h"
+
+#import <AppKit/AppKit.h>
+#include <AvailabilityMacros.h>
+#import <Foundation/Foundation.h>
+#import <objc/objc-runtime.h>
+
+#include "base/base_paths.h"
+#include "base/file_util.h"
+#include "base/logging.h"
+#include "base/path_service.h"
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
+#include "grit/webkit_resources.h"
+#include "ui/base/resource/data_pack.h"
+#import "webkit/support/drt_application_mac.h"
+#import "webkit/support/mac/DumpRenderTreePasteboard.h"
+#include "webkit/support/test_webkit_platform_support.h"
+
+namespace webkit_support {
+
+static NSAutoreleasePool* autorelease_pool;
+
+void BeforeInitialize() {
+ [CrDrtApplication sharedApplication];
+ autorelease_pool = [[NSAutoreleasePool alloc] init];
+ DCHECK(autorelease_pool);
+}
+
+void AfterInitialize() {
+}
+
+void BeforeShutdown() {
+}
+
+void AfterShutdown() {
+ [DumpRenderTreePasteboard releaseLocalPasteboards];
+ [autorelease_pool drain];
+}
+
+} // namespace webkit_support
+
diff --git a/chromium/webkit/support/platform_support_win.cc b/chromium/webkit/support/platform_support_win.cc
new file mode 100644
index 00000000000..ce601c5490c
--- /dev/null
+++ b/chromium/webkit/support/platform_support_win.cc
@@ -0,0 +1,36 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "webkit/support/platform_support.h"
+
+#include "base/base_paths.h"
+#include "base/file_util.h"
+#include "base/files/file_path.h"
+#include "base/logging.h"
+#include "base/path_service.h"
+#include "base/strings/string16.h"
+#include "base/strings/string_piece.h"
+#include "base/win/resource_util.h"
+#include "grit/blink_resources.h"
+#include "grit/webkit_resources.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "webkit/support/test_webkit_platform_support.h"
+
+
+namespace webkit_support {
+
+void BeforeInitialize() {
+}
+
+void AfterInitialize() {
+}
+
+void BeforeShutdown() {
+}
+
+void AfterShutdown() {
+}
+
+} // namespace webkit_support
+
diff --git a/chromium/webkit/support/webkit_support.cc b/chromium/webkit/support/webkit_support.cc
index 6f9d41ac3d7..c5846385a70 100644
--- a/chromium/webkit/support/webkit_support.cc
+++ b/chromium/webkit/support/webkit_support.cc
@@ -4,26 +4,77 @@
#include "webkit/support/webkit_support.h"
+#include "base/command_line.h"
+#include "base/debug/debugger.h"
+#include "base/debug/stack_trace.h"
+#include "base/logging.h"
#include "base/message_loop/message_loop.h"
+#include "base/path_service.h"
+#include "base/process/memory.h"
#include "base/run_loop.h"
+#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/WebKit/public/web/WebCache.h"
#include "third_party/WebKit/public/web/WebKit.h"
#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
#include "url/url_util.h"
+#include "webkit/child/webkitplatformsupport_impl.h"
#include "webkit/common/user_agent/user_agent.h"
#include "webkit/common/user_agent/user_agent_util.h"
+#include "webkit/glue/webkit_glue.h"
+#include "webkit/support/platform_support.h"
#include "webkit/support/test_webkit_platform_support.h"
#if defined(OS_ANDROID)
-#include "base/android/jni_android.h"
-#include "net/android/network_library.h"
+#include "base/test/test_support_android.h"
#endif
-#if defined(OS_MACOSX)
-#include "base/test/mock_chrome_application_mac.h"
+namespace {
+
+// All fatal log messages (e.g. DCHECK failures) imply unit test failures
+void UnitTestAssertHandler(const std::string& str) {
+ FAIL() << str;
+}
+
+void InitLogging() {
+#if defined(OS_WIN)
+ if (!::IsDebuggerPresent()) {
+ UINT new_flags = SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX
+ | SEM_NOGPFAULTERRORBOX;
+
+ // Preserve existing error mode, as discussed at
+ // http://blogs.msdn.com/oldnewthing/archive/2004/07/27/198410.aspx
+ UINT existing_flags = SetErrorMode(new_flags);
+ SetErrorMode(existing_flags | new_flags);
+
+ // Don't pop up dialog on assertion failure, log to stdout instead.
+ _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
+ _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
+ }
#endif
-namespace {
+#if defined(OS_ANDROID)
+ // On Android we expect the log to appear in logcat.
+ base::InitAndroidTestLogging();
+#else
+ base::FilePath log_filename;
+ PathService::Get(base::DIR_EXE, &log_filename);
+ log_filename = log_filename.AppendASCII("DumpRenderTree.log");
+ logging::LoggingSettings settings;
+ // Only log to a file. This prevents debugging output from disrupting
+ // whether or not we pass.
+ settings.logging_dest = logging::LOG_TO_FILE;
+ settings.log_file = log_filename.value().c_str();
+ settings.delete_old = logging::DELETE_OLD_LOG_FILE;
+ logging::InitLogging(settings);
+
+ // We want process and thread IDs because we may have multiple processes.
+ const bool kProcessId = true;
+ const bool kThreadId = true;
+ const bool kTimestamp = true;
+ const bool kTickcount = true;
+ logging::SetLogItems(kProcessId, kThreadId, !kTimestamp, kTickcount);
+#endif // else defined(OS_ANDROID)
+}
class TestEnvironment {
public:
@@ -35,6 +86,7 @@ class TestEnvironment {
#endif
TestEnvironment() {
+ logging::SetLogAssertHandler(UnitTestAssertHandler);
main_message_loop_.reset(new MessageLoopType);
// TestWebKitPlatformSupport must be instantiated after MessageLoopType.
@@ -57,24 +109,30 @@ TestEnvironment* test_environment;
namespace webkit_support {
void SetUpTestEnvironmentForUnitTests() {
+ base::debug::EnableInProcessStackDumping();
+ base::EnableTerminationOnHeapCorruption();
+
+ // Initialize the singleton CommandLine with fixed values. Some code refer to
+ // CommandLine::ForCurrentProcess(). We don't use the actual command-line
+ // arguments of DRT to avoid unexpected behavior change.
+ //
+ // webkit/glue/plugin/plugin_list_posix.cc checks --debug-plugin-loading.
+ // webkit/glue/plugin/plugin_list_win.cc checks --old-wmp.
+ // If DRT needs these flags, specify them in the following kFixedArguments.
+ const char* kFixedArguments[] = {"DumpRenderTree"};
+ CommandLine::Init(arraysize(kFixedArguments), kFixedArguments);
+
WebKit::WebRuntimeFeatures::enableStableFeatures(true);
WebKit::WebRuntimeFeatures::enableExperimentalFeatures(true);
WebKit::WebRuntimeFeatures::enableTestOnlyFeatures(true);
-#if defined(OS_ANDROID)
- JNIEnv* env = base::android::AttachCurrentThread();
- net::android::RegisterNetworkLibrary(env);
-#endif
-
-#if defined(OS_MACOSX)
- mock_cr_app::RegisterMockCrApp();
-#endif
-
// Explicitly initialize the GURL library before spawning any threads.
// Otherwise crash may happend when different threads try to create a GURL
// at same time.
url_util::Initialize();
+ webkit_support::BeforeInitialize();
test_environment = new TestEnvironment;
+ webkit_support::AfterInitialize();
webkit_glue::SetUserAgent(webkit_glue::BuildUserAgentFromProduct(
"DumpRenderTree/0.0.0.0"), false);
}
@@ -84,11 +142,14 @@ void TearDownTestEnvironment() {
// http://code.google.com/p/chromium/issues/detail?id=9500
base::RunLoop().RunUntilIdle();
+ BeforeShutdown();
if (RunningOnValgrind())
WebKit::WebCache::clear();
WebKit::shutdown();
delete test_environment;
test_environment = NULL;
+ AfterShutdown();
+ logging::CloseLogFile();
}
} // namespace webkit_support
diff --git a/chromium/webkit/support/webkit_support.gypi b/chromium/webkit/support/webkit_support.gypi
index e8227f06136..bc7fae0b9e7 100644
--- a/chromium/webkit/support/webkit_support.gypi
+++ b/chromium/webkit/support/webkit_support.gypi
@@ -31,6 +31,7 @@
'<(DEPTH)/webkit/renderer/webkit_renderer.gyp:webkit_renderer',
'<(DEPTH)/webkit/storage_browser.gyp:webkit_storage_browser',
'<(DEPTH)/webkit/storage_common.gyp:webkit_storage_common',
+ '<(DEPTH)/webkit/storage_renderer.gyp:webkit_storage_renderer',
'glue',
'glue_child',
'webkit_support_common',
@@ -44,6 +45,13 @@
'UNIT_TEST'
],
'sources': [
+ 'drt_application_mac.h',
+ 'drt_application_mac.mm',
+ 'platform_support.h',
+ 'platform_support_android.cc',
+ 'platform_support_linux.cc',
+ 'platform_support_mac.mm',
+ 'platform_support_win.cc',
'test_webkit_platform_support.cc',
'test_webkit_platform_support.h',
'webkit_support.cc',
@@ -99,6 +107,8 @@
'<(DEPTH)/base/base.gyp:base',
],
'sources': [
+ '<(DEPTH)/webkit/support/mac/DumpRenderTreePasteboard.h',
+ '<(DEPTH)/webkit/support/mac/DumpRenderTreePasteboard.m',
'<(DEPTH)/webkit/support/mock_webclipboard_impl.cc',
'<(DEPTH)/webkit/support/mock_webclipboard_impl.h',
],
diff --git a/chromium/webkit/support/webkit_support.h b/chromium/webkit/support/webkit_support.h
index ed09e67f527..9369be1fe06 100644
--- a/chromium/webkit/support/webkit_support.h
+++ b/chromium/webkit/support/webkit_support.h
@@ -5,10 +5,19 @@
#ifndef WEBKIT_SUPPORT_WEBKIT_SUPPORT_H_
#define WEBKIT_SUPPORT_WEBKIT_SUPPORT_H_
-// This package provides functions used by webkit_unit_tests.
+// This package provides functions used by DumpRenderTree/chromium.
namespace webkit_support {
-// Initializes or terminates a test environment for unit tests.
+// Initializes or terminates a test environment.
+// |unit_test_mode| should be set to true when running in a TestSuite, in which
+// case no AtExitManager is created and ICU is not initialized (as it is already
+// done by the TestSuite).
+// SetUpTestEnvironment() and SetUpTestEnvironmentForUnitTests() calls
+// WebKit::initialize().
+// TearDownTestEnvironment() calls WebKit::shutdown().
+// SetUpTestEnvironmentForUnitTests() should be used when running in a
+// TestSuite, in which case no AtExitManager is created and ICU is not
+// initialized (as it is already done by the TestSuite).
void SetUpTestEnvironmentForUnitTests();
void TearDownTestEnvironment();
diff --git a/ninja/bootstrap.py b/ninja/bootstrap.py
index 5682bf1d250..66ec85bccba 100755
--- a/ninja/bootstrap.py
+++ b/ninja/bootstrap.py
@@ -37,7 +37,7 @@ parser.add_option('--platform',
help='target platform (' + '/'.join(platform_helper.platforms()) + ')',
choices=platform_helper.platforms())
parser.add_option('--force-pselect', action='store_true',
- help="ppoll() is used by default on Linux and OpenBSD, but older versions might need to use pselect instead",)
+ help="ppoll() is used by default on Linux, OpenBSD and Bitrig, but older versions might need to use pselect instead",)
(options, conf_args) = parser.parse_args()
@@ -53,7 +53,7 @@ def run(*args, **kwargs):
# g++ call as well as in the later configure.py.
cflags = os.environ.get('CFLAGS', '').split()
ldflags = os.environ.get('LDFLAGS', '').split()
-if platform.is_freebsd() or platform.is_openbsd():
+if platform.is_freebsd() or platform.is_openbsd() or platform.is_bitrig():
cflags.append('-I/usr/local/include')
ldflags.append('-L/usr/local/lib')
@@ -109,7 +109,7 @@ else:
cflags.append('-D_WIN32_WINNT=0x0501')
if options.x64:
cflags.append('-m64')
-if (platform.is_linux() or platform.is_openbsd()) and not options.force_pselect:
+if (platform.is_linux() or platform.is_openbsd() or platform.is_bitrig()) and not options.force_pselect:
cflags.append('-DUSE_PPOLL')
if options.force_pselect:
conf_args.append("--force-pselect")
diff --git a/ninja/configure.py b/ninja/configure.py
index 22eb1e57566..c838392895d 100755
--- a/ninja/configure.py
+++ b/ninja/configure.py
@@ -48,7 +48,7 @@ parser.add_option('--with-python', metavar='EXE',
help='use EXE as the Python interpreter',
default=os.path.basename(sys.executable))
parser.add_option('--force-pselect', action='store_true',
- help="ppoll() is used by default on Linux and OpenBSD, but older versions might need to use pselect instead",)
+ help="ppoll() is used by default where available, but some platforms may need to use pselect instead",)
(options, args) = parser.parse_args()
if args:
print('ERROR: extra unparsed command-line arguments:', args)
@@ -165,7 +165,7 @@ else:
cflags.append('-fno-omit-frame-pointer')
libs.extend(['-Wl,--no-as-needed', '-lprofiler'])
-if (platform.is_linux() or platform.is_openbsd()) and not options.force_pselect:
+if (platform.is_linux() or platform.is_openbsd() or platform.is_bitrig()) and not options.force_pselect:
cflags.append('-DUSE_PPOLL')
def shell_escape(str):
diff --git a/ninja/doc/manual.asciidoc b/ninja/doc/manual.asciidoc
index aa5644d6451..a7352571c84 100644
--- a/ninja/doc/manual.asciidoc
+++ b/ninja/doc/manual.asciidoc
@@ -54,7 +54,7 @@ Here are the design goals of Ninja:
higher-level build systems have different opinions about how code
should be built; for example, should built objects live alongside
the sources or should all build output go into a separate directory?
- Is there an "package" rule that builds a distributable package of
+ Is there a "package" rule that builds a distributable package of
the project? Sidestep these decisions by trying to allow either to
be implemented, rather than choosing, even if that results in
more verbosity.
@@ -588,6 +588,7 @@ rule cc
command = cl /showIncludes -c $in /Fo$out
----
+[[ref_pool]]
Pools
~~~~~
@@ -668,6 +669,9 @@ A file is a series of declarations. A declaration can be one of:
+include _path_+. The difference between these is explained below
<<ref_scope,in the discussion about scoping>>.
+6. A pool declaration, which looks like +pool _poolname_+. Pools are explained
+ <<ref_pool, in the section on pools>>.
+
Lexical syntax
~~~~~~~~~~~~~~
diff --git a/ninja/platform_helper.py b/ninja/platform_helper.py
index 5097f498baf..b7447a1a122 100644
--- a/ninja/platform_helper.py
+++ b/ninja/platform_helper.py
@@ -19,7 +19,7 @@ import sys
def platforms():
return ['linux', 'darwin', 'freebsd', 'openbsd', 'solaris', 'sunos5',
- 'mingw', 'msvc', 'gnukfreebsd8']
+ 'mingw', 'msvc', 'gnukfreebsd8', 'bitrig']
class Platform( object ):
def __init__( self, platform):
@@ -41,7 +41,8 @@ class Platform( object ):
self._platform = 'mingw'
elif self._platform.startswith('win'):
self._platform = 'msvc'
-
+ elif self._platform.startswith('bitrig'):
+ self._platform = 'bitrig'
def platform(self):
return self._platform
@@ -69,3 +70,6 @@ class Platform( object ):
def is_sunos5(self):
return self._platform == 'sunos5'
+
+ def is_bitrig(self):
+ return self._platform == 'bitrig'
diff --git a/ninja/src/build.cc b/ninja/src/build.cc
index 5cf9d27dfc6..6d23f3bb40f 100644
--- a/ninja/src/build.cc
+++ b/ninja/src/build.cc
@@ -362,8 +362,11 @@ void Plan::ResumeDelayedJobs(Edge* edge) {
void Plan::EdgeFinished(Edge* edge) {
map<Edge*, bool>::iterator i = want_.find(edge);
assert(i != want_.end());
- if (i->second)
+ if (i->second) {
--wanted_edges_;
+ if (!edge->is_phony())
+ --command_edges_;
+ }
want_.erase(i);
edge->outputs_ready_ = true;
@@ -422,24 +425,22 @@ void Plan::CleanNode(DependencyScan* scan, Node* node) {
}
string command = (*ei)->EvaluateCommand(true);
- // Now, recompute the dirty state of each output.
- bool all_outputs_clean = true;
+ // Now, this edge is dirty if any of the outputs are dirty.
+ bool dirty = false;
for (vector<Node*>::iterator ni = (*ei)->outputs_.begin();
- ni != (*ei)->outputs_.end(); ++ni) {
- if (!(*ni)->dirty())
- continue;
-
- if (scan->RecomputeOutputDirty(*ei, most_recent_input, 0,
- command, *ni)) {
- (*ni)->MarkDirty();
- all_outputs_clean = false;
- } else {
+ !dirty && ni != (*ei)->outputs_.end(); ++ni) {
+ dirty = scan->RecomputeOutputDirty(*ei, most_recent_input, 0,
+ command, *ni);
+ }
+
+ // If the edge isn't dirty, clean the outputs and mark the edge as not
+ // wanted.
+ if (!dirty) {
+ for (vector<Node*>::iterator ni = (*ei)->outputs_.begin();
+ ni != (*ei)->outputs_.end(); ++ni) {
CleanNode(scan, *ni);
}
- }
- // If we cleaned all outputs, mark the node as not wanted.
- if (all_outputs_clean) {
want_i->second = false;
--wanted_edges_;
if (!(*ei)->is_phony())
@@ -641,7 +642,10 @@ bool Builder::Build(string* err) {
}
--pending_commands;
- FinishCommand(&result);
+ if (!FinishCommand(&result, err)) {
+ status_->BuildFinished();
+ return false;
+ }
if (!result.success()) {
if (failures_allowed)
@@ -704,7 +708,7 @@ bool Builder::StartEdge(Edge* edge, string* err) {
return true;
}
-void Builder::FinishCommand(CommandRunner::Result* result) {
+bool Builder::FinishCommand(CommandRunner::Result* result, string* err) {
METRIC_RECORD("FinishCommand");
Edge* edge = result->edge;
@@ -733,7 +737,7 @@ void Builder::FinishCommand(CommandRunner::Result* result) {
// The rest of this function only applies to successful commands.
if (!result->success())
- return;
+ return true;
// Restat the edge outputs, if necessary.
TimeStamp restat_mtime = 0;
@@ -763,7 +767,7 @@ void Builder::FinishCommand(CommandRunner::Result* result) {
}
string depfile = edge->GetBinding("depfile");
- if (restat_mtime != 0 && !depfile.empty()) {
+ if (restat_mtime != 0 && deps_type.empty() && !depfile.empty()) {
TimeStamp depfile_mtime = disk_interface_->Stat(depfile);
if (depfile_mtime > restat_mtime)
restat_mtime = depfile_mtime;
@@ -783,17 +787,23 @@ void Builder::FinishCommand(CommandRunner::Result* result) {
disk_interface_->RemoveFile(rspfile);
if (scan_.build_log()) {
- scan_.build_log()->RecordCommand(edge, start_time, end_time,
- restat_mtime);
+ if (!scan_.build_log()->RecordCommand(edge, start_time, end_time,
+ restat_mtime)) {
+ *err = string("Error writing to build log: ") + strerror(errno);
+ return false;
+ }
}
if (!deps_type.empty() && !config_.dry_run) {
assert(edge->outputs_.size() == 1 && "should have been rejected by parser");
Node* out = edge->outputs_[0];
TimeStamp deps_mtime = disk_interface_->Stat(out->path());
- scan_.deps_log()->RecordDeps(out, deps_mtime, deps_nodes);
+ if (!scan_.deps_log()->RecordDeps(out, deps_mtime, deps_nodes)) {
+ *err = string("Error writing to deps log: ") + strerror(errno);
+ return false;
+ }
}
-
+ return true;
}
bool Builder::ExtractDeps(CommandRunner::Result* result,
diff --git a/ninja/src/build.h b/ninja/src/build.h
index 2715c0cf722..a872f6cf282 100644
--- a/ninja/src/build.h
+++ b/ninja/src/build.h
@@ -51,7 +51,7 @@ struct Plan {
Edge* FindWork();
/// Returns true if there's more work to be done.
- bool more_to_do() const { return wanted_edges_; }
+ bool more_to_do() const { return (command_edges_ > 0); }
/// Dumps the current state of the plan.
void Dump();
@@ -163,7 +163,10 @@ struct Builder {
bool Build(string* err);
bool StartEdge(Edge* edge, string* err);
- void FinishCommand(CommandRunner::Result* result);
+
+ /// Update status ninja logs following a command termination.
+ /// @return false if the build can not proceed further due to a fatal error.
+ bool FinishCommand(CommandRunner::Result* result, string* err);
/// Used for tests.
void SetBuildLog(BuildLog* log) {
diff --git a/ninja/src/build_log.cc b/ninja/src/build_log.cc
index 6b730028510..1374bd068f8 100644
--- a/ninja/src/build_log.cc
+++ b/ninja/src/build_log.cc
@@ -54,26 +54,27 @@ uint64_t MurmurHash64A(const void* key, size_t len) {
const uint64_t m = BIG_CONSTANT(0xc6a4a7935bd1e995);
const int r = 47;
uint64_t h = seed ^ (len * m);
- const uint64_t * data = (const uint64_t *)key;
- const uint64_t * end = data + (len/8);
- while (data != end) {
- uint64_t k = *data++;
+ const unsigned char * data = (const unsigned char *)key;
+ while (len >= 8) {
+ uint64_t k;
+ memcpy(&k, data, sizeof k);
k *= m;
k ^= k >> r;
k *= m;
h ^= k;
h *= m;
+ data += 8;
+ len -= 8;
}
- const unsigned char* data2 = (const unsigned char*)data;
switch (len & 7)
{
- case 7: h ^= uint64_t(data2[6]) << 48;
- case 6: h ^= uint64_t(data2[5]) << 40;
- case 5: h ^= uint64_t(data2[4]) << 32;
- case 4: h ^= uint64_t(data2[3]) << 24;
- case 3: h ^= uint64_t(data2[2]) << 16;
- case 2: h ^= uint64_t(data2[1]) << 8;
- case 1: h ^= uint64_t(data2[0]);
+ case 7: h ^= uint64_t(data[6]) << 48;
+ case 6: h ^= uint64_t(data[5]) << 40;
+ case 5: h ^= uint64_t(data[4]) << 32;
+ case 4: h ^= uint64_t(data[3]) << 24;
+ case 3: h ^= uint64_t(data[2]) << 16;
+ case 2: h ^= uint64_t(data[1]) << 8;
+ case 1: h ^= uint64_t(data[0]);
h *= m;
};
h ^= h >> r;
@@ -109,7 +110,6 @@ BuildLog::~BuildLog() {
bool BuildLog::OpenForWrite(const string& path, string* err) {
if (needs_recompaction_) {
- Close();
if (!Recompact(path, err))
return false;
}
@@ -136,7 +136,7 @@ bool BuildLog::OpenForWrite(const string& path, string* err) {
return true;
}
-void BuildLog::RecordCommand(Edge* edge, int start_time, int end_time,
+bool BuildLog::RecordCommand(Edge* edge, int start_time, int end_time,
TimeStamp restat_mtime) {
string command = edge->EvaluateCommand(true);
uint64_t command_hash = LogEntry::HashCommand(command);
@@ -156,9 +156,12 @@ void BuildLog::RecordCommand(Edge* edge, int start_time, int end_time,
log_entry->end_time = end_time;
log_entry->restat_mtime = restat_mtime;
- if (log_file_)
- WriteEntry(log_file_, *log_entry);
+ if (log_file_) {
+ if (!WriteEntry(log_file_, *log_entry))
+ return false;
+ }
}
+ return true;
}
void BuildLog::Close() {
@@ -341,16 +344,17 @@ BuildLog::LogEntry* BuildLog::LookupByOutput(const string& path) {
return NULL;
}
-void BuildLog::WriteEntry(FILE* f, const LogEntry& entry) {
- fprintf(f, "%d\t%d\t%d\t%s\t%" PRIx64 "\n",
+bool BuildLog::WriteEntry(FILE* f, const LogEntry& entry) {
+ return fprintf(f, "%d\t%d\t%d\t%s\t%" PRIx64 "\n",
entry.start_time, entry.end_time, entry.restat_mtime,
- entry.output.c_str(), entry.command_hash);
+ entry.output.c_str(), entry.command_hash) > 0;
}
bool BuildLog::Recompact(const string& path, string* err) {
METRIC_RECORD(".ninja_log recompact");
printf("Recompacting log...\n");
+ Close();
string temp_path = path + ".recompact";
FILE* f = fopen(temp_path.c_str(), "wb");
if (!f) {
@@ -365,7 +369,11 @@ bool BuildLog::Recompact(const string& path, string* err) {
}
for (Entries::iterator i = entries_.begin(); i != entries_.end(); ++i) {
- WriteEntry(f, *i->second);
+ if (!WriteEntry(f, *i->second)) {
+ *err = strerror(errno);
+ fclose(f);
+ return false;
+ }
}
fclose(f);
diff --git a/ninja/src/build_log.h b/ninja/src/build_log.h
index 6eae89f87ee..eeac5b3b0b4 100644
--- a/ninja/src/build_log.h
+++ b/ninja/src/build_log.h
@@ -37,7 +37,7 @@ struct BuildLog {
~BuildLog();
bool OpenForWrite(const string& path, string* err);
- void RecordCommand(Edge* edge, int start_time, int end_time,
+ bool RecordCommand(Edge* edge, int start_time, int end_time,
TimeStamp restat_mtime = 0);
void Close();
@@ -69,7 +69,7 @@ struct BuildLog {
LogEntry* LookupByOutput(const string& path);
/// Serialize an entry into a log file.
- void WriteEntry(FILE* f, const LogEntry& entry);
+ bool WriteEntry(FILE* f, const LogEntry& entry);
/// Rewrite the known log entries, throwing away old data.
bool Recompact(const string& path, string* err);
diff --git a/ninja/src/build_test.cc b/ninja/src/build_test.cc
index 313a386fc43..d1ac0efb8bb 100644
--- a/ninja/src/build_test.cc
+++ b/ninja/src/build_test.cc
@@ -1094,6 +1094,46 @@ TEST_F(BuildWithLogTest, RestatMissingFile) {
ASSERT_EQ(1u, command_runner_.commands_ran_.size());
}
+TEST_F(BuildWithLogTest, RestatSingleDependentOutputDirty) {
+ ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
+ "rule true\n"
+ " command = true\n"
+ " restat = 1\n"
+ "rule touch\n"
+ " command = touch\n"
+ "build out1: true in\n"
+ "build out2 out3: touch out1\n"
+ "build out4: touch out2\n"
+ ));
+
+ // Create the necessary files
+ fs_.Create("in", "");
+
+ string err;
+ EXPECT_TRUE(builder_.AddTarget("out4", &err));
+ ASSERT_EQ("", err);
+ EXPECT_TRUE(builder_.Build(&err));
+ ASSERT_EQ("", err);
+ ASSERT_EQ(3u, command_runner_.commands_ran_.size());
+
+ fs_.Tick();
+ fs_.Create("in", "");
+ fs_.RemoveFile("out3");
+
+ // Since "in" is missing, out1 will be built. Since "out3" is missing,
+ // out2 and out3 will be built even though "in" is not touched when built.
+ // Then, since out2 is rebuilt, out4 should be rebuilt -- the restat on the
+ // "true" rule should not lead to the "touch" edge writing out2 and out3 being
+ // cleard.
+ command_runner_.commands_ran_.clear();
+ state_.Reset();
+ EXPECT_TRUE(builder_.AddTarget("out4", &err));
+ ASSERT_EQ("", err);
+ EXPECT_TRUE(builder_.Build(&err));
+ ASSERT_EQ("", err);
+ ASSERT_EQ(3u, command_runner_.commands_ran_.size());
+}
+
// Test scenario, in which an input file is removed, but output isn't changed
// https://github.com/martine/ninja/issues/295
TEST_F(BuildWithLogTest, RestatMissingInput) {
diff --git a/ninja/src/deps_log.cc b/ninja/src/deps_log.cc
index ce9bf06b3f3..2c4e3c29a1f 100644
--- a/ninja/src/deps_log.cc
+++ b/ninja/src/deps_log.cc
@@ -37,13 +37,15 @@ const int kCurrentVersion = 1;
// buffer after every record to make sure records aren't written partially.
const int kMaxBufferSize = 1 << 15;
+// Record size is currently limited to 15 bit
+const size_t kMaxRecordSize = (1 << 15) - 1;
+
DepsLog::~DepsLog() {
Close();
}
bool DepsLog::OpenForWrite(const string& path, string* err) {
if (needs_recompaction_) {
- Close();
if (!Recompact(path, err))
return false;
}
@@ -70,8 +72,10 @@ bool DepsLog::OpenForWrite(const string& path, string* err) {
return false;
}
}
- fflush(file_);
-
+ if (fflush(file_) != 0) {
+ *err = strerror(errno);
+ return false;
+ }
return true;
}
@@ -88,12 +92,14 @@ bool DepsLog::RecordDeps(Node* node, TimeStamp mtime,
// Assign ids to all nodes that are missing one.
if (node->id() < 0) {
- RecordId(node);
+ if (!RecordId(node))
+ return false;
made_change = true;
}
for (int i = 0; i < node_count; ++i) {
if (nodes[i]->id() < 0) {
- RecordId(nodes[i]);
+ if (!RecordId(nodes[i]))
+ return false;
made_change = true;
}
}
@@ -120,18 +126,28 @@ bool DepsLog::RecordDeps(Node* node, TimeStamp mtime,
return true;
// Update on-disk representation.
- uint16_t size = 4 * (1 + 1 + (uint16_t)node_count);
+ size_t size = 4 * (1 + 1 + (uint16_t)node_count);
+ if (size > kMaxRecordSize) {
+ errno = ERANGE;
+ return false;
+ }
size |= 0x8000; // Deps record: set high bit.
- fwrite(&size, 2, 1, file_);
+ uint16_t size16 = (uint16_t)size;
+ if (fwrite(&size16, 2, 1, file_) < 1)
+ return false;
int id = node->id();
- fwrite(&id, 4, 1, file_);
+ if (fwrite(&id, 4, 1, file_) < 1)
+ return false;
int timestamp = mtime;
- fwrite(&timestamp, 4, 1, file_);
+ if (fwrite(&timestamp, 4, 1, file_) < 1)
+ return false;
for (int i = 0; i < node_count; ++i) {
id = nodes[i]->id();
- fwrite(&id, 4, 1, file_);
+ if (fwrite(&id, 4, 1, file_) < 1)
+ return false;
}
- fflush(file_);
+ if (fflush(file_) != 0)
+ return false;
// Update in-memory representation.
Deps* deps = new Deps(mtime, node_count);
@@ -265,6 +281,7 @@ bool DepsLog::Recompact(const string& path, string* err) {
METRIC_RECORD(".ninja_deps recompact");
printf("Recompacting deps...\n");
+ Close();
string temp_path = path + ".recompact";
// OpenForWrite() opens for append. Make sure it's not appending to a
@@ -323,10 +340,20 @@ bool DepsLog::UpdateDeps(int out_id, Deps* deps) {
}
bool DepsLog::RecordId(Node* node) {
- uint16_t size = (uint16_t)node->path().size();
- fwrite(&size, 2, 1, file_);
- fwrite(node->path().data(), node->path().size(), 1, file_);
- fflush(file_);
+ size_t size = node->path().size();
+ if (size > kMaxRecordSize) {
+ errno = ERANGE;
+ return false;
+ }
+ uint16_t size16 = (uint16_t)size;
+ if (fwrite(&size16, 2, 1, file_) < 1)
+ return false;
+ if (fwrite(node->path().data(), node->path().size(), 1, file_) < 1) {
+ assert(node->path().size() > 0);
+ return false;
+ }
+ if (fflush(file_) != 0)
+ return false;
node->set_id(nodes_.size());
nodes_.push_back(node);
diff --git a/ninja/src/graph_test.cc b/ninja/src/graph_test.cc
index 63d5757da92..85212167e95 100644
--- a/ninja/src/graph_test.cc
+++ b/ninja/src/graph_test.cc
@@ -13,6 +13,7 @@
// limitations under the License.
#include "graph.h"
+#include "build.h"
#include "test.h"
@@ -226,3 +227,22 @@ TEST_F(GraphTest, DepfileOverrideParent) {
Edge* edge = GetNode("out")->in_edge();
EXPECT_EQ("depfile is y", edge->GetBinding("command"));
}
+
+// Verify that building a nested phony rule prints "no work to do"
+TEST_F(GraphTest, NestedPhonyPrintsDone) {
+ AssertParse(&state_,
+"build n1: phony \n"
+"build n2: phony n1\n"
+ );
+ string err;
+ Edge* edge = GetNode("n2")->in_edge();
+ EXPECT_TRUE(scan_.RecomputeDirty(edge, &err));
+ ASSERT_EQ("", err);
+
+ Plan plan_;
+ EXPECT_TRUE(plan_.AddTarget(GetNode("n2"), &err));
+ ASSERT_EQ("", err);
+
+ EXPECT_EQ(0, plan_.command_edge_count());
+ ASSERT_FALSE(plan_.more_to_do());
+}
diff --git a/ninja/src/hash_map.h b/ninja/src/hash_map.h
index 076f6c02198..919b6fc5d14 100644
--- a/ninja/src/hash_map.h
+++ b/ninja/src/hash_map.h
@@ -15,6 +15,7 @@
#ifndef NINJA_MAP_H_
#define NINJA_MAP_H_
+#include <string.h>
#include "string_piece.h"
// MurmurHash2, by Austin Appleby
@@ -26,7 +27,8 @@ unsigned int MurmurHash2(const void* key, size_t len) {
unsigned int h = seed ^ len;
const unsigned char * data = (const unsigned char *)key;
while (len >= 4) {
- unsigned int k = *(unsigned int *)data;
+ unsigned int k;
+ memcpy(&k, data, sizeof k);
k *= m;
k ^= k >> r;
k *= m;
diff --git a/ninja/src/line_printer.cc b/ninja/src/line_printer.cc
index a75eb0505f4..3537e886e69 100644
--- a/ninja/src/line_printer.cc
+++ b/ninja/src/line_printer.cc
@@ -104,6 +104,10 @@ void LinePrinter::Print(string to_print, LineType type) {
void LinePrinter::PrintOnNewLine(const string& to_print) {
if (!have_blank_line_)
printf("\n");
- printf("%s", to_print.c_str());
+ if (!to_print.empty()) {
+ // Avoid printf and C strings, since the actual output might contain null
+ // bytes like UTF-16 does (yuck).
+ fwrite(&to_print[0], sizeof(char), to_print.size(), stdout);
+ }
have_blank_line_ = to_print.empty() || *to_print.rbegin() == '\n';
}
diff --git a/ninja/src/manifest_parser.cc b/ninja/src/manifest_parser.cc
index d742331bb76..20be7f3777f 100644
--- a/ninja/src/manifest_parser.cc
+++ b/ninja/src/manifest_parser.cc
@@ -28,20 +28,30 @@ ManifestParser::ManifestParser(State* state, FileReader* file_reader)
: state_(state), file_reader_(file_reader) {
env_ = &state->bindings_;
}
-bool ManifestParser::Load(const string& filename, string* err) {
+
+bool ManifestParser::Load(const string& filename, string* err, Lexer* parent) {
+ METRIC_RECORD(".ninja parse");
string contents;
string read_err;
if (!file_reader_->ReadFile(filename, &contents, &read_err)) {
*err = "loading '" + filename + "': " + read_err;
+ if (parent)
+ parent->Error(string(*err), err);
return false;
}
- contents.resize(contents.size() + 10);
+
+ // The lexer needs a nul byte at the end of its input, to know when it's done.
+ // It takes a StringPiece, and StringPiece's string constructor uses
+ // string::data(). data()'s return value isn't guaranteed to be
+ // null-terminated (although in practice - libc++, libstdc++, msvc's stl --
+ // it is, and C++11 demands that too), so add an explicit nul byte.
+ contents.resize(contents.size() + 1);
+
return Parse(filename, contents, err);
}
bool ManifestParser::Parse(const string& filename, const string& input,
string* err) {
- METRIC_RECORD(".ninja parse");
lexer_.Start(filename, input);
for (;;) {
@@ -146,10 +156,8 @@ bool ManifestParser::ParseRule(string* err) {
if (!ExpectToken(Lexer::NEWLINE, err))
return false;
- if (state_->LookupRule(name) != NULL) {
- *err = "duplicate rule '" + name + "'";
- return false;
- }
+ if (state_->LookupRule(name) != NULL)
+ return lexer_.Error("duplicate rule '" + name + "'", err);
Rule* rule = new Rule(name); // XXX scoped_ptr
@@ -307,7 +315,7 @@ bool ManifestParser::ParseEdge(string* err) {
if (!pool_name.empty()) {
Pool* pool = state_->LookupPool(pool_name);
if (pool == NULL)
- return lexer_.Error("unknown pool name", err);
+ return lexer_.Error("unknown pool name '" + pool_name + "'", err);
edge->pool_ = pool;
}
@@ -340,17 +348,11 @@ bool ManifestParser::ParseEdge(string* err) {
}
bool ManifestParser::ParseFileInclude(bool new_scope, string* err) {
- // XXX this should use ReadPath!
EvalString eval;
if (!lexer_.ReadPath(&eval, err))
return false;
string path = eval.Evaluate(env_);
- string contents;
- string read_err;
- if (!file_reader_->ReadFile(path, &contents, &read_err))
- return lexer_.Error("loading '" + path + "': " + read_err, err);
-
ManifestParser subparser(state_, file_reader_);
if (new_scope) {
subparser.env_ = new BindingEnv(env_);
@@ -358,7 +360,7 @@ bool ManifestParser::ParseFileInclude(bool new_scope, string* err) {
subparser.env_ = env_;
}
- if (!subparser.Parse(path, contents, err))
+ if (!subparser.Load(path, err, &lexer_))
return false;
if (!ExpectToken(Lexer::NEWLINE, err))
diff --git a/ninja/src/manifest_parser.h b/ninja/src/manifest_parser.h
index 967dfddc306..5212f72ba1b 100644
--- a/ninja/src/manifest_parser.h
+++ b/ninja/src/manifest_parser.h
@@ -35,7 +35,7 @@ struct ManifestParser {
ManifestParser(State* state, FileReader* file_reader);
/// Load and parse a file.
- bool Load(const string& filename, string* err);
+ bool Load(const string& filename, string* err, Lexer* parent=NULL);
/// Parse a text string of input. Used by tests.
bool ParseTest(const string& input, string* err) {
diff --git a/ninja/src/manifest_parser_test.cc b/ninja/src/manifest_parser_test.cc
index 2638edc488f..5ed158408fc 100644
--- a/ninja/src/manifest_parser_test.cc
+++ b/ninja/src/manifest_parser_test.cc
@@ -302,6 +302,17 @@ TEST_F(ParserTest, Errors) {
State state;
ManifestParser parser(&state, NULL);
string err;
+ EXPECT_FALSE(parser.ParseTest(string("subn", 4), &err));
+ EXPECT_EQ("input:1: expected '=', got eof\n"
+ "subn\n"
+ " ^ near here"
+ , err);
+ }
+
+ {
+ State state;
+ ManifestParser parser(&state, NULL);
+ string err;
EXPECT_FALSE(parser.ParseTest("foobar", &err));
EXPECT_EQ("input:1: expected '=', got eof\n"
"foobar\n"
@@ -377,6 +388,17 @@ TEST_F(ParserTest, Errors) {
State state;
ManifestParser parser(&state, NULL);
string err;
+ EXPECT_FALSE(parser.ParseTest("build\n", &err));
+ EXPECT_EQ("input:1: expected path\n"
+ "build\n"
+ " ^ near here"
+ , err);
+ }
+
+ {
+ State state;
+ ManifestParser parser(&state, NULL);
+ string err;
EXPECT_FALSE(parser.ParseTest("build x: y z\n", &err));
EXPECT_EQ("input:1: unknown build rule 'y'\n"
"build x: y z\n"
@@ -422,6 +444,32 @@ TEST_F(ParserTest, Errors) {
ManifestParser parser(&state, NULL);
string err;
EXPECT_FALSE(parser.ParseTest("rule cat\n"
+ " command = echo\n"
+ "rule cat\n"
+ " command = echo\n", &err));
+ EXPECT_EQ("input:3: duplicate rule 'cat'\n"
+ "rule cat\n"
+ " ^ near here"
+ , err);
+ }
+
+ {
+ State state;
+ ManifestParser parser(&state, NULL);
+ string err;
+ EXPECT_FALSE(parser.ParseTest("rule cat\n"
+ " command = echo\n"
+ " rspfile = cat.rsp\n", &err));
+ EXPECT_EQ(
+ "input:4: rspfile and rspfile_content need to be both specified\n",
+ err);
+ }
+
+ {
+ State state;
+ ManifestParser parser(&state, NULL);
+ string err;
+ EXPECT_FALSE(parser.ParseTest("rule cat\n"
" command = ${fafsd\n"
"foo = bar\n",
&err));
@@ -583,6 +631,71 @@ TEST_F(ParserTest, Errors) {
" generator = 1\n", &err));
EXPECT_EQ("input:4: unexpected indent\n", err);
}
+
+ {
+ State state;
+ ManifestParser parser(&state, NULL);
+ string err;
+ EXPECT_FALSE(parser.ParseTest("pool\n", &err));
+ EXPECT_EQ("input:1: expected pool name\n", err);
+ }
+
+ {
+ State state;
+ ManifestParser parser(&state, NULL);
+ string err;
+ EXPECT_FALSE(parser.ParseTest("pool foo\n", &err));
+ EXPECT_EQ("input:2: expected 'depth =' line\n", err);
+ }
+
+ {
+ State state;
+ ManifestParser parser(&state, NULL);
+ string err;
+ EXPECT_FALSE(parser.ParseTest("pool foo\n"
+ " depth = 4\n"
+ "pool foo\n", &err));
+ EXPECT_EQ("input:3: duplicate pool 'foo'\n"
+ "pool foo\n"
+ " ^ near here"
+ , err);
+ }
+
+ {
+ State state;
+ ManifestParser parser(&state, NULL);
+ string err;
+ EXPECT_FALSE(parser.ParseTest("pool foo\n"
+ " depth = -1\n", &err));
+ EXPECT_EQ("input:2: invalid pool depth\n"
+ " depth = -1\n"
+ " ^ near here"
+ , err);
+ }
+
+ {
+ State state;
+ ManifestParser parser(&state, NULL);
+ string err;
+ EXPECT_FALSE(parser.ParseTest("pool foo\n"
+ " bar = 1\n", &err));
+ EXPECT_EQ("input:2: unexpected variable 'bar'\n"
+ " bar = 1\n"
+ " ^ near here"
+ , err);
+ }
+
+ {
+ State state;
+ ManifestParser parser(&state, NULL);
+ string err;
+ // Pool names are dereferenced at edge parsing time.
+ EXPECT_FALSE(parser.ParseTest("rule run\n"
+ " command = echo\n"
+ " pool = unnamed_pool\n"
+ "build out: run in\n", &err));
+ EXPECT_EQ("input:5: unknown pool name 'unnamed_pool'\n", err);
+ }
}
TEST_F(ParserTest, MissingInput) {
@@ -660,6 +773,17 @@ TEST_F(ParserTest, Include) {
EXPECT_EQ("inner", state.bindings_.LookupVariable("var"));
}
+TEST_F(ParserTest, BrokenInclude) {
+ files_["include.ninja"] = "build\n";
+ ManifestParser parser(&state, this);
+ string err;
+ EXPECT_FALSE(parser.ParseTest("include include.ninja\n", &err));
+ EXPECT_EQ("include.ninja:1: expected path\n"
+ "build\n"
+ " ^ near here"
+ , err);
+}
+
TEST_F(ParserTest, Implicit) {
ASSERT_NO_FATAL_FAILURE(AssertParse(
"rule cat\n"
diff --git a/ninja/src/ninja.cc b/ninja/src/ninja.cc
index 3b381b762d7..0586bdca907 100644
--- a/ninja/src/ninja.cc
+++ b/ninja/src/ninja.cc
@@ -104,21 +104,23 @@ struct NinjaMain {
// The various subcommands, run via "-t XXX".
int ToolGraph(int argc, char* argv[]);
int ToolQuery(int argc, char* argv[]);
+ int ToolDeps(int argc, char* argv[]);
int ToolBrowse(int argc, char* argv[]);
int ToolMSVC(int argc, char* argv[]);
int ToolTargets(int argc, char* argv[]);
int ToolCommands(int argc, char* argv[]);
int ToolClean(int argc, char* argv[]);
int ToolCompilationDatabase(int argc, char* argv[]);
+ int ToolRecompact(int argc, char* argv[]);
int ToolUrtle(int argc, char** argv);
/// Open the build log.
/// @return false on error.
- bool OpenBuildLog();
+ bool OpenBuildLog(bool recompact_only = false);
/// Open the deps log: load it, then open for writing.
/// @return false on error.
- bool OpenDepsLog();
+ bool OpenDepsLog(bool recompact_only = false);
/// Ensure the build directory exists, creating it if necessary.
/// @return false on error.
@@ -437,6 +439,45 @@ int ToolTargetsList(State* state) {
return 0;
}
+int NinjaMain::ToolDeps(int argc, char** argv) {
+ vector<Node*> nodes;
+ if (argc == 0) {
+ for (vector<Node*>::const_iterator ni = deps_log_.nodes().begin();
+ ni != deps_log_.nodes().end(); ++ni) {
+ // Only query for targets with an incoming edge and deps
+ Edge* e = (*ni)->in_edge();
+ if (e && !e->GetBinding("deps").empty())
+ nodes.push_back(*ni);
+ }
+ } else {
+ string err;
+ if (!CollectTargetsFromArgs(argc, argv, &nodes, &err)) {
+ Error("%s", err.c_str());
+ return 1;
+ }
+ }
+
+ RealDiskInterface disk_interface;
+ for (vector<Node*>::iterator it = nodes.begin(), end = nodes.end();
+ it != end; ++it) {
+ DepsLog::Deps* deps = deps_log_.GetDeps(*it);
+ if (!deps) {
+ printf("%s: deps not found\n", (*it)->path().c_str());
+ continue;
+ }
+
+ TimeStamp mtime = disk_interface.Stat((*it)->path());
+ printf("%s: #deps %d, deps mtime %d (%s)\n",
+ (*it)->path().c_str(), deps->node_count, deps->mtime,
+ (!mtime || mtime > deps->mtime ? "STALE":"VALID"));
+ for (int i = 0; i < deps->node_count; ++i)
+ printf(" %s\n", deps->nodes[i]->path().c_str());
+ printf("\n");
+ }
+
+ return 0;
+}
+
int NinjaMain::ToolTargets(int argc, char* argv[]) {
int depth = 1;
if (argc >= 1) {
@@ -602,6 +643,17 @@ int NinjaMain::ToolCompilationDatabase(int argc, char* argv[]) {
return 0;
}
+int NinjaMain::ToolRecompact(int argc, char* argv[]) {
+ if (!EnsureBuildDirExists())
+ return 1;
+
+ if (!OpenBuildLog(/*recompact_only=*/true) ||
+ !OpenDepsLog(/*recompact_only=*/true))
+ return 1;
+
+ return 0;
+}
+
int NinjaMain::ToolUrtle(int argc, char** argv) {
// RLE encoded.
const char* urtle =
@@ -644,6 +696,8 @@ const Tool* ChooseTool(const string& tool_name) {
Tool::RUN_AFTER_LOAD, &NinjaMain::ToolClean },
{ "commands", "list all commands required to rebuild given targets",
Tool::RUN_AFTER_LOAD, &NinjaMain::ToolCommands },
+ { "deps", "show dependencies stored in the deps log",
+ Tool::RUN_AFTER_LOGS, &NinjaMain::ToolDeps },
{ "graph", "output graphviz dot file for targets",
Tool::RUN_AFTER_LOAD, &NinjaMain::ToolGraph },
{ "query", "show inputs/outputs for a path",
@@ -652,6 +706,8 @@ const Tool* ChooseTool(const string& tool_name) {
Tool::RUN_AFTER_LOAD, &NinjaMain::ToolTargets },
{ "compdb", "dump JSON compilation database to stdout",
Tool::RUN_AFTER_LOAD, &NinjaMain::ToolCompilationDatabase },
+ { "recompact", "recompacts ninja-internal data structures",
+ Tool::RUN_AFTER_LOAD, &NinjaMain::ToolRecompact },
{ "urtle", NULL,
Tool::RUN_AFTER_FLAGS, &NinjaMain::ToolUrtle },
{ NULL, NULL, Tool::RUN_AFTER_FLAGS, NULL }
@@ -712,7 +768,7 @@ bool DebugEnable(const string& name) {
}
}
-bool NinjaMain::OpenBuildLog() {
+bool NinjaMain::OpenBuildLog(bool recompact_only) {
string log_path = ".ninja_log";
if (!build_dir_.empty())
log_path = build_dir_ + "/" + log_path;
@@ -728,6 +784,13 @@ bool NinjaMain::OpenBuildLog() {
err.clear();
}
+ if (recompact_only) {
+ bool success = build_log_.Recompact(log_path, &err);
+ if (!success)
+ Error("failed recompaction: %s", err.c_str());
+ return success;
+ }
+
if (!config_.dry_run) {
if (!build_log_.OpenForWrite(log_path, &err)) {
Error("opening build log: %s", err.c_str());
@@ -740,7 +803,7 @@ bool NinjaMain::OpenBuildLog() {
/// Open the deps log: load it, then open for writing.
/// @return false on error.
-bool NinjaMain::OpenDepsLog() {
+bool NinjaMain::OpenDepsLog(bool recompact_only) {
string path = ".ninja_deps";
if (!build_dir_.empty())
path = build_dir_ + "/" + path;
@@ -756,6 +819,13 @@ bool NinjaMain::OpenDepsLog() {
err.clear();
}
+ if (recompact_only) {
+ bool success = deps_log_.Recompact(path, &err);
+ if (!success)
+ Error("failed recompaction: %s", err.c_str());
+ return success;
+ }
+
if (!config_.dry_run) {
if (!deps_log_.OpenForWrite(path, &err)) {
Error("opening deps log: %s", err.c_str());
@@ -936,6 +1006,7 @@ int real_main(int argc, char** argv) {
options.input_file = "build.ninja";
setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
+ const char* ninja_command = argv[0];
int exit_code = ReadFlags(&argc, &argv, &options, &config);
if (exit_code >= 0)
@@ -944,7 +1015,7 @@ int real_main(int argc, char** argv) {
if (options.tool && options.tool->when == Tool::RUN_AFTER_FLAGS) {
// None of the RUN_AFTER_FLAGS actually use a NinjaMain, but it's needed
// by other tools.
- NinjaMain ninja(argv[0], config);
+ NinjaMain ninja(ninja_command, config);
return (ninja.*options.tool->func)(argc, argv);
}
@@ -964,7 +1035,7 @@ int real_main(int argc, char** argv) {
// The build can take up to 2 passes: one to rebuild the manifest, then
// another to build the desired target.
for (int cycle = 0; cycle < 2; ++cycle) {
- NinjaMain ninja(argv[0], config);
+ NinjaMain ninja(ninja_command, config);
RealFileReader file_reader;
ManifestParser parser(&ninja.state_, &file_reader);
diff --git a/ninja/src/subprocess-posix.cc b/ninja/src/subprocess-posix.cc
index b396f84b2b4..a9af756dca4 100644
--- a/ninja/src/subprocess-posix.cc
+++ b/ninja/src/subprocess-posix.cc
@@ -41,7 +41,7 @@ bool Subprocess::Start(SubprocessSet* set, const string& command) {
Fatal("pipe: %s", strerror(errno));
fd_ = output_pipe[0];
#if !defined(USE_PPOLL)
- // On Linux and OpenBSD, we use ppoll in DoWork(); elsewhere we use pselect
+ // If available, we use ppoll in DoWork(); otherwise we use pselect
// and so must avoid overly-large FDs.
if (fd_ >= static_cast<int>(FD_SETSIZE))
Fatal("pipe: %s", strerror(EMFILE));
@@ -224,7 +224,7 @@ bool SubprocessSet::DoWork() {
return interrupted_;
}
-#else // linux || __OpenBSD__
+#else // !defined(USE_PPOLL)
bool SubprocessSet::DoWork() {
fd_set set;
int nfds = 0;
@@ -266,7 +266,7 @@ bool SubprocessSet::DoWork() {
return interrupted_;
}
-#endif // linux || __OpenBSD__
+#endif // !defined(USE_PPOLL)
Subprocess* SubprocessSet::NextFinished() {
if (finished_.empty())
diff --git a/ninja/src/subprocess_test.cc b/ninja/src/subprocess_test.cc
index afd90089e5f..9f8dcea68cb 100644
--- a/ninja/src/subprocess_test.cc
+++ b/ninja/src/subprocess_test.cc
@@ -152,7 +152,7 @@ TEST_F(SubprocessTest, SetWithMulti) {
// OS X's process limit is less than 1025 by default
// (|sysctl kern.maxprocperuid| is 709 on 10.7 and 10.8 and less prior to that).
-#if defined(linux) || defined(__OpenBSD__)
+#if !defined(__APPLE__) && !defined(_WIN32)
TEST_F(SubprocessTest, SetWithLots) {
// Arbitrary big number; needs to be over 1024 to confirm we're no longer
// hostage to pselect.
@@ -179,7 +179,7 @@ TEST_F(SubprocessTest, SetWithLots) {
}
ASSERT_EQ(kNumProcs, subprocs_.finished_.size());
}
-#endif // linux || __OpenBSD__
+#endif // !__APPLE__ && !_WIN32
// TODO: this test could work on Windows, just not sure how to simply
// read stdin.